('service', 'Service', errors);\n *\n * ...\n * throw error.create(Err.GENERIC);\n * ...\n * throw error.create(Err.FILE_NOT_FOUND, {'file': fileName});\n * ...\n * // Service: Could not file file: foo.txt (service/file-not-found).\n *\n * catch (e) {\n * assert(e.message === \"Could not find file: foo.txt.\");\n * if ((e as FirebaseError)?.code === 'service/file-not-found') {\n * console.log(\"Could not read file: \" + e['file']);\n * }\n * }\n */\nconst ERROR_NAME = 'FirebaseError';\n// Based on code from:\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types\nclass FirebaseError extends Error {\n constructor(\n /** The error code for this error. */\n code, message, \n /** Custom data for this error. */\n customData) {\n super(message);\n this.code = code;\n this.customData = customData;\n /** The custom name for all FirebaseErrors. */\n this.name = ERROR_NAME;\n // Fix For ES5\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n // TODO(dlarocque): Replace this with `new.target`: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#support-for-newtarget\n // which we can now use since we no longer target ES5.\n Object.setPrototypeOf(this, FirebaseError.prototype);\n // Maintains proper stack trace for where our error was thrown.\n // Only available on V8.\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ErrorFactory.prototype.create);\n }\n }\n}\nclass ErrorFactory {\n constructor(service, serviceName, errors) {\n this.service = service;\n this.serviceName = serviceName;\n this.errors = errors;\n }\n create(code, ...data) {\n const customData = data[0] || {};\n const fullCode = `${this.service}/${code}`;\n const template = this.errors[code];\n const message = template ? replaceTemplate(template, customData) : 'Error';\n // Service Name: Error message (service/code).\n const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`;\n const error = new FirebaseError(fullCode, fullMessage, customData);\n return error;\n }\n}\nfunction replaceTemplate(template, data) {\n return template.replace(PATTERN, (_, key) => {\n const value = data[key];\n return value != null ? String(value) : `<${key}?>`;\n });\n}\nconst PATTERN = /\\{\\$([^}]+)}/g;\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Evaluates a JSON string into a javascript object.\n *\n * @param {string} str A string containing JSON.\n * @return {*} The javascript object representing the specified JSON.\n */\nfunction jsonEval(str) {\n return JSON.parse(str);\n}\n/**\n * Returns JSON representing a javascript object.\n * @param {*} data JavaScript object to be stringified.\n * @return {string} The JSON contents of the object.\n */\nfunction stringify(data) {\n return JSON.stringify(data);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Decodes a Firebase auth. token into constituent parts.\n *\n * Notes:\n * - May return with invalid / incomplete claims if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nconst decode = function (token) {\n let header = {}, claims = {}, data = {}, signature = '';\n try {\n const parts = token.split('.');\n header = jsonEval(base64Decode(parts[0]) || '');\n claims = jsonEval(base64Decode(parts[1]) || '');\n signature = parts[2];\n data = claims['d'] || {};\n delete claims['d'];\n }\n catch (e) { }\n return {\n header,\n claims,\n data,\n signature\n };\n};\n/**\n * Decodes a Firebase auth. token and checks the validity of its time-based claims. Will return true if the\n * token is within the time window authorized by the 'nbf' (not-before) and 'iat' (issued-at) claims.\n *\n * Notes:\n * - May return a false negative if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nconst isValidTimestamp = function (token) {\n const claims = decode(token).claims;\n const now = Math.floor(new Date().getTime() / 1000);\n let validSince = 0, validUntil = 0;\n if (typeof claims === 'object') {\n if (claims.hasOwnProperty('nbf')) {\n validSince = claims['nbf'];\n }\n else if (claims.hasOwnProperty('iat')) {\n validSince = claims['iat'];\n }\n if (claims.hasOwnProperty('exp')) {\n validUntil = claims['exp'];\n }\n else {\n // token will expire after 24h by default\n validUntil = validSince + 86400;\n }\n }\n return (!!now &&\n !!validSince &&\n !!validUntil &&\n now >= validSince &&\n now <= validUntil);\n};\n/**\n * Decodes a Firebase auth. token and returns its issued at time if valid, null otherwise.\n *\n * Notes:\n * - May return null if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nconst issuedAtTime = function (token) {\n const claims = decode(token).claims;\n if (typeof claims === 'object' && claims.hasOwnProperty('iat')) {\n return claims['iat'];\n }\n return null;\n};\n/**\n * Decodes a Firebase auth. token and checks the validity of its format. Expects a valid issued-at time.\n *\n * Notes:\n * - May return a false negative if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nconst isValidFormat = function (token) {\n const decoded = decode(token), claims = decoded.claims;\n return !!claims && typeof claims === 'object' && claims.hasOwnProperty('iat');\n};\n/**\n * Attempts to peer into an auth token and determine if it's an admin auth token by looking at the claims portion.\n *\n * Notes:\n * - May return a false negative if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nconst isAdmin = function (token) {\n const claims = decode(token).claims;\n return typeof claims === 'object' && claims['admin'] === true;\n};\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction contains(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\nfunction safeGet(obj, key) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n return obj[key];\n }\n else {\n return undefined;\n }\n}\nfunction isEmpty(obj) {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n return false;\n }\n }\n return true;\n}\nfunction map(obj, fn, contextObj) {\n const res = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n res[key] = fn.call(contextObj, obj[key], key, obj);\n }\n }\n return res;\n}\n/**\n * Deep equal two objects. Support Arrays and Objects.\n */\nfunction deepEqual(a, b) {\n if (a === b) {\n return true;\n }\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n for (const k of aKeys) {\n if (!bKeys.includes(k)) {\n return false;\n }\n const aProp = a[k];\n const bProp = b[k];\n if (isObject(aProp) && isObject(bProp)) {\n if (!deepEqual(aProp, bProp)) {\n return false;\n }\n }\n else if (aProp !== bProp) {\n return false;\n }\n }\n for (const k of bKeys) {\n if (!aKeys.includes(k)) {\n return false;\n }\n }\n return true;\n}\nfunction isObject(thing) {\n return thing !== null && typeof thing === 'object';\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Rejects if the given promise doesn't resolve in timeInMS milliseconds.\n * @internal\n */\nfunction promiseWithTimeout(promise, timeInMS = 2000) {\n const deferredPromise = new Deferred();\n setTimeout(() => deferredPromise.reject('timeout!'), timeInMS);\n promise.then(deferredPromise.resolve, deferredPromise.reject);\n return deferredPromise.promise;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Returns a querystring-formatted string (e.g. &arg=val&arg2=val2) from a\n * params object (e.g. {arg: 'val', arg2: 'val2'})\n * Note: You must prepend it with ? when adding it to a URL.\n */\nfunction querystring(querystringParams) {\n const params = [];\n for (const [key, value] of Object.entries(querystringParams)) {\n if (Array.isArray(value)) {\n value.forEach(arrayVal => {\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(arrayVal));\n });\n }\n else {\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n }\n }\n return params.length ? '&' + params.join('&') : '';\n}\n/**\n * Decodes a querystring (e.g. ?arg=val&arg2=val2) into a params object\n * (e.g. {arg: 'val', arg2: 'val2'})\n */\nfunction querystringDecode(querystring) {\n const obj = {};\n const tokens = querystring.replace(/^\\?/, '').split('&');\n tokens.forEach(token => {\n if (token) {\n const [key, value] = token.split('=');\n obj[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n });\n return obj;\n}\n/**\n * Extract the query string part of a URL, including the leading question mark (if present).\n */\nfunction extractQuerystring(url) {\n const queryStart = url.indexOf('?');\n if (!queryStart) {\n return '';\n }\n const fragmentStart = url.indexOf('#', queryStart);\n return url.substring(queryStart, fragmentStart > 0 ? fragmentStart : undefined);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview SHA-1 cryptographic hash.\n * Variable names follow the notation in FIPS PUB 180-3:\n * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf.\n *\n * Usage:\n * var sha1 = new sha1();\n * sha1.update(bytes);\n * var hash = sha1.digest();\n *\n * Performance:\n * Chrome 23: ~400 Mbit/s\n * Firefox 16: ~250 Mbit/s\n *\n */\n/**\n * SHA-1 cryptographic hash constructor.\n *\n * The properties declared here are discussed in the above algorithm document.\n * @constructor\n * @final\n * @struct\n */\nclass Sha1 {\n constructor() {\n /**\n * Holds the previous values of accumulated variables a-e in the compress_\n * function.\n * @private\n */\n this.chain_ = [];\n /**\n * A buffer holding the partially computed hash result.\n * @private\n */\n this.buf_ = [];\n /**\n * An array of 80 bytes, each a part of the message to be hashed. Referred to\n * as the message schedule in the docs.\n * @private\n */\n this.W_ = [];\n /**\n * Contains data needed to pad messages less than 64 bytes.\n * @private\n */\n this.pad_ = [];\n /**\n * @private {number}\n */\n this.inbuf_ = 0;\n /**\n * @private {number}\n */\n this.total_ = 0;\n this.blockSize = 512 / 8;\n this.pad_[0] = 128;\n for (let i = 1; i < this.blockSize; ++i) {\n this.pad_[i] = 0;\n }\n this.reset();\n }\n reset() {\n this.chain_[0] = 0x67452301;\n this.chain_[1] = 0xefcdab89;\n this.chain_[2] = 0x98badcfe;\n this.chain_[3] = 0x10325476;\n this.chain_[4] = 0xc3d2e1f0;\n this.inbuf_ = 0;\n this.total_ = 0;\n }\n /**\n * Internal compress helper function.\n * @param buf Block to compress.\n * @param offset Offset of the block in the buffer.\n * @private\n */\n compress_(buf, offset) {\n if (!offset) {\n offset = 0;\n }\n const W = this.W_;\n // get 16 big endian words\n if (typeof buf === 'string') {\n for (let i = 0; i < 16; i++) {\n // TODO(user): [bug 8140122] Recent versions of Safari for Mac OS and iOS\n // have a bug that turns the post-increment ++ operator into pre-increment\n // during JIT compilation. We have code that depends heavily on SHA-1 for\n // correctness and which is affected by this bug, so I've removed all uses\n // of post-increment ++ in which the result value is used. We can revert\n // this change once the Safari bug\n // (https://bugs.webkit.org/show_bug.cgi?id=109036) has been fixed and\n // most clients have been updated.\n W[i] =\n (buf.charCodeAt(offset) << 24) |\n (buf.charCodeAt(offset + 1) << 16) |\n (buf.charCodeAt(offset + 2) << 8) |\n buf.charCodeAt(offset + 3);\n offset += 4;\n }\n }\n else {\n for (let i = 0; i < 16; i++) {\n W[i] =\n (buf[offset] << 24) |\n (buf[offset + 1] << 16) |\n (buf[offset + 2] << 8) |\n buf[offset + 3];\n offset += 4;\n }\n }\n // expand to 80 words\n for (let i = 16; i < 80; i++) {\n const t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff;\n }\n let a = this.chain_[0];\n let b = this.chain_[1];\n let c = this.chain_[2];\n let d = this.chain_[3];\n let e = this.chain_[4];\n let f, k;\n // TODO(user): Try to unroll this loop to speed up the computation.\n for (let i = 0; i < 80; i++) {\n if (i < 40) {\n if (i < 20) {\n f = d ^ (b & (c ^ d));\n k = 0x5a827999;\n }\n else {\n f = b ^ c ^ d;\n k = 0x6ed9eba1;\n }\n }\n else {\n if (i < 60) {\n f = (b & c) | (d & (b | c));\n k = 0x8f1bbcdc;\n }\n else {\n f = b ^ c ^ d;\n k = 0xca62c1d6;\n }\n }\n const t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff;\n e = d;\n d = c;\n c = ((b << 30) | (b >>> 2)) & 0xffffffff;\n b = a;\n a = t;\n }\n this.chain_[0] = (this.chain_[0] + a) & 0xffffffff;\n this.chain_[1] = (this.chain_[1] + b) & 0xffffffff;\n this.chain_[2] = (this.chain_[2] + c) & 0xffffffff;\n this.chain_[3] = (this.chain_[3] + d) & 0xffffffff;\n this.chain_[4] = (this.chain_[4] + e) & 0xffffffff;\n }\n update(bytes, length) {\n // TODO(johnlenz): tighten the function signature and remove this check\n if (bytes == null) {\n return;\n }\n if (length === undefined) {\n length = bytes.length;\n }\n const lengthMinusBlock = length - this.blockSize;\n let n = 0;\n // Using local instead of member variables gives ~5% speedup on Firefox 16.\n const buf = this.buf_;\n let inbuf = this.inbuf_;\n // The outer while loop should execute at most twice.\n while (n < length) {\n // When we have no data in the block to top up, we can directly process the\n // input buffer (assuming it contains sufficient data). This gives ~25%\n // speedup on Chrome 23 and ~15% speedup on Firefox 16, but requires that\n // the data is provided in large chunks (or in multiples of 64 bytes).\n if (inbuf === 0) {\n while (n <= lengthMinusBlock) {\n this.compress_(bytes, n);\n n += this.blockSize;\n }\n }\n if (typeof bytes === 'string') {\n while (n < length) {\n buf[inbuf] = bytes.charCodeAt(n);\n ++inbuf;\n ++n;\n if (inbuf === this.blockSize) {\n this.compress_(buf);\n inbuf = 0;\n // Jump to the outer loop so we use the full-block optimization.\n break;\n }\n }\n }\n else {\n while (n < length) {\n buf[inbuf] = bytes[n];\n ++inbuf;\n ++n;\n if (inbuf === this.blockSize) {\n this.compress_(buf);\n inbuf = 0;\n // Jump to the outer loop so we use the full-block optimization.\n break;\n }\n }\n }\n }\n this.inbuf_ = inbuf;\n this.total_ += length;\n }\n /** @override */\n digest() {\n const digest = [];\n let totalBits = this.total_ * 8;\n // Add pad 0x80 0x00*.\n if (this.inbuf_ < 56) {\n this.update(this.pad_, 56 - this.inbuf_);\n }\n else {\n this.update(this.pad_, this.blockSize - (this.inbuf_ - 56));\n }\n // Add # bits.\n for (let i = this.blockSize - 1; i >= 56; i--) {\n this.buf_[i] = totalBits & 255;\n totalBits /= 256; // Don't use bit-shifting here!\n }\n this.compress_(this.buf_);\n let n = 0;\n for (let i = 0; i < 5; i++) {\n for (let j = 24; j >= 0; j -= 8) {\n digest[n] = (this.chain_[i] >> j) & 255;\n ++n;\n }\n }\n return digest;\n }\n}\n\n/**\n * Helper to make a Subscribe function (just like Promise helps make a\n * Thenable).\n *\n * @param executor Function which can make calls to a single Observer\n * as a proxy.\n * @param onNoObservers Callback when count of Observers goes to zero.\n */\nfunction createSubscribe(executor, onNoObservers) {\n const proxy = new ObserverProxy(executor, onNoObservers);\n return proxy.subscribe.bind(proxy);\n}\n/**\n * Implement fan-out for any number of Observers attached via a subscribe\n * function.\n */\nclass ObserverProxy {\n /**\n * @param executor Function which can make calls to a single Observer\n * as a proxy.\n * @param onNoObservers Callback when count of Observers goes to zero.\n */\n constructor(executor, onNoObservers) {\n this.observers = [];\n this.unsubscribes = [];\n this.observerCount = 0;\n // Micro-task scheduling by calling task.then().\n this.task = Promise.resolve();\n this.finalized = false;\n this.onNoObservers = onNoObservers;\n // Call the executor asynchronously so subscribers that are called\n // synchronously after the creation of the subscribe function\n // can still receive the very first value generated in the executor.\n this.task\n .then(() => {\n executor(this);\n })\n .catch(e => {\n this.error(e);\n });\n }\n next(value) {\n this.forEachObserver((observer) => {\n observer.next(value);\n });\n }\n error(error) {\n this.forEachObserver((observer) => {\n observer.error(error);\n });\n this.close(error);\n }\n complete() {\n this.forEachObserver((observer) => {\n observer.complete();\n });\n this.close();\n }\n /**\n * Subscribe function that can be used to add an Observer to the fan-out list.\n *\n * - We require that no event is sent to a subscriber synchronously to their\n * call to subscribe().\n */\n subscribe(nextOrObserver, error, complete) {\n let observer;\n if (nextOrObserver === undefined &&\n error === undefined &&\n complete === undefined) {\n throw new Error('Missing Observer.');\n }\n // Assemble an Observer object when passed as callback functions.\n if (implementsAnyMethods(nextOrObserver, [\n 'next',\n 'error',\n 'complete'\n ])) {\n observer = nextOrObserver;\n }\n else {\n observer = {\n next: nextOrObserver,\n error,\n complete\n };\n }\n if (observer.next === undefined) {\n observer.next = noop;\n }\n if (observer.error === undefined) {\n observer.error = noop;\n }\n if (observer.complete === undefined) {\n observer.complete = noop;\n }\n const unsub = this.unsubscribeOne.bind(this, this.observers.length);\n // Attempt to subscribe to a terminated Observable - we\n // just respond to the Observer with the final error or complete\n // event.\n if (this.finalized) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.task.then(() => {\n try {\n if (this.finalError) {\n observer.error(this.finalError);\n }\n else {\n observer.complete();\n }\n }\n catch (e) {\n // nothing\n }\n return;\n });\n }\n this.observers.push(observer);\n return unsub;\n }\n // Unsubscribe is synchronous - we guarantee that no events are sent to\n // any unsubscribed Observer.\n unsubscribeOne(i) {\n if (this.observers === undefined || this.observers[i] === undefined) {\n return;\n }\n delete this.observers[i];\n this.observerCount -= 1;\n if (this.observerCount === 0 && this.onNoObservers !== undefined) {\n this.onNoObservers(this);\n }\n }\n forEachObserver(fn) {\n if (this.finalized) {\n // Already closed by previous event....just eat the additional values.\n return;\n }\n // Since sendOne calls asynchronously - there is no chance that\n // this.observers will become undefined.\n for (let i = 0; i < this.observers.length; i++) {\n this.sendOne(i, fn);\n }\n }\n // Call the Observer via one of it's callback function. We are careful to\n // confirm that the observe has not been unsubscribed since this asynchronous\n // function had been queued.\n sendOne(i, fn) {\n // Execute the callback asynchronously\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.task.then(() => {\n if (this.observers !== undefined && this.observers[i] !== undefined) {\n try {\n fn(this.observers[i]);\n }\n catch (e) {\n // Ignore exceptions raised in Observers or missing methods of an\n // Observer.\n // Log error to console. b/31404806\n if (typeof console !== 'undefined' && console.error) {\n console.error(e);\n }\n }\n }\n });\n }\n close(err) {\n if (this.finalized) {\n return;\n }\n this.finalized = true;\n if (err !== undefined) {\n this.finalError = err;\n }\n // Proxy is no longer needed - garbage collect references\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.task.then(() => {\n this.observers = undefined;\n this.onNoObservers = undefined;\n });\n }\n}\n/** Turn synchronous function into one called asynchronously. */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction async(fn, onError) {\n return (...args) => {\n Promise.resolve(true)\n .then(() => {\n fn(...args);\n })\n .catch((error) => {\n if (onError) {\n onError(error);\n }\n });\n };\n}\n/**\n * Return true if the object passed in implements any of the named methods.\n */\nfunction implementsAnyMethods(obj, methods) {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n for (const method of methods) {\n if (method in obj && typeof obj[method] === 'function') {\n return true;\n }\n }\n return false;\n}\nfunction noop() {\n // do nothing\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Check to make sure the appropriate number of arguments are provided for a public function.\n * Throws an error if it fails.\n *\n * @param fnName The function name\n * @param minCount The minimum number of arguments to allow for the function call\n * @param maxCount The maximum number of argument to allow for the function call\n * @param argCount The actual number of arguments provided.\n */\nconst validateArgCount = function (fnName, minCount, maxCount, argCount) {\n let argError;\n if (argCount < minCount) {\n argError = 'at least ' + minCount;\n }\n else if (argCount > maxCount) {\n argError = maxCount === 0 ? 'none' : 'no more than ' + maxCount;\n }\n if (argError) {\n const error = fnName +\n ' failed: Was called with ' +\n argCount +\n (argCount === 1 ? ' argument.' : ' arguments.') +\n ' Expects ' +\n argError +\n '.';\n throw new Error(error);\n }\n};\n/**\n * Generates a string to prefix an error message about failed argument validation\n *\n * @param fnName The function name\n * @param argName The name of the argument\n * @return The prefix to add to the error thrown for validation.\n */\nfunction errorPrefix(fnName, argName) {\n return `${fnName} failed: ${argName} argument `;\n}\n/**\n * @param fnName\n * @param argumentNumber\n * @param namespace\n * @param optional\n */\nfunction validateNamespace(fnName, namespace, optional) {\n if (optional && !namespace) {\n return;\n }\n if (typeof namespace !== 'string') {\n //TODO: I should do more validation here. We only allow certain chars in namespaces.\n throw new Error(errorPrefix(fnName, 'namespace') + 'must be a valid firebase namespace.');\n }\n}\nfunction validateCallback(fnName, argumentName, \n// eslint-disable-next-line @typescript-eslint/ban-types\ncallback, optional) {\n if (optional && !callback) {\n return;\n }\n if (typeof callback !== 'function') {\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid function.');\n }\n}\nfunction validateContextObject(fnName, argumentName, context, optional) {\n if (optional && !context) {\n return;\n }\n if (typeof context !== 'object' || context === null) {\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid context object.');\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// Code originally came from goog.crypt.stringToUtf8ByteArray, but for some reason they\n// automatically replaced '\\r\\n' with '\\n', and they didn't handle surrogate pairs,\n// so it's been modified.\n// Note that not all Unicode characters appear as single characters in JavaScript strings.\n// fromCharCode returns the UTF-16 encoding of a character - so some Unicode characters\n// use 2 characters in JavaScript. All 4-byte UTF-8 characters begin with a first\n// character in the range 0xD800 - 0xDBFF (the first character of a so-called surrogate\n// pair).\n// See http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3\n/**\n * @param {string} str\n * @return {Array}\n */\nconst stringToByteArray = function (str) {\n const out = [];\n let p = 0;\n for (let i = 0; i < str.length; i++) {\n let c = str.charCodeAt(i);\n // Is this the lead surrogate in a surrogate pair?\n if (c >= 0xd800 && c <= 0xdbff) {\n const high = c - 0xd800; // the high 10 bits.\n i++;\n assert(i < str.length, 'Surrogate pair missing trail surrogate.');\n const low = str.charCodeAt(i) - 0xdc00; // the low 10 bits.\n c = 0x10000 + (high << 10) + low;\n }\n if (c < 128) {\n out[p++] = c;\n }\n else if (c < 2048) {\n out[p++] = (c >> 6) | 192;\n out[p++] = (c & 63) | 128;\n }\n else if (c < 65536) {\n out[p++] = (c >> 12) | 224;\n out[p++] = ((c >> 6) & 63) | 128;\n out[p++] = (c & 63) | 128;\n }\n else {\n out[p++] = (c >> 18) | 240;\n out[p++] = ((c >> 12) & 63) | 128;\n out[p++] = ((c >> 6) & 63) | 128;\n out[p++] = (c & 63) | 128;\n }\n }\n return out;\n};\n/**\n * Calculate length without actually converting; useful for doing cheaper validation.\n * @param {string} str\n * @return {number}\n */\nconst stringLength = function (str) {\n let p = 0;\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c < 128) {\n p++;\n }\n else if (c < 2048) {\n p += 2;\n }\n else if (c >= 0xd800 && c <= 0xdbff) {\n // Lead surrogate of a surrogate pair. The pair together will take 4 bytes to represent.\n p += 4;\n i++; // skip trail surrogate.\n }\n else {\n p += 3;\n }\n }\n return p;\n};\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The amount of milliseconds to exponentially increase.\n */\nconst DEFAULT_INTERVAL_MILLIS = 1000;\n/**\n * The factor to backoff by.\n * Should be a number greater than 1.\n */\nconst DEFAULT_BACKOFF_FACTOR = 2;\n/**\n * The maximum milliseconds to increase to.\n *\n * Visible for testing\n */\nconst MAX_VALUE_MILLIS = 4 * 60 * 60 * 1000; // Four hours, like iOS and Android.\n/**\n * The percentage of backoff time to randomize by.\n * See\n * http://go/safe-client-behavior#step-1-determine-the-appropriate-retry-interval-to-handle-spike-traffic\n * for context.\n *\n *
Visible for testing\n */\nconst RANDOM_FACTOR = 0.5;\n/**\n * Based on the backoff method from\n * https://github.com/google/closure-library/blob/master/closure/goog/math/exponentialbackoff.js.\n * Extracted here so we don't need to pass metadata and a stateful ExponentialBackoff object around.\n */\nfunction calculateBackoffMillis(backoffCount, intervalMillis = DEFAULT_INTERVAL_MILLIS, backoffFactor = DEFAULT_BACKOFF_FACTOR) {\n // Calculates an exponentially increasing value.\n // Deviation: calculates value from count and a constant interval, so we only need to save value\n // and count to restore state.\n const currBaseValue = intervalMillis * Math.pow(backoffFactor, backoffCount);\n // A random \"fuzz\" to avoid waves of retries.\n // Deviation: randomFactor is required.\n const randomWait = Math.round(\n // A fraction of the backoff value to add/subtract.\n // Deviation: changes multiplication order to improve readability.\n RANDOM_FACTOR *\n currBaseValue *\n // A random float (rounded to int by Math.round above) in the range [-1, 1]. Determines\n // if we add or subtract.\n (Math.random() - 0.5) *\n 2);\n // Limits backoff to max to avoid effectively permanent backoff.\n return Math.min(MAX_VALUE_MILLIS, currBaseValue + randomWait);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Provide English ordinal letters after a number\n */\nfunction ordinal(i) {\n if (!Number.isFinite(i)) {\n return `${i}`;\n }\n return i + indicator(i);\n}\nfunction indicator(i) {\n i = Math.abs(i);\n const cent = i % 100;\n if (cent >= 10 && cent <= 20) {\n return 'th';\n }\n const dec = i % 10;\n if (dec === 1) {\n return 'st';\n }\n if (dec === 2) {\n return 'nd';\n }\n if (dec === 3) {\n return 'rd';\n }\n return 'th';\n}\n\n/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction getModularInstance(service) {\n if (service && service._delegate) {\n return service._delegate;\n }\n else {\n return service;\n }\n}\n\n/**\n * @license\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Checks whether host is a cloud workstation or not.\n * @public\n */\nfunction isCloudWorkstation(url) {\n // `isCloudWorkstation` is called without protocol in certain connect*Emulator functions\n // In HTTP request builders, it's called with the protocol.\n // If called with protocol prefix, it's a valid URL, so we extract the hostname\n // If called without, we assume the string is the hostname.\n try {\n const host = url.startsWith('http://') || url.startsWith('https://')\n ? new URL(url).hostname\n : url;\n return host.endsWith('.cloudworkstations.dev');\n }\n catch {\n return false;\n }\n}\n/**\n * Makes a fetch request to the given server.\n * Mostly used for forwarding cookies in Firebase Studio.\n * @public\n */\nasync function pingServer(endpoint) {\n const result = await fetch(endpoint, {\n credentials: 'include'\n });\n return result.ok;\n}\n\n/**\n * @license\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @public\n * Generates a SHA-256 hash for the given input string.\n *\n * @param input The string to hash.\n * @returns A promise that resolves to the SHA-256 hash as a hex string.\n */\nasync function generateSHA256Hash(input) {\n const textEncoder = new TextEncoder();\n const data = textEncoder.encode(input);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n // Convert ArrayBuffer to hex string\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hexHash = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n return hexHash;\n}\n\nexport { CONSTANTS, DecodeBase64StringError, Deferred, ErrorFactory, FirebaseError, MAX_VALUE_MILLIS, RANDOM_FACTOR, Sha1, areCookiesEnabled, assert, assertionError, async, base64, base64Decode, base64Encode, base64urlEncodeWithoutPadding, calculateBackoffMillis, contains, createMockUserToken, createSubscribe, decode, deepCopy, deepEqual, deepExtend, errorPrefix, extractQuerystring, generateSHA256Hash, getDefaultAppConfig, getDefaultEmulatorHost, getDefaultEmulatorHostnameAndPort, getDefaults, getExperimentalSetting, getGlobal, getModularInstance, getUA, isAdmin, isBrowser, isBrowserExtension, isCloudWorkstation, isCloudflareWorker, isElectron, isEmpty, isIE, isIndexedDBAvailable, isMobileCordova, isNode, isNodeSdk, isReactNative, isSafari, isSafariOrWebkit, isUWP, isValidFormat, isValidTimestamp, isWebWorker, issuedAtTime, jsonEval, map, ordinal, pingServer, promiseWithTimeout, querystring, querystringDecode, safeGet, stringLength, stringToByteArray, stringify, validateArgCount, validateCallback, validateContextObject, validateIndexedDBOpenable, validateNamespace };\n//# sourceMappingURL=index.esm.js.map\n","import { PACKAGE_VERSION } from './version.js';\n\n// Version-independent name of this application, used for Firebase app name.\nexport const BASE_APP_NAME = 'TinodeWeb';\n// Name of this application, used in the User-Agent.\nexport const APP_NAME = BASE_APP_NAME + '/' + (PACKAGE_VERSION || '0.25');\n\n// API key. Use https://github.com/tinode/chat/tree/master/keygen to generate your own.\n// Injected at build time via webpack DefinePlugin from the TINODE_API_KEY env var\n// (see webpack.config.js and .env.local). Falls back to the public sample key when unset,\n// which only works against a backend still using the matching sample API_KEY_SALT.\nexport const API_KEY = process.env.TINODE_API_KEY || 'AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K';\n\n// The array of possible hosts to connect to.\nexport const KNOWN_HOSTS = {hosted: 'web.tinode.co', local: 'localhost:6060'};\n\n// Default host name and port to connect to.\nexport const DEFAULT_HOST = KNOWN_HOSTS.hosted;\n\n// Enable console logging.\nexport const LOGGING_ENABLED = true;\n\n// Minimum time between two keypress notifications, milliseconds.\nexport const KEYPRESS_DELAY = 3_000;\n// Delay before sending a read notification, milliseconds.\nexport const READ_DELAY = 1_500;\n\n// The default shortest allowed tag length. Matches the value on the server.\nexport const MIN_TAG_LENGTH = 2;\n// The default greatest allowed tag length. Matches the value on the server.\nexport const MAX_TAG_LENGTH = 96;\n// The default maximum number of tags allowed. Matches the value on the server.\nexport const MAX_TAG_COUNT = 16;\n\n// Access mode for P2P subscriptions initiated by the current user.\nexport const DEFAULT_P2P_ACCESS_MODE = 'JRWPS';\n// Access mode for new group topics created by the current user.\nexport const NEW_GRP_ACCESS_MODE = 'JRWPSAO';\n// Access mode for a channel.\nexport const CHANNEL_ACCESS_MODE = 'JR';\n\n// Access mode for no access.\nexport const NO_ACCESS_MODE = 'N';\n\n// Mediaquery breakpoint between desktop and mobile, in px. Should match the value\n// in @media (max-size: 640px) in base.css\nexport const MEDIA_BREAKPOINT = 640;\n// Size of css 'rem' unit in pixels. Default 1rem = 10pt = 13px.\nexport const REM_SIZE = 13;\n\n// Size of the avatar image: when image dimensions are greater or the image is not square, it's resized to\n// a square of this size or less.\nexport const AVATAR_SIZE = 384;\n\n// Maximum size of an avatar in bytes for sending in-band. Bigger avatars will be sent out of band (as uploads).\nexport const MAX_AVATAR_BYTES = 4096;\n\n// Size of the broken_image shown in MessagesView\nexport const BROKEN_IMAGE_SIZE = 32;\n\n// Size of video preview when dimensions are missing.\nexport const NO_DIMENSIONS_VIDEO = 128;\n\n// Number of chat messages to fetch in one call.\nexport const MESSAGES_PAGE = 24;\n\n// Default maximum in-band (included directly into the message) attachment size which fits into\n// a message of 256K in size. Used when the server-provided value is unavailable. The actual\n// binary size of the attachment should be smaller due to base64 encoding expansion and some overhead,\n// for instance 1024 bytes.\n// Increase this limit to a greater value in production, if desired. Also increase\n// max_message_size in the server config.\nexport const MAX_INBAND_ATTACHMENT_SIZE = 262_144;\n\n// Default absolute maximum attachment size to be used with the server = 8MB.\n// Used when the server-provided value is unavailable. Increase to something like 100MB in production.\nexport const MAX_EXTERN_ATTACHMENT_SIZE = 1 << 23;\n\n// Maximum allowed linear dimension (pixels) of an image sent inline. Larger images will be shrunk\n// to make the larger dimension fit under this size. You may want to adjust it to 1600 or\n// 2400 for production.\nexport const MAX_IMAGE_DIM = 1024;\n\n// Linear dimensions of image preview: shrink image under this size for previews.\nexport const IMAGE_PREVIEW_DIM = 64;\n\n// Linear dimensions of video screencapture: shrink image under this size for previews.\nexport const VIDEO_PREVIEW_DIM = 96;\n\n// Linear dimensions of image thumbnail: shrink image under this size for thumbnails in reply quote previews.\nexport const IMAGE_THUMBNAIL_DIM = 36;\n// Width of video thumbnail: allow it to be wider, but not taller. Use IMAGE_THUMBNAIL_DIM for height.\nexport const VIDEO_THUMBNAIL_WIDTH = 48;\n\n// Maximum number of online users to be shown in a topic title bar. Others will be\n// hidden under \"+X more\"\nexport const MAX_ONLINE_IN_TOPIC = 4;\n\n// Maximum length of user name, topic title, and private comment.\nexport const MAX_TITLE_LENGTH = 60;\n// Maximum length of topic description.\nexport const MAX_TOPIC_DESCRIPTION_LENGTH = 360;\n// Maximum length of user name when displaying a video call.\nexport const MAX_PEER_TITLE_LENGTH = 24;\n\n// Length of message previews in chat list, in characters.\nexport const MESSAGE_PREVIEW_LENGTH = 80;\n\n// Length of a quote in quoted reply (for outgoing messages).\nexport const QUOTED_REPLY_LENGTH = 30;\n// Length of a preview of a forwarded message.\nexport const FORWARDED_PREVIEW_LENGTH = 84;\n// Length of preview for a message being edited.\nexport const EDIT_PREVIEW_LENGTH = 48;\n\n// Minimum duration of an audio recording in milliseconds (2 sec).\nexport const MIN_DURATION = 2_000;\n// Maximum duration of an audio recording in milliseconds (10 min).\nexport const MAX_DURATION = 600_000;\n\n// Link for \"Contact Us\".\nexport const LINK_CONTACT_US = 'mailto:support@tinode.co';\n\n// Link to Privacy Policy.\nexport const LINK_PRIVACY_POLICY = 'https://tinode.co/privacy.html';\n\n// Link to Terms of Service.\nexport const LINK_TERMS_OF_SERVICE = 'https://tinode.co/terms.html';\n\n// When user starts a P2P topic, automatic subscription does not\n// happen until the first message. Setting this option to true enables\n// immediate subscription.\nexport const IMMEDIATE_P2P_SUBSCRIPTION = false;\n\n// URL schemes permitted to appear in links (i.e. no javascript: scheme).\nexport const CLICKABLE_URL_SCHEMES = ['http', 'https', 'ftp', 'ftps'];\n\n// Size of the QR code in the app.\nexport const QRCODE_SIZE = 128;\n\n// How much time has to pass to consider computer awoken from sleep (80 sec).\n// Chrome throttles ticker events in inactive tabs to once per minute. This\n// value ensures that these once-a-minute events do not trigger a reconnect.\nexport const WAKE_UP_TIMEOUT = 80000;\n// Timer interval between checks if computer woke up from sleep (1 sec).\nexport const WAKE_UP_TICK = 1000;\n\n// Swipe distance to register as a gesture, in pixels.\nexport const MIN_SWIPE_DISTANCE = REM_SIZE * 3;\n\n// Self-topic avatar as an SVG icon encoded as data URI\nexport const SELF_AVATAR_URI = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZpZXdCb3g9IjAgMCAxNyAxNyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMy41NjIgMXYxNS40NTlsNC42ODYtMy4yNyA0Ljc1MiAzLjI2di0xNS40NDloLTkuNDM4ek0xMiAxNC41NTFsLTMuNzU2LTIuNTc4LTMuNjgxIDIuNTY4di0xMi41NDFoNy40Mzd2MTIuNTUxeiIgZmlsbD0iIzU1NTU1NSIgLz48L3N2Zz4=' // eslint-disable-line max-len\n\n// Toast display duration, milliseconds.\nexport const TOAST_DURATION = 3_000;\n\n// Initial/default color scheme.\nexport const DEFAULT_COLOR_SCHEME = 'auto';\n\n// Default text size in points.\nexport const DEFAULT_TEXT_SIZE = 10;\n\n// MIME type for the legacy Drafty form-response data.\nexport const DRAFTY_FR_MIME_TYPE_LEGACY = 'application/json'; // Remove in 2026.\n\n// Path to wallpaper images.\nexport const WALLPAPER_DEFAULTS = {type: 'patt', index: 0, path:'img/bkg/'};\n","// Video call states.\nexport const CALL_STATE_NONE = 0;\nexport const CALL_STATE_OUTGOING_INITATED = 1;\nexport const CALL_STATE_INCOMING_RECEIVED = 2;\nexport const CALL_STATE_IN_PROGRESS = 3;\n\n// Video call message headers representing call state.\nexport const CALL_HEAD_STARTED = 'started';\n\n","// File and image helper functions.\nimport { TheCard } from 'tinode-sdk';\n\n// Supported image MIME types and corresponding file extensions.\nexport const SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml'];\nexport const MIME_EXTENSIONS = ['jpg', 'gif', 'png', 'svg', 'svg'];\n\n// Get an URL from a theCard photo: either create a data: URL or return reference URL.\nexport function makeImageUrl(photo) {\n if (photo && typeof photo == 'object') {\n if (photo.ref) {\n return photo.ref\n }\n if (photo.data && photo.type) {\n const mime = photo.type.startsWith('image/') ? photo.type : ('image/' + photo.type);\n return 'data:' + mime + ';base64,' + photo.data;\n }\n }\n return null;\n}\n\n// Calculate linear dimensions for scaling image down to fit under a certain size.\n// Returns an object which contains destination sizes, source sizes, and offsets\n// into source (when making square images).\nexport function fitImageSize(width, height, maxWidth, maxHeight, forceSquare) {\n // Sanitize input\n width = width | 0;\n height = height | 0;\n maxWidth = maxWidth | 0;\n maxHeight = maxHeight | 0;\n\n if (width <= 0 || height <= 0 || maxWidth <= 0 || maxHeight <= 0) {\n return null;\n }\n\n if (forceSquare) {\n maxWidth = maxHeight = Math.min(maxWidth, maxHeight);\n }\n\n const scale = Math.min(\n Math.min(width, maxWidth) / width,\n Math.min(height, maxHeight) / height\n );\n\n const size = {\n dstWidth: (width * scale) | 0,\n dstHeight: (height * scale) | 0,\n };\n\n if (forceSquare) {\n // Also calculate parameters for making the image square.\n size.dstWidth = size.dstHeight = Math.min(size.dstWidth, size.dstHeight);\n size.srcWidth = size.srcHeight = Math.min(width, height);\n size.xoffset = ((width - size.srcWidth) / 2) | 0;\n size.yoffset = ((height - size.srcWidth) / 2) | 0;\n } else {\n size.xoffset = size.yoffset = 0;\n size.srcWidth = width;\n size.srcHeight = height;\n }\n return size;\n}\n\n// Ensure file's extension matches mime content type\nexport function fileNameForMime(fname, mime) {\n const idx = SUPPORTED_IMAGE_FORMATS.indexOf(mime);\n if (idx < 0 || !fname) {\n // Unknown mime or empty name.\n return fname;\n }\n const ext = MIME_EXTENSIONS[idx];\n\n const at = fname.lastIndexOf('.');\n if (at >= 0) {\n fname = fname.substring(0, at);\n }\n return fname + '.' + ext;\n}\n\n// Scale uploaded image to fit under certain dimensions and byte size, optionally constraining to a square.\n// Returns a promise which is resolven on success or rejected on failure.\nexport function imageScaled(fileOrBlob, maxWidth, maxHeight, maxSize, forceSquare) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = function(err) {\n reject(new Error(\"Image format unrecognized\"));\n }\n img.onload = async function() {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n // Calculate the desired image dimensions.\n const dim = fitImageSize(img.width, img.height, maxWidth, maxHeight, forceSquare);\n if (!dim) {\n reject(new Error(\"Invalid image\"));\n return;\n }\n let canvas = document.createElement('canvas');\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n\n const mime = SUPPORTED_IMAGE_FORMATS.includes(fileOrBlob.type) ? fileOrBlob.type : 'image/jpeg';\n // Generate blob to check size of the image.\n let blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n if (!blob) {\n reject(new Error(\"Unsupported image format\"));\n return;\n }\n // Ensure the image is not too large. Shrink the image keeping the aspect ratio.\n // Do nothing if maxsize is <= 0.\n while (maxSize > 0 && blob.length > maxSize) {\n dim.dstWidth = (dim.dstWidth * 0.70710678118) | 0;\n dim.dstHeight = (dim.dstHeight * 0.70710678118) | 0;\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n }\n\n canvas = null;\n resolve({mime: mime, blob: blob, width: dim.dstWidth, height: dim.dstHeight, name: fileNameForMime(fileOrBlob.name, mime)});\n };\n img.src = URL.createObjectURL(fileOrBlob);\n });\n}\n\n// Scale and crop image according to specified dimensions.\n// The coordinates are in unscaled image pixels, i.e. cut the rectangle first then scale it.\n// returns a promise.\nexport function imageCrop(mime, objURL, left, top, width, height, scale) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = _ => {\n reject(new Error(\"Image format unrecognized\"));\n };\n img.onload = _ => {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n let canvas = document.createElement('canvas');\n canvas.width = width * scale;\n canvas.height = height * scale;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, left, top, width, height, 0, 0, canvas.width, canvas.height);\n\n mime = SUPPORTED_IMAGE_FORMATS.includes(mime) ? mime : 'image/jpeg';\n // Generate blob to check size of the image.\n canvas.toBlob((blob) => {\n // Allow GC.\n canvas = null;\n if (blob) {\n resolve({mime: mime, blob: blob, width: width, height: height});\n } else {\n reject(new Error(\"Unsupported image format\"));\n }\n }, mime);\n };\n img.src = objURL;\n });\n}\n\n// Convert file to base64 string.\nexport function fileToBase64(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n resolve({mime: file.type, bits: reader.result.split(',')[1], name: file.name});\n };\n reader.readAsDataURL(file);\n });\n}\n\n// Convert Blob to base64 string. Returns a promise resolved with the base64 string and mime.\nexport function blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n resolve({mime: blob.type, bits: reader.result.split(',')[1]});\n };\n reader.readAsDataURL(blob);\n });\n}\n\n// File pasted from the clipboard. It's either an inline image or a file attachment.\nexport function filePasted(event, onImageSuccess, onAttachmentSuccess, onError) {\n const items = (event.clipboardData || event.originalEvent.clipboardData || {}).items;\n if (!items || !items.length) {\n return false;\n }\n\n for (let i in items) {\n const item = items[i];\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (!file) {\n console.error(\"Failed to get file object from pasted file item\", item.kind, item.type);\n onError(\"Failed to get file object from pasted file item\");\n continue;\n }\n if (file.type && file.type.split('/')[0] == 'image') {\n onImageSuccess(file);\n } else {\n onAttachmentSuccess(file);\n }\n // Indicate that the pasted data contains a file.\n return true;\n }\n }\n // No file found.\n return false;\n}\n\n// Get mime type from data URL header.\nexport function getMimeType(header) {\n const mime = /^data:(image\\/[-+a-z0-9.]+);base64/.exec(header);\n return (mime && mime.length > 1) ? mime[1] : null;\n}\n\n// Given length of a binary object in bytes, calculate the length after\n// base64 encoding.\nexport function base64EncodedLen(n) {\n return Math.floor((n + 2) / 3) * 4;\n}\n\n// Given length of a base64-encoded object, calculate decoded size of the\n// pbject in bytes.\nexport function base64DecodedLen(n) {\n return Math.floor(n / 4) * 3;\n}\n\n// Re-encode string to standard base64 encoding with padding.\n// The string may be base64-URL encoded without the padding.\nexport function base64ReEncode(str) {\n if (str) {\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n try {\n str = btoa(atob(str));\n } catch(err) {\n console.error(\"Failed to base64 re-encode string.\", err);\n str = null;\n }\n }\n return str;\n}\n\n// Convert a base64 encoded string with the provided mime type into a Blob.\nexport function base64ToBlob(str, mime) {\n if (!str) {\n return null;\n }\n\n try {\n // Make blob.\n const bin = atob(str);\n const length = bin.length;\n const buf = new ArrayBuffer(length);\n const arr = new Uint8Array(buf);\n for (let i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n\n return new Blob([buf], { type: mime });\n } catch(err) {\n console.error(\"Failed to convert base64 to blob: \", err);\n }\n\n return null;\n}\n\nexport function intArrayToBase64(arr) {\n if (!Array.isArray(arr)) {\n return null;\n }\n try {\n let bin = '';\n new Uint8Array(arr).forEach(b => bin += String.fromCharCode(b));\n return window.btoa(bin);\n } catch (err) {}\n return null;\n}\n\nexport function base64ToIntArray(b64) {\n const arr = [];\n try {\n const bin = window.atob(b64);\n [...bin].forEach(c => {\n arr.push(c.charCodeAt(0));\n });\n return arr;\n } catch (err) {}\n return null;\n}\n\nexport function importVCard(fileOrBlob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n const card = TheCard.importVCard(reader.result);\n if (!card) {\n reject(new Error(\"Failed to parse vCard\"));\n return;\n }\n resolve(card);\n };\n reader.readAsText(fileOrBlob);\n });\n}\n","import React from 'react';\nimport { defineMessages } from 'react-intl';\n\nimport { Drafty, TheCard } from 'tinode-sdk';\n\nimport AudioPlayer from '../widgets/audio-player.jsx'\nimport CallMessage from '../widgets/call-message.jsx'\nimport CallStatus from '../widgets/call-status.jsx';\nimport InlineVideo from '../widgets/inline-video.jsx';\nimport LazyImage from '../widgets/lazy-image.jsx';\nimport TheCardMini from '../widgets/the-card-mini.jsx';\nimport UploadingImage from '../widgets/uploading-image.jsx'\n\nimport { BROKEN_IMAGE_SIZE, CLICKABLE_URL_SCHEMES, IMAGE_THUMBNAIL_DIM, NO_DIMENSIONS_VIDEO,\n REM_SIZE, VIDEO_THUMBNAIL_WIDTH } from '../config.js';\nimport { base64ToBlob, blobToBase64, fitImageSize, imageScaled } from './blob-helpers.js';\nimport { idToColorClass, secondsToTime, shortenFileName } from './strformat.js';\nimport { cancelablePromise, sanitizeUrl, sanitizeUrlForMime } from './utils.js';\n\nconst messages = defineMessages({\n drafty_form: {\n id: 'drafty_form',\n defaultMessage: 'Form: ',\n description: 'Comment for form in Drafty'\n },\n drafty_attachment: {\n id: 'drafty_attachment',\n defaultMessage: 'Attachment',\n description: 'Comment for attachment in Drafty'\n },\n drafty_image: {\n id: 'drafty_image',\n defaultMessage: 'Picture',\n description: 'Comment for embedded images in Drafty'\n },\n drafty_video: {\n id: 'drafty_video',\n defaultMessage: 'Video recording',\n description: 'Comment for videos embedded in Drafty'\n },\n drafty_unknown: {\n id: 'drafty_unknown',\n defaultMessage: 'Unsupported',\n description: 'Unsupported entity in drafty'\n }\n});\n\n// The main Drafty formatter: converts Drafty elements into React classes. 'this' is set by the caller.\n// 'this' must contain:\n// viewportWidth:\n// authorizeURL:\n// onHandleClick:\nexport function fullFormatter(style, data, values, key, stack) {\n if (stack.includes('QQ')) {\n return quoteFormatter.call(this, style, data, values, key);\n }\n\n if (!style) {\n // Unformatted.\n return values;\n }\n\n let el = Drafty.tagName(style);\n let attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch (style) {\n case 'AU':\n // Show audio player.\n if (attr.src) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'audio'));\n attr.duration = data.duration > 0 ? (data.duration | 0) : undefined;\n attr.preview = data.preview;\n attr.loading = 'lazy';\n // 4.9 语音未读红点:chat-message.jsx 的 onVoicePlayed 记录\"这条语音真的被点开听过\",\n // 跟消息本身有没有被标记已读是两件事。favorites/history 等别处复用同一个 formatter\n // context 没有这个字段时,attr.onPlay 就是 undefined,AudioPlayer 那边本来就把它当\n // 可选 prop 处理,不会因此出问题。\n attr.onPlay = this.onVoicePlayed;\n }\n el = AudioPlayer;\n // Audio element cannot have content.\n values = null;\n break;\n case 'BR':\n values = null;\n break;\n case 'EX':\n // Ignore.\n break;\n case 'HL':\n // Highlighted text. Assign class name.\n attr.className = 'highlight';\n break;\n case 'HD':\n el = null;\n values = null;\n break;\n case 'IM':\n // Additional processing for images\n el = handleImageData.call(this, el, data, attr);\n // Image element cannot have content.\n values = null;\n break;\n case 'BN':\n // Button\n attr.onClick = (e) => this.onHandleClick(e, 'form_button');\n let inner = React.Children.map(values, (child) => {\n return typeof child == 'string' ? child : undefined;\n });\n if (!inner || inner.length == 0) {\n inner = [attr.name]\n }\n // Get text which will be sent back when the button is clicked.\n attr['data-title'] = inner.join('');\n break;\n case 'LN':\n if (attr) {\n // Ensure only safe URL schemes are clickable.\n attr.href = typeof attr.href == 'string' ? sanitizeUrl(attr.href, CLICKABLE_URL_SCHEMES) : '';\n }\n break;\n case 'MN':\n // Mention\n attr.className = 'mention'\n if (data) {\n attr.className += ' ' + idToColorClass(data.val, false, true);\n }\n break;\n case 'FM':\n // Form\n attr.className = 'bot-form';\n break;\n case 'RW':\n // Form element formatting is dependent on element content.\n break;\n case 'QQ':\n // Quote/citation.\n attr.className = 'reply-quote'\n attr.onClick = (e) => this.onHandleClick(e, 'quote');\n break;\n case 'TC':\n // TheCard\n el = TheCardMini;\n attr.content = data;\n attr.authorizeURL = this.authorizeURL;\n attr.onChatClick = (e) => this.onHandleClick(e, 'contact_chat');\n attr.onFindClick = (e) => this.onHandleClick(e, 'contact_find');\n values = null;\n break;\n case 'VC':\n el = CallMessage;\n // Video call messages do not have content.\n values = null;\n if (data) {\n attr.callState = data.state;\n attr.incoming = data.incoming;\n attr.duration = data.duration;\n }\n break;\n case 'VD':\n // Additional processing for videos.\n el = handleVideoData.call(this, el, data, attr);\n // Video element cannot have content.\n values = null;\n break;\n default:\n if (!el) {\n // Unknown element.\n el = React.Fragment;\n attr = {key: key};\n // Generate comment for unknown element.\n let body = values;\n if (!Array.isArray(values) || !values.join('').trim()) {\n body = [React.createElement('span',\n {key: 'x1', className: 'gray'},\n this.formatMessage(messages.drafty_unknown)\n )];\n }\n values = [React.createElement('i',\n {key: 'x0', className: 'material-icons gray'},\n 'extension'\n ), ' '].concat(body);\n }\n break;\n }\n if (!el) {\n return values;\n }\n return React.createElement(el, attr, values);\n}\n\n// Additional processing of image data.\nfunction handleImageData(el, data, attr) {\n if (!data) {\n attr.src = 'img/broken_image.png';\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n };\n return el;\n }\n\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n this.viewportWidth > 0 ? Math.min(this.viewportWidth - REM_SIZE * 6.5, REM_SIZE * 34.5) :\n REM_SIZE * 34.5, REM_SIZE * 24, false) ||\n {dstWidth: BROKEN_IMAGE_SIZE, dstHeight: BROKEN_IMAGE_SIZE};\n attr.style = {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px',\n // Looks like a Chrome bug: broken image does not respect 'width' and 'height'.\n minWidth: dim.dstWidth + 'px',\n minHeight: dim.dstHeight + 'px'\n };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'image'));\n attr.alt = data.name;\n if (attr.src) {\n if (Math.max(data.width || 0, data.height || 0) > IMAGE_THUMBNAIL_DIM) {\n // Allow previews for large enough images.\n attr.onClick = (e) => this.onHandleClick(e, 'image');\n attr.className += ' image-clickable';\n }\n attr.loading = 'lazy';\n } else {\n attr.src = null;\n }\n } else {\n // Use custom element instead of or .\n el = UploadingImage;\n }\n\n return el;\n}\n\n// Additional processing of attached video data.\nfunction handleVideoData(el, data, attr) {\n if (!data) {\n attr.src = 'img/broken_video.png';\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n };\n return el;\n }\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n this.viewportWidth > 0 ? Math.min(this.viewportWidth - REM_SIZE * 6.5, REM_SIZE * 34.5) :\n REM_SIZE * 34.5, REM_SIZE * 24, false) ||\n {dstWidth: NO_DIMENSIONS_VIDEO, dstHeight: NO_DIMENSIONS_VIDEO};\n attr.style = {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px',\n // Looks like a Chrome bug: broken image does not respect 'width' and 'height'.\n minWidth: dim.dstWidth + 'px',\n minHeight: dim.dstHeight + 'px'\n };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'image'));\n attr.alt = data.name;\n if (data.ref || data.val) {\n attr.onClick = (e) => this.onHandleClick(e, 'video');\n attr.loading = 'lazy';\n }\n el = InlineVideo;\n } else {\n // Use custom element instead of or .\n el = UploadingImage;\n }\n\n return el;\n}\n\n// Converts Drafty object into a one-line preview. 'this' is set by the caller.\n// 'this' must contain:\n// formatMessage: this.props.intl.formatMessage\n// messages: formatjs messages defined with defineMessages.\nexport function previewFormatter(style, data, values, key) {\n if (!style) {\n // Unformatted.\n return values;\n }\n\n let el = Drafty.tagName(style);\n const attr = { key: key };\n switch (style) {\n case 'AU':\n // Voicemail as '[mic] 0:00'.\n el = React.Fragment;\n values = [React.createElement('i', {key: 'au', className: 'material-icons'}, 'mic'),\n ' ', secondsToTime(data.duration/1000)];\n break;\n case 'BR':\n // Replace new line with a space.\n el = React.Fragment;\n values = [' '];\n break;\n case 'HL':\n // Make highlight less prominent in preview.\n attr.className = 'highlight preview';\n break;\n case 'LN':\n case 'MN':\n // Disable links in previews.\n el = 'span';\n break;\n case 'IM':\n // Replace image with '[icon] Image'.\n el = React.Fragment;\n values = [React.createElement('i', {key: 'im', className: 'material-icons'}, 'photo'),\n ' ', this.formatMessage(messages.drafty_image)];\n break;\n case 'BN':\n el = 'span';\n attr.className = 'flat-button faux';\n break;\n case 'FM':\n el = React.Fragment;\n values = [React.createElement('i', {key: 'fm', className: 'material-icons'}, 'dashboard'),\n this.formatMessage(messages.drafty_form)].concat(' ', values || []);\n break;\n case 'RW':\n el = React.Fragment;\n break;\n case 'EX':\n if (data) {\n if (Drafty.isFormResponseType(data.mime)) {\n // Ignore JSON attachments: they are form response payloads.\n return null;\n }\n // Clear payload.\n delete data.val;\n delete data.ref;\n }\n el = React.Fragment;\n values = [React.createElement('i', {key: 'ex', className: 'material-icons'}, 'attachment'),\n ' ', this.formatMessage(messages.drafty_attachment)];\n break;\n case 'VC':\n el = CallStatus;\n if (data) {\n attr.callState = data.state;\n attr.incoming = data.incoming;\n attr.duration = data.duration;\n }\n values = null;\n break;\n case 'QQ':\n case 'HD':\n el = null;\n values = null;\n break;\n case 'TC':\n // TheCard\n el = React.Fragment;\n values = [React.createElement('i', {key: 'tc', className: 'material-icons'}, 'contact_mail'), ' ',\n TheCard.getFn(data) || this.formatMessage(messages.drafty_unknown)];\n break;\n case 'VD':\n // Replace image with '[icon] Video'.\n el = React.Fragment;\n values = [React.createElement('i', {key: 'im', className: 'material-icons'}, 'play_circle_outline'),\n ' ', this.formatMessage(messages.drafty_video)];\n break;\n default:\n if (!el) {\n // Unknown element.\n el = React.Fragment;\n values = [React.createElement('i', {key: 'x0', className: 'material-icons gray'}, 'extension'),\n ' ', this.formatMessage(messages.drafty_unknown)];\n }\n break;\n }\n if (!el) {\n return values;\n }\n return React.createElement(el, attr, values);\n};\n\n// Converts Drafty object into a quoted reply; 'this' is set by the caller.\nfunction inlineImageAttr(attr, data) {\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n maxWidth: IMAGE_THUMBNAIL_DIM + 'px',\n maxHeight: IMAGE_THUMBNAIL_DIM + 'px',\n }\n attr.className = 'inline-image';\n attr.alt = this.formatMessage(messages.drafty_image);\n if (!data) {\n attr.src = 'img/broken_image.png';\n } else {\n attr.src = attr.src || 'img/broken_image.png';\n }\n attr.title = attr.alt;\n return attr;\n}\n\n// Converts Drafty object into a quoted reply; 'this' is set by the caller.\nfunction inlineVideoAttr(attr, data) {\n const dim = fitImageSize(data.width, data.height, VIDEO_THUMBNAIL_WIDTH, IMAGE_THUMBNAIL_DIM);\n attr.style = {\n width: dim.width + 'px',\n height: dim.height + 'px',\n maxWidth: VIDEO_THUMBNAIL_WIDTH + 'px',\n maxHeight: IMAGE_THUMBNAIL_DIM + 'px',\n }\n attr.className = 'inline-image';\n attr.alt = this.formatMessage(messages.drafty_video);\n attr.title = attr.alt;\n if (!data) {\n attr.src = 'img/broken_video.png';\n } else {\n attr.src = attr.src || 'img/broken_video.png';\n }\n return attr;\n}\n\n// Displays a portion of Drafty within 'QQ' quotes. 'this' is set by the caller.\n// 'this' must contain:\n// formatMessage: this.props.intl.formatMessage\n// messages: formatjs messages defined with defineMessages.\n// authorizeURL: this.props.tinode.authorizeURL\n// onHandleClick: this.handleDraftyClick\nfunction quoteFormatter(style, data, values, key) {\n if (['BR', 'EX', 'IM', 'MN', 'VD'].includes(style)) {\n let el = Drafty.tagName(style);\n let attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch(style) {\n case 'BR':\n values = null;\n break;\n case 'IM':\n attr = inlineImageAttr.call(this, attr, data);\n values = [React.createElement('img', attr, null), ' ', attr.alt];\n el = React.Fragment;\n // Fragment attributes.\n attr = {key: key};\n break;\n case 'VD':\n attr = inlineVideoAttr.call(this, attr, data);\n values = [React.createElement('img', attr, null), ' ', attr.alt];\n el = React.Fragment;\n // Fragment attributes.\n attr = {key: key};\n break;\n case 'MN':\n el = 'span';\n attr.className = 'mention'\n if (data) {\n attr.className += ' ' + idToColorClass(data.val, false, true);\n }\n break;\n case 'EX':\n let fname;\n if (data) {\n if (Drafty.isFormResponseType(data.mime)) {\n // Ignore JSON attachments: they are form response payloads.\n return null;\n }\n fname = data.name;\n // Clear payload.\n delete data.val;\n delete data.ref;\n }\n el = React.Fragment;\n values = [React.createElement('i', {key: 'ex', className: 'material-icons'}, 'attachment'),\n shortenFileName(fname, 16) || this.formatMessage(messages.drafty_attachment)];\n break;\n }\n return React.createElement(el, attr, values);\n }\n return previewFormatter.call(this, style, data, values, key);\n}\n\n// Create image thumbnail suitable for inclusion in a quote.\nfunction quoteImageOrVideo(data, isVideo) {\n let promise;\n let bits, ref, mime;\n if (isVideo) {\n bits = data.preview;\n mime = data.premime || 'image/jpeg';\n ref = data.preref;\n } else {\n bits = data.val;\n mime = data.mime;\n ref = data.ref;\n }\n // Get the blob from the image data.\n if (bits) {\n const blob = base64ToBlob(bits, mime);\n if (!blob) {\n throw new Error(\"Invalid image\");\n }\n promise = Promise.resolve(blob);\n } else if (ref) {\n promise = fetch(this.authorizeURL(sanitizeUrlForMime(ref, 'image')))\n .then(evt => {\n if (evt.ok) {\n return evt.blob();\n } else {\n throw new Error(`Image fetch unsuccessful: ${evt.status} ${evt.statusText}`);\n }\n });\n } else {\n throw new Error(\"Missing image data\");\n }\n\n // Scale the blob.\n return promise\n .then(blob => {\n // If it's an image, cut the square from the center of the image and shrink it.\n // If it's a video, allow it to be rectantular.\n return imageScaled(blob, isVideo ? VIDEO_THUMBNAIL_WIDTH : IMAGE_THUMBNAIL_DIM, IMAGE_THUMBNAIL_DIM, -1, !isVideo)\n }).then(scaled => {\n if (isVideo) {\n data.premime = scaled.mime;\n } else {\n data.mime = scaled.mime;\n }\n data.size = scaled.blob.size;\n data.width = scaled.width;\n data.height = scaled.height;\n delete data.ref;\n delete data.preref;\n // Keeping the original file name, if provided: ex.data.name;\n\n data.src = URL.createObjectURL(scaled.blob);\n return blobToBase64(scaled.blob);\n }).then(b64 => {\n if (isVideo) {\n data.preview = b64.bits;\n } else {\n data.val = b64.bits;\n }\n return data;\n }).catch(err => {\n delete data.val;\n delete data.preview;\n delete data.src;\n data.width = IMAGE_THUMBNAIL_DIM;\n data.height = IMAGE_THUMBNAIL_DIM;\n // Rethrow.\n throw err;\n });\n}\n\n// Create a preview of a reply.\nexport function replyFormatter(style, data, values, key, stack) {\n if (style == 'IM' || style == 'VD') {\n const isImage = style == 'IM';\n const attr = isImage ? inlineImageAttr.call(this, {key: key}, data) :\n inlineVideoAttr.call(this, {key: key}, data);\n\n let loadedPromise;\n try {\n loadedPromise = cancelablePromise(quoteImageOrVideo.call(this, data, style == 'VD'));\n } catch (error) {\n console.warn(\"Failed to quote image:\", error.message);\n loadedPromise = cancelablePromise(error);\n }\n attr.whenDone = loadedPromise;\n values = [React.createElement(LazyImage, attr, null), ' ', attr.alt];\n return React.createElement(React.Fragment, {key: key}, values);\n } else if (style == 'QQ') {\n if (stack.includes('QQ')) {\n // Quote inside quote when forwarding a message.\n return React.createElement('span', {key: key},\n [React.createElement('i', {key: 'qq', className: 'material-icons'}, 'format_quote'), ' ']);\n }\n\n const attr = Drafty.attrValue('QQ', data) || {};\n attr.key = key;\n attr.className = 'reply-quote'\n return React.createElement(Drafty.tagName('QQ'), attr, values);\n }\n return quoteFormatter.call(this, style, data, values, key);\n}\n","import { KNOWN_HOSTS, DEFAULT_HOST } from '../config.js';\n\n// Detect server address from the URL\nexport function detectServerAddress() {\n let host = DEFAULT_HOST;\n if (typeof window.location == 'object') {\n if (window.location.protocol == 'file:' || window.location.hostname == 'localhost') {\n host = KNOWN_HOSTS.local;\n } else if (window.location.hostname) {\n host = window.location.hostname + (window.location.port ? ':' + window.location.port : '');\n }\n }\n return host;\n}\n\n// Detect if the page is served over HTTPS.\nexport function isSecureConnection() {\n if (typeof window.location == 'object') {\n return window.location.protocol == 'https:';\n }\n return false;\n}\n\nexport function isLocalHost() {\n if (typeof window.location == 'object') {\n return window.location.hostname == 'localhost';\n }\n return false;\n}\n","// Thin REST client for the product-specific `/v1/im/*` API that sits alongside the Tinode WS protocol.\n// Endpoint shapes verified directly against the deployed backend (im_team/im_server, server/im_http.go).\nimport { API_KEY } from '../config.js';\nimport { PACKAGE_VERSION } from '../version.js';\nimport LocalStorageUtil from './local-storage.js';\n\nconst DEFAULT_API_BASE = '/v1/im';\nconst DEFAULT_FILE_BASE = '/v0/file';\n\nexport class ImApiError extends Error {\n constructor(message, reason, status, details) {\n super(message);\n this.reason = reason;\n this.status = status;\n this.details = details;\n }\n}\n\n// docs/IM-前后端对接文档.md §12.4's full reason list. Every existing call site already does\n// `catch(err => onToast(err.message || '...'))`, so translating known reasons at the one place the\n// error is constructed fixes all of them at once, rather than needing a matching change at every\n// individual catch block scattered across the app.\nconst REASON_MESSAGES = {\n // Real per-account risk is low (this app always sends a hardcoded key, so hitting these means a\n // deployment-wide config problem, not something an individual user did) -- but exactly this \"the\n // whole site is silently misconfigured\" scenario has genuinely happened once already (a stale API\n // key got redeployed to production), so it's worth a real message instead of raw English site-wide.\n API_KEY_REQUIRED: '服务暂不可用,请刷新页面重试',\n METHOD_NOT_ALLOWED: '请求方式有误,请刷新页面重试',\n TENANT_UNAVAILABLE: '企业码不存在或已停用',\n TENANT_MISMATCH: '登录状态异常,请重新进入企业码',\n AUTH_FAILED: '账号或密码错误',\n TOKEN_EXPIRED: '登录已过期,请重新登录',\n ACCOUNT_DISABLED: '账号已被禁用',\n RATE_LIMITED: '操作过于频繁,请稍后再试',\n VALIDATION_FAILED: '提交的内容不符合要求',\n IDEMPOTENCY_CONFLICT: '内容已发生变化,请刷新后重试',\n RESOURCE_NOT_FOUND: '内容不存在或已被删除',\n // 后端 server/im_http.go 里 30+ 处 403 用的都是 imReasonPermissionDenied=\"PERMISSION_DENIED\",\n // 从未发送过字面量 \"FORBIDDEN\"——原来的 FORBIDDEN 条目是死代码,全站 403 一直透传英文原文。\n PERMISSION_DENIED: '没有权限执行此操作',\n NOT_FOUND: '内容不存在或已被删除',\n VERSION_CONFLICT: '内容已被修改,请刷新后重试',\n MALFORMED_REQUEST: '请求内容有误,请稍后重试',\n AUTH_REQUIRED: '请先登录',\n ACTION_TOKEN_INVALID: '操作凭证已失效,请重新操作',\n SCHEMA_UNSUPPORTED: '当前版本过旧,请刷新页面后重试',\n IDEMPOTENCY_IN_PROGRESS: '上一次操作正在处理中,请稍后再试',\n INTERNAL_ERROR: '服务器繁忙,请稍后重试',\n UNSUPPORTED_MEDIA_TYPE: '不支持的文件类型',\n CHALLENGE_EXPIRED: '验证码已过期,请重新获取',\n SMS_DELIVERY_FAILED: '短信发送失败,请稍后重试',\n PASSWORD_POLICY_VIOLATION: '密码不符合安全要求',\n VERIFICATION_RATE_LIMITED: details => details && details.retry_after_seconds\n ? `操作过于频繁,请 ${details.retry_after_seconds} 秒后重试`\n : '操作过于频繁,请稍后再试',\n ALREADY_GROUP_MEMBER: '对方已经是群成员',\n DESCRIPTION_REQUIRED: '请填写简介内容',\n DESCRIPTION_TOO_LONG: '简介内容过长',\n GROUP_ADMIN_LIMIT_EXCEEDED: '群管理员数量已达上限',\n INVALID_CREDIT_CODE: '统一社会信用代码格式不正确',\n INVALID_EMAIL: '邮箱格式不正确',\n MAILBOX_UNAVAILABLE: '总经理信箱暂不可用',\n TOO_MANY_FILES: '文件数量超出限制',\n FRIEND_RELATION_REQUIRED: '需要先添加对方为好友',\n MESSAGE_NOT_ALLOWED: '当前状态无法发送消息',\n GROUP_MUTED: '你已被禁言,无法发言',\n GROUP_MEMBER_LIMIT_EXCEEDED: '群成员数量已达上限',\n TENANT_USER_QUOTA_EXCEEDED: '企业账号数已达上限',\n TENANT_GROUP_QUOTA_EXCEEDED: '企业群组数已达上限',\n FILE_TOO_LARGE: '文件大小超出限制',\n FILE_FORBIDDEN: '没有权限访问此文件',\n FILE_UNAVAILABLE: '文件暂不可用',\n STORAGE_QUOTA_EXCEEDED: '存储空间已达上限',\n REALNAME_REQUIRED: '需要先完成实名认证',\n YOUTH_MODE_RESTRICTED: '青少年模式下无法使用此功能',\n RISK_CONFIRMATION_REQUIRED: '需要先完成安全确认',\n RISK_ACTION_BLOCKED: '该操作已被安全策略拦截',\n // 独立密码校验的两个 reason(对接文档 809 行有写),青少年模式关闭/开启走的都是这条接口。\n // 原来没收录,报错时直接透传后端英文原文——PIN 输错显示 \"code invalid\",连续错误锁定后\n // 显示 \"too many attempts\",且不告诉用户要等多久能重试。\n CODE_INVALID: '独立密码不正确',\n TOO_MANY_ATTEMPTS: details => details && details.retry_after_seconds\n ? `连续输错次数过多,请 ${details.retry_after_seconds} 秒后重试`\n : '连续输错次数过多,请稍后重试'\n};\n\nfunction requestId() {\n return (typeof crypto != 'undefined' && crypto.randomUUID) ? crypto.randomUUID() :\n 'web_' + Date.now().toString(36) + '_' + Math.random().toString(36).slice(2);\n}\n\n// Tenant context persists in localStorage (not sessionStorage): it must survive browser restarts\n// the same way the auth-token does, so a returning user's auto-login can still supply `hi.tenant`.\nexport function getTenantContext() {\n return LocalStorageUtil.getObject('im-tenant');\n}\n\nexport function currentTenantCode() {\n const tenant = getTenantContext();\n return (tenant && tenant.code) || 'default';\n}\n\nfunction apiBase() {\n const tenant = getTenantContext();\n return ((tenant && tenant.endpoints && tenant.endpoints.api) || DEFAULT_API_BASE).replace(/\\/$/, '');\n}\n\nfunction fileBase() {\n const tenant = getTenantContext();\n return ((tenant && tenant.endpoints && tenant.endpoints.file) || DEFAULT_FILE_BASE).replace(/\\/$/, '');\n}\n\n// tinode-web.jsx always sets this on login/reconnect (sessionStorage, tab-lifetime), independent of\n// whether the user opted into \"keep logged in\" (which only controls the separate localStorage token\n// used for surviving a browser restart). REST calls need a token for the current session regardless.\nfunction authToken() {\n return sessionStorage.getItem('im-session-token') || '';\n}\n\nfunction normalizeResponse(payload) {\n return (payload && payload.code === 0 && payload.data !== undefined) ? payload.data : payload;\n}\n\n// Core request helper. `auth: false` skips the Authorization header (pre-login calls).\nexport async function imRequest(path, {method = 'GET', body, headers, auth = true, tenantCodeOverride} = {}) {\n const finalHeaders = {\n 'Content-Type': 'application/json',\n 'X-MeetingIM-APIKey': API_KEY,\n 'X-IM-Schema': '1',\n 'X-Tenant-Code': tenantCodeOverride || currentTenantCode(),\n 'X-Request-ID': requestId(),\n ...headers\n };\n if (auth) {\n const token = authToken();\n if (token) {\n finalHeaders.Authorization = 'Bearer ' + token;\n }\n }\n const response = await fetch(apiBase() + path, {\n method,\n headers: finalHeaders,\n body: body !== undefined ? JSON.stringify(body) : undefined\n });\n const text = await response.text();\n let payload = {};\n if (text) {\n try {\n payload = JSON.parse(text);\n } catch (e) {\n throw new ImApiError(response.ok ? '接口返回非 JSON 数据' : (response.statusText || '接口请求失败'),\n 'NON_JSON_RESPONSE', response.status, text.slice(0, 160));\n }\n }\n if (!response.ok || (payload && payload.code && payload.code !== 0)) {\n // A known reason always wins over the raw backend message -- gives every caller (they all just do\n // `err.message || '...'`) the doc-mandated, consistently-worded text instead of whatever string\n // that particular backend handler happened to write, and instead of duplicating this mapping at\n // every individual call site. An unrecognized reason still falls back to the backend's own message\n // (not silently replaced with a generic string) since this backend's messages have consistently\n // been reasonable, specific, business-appropriate text in real testing, not raw internals -- only\n // reasons this app doesn't otherwise know how to react to fall through to it.\n const known = translateReason(payload.reason, payload.details);\n throw new ImApiError(known || payload.message || payload.reason || response.statusText || '请求失败',\n payload.reason, response.status, payload.details);\n }\n return normalizeResponse(payload);\n}\n\n// Several batch endpoints (favorites/batch, favorites/forward, messages/forward, ...) always return\n// HTTP 200 and bury the real per-item outcome in a nested `items[]`/`failed[]` array instead of\n// throwing -- imRequest's translation above never runs for those, since it only fires on a non-2xx/\n// non-zero-code response. Exported so call sites reading one of those per-item `reason` strings\n// directly (e.g. send-message.jsx's sendFavorite) can reuse the exact same table instead of either\n// duplicating it or -- as was actually happening -- showing the raw untranslated reason string.\nexport function translateReason(reason, details) {\n const entry = reason && REASON_MESSAGES[reason];\n return (typeof entry === 'function' ? entry(details) : entry) || null;\n}\n\nconst idem = () => ({'Idempotency-Key': requestId()});\n\n// Most list endpoints here cap out at 20-50 items per page (some as low as 30, e.g. group\n// members against a 128-member cap) and round7 testing found several call sites only ever\n// fetched the first page -- for things like \"am I this group's owner/admin\" or the admin\n// candidate list, a real owner/admin sitting past page 1 went undetected entirely rather than\n// just showing an incomplete list. Empty/repeated next_cursor means done; this app's list\n// responses haven't been observed to send a separate has_more that disagrees with that.\nexport async function fetchAllPages(fetchPage, startCursor = '') {\n let cursor = startCursor;\n let items = [];\n for (;;) {\n const page = await fetchPage(cursor);\n items = items.concat((page && page.items) || []);\n const nextCursor = (page && page.next_cursor) || '';\n if (!nextCursor || nextCursor === cursor) {\n break;\n }\n cursor = nextCursor;\n }\n return items;\n}\n\nexport const imGet = (path, opts) => imRequest(path, opts);\nexport const imPost = (path, body, opts = {}) => imRequest(path, {method: 'POST', body, headers: idem(), ...opts});\nexport const imPatch = (path, body, opts = {}) => imRequest(path, {method: 'PATCH', body, headers: idem(), ...opts});\nexport const imPut = (path, body, opts = {}) => imRequest(path, {method: 'PUT', body, headers: idem(), ...opts});\nexport const imDelete = (path, opts = {}) => imRequest(path, {method: 'DELETE', headers: idem(), ...opts});\n\nfunction qs(params) {\n const usp = new URLSearchParams();\n Object.entries(params || {}).forEach(([k, v]) => {\n if (v !== undefined && v !== null && v !== '') {\n usp.set(k, v);\n }\n });\n const s = usp.toString();\n return s ? '?' + s : '';\n}\n\n// -- Public uploads (multipart; used before login and for standalone attachments not tied to a chat message). --\nexport async function uploadPublicFile(file, purpose, onProgress) {\n const form = new FormData();\n form.append('purpose', purpose);\n form.append('file', file);\n // Use XHR instead of fetch to get upload progress events.\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('POST', apiBase() + '/public/uploads');\n xhr.setRequestHeader('X-MeetingIM-APIKey', API_KEY);\n xhr.setRequestHeader('X-IM-Schema', '1');\n xhr.setRequestHeader('X-Tenant-Code', currentTenantCode());\n xhr.setRequestHeader('X-Request-ID', requestId());\n if (onProgress) {\n xhr.upload.onprogress = e => onProgress(e.lengthComputable ? e.loaded / e.total : 0);\n }\n xhr.onload = () => {\n let payload = {};\n try { payload = JSON.parse(xhr.responseText); } catch (e) { /* handled below */ }\n if (xhr.status >= 200 && xhr.status < 300 && payload.code === 0) {\n resolve(normalizeResponse(payload));\n } else {\n reject(new ImApiError(payload.message || payload.reason || '上传失败', payload.reason, xhr.status, payload.details));\n }\n };\n xhr.onerror = () => reject(new ImApiError('网络错误,上传失败', 'NETWORK_ERROR', 0));\n xhr.send(form);\n });\n}\n\n// Native large-file upload (Ch.6 group avatars & group files). uploadPublicFile() above can't be reused --\n// its `purpose` is server-whitelisted to exactly 'enterprise_license'/'tenant_entry_feedback'. The vendored\n// SDK's own tinode.getLargeFileHelper().upload() talks to the same underlying native endpoint but gets two\n// headers wrong for this backend (verified live against the real server, not just read from source):\n// it sends 'X-Tinode-APIKey' (server only accepts 'X-MeetingIM-APIKey', same rename Phase 0 already applied\n// everywhere else in this file) and 'X-Tinode-Auth' (server's getHttpAuth() doesn't recognize that header\n// name at all, only 'X-MeetingIM-Auth' or plain 'Authorization'). The auth *value* must be the native Tinode\n// session token (tinode.getAuthToken().token, scheme 'Token') -- the REST layer's own sessionStorage Bearer\n// token is a separate namespace and fails this endpoint's base64 secret decode with a 400. Response is\n// Tinode's native {ctrl:{code,text,params:{url,expires}}} envelope, not the {code:0,data} REST envelope --\n// there's no separate file_id field; the id is the last path segment of `url`, kept verbatim (including its\n// extension suffix) since getFileUrl() already round-trips that exact format unmodified.\n// This upload talks to Tinode's native {ctrl} protocol (see the comment above), not the REST layer,\n// so REASON_MESSAGES above never applies to it -- confirmed against server/datamodel.go's Err*\n// constructors for the literal ctrl.text values a failure here can actually carry.\nconst UPLOAD_CTRL_TEXT_CN = {\n 'too large': '文件大小超出限制',\n 'malformed': '请求内容有误,请稍后重试',\n 'permission denied': '没有权限执行此操作',\n 'gone': '内容不存在或已被删除'\n};\nexport function uploadLargeFile(tinode, file, onProgress) {\n const authToken = tinode && tinode.getAuthToken && tinode.getAuthToken();\n if (!authToken) {\n return Promise.reject(new ImApiError('尚未登录,无法上传文件', 'AUTH_REQUIRED', 401));\n }\n const form = new FormData();\n form.append('file', file);\n form.set('id', tinode.getNextUniqueId());\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('POST', fileBase() + '/u/');\n xhr.setRequestHeader('X-MeetingIM-APIKey', API_KEY);\n xhr.setRequestHeader('Authorization', 'Token ' + authToken.token);\n if (onProgress) {\n xhr.upload.onprogress = e => onProgress(e.lengthComputable ? e.loaded / e.total : 0);\n }\n xhr.onload = () => {\n let payload = {};\n try { payload = JSON.parse(xhr.responseText); } catch (e) { /* handled below */ }\n const ctrl = payload.ctrl || {};\n if (xhr.status >= 200 && xhr.status < 300 && ctrl.params && ctrl.params.url) {\n const url = ctrl.params.url;\n resolve({fileId: url.slice(url.lastIndexOf('/') + 1), url, expires: ctrl.params.expires});\n } else {\n const known = ctrl.text && UPLOAD_CTRL_TEXT_CN[ctrl.text.trim().toLowerCase()];\n reject(new ImApiError(known || ctrl.text || '上传失败', 'UPLOAD_FAILED', xhr.status));\n }\n };\n xhr.onerror = () => reject(new ImApiError('网络错误,上传失败', 'NETWORK_ERROR', 0));\n xhr.send(form);\n });\n}\n\n// Fixed-headers drop-in replacement for tinode.getLargeFileHelper(), for sending chat attachments\n// (messages-view.jsx). The vendored SDK's LargeFileHelper hardcodes the same two wrong headers\n// uploadLargeFile() above works around ('X-Tinode-APIKey' instead of 'X-MeetingIM-APIKey', and\n// 'X-Tinode-Auth' instead of 'Authorization') -- confirmed live: every image/video/file/voice message\n// too large to send inband was silently failing to upload. Can't just call uploadLargeFile() at each\n// call site instead, because messages-view.jsx also depends on LargeFileHelper's cancel-in-flight-send\n// support (handleCancelUpload) and its urlPromise contract (Drafty.attachFile/insertImage/insertVideo/\n// insertAudio expect the resolved value to be a bare URL string, or for video a [url, prevUrl] pair --\n// not the {fileId,url,expires} object uploadLargeFile() returns). This mirrors just that subset of the\n// real class's interface (upload() returning a bare-URL promise, onProgress, and cancel() aborting any\n// still-in-flight XHRs via the same `this.xhr` array pattern the real LargeFileHelper.cancel() uses).\nexport function createChatUploader(tinode) {\n const xhrs = [];\n return {\n onProgress: null,\n upload(file) {\n const self = this;\n const authToken = tinode && tinode.getAuthToken && tinode.getAuthToken();\n if (!authToken) {\n return Promise.reject(new ImApiError('尚未登录,无法上传文件', 'AUTH_REQUIRED', 401));\n }\n return new Promise((resolve, reject) => {\n const form = new FormData();\n form.append('file', file);\n form.set('id', tinode.getNextUniqueId());\n const xhr = new XMLHttpRequest();\n xhrs.push(xhr);\n xhr.open('POST', fileBase() + '/u/');\n xhr.setRequestHeader('X-MeetingIM-APIKey', API_KEY);\n xhr.setRequestHeader('Authorization', 'Token ' + authToken.token);\n xhr.upload.onprogress = e => {\n if (e.lengthComputable && self.onProgress) {\n self.onProgress(e.loaded / e.total);\n }\n };\n xhr.onload = () => {\n let payload = {};\n try { payload = JSON.parse(xhr.responseText); } catch (e) { /* handled below */ }\n const ctrl = payload.ctrl || {};\n if (xhr.status >= 200 && xhr.status < 300 && ctrl.params && ctrl.params.url) {\n resolve(ctrl.params.url);\n } else {\n // Same native-{ctrl}-protocol translation as uploadLargeFile above -- REASON_MESSAGES\n // never applies here, and a too-large photo/video/file picked from the attachment panel\n // is a realistic, easy way for a real user to hit this.\n const known = ctrl.text && UPLOAD_CTRL_TEXT_CN[ctrl.text.trim().toLowerCase()];\n reject(new ImApiError(known || ctrl.text || '上传失败', 'UPLOAD_FAILED', xhr.status));\n }\n };\n xhr.onerror = () => reject(new ImApiError('网络错误,上传失败', 'NETWORK_ERROR', 0));\n xhr.send(form);\n });\n },\n cancel() {\n xhrs.forEach(req => { if (req.readyState < 4) { req.abort(); } });\n }\n };\n}\n\n// Fixed-headers drop-in replacement for tinode.getLargeFileHelper(), for downloading a chat/favorite\n// out-of-band attachment (content-library-view.jsx's DownloadPage). Same wrong-header bug as\n// createChatUploader() above -- the vendored SDK's LargeFileHelper.download() also hardcodes\n// 'X-Tinode-APIKey'/'X-Tinode-Auth', so every real (non-blob:/data:) download was silently failing.\n// Mirrors the real class's download()/cancel() interface exactly (including the onProgress/onError\n// callback-style signature DownloadPage already calls it with) so the call site needs no other change.\nexport function createFileDownloader(tinode) {\n const xhrs = [];\n return {\n download(relativeUrl, filename, mimetype, onProgress, onError) {\n const authToken = tinode && tinode.getAuthToken && tinode.getAuthToken();\n if (!authToken) {\n const err = new ImApiError('尚未登录,无法下载文件', 'AUTH_REQUIRED', 401);\n if (onError) { onError(err); }\n return Promise.reject(err);\n }\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhrs.push(xhr);\n xhr.open('GET', relativeUrl, true);\n xhr.setRequestHeader('X-MeetingIM-APIKey', API_KEY);\n xhr.setRequestHeader('Authorization', 'Token ' + authToken.token);\n xhr.responseType = 'blob';\n xhr.onprogress = e => { if (onProgress) { onProgress(e.loaded); } };\n xhr.onload = () => {\n if (xhr.status === 200) {\n const link = document.createElement('a');\n link.href = window.URL.createObjectURL(new Blob([xhr.response], {type: mimetype}));\n link.style.display = 'none';\n link.setAttribute('download', filename);\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(link.href);\n resolve();\n } else {\n const reader = new FileReader();\n reader.onload = function() {\n let err;\n try {\n const pkt = JSON.parse(this.result);\n const text = pkt.ctrl && pkt.ctrl.text;\n const known = text && UPLOAD_CTRL_TEXT_CN[text.trim().toLowerCase()];\n err = new ImApiError(known || text || '下载失败', 'DOWNLOAD_FAILED', xhr.status);\n } catch (e) {\n err = new ImApiError('下载失败', 'DOWNLOAD_FAILED', xhr.status);\n }\n if (onError) { onError(err); }\n reject(err);\n };\n reader.readAsText(xhr.response);\n }\n };\n xhr.onerror = () => {\n const err = new ImApiError('网络错误,下载失败', 'NETWORK_ERROR', 0);\n if (onError) { onError(err); }\n reject(err);\n };\n xhr.send();\n });\n },\n cancel() {\n xhrs.forEach(req => { if (req.readyState < 4) { req.abort(); } });\n }\n };\n}\n\n// -- 1.1 Tenant resolution & entry (pre-login, no Authorization header). --\nexport function resolveTenant(tenantCode) {\n return imRequest('/tenants/resolve', {\n method: 'POST', auth: false, tenantCodeOverride: tenantCode,\n body: {tenant_code: tenantCode, platform: 'web', app_version: PACKAGE_VERSION || '0.25.3'}\n });\n}\n\n// 企业注册申请 / 入口反馈 / 意见反馈三个接口后端都定义了 client_context 且会入库\n// (imTenantApplicationRequest / imTenantEntryFeedbackRequest / imFeedbackRequest,\n// server/im_http.go:255/263/367,落库点 :790/:840/:1478),需求文档和对接文档也都要求带上\n// 设备与版本信息。前端一直没发。在这里统一注入,省得三处各写一遍、也不会再漏。\nfunction clientContext() {\n return {\n platform: 'web',\n app_version: PACKAGE_VERSION || '',\n user_agent: (typeof navigator !== 'undefined' && navigator.userAgent) || '',\n language: (typeof navigator !== 'undefined' && navigator.language) || '',\n // 网络类型不是所有浏览器都有(Safari/Firefox 没有 navigator.connection),拿不到就不发这一项\n network: (typeof navigator !== 'undefined' && navigator.connection && navigator.connection.effectiveType) || undefined\n };\n}\n\nexport function submitTenantApplication(body) {\n return imRequest('/tenant-applications', {method: 'POST', auth: false, headers: idem(),\n body: {client_context: clientContext(), ...body}});\n}\n\nexport function submitTenantEntryFeedback(body) {\n return imRequest('/tenant-entry-feedback', {method: 'POST', auth: false, headers: idem(),\n body: {client_context: clientContext(), ...body}});\n}\n\n// -- 1.4/1.5/1.6 Phone verification codes (register / reset_password / security scenes). --\nexport function requestVerificationCode(scene, phone) {\n return imRequest('/auth/verification-codes', {method: 'POST', auth: false, headers: idem(), body: {scene, phone}});\n}\n\nexport function verifyRegisterCode(challengeId, code) {\n return imRequest('/auth/verification-codes/' + encodeURIComponent(challengeId) + '/verify',\n {method: 'POST', auth: false, body: {code}});\n}\n\nexport function verifyPasswordResetCode(challengeId, code) {\n return imRequest('/auth/password-reset/challenges/' + encodeURIComponent(challengeId) + '/verify',\n {method: 'POST', auth: false, body: {code}});\n}\n\nexport function confirmPasswordReset(resetToken, newPassword) {\n return imRequest('/auth/password-reset/confirm',\n {method: 'POST', auth: false, headers: idem(), body: {reset_token: resetToken, new_password: newPassword}});\n}\n\n// -- Bootstrap / home. --\nexport function getBootstrap() {\n return imRequest('/bootstrap');\n}\n\nexport function getMe() {\n return imRequest('/me');\n}\n\n// -- Realname (1.8/1.9). --\nexport function getRealnameStatus() {\n return imRequest('/security/realname');\n}\n\nexport function submitRealname(body) {\n return imPost('/security/realname/submissions', body);\n}\n\n// -- Security challenge (1.7) & independent password (1.11). --\nexport function createSecurityChallenge(scene) {\n return imPost('/security/challenges', {scene, channel: 'sms'});\n}\n\nexport function verifySecurityChallenge(challengeId, code) {\n return imPost('/security/challenges/' + encodeURIComponent(challengeId) + '/verify', {code});\n}\n\nexport function setIndependentPassword(password, purpose, actionToken) {\n return imPost('/settings/independent-password', {password, purpose, action_token: actionToken});\n}\n\n// `action` defaults server-side to 'close_youth_mode' if omitted (server/im_http.go\n// imIndependentPasswordVerifyRequest) -- pass 'set_independent_password' to mint a token usable\n// with enableYouthMode instead, letting an already-set password unlock re-enabling without\n// forcing another SMS round-trip through the identity-check flow.\nexport function verifyIndependentPassword(password, purpose, action) {\n return imPost('/settings/independent-password/verify', {password, purpose, action});\n}\n\n// -- Friends / contacts (Ch.5). --\nexport const getFriends = (query = '', cursor = '', initial = '') => imGet('/friends' + qs({query, cursor, initial}));\nexport const getFriendRequests = (direction = 'inbound', status = 'all', cursor = '') =>\n imGet('/friend-requests' + qs({direction, status, cursor}));\nexport const createFriendRequest = (targetUserId, message = '', source = 'search', sourceTopic = '') =>\n imPost('/friend-requests', {target_user_id: targetUserId, message, source, source_topic: sourceTopic});\nexport const acceptFriendRequest = (requestId_, version) => imPost('/friend-requests/' + encodeURIComponent(requestId_) + '/accept', version ? {version} : {});\nexport const rejectFriendRequest = (requestId_, version) => imPost('/friend-requests/' + encodeURIComponent(requestId_) + '/reject', version ? {version} : {});\nexport const deleteFriend = userId => imDelete('/friends/' + encodeURIComponent(userId));\nexport const updateFriendRemark = (userId, remark) => imPatch('/friends/' + encodeURIComponent(userId), {remark});\nexport const searchUsers = (query, type = 'account', cursor = '') => imGet('/users/search' + qs({q: query, type, cursor}));\nexport const getUserProfile = identifier => imGet('/users/' + encodeURIComponent(identifier) + '/profile');\nexport const createMyQRCode = (expiresInSeconds = 86400) => imPost('/me/qrcodes', {purpose: 'add_friend', expires_in_seconds: expiresInSeconds});\nexport const createUserQRCode = (identifier, expiresInSeconds = 86400) =>\n imPost('/users/' + encodeURIComponent(identifier) + '/qrcodes', {purpose: 'add_friend', expires_in_seconds: expiresInSeconds});\nexport const resolveQRCode = (token, purpose = 'add_friend') => imPost('/qrcodes/resolve', {token, purpose});\nexport const getBlocks = (cursor = '') => imGet('/blocks' + qs({cursor}));\nexport const blockUser = userId => imPut('/blocks/' + encodeURIComponent(userId), {});\nexport const unblockUser = userId => imDelete('/blocks/' + encodeURIComponent(userId));\nexport const batchUnblockUsers = userIds => imPost('/blocks/batch-delete', {user_ids: userIds});\n\n// -- Conversations (Ch.2/3). --\nexport const searchConversations = (query = '', cursor = '') => imGet('/search/conversations' + qs({q: query, cursor}));\nexport const getSystemNotifications = (cursor = '', limit = 20) => imGet('/system-notifications' + qs({cursor, limit}));\nexport const markSystemNotificationRead = id => imPost('/system-notifications/' + encodeURIComponent(id) + '/read', {read_at: new Date().toISOString()});\nexport const getConversationContext = topic => imGet('/conversations/' + encodeURIComponent(topic) + '/context');\nexport const createP2PConversation = peerUserId => imPost('/conversations/p2p', {peer_user_id: peerUserId});\nexport const getConversationSettings = topic => imGet('/conversations/' + encodeURIComponent(topic) + '/settings');\nexport const updateConversationSettings = (topic, body) => imPatch('/conversations/' + encodeURIComponent(topic) + '/settings', body);\n\n// -- Messages (Ch.4/7). --\n// version 只能默认传 1:服务端做的是乐观锁校验(tenant_adapter.go:1963 要求 msg.Version 与传入值\n// 完全相等,否则 ErrDuplicate),但**没有任何消息读取接口下发过 version 字段**——messagePayload /\n// messageSearchPayload / mediaMessagePayload / favoriteSnapshot 全都没有,冲突时的错误里也不回传\n// 真实值。所以前端拿不到正确的版本号,被编辑过(version>1)的消息撤回必然失败。这是后端缺口,\n// 已记入《IM-后端问题清单.md》,不在前端绕。\nexport const recallMessage = (topic, seq, version = 1, reason = 'mistake') =>\n imPost('/topics/' + encodeURIComponent(topic) + '/messages/' + encodeURIComponent(seq) + '/recall', {version, reason});\nexport const reviseMessage = (topic, seq, content, version = 1) =>\n imPost('/topics/' + encodeURIComponent(topic) + '/messages/' + encodeURIComponent(seq) + '/revisions', {content, client_mid: requestId(), version});\nexport const getMessageReceipts = (topic, seq, cursor = '') =>\n imGet('/topics/' + encodeURIComponent(topic) + '/messages/' + encodeURIComponent(seq) + '/receipts' + qs({cursor}));\n// type='all' searches every message type (text/image/video/voice/file/link) -- the backend's own\n// default when the param is omitted/empty is \"no filter\", so defaulting to 'text' here would have\n// silently restricted every unqualified call to text-only messages.\nexport const searchTopicMessages = (topic, {query = '', type = 'all', cursor = ''} = {}) =>\n imGet('/topics/' + encodeURIComponent(topic) + '/messages/search' + qs({q: query, type, cursor}));\nexport const getMessageContext = (topic, seq, before = 20, after = 20) =>\n imGet('/topics/' + encodeURIComponent(topic) + '/messages/' + encodeURIComponent(seq) + '/context' + qs({before, after}));\nexport const getTopicMedia = (topic, type = 'image', cursor = '') =>\n imGet('/topics/' + encodeURIComponent(topic) + '/media' + qs({type, cursor}));\nexport const getForwardTargets = (query = '', cursor = '') => imGet('/forward-targets' + qs({query, cursor}));\nexport const forwardMessages = (mode, sources, targetTopics, comment = '') =>\n imPost('/messages/forward', {mode, sources, target_topics: targetTopics, comment});\nexport const getForwardBundle = (bundleId, cursor = '') => imGet('/forward-bundles/' + encodeURIComponent(bundleId) + qs({cursor}));\nexport const favoriteMessages = messages => imPost('/favorites/batch', {messages: messages.map(m => ({...m, seq: String(m.seq)}))});\nexport const getFavorites = ({type = 'all', query = '', cursor = '', limit} = {}) => imGet('/favorites' + qs({type, q: query, cursor, limit}));\nexport const getFavorite = favoriteId => imGet('/favorites/' + encodeURIComponent(favoriteId));\nexport const deleteFavorite = favoriteId => imDelete('/favorites/' + encodeURIComponent(favoriteId));\nexport const batchDeleteFavorites = favoriteIds => imPost('/favorites/batch-delete', {favorite_ids: favoriteIds});\nexport const forwardFavorites = (favoriteIds, targetTopics, comment = '') =>\n imPost('/favorites/forward', {favorite_ids: favoriteIds, target_topics: targetTopics, comment});\nexport const checkURL = (url, source = 'favorite') => imPost('/security/urls/check', {url, source});\nexport const confirmRiskChallenge = (riskChallengeId, decision = 'continue') =>\n imPost('/security/risk-challenges/' + encodeURIComponent(riskChallengeId) + '/confirm', {decision});\nexport const getMentionableGroupMembers = (topic, query = '', cursor = '') =>\n imGet('/groups/' + encodeURIComponent(topic) + '/members' + qs({mentionable: true, query, cursor}));\n// 4.1 跨话题草稿:GET 对不存在的草稿返回 {content:'',entities:[],version:0} 而不是 404,PUT 用\n// version 做乐观锁(对接文档描述的样子)。真实验证过用原生话题名(P2P 是对方 user_id,不是\n// REST 层内部的 p2pXXX id)可以正常读写——这个接口内部会先查 Subs.Get 校验会话存在/有权限,\n// 跟 favorites 那条从不做话题归一化、直接 NOT_FOUND 的坏路径不是同一个问题。\nexport const getTopicDraft = topic => imGet('/topics/' + encodeURIComponent(topic) + '/draft');\nexport const updateTopicDraft = (topic, content, entities, version) =>\n imPut('/topics/' + encodeURIComponent(topic) + '/draft', {content, entities, version});\n\nexport async function fetchFileState(fileId, range = '') {\n const headers = {\n 'X-MeetingIM-APIKey': API_KEY, 'X-IM-Schema': '1',\n 'X-Tenant-Code': currentTenantCode(), 'X-Request-ID': requestId()\n };\n const token = authToken();\n // GET /v0/file/s/{id} is the native Tinode file-serving endpoint, not the /v1/im REST API --\n // it's auth-gated by the vendored SDK's auth-handler registry, which is keyed by the literal\n // scheme word in the header and only recognizes 'token' (used by uploadLargeFile above), never\n // 'bearer'. Sending 'Bearer' here (as imRequest correctly does for actual /v1/im/* calls) gets a\n // flat 400 \"malformed\" from every single call -- confirmed live against the real backend: same\n // token value, only the scheme word differs. authToken() itself already holds the right value\n // (tinode-web.jsx's handleLoginSuccessful stores tinode.getAuthToken().token verbatim into\n // sessionStorage['im-session-token']), so no plumbing change is needed beyond the scheme word.\n if (token) {\n headers.Authorization = 'Token ' + token;\n }\n if (range) {\n headers.Range = range;\n }\n const response = await fetch(fileBase() + '/s/' + encodeURIComponent(fileId), {headers});\n return {\n ok: response.ok, status: response.status,\n contentType: response.headers.get('content-type') || '',\n contentLength: response.headers.get('content-length') || '',\n acceptRanges: response.headers.get('accept-ranges') || '',\n etag: response.headers.get('etag') || ''\n };\n}\n\nexport function publicFileBase() {\n return fileBase();\n}\n\n// Just the URL string -- fileBase() (the tenant's real, possibly cross-origin file domain, e.g.\n// \"https://api.118im.com/v0/file\") + the server-relative path a Drafty ref/upload response carries.\n// No fetch. Split out from getFileUrl() below for DownloadPage (content-library-view.jsx): that\n// caller needs a correctly-qualified URL to *display and hand to the download button*, not to\n// eagerly pull the whole file into a blob the moment the page opens -- getFileUrl()'s eager fetch,\n// used unmodified there, silently downloaded every out-of-band attachment in full before the user\n// ever pressed \"download\", defeating the ready/downloading/done UI entirely.\nexport function resolveFileUrl(fileId) {\n return fileId ? fileBase() + '/s/' + encodeURIComponent(fileId) : null;\n}\n\n// File serving (GET /v0/file/s/{id}) is auth-gated -- the upload endpoints never return a directly\n// servable URL (publicUploadPayload only has file_id/purpose/mime_type/size/expires_at), so a plain\n// can't be pointed at it (browsers don't attach custom headers to img/video/audio requests).\n// This fetches the bytes with the right headers once per file_id and hands back a blob: object URL,\n// cached so avatars/attachments repeated across a list (friends, search results, ...) aren't refetched.\nconst fileUrlCache = new Map();\nexport function getFileUrl(fileId) {\n if (!fileId) {\n return Promise.resolve(null);\n }\n if (fileUrlCache.has(fileId)) {\n return fileUrlCache.get(fileId);\n }\n const headers = {\n 'X-MeetingIM-APIKey': API_KEY, 'X-IM-Schema': '1',\n 'X-Tenant-Code': currentTenantCode(), 'X-Request-ID': requestId()\n };\n const token = authToken();\n // Same native-endpoint scheme requirement as fetchFileState() above -- 'Token', not 'Bearer'.\n if (token) {\n headers.Authorization = 'Token ' + token;\n }\n const promise = fetch(resolveFileUrl(fileId), {headers}).then(res => {\n if (!res.ok) {\n throw new ImApiError('文件加载失败', 'FILE_FETCH_FAILED', res.status);\n }\n return res.blob();\n }).then(blob => URL.createObjectURL(blob)).catch(err => {\n fileUrlCache.delete(fileId);\n throw err;\n });\n fileUrlCache.set(fileId, promise);\n return promise;\n}\n\n// -- Groups (Ch.6). --\nexport const getGroups = ({category = 'joined', query = '', cursor = ''} = {}) => imGet('/groups' + qs({category, query, cursor}));\nexport const createGroup = ({name, description = '', memberUserIds = [], avatarFileId = ''}) =>\n imPost('/groups', {name, description, member_user_ids: memberUserIds, avatar_file_id: avatarFileId});\nexport const getGroup = topic => imGet('/groups/' + encodeURIComponent(topic));\nexport const updateGroup = (topic, body) => imPatch('/groups/' + encodeURIComponent(topic), body);\nexport const getGroupSettings = topic => imGet('/groups/' + encodeURIComponent(topic) + '/settings');\nexport const updateGroupMemberSettings = (topic, {pinned, mute_notifications}) =>\n imPatch('/groups/' + encodeURIComponent(topic) + '/member-settings', {pinned, mute_notifications});\nexport const updateMyGroupProfile = (topic, nickname, version) =>\n imPut('/groups/' + encodeURIComponent(topic) + '/members/me/profile', {nickname, version});\n// GET .../members/me/profile is the only endpoint that actually returns the saved nickname --\n// confirmed live that GET .../members (getGroupMembers below) never includes group_nickname on any\n// item, so anything reading the nickname from that list (as this file's own callers used to) will\n// always see it as unset even right after a successful save.\nexport const getMyGroupProfile = topic => imGet('/groups/' + encodeURIComponent(topic) + '/members/me/profile');\nexport const leaveGroup = topic => imPost('/groups/' + encodeURIComponent(topic) + '/leave', {});\nexport const getGroupMembers = (topic, {query = '', cursor = '', role = '', eligibleRole = '', mentionable, muteEligible} = {}) =>\n imGet('/groups/' + encodeURIComponent(topic) + '/members' +\n qs({query, cursor, role, eligible_role: eligibleRole, mentionable: mentionable ? 'true' : '', mute_eligible: muteEligible ? 'true' : ''}));\nexport const createGroupQRCode = (topic, expiresInSeconds = 86400) =>\n imPost('/groups/' + encodeURIComponent(topic) + '/qrcodes', {expires_in_seconds: expiresInSeconds});\nexport const inviteGroupMembers = (topic, userIds, message = '') =>\n imPost('/groups/' + encodeURIComponent(topic) + '/invitations', {user_ids: userIds, message});\nexport const acceptGroupInvitation = invitationId => imPost('/group-invitations/' + encodeURIComponent(invitationId) + '/accept', {});\nexport const createGroupJoinRequest = (topic, {message = '', source = 'qr', qrToken = ''} = {}) =>\n imPost('/groups/' + encodeURIComponent(topic) + '/join-requests', {message, source, qr_token: qrToken});\nexport const getGroupJoinRequests = (topic, status = 'pending', cursor = '') =>\n imGet('/groups/' + encodeURIComponent(topic) + '/join-requests' + qs({status, cursor}));\nexport const acceptGroupJoinRequest = (topic, requestId_, version) =>\n imPost('/groups/' + encodeURIComponent(topic) + '/join-requests/' + encodeURIComponent(requestId_) + '/accept', version ? {version} : {});\n// Server struct (imGroupJoinRequestActionRequest) only has `Version` -- no reason field exists, and the\n// business layer hardcodes an empty reject-reason even internally, so there's nothing to send here. Every\n// JSON body goes through decodeIMJSONBody's DisallowUnknownFields(), so including an extra `reason` key\n// (as an earlier draft of this function did) makes every single call 400 regardless of its value.\nexport const rejectGroupJoinRequest = (topic, requestId_, version) =>\n imPost('/groups/' + encodeURIComponent(topic) + '/join-requests/' + encodeURIComponent(requestId_) + '/reject', version ? {version} : {});\nexport const getGroupSummary = topic => imGet('/groups/' + encodeURIComponent(topic) + '/summary');\nexport const getLatestGroupAnnouncement = topic => imGet('/groups/' + encodeURIComponent(topic) + '/announcements/latest');\nexport const updateCurrentGroupAnnouncement = (topic, content, version) =>\n imPut('/groups/' + encodeURIComponent(topic) + '/announcements/current', {content, version});\nexport const getGroupAnnouncement = (topic, announcementId) =>\n imGet('/groups/' + encodeURIComponent(topic) + '/announcements/' + encodeURIComponent(announcementId));\nexport const readGroupAnnouncement = (topic, announcementId) =>\n imPost('/groups/' + encodeURIComponent(topic) + '/announcements/' + encodeURIComponent(announcementId) + '/read', {});\nexport const getGroupGovernance = topic => imGet('/groups/' + encodeURIComponent(topic) + '/governance');\nexport const updateGroupGovernance = (topic, body) => imPatch('/groups/' + encodeURIComponent(topic) + '/governance', body);\nexport const getGroupRoleLimits = topic => imGet('/groups/' + encodeURIComponent(topic) + '/role-limits');\nexport const addGroupAdmins = (topic, userIds, version) => imPost('/groups/' + encodeURIComponent(topic) + '/admins/batch', {user_ids: userIds, version});\n// Must merge into idem()'s headers, not replace them (imDelete/imPost's `{headers: idem(), ...opts}`\n// lets a same-key `opts.headers` clobber the whole object) -- the same Idempotency-Key-goes-missing\n// bug this codebase already found and fixed once in disableYouthMode.\nexport const deleteGroupAdmin = (topic, userId, version) =>\n imDelete('/groups/' + encodeURIComponent(topic) + '/admins/' + encodeURIComponent(userId), version ? {headers: {...idem(), 'If-Match': String(version)}} : {});\nexport const muteGroupMembers = (topic, members, reason = '') => imPost('/groups/' + encodeURIComponent(topic) + '/mutes', {members, reason});\nexport const getGroupMutes = (topic, cursor = '') => imGet('/groups/' + encodeURIComponent(topic) + '/mutes' + qs({cursor}));\nexport const unmuteGroupMember = (topic, userId) => imDelete('/groups/' + encodeURIComponent(topic) + '/mutes/' + encodeURIComponent(userId));\nexport const transferGroupOwner = (topic, targetUserId, version, actionToken = '') =>\n imPost('/groups/' + encodeURIComponent(topic) + '/owner-transfer', {target_user_id: targetUserId, version},\n actionToken ? {headers: {...idem(), 'X-Action-Token': actionToken}} : {});\n// Real backend reads the search text from `q`, not `query` (confirmed against ListFiles's real\n// query-param handling, same bug class as getOrganizationMembers) -- the search box in Group Files\n// was silently a no-op.\nexport const getGroupFiles = (topic, {query = '', type = '', cursor = ''} = {}) =>\n imGet('/groups/' + encodeURIComponent(topic) + '/files' + qs({q: query, type, cursor}));\n// All fields besides file_id are `omitempty` server-side, so omitting them (as an earlier draft of this\n// function did) never errors -- it just registers a file with a blank name and 0 size in the files list.\nexport const addGroupFile = (topic, {fileId, fileName = '', mimeType = '', fileType = '', fileSize = 0, sourceTopic = '', sourceSeq} = {}) =>\n imPost('/groups/' + encodeURIComponent(topic) + '/files', {\n file_id: fileId, file_name: fileName, mime_type: mimeType, file_type: fileType, file_size: fileSize,\n source_topic: sourceTopic, source_seq: sourceSeq\n });\nexport const deleteGroupFile = (topic, groupFileId) => imDelete('/groups/' + encodeURIComponent(topic) + '/files/' + encodeURIComponent(groupFileId));\nexport const getGroupMemberProfile = (topic, userId) => imGet('/groups/' + encodeURIComponent(topic) + '/members/' + encodeURIComponent(userId) + '/profile');\n\n// -- Organization / workbench (Ch.9). --\nexport const getWorkbench = () => imGet('/workbench');\nexport const getOrganizationDepartments = (parentId = 'root', cursor = '') => imGet('/organization/departments' + qs({parent_id: parentId, cursor}));\nexport const getOrganizationDepartmentMembers = (departmentId, cursor = '') =>\n imGet('/organization/departments/' + encodeURIComponent(departmentId) + '/members' + qs({cursor}));\n// Real backend only reads `q` (server/im_http.go), never `query` -- confirmed against\n// server/im_http_test.go's own request fixtures. This function used to send `query`, silently making\n// every caller's search box a no-op (server ignores the unrecognized param and returns the unfiltered\n// list every time).\nexport const getOrganizationMembers = ({query = '', departmentId = '', cursor = ''} = {}) =>\n imGet('/organization/members' + qs({q: query, department_id: departmentId, cursor}));\nexport const searchOrganization = (query = '', types = 'department,user', cursor = '') =>\n imGet('/organization/search' + qs({q: query, types, cursor}));\nexport const getMeetings = (cursor = '', limit = 20) => imGet('/meetings' + qs({limit, cursor}));\nexport const createMeeting = body => imPost('/meetings', body);\nexport const getMeeting = meetingId => imGet('/meetings/' + encodeURIComponent(meetingId));\nexport const updateMeeting = (meetingId, body) => imPatch('/meetings/' + encodeURIComponent(meetingId), body);\nexport const cancelMeeting = (meetingId, version, reason = '时间冲突') => imPost('/meetings/' + encodeURIComponent(meetingId) + '/cancel', {version, reason});\nexport const sendMeetingReminders = meetingId => imPost('/meetings/' + encodeURIComponent(meetingId) + '/reminders', {});\nexport const respondMeeting = (meetingId, response, version) => imPut('/meetings/' + encodeURIComponent(meetingId) + '/my-response', {response, version});\n// Note: the server only reads scope/from/to/status/cursor -- 'date' and 'department_id' are\n// silently ignored (confirmed against server/im_http.go), so a single-day filter must be\n// expressed as from==to, and there is no way to scope this list to one department.\nexport const getDailyReports = ({scope = 'mine', from = '', to = '', status = '', cursor = ''} = {}) =>\n imGet('/reports/daily' + qs({scope, from, to, status, cursor}));\nexport const createDailyReport = reportDate => imPost('/reports/daily', {report_date: reportDate});\nexport const getDailyReport = reportId => imGet('/reports/daily/' + encodeURIComponent(reportId));\nexport const updateDailyDraft = (reportId, content, version, attachments = []) =>\n imPut('/reports/daily/' + encodeURIComponent(reportId) + '/draft', {content, attachments, version});\nexport const submitDailyReport = (reportId, version) => imPost('/reports/daily/' + encodeURIComponent(reportId) + '/submit', {version});\n// TenantDailyReportStats does honor department_id (reportMemberScopeWhere adds `m.department_id=?`\n// when it's non-empty) -- confirmed against current im_be HEAD, this wasn't always true and an earlier\n// comment here claimed the opposite.\nexport const getDailyStatistics = (date, departmentId = '') => imGet('/reports/daily/statistics' + qs({date, department_id: departmentId}));\nexport const sendDailyReminders = (date, userIds = []) => imPost('/reports/daily/reminders', {date, user_ids: userIds});\nexport const getMonthlyReports = ({scope = 'mine', fromMonth = '', toMonth = '', status = '', cursor = ''} = {}) =>\n imGet('/reports/monthly' + qs({scope, from_month: fromMonth, to_month: toMonth, status, cursor}));\nexport const createMonthlyReport = month => imPost('/reports/monthly', {month});\nexport const getMonthlyReport = reportId => imGet('/reports/monthly/' + encodeURIComponent(reportId));\nexport const updateMonthlyDraft = (reportId, workSummary, nextPlan, version, attachments = []) =>\n imPut('/reports/monthly/' + encodeURIComponent(reportId) + '/draft', {work_summary: workSummary, next_plan: nextPlan, attachments, version});\nexport const submitMonthlyReport = (reportId, version) => imPost('/reports/monthly/' + encodeURIComponent(reportId) + '/submit', {version});\n// server/im_http.go's serveIMMonthlyReportReopen decodes only {version} (DisallowUnknownFields\n// rejects anything else) -- an earlier draft of this function sent an extra `reason` field that\n// would 400 MALFORMED_REQUEST on every real call. Also: the store layer's UPDATE has\n// `WHERE ... AND author_id=?` keyed off the *caller's* uid, so this only ever lets a report's own\n// author reopen their own already-submitted report for further editing -- there is no\n// manager-reopens-someone-else's-report capability on the backend.\nexport const reopenMonthlyReport = (reportId, version) =>\n imPost('/reports/monthly/' + encodeURIComponent(reportId) + '/reopen', {version});\n// Same department_id support as getDailyStatistics (TenantMonthlyReportStats shares reportMemberScopeWhere).\nexport const getMonthlyStatistics = (month, departmentId = '') => imGet('/reports/monthly/statistics' + qs({month, department_id: departmentId}));\nexport const getExecutiveMailboxConfig = () => imGet('/executive-mailbox/config');\nexport const submitExecutiveMailboxMessage = body => imPost('/executive-mailbox/submissions', body);\n\n// -- Personal settings (Ch.10). --\nexport const getMeProfile = () => imGet('/me/profile');\nexport const updateMeProfile = body => imPatch('/me/profile', body);\nexport const getMePrivacy = () => imGet('/me/privacy');\nexport const updateMePrivacy = body => imPatch('/me/privacy', body);\nexport const getYouthMode = () => imGet('/settings/youth-mode');\nexport const enableYouthMode = (policyVersion, actionToken) => imPost('/settings/youth-mode/enable', {policy_version: policyVersion, action_token: actionToken});\n// imPost spreads `opts` last, so passing `headers` directly would silently replace (not merge\n// with) the Idempotency-Key header from idem() -- confirmed live: the server actually enforces\n// it (\"Idempotency-Key is required\", 400), unlike the earlier research pass's assumption that a\n// missing key here was harmless. Merge explicitly instead of letting the spread clobber it.\nexport const disableYouthMode = actionToken => imPost('/settings/youth-mode/disable', {}, {headers: {...idem(), 'X-Action-Token': actionToken}});\nexport const getLatestAppRelease = ({platform = 'android', currentVersion = '1.0.0', channel = 'stable'} = {}) =>\n imGet('/app/releases/latest' + qs({platform, current_version: currentVersion, channel}));\nexport const updateDevicePushToken = (deviceId, body) => imPut('/devices/' + encodeURIComponent(deviceId) + '/push-token', body);\n\n// -- Reports & feedback (Ch.11). --\nexport const getAbuseReasons = (targetType = 'user') => imGet('/reports/abuse/reasons' + qs({target_type: targetType}));\nexport const submitAbuseReport = body => imPost('/reports/abuse', body);\nexport const getFeedbackConfig = () => imGet('/feedback/config');\nexport const submitFeedback = body => imPost('/feedback', {client_context: clientContext(), ...body});\n","// Helper functions for storing values in localStorage.\n// By default localStorage can store only strings, not objects or other types.\n\nexport default class LocalStorageUtil {\n // Replace old object with the new one.\n static setObject(key, value) {\n localStorage.setItem(key, JSON.stringify(value));\n }\n\n // Get stored object.\n static getObject(key) {\n const value = localStorage.getItem(key);\n return value && JSON.parse(value);\n }\n\n // Partially or wholly update stored object.\n static updateObject(key, value) {\n const oldVal = this.getObject(key);\n this.setObject(key, Object.assign(oldVal || {}, value));\n }\n\n // Just a wrapper.\n static removeItem(key) {\n localStorage.removeItem(key);\n }\n}\n","// Utility class for hash navigation.\n\n// Every `navigateTo` call assigns `location.hash`, which the browser already records as a normal\n// history entry -- `history.back()` would land on whatever the user actually saw before, for free.\n// The product's \"back\" buttons never used that: each page hardcodes a single destination view name\n// (e.g. Profile's `back={friend ? 'friend-profile' : 'chat-standard'}`), which is only ever right for\n// the one entry point its author had in mind. Reach the same page from a second place (search result\n// vs. QR scan vs. a banner inside an open chat) and \"back\" throws you at that guessed destination\n// instead of retracing your actual steps. `goBack()` below is the fix: count real in-app navigations\n// this page load and prefer `history.back()` whenever there's one to return to, only falling back to\n// the old hardcoded guess when there truly isn't (fresh load, deep link, or a page refresh -- this\n// counter is in-memory and intentionally does not survive those).\nlet navigationCount = 0;\n\nexport default class HashNavigation {\n // Parse hash as in http://www.example.com/path#hash as if it were\n // path and arguments.\n static parseUrlHash(hash) {\n // Split 'path/?args' into 'path/' and 'args', path -> parts[0], args->path[1].\n const parts = hash.split('?', 2);\n const params = {};\n let path = [];\n if (parts[0]) {\n path = parts[0].replace('#', '').split('/');\n }\n if (parts[1]) {\n parts[1].split('&').forEach((arg) => {\n // Can't use split() because the value may contain '='.\n const eq = arg.indexOf('=');\n if (eq > 0) {\n params[arg.slice(0, eq)] = decodeURIComponent(arg.slice(eq + 1));\n }\n });\n }\n return {path: path, params: params};\n }\n\n static navigateTo(url) {\n navigationCount++;\n window.location.hash = url;\n }\n\n // Real \"back\": retraces the hash the user was actually on before, via native browser history,\n // rather than a page's own guess at where it must have been reached from. Returns whether it\n // actually did that -- every call site already has its own hardcoded-destination `navigate(...)`\n // fallback (a page's `back`/`backUid`/`backTopic` props) for the one case this can't cover: a\n // fresh load, deep link, or refresh, where there's no in-app history yet to go back to (this\n // counter is in-memory by design and does not survive those) -- callers keep using that fallback\n // unchanged, just gated behind `if (!HashNavigation.goBack()) { ...existing fallback... }`.\n static goBack() {\n if (navigationCount > 0) {\n navigationCount--;\n window.history.back();\n return true;\n }\n return false;\n }\n\n static composeUrlHash(path, params) {\n let url = path.join('/');\n const args = [];\n for (const key in params) {\n if (params.hasOwnProperty(key)) {\n if (params[key] !== undefined) {\n args.push(key + '=' + encodeURIComponent(params[key]));\n }\n }\n }\n if (args.length > 0) {\n url += '?' + args.join('&');\n }\n return url;\n }\n\n static addUrlParam(hash, key, value) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.params[key] = value;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static removeUrlParam(hash, key) {\n const parsed = HashNavigation.parseUrlHash(hash);\n delete parsed.params[key];\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static removeUrlParams(hash, keys) {\n if (!Array.isArray(keys)) {\n keys = [keys];\n }\n const parsed = HashNavigation.parseUrlHash(hash);\n for (const key of keys) {\n delete parsed.params[key];\n }\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlSidePanel(hash, sidepanel) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.path[0] = sidepanel;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlInfoPanel(hash, infopanel) {\n const parsed = HashNavigation.parseUrlHash(hash);\n if (infopanel) {\n parsed.params.info = infopanel;\n } else {\n delete parsed.params.info;\n }\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlTopic(hash, topic) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.path[1] = topic;\n // Close InfoView on topic change.\n delete parsed.params.info;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n}\n","// Short representation of time in the past.\nexport function shortDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n if (then.getFullYear() == now.getFullYear()) {\n // Same year.\n if (then.getMonth() == now.getMonth() && then.getDate() == now.getDate()) {\n // Same month and day, show time only.\n return then.toLocaleTimeString(locale, {hour12: false, hour: '2-digit', minute: '2-digit'});\n }\n // Different month and/or day, show month day, time.\n return then.toLocaleDateString(locale,\n {hour12: false, month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'});\n }\n // Different year: just show the date.\n return then.toLocaleDateString(locale, {year: 'numeric', month: 'short', day: 'numeric'});\n}\n\n// Representation a date relative to now.\nexport function relativeDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n const thenDays = Math.floor((then.getTime() - then.getTimezoneOffset() * 60_000) / 86_400_000);\n const nowDays = Math.floor((now.getTime() - now.getTimezoneOffset() * 60_000) / 86_400_000);\n const diff = thenDays - nowDays;\n if (Math.abs(diff) < 2) {\n // Today or yesterday.\n return new Intl.RelativeTimeFormat(locale, { numeric: 'auto' }).format(diff, 'day')\n }\n // More than two days: just show the date.\n return new Intl.DateTimeFormat(locale).format(then);\n}\n\n// Convert seconds to [hours:]minutes:seconds, i.e. 156 sec -> 2:36, 3756 sec -> 1:02:36.\n// If fixedMins is true, then minutes are represented by at least two digits.\nexport function secondsToTime(seconds, fixedMin) {\n if (typeof seconds != 'number') {\n return '';\n }\n\n let min = (Math.floor(seconds / 60) | 0) % 60;\n let hours = Math.floor(seconds / 3600) | 0;\n\n if (fixedMin || hours > 0) {\n min = min < 10 ? `0${min}` : min;\n }\n let sec = (seconds | 0) % 60;\n sec = sec < 10 ? `0${sec}` : sec;\n if (hours == 0) {\n return `${min}:${sec}`;\n }\n return `${hours}:${min}:${sec}`;\n}\n\n// Convert a number of bytes to human-readable format.\nexport function bytesToHumanSize(bytes) {\n if (!bytes || bytes == 0) {\n return '0 Bytes';\n }\n\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const bucket = Math.min(Math.floor(Math.log2(bytes) / 10) | 0, sizes.length-1);\n const count = bytes / Math.pow(1024, bucket);\n const round = bucket > 0 ? (count < 3 ? 2 : (count < 30 ? 1 : 0)) : 0;\n return count.toFixed(round) + ' ' + sizes[bucket];\n}\n\n// Shorten a file name to be under maxLength by clipping out the middle.\nexport function shortenFileName(filename, maxLength) {\n if (typeof filename != 'string') {\n return filename;\n }\n return filename.length > maxLength ?\n filename.slice(0, maxLength/2 - 1) + '…' + filename.slice(1 - maxLength/2) : filename;\n}\n\n// Get 32 bit integer hash value for a string. Ideally it should produce the same value\n// as Java's String#hash().\nfunction stringToColorHash(value) {\n let hash = 0;\n value = '' + value;\n for (let i = 0; i < value.length; i++) {\n hash = ((hash << 5) - hash) + value.charCodeAt(i);\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\n// User avatar letter color id.\nexport function letterTileColorId(userId) {\n return Math.abs(stringToColorHash(userId)) % 16;\n}\n\n// Converts user or topic ID to a CSS color class. Ideally it should produce the same color value as Java version.\n// params:\n// - {string} id: user or topic ID\n// - {boolean} light: light or dark version of the color.\n// - {boolean} fg: foreground (text) or background color.\nexport function idToColorClass(id, light, fg) {\n return (light ? 'lt-' : 'dk-') + (fg ? 'fg-' : 'bg-') + letterTileColorId(id);\n}\n\n// Takes ISO Alpha-2 country code, like 'US' and converts it to a flag emoji.\nexport function flagEmoji(countryCode) {\n const codePoints = countryCode\n .toUpperCase()\n .split('')\n .map(char => 0x1F1A5 + char.charCodeAt());\n return String.fromCodePoint(...codePoints);\n}\n\n// Truncate a string to a specific length and add ellipsis if needed.\n// Support both LTR and RTL languages.\nexport function truncateString(str, maxLength) {\n if (typeof str !== 'string') {\n return str;\n }\n if (str.length <= maxLength) {\n return str;\n }\n\n // Detect RTL characters in the string and truncate accordingly.\n const isRTL = /[\\u0590-\\u05FF\\u0600-\\u06FF\\u0750-\\u077F\\u08A0-\\u08FF\\uFB50-\\uFDFF\\uFE70-\\uFEFF]/.test(str);\n return isRTL ? '…' + str.slice(0, maxLength - 1) : str.slice(0, maxLength - 1) + '…';\n}\n","import React from 'react';\n\n// Many product-prototype views fetch their data with `useState(null)` + a `useEffect` that calls an\n// im-api.js getter. Every one of those unmounts when the user switches to a different sidepanel/tab\n// and remounts from scratch on the way back -- React state doesn't survive that, so the screen goes\n// blank (or shows a \"加载中\" placeholder) again while the same request that already succeeded once\n// this session re-runs. Reported directly: switching between pages feels like it reloads every time.\n//\n// This hook keeps a module-level cache (survives unmount/remount, cleared only by a real page reload)\n// keyed by whatever string the caller passes in, so a remounted view can paint its last-known-good\n// data immediately while a fresh request updates it in the background -- the request still always\n// happens, this only removes the empty flash while waiting for it.\nconst cache = new Map();\n\n// `fetcher` is called on every mount/dep-change (this is not a TTL cache -- there's no staleness\n// window, it always revalidates), but the *first* render after mount can use the previous result\n// for this key instead of null. `key` should already encode whatever varies the result (e.g. include\n// a user id or a \"mine\"/\"team\" flag) -- this module doesn't know how to derive that itself.\nexport function useCachedData(key, fetcher, deps) {\n const [data, setData] = React.useState(() => (key ? cache.get(key) : undefined));\n const [loading, setLoading] = React.useState(() => !!key && !cache.has(key));\n\n React.useEffect(() => {\n if (!key) return;\n let live = true;\n let retried = false;\n // Don't flip back to a loading state just because deps changed while we already have a cached\n // value for the new key -- only the truly-never-fetched case should show a loading affordance.\n setLoading(!cache.has(key));\n const attempt = () => fetcher().then(result => {\n if (!live) return;\n cache.set(key, result);\n setData(result);\n setLoading(false);\n }).catch(() => {\n if (!live) return;\n // A transient failure on the very *first* fetch for this key -- nothing cached yet to fall\n // back on -- used to leave `data` stuck at undefined for the rest of the session, since\n // nothing else ever re-triggers this effect unless `key`/`deps` change. One retry after a\n // short delay covers the common case (a network blip during initial page load) without\n // retry-storming a persistently failing endpoint. A key that already has *some* cached value\n // keeps the original behavior (show the stale value, don't retry) -- that case is already\n // showing the user something, so it's lower urgency than the stuck-at-nothing case.\n if (!retried && !cache.has(key)) {\n retried = true;\n window.setTimeout(() => { if (live) attempt(); }, 3000);\n return;\n }\n // Keep whatever stale/cached value was already showing rather than clearing it on a transient\n // failure -- a blank screen on error is worse than a slightly-out-of-date one.\n setLoading(false);\n });\n attempt();\n return () => { live = false; };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key, ...(deps || [])]);\n\n return [data, loading];\n}\n\n// For the (rarer) case a view wants to seed its own useState from the cache directly -- e.g. when it\n// needs to merge the cached value with other local state instead of holding it as the sole source of\n// truth. Does not itself revalidate; pair it with writeCachedData once a fresh fetch resolves.\nexport function readCachedData(key) {\n return key ? cache.get(key) : undefined;\n}\n\nexport function writeCachedData(key, value) {\n if (key) cache.set(key, value);\n}\n\n// 搜索框防抖:返回一个滞后于 `value` 的值,只有停止输入 `delay` 毫秒后才更新。\n// 用途是把\"每敲一个字符发一次请求\"降成\"停下来才发一次\"。收藏搜索、会话内检索、群聊搜索\n// 原来都是把 query 直接放进 effect 依赖里,输入 6 个字的关键词就打 6 次接口,\n// 而且返回顺序没有保证——后发的短前缀请求可能后到,把正确结果覆盖掉。\nexport function useDebouncedValue(value, delay = 300) {\n const [debounced, setDebounced] = React.useState(value);\n React.useEffect(() => {\n if (value === debounced) return undefined;\n const timer = window.setTimeout(() => setDebounced(value), delay);\n return () => window.clearTimeout(timer);\n }, [value, delay, debounced]);\n return debounced;\n}\n","// Odds and ends\n\nimport { Tinode } from 'tinode-sdk';\nimport { WALLPAPER_DEFAULTS } from '../config.js';\n\n// The backend's REST group layer writes a group's display name into its native Tinode `public`\n// blob under a plain `name` key instead of the protocol-standard `fn` the SDK (and every other\n// Tinode client) expects -- confirmed live against a freshly created group: `topic.public` comes\n// back as `{name:'...', version:1}`, no `fn` at all. P2P/self topics are unaffected (their `public`\n// really does carry `fn`). Until the backend writes `fn` correctly, every place that shows a\n// topic's name has to fall back to `public.name` specifically for groups, or every group in the\n// app displays as \"未命名\"/\"未命名会话\" (unnamed) -- this happened in the chat header, the\n// conversation list, and the contact-list widget (used by member/forward pickers) before this.\nexport function topicDisplayName(topicName, publicData, fallback) {\n const fn = publicData && publicData.fn;\n if (fn) return fn;\n if (publicData && Tinode.isGroupTopicName(topicName) && publicData.name) return publicData.name;\n // 自聊天(slf)没有 public,原来会一路落到 fallback —— 消息首页因此把它显示成\"未命名会话\"。\n // 它的显示名靠 Tinode.isSelfTopicName 特判得出,不在 public 里。这里集中处理,所有调用点都受益;\n // 已经自己判过的地方(batch-forward-dialog 等)在调用前就短路了,不受影响。\n if (Tinode.isSelfTopicName(topicName)) return '已保存的消息';\n return fallback;\n}\n\n// Make shortcut icon appear with a green dot + show unread count in title.\nexport function updateFavicon(count) {\n const oldIcon = document.getElementById('shortcut-icon');\n const head = document.head || document.getElementsByTagName('head')[0];\n const newIcon = document.createElement('link');\n newIcon.type = 'image/png';\n newIcon.id = 'shortcut-icon';\n newIcon.rel = 'shortcut icon';\n newIcon.href = 'img/logo32x32' + (count > 0 ? 'a' : '') + '.png';\n if (oldIcon) {\n head.removeChild(oldIcon);\n }\n head.appendChild(newIcon);\n\n document.title = (count > 0 ? '('+count+') ' : '') + 'Tinode';\n}\n\n// Create theCard which represents user's or topic's \"public\" info.\nexport function theCard(fn, imageUrl, imageMimeType, note) {\n let card = null;\n fn = fn && fn.trim();\n note = note && note.trim();\n\n if (fn) {\n card = {\n fn: fn\n };\n }\n\n if (typeof note == 'string') {\n card = card || {};\n card.note = note ? note : Tinode.DEL_CHAR;\n }\n\n if (imageUrl) {\n card = card || {};\n let mimeType = imageMimeType;\n // Is this a data URL \"data:[][;base64],\"?\n const matches = /^data:(image\\/[-a-z0-9+.]+)?(;base64)?,/i.exec(imageUrl);\n if (matches) {\n mimeType = matches[1];\n card.photo = {\n data: imageUrl.substring(imageUrl.indexOf(',') + 1),\n ref: Tinode.DEL_CHAR\n };\n } else {\n card.photo = {\n data: Tinode.DEL_CHAR,\n ref: imageUrl\n };\n }\n card.photo.type = (mimeType || 'image/jpeg').substring('image/'.length);\n }\n\n return card;\n}\n\n// Deep-shallow compare two arrays: shallow compare each element.\nexport function arrayEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (!Array.isArray(a) || !Array.isArray(b)) {\n return false;\n }\n\n // Compare lengths first.\n if (a.length != b.length) {\n return false;\n }\n // Order of elements is ignored.\n a.sort();\n b.sort();\n for (let i = 0, l = a.length; i < l; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\n// Checks (loosely) if the given string is a phone. If so, returns the phone number in a format\n// as close to E.164 as possible.\nexport function asPhone(val) {\n val = val.trim();\n if (/^(?:\\+?(\\d{1,3}))?[- (.]*(\\d{3})[- ).]*(\\d{3})[- .]*(\\d{2})[- .]*(\\d{2})?$/.test(val)) {\n return val.replaceAll(/[- ().]*/g, '');\n }\n return null;\n}\n\n// Checks (loosely) if the given string is an email. If so returns the email.\nexport function asEmail(val) {\n val = val.trim();\n if (/^[a-z0-9_.+-]+@[a-z0-9-]+(\\.[a-z0-9-]+)+$/i.test(val)) {\n return val;\n }\n return null;\n}\n\n// Checks if URL is a relative url, i.e. has no 'scheme://', including the case of missing scheme '//'.\n// The scheme is expected to be RFC-compliant, e.g. [a-z][a-z0-9+.-]*\n// example.html - ok\n// https:example.com - not ok.\n// http:/example.com - not ok.\n// //example.com or \\\\example.com - not ok.\n// ' ↲ https://example.com' - not ok. (↲ means carriage return)\nexport function isUrlRelative(url) {\n // Replacing backslashes with forward slashes to mimic JS URL parser then testing for\n // 'scheme:' and '//' with optional space at the start.\n return url && !/^\\s*([a-z][a-z0-9+.-]*:|\\/\\/)/im.test(url.replace(/\\\\/g, '/'));\n}\n\n// Ensure URL does not present an XSS risk. Optional allowedSchemes may contain an array of\n// strings with permitted URL schemes, such as ['ftp', 'ftps']; otherwise accept http and https only.\nexport function sanitizeUrl(url, allowedSchemes) {\n if (typeof url != 'string') {\n return url;\n }\n\n // Strip control characters and whitespace. They are not valid URL characters anyway.\n url = url.replace(/[^\\x21-\\x7E]/gmi, '').trim();\n\n // Replace backslashes with forward slashes. They will be replaced in the URL parser anyway.\n url = url.replace(/\\\\/g, '/');\n\n // Relative URLs are safe.\n // Relative URL does not start with ':', abcd123: or '//'.\n if (!/^([a-z][a-z0-9+.-]*:|\\/\\/)/i.test(url)) {\n return url;\n }\n\n // Blob URLs are safe.\n if (/^blob:http/.test(url)) {\n return url;\n }\n\n // Absolute URL. Accept only safe schemes, or no scheme.\n const schemes = Array.isArray(allowedSchemes) ? allowedSchemes.join('|') : 'http|https';\n const re = new RegExp('^((' + schemes + '):|//)', 'i');\n if (!re.test(url)) {\n return null;\n }\n\n return url;\n}\n\n// Ensure URL is suitable as a source like field: the URL must be a relative URL or\n// have http:, https:, blob: or data: scheme.\n// In case of data: scheme, the URL must must be of the right MIME type such as 'data:{mimeMajor}/XXXX;base64,'.\nexport function sanitizeUrlForMime(url, mimeMajor) {\n if (!url) {\n return null;\n }\n\n const sanitizedUrl = sanitizeUrl(url);\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Is this a data: URL of the appropriate mime type?\n const re = new RegExp(`data:${mimeMajor}\\/[-+.a-z0-9]+;base64,`, 'i');\n if (re.test(url.trim())) {\n return url;\n }\n\n return null;\n}\n\n// Append query parameter 'asatt=1' to the URL.\n// It will cause Tinode server to add 'Content-Disposition: attachment' header when serving it.\n// The URL is a string. The URL here is always absolute.\nexport function urlAsAttachment(url) {\n // TODO: check if URL is local or remote, i.e. compare to window.location.origin.\n /*\n if (typeof window.location == 'object') {\n if (!url.startsWith(window.location.origin)) {\n return url;\n }\n }\n */\n // Check if the URL is a data or blob. Do not alter such URLs.\n if (url.startsWith('data:') || url.startsWith('blob:')) {\n return url;\n }\n\n // Split URL into host+path, query, fragment.\n let query = '', fragment = '';\n const idxF = url.indexOf('#');\n if (idxF > 0) {\n fragment = url.substring(idxF+1);\n url = url.substring(0, idxF);\n }\n const idxQ = url.indexOf('?');\n if (idxQ > 0) {\n query = url.substring(idxQ+1);\n url = url.substring(0, idxQ);\n }\n // Add parameter and reassemble.\n const params = new URLSearchParams(query);\n params.append('asatt', '1');\n return `${url}?${params.toString()}` + (fragment ? `#${fragment}` : '');\n}\n\n// Given message's received status, return name and color of a delivery indicator icon.\nexport function deliveryMarker(received) {\n switch (received) {\n case Tinode.MESSAGE_STATUS_SENDING:\n return { name: 'access_time' }; // watch face\n case Tinode.MESSAGE_STATUS_FAILED:\n case Tinode.MESSAGE_STATUS_FATAL:\n return { name: 'warning', color: 'red' }; // red icon /!\\\n case Tinode.MESSAGE_STATUS_SENT:\n return { name: 'done' }; // checkmark\n case Tinode.MESSAGE_STATUS_RECEIVED:\n return { name: 'done_all' }; // double checkmark\n case Tinode.MESSAGE_STATUS_READ:\n return { name: 'done_all', color: 'blue' }; // blue double checkmark\n }\n return null;\n}\n\n// Wraps a promise to make it cancelable.\n// The parameter can be either a promise or an error. If it's an error, the wrapped promise is\n// created in a rejected state.\nexport function cancelablePromise(promise) {\n let hasCanceled = false;\n\n const wrappedPromise = promise instanceof Error ?\n Promise.reject(promise) :\n new Promise((resolve, reject) => {\n promise.then(\n result => hasCanceled ? reject({isCanceled: true}) : resolve(result),\n error => hasCanceled ? reject({isCanceled: true}) : reject(error)\n );\n });\n\n return {\n promise: wrappedPromise,\n cancel() {\n hasCanceled = true;\n },\n };\n};\n\nexport function defaultWallpaper() {\n const wallpaperIndex = require('../../img/bkg/index.json');\n const wp = wallpaperIndex[WALLPAPER_DEFAULTS.type][WALLPAPER_DEFAULTS.index];\n return {name: `../${WALLPAPER_DEFAULTS.path}${wp.name}`, size: wp.size};\n}\n\nexport function wallpaperNameFromUrl(wallpaperUrl) {\n // Get filename from URL.\n const parts = wallpaperUrl.split('/');\n return parts[parts.length - 1];\n}\n\nexport function wallpaperTypeFromUrl(wallpaperUrl) {\n // Get filename from URL.\n const fname = wallpaperNameFromUrl(wallpaperUrl);\n const wallpaperIndex = require('../../img/bkg/index.json');\n for (const type in wallpaperIndex) {\n for (let i = 0; i < wallpaperIndex[type].length; i++) {\n if (wallpaperIndex[type][i].name == fname) {\n return type;\n }\n }\n }\n return null;\n}\n","// This is a generated file. Don't edit.\n\nexport const PACKAGE_VERSION = \"0.25.3\";\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class AccGeneralView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n colorSchema: props.colorSchema || 'auto',\n textSize: (props.textSize * 10) || '100',\n sendOnEnter: props.sendOnEnter || 'plain',\n };\n\n this.isMac = ((navigator.userAgentData && navigator.userAgentData.platform)\n || navigator.platform).toLowerCase().startsWith('mac');\n this.handleColorSchemaSelected = this.handleColorSchemaSelected.bind(this);\n this.handleTextSizeChanged = this.handleTextSizeChanged.bind(this);\n this.handleSendOnEnterSelected = this.handleSendOnEnterSelected.bind(this);\n }\n\n handleColorSchemaSelected(e) {\n this.setState({colorSchema: e.currentTarget.value});\n this.props.onChangeColorSchema(e.currentTarget.value);\n }\n\n handleTextSizeChanged(e) {\n // In %%.\n this.setState({textSize: e.currentTarget.value});\n // Convert %% to pt, 100% = 10pt.\n this.props.onTextSizeChanged((e.currentTarget.value / 10) | 0);\n }\n\n handleSendOnEnterSelected(e) {\n this.setState({sendOnEnter: e.currentTarget.value});\n this.props.onSendOnEnterChanged(e.currentTarget.value);\n }\n\n render() {\n return (\n \n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\n\nexport default class AccNotificationsView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCheckboxClick = this.handleCheckboxClick.bind(this);\n }\n\n handleCheckboxClick(what, checked) {\n if (what == 'sound') {\n this.props.onToggleMessageSounds(checked);\n } else if (what == 'alert') {\n this.props.onTogglePushNotifications(checked);\n }\n }\n\n render() {\n return (\n \n
\n \n \n \n \n
\n
\n \n {this.props.desktopAlertsEnabled ?\n \n :\n \n }\n \n \n
\n
\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { APP_NAME, LINK_CONTACT_US, LINK_PRIVACY_POLICY, LINK_TERMS_OF_SERVICE } from '../config.js';\n\nexport default class AccSupportView extends React.PureComponent {\n render() {\n return (\n \n
\n
\n
\n
\n \n {APP_NAME}\n
\n
\n \n {Tinode.getLibrary()}\n
\n
\n \n {this.props.serverVersion}\n
\n
\n \n {this.props.serverAddress}\n
\n
\n
\n );\n }\n};\n","import React from 'react';\n\nimport HashNavigation from '../lib/navigation.js';\nimport {\n resolveTenant, submitTenantApplication, submitTenantEntryFeedback, uploadPublicFile,\n requestVerificationCode, verifyRegisterCode, verifyPasswordResetCode, confirmPasswordReset,\n createSecurityChallenge, verifySecurityChallenge, getRealnameStatus, submitRealname, setIndependentPassword,\n getYouthMode, enableYouthMode\n} from '../lib/im-api.js';\n\nconst USERNAME_RE = /^[a-z0-9]{1,10}$/;\nconst PHONE_RE = /^\\d{11}$/;\nconst INVITE_RE = /^[A-Za-z]{5}$/;\nconst CREDIT_CODE_RE = /^[0-9A-Z]{18}$/;\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n// params is optional and additive only -- every existing call site that passes just `view` keeps\n// producing the exact same bare hash as the old `HashNavigation.navigateTo(view)` did.\nconst navigate = (view, params) => HashNavigation.navigateTo(HashNavigation.composeUrlHash([view], params || {}));\n\nfunction Icon({children, className = ''}) {\n return {children} ;\n}\n\nfunction AppMark({tenantName}) {\n return \n
J
\n
{tenantName || '即时通讯'} \n
;\n}\n\nfunction Header({title, back = 'tenant'}) {\n return \n { if (!HashNavigation.goBack()) navigate(back); }} aria-label=\"返回\">\n arrow_back_ios_new \n \n {title} \n \n ;\n}\n\nfunction Field({icon, onIconClick, action, error, className = '', ...props}) {\n return \n
\n {icon ? (onIconClick ?\n {icon} :\n {icon} ) : null}\n \n {action}\n
\n {error ?
{error}
: null}\n
;\n}\n\nfunction PasswordField(props) {\n const [visible, setVisible] = React.useState(false);\n return setVisible(!visible)}\n aria-label={visible ? '隐藏密码' : '显示密码'}>{visible ? 'visibility' : 'visibility_off'} } />;\n}\n\nfunction Agreement({checked, onChange, prefix = '同意捷信密使'}) {\n return \n onChange(e.target.checked)} />\n {prefix} e.preventDefault()}>《用户协议》 和 e.preventDefault()}>《隐私政策》 \n ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2800);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? check_circle {message}
: null;\n}\n\n// Shared alert for errors coming back from a real API/WS call (as opposed to local form validation,\n// which each form already reports inline per-field).\nfunction FormAlert({text}) {\n return text ? error_outline {text}
: null;\n}\n\nfunction TenantEntry({onTenantResolved}) {\n const [code, setCode] = React.useState(sessionStorage.getItem('im-tenant-code') || '');\n const [error, setError] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n\n const submit = async e => {\n e.preventDefault();\n const value = code.trim();\n if (!value || value.length > 64) {\n setError(value ? '企业码不能超过 64 个字符' : '请输入企业码');\n return;\n }\n setBusy(true);\n setError('');\n try {\n const data = await resolveTenant(value);\n // Kept for the mock UI's own display of the tenant name while on this screen; the durable\n // context (read by every subsequent /v1/im/* call and by the {hi} tenant field) is persisted\n // by onTenantResolved.\n sessionStorage.setItem('im-tenant-code', data.tenant.code || value);\n sessionStorage.setItem('im-tenant-name', data.tenant.name || data.tenant.code || value);\n onTenantResolved(data, value);\n navigate('login');\n } catch (err) {\n // Per the product spec, tenant-resolve failures are shown as one generic message\n // regardless of reason (not found vs. disabled vs. rate limited).\n setError('企业码不存在或已停用,请核实后重试');\n } finally {\n setBusy(false);\n }\n };\n\n return \n
navigate('enterprise-register')}>企业注册 \n
\n
navigate('enterprise-feedback')}>遇到问题? \n
;\n}\n\nfunction Login({tenantName, login, loginDisabled, persist, errorText, errorLevel, onLoginRequest, onPersistenceChange, onError}) {\n const [account, setAccount] = React.useState(login || '');\n const [password, setPassword] = React.useState('');\n const [agreed, setAgreed] = React.useState(false);\n\n // The prototype (docs/images/登录页面.png) has no \"stay logged in\" checkbox -- a consumer IM app\n // just keeps you signed in. Opt in silently instead of exposing the old debug-era toggle.\n React.useEffect(() => {\n if (!persist) {\n onPersistenceChange(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Real login failures (wrong password, disabled account, ...) clear the password and keep the account,\n // matching the product spec.\n React.useEffect(() => {\n if (errorLevel === 'err' && errorText) {\n setPassword('');\n }\n }, [errorText, errorLevel]);\n\n const submit = e => {\n e.preventDefault();\n if (!account.trim() || !password || !agreed || loginDisabled) return;\n onLoginRequest(account.trim(), password);\n };\n\n return \n
{ onError && onError(); navigate('tenant'); }}>arrow_back_ios_new 切换企业 \n
\n
\n
;\n}\n\nfunction EnterpriseRegister() {\n const [creditCode, setCreditCode] = React.useState('');\n const [email, setEmail] = React.useState('');\n const [file, setFile] = React.useState(null);\n const [errors, setErrors] = React.useState({});\n const [submitting, setSubmitting] = React.useState(false);\n const [submitted, setSubmitted] = React.useState(false);\n const [reviewDays, setReviewDays] = React.useState(1);\n const [toast, setToast] = React.useState('');\n\n React.useEffect(() => () => file && URL.revokeObjectURL(file.url), [file]);\n\n const chooseFile = e => {\n const selected = e.target.files[0];\n if (!selected) return;\n if (selected.size > 10 * 1024 * 1024 || !['image/jpeg', 'image/png', 'image/webp', 'application/pdf'].includes(selected.type)) {\n setErrors({...errors, file: '支持 JPG、PNG、WebP、PDF,文件不超过 10MB'});\n return;\n }\n if (file) URL.revokeObjectURL(file.url);\n setFile({name: selected.name, type: selected.type, url: URL.createObjectURL(selected), blob: selected});\n setErrors({...errors, file: ''});\n };\n\n const submit = async e => {\n e.preventDefault();\n const next = {};\n if (!CREDIT_CODE_RE.test(creditCode)) next.creditCode = '请输入 18 位统一社会信用代码';\n if (email && !EMAIL_RE.test(email)) next.email = '请输入有效的企业邮箱';\n setErrors(next);\n if (Object.keys(next).length) return;\n\n setSubmitting(true);\n try {\n let licenseFileId = '';\n if (file) {\n const uploaded = await uploadPublicFile(file.blob, 'enterprise_license');\n licenseFileId = uploaded.file_id;\n }\n const data = await submitTenantApplication({\n credit_code: creditCode,\n enterprise_email: email,\n license_file_id: licenseFileId,\n tenant_code_hint: sessionStorage.getItem('im-tenant-code') || ''\n });\n // Prototype (docs/images/企业注册-填写注册信息.png) states this in business days, not hours.\n setReviewDays(Math.max(1, Math.round((data.estimated_review_hours || 24) / 24)));\n setSubmitted(true);\n setToast('提交成功,我们会尽快联系你');\n } catch (err) {\n setErrors({...next, form: err.message || '提交失败,请稍后重试'});\n } finally {\n setSubmitting(false);\n }\n };\n\n return \n
\n
\n \n 1 填写企业信息 \n 2 确定信息 \n 3 提交审核 \n \n \n \n
setToast('')} />\n ;\n}\n\n// Per docs/images/企业注册-问题反馈.png: titled \"意见反馈\", 300-char textarea with the instructions\n// as its placeholder (not a separate label), \"图片(N/9)\" counter-style label, and no contact field.\nfunction EnterpriseFeedback() {\n const [description, setDescription] = React.useState('');\n const [files, setFiles] = React.useState([]);\n const [error, setError] = React.useState('');\n const [submitting, setSubmitting] = React.useState(false);\n const [toast, setToast] = React.useState('');\n\n const addFiles = e => {\n const selected = Array.from(e.target.files || []).slice(0, 9 - files.length);\n const valid = selected.filter(file => file.size <= 10 * 1024 * 1024 && ['image/jpeg', 'image/png', 'image/webp'].includes(file.type));\n setFiles(files.concat(valid.map(file => ({name: file.name, url: URL.createObjectURL(file), blob: file}))));\n };\n const submit = async e => {\n e.preventDefault();\n const length = description.trim().length;\n if (length < 10 || length > 300) {\n setError('问题描述需为 10 至 300 个字符');\n return;\n }\n setSubmitting(true);\n try {\n const screenshotFileIds = [];\n for (const item of files) {\n const uploaded = await uploadPublicFile(item.blob, 'tenant_entry_feedback');\n screenshotFileIds.push(uploaded.file_id);\n }\n await submitTenantEntryFeedback({\n description: description.trim(),\n tenant_code_hint: sessionStorage.getItem('im-tenant-code') || '',\n screenshot_file_ids: screenshotFileIds\n });\n setToast('已收到反馈,我们会尽快处理');\n files.forEach(item => URL.revokeObjectURL(item.url));\n setDescription(''); setFiles([]); setError('');\n } catch (err) {\n setError(err.message || '提交失败,请稍后重试');\n } finally {\n setSubmitting(false);\n }\n };\n\n return \n
\n
\n \n \n
setToast('')} />\n ;\n}\n\n// Requests a phone verification code (scene: 'register' | 'reset_password' | 'security') and reports the\n// resulting challenge_id upward -- the caller needs it to verify the code the user types in.\nfunction VerificationButton({phone, scene = 'register', onChallenge, onError}) {\n const [seconds, setSeconds] = React.useState(0);\n const [busy, setBusy] = React.useState(false);\n React.useEffect(() => {\n if (!seconds) return undefined;\n const timer = window.setTimeout(() => setSeconds(s => s - 1), 1000);\n return () => window.clearTimeout(timer);\n }, [seconds]);\n\n const click = async () => {\n if (busy || seconds > 0 || !PHONE_RE.test(phone)) return;\n setBusy(true);\n try {\n const data = await requestVerificationCode(scene, phone);\n onChallenge(data.challenge_id);\n setSeconds(data.resend_after_seconds || 60);\n } catch (err) {\n onError && onError(err.message || '获取验证码失败');\n if (err.details && err.details.retry_after_seconds) {\n setSeconds(err.details.retry_after_seconds);\n }\n if (err.details && err.details.challenge_id) {\n // Rate-limited but a still-valid challenge already exists for this phone/scene -- reuse it.\n onChallenge(err.details.challenge_id);\n }\n } finally {\n setBusy(false);\n }\n };\n\n return 0 || !PHONE_RE.test(phone)} onClick={click}>\n {seconds > 0 ? `${seconds}s` : busy ? '发送中…' : '获取验证码'}\n ;\n}\n\n// Per the actual prototype screenshots (docs/images/注册页面.png), all fields are shown together --\n// no phone-vs-username mode toggle. \"Phone takes precedence\" (per the spec text) is validation-only:\n// if a phone is filled it must be verified; the invite code is only required for a username-only\n// signup (matching the mock's original submit-time validation, now with real backend calls behind it).\nfunction Register({errorText, errorLevel, onImRegisterRequest}) {\n const [form, setForm] = React.useState({username: '', phone: '', code: '', password: '', invite: ''});\n const [challengeId, setChallengeId] = React.useState('');\n const [agreed, setAgreed] = React.useState(false);\n const [errors, setErrors] = React.useState({});\n const [submitting, setSubmitting] = React.useState(false);\n const change = key => e => setForm({...form, [key]: e.target.value});\n const usingPhone = !!form.phone;\n\n // onImRegisterRequest (tinode-web.jsx's handleImRegisterRequest -> a WS connect+createAccountBasic\n // chain) isn't awaited and doesn't return a promise -- on the username/invite-code path (no\n // verifyRegisterCode await ahead of it) `submit` returns and its `finally` clears `submitting`\n // within milliseconds, long before that WS round-trip finishes, leaving the button re-clickable\n // and able to fire a second concurrent registration. The parent's only failure signal is these\n // props changing, so hold `submitting` until either that happens or the phone-path's own catch\n // already handled it (success unmounts this component regardless).\n React.useEffect(() => {\n if (errorLevel === 'err' && errorText) setSubmitting(false);\n }, [errorText, errorLevel]);\n\n const submit = async e => {\n e.preventDefault();\n const next = {};\n if (!form.username && !form.phone) next.username = '用户名和手机号至少填写一项';\n if (form.username && !USERNAME_RE.test(form.username)) next.username = '用户名仅支持 1-10 位小写字母或数字';\n if (usingPhone) {\n if (!PHONE_RE.test(form.phone)) next.phone = '请输入 11 位手机号';\n if (!challengeId) next.code = '请先获取验证码';\n else if (!/^\\d{6}$/.test(form.code)) next.code = '请输入 6 位验证码';\n } else if (!INVITE_RE.test(form.invite)) {\n next.invite = '用户名注册需填写 5 位字母邀请码';\n }\n if (form.password.length < 8) next.password = '密码至少 8 位';\n setErrors(next);\n if (Object.keys(next).length) return;\n\n setSubmitting(true);\n try {\n if (usingPhone) {\n const verified = await verifyRegisterCode(challengeId, form.code);\n // The username field is optional even on the phone path -- filling in both used to silently\n // drop the typed username (always sent '' and always logged in as the phone), because the\n // server only auto-assigns a random handle when username is actually empty\n // (server/user.go resolveRegistrationAccount: username!=\"\" && phone!=\"\" => account=username,\n // secretAccount=username; only username==\"\" falls back to the phone-derived random handle).\n // Per the protocol spec, the phone number itself must never become the display name -- leave\n // it blank when no username was typed either (server assigns a random handle; the user can\n // set a nickname afterwards).\n const secretAccount = form.username || ('+86' + form.phone);\n onImRegisterRequest(secretAccount, form.password, form.username || '',\n // 邀请码不能在手机号路径上丢掉:后端 user.go:175-181 对邀请码的校验和 RecordUse 都不区分\n // 注册路径(`if inviteCode != \"\"` 就会校验并记录),而且 user.go:169 的\n // inviteRequired 在短信通道关闭时对手机号注册同样为真。UI 上明明摆着邀请码输入框,\n // 原来却硬传空串,用户填了也被静默丢弃,邀请来源统计全丢。\n {username: form.username || '', phone: form.phone, invite_code: form.invite || ''},\n {meth: 'tel', val: form.phone, resp: verified.verification_token, params: {challenge_id: challengeId}});\n } else {\n onImRegisterRequest(form.username, form.password, form.username,\n {username: form.username, phone: '', invite_code: form.invite}, null);\n }\n // On success the parent (tinode-web.jsx handleImRegisterRequest -> handleLoginSuccessful)\n // navigates away (unmounting this component, so `submitting` no longer matters); on failure\n // it surfaces errorText/errorLevel, which the effect above clears `submitting` on. No\n // `finally` here on purpose -- onImRegisterRequest isn't awaited (it's not a promise), so a\n // `finally` would clear `submitting` within milliseconds on the username/invite-code path,\n // long before that request's own WS round-trip resolves, defeating the double-submit guard.\n } catch (err) {\n setErrors({...next, code: err.message || '验证码错误或已过期'});\n setSubmitting(false);\n }\n };\n\n return \n
\n \n \n setForm({...form, username: e.target.value.replace(/[^a-z0-9]/g, '').slice(0, 10)})}\n placeholder=\"请输入用户名\" error={errors.username} autoComplete=\"username\" />\n setForm({...form, phone: e.target.value.replace(/\\D/g, '').slice(0, 11)})}\n placeholder=\"请输入手机号\" error={errors.phone} inputMode=\"numeric\" />\n setForm({...form, code: e.target.value.replace(/\\D/g, '').slice(0, 6)})}\n placeholder=\"请输入短信验证码\" inputMode=\"numeric\" error={errors.code}\n action={ setErrors(e => ({...e, code: msg}))} />} />\n \n setForm({...form, invite: e.target.value.replace(/[^A-Za-z]/g, '').slice(0, 5)})}\n placeholder=\"请输入邀请码(非必填)\" error={errors.invite} />\n \n {submitting ? '注册中…' : '注册'}\n \n 已有讯工捷迅账号? navigate('login')}>登录
\n \n
\n
;\n}\n\nfunction PasswordReset() {\n const [form, setForm] = React.useState({phone: '', code: '', password: '', confirm: ''});\n const [challengeId, setChallengeId] = React.useState('');\n const [error, setError] = React.useState('');\n const [submitting, setSubmitting] = React.useState(false);\n const [toast, setToast] = React.useState('');\n const change = key => e => setForm({...form, [key]: e.target.value});\n\n const submit = async e => {\n e.preventDefault();\n if (!PHONE_RE.test(form.phone)) return setError('请输入 11 位手机号');\n if (!challengeId || !/^\\d{6}$/.test(form.code)) return setError('请先获取并输入 6 位验证码');\n // Matches Register's rule (>= 8, no upper bound -- the backend's own checkPasswordPolicy only\n // enforces a minimum length). This page used to also reject anything over 20 characters, a limit\n // invented here with no backend counterpart: a password set during registration could exceed\n // it, then resetting it back to that same value through this flow would be rejected -- a\n // self-inflicted lockout for password reset's own sake.\n if (form.password.length < 8) return setError('密码至少 8 位');\n if (form.password !== form.confirm) return setError('两次输入的密码不一致');\n\n setSubmitting(true);\n setError('');\n try {\n const verified = await verifyPasswordResetCode(challengeId, form.code);\n await confirmPasswordReset(verified.reset_token, form.password);\n setToast('密码修改成功,请重新登录');\n window.setTimeout(() => navigate('login'), 1200);\n } catch (err) {\n setError(err.message || '验证码错误或已过期');\n setSubmitting(false);\n }\n };\n return ;\n}\n\n// Precedes 1.11 (setting the independent password): resolves the account's own verified phone\n// server-side (POST /v1/im/security/challenges never takes a phone number from the client) and, on\n// successful verify, stashes the resulting action_token for the next screen to spend.\nconst IDENTITY_CHECK_SCENE = 'set_independent_password';\n\nfunction IdentityCheck({authenticated, hashParams}) {\n // Carries through whichever youth-mode flow (enable/disable) sent the user here via \"忘记独立\n // 密码?\", if any -- IndependentPassword needs it to know whether to auto-continue into actually\n // enabling youth mode, since the server hands back an enable-flow token unconditionally on every\n // successful password (re)set regardless of why the caller got here. Absent (undefined) for the\n // unrelated generic \"身份验证\" entry in acc-security-view.jsx, which should never touch youth mode.\n const mode = hashParams && hashParams.ym;\n const [phoneMask, setPhoneMask] = React.useState('');\n const [challengeId, setChallengeId] = React.useState('');\n const [code, setCode] = React.useState('');\n const [seconds, setSeconds] = React.useState(0);\n const [busy, setBusy] = React.useState(false);\n const [error, setError] = React.useState('');\n\n React.useEffect(() => {\n if (!seconds) return undefined;\n const timer = window.setTimeout(() => setSeconds(s => s - 1), 1000);\n return () => window.clearTimeout(timer);\n }, [seconds]);\n\n const requestCode = React.useCallback(async () => {\n setBusy(true);\n setError('');\n try {\n const data = await createSecurityChallenge(IDENTITY_CHECK_SCENE);\n setChallengeId(data.challenge_id);\n setPhoneMask(data.phone_mask);\n setSeconds(data.resend_after_seconds || 60);\n } catch (err) {\n setError(err.reason === 'REALNAME_REQUIRED' ? '需要先完成实名认证并绑定手机号' : (err.message || '获取验证码失败'));\n // 限流(429)时服务端会连同还没过期的 challenge_id 和剩余冷却秒数一起返回\n // (im_http.go:6361-6367)。原来这里只把错误文案显示出来就完了,challengeId 一直是空串,\n // 于是 submit() 开头的 `if (!challengeId) return` 会静默吞掉点击——按钮看着能点,\n // 输完 6 位验证码点\"确定\"毫无反应,也没有任何提示。同文件的 VerificationButton\n // 早就处理对了,这里是漏抄。\n if (err.details && err.details.retry_after_seconds) {\n setSeconds(err.details.retry_after_seconds);\n }\n if (err.details && err.details.challenge_id) {\n setChallengeId(err.details.challenge_id);\n }\n if (err.details && err.details.phone_mask) {\n setPhoneMask(err.details.phone_mask);\n }\n } finally {\n setBusy(false);\n }\n }, []);\n\n React.useEffect(() => { requestCode(); }, [requestCode]);\n\n const submit = async e => {\n e.preventDefault();\n if (!challengeId || code.length !== 6 || busy) return;\n setBusy(true);\n try {\n const data = await verifySecurityChallenge(challengeId, code);\n sessionStorage.setItem('im-action-token:' + IDENTITY_CHECK_SCENE, JSON.stringify(data));\n navigate('independent-password', mode ? {ym: mode} : undefined);\n } catch (err) {\n setError(err.message || '验证码错误');\n } finally {\n setBusy(false);\n }\n };\n\n return ;\n}\n\nfunction Realname({authenticated = false}) {\n // Real status (unverified/pending/verified/rejected) drives the view -- the old mock's `verified`\n // prop toggle is gone, both 'realname' and 'realname-verified' routes render this and let the\n // GET /v1/im/security/realname response decide what to show.\n const [status, setStatus] = React.useState('loading');\n const [maskedName, setMaskedName] = React.useState('');\n const [maskedIdNumber, setMaskedIdNumber] = React.useState('');\n const [name, setName] = React.useState('');\n const [idNumber, setIdNumber] = React.useState('');\n const [error, setError] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n\n React.useEffect(() => {\n getRealnameStatus().then(data => {\n setStatus(data.status);\n setMaskedName(data.masked_name || '');\n setMaskedIdNumber(data.masked_id_number || '');\n }).catch(err => { setError(err.message || '加载实名状态失败'); setStatus('load_error'); });\n }, []);\n\n const editable = status === 'unverified' || status === 'rejected';\n\n const submit = async e => {\n e.preventDefault();\n if (name.trim().length < 2 || !/^\\d{17}[\\dXx]$/.test(idNumber)) {\n setError('请输入有效姓名和 18 位身份证号码'); return;\n }\n setBusy(true);\n try {\n // Backend's validIMRealName only accepts the literal 'cn_id' -- 'id_card' was rejected outright\n // with a 400 every time, so real-name submission never actually worked.\n const data = await submitRealname({name: name.trim(), id_type: 'cn_id', id_number: idNumber.toUpperCase()});\n setStatus(data.status || 'pending');\n setError('');\n } catch (err) {\n setError(err.message || '提交失败,请稍后重试');\n } finally {\n setBusy(false);\n }\n };\n\n if (status === 'loading' || status === 'load_error') {\n return \n
{status === 'load_error' ? (error || '加载失败,请重试') : '加载中…'}
\n
;\n }\n\n return \n
\n
实名认证 更加真实,更受欢迎
verified_user \n
\n {status === 'verified' ? '认证信息' : '请您使用有效身份证信息认证'} \n \n 姓名 setName(e.target.value)} readOnly={!editable} placeholder=\"请输入真实姓名\" /> \n 证件号码 setIdNumber(e.target.value)} readOnly={!editable} placeholder=\"请输入证件号码\" /> \n {error ? {error}
: null}\n \n {status === 'verified' ? '已实名' : status === 'pending' ? '审核中' : busy ? '提交中…' : '提交'}\n \n \n info 我们将获取您的姓名、证件号用于认证,信息会被严格保护
\n \n
;\n}\n\nfunction RealnameReminder() {\n return \n
消息 search 搜索
{['系统消息', '文件助手', '项目协作群', '陈经理'].map((item, i) =>
{item[0]} {item} {i ? '最近一条消息内容' : '安全通知与账号动态'}
)}
\n
\n
实名认证提醒 根据国家法律法规要求,您需先进行实名认证才能使用该项 APP
navigate('realname')}>去实名认证 \n
\n
;\n}\n\nfunction IndependentPassword({authenticated, hashParams}) {\n // Only the genuine \"haven't set a password yet, setting one now to enable youth mode for the\n // first time\" flow should auto-continue into enableYouthMode below -- see IdentityCheck's\n // comment on the same param for why this can't just be inferred from enable_action_token being\n // present.\n const mode = hashParams && hashParams.ym;\n const [pin, setPin] = React.useState('');\n const [error, setError] = React.useState('');\n const [toast, setToast] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n // Mirrors server/im_http.go validIMIndependentPassword: 4 digits, not all-same, not a run.\n const invalid = ['0000','1111','2222','3333','4444','5555','6666','7777','8888','9999','0123','1234','2345','3456','4567','5678','6789','9876','8765','7654','6543','5432','4321','3210'];\n const submit = async e => {\n e.preventDefault();\n if (invalid.includes(pin)) { setError('请勿使用连续或重复数字'); return; }\n const stored = sessionStorage.getItem('im-action-token:' + IDENTITY_CHECK_SCENE);\n const actionToken = stored && JSON.parse(stored).action_token;\n if (!actionToken) { setError('身份验证已过期,请返回重新验证'); return; }\n setBusy(true);\n try {\n const result = await setIndependentPassword(pin, 'youth_mode', actionToken);\n sessionStorage.removeItem('im-action-token:' + IDENTITY_CHECK_SCENE);\n setPin('');\n // 设密码只是\"首次开启青少年模式\"这条路的中间一步,不是终点。服务端在这一步就把下一步\n // 要用的凭证一起发回来了(enable_action_token + next_action:\"enable_youth_mode\",\n // 见 server/im_http.go:6178-6189)。原来这里把它整个丢掉、只弹一句\"设置成功\"就停在\n // PIN 页——用户走完短信验证+设密码,青少年模式其实还是关的,得自己摸回设置页再输一遍。\n // 现在拿着这个 token 把最后一步做完。\n // enable_action_token comes back unconditionally on every successful (re)set, regardless of\n // why the caller ended up here (server doesn't know or care) -- only the genuine \"first time\n // enabling\" flow should spend it. Otherwise this silently flipped youth mode on for someone\n // who was mid-way through disabling it, or who came from the unrelated generic \"身份验证\"\n // entry with no youth-mode intent at all.\n const enableToken = result && result.enable_action_token;\n if (enableToken && mode === 'enable') {\n try {\n const current = await getYouthMode();\n await enableYouthMode(current.policy_version, enableToken);\n setError(''); setToast('青少年模式已开启');\n window.setTimeout(() => navigate('youth-mode-on'), 600);\n return;\n } catch (enableErr) {\n // 密码确实设成功了,只是自动开启这一步没成,如实说明并把人送回青少年模式页手动开\n setError('独立密码已设置,但自动开启未成功:' + (enableErr.message || '请返回重试'));\n window.setTimeout(() => navigate('youth-mode-off'), 1200);\n return;\n }\n }\n if (mode === 'disable') {\n // enableToken (if any) can't be spent here -- ConsumeActionToken requires an exact\n // action='close_youth_mode' match, and this one is always tagged 'enable_youth_mode'. The\n // user does know the fresh PIN now though, so send them straight back to actually finish\n // disabling instead of leaving them stuck on this screen with nothing left to do.\n setError(''); setToast('独立密码已重置,请使用新密码关闭青少年模式');\n window.setTimeout(() => navigate('youth-mode-verify', {ym: 'disable'}), 800);\n return;\n }\n setError(''); setToast('独立密码设置成功');\n } catch (err) {\n setError(err.message || '设置失败,请返回重新验证身份');\n } finally {\n setBusy(false);\n }\n };\n return \n
\n
\n 设置独立密码 \n {[0,1,2,3].map(i => {pin[i] ? '●' : ''} )}
\n setPin(e.target.value.replace(/\\D/g, '').slice(0, 4))} inputMode=\"numeric\" autoComplete=\"off\" aria-label=\"四位独立密码\" autoFocus />\n {error ? {error}
: null}\n {busy ? '提交中…' : '确定'} \n \n
setToast('')} />\n ;\n}\n\nexport default function AuthOnboardingView({\n view, hashParams, onTenantResolved, authenticated = false,\n login, loginDisabled, persist, errorText, errorLevel,\n onLoginRequest, onPersistenceChange, onImRegisterRequest, onError\n}) {\n const tenantName = sessionStorage.getItem('im-tenant-name') || '';\n switch (view) {\n case 'tenant': return {})} />;\n case 'login': return ;\n case 'enterprise-register': return ;\n case 'enterprise-feedback': return ;\n case 'register': return ;\n case 'reset': return ;\n case 'identity-check': return ;\n case 'realname': return ;\n case 'realname-verified': return ;\n case 'realname-reminder': return ;\n case 'independent-password': return ;\n default: return {})} />;\n }\n}\n","import React from 'react';\n\nimport HashNavigation from '../lib/navigation.js';\n\nconst navigate = view => HashNavigation.navigateTo(view);\n\nexport const CALL_EXPERIENCE_VIEWS = [\n 'call-history', 'call-incoming', 'audio-call-ringing', 'audio-call-active',\n 'audio-call-muted', 'audio-call-speaker', 'video-call-ringing',\n 'video-call-camera-off', 'video-call-active', 'video-call-peer-camera-off',\n 'call-minimized'\n];\n\nconst PEER = {name: '安妮', avatar: 'img/bkg/p09.jpg'};\n\nconst CALL_RECORDS = [\n {id: 1, type: 'video', direction: 'outgoing', state: 'cancelled', label: '已取消', time: '今天 10:24'},\n {id: 2, type: 'audio', direction: 'incoming', state: 'declined', label: '已拒绝', time: '昨天 21:03'},\n {id: 3, type: 'video', direction: 'incoming', state: 'missed', label: '未接听', time: '昨天 18:42'},\n {id: 4, type: 'audio', direction: 'outgoing', state: 'busy', label: '对方忙线', time: '星期一 15:10'},\n {id: 5, type: 'audio', direction: 'outgoing', state: 'finished', label: '通话时长 12:36', time: '8月20日'}\n];\n\nfunction Icon({children}) { return {children} ; }\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 1800);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\nfunction CallAvatar({small = false}) {\n return ;\n}\n\nfunction CallHeader({onMinimize, light = false}) {\n return \n keyboard_arrow_down \n 端到端加密通话 \n more_vert \n ;\n}\n\nfunction Control({icon, label, active, danger, onClick}) {\n return {icon} {label} ;\n}\n\nfunction CallHistory() {\n return \n
navigate('chat-standard')} aria-label=\"返回会话\">arrow_back_ios_new 安妮 navigate('friend-profile')} aria-label=\"个人资料\">person_outline \n
最近通话
{CALL_RECORDS.map(item => navigate(item.type === 'audio' ? 'audio-call-ringing' : 'video-call-ringing')}>{item.type === 'audio' ? 'call' : 'videocam'} {item.type === 'audio' ? '语音通话' : '视频通话'} {item.label} {item.time} {item.direction === 'incoming' ? 'call_received' : 'call_made'} )}\n
navigate('audio-call-ringing')}>call 语音通话 navigate('video-call-ringing')}>videocam 视频通话 \n
;\n}\n\nfunction IncomingCall({onToast}) {\n return \n
\n
navigate('call-minimized')} />\n {PEER.name} 邀请你进行视频通话
\n {onToast('已拒绝视频通话'); window.setTimeout(() => navigate('call-history'), 600);}} /> navigate('video-call-active')} /> \n ;\n}\n\nfunction formatDuration(seconds) {\n const mins = Math.floor(seconds / 60).toString().padStart(2, '0');\n return `${mins}:${(seconds % 60).toString().padStart(2, '0')}`;\n}\n\nfunction AudioCall({view, onToast}) {\n const ringing = view === 'audio-call-ringing';\n const [seconds, setSeconds] = React.useState(ringing ? 0 : 68);\n const [mic, setMic] = React.useState(view !== 'audio-call-muted');\n const [speaker, setSpeaker] = React.useState(view === 'audio-call-speaker');\n React.useEffect(() => {\n if (ringing) return undefined;\n const timer = window.setInterval(() => setSeconds(value => value + 1), 1000);\n return () => window.clearInterval(timer);\n }, [ringing]);\n const hangup = () => {onToast(ringing ? '已取消呼叫' : `通话结束 ${formatDuration(seconds)}`); window.setTimeout(() => navigate('call-history'), 650);};\n return \n
\n
navigate('call-minimized')} />\n {PEER.name} {ringing ? '正在等待对方接听…' : formatDuration(seconds)}
{!ringing ? 网络良好 : } \n {ringing ? : {setMic(!mic); onToast(mic ? '麦克风已关闭' : '麦克风已开启');}} /> {setSpeaker(!speaker); onToast(speaker ? '已切换到听筒' : '扬声器已开启');}} /> }\n ;\n}\n\nfunction VideoBackdrop({cameraOff, peerOff}) {\n if (peerOff) return 对方摄像头已关闭 语音通话仍在继续
;\n if (cameraOff) return 摄像头已关闭
;\n return ;\n}\n\nfunction VideoCall({view, onToast}) {\n const ringing = view === 'video-call-ringing' || view === 'video-call-camera-off';\n const [camera, setCamera] = React.useState(view !== 'video-call-camera-off');\n const [mic, setMic] = React.useState(true);\n const [seconds, setSeconds] = React.useState(ringing ? 0 : 128);\n const peerOff = view === 'video-call-peer-camera-off';\n React.useEffect(() => {\n if (ringing) return undefined;\n const timer = window.setInterval(() => setSeconds(value => value + 1), 1000);\n return () => window.clearInterval(timer);\n }, [ringing]);\n const hangup = () => {onToast(ringing ? '已取消视频呼叫' : `视频通话结束 ${formatDuration(seconds)}`); window.setTimeout(() => navigate('call-history'), 650);};\n return \n
\n
\n
navigate('call-minimized')} />\n {PEER.name} {ringing ? '正在等待对方接听…' : formatDuration(seconds)}
\n {!ringing ? {!camera ? videocam_off : null} : null}\n onToast('已切换摄像头')} /> {setCamera(!camera); onToast(camera ? '摄像头已关闭' : '摄像头已开启');}} /> {!ringing ? setMic(!mic)} /> : null} \n ;\n}\n\nfunction MinimizedCall({onToast}) {\n const [position, setPosition] = React.useState(() => ({x: Math.max(16, window.innerWidth - 134), y: 168}));\n const drag = React.useRef(null);\n const onPointerDown = event => {drag.current = {x: event.clientX - position.x, y: event.clientY - position.y}; event.currentTarget.setPointerCapture(event.pointerId);};\n const onPointerMove = event => {if (!drag.current) return; setPosition({x: Math.max(8, Math.min(window.innerWidth - 132, event.clientX - drag.current.x)), y: Math.max(70, Math.min(window.innerHeight - 190, event.clientY - drag.current.y))});};\n return navigate('messages-home')}>arrow_back_ios_new 安妮 在线
more_vert 今天 10:24
下午的评审材料我已经发到群里了。
{drag.current = null;}} onClick={() => navigate('video-call-active')} aria-label=\"返回全屏通话\"> 02:18 {onToast('通话已结束'); window.setTimeout(() => navigate('call-history'), 600);}} aria-label=\"挂断通话\">call_end ;\n}\n\nexport default function CallExperienceView({view}) {\n const [toast, setToast] = React.useState('');\n let content;\n if (view === 'call-history') content = ;\n else if (view === 'call-incoming') content = ;\n else if (view.startsWith('audio-call')) content = ;\n else if (view === 'call-minimized') content = ;\n else content = ;\n return <>{content} setToast('')} />>;\n}\n","import React from 'react';\nimport QRCode from 'qrcodejs';\nimport { pinyin } from 'pinyin-pro';\n\nimport HashNavigation from '../lib/navigation.js';\nimport {\n getFriends, getFriendRequests, createFriendRequest, acceptFriendRequest, rejectFriendRequest,\n deleteFriend, updateFriendRemark, searchUsers, getUserProfile, createMyQRCode, getBlocks,\n blockUser, unblockUser, getFileUrl, getBootstrap, getConversationContext, getConversationSettings,\n updateConversationSettings, createUserQRCode, fetchAllPages\n} from '../lib/im-api.js';\nimport { readCachedData, writeCachedData, useCachedData } from '../lib/use-cached-data.js';\n\n// Carries an optional `uid` (and anything else already in the hash) across chapter-5 navigation --\n// e.g. address-book -> friend-profile -> friend-settings all need to know which person this is.\nconst navigate = (view, uid) => {\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, view);\n hash = uid ? HashNavigation.addUrlParam(hash, 'uid', uid) : HashNavigation.removeUrlParam(hash, 'uid');\n HashNavigation.navigateTo(hash);\n};\n\nexport const CONTACT_MANAGEMENT_VIEWS = [\n 'address-book', 'friend-requests', 'add-friend', 'my-friend-qr', 'friend-qr', 'friend-search-result',\n 'friend-verification', 'friend-profile', 'group-member-profile', 'friend-settings',\n 'friend-settings-blocked', 'friend-delete-confirm', 'block-list', 'block-confirm',\n 'clear-chat-confirm'\n];\n\n// Server's own `initial` (bootstrap.go displayInitial) is just the first Unicode code point of the\n// display name -- for Chinese names that's a hanzi, not a Latin letter, so it can't drive the A/B/C\n// section headers docs/images/通讯录.png actually shows. Group client-side by first-pinyin-letter.\nfunction alphaInitial(name) {\n const ch = (name || '').trim()[0] || '#';\n if (/[A-Za-z]/.test(ch)) {\n return ch.toUpperCase();\n }\n if (/[一-龥]/.test(ch)) {\n const letter = pinyin(ch, {pattern: 'first', toneType: 'none'});\n return /[a-z]/i.test(letter) ? letter.toUpperCase() : '#';\n }\n return '#';\n}\n\nfunction Icon({children}) { return {children} ; }\n\nfunction Header({title, back = 'messages-home', backUid, right, onRight}) {\n return { if (!HashNavigation.goBack()) navigate(back, backUid); }} aria-label=\"返回\">arrow_back_ios_new {title} {right ? {right} : } ;\n}\n\n// `person.avatar_file_id` (real API field) is loaded lazily via a cached authenticated fetch --\n// file serving is auth-gated, there's no public URL a plain could point at directly.\nfunction Avatar({person, icon}) {\n const fileId = person && person.avatar_file_id;\n const [url, setUrl] = React.useState(null);\n React.useEffect(() => {\n if (!fileId) { setUrl(null); return undefined; }\n let live = true;\n getFileUrl(fileId).then(u => { if (live) setUrl(u); }).catch(() => {});\n return () => { live = false; };\n }, [fileId]);\n return {url ? : {icon || 'person'} } ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2000);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\nfunction Search({value, onChange, placeholder, onSubmit}) {\n return search onChange(event.target.value)}\n onKeyDown={event => { if (event.key === 'Enter' && onSubmit) onSubmit(); }} placeholder={placeholder} /> ;\n}\n\n// `payload` is the real `qr_payload` string from POST /me/qrcodes (already shaped like\n// `im://qr?token=...&purpose=add_friend` -- same scheme the demo literal used, no format change).\nfunction QrCard({payload, profile, loading}) {\n const ref = React.useRef(null);\n React.useEffect(() => {\n if (!ref.current || !payload) return;\n ref.current.innerHTML = '';\n new QRCode(ref.current, {text: payload, width: 190, height: 190, correctLevel: QRCode.CorrectLevel.M});\n }, [payload]);\n return \n {(profile && profile.display_name) || ''} \n {profile && profile.public_account ? '账号 ' + profile.public_account : ''} \n
\n {loading ? 正在生成二维码…
: 扫一扫上面的二维码,加我为好友
}\n 二维码 24 小时内有效 \n ;\n}\n\nfunction AddressBook({myUserId, onTopicSelected}) {\n const [query, setQuery] = React.useState('');\n // Seeded from cache so re-opening the address book (very much a back-and-forth flow: check\n // contacts, open a chat, come back) doesn't drop straight back to \"加载中…\" for a friend list that\n // hasn't actually changed.\n // Keyed by myUserId (same convention as the 'bootstrap:'+myUserId cache just below) -- a bare\n // 'friends' key meant logging out and into a *different* account in the same tab would briefly\n // paint the previous account's cached friend list on mount, before the fresh getFriends() call\n // overwrote it moments later.\n const friendsCacheKey = myUserId ? 'friends:' + myUserId : null;\n const [friends, setFriends] = React.useState(() => (friendsCacheKey && readCachedData(friendsCacheKey)) || []);\n const [pendingCount, setPendingCount] = React.useState(0);\n const [loading, setLoading] = React.useState(() => !(friendsCacheKey && readCachedData(friendsCacheKey)));\n // Same bootstrap the message center already fetches (and caches under the same key) -- only need\n // it here for the file assistant's real topic, so a plain read of the shared cache is enough.\n const [bootstrap] = useCachedData(myUserId ? 'bootstrap:' + myUserId : null, getBootstrap, [myUserId]);\n const fileAssistantTopic = bootstrap && bootstrap.entries && bootstrap.entries.file_assistant\n && bootstrap.entries.file_assistant.topic;\n React.useEffect(() => {\n // getFriends() defaults to a 50-item page -- a plain single call silently truncated address\n // books past that size, with no \"load more\" affordance to recover the rest.\n fetchAllPages(cursor => getFriends('', cursor)).then(list => {\n if (friendsCacheKey) { writeCachedData(friendsCacheKey, list); }\n setFriends(list);\n }).catch(() => {}).finally(() => setLoading(false));\n fetchAllPages(cursor => getFriendRequests('inbound', 'pending', cursor))\n .then(list => setPendingCount(list.length)).catch(() => {});\n }, []);\n const visible = friends.filter(item => `${item.display_name}${item.remark || ''}`.includes(query));\n const groups = visible.reduce((result, item) => {\n const key = alphaInitial(item.remark || item.display_name);\n return {...result, [key]: (result[key] || []).concat(item)};\n }, {});\n const sortedKeys = Object.keys(groups).sort();\n const entries = [\n {icon: 'person_add_alt', label: '新朋友', route: 'friend-requests', badge: pendingCount || null, tone: 'blue'},\n {icon: 'group', label: '群组', route: 'group-list', tone: 'green'},\n {icon: 'folder_special', label: '文件助手', route: 'chat-standard', tone: 'orange', fileAssistant: true},\n {icon: 'notifications', label: '系统消息', route: 'system-messages', tone: 'red'}\n ];\n const scrollTo = key => {\n const el = document.getElementById('people-group-' + key);\n if (el) el.scrollIntoView({behavior: 'smooth', block: 'start'});\n };\n // The file assistant is a real topic (from bootstrap), not a route -- same bug/fix pattern as the\n // \"常联系的人\" shortcuts in message-center-view.jsx. Falls back to the old demo route only if\n // bootstrap hasn't resolved a real topic yet, so the entry never becomes a dead click.\n const openEntry = item => {\n if (item.fileAssistant && fileAssistantTopic && onTopicSelected) onTopicSelected(fileAssistantTopic);\n else navigate(item.route);\n };\n return navigate('add-friend')} /> \n \n {entries.map(item => openEntry(item)}>{item.label} {item.badge ? {item.badge} : null}chevron_right )} \n 好友通讯录 \n {loading ? 加载中…
: sortedKeys.length === 0 ? 暂无好友
: null}\n {sortedKeys.map(initial => {initial} \n {groups[initial].map(person => { seedProfile(person); navigate('friend-profile', person.user_id); }}>\n {/* 副行只在确实是另一个名字时才显示。后端在有备注时会把 display_name 也设成备注\n (im_http.go:8500-8507,且合并守卫会挡住用 peer 真实昵称覆盖),两个字段同值,\n 原来那句 `person.remark ? {display_name} ` 会把同一串字渲染两遍。\n 后端目前没有单独的原昵称字段,所以拿不到\"备注(主)/昵称(副)\"的第二行,已记为后端缺口。 */}\n {person.remark || person.display_name} {person.remark && person.remark !== person.display_name ? {person.display_name} : null} \n )}\n )}\n \n {sortedKeys.map(value => { e.preventDefault(); scrollTo(value); }}>{value} )} \n ;\n}\n\nfunction requestStatusLabel(item) {\n if (item.status === 'pending') return item.direction === 'outbound' ? '已发送' : null;\n if (item.status === 'accepted') return '已添加';\n if (item.status === 'rejected') return '已拒绝';\n if (item.status === 'expired') return '已过期';\n return null;\n}\n\nfunction FriendRequests({onToast}) {\n const [items, setItems] = React.useState([]);\n const [loading, setLoading] = React.useState(true);\n React.useEffect(() => {\n fetchAllPages(cursor => getFriendRequests('all', 'all', cursor))\n .then(setItems).catch(() => {}).finally(() => setLoading(false));\n }, []);\n const handle = (item, accept) => {\n const nextStatus = accept ? 'accepted' : 'rejected';\n setItems(values => values.map(v => v.request_id === item.request_id ? {...v, status: nextStatus} : v));\n const call = accept ? acceptFriendRequest(item.request_id) : rejectFriendRequest(item.request_id);\n call.then(() => onToast(accept ? '已通过好友申请' : '已拒绝好友申请')).catch(err => {\n setItems(values => values.map(v => v.request_id === item.request_id ? {...v, status: item.status} : v));\n onToast(err.message || '操作失败');\n });\n };\n return \n {loading ? 加载中…
: items.length === 0 ? 暂无新朋友申请
: null}\n {items.map(item => \n \n {(item.peer && item.peer.display_name) || item.applicant_id} {item.message || '请求添加您为好友'}
{new Date(item.created_at).toLocaleString()} \n {item.status === 'pending' && item.direction === 'inbound' ?\n handle(item, false)}>拒绝 handle(item, true)}>通过验证 :\n {requestStatusLabel(item)} }\n )}\n ;\n}\n\n// 中国大陆手机号:11 位、1 开头。与本文件注册/验证流程用的判断保持一致。\nconst CN_MOBILE = /^1[3-9]\\d{9}$/;\n\nfunction classifySearchInput(text) {\n if (text.startsWith('+')) {\n // 已经是国际格式,原样按手机号查\n return {query: text.replace(/[\\s-]/g, ''), type: 'phone'};\n }\n const digits = text.replace(/[\\s-]/g, '');\n if (CN_MOBILE.test(digits)) {\n return {query: '+86' + digits, type: 'phone'};\n }\n return {query: text, type: 'exact_account'};\n}\n\n// 与 personal-settings-view.jsx 的 GENDER_OPTIONS 一一对应,两处写的是同一套后端枚举\nconst GENDER_LABELS = {male: '男', female: '女', other: '其他'};\n\n// `GET /users/{id}/profile` (getUserProfile) 403s for anyone who isn't already a friend, by design\n// (server's default `profile_visibility` is \"friends\"-only, server/im_http.go's imPrivacyAllowsProfile).\n// But the two places that hand you a *stranger* to look at -- an account search hit and a scanned\n// QR code -- already returned the exact same fields (display_name/avatar_file_id/gender/region/\n// public_account/signature, both go through userSearchItemPayload/copyOptionalProfileFields) *before*\n// that gate, unconditionally. Profile used to throw that object away and re-fetch via the gated\n// endpoint, which 403s and leaves the page stuck on \"加载中…\" forever with no way forward -- this\n// stashes what we already have so Profile can render immediately, and only uses getUserProfile as a\n// best-effort background refresh (for when the two really are/become friends, or the peer's privacy\n// setting is \"everyone\").\nfunction seedProfile(item) {\n if (!item || !item.user_id) return;\n writeCachedData('profile-seed:' + item.user_id, {\n ...item,\n capabilities: {can_add_friend: !!item.can_add}\n });\n}\n\nfunction AddFriend({result = false, onToast, onOpenScanner}) {\n const [query, setQuery] = React.useState('');\n const [searching, setSearching] = React.useState(false);\n const [searched, setSearched] = React.useState(result);\n const [results, setResults] = React.useState([]);\n const runSearch = q => {\n const text = q.trim();\n if (!text) { setSearched(false); setResults([]); return; }\n setSearching(true); setSearched(true);\n // 按输入形态选搜索类型。exact_account 只比对 profile.public_account / u.username / u.id\n // (tenant_adapter.go:9170-9172),**不匹配 u.phone** —— 参考图 5.5 里输的恰恰是手机号\n // 18826827724,一直写死 exact_account 的话这个场景必然搜不到。手机号要走 type=phone。\n // 另外 phone 分支服务端不做 E.164 归一化(只有模糊的 account 分支才调 normalizeUserPhone),\n // 而库里存的是 +86 开头的 E.164,所以裸 11 位号码由前端补上区号——注册流程也是这么拼的。\n const {query, type} = classifySearchInput(text);\n searchUsers(query, type).then(data => setResults(data.items || [])).catch(() => setResults([])).finally(() => setSearching(false));\n };\n // 原来复制到剪贴板这条分支不给任何反馈,点了界面上毫无动静(同页的 QrPage.share 是有 toast 的);\n // 生成二维码失败也被 .catch(() => {}) 静默吞掉,用户同样什么都看不到。\n const shareCard = () => {\n createMyQRCode().then(data => {\n const text = `加我为好友:${data.qr_payload}`;\n if (navigator.share) {\n return navigator.share({title: '添加好友', text}).catch(() => {});\n }\n if (navigator.clipboard) {\n return navigator.clipboard.writeText(text).then(() => onToast('邀请链接已复制'))\n .catch(() => onToast('复制失败,请手动分享二维码'));\n }\n onToast('当前浏览器不支持分享,请使用二维码');\n return undefined;\n }).catch(err => onToast(err.message || '生成邀请链接失败'));\n };\n // Real search results carry a relationship for blocked pairs too (blocked_by_me/blocked_by_peer),\n // which previously fell through to the same generic \"添加\" as an untouched stranger -- misleading\n // since tapping through leads to a profile page whose own cannotAddReason (see the Profile\n // component below) already refuses to let the request go anywhere. Matches that component's\n // wording, just condensed to fit this one-line list item.\n const actionLabel = item => item.relationship === 'friend' ? '已是好友' :\n item.relationship === 'pending_outbound' ? '已申请' : item.relationship === 'pending_inbound' ? '待通过' :\n item.relationship === 'blocked_by_me' ? '已拉黑' : item.relationship === 'blocked_by_peer' ? '无法添加' : '添加';\n return \n
{ setQuery(v); if (!v.trim()) { setSearched(false); setResults([]); } }} placeholder=\"查找账号\" onSubmit={() => runSearch(query)} />\n \n {searched ? 查找人 \n {searching ? 搜索中…
: results.length === 0 ? 未找到相关用户
:\n results.map(item => { seedProfile(item); item.relationship === 'friend' ? navigate('friend-profile', item.user_id) : navigate('group-member-profile', item.user_id); }}>\n {item.display_name} \n {actionLabel(item)} \n )}\n : \n navigate('my-friend-qr')}>qr_code 我的二维码 让朋友扫一扫添加我 chevron_right \n onOpenScanner ? onOpenScanner() : onToast('暂不支持扫码,请使用账号搜索添加好友')}>qr_code_scanner 扫一扫 扫描好友或群二维码 chevron_right \n share 分享给好友 分享链接给好友,一起来玩吧 chevron_right \n }\n \n ;\n}\n\nfunction QrPage({onToast}) {\n const [payload, setPayload] = React.useState(null);\n const [profile, setProfile] = React.useState(null);\n React.useEffect(() => {\n createMyQRCode().then(data => { setPayload(data.qr_payload); setProfile(data.display_profile); }).catch(() => onToast('二维码生成失败'));\n }, []);\n const share = () => {\n if (navigator.share && payload) {\n navigator.share({title: '添加好友', text: payload}).then(() => onToast('二维码名片已分享')).catch(() => {});\n } else if (navigator.clipboard && payload) {\n navigator.clipboard.writeText(payload);\n onToast('链接已复制');\n }\n };\n const save = () => {\n const canvas = document.querySelector('.people-qrcode canvas');\n if (!canvas) { onToast('二维码尚未生成'); return; }\n const a = document.createElement('a');\n a.href = canvas.toDataURL('image/png');\n a.download = '我的二维码.png';\n a.click();\n onToast('二维码已保存到相册');\n };\n return \n share 分享好友 download 保存到相册
\n ;\n}\n\nfunction FriendQr({uid, onToast}) {\n const [payload, setPayload] = React.useState(null);\n const [profile, setProfile] = React.useState(null);\n React.useEffect(() => {\n if (!uid) return;\n createUserQRCode(uid).then(data => { setPayload(data.qr_payload); setProfile(data.display_profile); }).catch(() => onToast('二维码生成失败'));\n }, [uid]);\n const save = () => {\n const canvas = document.querySelector('.people-qrcode canvas');\n if (!canvas) { onToast('二维码尚未生成'); return; }\n const a = document.createElement('a');\n a.href = canvas.toDataURL('image/png');\n a.download = '好友二维码.png';\n a.click();\n onToast('二维码已保存到相册');\n };\n return ;\n}\n\nfunction Verification({uid, onToast}) {\n // Same seed-then-best-effort-refresh as Profile -- reached right after it (via its \"添加好友\"\n // button), so the cache this reads is the one Profile itself just kept warm.\n const [profile, setProfile] = React.useState(() => (uid ? readCachedData('profile-seed:' + uid) : null));\n const [message, setMessage] = React.useState('');\n const [sending, setSending] = React.useState(false);\n const [sent, setSent] = React.useState(false);\n React.useEffect(() => {\n if (!uid) return;\n getUserProfile(uid).then(data => { writeCachedData('profile-seed:' + uid, data); setProfile(data); }).catch(() => {});\n }, [uid]);\n const alreadyPending = profile && (profile.relationship === 'pending_outbound' || profile.relationship === 'pending_inbound');\n const alreadyFriend = profile && profile.relationship === 'friend';\n const send = () => {\n setSending(true);\n createFriendRequest(uid, message.trim(), 'search').then(() => {\n onToast('好友申请已发送'); setSent(true);\n // Patch the seed Profile will re-read on remount -- its own background getUserProfile refresh\n // can't do this for us, since a stranger-turned-pending peer still fails that gated endpoint\n // the exact same way a stranger does (server only exempts an established \"friend\").\n writeCachedData('profile-seed:' + uid, {...(readCachedData('profile-seed:' + uid) || {}), relationship: 'pending_outbound'});\n window.setTimeout(() => navigate('group-member-profile', uid), 800);\n }).catch(err => onToast(err.message || '发送失败')).finally(() => setSending(false));\n };\n return \n {(profile && profile.display_name) || ''} \n {alreadyFriend ? 你们已经是好友了
:\n alreadyPending || sent ? 好友申请正在等待验证
:\n 验证留言 setMessage(event.target.value)} />{message.length}/50 }\n {alreadyFriend || alreadyPending || sent ? null : \n navigate('group-member-profile', uid)}>取消 \n {sending ? '发送中…' : '发送'} \n
}\n ;\n}\n\nfunction Profile({uid, friend, onTopicSelected, onToast}) {\n const [profile, setProfile] = React.useState(() => (uid ? readCachedData('profile-seed:' + uid) : null));\n // A failed fetch with no seed to fall back on previously left this stuck on \"加载中…\" forever --\n // tracked separately from `profile` itself (which legitimately stays null while genuinely still\n // loading) so the render below can tell the two apart, same fix as DownloadPage's `loadError`.\n const [loadError, setLoadError] = React.useState(false);\n React.useEffect(() => {\n if (!uid) return;\n getUserProfile(uid).then(data => {\n writeCachedData('profile-seed:' + uid, data);\n setProfile(data);\n }).catch(() => {\n // Expected for anyone who isn't a friend yet (server-side privacy default) -- if a search/QR\n // seed already got us a usable preview, keep showing that instead of erroring the page out.\n // Only a total stranger with no seed data at all (e.g. a stale/direct deep link) has nothing to\n // show, and that's the one case worth telling the user about.\n setProfile(current => {\n if (!current) { onToast('资料加载失败'); setLoadError(true); }\n return current;\n });\n });\n // getUserProfile 403s outright for someone you've blocked (server-side privacy check) --\n // whatever relationship was cached from before the block (typically \"friend\") then just stays\n // stuck, which used to make this page keep showing \"发消息/音视频通话\" for someone actually\n // blocked, entirely missing the blocked_by_me/blocked_by_peer branches cannotAddReason already\n // handles below. getConversationContext resolves for a P2P conversation regardless of block\n // status and correctly reports the real relationship, so it's used here purely to refresh that\n // one field on top of whatever getUserProfile/the seed cache already provided for the rest.\n getConversationContext(uid).then(ctx => {\n if (ctx && ctx.relationship) {\n setProfile(current => current ? {...current, relationship: ctx.relationship} : current);\n }\n }).catch(() => {});\n }, [uid]);\n // group-management-view.jsx 的 navigateToProfile 在跳转之后异步用 getGroupMemberProfile 把\n // capabilities/relationship 补进种子缓存(那两个字段 getUserProfile 对非好友会 403 拿不到,\n // 群场景权限更宽松能拿到)。这个组件已经挂载了,不会自己重新读缓存,靠这个事件通知它有更新。\n React.useEffect(() => {\n if (!uid) return undefined;\n const onSeedUpdated = e => {\n if (e.detail && e.detail.uid === uid) {\n const updated = readCachedData('profile-seed:' + uid);\n if (updated) setProfile(updated);\n }\n };\n window.addEventListener('profile-seed-updated', onSeedUpdated);\n return () => window.removeEventListener('profile-seed-updated', onSeedUpdated);\n }, [uid]);\n if (!profile) return {loadError ? '资料加载失败,请重试' : '加载中…'}
;\n const canAdd = profile.capabilities && profile.capabilities.can_add_friend;\n const isFriend = profile.relationship === 'friend';\n // canAdd===false covers several real, distinct relationships (found live: searching a friend who\n // had blocked me showed this exact page claiming a request was \"pending verification\" when nothing\n // had been sent and nothing ever could be -- they'd blocked me). Only pending_outbound actually\n // matches that wording; the others need their own accurate text instead of reusing it as a catch-all.\n const cannotAddReason = profile.relationship === 'blocked_by_peer' ? '对方已将你拉黑,无法添加为好友' :\n profile.relationship === 'blocked_by_me' ? '你已拉黑对方,需先取消拉黑才能添加为好友' :\n profile.relationship === 'pending_inbound' ? '对方已向你发送好友申请,请前往\"新朋友\"处理' :\n '好友申请正在等待验证';\n // Real native Tinode p2p topic name (from my side) is just the peer's own user_id (\"usrXXXX\") --\n // NOT `profile.topic` (a separate \"p2pXXXX\" identifier the custom REST layer uses internally,\n // which Tinode.topicType() doesn't recognize, so selecting it left the message pane blank).\n const openChat = () => onTopicSelected(uid);\n return ;\n}\n\nfunction Toggle({checked, onChange, disabled}) { return onChange(!checked)}> ; }\n\nfunction Settings({uid, initialBlocked, pinBlocked, onToast}) {\n // Same seed-from-what-we-already-know as Profile/Verification -- getUserProfile can 403 even for a\n // real, current friend (see seedProfile's own comment), which used to leave this page's header\n // blank instead of just stuck like Profile, but no less wrong.\n const [profile, setProfile] = React.useState(() => (uid ? readCachedData('profile-seed:' + uid) : null));\n const [blocked, setBlocked] = React.useState(initialBlocked);\n // 置顶/免打扰原来是纯本地 useState,onChange 只是切一下布尔值,从不调用任何接口——\n // GET/PATCH /conversations/{topic}/settings 早就封装好了(getConversationSettings/\n // updateConversationSettings),只是零调用点。实测接口返回真实的 {pinned, mute_notifications,\n // version},PATCH 需要带 version 做乐观锁。打开设置页永远显示\"关\",点了也只是那次会话内\n // 生效、离开页面就丢,和会话列表真正读取的置顶/免打扰状态是两套毫不相关的东西。\n const [settingsVersion, setSettingsVersion] = React.useState(null);\n const [pinned, setPinned] = React.useState(false);\n const [muted, setMuted] = React.useState(false);\n const [editingRemark, setEditingRemark] = React.useState(false);\n const [remark, setRemark] = React.useState('');\n const [remarkDraft, setRemarkDraft] = React.useState('');\n React.useEffect(() => {\n if (!uid) return;\n getConversationSettings(uid).then(s => {\n setPinned(!!s.pinned); setMuted(!!s.mute_notifications); setSettingsVersion(s.version);\n }).catch(() => {});\n // pinBlocked:确认弹窗把这个页面当背景渲染,并用 initialBlocked 摆出\"操作之后\"的样子。\n // 这时不能让这次拉取回来的真实关系(还是 friend)把它改回去——原来会导致弹窗一弹出来,\n // 背后的拉黑开关自己跳回\"未拉黑\",同时\"删除好友\"红条又冒出来,跟参考图不符也跟弹窗\n // 正在确认的这件事自相矛盾。\n getUserProfile(uid).then(p => { writeCachedData('profile-seed:' + uid, p); setProfile(p); if (!pinBlocked) setBlocked(p.relationship === 'blocked_by_me'); }).catch(() => {\n // Same 403-on-blocked-contact gap as Profile above -- this used to leave `blocked` stuck at\n // whatever initialBlocked was (usually false, e.g. arriving fresh from the address book)\n // whenever the block didn't just happen in this same page session, showing an off \"拉黑\"\n // toggle and the \"删除好友\" button for someone actually already blocked.\n if (!pinBlocked) {\n getConversationContext(uid).then(ctx => {\n if (ctx && ctx.relationship) { setBlocked(ctx.relationship === 'blocked_by_me'); }\n }).catch(() => {});\n }\n });\n // GET /users/{id}/profile never exposes the real remark (backend's userProfilePayload always\n // calls userSummaryPayload(user, \"\") -- confirmed against im_be/server/im_http.go:7844 --\n // folding an empty remark into display_name instead of returning a separate field), only the\n // friends list endpoint's friendListItemPayload does. Look this friend up there instead.\n fetchAllPages(cursor => getFriends('', cursor)).then(list => {\n const entry = list.find(item => item.user_id === uid);\n if (entry) setRemark(entry.remark || '');\n }).catch(() => {});\n }, [uid]);\n const saveRemark = () => {\n const value = remarkDraft.trim();\n updateFriendRemark(uid, value).then(() => {\n setRemark(value);\n setEditingRemark(false); onToast('备注已更新');\n }).catch(err => onToast(err.message || '备注更新失败'));\n };\n return \n {(profile && profile.display_name) || ''} \n HashNavigation.navigateTo(\n HashNavigation.addUrlParam(HashNavigation.setUrlSidePanel(window.location.hash, 'history-search'), 'topic', uid))}>\n 查看聊天记录 chevron_right \n \n 消息传输方式 已启动加密传输
\n 置顶聊天 {\n // settingsVersion starts null until getConversationSettings' GET resolves (below); a toggle\n // clicked inside that window sent version:null over the wire, which the server 400s on as\n // MALFORMED_REQUEST -- disabling the switch during that (usually brief, but real on a slow\n // connection) gap avoids that avoidable round trip and its \"设置失败\" toast entirely.\n const prev = pinned; setPinned(value);\n updateConversationSettings(uid, {pinned: value, version: settingsVersion}).then(s => setSettingsVersion(s.version))\n .catch(err => { setPinned(prev); onToast(err.message || '设置失败'); });\n }} />
\n 消息免打扰 {\n const prev = muted; setMuted(value);\n updateConversationSettings(uid, {mute_notifications: value, version: settingsVersion}).then(s => setSettingsVersion(s.version))\n .catch(err => { setMuted(prev); onToast(err.message || '设置失败'); });\n }} />
\n navigate('clear-chat-confirm', uid)}>清空聊天记录 chevron_right \n {editingRemark ?\n setRemarkDraft(e.target.value)} autoFocus />保存
:\n { setRemarkDraft(remark); setEditingRemark(true); }}>备注 {remark ? {remark} : null}chevron_right }\n {blocked ? '取消拉黑' : '拉黑'} {\n if (value) { navigate('block-confirm', uid); return; }\n unblockUser(uid).then(() => { setBlocked(false); onToast('已移出黑名单'); }).catch(err => onToast(err.message || '操作失败'));\n }} />
\n {\n // The local navigate(view, uid) helper only carries a single `uid` param -- the report\n // flow (security-support-view.jsx's ReportReasons/ReportDetails) needs target_type/\n // target_id/target_name, so build the hash directly here rather than through it.\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, 'abuse-report-reasons');\n hash = HashNavigation.addUrlParam(hash, 'target_type', 'user');\n hash = HashNavigation.addUrlParam(hash, 'target_id', uid);\n hash = HashNavigation.addUrlParam(hash, 'target_name', (profile && profile.display_name) || uid);\n HashNavigation.navigateTo(hash);\n }}>投诉与举报 chevron_right \n \n {blocked ? null : navigate('friend-delete-confirm', uid)}>删除好友 }\n ;\n}\n\nfunction BlockList({onToast}) {\n const [people, setPeople] = React.useState([]);\n const [loading, setLoading] = React.useState(true);\n React.useEffect(() => {\n fetchAllPages(cursor => getBlocks(cursor)).then(setPeople).catch(() => {}).finally(() => setLoading(false));\n }, []);\n const remove = userId => {\n unblockUser(userId).then(() => { setPeople(items => items.filter(item => item.user_id !== userId)); onToast('已移出黑名单'); })\n .catch(err => onToast(err.message || '操作失败'));\n };\n // The only entry point into this view is personal-settings-view.jsx's \"设置\" list\n // ('android-settings'), not friend-settings -- this page has no friend uid in scope at all.\n return \n {loading ? 加载中…
: people.length ?\n people.map(item => {(item.user && item.user.display_name) || item.user_id} 已阻止消息和通话 remove(item.user_id)}>移出 ) :\n person_off 黑名单为空
}\n ;\n}\n\nfunction ConfirmSheet({type, uid, tinode, onToast}) {\n const [busy, setBusy] = React.useState(false);\n const config = {\n delete: {title: '删除好友', text: '删除后将解除好友关系,对方将无法继续向你发送消息。聊天记录仍会保留。', action: '确认删除', route: 'address-book', toast: '好友已删除', keepUid: false},\n block: {title: '黑名单', text: '拉黑后将不会收到对方的消息,可在\"设置\"—\"黑名单\"查看人员名单', action: '确定', route: 'friend-settings-blocked', toast: '已加入黑名单', keepUid: true},\n clear: {title: '清除聊天记录', text: '清空后不可找回,确定要清空当前会话的历史记录吗?', action: '确定', route: 'friend-settings', toast: '聊天记录已清除', keepUid: true}\n }[type];\n const confirm = () => {\n setBusy(true);\n let call;\n if (type === 'delete') call = deleteFriend(uid);\n else if (type === 'block') call = blockUser(uid);\n else {\n // No dedicated \"clear my view of history\" REST endpoint exists yet -- this is the same native\n // Tinode soft-delete-all-for-me the real message-actions menu already uses (context-menu.jsx).\n // Native p2p topic name (from my side) is just the peer's own user_id -- NOT the relationship\n // context's `topic` field, which is a separate \"p2pXXXX\" id the REST layer uses internally and\n // Tinode.topicType() doesn't recognize (see Profile.openChat for the full story).\n const topic = tinode ? tinode.getTopic(uid) : null;\n call = topic ? topic.delMessagesAll(false) : Promise.resolve();\n }\n call.then(() => { onToast(config.toast); navigate(config.route, config.keepUid ? uid : undefined); })\n .catch(err => onToast(err.message || '操作失败')).finally(() => setBusy(false));\n };\n return \n
{config.title} {config.text}
\n {config.action} \n navigate('friend-settings', uid)}>取消 \n \n
;\n}\n\nexport default function ContactManagementView({view, hashParams, myUserId, tinode, onTopicSelected, onOpenScanner}) {\n const [toast, setToast] = React.useState('');\n const uid = hashParams && hashParams.uid;\n let content;\n if (view === 'address-book') content = ;\n else if (view === 'friend-requests') content = ;\n else if (view === 'add-friend' || view === 'friend-search-result') content = ;\n else if (view === 'my-friend-qr') content = ;\n else if (view === 'friend-qr') content = ;\n else if (view === 'friend-verification') content = ;\n else if (view === 'friend-profile' || view === 'group-member-profile') content = ;\n else if (view === 'friend-settings' || view === 'friend-settings-blocked') content = ;\n else if (view === 'block-list') content = ;\n else if (view === 'friend-delete-confirm') content = ;\n else if (view === 'block-confirm') content = ;\n else content = ;\n return <>{content} setToast('')} />>;\n}\n","/* ContactsView holds all contacts-related stuff */\nimport React from 'react';\nimport { FormattedMessage, defineMessages } from 'react-intl';\n\nimport ContactList from '../widgets/contact-list.jsx';\n\nimport { updateFavicon } from '../lib/utils.js';\n\nconst messages = defineMessages({\n archived_contacts_title: {\n id: \"archived_contacts\",\n defaultMessage: \"Archived contacts ({count})\",\n description: \"Label for archived chats\"\n }\n});\n\nexport default class ContactsView extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleAction = this.handleAction.bind(this);\n\n this.state = ContactsView.deriveStateFromProps(props);\n }\n\n static deriveStateFromProps(props) {\n const contacts = [];\n let unreadThreads = 0;\n let archivedCount = 0;\n\n const me = props.tinode.getMeTopic();\n props.chatList.forEach(c => {\n const blocked = c.acs && !c.acs.isJoiner();\n c.pinned = me.pinnedTopicRank(c.topic);\n\n // Show only blocked contacts only when props.blocked == true.\n if (blocked && props.blocked) {\n contacts.push(c);\n }\n if (blocked || props.blocked) {\n return;\n }\n\n if (c.private && c.private.arch) {\n if (props.archive) {\n contacts.push(c);\n } else {\n archivedCount ++;\n }\n } else if (!props.archive) {\n contacts.push(c);\n unreadThreads += c.unread > 0 ? 1 : 0;\n }\n });\n\n contacts.sort((a, b) => {\n const pin = b.pinned - a.pinned;\n return pin != 0 ? pin : (b.touched || 0) - (a.touched || 0);\n });\n\n if (archivedCount > 0) {\n contacts.push({\n action: 'archive',\n title: messages.archived_contacts_title,\n values: {count: archivedCount}\n });\n }\n\n return {\n contactList: contacts,\n unreadThreads: unreadThreads\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chatList != this.props.chatList ||\n prevProps.archive != this.props.archive ||\n prevProps.blocked != this.props.blocked) {\n const newState = ContactsView.deriveStateFromProps(this.props);\n this.setState(newState);\n if (newState.unreadThreads != prevState.unreadThreads) {\n updateFavicon(newState.unreadThreads);\n }\n }\n }\n\n handleAction(action_ignored) {\n this.props.onShowArchive();\n }\n\n render() {\n return (\n {\n (no_contacts) => \n } \n );\n }\n};\n","import React from 'react';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport AudioPlayer from '../widgets/audio-player.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { bytesToHumanSize, secondsToTime, shortDateFormat } from '../lib/strformat.js';\nimport {\n getFavorites, getFavorite, batchDeleteFavorites, forwardFavorites, createFileDownloader,\n searchTopicMessages, getMessageContext, getTopicMedia, checkURL, getFileUrl, resolveFileUrl, getGroup, getUserProfile\n} from '../lib/im-api.js';\nimport { readCachedData, writeCachedData, useDebouncedValue } from '../lib/use-cached-data.js';\nimport { topicDisplayName } from '../lib/utils.js';\n\n// favoritePayload's source.topic is the raw conversation topic id (grpXXX/usrXXX) -- resolve it to a\n// display name the same way every other list in this app does, cached since many favorites usually\n// share a handful of source conversations.\nconst sourceNameCache = new Map();\nfunction resolveSourceName(topic, onDone) {\n if (!topic) return;\n if (sourceNameCache.has(topic)) { onDone(sourceNameCache.get(topic)); return; }\n if (Tinode.isSelfTopicName(topic)) { sourceNameCache.set(topic, '已保存的消息'); onDone('已保存的消息'); return; }\n const call = topic.startsWith('grp') ? getGroup(topic).then(g => g.name) : getUserProfile(topic).then(p => p.display_name);\n call.then(name => { sourceNameCache.set(topic, name); onDone(name); }).catch(() => {});\n}\n\n// Generic multi-param navigate -- content-library-view.jsx's original helper was a bare\n// `HashNavigation.navigateTo(view)`, replacing the whole hash and dropping any existing params on\n// every internal tab/link click; nothing in this file could carry a topic/favoriteId through its own\n// navigation even if a caller threaded one in from outside.\nconst navigate = (view, params) => {\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, view);\n Object.entries(params || {}).forEach(([key, value]) => {\n hash = value ? HashNavigation.addUrlParam(hash, key, value) : HashNavigation.removeUrlParam(hash, key);\n });\n HashNavigation.navigateTo(hash);\n};\n\nexport const CONTENT_LIBRARY_VIEWS = [\n 'favorites', 'favorites-mixed', 'favorites-files', 'favorites-text', 'favorites-voice',\n 'favorites-links', 'favorites-image', 'favorites-video', 'favorites-select', 'favorite-share', 'file-download',\n 'file-downloading', 'file-downloaded', 'history-search', 'history-files',\n 'history-links', 'history-images', 'history-videos'\n];\n\nfunction Icon({children}) { return {children} ; }\nfunction Header({title, back = 'messages-home', backParams, right, onRight}) {\n return \n { if (!HashNavigation.goBack()) navigate(back, backParams); }} aria-label=\"返回\">arrow_back_ios_new \n {title} \n {right ? {right} : }\n ;\n}\nfunction Avatar({item}) { return {item && item.image ? : {(item && item.icon) || 'person'} } ; }\nfunction Toast({message, onDone}) { React.useEffect(() => { if (!message) return undefined; const timer = window.setTimeout(onDone, 2000); return () => window.clearTimeout(timer); }, [message, onDone]); return message ? {message}
: null; }\nfunction Search({value, onChange, placeholder = '搜索'}) { return search onChange(event.target.value)} placeholder={placeholder} /> ; }\n\n// -- Drafty extraction helpers: a favorite's snapshot.content (and a history item's flattened content\n// fields) are literally the original message's own content, not a Ch.7-specific shape -- reuse the same\n// Drafty API chat-message.jsx/context-menu.jsx already use for live messages instead of re-deriving it.\nfunction draftyContentOf(content) {\n return Drafty.isValid(content) ? content : null;\n}\n// 必须用 Drafty.entities 而不是 Drafty.attachments:后者在 SDK 里硬过滤 `ent.tp == 'EX'`\n// (tinode.dev.js:2538),只认「文件附件」这一种实体。而本应用发图片/视频/语音走的分别是\n// insertImage(IM)/insertVideo(VD)/appendAudio(AU),在 attachments 下一个都取不到——收藏的图片视频\n// 缩略图、语音收藏的播放源、聊天记录的图片视频宫格因此全部拿不到资源。entities 的回调第三参给出\n// tp,可以按类型分派,chat-message.jsx:139 用的就是这个。\nconst MEDIA_ENTITY_TYPES = ['IM', 'VD', 'AU', 'EX'];\nfunction firstAttachment(content) {\n const drafty = draftyContentOf(content);\n if (!drafty) return null;\n let found = null;\n Drafty.entities(drafty, (data, _index, tp) => {\n if (!found && data && MEDIA_ENTITY_TYPES.includes(tp)) {\n found = data;\n return true; // 命中第一个就停,entities 的回调返回 true 表示中断遍历\n }\n return false;\n });\n return found;\n}\n// Drafty.getDownloadUrl returns either an already-usable blob: URL (small inband attachment, .val) or\n// the raw .ref relative path (out-of-band, needs an authenticated fetch) -- getFileUrl() takes a bare\n// file_id and builds that path itself, so pull just the id back out of .ref rather than double it up.\nfunction resolveAttachmentUrl(att) {\n if (!att) return Promise.resolve(null);\n const direct = Drafty.getDownloadUrl(att);\n if (!direct) return Promise.resolve(null);\n if (direct.startsWith('blob:') || direct.startsWith('data:')) return Promise.resolve(direct);\n return getFileUrl(direct.slice(direct.lastIndexOf('/') + 1)).catch(() => null);\n}\n// searchTopicMessages/getTopicMedia results spread the original Drafty content's own fields directly\n// onto each item (mediaMessagePayload/messageSearchPayload flatten `content`, they don't nest it) --\n// reconstruct the Drafty shape from whatever ent/fmt/txt survived so the same attachment-extraction\n// path works here as everywhere else, rather than guessing at flat field names that may not exist.\nfunction attachmentFromFlat(item) {\n if (item && (item.ent || item.fmt || item.txt !== undefined)) {\n return firstAttachment({txt: item.txt, fmt: item.fmt, ent: item.ent});\n }\n return null;\n}\nfunction plainTextOf(content, fallbackText) {\n if (typeof content === 'string') return content;\n const drafty = draftyContentOf(content);\n if (drafty) return Drafty.toPlainText(drafty);\n return fallbackText || '';\n}\n// file_type -> {icon, color} matching Ch.6's group-file convention (a colored square + letter/icon).\nconst FILE_TYPE_META = {image: ['image', '#3ba55c'], video: ['videocam', '#3b82c4'], audio: ['audiotrack', '#8b5cf6'], document: ['description', '#e05d44'], file: ['insert_drive_file', '#8a8f98']};\nfunction extFromName(name) {\n const m = /\\.([a-zA-Z0-9]+)$/.exec(name || '');\n return m ? m[1].toUpperCase() : '';\n}\n\nfunction FileCard({name, size, mime, sender, removed, onOpen}) {\n const ext = extFromName(name);\n return \n {ext || (mime || '').split('/')[0].toUpperCase() || '?'} \n {name || '未命名文件'} {typeof size === 'number' ? bytesToHumanSize(size) : (size || '未知大小')}{sender ? ` · ${sender}` : ''}
\n {removed ? 文件已失效 : chevron_right }\n ;\n}\n\n// Real playback via the same widgets/audio-player.jsx used for live voice messages, rather than the\n// mock's plain state-toggle with no actual element -- resolves its own blob URL like Avatar\n// does, so callers don't need their own per-item URL-map bookkeeping just for voice favorites.\n// `removed` (source message deleted/recalled, im_http.go's messageAvailability) skips resolving a\n// blob URL for a file that's gone -- without this, a removed voice favorite just sat on\n// `hourglass_empty` forever (resolveAttachmentUrl's fetch fails silently), indistinguishable from\n// \"still loading\". Same FileCard-style treatment (an label, no playback) as the file case.\nfunction VoiceCard({att, head, removed}) {\n const [src, setSrc] = React.useState(null);\n React.useEffect(() => { if (!removed) resolveAttachmentUrl(att).then(setSrc); }, [att, removed]);\n const duration = (att && att.duration) || (head && head.duration) || 0;\n if (removed) {\n return block 语音已失效
;\n }\n return \n {src ?
:
hourglass_empty }\n
;\n}\n\n// No OG-metadata extraction exists anywhere in the backend (favoriteSnapshot/mediaMessagePayload just\n// copy the raw message content -- no title/thumbnail/summary field is ever populated), matching what\n// every one of the reference screenshots for both 我的收藏-链接 and 查找聊天记录-链接 actually show: a\n// plain URL string, not a card. Rendering a rich card here would be inventing data that doesn't exist.\nfunction LinkText({url, onOpen, removed}) {\n if (removed) {\n return link_off 链接已失效
;\n }\n return onOpen && onOpen(url)}>link {url} ;\n}\n\nfunction MediaThumb({url, video, duration, onOpen, removed}) {\n if (removed) {\n return {video ? 'videocam_off' : 'broken_image'} {video ? '视频已失效' : '图片已失效'}
;\n }\n return \n {url ? : {video ? 'videocam' : 'image'} }\n {video ? <>play_circle {duration ? {secondsToTime(duration)} : null}> : null}\n ;\n}\n\nfunction FavoriteItem({item, onOpen, selecting, selected, onSelect}) {\n const att = firstAttachment(item.snapshot && item.snapshot.content);\n const source = item.source_display || (item.source && item.source.topic) || '';\n return \n {selecting ? {selected ? 'check' : ''} : null}\n \n {item.type === 'text' ?
{plainTextOf(item.snapshot && item.snapshot.content, item.snapshot && item.snapshot.text)}
: null}\n {/* 需求 7.3「失效文件需展示明确状态而非直接报错」原来只有 file 类型传了 removed(FileCard),\n voice/link/image/video 三类完全没处理——即便后端把\"问题13\"(availability 恒为 available)\n 修好,这三类在 UI 上也不会有任何变化,因为组件本身就不认识这个状态,只会静默显示一个和\n \"还在加载中\"没法区分的占位。四个类型现在统一都传。后端 messageAvailability(im_http.go)\n 在源消息被删/被撤回时给 'removed'。 */}\n {item.type === 'file' ?
: null}\n {item.type === 'voice' ?
: null}\n {item.type === 'link' ?
: null}\n {item.type === 'image' || item.type === 'video' ?
: null}\n
来自 {source} {shortDateFormat(new Date(item.collected_at))} \n
\n ;\n}\n\nconst TYPE_ROUTE = {all: 'favorites-mixed', file: 'favorites-files', text: 'favorites-text', voice: 'favorites-voice', link: 'favorites-links', image: 'favorites-image', video: 'favorites-video'};\nconst TYPE_LABELS = [['all', '全部'], ['image', '图片'], ['video', '视频'], ['file', '文件'], ['voice', '语音'], ['text', '文本'], ['link', '链接']];\n\nfunction Favorites({view, tinode, onToast}) {\n const initialType = view === 'favorites-files' ? 'file' : view === 'favorites-text' ? 'text' : view === 'favorites-voice' ? 'voice' : view === 'favorites-links' ? 'link' : view === 'favorites-image' ? 'image' : view === 'favorites-video' ? 'video' : 'all';\n const selecting = view === 'favorites-select';\n const [type, setType] = React.useState(selecting ? 'file' : initialType);\n // 输入值与实际发请求用的值分开:原来 query 直接进 load 的依赖数组,输入 6 个字的关键词就打\n // 6 次接口,而且返回顺序没有保证——后发的短前缀请求可能后到、把正确结果覆盖掉。\n const [queryInput, setQueryInput] = React.useState('');\n const query = useDebouncedValue(queryInput, 300);\n const [selected, setSelected] = React.useState([]);\n // Seeded per-type -- one Favorites instance backs every favorites* tab/route (confirmed multiple\n // entry points: personal-settings' \"我的收藏\" row, direct-message-view.jsx's attachment-panel\n // \"favorite\" action), so an unparameterized key would flash a stale, wrong-type list under a\n // freshly-switched tab. `query` is deliberately excluded -- it always resets to '' on a tab switch,\n // so caching a search result under the same key would show it under a plain (non-search) revisit.\n const [items, setItems] = React.useState(() => readCachedData('favorites:' + type) || null);\n const [cursor, setCursor] = React.useState('');\n const [hasMore, setHasMore] = React.useState(false);\n const [fileUrls, setFileUrls] = React.useState({});\n const [sourceNames, setSourceNames] = React.useState({});\n const load = React.useCallback((append) => {\n getFavorites({type, query, cursor: append ? cursor : ''}).then(data => {\n setItems(prev => {\n const list = append ? (prev || []).concat(data.items || []) : (data.items || []);\n if (!query) writeCachedData('favorites:' + type, list);\n return list;\n });\n setCursor(data.next_cursor || '');\n setHasMore(!!data.next_cursor);\n }).catch(err => onToast(err.message || '加载失败'));\n }, [type, query, cursor]);\n React.useEffect(() => {\n setItems((!query && readCachedData('favorites:' + type)) || null);\n load(false);\n }, [type, query]);\n // Image/video favorites need an authenticated blob URL, same as any other file_id-backed thumbnail.\n React.useEffect(() => {\n (items || []).forEach(item => {\n if ((item.type !== 'image' && item.type !== 'video') || fileUrls[item.favorite_id]) return;\n const att = firstAttachment(item.snapshot && item.snapshot.content);\n resolveAttachmentUrl(att).then(url => { if (url) setFileUrls(v => ({...v, [item.favorite_id]: url})); });\n });\n }, [items]);\n React.useEffect(() => {\n (items || []).forEach(item => {\n const topic = item.source && item.source.topic;\n if (!topic || sourceNames[topic]) return;\n resolveSourceName(topic, name => name && setSourceNames(v => ({...v, [topic]: name})));\n });\n }, [items]);\n const toggle = id => setSelected(values => values.includes(id) ? values.filter(v => v !== id) : values.concat(id));\n const deleteSelected = () => {\n if (!window.confirm(`确定删除已选择的 ${selected.length} 项收藏吗?`)) return;\n batchDeleteFavorites(selected).then(result => {\n const okIds = new Set(((result && result.items) || []).filter(r => r.ok).map(r => r.favorite_id));\n setItems(values => {\n const next = values.filter(item => !okIds.has(item.favorite_id));\n if (!query) writeCachedData('favorites:' + type, next);\n return next;\n });\n setSelected(values => values.filter(id => !okIds.has(id)));\n onToast(okIds.size === selected.length ? '已删除所选收藏' : `已删除 ${okIds.size}/${selected.length} 项,部分删除失败`);\n }).catch(err => onToast(err.message || '删除失败'));\n };\n const openItem = item => {\n if (item.type === 'file') { navigate('file-download', {favoriteId: item.favorite_id, fromType: type}); return; }\n if (item.type === 'link') {\n const url = (item.snapshot && item.snapshot.content && item.snapshot.content.url) || plainTextOf(item.snapshot && item.snapshot.content, item.snapshot && item.snapshot.text);\n checkURL(url, 'favorite').then(res => {\n if (res.decision === 'allow') window.open(url, '_blank', 'noopener,noreferrer');\n else onToast(res.decision === 'block' ? '该链接存在风险,已被拦截' : '该链接可能存在风险,请谨慎访问');\n }).catch(() => onToast('链接安全校验失败'));\n return;\n }\n if (item.type === 'image' || item.type === 'video') {\n // item._thumbUrl is the real resolveAttachmentUrl() result (see the effect above) -- this\n // backend has no separate scaled-down thumbnail concept, so the same URL used to render the\n // grid cell is already the full attachment, safe to open directly.\n if (item._thumbUrl) window.open(item._thumbUrl, '_blank', 'noopener,noreferrer');\n else onToast('正在加载,请稍后重试');\n return;\n }\n onToast('暂不支持预览此类收藏');\n };\n const list = items || [];\n return \n
navigate(selecting ? 'favorites-files' : 'favorites-select')} />\n \n {TYPE_LABELS.map(([id, label]) => { setType(id); if (TYPE_ROUTE[id] && !selecting) navigate(TYPE_ROUTE[id]); }}>{label} )} \n \n {items === null ? 加载中…
:\n list.length ? <>{list.map(item => toggle(item.favorite_id)}\n onOpen={() => openItem(item)} />)}\n {hasMore ? load(true)}>加载更多 : null}> :\n bookmark_border 暂无此类收藏
}\n \n {selecting ? \n navigate('favorite-share', {ids: selected.join(',')})}>share 转发 \n delete_outline 删除 \n : null}\n ;\n}\n\n// Reuses the exact same real-contact-list source as Ch.4's batch-forward-dialog.jsx (the app's own\n// already-subscribed chatList, filtered locally) rather than the pre-built but never-actually-wired\n// getForwardTargets() -- that endpoint's field shape was never verified against a real caller anywhere\n// in this codebase, while this pattern is proven live since Chapter 4.\nfunction FavoriteShare({hashParams, myUserId, chatList, onToast}) {\n const ids = (hashParams && hashParams.ids ? hashParams.ids.split(',') : []).filter(Boolean);\n const [query, setQuery] = React.useState('');\n const [selected, setSelected] = React.useState([]);\n const [confirming, setConfirming] = React.useState(false);\n const [comment, setComment] = React.useState('');\n const [sending, setSending] = React.useState(false);\n const [preview, setPreview] = React.useState(null);\n React.useEffect(() => { if (ids[0]) getFavorite(ids[0]).then(setPreview).catch(() => {}); }, []);\n const toggle = id => setSelected(values => values.includes(id) ? values.filter(v => v !== id) : values.concat(id).slice(0, 9));\n const send = () => {\n if (sending) return;\n setSending(true);\n forwardFavorites(ids, selected, comment.trim()).then(result => {\n // `items` is one row per (favorite x target) pair once a target passes the permission check,\n // or one bare row per target when it fails outright -- either way its length isn't `selected.length`\n // (target count) whenever more than one favorite is being shared at once, so a plain\n // `selected.length - failedItems` mixed the two units and could go negative. Group back to the\n // \"会话\" granularity the toast actually claims to report: a target only counts as fully sent once\n // every one of its own items succeeded.\n const items = (result && result.items) || [];\n const successTargets = selected.filter(target => {\n const forTarget = items.filter(r => r.target_topic === target);\n return forTarget.length > 0 && forTarget.every(r => r.status === 'sent');\n }).length;\n onToast(successTargets === selected.length ? `已分享给 ${selected.length} 个会话` : `${successTargets}/${selected.length} 个会话分享成功`);\n window.setTimeout(() => navigate('favorites-files'), 700);\n }).catch(err => onToast(err.message || '分享失败')).finally(() => setSending(false));\n };\n const previewAtt = preview && firstAttachment(preview.snapshot && preview.snapshot.content);\n const contacts = (chatList || []).filter(c => c.acs && c.acs.isJoiner() && c.acs.isWriter() &&\n (!query || topicDisplayName(c.name, c.public, c.name || '').toLowerCase().includes(query.toLowerCase())));\n const nameOf = uid => { const t = contacts.find(c => c.name === uid); return (t && topicDisplayName(t.name, t.public, uid)) || uid; };\n return \n
\n {!confirming ? <>\n
\n
最近聊天
\n
{contacts.map(item => toggle(item.name)}>\n {topicDisplayName(item.name, item.public, item.name)} \n {selected.includes(item.name) ? 'check' : ''} \n )} \n
已选择 {selected.length}/9 setConfirming(true)}>确定 \n > :
\n 发送给 \n {selected.map(uid =>
{nameOf(uid)} )}
\n {preview ? {previewAtt ? {}} /> :\n {plainTextOf(preview.snapshot && preview.snapshot.content, preview.snapshot && preview.snapshot.text)}
}\n 收藏原件会继续保留,并在目标会话中生成一条新消息。
: null}\n setComment(event.target.value)} placeholder=\"给朋友留言\" />\n 发送 \n }\n
;\n}\n\nfunction DownloadPage({hashParams, tinode, onToast}) {\n const [meta, setMeta] = React.useState(null);\n // A failed fetch previously left this stuck on \"加载中…\" forever -- the toast fired once and faded,\n // but `meta` never left null so the loading branch below never had anything else to show. Tracked\n // separately from `meta` itself since a real \"still loading\" state also has `meta === null`.\n const [loadError, setLoadError] = React.useState(false);\n const [state, setState] = React.useState('ready');\n const [progress, setProgress] = React.useState(0);\n const downloaderRef = React.useRef(null);\n const {favoriteId, topic, seq, fromType} = hashParams || {};\n // Two distinct entry points share this route: Favorites (favoriteId set, Ch.7.1) and History's\n // file tab (topic+seq set, Ch.7.12) -- \"back\" must return to whichever one actually opened this\n // page, not unconditionally to favorites-files (which History never came from and has no topic\n // param for anyway). Within Favorites itself, `openItem` now also threads through the tab the user\n // was actually on (`fromType`) -- opening a file from \"全部\" or \"文件\" both land here, and should\n // each return to where they came from, not always to the \"文件\" tab regardless of origin.\n const backView = favoriteId ? (TYPE_ROUTE[fromType] || 'favorites-files') : 'history-files';\n const backParams = favoriteId ? undefined : {topic};\n React.useEffect(() => {\n const apply = content => {\n const att = firstAttachment(content);\n if (!att) { onToast('文件信息加载失败'); setLoadError(true); return; }\n // Drafty.getDownloadUrl's raw return value is only actually usable as-is for a small inband\n // attachment (an already-local blob: URL built from inline base64 data). For an out-of-band\n // one -- everything above the ~3MB inline threshold, i.e. essentially every real photo/video/\n // document -- it's the bare server-relative .ref path (e.g. \"/v0/file/s/xxx\"), which the\n // browser would resolve against *this page's own* origin rather than the tenant's real\n // (often cross-origin) file domain. resolveAttachmentUrl() elsewhere in this file already\n // gets this right by routing ref-backed attachments through getFileUrl() -- but that eagerly\n // fetches the whole file into a blob immediately, which is wrong here: this page hasn't had\n // the user press \"立即下载\" yet, and doing that on mount would silently pull the entire file in\n // the background and make the ready/downloading/done states below meaningless.\n // resolveFileUrl() is the same domain-qualification with no fetch, exactly what's needed to\n // just populate `meta.url` for later use by the real download button.\n const direct = Drafty.getDownloadUrl(att);\n const url = (direct && (direct.startsWith('blob:') || direct.startsWith('data:'))) ?\n direct : resolveFileUrl(direct && direct.slice(direct.lastIndexOf('/') + 1));\n setMeta({name: att.name, mime: att.mime, size: Drafty.getEntitySize(att), url});\n };\n if (favoriteId) {\n getFavorite(favoriteId).then(fav => apply(fav.snapshot && fav.snapshot.content)).catch(err => { onToast(err.message || '加载失败'); setLoadError(true); });\n } else if (topic && seq) {\n getMessageContext(topic, seq, 0, 0).then(data => {\n const item = (data.items || []).find(m => String(m.seq) === String(seq)) || data.items[0];\n apply(item && item.content);\n }).catch(err => { onToast(err.message || '加载失败'); setLoadError(true); });\n }\n }, [hashParams]);\n const start = () => {\n if (!meta || !tinode) return;\n // A small inband attachment's \"url\" (from Drafty.getDownloadUrl) is already a ready-to-use\n // blob: URL built from its inline base64 data -- there's nothing to fetch from the server, so\n // getLargeFileHelper().download() would be the wrong tool (it requires a *relative* HTTP path and\n // returns bare `undefined`, not a rejected promise, for anything else -- confirmed by triggering\n // this exact case: chaining .then() off that return value threw \"Cannot read properties of\n // undefined\"). Save the already-local blob directly instead.\n if (meta.url && (meta.url.startsWith('blob:') || meta.url.startsWith('data:'))) {\n const link = document.createElement('a');\n link.href = meta.url; link.download = meta.name || 'file';\n document.body.appendChild(link); link.click(); document.body.removeChild(link);\n setState('done');\n return;\n }\n // tinode.getLargeFileHelper().download() sends the same two wrong headers as its upload() sibling\n // (X-Tinode-APIKey/X-Tinode-Auth, neither recognized by this backend) -- every real out-of-band\n // download was silently failing. createFileDownloader() is a fixed-headers drop-in with the exact\n // same download()/cancel() interface.\n const downloader = createFileDownloader(tinode);\n if (!downloader) { onToast('当前环境不支持下载'); return; }\n downloaderRef.current = downloader;\n setState('loading'); setProgress(0);\n // download() resolves once the browser's own save dialog/native download has been triggered --\n // there's no server-side download-completion record to poll (confirmed absent on the backend), so\n // \"downloaded\" here just means the transfer finished, tracked only for this page's own lifetime.\n const result = downloader.download(meta.url, meta.name, meta.mime,\n loaded => setProgress(meta.size ? Math.min(100, Math.round(loaded / meta.size * 100)) : 0),\n err => { setState('ready'); onToast((err && err.message) || '下载失败'); });\n if (result && result.then) {\n result.then(() => setState('done')).catch(() => {}); // onError above already surfaced the failure.\n }\n };\n const cancel = () => { if (downloaderRef.current) downloaderRef.current.cancel(); setState('ready'); setProgress(0); };\n if (!meta) return \n {loadError ? '文件不存在或已被删除' : '加载中…'}
\n ;\n return \n
\n
\n {extFromName(meta.name) || '?'} \n {meta.name} \n 该文件不支持在线预览
\n {state === 'loading' ? \n 下载中... {progress}%
\n \n {bytesToHumanSize(meta.size * progress / 100)} / {bytesToHumanSize(meta.size)} \n : null}\n {state === 'ready' ? download 立即下载({bytesToHumanSize(meta.size)}) :\n state === 'loading' ? close 取消
:\n onToast('已保存,可在浏览器下载列表中查看')}>open_in_new 用其他应用打开
}\n \n
;\n}\n\n// 不用服务端返回的 matches 偏移,改为在展示文本上本地匹配关键词。服务端那份偏移有三层问题,\n// 全都对不上前端要高亮的这段文字:\n// 1. 结构是 [{start,end}] 对象数组(im_http.go:9151),按 [start,len] 数组解构会直接抛\n// TypeError(对象不可迭代),整个搜索结果渲染崩掉;\n// 2. start/end 是 Go 的字节下标(strings.Index + len(query)),中文一字三字节,跟 JS 的\n// UTF-16 下标永远错位;\n// 3. 偏移基准是完整原文,但 snippet 在超过 120 字时会被开窗截断(im_http.go:9128-9139),\n// 两者基准不一致——而且那段开窗自己也混用了字节下标和 rune 切片。\n// 本地匹配没有这些歧义:所见即所高亮。\nfunction Highlight({text, query}) {\n const needle = (query || '').trim();\n if (!needle || !text) return text;\n const parts = [];\n const haystack = text.toLowerCase();\n const lowered = needle.toLowerCase();\n let last = 0;\n for (let at = haystack.indexOf(lowered); at !== -1; at = haystack.indexOf(lowered, at + lowered.length)) {\n if (at > last) parts.push(text.slice(last, at));\n parts.push({text.slice(at, at + needle.length)} );\n last = at + needle.length;\n }\n if (!parts.length) return text;\n if (last < text.length) parts.push(text.slice(last));\n return parts;\n}\n\nfunction HistoryNav({active}) {\n const tabs = [['history-search', '聊天记录'], ['history-images', '图片'], ['history-videos', '视频'], ['history-files', '文件'], ['history-links', '链接']];\n return {tabs.map(item => navigate(item[0])}>{item[1]} )} ;\n}\n\nconst HISTORY_TITLES = {'history-search': '查找聊天记录', 'history-files': '文件', 'history-links': '链接', 'history-images': '图片', 'history-videos': '视频'};\nconst HISTORY_TYPE = {'history-search': 'all', 'history-files': 'file', 'history-links': 'link', 'history-images': 'image', 'history-videos': 'video'};\n// Same bracket-label convention as message-center-view.jsx's draftyPreview() -- messageText() on the\n// backend has no attachment-aware summary, so a non-text search hit's own \"snippet\" field is often just\n// the raw serialized Drafty content; a fixed label per type reads far better than that.\nconst TYPE_LABEL = {image: '[图片]', video: '[视频]', voice: '[语音]', file: '[文件]', link: '[链接]'};\n\nfunction History({view, hashParams, myUserId, onToast}) {\n const topic = hashParams && hashParams.topic;\n // Keyed by both topic and view/tab -- reached from one chat's own settings, and a user plausibly\n // leaves to tweak a setting and comes back to keep browsing/searching the same conversation's\n // records (or checks a different chat's history later the same session), so dropping either half\n // of the key would bleed one chat's or one tab's data into another's.\n const cacheKey = topic ? `history:${topic}:${view}` : null;\n // 输入值与实际发请求用的值分开:原来 query 直接进 load 的依赖数组,输入 6 个字的关键词就打\n // 6 次接口,而且返回顺序没有保证——后发的短前缀请求可能后到、把正确结果覆盖掉。\n const [queryInput, setQueryInput] = React.useState('');\n const query = useDebouncedValue(queryInput, 300);\n const [items, setItems] = React.useState(() => (cacheKey && readCachedData(cacheKey)) || null);\n const [cursor, setCursor] = React.useState('');\n const [hasMore, setHasMore] = React.useState(false);\n const [mediaUrls, setMediaUrls] = React.useState({});\n const [senderNames, setSenderNames] = React.useState({});\n const load = React.useCallback((append) => {\n if (!topic) return;\n const type = HISTORY_TYPE[view];\n const call = view === 'history-search' ? searchTopicMessages(topic, {query, type, cursor: append ? cursor : ''}) :\n getTopicMedia(topic, type, append ? cursor : '');\n call.then(data => {\n setItems(prev => {\n const list = append ? (prev || []).concat(data.items || []) : (data.items || []);\n if (!query && cacheKey) writeCachedData(cacheKey, list);\n return list;\n });\n setCursor(data.next_cursor || ''); setHasMore(!!data.next_cursor);\n }).catch(err => onToast(err.message || '加载失败'));\n }, [topic, view, query, cursor]);\n React.useEffect(() => {\n setItems((!query && cacheKey && readCachedData(cacheKey)) || null);\n load(false);\n }, [topic, view, query]);\n React.useEffect(() => {\n if (view !== 'history-images' && view !== 'history-videos') return;\n (items || []).forEach(item => {\n if (mediaUrls[item.seq]) return;\n resolveAttachmentUrl(attachmentFromFlat(item)).then(url => { if (url) setMediaUrls(v => ({...v, [item.seq]: url})); });\n });\n }, [items, view]);\n // item.from (like snapshot.from on a favorite) is a bare uid with no \"usr\" prefix -- every other uid\n // in this app (topic names, hash params, etc.) is fully-prefixed, so it has to be added back before\n // this can be looked up like any other user id.\n React.useEffect(() => {\n (items || []).forEach(item => {\n const from = item.from;\n if (!from || senderNames[from] || from === myUserId || ('usr' + from) === myUserId) return;\n getUserProfile(from.startsWith('usr') ? from : 'usr' + from).then(p => {\n setSenderNames(v => ({...v, [from]: p.display_name}));\n }).catch(() => {});\n });\n }, [items]);\n // Mirrors tinode-web.jsx's own handleTopicSelected exactly (HashNavigation.setUrlTopic('', topicName)\n // -- an empty base hash, not the current one, per its \"Clear newTopicParams after use\" comment) so\n // this lands the same way a normal chat-list click does, then layers the jump target on as a param;\n // navigate()'s own helper only ever touches path[0]+params, never path[1] (the actual topic slot).\n const jump = seq => HashNavigation.navigateTo(HashNavigation.addUrlParam(HashNavigation.setUrlTopic('', topic), 'jumpseq', seq));\n const nameOf = from => {\n if (!from) return '';\n if (from === myUserId || ('usr' + from) === myUserId) return '我';\n return senderNames[from] || from;\n };\n const openLink = url => {\n checkURL(url, 'message').then(res => {\n if (res.decision === 'allow') window.open(url, '_blank', 'noopener,noreferrer');\n else onToast(res.decision === 'block' ? '该链接存在风险,已被拦截' : '该链接可能存在风险,请谨慎访问');\n }).catch(() => onToast('链接安全校验失败'));\n };\n const list = items || [];\n return \n {/* Reached from either a friend's chat settings (usrXXX topic, reads hashParams.uid) or a\n group's (grpXXX topic, reads hashParams.topic) -- the topic's own prefix says which settings\n page to return to and which param name it expects; passing the wrong one is the same\n blank-page failure as History's other entry points had before this was a switch. */}\n
\n {view === 'history-search' ?
: null}\n
\n
\n {items === null ? 加载中…
: !list.length ?\n {view === 'history-search' ? 'search_off' : 'inbox'} 暂无内容
:\n view === 'history-search' ? \n {list.map(item => jump(item.seq)}>\n {nameOf(item.from)} {item.type === 'text' ?\n : (TYPE_LABEL[item.type] || item.snippet || '')}
\n {shortDateFormat(new Date(item.ts))} chevron_right \n )}\n :\n view === 'history-files' ? {list.map(item => {\n const att = attachmentFromFlat(item);\n return \n {nameOf(item.from)} {shortDateFormat(new Date(item.ts))}
\n navigate('file-download', {topic, seq: item.seq})} />\n ;\n })} :\n view === 'history-links' ? {list.map(item => \n {/* 需求7.14\"点击时执行外链安全策略,并允许用户定位回原始消息\"是两个独立动作——点链接本身\n 走 openLink(安全校验+开外链),定位回原消息复用其它tab都在用的 jump(seq),挂在头部\n 这一行上(sender+时间),跟 history-files 的头部保持视觉一致,只是这里多了可点击行为。 */}\n jump(item.seq)}>\n {nameOf(item.from)} {shortDateFormat(new Date(item.ts))} \n \n \n )} :\n {list.map(item => jump(item.seq)} removed={item.availability === 'removed'} />)} }\n {hasMore ? load(true)}>加载更多 : null}\n \n
;\n}\n\nexport default function ContentLibraryView({view, hashParams, tinode, myUserId, onTopicSelected, chatList}) {\n const [toast, setToast] = React.useState(''); let content;\n if (view.startsWith('favorites')) content = ;\n else if (view === 'favorite-share') content = ;\n else if (view.startsWith('file-download')) content = ;\n else content = ;\n return <>{content} setToast('')} />>;\n}\n","import React from 'react';\n\nimport HashNavigation from '../lib/navigation.js';\n\nconst navigate = view => HashNavigation.navigateTo(view);\n\nconst VIEW_CONFIG = {\n 'chat-inbound-request': {relationship: 'pending_inbound', variant: 'inbound-request'},\n 'chat-inbound-message': {relationship: 'pending_inbound', variant: 'inbound-message'},\n 'chat-outbound-request': {relationship: 'pending_outbound', variant: 'outbound-request'},\n 'chat-status': {relationship: 'friend', variant: 'status'},\n 'chat-friend': {relationship: 'friend', variant: 'friend'},\n 'chat-media': {relationship: 'friend', variant: 'media'},\n 'chat-blocked': {relationship: 'blocked_by_peer', variant: 'blocked'},\n 'chat-deleted': {relationship: 'none', variant: 'deleted'},\n 'chat-standard': {relationship: 'friend', variant: 'standard'},\n 'chat-attachments': {relationship: 'friend', variant: 'attachments'},\n 'chat-mixed': {relationship: 'friend', variant: 'mixed'},\n 'chat-contact-card': {relationship: 'friend', variant: 'contact-card'}\n};\n\nconst ATTACHMENTS = [\n {id: 'photo', icon: 'image', label: '照片'},\n {id: 'camera', icon: 'photo_camera', label: '拍摄'},\n {id: 'call', icon: 'call', label: '视频语音'},\n {id: 'card', icon: 'contact_page', label: '名片'},\n {id: 'file', icon: 'folder', label: '文件'},\n {id: 'favorite', icon: 'bookmark', label: '收藏'},\n {id: 'video', icon: 'videocam', label: '视频通话'}\n];\n\nfunction Icon({children}) {\n return {children} ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2200);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\nfunction ChatAvatar({mine = false, peer = false}) {\n return ;\n}\n\nfunction Status({value, failedReason}) {\n if (!value && !failedReason) return null;\n return \n {failedReason ? error : null}{failedReason || value} \n
;\n}\n\nfunction FileCard() {\n return \n
365天艾宾浩斯记忆曲线复习计划.pdf 115KB
\n
P \n
;\n}\n\nfunction ContactCard({onOpen}) {\n return \n 栗子来了 \n 个人名片 · 账号 QL1024 \n ;\n}\n\nfunction VoiceMessage({duration = 6, playing = false}) {\n return {playing ? 'graphic_eq' : 'volume_up'} {duration}″
;\n}\n\nfunction ImageMessage({progress}) {\n return \n
\n {progress < 100 ?
: null}\n
;\n}\n\nfunction Bubble({mine = false, children, status, failedReason, type = 'text', onOpenCard}) {\n return \n {!mine ?
: null}\n
\n {type === 'file' ?
: type === 'card' ?
:\n
{children}
}\n
\n
\n {mine ?
: null}\n
;\n}\n\nfunction RelationNotice({children, action, onAction}) {\n return {children} {action ? {action} : null}
;\n}\n\nfunction ChatTimeline({variant, uploadProgress, sendStatus, onRetry, onOpenCard, onFriendAction}) {\n if (variant === 'inbound-request' || variant === 'inbound-message') {\n return <>\n 7月30日 11:40
\n {variant === 'inbound-request' ? '请求添加你为好友' : '我是祈万事安好'} \n 以上是打招呼的消息 \n onFriendAction('declined')}>拒绝 onFriendAction('accepted')}>通过申请
\n >;\n }\n\n if (variant === 'outbound-request') {\n return <>\n 7月30日 11:40
\n 请求添加你为好友 \n 好友申请已发送,等待对方处理 \n >;\n }\n\n if (variant === 'status') {\n return <>\n 7月30日 11:40
\n 我是祈万事安好 \n 你已添加安妮,现在可以开始聊天。 \n >;\n }\n\n if (variant === 'friend') {\n return <>\n 8月27日 11:11
\n 你们已成为好友,现在可以开始聊天 \n 我们已成为好友,现在我们可以开始聊天 \n 你还好吗? \n >;\n }\n\n if (variant === 'media') {\n return <>\n 8月27日 11:11
\n 接雨彤创建群聊 \n 你还好吗? \n \n \n \n >;\n }\n\n if (variant === 'blocked') {\n return <>\n 7月30日 11:40
\n 请求添加你为好友 \n 你已添加了安妮,现在可以开始聊天。 \n 7月30日 13:00
\n 这边在网上看见你的留言,你想了解什么课程了 \n 有课程辅导的老师?对新手友好吗? \n 这个不用担心特别好上手,学起来特别简单 \n 拉黑我这么速度,真的牛 \n >;\n }\n\n if (variant === 'deleted') {\n return <>\n 7月30日 13:00
\n 你好我是XXX推荐过来的,这边想了解课程是吗 \n 这边目前找到更好的课程,不考虑你们家,谢谢 \n 这是我们导师名片,你可以加一下,对比一下价格 \n onFriendAction('resent')}>你还不是他(她)朋友。 \n 这么突然把我删了,真心累了 \n onFriendAction('resent')}>你还不是他(她)朋友。 \n >;\n }\n\n const base = <>\n 7月30日 11:40
\n 请求添加你为好友 \n 你已添加了安妮,现在可以开始聊天。 \n 7月30日 13:00
\n 你好,我是王珊珊,很高兴认识你,你怎么称呼 \n 你好,我是安妮,想跟你咨询一下设计课程,方便? \n >;\n\n if (variant === 'standard') {\n return <>{base}非常方便,这是我们的课程目录,你可以看看了解一下 >;\n }\n if (variant === 'mixed') {\n return <>{base} >;\n }\n if (variant === 'contact-card') {\n return <>{base}这是我们导师名片,你可以加一下,有问题随时联系他 好的,非常感谢,那我这边就直接联系他吧 没问题的,有疑问随时沟通 >;\n }\n return base;\n}\n\nfunction AttachmentPanel({onChoose}) {\n return \n {ATTACHMENTS.map(item => onChoose(item)}>{item.icon} {item.label} )}\n
;\n}\n\nfunction Composer({relationship, attachmentOpen, setAttachmentOpen, onSend}) {\n const [draft, setDraft] = React.useState(sessionStorage.getItem('im-chat-draft') || '');\n const canSend = relationship === 'friend';\n const updateDraft = value => {\n setDraft(value);\n sessionStorage.setItem('im-chat-draft', value);\n };\n const submit = e => {\n e.preventDefault();\n if (!canSend || !draft.trim()) return;\n onSend(draft.trim());\n updateDraft('');\n };\n return \n navigate('voice-ready')}>record_voice_over \n updateDraft(e.target.value)} placeholder={canSend ? '输入消息' : relationship === 'pending_inbound' ? '请先处理好友申请' : relationship === 'pending_outbound' ? '等待对方通过好友申请' : '当前无法发送消息'} disabled={!canSend} />\n navigate('emoji-panel')}>sentiment_satisfied_alt \n {draft.trim() ? 发送 : setAttachmentOpen(!attachmentOpen)}>{attachmentOpen ? 'keyboard' : 'add_circle_outline'} }\n ;\n}\n\nexport default function DirectMessageView({view}) {\n const config = VIEW_CONFIG[view] || VIEW_CONFIG['chat-standard'];\n const [relationship, setRelationship] = React.useState(config.relationship);\n const [variant, setVariant] = React.useState(config.variant);\n const [attachmentOpen, setAttachmentOpen] = React.useState(config.variant === 'attachments');\n const [uploadProgress, setUploadProgress] = React.useState(config.variant === 'media' ? 76 : 100);\n const [sendStatus, setSendStatus] = React.useState('发送中');\n const [extraMessages, setExtraMessages] = React.useState([]);\n const [toast, setToast] = React.useState('');\n\n React.useEffect(() => {\n if (variant !== 'status') return undefined;\n const stages = ['已发送', '已送达', '已读'];\n const timers = stages.map((status, index) => window.setTimeout(() => setSendStatus(status), 600 * (index + 1)));\n return () => timers.forEach(timer => window.clearTimeout(timer));\n }, [variant]);\n\n React.useEffect(() => {\n if (variant !== 'media' || uploadProgress >= 100) return undefined;\n const timer = window.setTimeout(() => setUploadProgress(value => Math.min(value + 4, 100)), 350);\n return () => window.clearTimeout(timer);\n }, [variant, uploadProgress]);\n\n const friendAction = action => {\n if (action === 'declined') {\n setRelationship('none');\n setToast('已拒绝好友申请');\n } else {\n setRelationship(action === 'accepted' ? 'friend' : 'pending_outbound');\n if (action === 'accepted') setVariant('friend');\n setToast(action === 'accepted' ? '好友申请已通过' : '好友验证已发送');\n }\n };\n\n return \n
\n navigate('messages-home')} aria-label=\"返回消息\">arrow_back_ios_new \n
接语彤 在线 \n navigate('friend-settings')} aria-label=\"会话设置\">more_vert \n \n
\n setToast('正在重试发送')} onOpenCard={() => navigate('friend-profile')} onFriendAction={friendAction} />\n {extraMessages.map(item => {item.text} )}\n \n {relationship === 'friend' ? null :
info_outline {relationship === 'pending_inbound' ? '通过好友申请后即可发送消息' : relationship === 'pending_outbound' ? '好友申请正在等待处理' : relationship === 'none' ? '对方已不是你的好友,发送消息前需重新验证' : '当前关系状态下无法发送消息'}
}\n
{\n const id = Date.now();\n setExtraMessages(items => items.concat({id, text, status: '发送中'}));\n window.setTimeout(() => setExtraMessages(items => items.map(item => item.id === id ? {...item, status: '已发送'} : item)), 600);\n }} />\n {attachmentOpen && relationship === 'friend' ? {\n setToast(`已选择${item.label},上传接口将在联调阶段接入`);\n if (item.id === 'card') navigate('chat-contact-card');\n if (item.id === 'photo' || item.id === 'camera') navigate('media-uploading');\n if (item.id === 'call' || item.id === 'video') navigate('call-history');\n if (item.id === 'file') navigate('upload-file');\n if (item.id === 'favorite') navigate('favorites');\n }} /> : null}\n setToast('')} />\n ;\n}\n","import React from 'react';\nimport QRCode from 'qrcodejs';\nimport { pinyin } from 'pinyin-pro';\n\nimport HashNavigation from '../lib/navigation.js';\nimport {\n getGroups, createGroup, getGroup, updateGroup, getGroupSettings, updateGroupMemberSettings,\n updateMyGroupProfile, getMyGroupProfile, leaveGroup, getGroupMembers, createGroupQRCode, getGroupJoinRequests,\n acceptGroupJoinRequest, rejectGroupJoinRequest, getLatestGroupAnnouncement,\n updateCurrentGroupAnnouncement, readGroupAnnouncement, getGroupGovernance, updateGroupGovernance, addGroupAdmins,\n deleteGroupAdmin, muteGroupMembers, getGroupMutes, unmuteGroupMember, transferGroupOwner,\n getGroupFiles, addGroupFile, deleteGroupFile, uploadLargeFile, getFileUrl, getUserProfile,\n getGroupMemberProfile, fetchAllPages\n} from '../lib/im-api.js';\nimport { readCachedData, writeCachedData, useDebouncedValue } from '../lib/use-cached-data.js';\n\n// Carries the group `topic` (and anything else already in the hash) across navigation, the same way\n// contact-management-view.jsx threads `uid` -- these pages all need to know *which* group.\nconst navigate = (view, topic) => {\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, view);\n hash = topic ? HashNavigation.addUrlParam(hash, 'topic', topic) : HashNavigation.removeUrlParam(hash, 'topic');\n HashNavigation.navigateTo(hash);\n};\n\n// 'group-member-profile' is contact-management-view.jsx's Profile component (Ch.5) reused as-is for\n// viewing a group member who isn't necessarily a friend -- that route keys off `uid`, not `topic`, so it\n// can't go through this file's own `navigate` helper above without clobbering the wrong hash param.\n// 除了跳转,还必须先把已知资料写进 'profile-seed:' 缓存 —— 目标页(第5章的 Profile)会先读这个种子,\n// 因为 GET /users/{id}/profile 对非好友按隐私默认直接 403(imPrivacyAllowsProfile)。群成员里\n// 大部分不是好友,不 seed 的话点进去就是\"资料加载失败,请重试\"。第5章自己的入口\n// (contact-management-view.jsx 的 seedProfile)一直是这么做的,这里漏了。\nconst navigateToProfile = (topic, userId, member) => {\n // 先用群成员列表里已有的字段摆一个立即可用的种子(避免导航瞬间空白),\n // 但这份种子缺 capabilities/relationship——GET /groups/{topic}/members 从不返回这两个字段\n // (已实测确认),Profile 组件正是靠它们判断\"要不要显示添加好友按钮\"和\"该显示哪句失败文案\"。\n // 缺了它们,非好友的群成员主页会落到 cannotAddReason 的默认分支——不管真实关系是什么,\n // 一律显示\"好友申请正在等待验证\",添加好友按钮永远不出现。\n if (member && userId) {\n writeCachedData('profile-seed:' + userId, {\n user_id: userId,\n display_name: member.group_nickname || member.display_name || userId,\n avatar_file_id: member.avatar_file_id,\n ...(member.signature ? {signature: member.signature} : {}),\n ...(member.region ? {region: member.region} : {}),\n ...(member.gender ? {gender: member.gender} : {})\n });\n }\n HashNavigation.navigateTo(\n HashNavigation.addUrlParam(HashNavigation.setUrlSidePanel(window.location.hash, 'group-member-profile'), 'uid', userId));\n // 群场景下真正该用的是 GET /groups/{topic}/members/{user_id}/profile——群上下文里权限判断更\n // 宽松,实测对方哪怕不是好友也能拿到 {capabilities, relationship}(Profile 组件目标页读的\n // GET /users/{id}/profile 对非好友是 403,只能回退用种子)。异步补种:请求回来后如果用户还\n // 停在这个人的资料页(没有连点跳到别处),用真实数据覆盖种子并强制该页面重新读取。\n if (topic && userId) {\n getGroupMemberProfile(topic, userId).then(real => {\n const current = readCachedData('profile-seed:' + userId) || {};\n writeCachedData('profile-seed:' + userId, {...current, ...real});\n window.dispatchEvent(new CustomEvent('profile-seed-updated', {detail: {uid: userId}}));\n }).catch(() => {});\n }\n};\n\nexport const GROUP_MANAGEMENT_VIEWS = [\n 'group-list', 'group-empty', 'group-invite', 'group-events', 'group-join-requests',\n 'group-new-request', 'group-announcement', 'group-summary', 'group-announcement-detail',\n 'group-settings', 'group-profile', 'group-avatar', 'group-nickname', 'group-description',\n 'group-my-nickname', 'group-members', 'group-role-message', 'group-qr', 'group-governance', 'group-admins',\n 'group-admin-add', 'group-admin-success', 'group-admin-partial', 'group-admin-removed',\n 'group-mute-add', 'group-muted', 'group-owner-select', 'group-owner-confirm', 'group-files',\n 'group-file-upload'\n];\n\n// Same first-pinyin-letter grouping as contact-management-view.jsx's alphaInitial -- duplicated rather\n// than shared, since that file's copy is unexported and this one is the only other place that needs it.\nfunction alphaInitial(name) {\n const ch = (name || '').trim()[0] || '#';\n if (/[A-Za-z]/.test(ch)) {\n return ch.toUpperCase();\n }\n if (/[一-龥]/.test(ch)) {\n const letter = pinyin(ch, {pattern: 'first', toneType: 'none'});\n return /[a-z]/i.test(letter) ? letter.toUpperCase() : '#';\n }\n return '#';\n}\n\nfunction groupBy(list, keyFn) {\n const groups = {};\n list.forEach(item => {\n const key = keyFn(item);\n (groups[key] || (groups[key] = [])).push(item);\n });\n return Object.keys(groups).sort().map(key => [key, groups[key]]);\n}\n\n// GET /v1/im/groups 的 name/member_count 目前不可信:handler 用的是 store.Users.GetSubs,而 store 自己的\n// 注释就写着它 \"Does not load Public/Trusted or Private\"(store.go:834-835),可 groupListItemPayload\n// 偏偏去读 sub.GetPublic() 取名字、sub.GetSubCnt() 取人数——于是每个群都返回自己的 topic id 当名字、\n// 0 当人数(应该用 GetTopics,它会把 Public 拷到 subscription 上)。已记入后端问题清单。\n// 在后端修好之前,用本地 Tinode 会话缓存兜底——消息首页的群名一直是从这里取的,是准的。\nfunction groupDisplayName(tinode, group) {\n if (group.name && group.name !== group.topic) return group.name;\n const t = tinode && tinode.getTopic ? tinode.getTopic(group.topic) : null;\n const pub = t && t.public;\n // 群的 public 用的是 `name`(实测本地缓存就是 {name:\"扫码测试群\", version:1}),后端自己的\n // groupName() 也是按 name/display_name/fn 这个顺序找的,保持一致。\n const local = pub && (pub.name || pub.display_name || pub.fn);\n return local || group.name || group.topic;\n}\n\nfunction groupMemberCount(tinode, group) {\n if (group.member_count) return group.member_count;\n const t = tinode && tinode.getTopic ? tinode.getTopic(group.topic) : null;\n return (t && t.subcnt) || 0;\n}\n\nfunction shortDate(iso) {\n if (!iso) return '';\n const d = new Date(iso);\n return `${d.getMonth() + 1}-${String(d.getDate()).padStart(2, '0')}`;\n}\n\n// -- Demo-only mock data below this line: still used by the untouched GroupChat/ChatHeader/SystemEvent\n// -- trio (see comment above GroupChat). Those views are a standalone design reference showing message-\n// -- timeline states -- the real group chat timeline is messages-view.jsx, not this file (same treatment\n// -- Ch.3 gave direct-message-view.jsx). Nothing else in this file reads these constants any more.\nconst MEMBERS = [\n {id: 'annie', name: '安妮', role: '管理员', avatar: 'img/bkg/p09.jpg'},\n {id: 'lizi', name: '栗子来了', role: '成员', avatar: 'img/bkg/p15.jpg'},\n {id: 'wang', name: '王珊珊', role: '成员', avatar: 'img/bkg/p14.jpg'},\n {id: 'sun', name: '孙光洪', role: '成员', avatar: 'img/bkg/p03.jpg'},\n {id: 'lin', name: '林间风', role: '成员', avatar: 'img/bkg/p18.jpg'}\n];\nconst GROUPS_DEMO = {\n owned: [{id: 'product', name: '产品研发群', count: 18, avatar: 'img/bkg/p22.jpg'}]\n};\n\nfunction Icon({children}) { return {children} ; }\n// onBack:少数页面的返回目标不是\"另一个侧栏视图\",而是要关掉侧栏回到某个会话(需要写 path[1],\n// navigate 辅助函数只会写 query 参数),这类情况传一个自己的回调进来。\nfunction Header({title, back = 'group-list', backTopic, onBack, right, onRight}) {\n return \n { if (!HashNavigation.goBack()) { if (onBack) onBack(); else navigate(back, backTopic); } }} aria-label=\"返回\">arrow_back_ios_new \n {title} \n {right ? {right} : }\n ;\n}\nfunction Avatar({item, icon}) {\n const fileId = item && item.avatar_file_id;\n const [url, setUrl] = React.useState(null);\n React.useEffect(() => {\n if (!fileId) { setUrl(null); return undefined; }\n let live = true;\n getFileUrl(fileId).then(u => { if (live) setUrl(u); }).catch(() => {});\n return () => { live = false; };\n }, [fileId]);\n return {url ? : {icon || 'group'} } ;\n}\nfunction Toast({message, onDone}) {\n React.useEffect(() => { if (!message) return undefined; const timer = window.setTimeout(onDone, 2000); return () => window.clearTimeout(timer); }, [message, onDone]);\n return message ? {message}
: null;\n}\n// Centered overlay confirmation, docs/images/添加管理员-设置成功.png -- distinct from the bottom Toast\n// above (used for lighter \"已同意进群申请\"-style feedback that doesn't need a heavier interrupt).\nfunction CenterToast({message, onDone}) {\n React.useEffect(() => { if (!message) return undefined; const timer = window.setTimeout(onDone, 1400); return () => window.clearTimeout(timer); }, [message, onDone]);\n return message ? check_circle {message}
: null;\n}\nfunction Search({value, onChange, placeholder = '搜索'}) {\n return search onChange(event.target.value)} placeholder={placeholder} /> ;\n}\nfunction Toggle({checked, onChange, disabled}) {\n return !disabled && onChange(!checked)}> ;\n}\n\nfunction GroupList({tinode, onToast}) {\n // Only the unfiltered (query === '') result is worth caching -- caching a search result under the\n // same key would show stale search results instead of the real list on the next plain visit.\n const [lists, setLists] = React.useState(() => readCachedData('groups') || {owned: null, managed: null, joined: null});\n const [loadErrors, setLoadErrors] = React.useState({owned: false, managed: false, joined: false});\n const [category, setCategory] = React.useState('owned');\n // 这里比别处更值得防抖:reload 对 owned/managed/joined 三个分类各发一次请求,\n // 每敲一个字符就是 3 个 getGroups。\n const [queryInput, setQueryInput] = React.useState('');\n const query = useDebouncedValue(queryInput, 300);\n const [creating, setCreating] = React.useState(false);\n const [name, setName] = React.useState('');\n const [submitting, setSubmitting] = React.useState(false);\n const reload = React.useCallback(() => {\n ['owned', 'managed', 'joined'].forEach(cat => {\n getGroups({category: cat, query}).then(data => {\n const items = data.items || [];\n setLists(v => {\n const next = {...v, [cat]: items};\n if (!query) writeCachedData('groups', next);\n return next;\n });\n }).catch(() => { onToast('加载失败'); setLoadErrors(v => ({...v, [cat]: true})); });\n });\n }, [query]);\n React.useEffect(() => { reload(); }, [reload]);\n const current = lists[category];\n const submit = () => {\n if (!name.trim() || submitting) return;\n setSubmitting(true);\n createGroup({name: name.trim()}).then(() => {\n setCreating(false); setName(''); onToast('群聊创建成功'); reload();\n }).catch(err => onToast(err.message || '创建失败')).finally(() => setSubmitting(false));\n };\n return ;\n}\n\n// GroupChat/ChatHeader/SystemEvent: standalone design-reference demo (docs/images/内容沟通对话*.png), same\n// treatment as Ch.3's direct-message-view.jsx -- the real group timeline is messages-view.jsx, which now\n// has its own real relationship/announcement/join-request/role-badge wiring. Left unchanged, not rewired.\nfunction ChatHeader() { return navigate('group-list')}>arrow_back_ios_new
产品研发群 18人
navigate('group-settings')}>more_vert ; }\nfunction SystemEvent({children}) { return {children}
; }\nfunction GroupChat({mode, onToast}) {\n const [joined, setJoined] = React.useState(false);\n return {['group-new-request', 'group-summary'].includes(mode) ?
navigate('group-join-requests')}>person_add_alt 新的进群申请 2 条申请等待处理 chevron_right : null}{['group-announcement', 'group-summary'].includes(mode) ?
navigate('group-announcement-detail')}>campaign 群公告 下午三点进行版本评审,请准时参加 chevron_right : null}
今天 10:24
{mode === 'group-invite' ? 一起参与新版产品的设计与研发讨论
{setJoined(true); onToast('已加入产品研发群');}}>{joined ? '已加入' : '立即加入'} : <>安妮邀请栗子来了加入群聊 管理员通过了王珊珊的进群申请 >}record_voice_over sentiment_satisfied_alt add_circle_outline
;\n}\n\nfunction JoinRequests({topic, fromChat, onToast}) {\n // A persistent in-chat banner (messages-view.jsx's handleShowAnnouncement/handleShowJoinRequests)\n // is a second entry point besides group-settings, and this whole feature remounts on every\n // navigation step (see GroupManagementView's `key={view}` note) -- so an admin actively working\n // through requests re-triggers this blank \"加载中\" flash on essentially every accept/reject.\n // `fromChat`/`backToChat` mirror Announcement's handling of the exact same two-entry-point\n // ambiguity above -- without it, returning from a click on the in-chat banner always landed on\n // \"group-settings\" (closing the open conversation) instead of back to the chat itself.\n const backToChat = React.useCallback(() => {\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(HashNavigation.setUrlSidePanel('', ''), topic));\n }, [topic]);\n const [items, setItems] = React.useState(() => (topic && readCachedData('group-join-requests:' + topic)) || null);\n const [profiles, setProfiles] = React.useState({});\n const [loadError, setLoadError] = React.useState(false);\n // Tracked in a ref (not state) so `load` doesn't need `profiles` in its dependency array --\n // depending on `profiles` here would make `load` a new function every time a profile fetch\n // resolves, which would re-trigger the `useEffect(() => load(), [load])` below and re-fetch\n // the whole join-request list in a cascade, not just skip already-known profiles.\n const fetchedIds = React.useRef(new Set());\n const load = React.useCallback(() => {\n if (!topic) return;\n getGroupJoinRequests(topic, 'all').then(data => {\n const list = data.items || [];\n writeCachedData('group-join-requests:' + topic, list);\n setItems(list);\n const ids = new Set();\n list.forEach(r => { ids.add(r.user_id); if (r.inviter_id) ids.add(r.inviter_id); });\n ids.forEach(id => {\n if (fetchedIds.current.has(id)) return;\n fetchedIds.current.add(id);\n getUserProfile(id).then(p => setProfiles(v => ({...v, [id]: p}))).catch(() => { fetchedIds.current.delete(id); });\n });\n }).catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n React.useEffect(() => { setItems((topic && readCachedData('group-join-requests:' + topic)) || null); load(); }, [topic, load]);\n const handle = (req, accept) => {\n const call = accept ? acceptGroupJoinRequest(topic, req.request_id, req.version) : rejectGroupJoinRequest(topic, req.request_id, req.version);\n call.then(() => { onToast(accept ? '已同意进群申请' : '已拒绝进群申请'); load(); })\n .catch(err => onToast(err.message || '操作失败'));\n };\n const nameOf = id => (profiles[id] && profiles[id].display_name) || id;\n const describe = req => req.source === 'qr' ? `${nameOf(req.user_id)}通过二维码分享进群` :\n req.inviter_id ? `${nameOf(req.inviter_id)}邀请${nameOf(req.user_id)}进群` : `${nameOf(req.user_id)}申请加入群聊`;\n // Exact resolved/rejected label wording isn't confirmed against the live status enum yet -- falls back\n // to the raw status string for anything unrecognized so a mismatch is visible instead of silently wrong.\n const statusLabel = {accepted: '已确定', approved: '已确定', rejected: '已拒绝', expired: '已过期'};\n return \n
\n
\n {items === null ? {loadError ? '申请列表加载失败' : '加载中…'}
:\n items.length ? items.map(item =>\n \n \n {describe(item)} {shortDate(item.created_at)}
\n {item.status === 'pending' ?\n \n handle(item, false)}>拒绝 \n handle(item, true)}>确定 \n :\n {statusLabel[item.status] || item.status} }\n ) :\n 暂无进群申请
}\n \n
;\n}\n\nfunction Announcement({topic, myRole, fromChat, onToast}) {\n // Shares the 'group-announcement:'+topic cache key with GroupSettings' preview snippet below --\n // whichever screen loads first warms the cache for the other, and both are re-entered often (the\n // in-chat banner is a persistent second entry point on top of group-settings).\n const cachedAnnouncement = topic && readCachedData('group-announcement:' + topic);\n const [data, setData] = React.useState(() => cachedAnnouncement || null);\n const [draft, setDraft] = React.useState(() => (cachedAnnouncement && cachedAnnouncement.content) || '');\n const [editing, setEditing] = React.useState(false);\n const [saving, setSaving] = React.useState(false);\n const [loadError, setLoadError] = React.useState(false);\n const canEdit = myRole === 'owner' || myRole === 'admin';\n // Coming from the announcement banner atop the chat itself (messages-view.jsx's\n // handleShowAnnouncement) vs. from group-settings' \"群公告\" row land on the identical\n // path[0]=group-announcement-detail hash -- `fromChat` is the only thing telling them apart, so\n // \"back\" can return to the chat (close the sidepanel) instead of always forcing group-settings.\n // 从聊天页横幅进来时(messages-view.jsx:1152 用空基准拼 hash,所以 path[1] 是空的),返回应该\n // 关掉侧栏回到那个会话。原来写的是 navigate('', topic)——navigate 只把 topic 写成 query 参数,\n // path[1] 依旧为空,tinode-web 的 handleHashRoute 就把 topicSelected 清成 null,会话跟着一起关了。\n // 这里显式把 topic 写回 path[1]。\n const backToChat = React.useCallback(() => {\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(HashNavigation.setUrlSidePanel('', ''), topic));\n }, [topic]);\n React.useEffect(() => {\n if (!topic) return;\n const cached = readCachedData('group-announcement:' + topic);\n if (cached) { setData(cached); setDraft(cached.content || ''); }\n getLatestGroupAnnouncement(topic).then(d => {\n writeCachedData('group-announcement:' + topic, d);\n setData(d); setDraft(d.content || '');\n }).catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n const publish = () => {\n if (!draft.trim() || saving) return;\n setSaving(true);\n updateCurrentGroupAnnouncement(topic, draft.trim(), data ? data.version : 0).then(d => {\n writeCachedData('group-announcement:' + topic, d);\n setData(d); setEditing(false); onToast('群公告已发布');\n }).catch(err => onToast(err.message || '发布失败')).finally(() => setSaving(false));\n };\n // 6.9 要求\"记录已读状态\",但这个接口(POST .../read)之前完全没有调用点——每次打开公告详情页\n // (无论从群设置点进来还是从聊天顶部横幅点进来)都视为\"已读\",用ref去重避免同一条公告在同一次\n // 页面停留内重复上报。静默失败:已读打点不是这个页面的主要功能,不应该在失败时打断用户。\n const readReportedFor = React.useRef(null);\n React.useEffect(() => {\n const id = data && data.announcement_id;\n if (!id || !topic || readReportedFor.current === id) return;\n readReportedFor.current = id;\n readGroupAnnouncement(topic, id).catch(() => {});\n }, [topic, data]);\n if (!data) return {loadError ? '群公告加载失败' : '加载中…'}
;\n return \n
\n
\n {canEdit ? setDraft(e.target.value)} onFocus={() => setEditing(true)}\n placeholder=\"请输入群公告内容\" /> :\n <>\n campaign \n {data.content || '暂无群公告'}
\n >}\n {!canEdit ? 仅群主及群管理员可编辑 : null}\n \n
;\n}\n\nfunction GroupSettings({topic, myUserId, tinode, onToast}) {\n // This is the landing point for \"back\" from GroupProfile/GroupFiles/Governance/MyNicknameEditor/\n // Announcement, and (per GroupManagementView's `key={view}` note) the whole subtree remounts on\n // every one of those round trips -- essentially every group-settings visit after the first refetches\n // from scratch, making this the single highest-traffic page in this file to seed from cache.\n const [group, setGroup] = React.useState(() => (topic && readCachedData('group-settings:' + topic)) || null);\n const [loadError, setLoadError] = React.useState(false);\n // The member strip and AdminList/`myRole` all call the identical unfiltered getGroupMembers(topic) --\n // sharing one 'group-members:'+topic cache entry (storing the raw list, sliced to 9 only for local\n // display here) lets any one of the three warm it for the others.\n const [members, setMembers] = React.useState(() => {\n const cached = topic && readCachedData('group-members:' + topic);\n return cached ? cached.slice(0, 9) : [];\n });\n const [announcement, setAnnouncement] = React.useState(() => {\n const cached = topic && readCachedData('group-announcement:' + topic);\n return cached && cached.content ? cached : null;\n });\n React.useEffect(() => {\n if (!topic) return;\n setGroup(readCachedData('group-settings:' + topic) || null);\n setMembers((readCachedData('group-members:' + topic) || []).slice(0, 9));\n const cachedAnn = readCachedData('group-announcement:' + topic);\n setAnnouncement(cachedAnn && cachedAnn.content ? cachedAnn : null);\n getGroupSettings(topic).then(g => { writeCachedData('group-settings:' + topic, g); setGroup(g); }).catch(() => { onToast('加载失败'); setLoadError(true); });\n getGroupMembers(topic).then(data => {\n const items = data.items || [];\n writeCachedData('group-members:' + topic, items);\n setMembers(items.slice(0, 9));\n }).catch(() => {});\n getLatestGroupAnnouncement(topic).then(d => {\n writeCachedData('group-announcement:' + topic, d);\n setAnnouncement(d && d.content ? d : null);\n }).catch(() => {});\n }, [topic]);\n const setPref = patch => {\n updateGroupMemberSettings(topic, {pinned: group.pinned, mute_notifications: group.mute_notifications, ...patch})\n .then(() => setGroup(g => {\n const next = {...g, ...patch};\n writeCachedData('group-settings:' + topic, next);\n return next;\n })).catch(err => onToast(err.message || '设置失败'));\n };\n const leave = () => {\n if (group && group.my_role === 'owner') { onToast('群主需先转让群主或解散群聊'); return; }\n leaveGroup(topic).then(() => { onToast('已退出群聊'); navigate('group-list'); }).catch(err => onToast(err.message || '操作失败'));\n };\n if (!group) return {loadError ? '群组信息加载失败' : '加载中…'}
;\n const canManage = group.permissions && group.permissions.can_manage_settings;\n const links = [\n ['group-profile', '群资料', group.name],\n ['group-announcement-detail', '群公告', announcement ? announcement.content : '暂无群公告'],\n ['group-files', '群文件', ''],\n ['group-my-nickname', '我在本群的昵称', '']\n ];\n if (canManage) links.splice(3, 0, ['group-governance', '群组管理', '']);\n return \n
navigate('group-governance', topic) : undefined} />\n \n navigate('group-profile', topic)}>\n \n {group.name} {group.description || '群主很懒,还没有群简介'} \n chevron_right \n \n {/* 参考图 docs/images/群聊设置.png:\"群成员\"标题行右侧是可点的\"查看{N}群成员 >\",现在真的有\n 落地页了(GroupMembers,复用 MemberPicker 同款字母分组/搜索,只读不可多选)。参考图里最后\n 一格的\"删除\"(移除成员)没有做——那是一个独立的、需要产品先确认交互细节的成员管理功能,\n 不属于这条\"看不到全部成员\"缺口本身。 */}\n \n navigate('group-members', topic)}>\n 群成员 共 {group.member_count} 位成员 chevron_right \n \n \n {members.slice(0, 9).map(item =>
navigateToProfile(topic, item.user_id, item)}>\n {item.group_nickname || item.display_name} \n )}\n
onToast('请通过转发/分享群二维码邀请成员')}>\n add 添加 \n \n
\n \n {links.map(item => navigate(item[0], topic)}>\n {item[1]} {item[2]} chevron_right \n )} \n \n 置顶聊天 setPref({pinned: v})} />
\n 消息免打扰 setPref({mute_notifications: v})} />
\n navigate('history-search', topic)}>查看聊天记录 chevron_right \n {\n const t = tinode ? tinode.getTopic(topic) : null;\n (t ? t.delMessagesAll(false) : Promise.resolve()).then(() => onToast('聊天记录已清除')).catch(err => onToast(err.message || '操作失败'));\n }}>清空聊天记录 chevron_right \n {/* target_type='group' 这条链路早就是通的(tinode-web.jsx 的 handleReportTopic 就在用),\n 这里原来一直是个\"暂未开放\"的死桩。跟 contact-management-view.jsx 的好友举报入口一样,\n 举报页要的是 target_type/target_id/target_name 三个参数,本文件的 navigate 辅助函数\n 只会写 topic,所以直接拼 hash。 */}\n {\n let hash = HashNavigation.setUrlSidePanel('', 'abuse-report-reasons');\n hash = HashNavigation.addUrlParam(hash, 'target_type', 'group');\n hash = HashNavigation.addUrlParam(hash, 'target_id', topic);\n hash = HashNavigation.addUrlParam(hash, 'target_name', (group && group.name) || topic);\n HashNavigation.navigateTo(hash);\n }}>投诉/举报 chevron_right \n \n 退出群组 \n \n ;\n}\n\nfunction GroupProfile({topic, myUserId, onToast}) {\n // Shares 'group:'+topic with the nickname/description editors' own getGroup(topic) calls -- opening\n // this once warms the cache for either of those too.\n const [group, setGroup] = React.useState(() => (topic && readCachedData('group:' + topic)) || null);\n const [loadError, setLoadError] = React.useState(false);\n // \"群昵称\" here means \"my nickname within this group\" (see MyNicknameEditor below), not the group's\n // own name -- confirmed live this preview row was showing group.name instead, since it's easy to\n // conflate the two. GET .../members/me/profile is the only endpoint that actually returns this --\n // confirmed live that the member list endpoint (getGroupMembers) never includes group_nickname on\n // any item, so a version of this fix that read it from there (like MyNicknameEditor below does)\n // would always show \"未设置\" even right after a successful save.\n const [myNickname, setMyNickname] = React.useState('');\n React.useEffect(() => {\n if (!topic) return;\n setGroup(readCachedData('group:' + topic) || null);\n getGroup(topic).then(g => { writeCachedData('group:' + topic, g); setGroup(g); }).catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n React.useEffect(() => {\n if (!topic) return;\n getMyGroupProfile(topic).then(data => {\n setMyNickname(data.nickname || '');\n }).catch(() => {});\n }, [topic]);\n if (!group) return {loadError ? '群组信息加载失败' : '加载中…'}
;\n const canEdit = group.permissions && group.permissions.can_edit_profile;\n const nicknameLabel = myNickname || '未设置';\n return \n
\n
\n canEdit && navigate('group-avatar', topic)}>\n 群头像 chevron_right \n \n navigate('group-my-nickname', topic)}>\n 群昵称 {nicknameLabel} chevron_right \n \n {canEdit ? navigate('group-nickname', topic)}>\n 群名称 {group.name} chevron_right \n :\n 群名称 {group.name}
}\n {canEdit ? navigate('group-description', topic)}>\n 群简介 {group.description || '群主很懒,还没有群简介'} chevron_right \n :\n 群简介 {group.description || '群主很懒,还没有群简介'}
}\n navigate('group-qr', topic)}>群二维码 qr_code chevron_right \n {group.member_count} 位成员
\n \n
;\n}\n\nfunction AvatarSheet({topic, myUserId, tinode, onToast}) {\n const inputRef = React.useRef(null);\n const [uploading, setUploading] = React.useState(false);\n const pick = () => inputRef.current && inputRef.current.click();\n const onFile = e => {\n const file = e.target.files && e.target.files[0];\n e.target.value = '';\n if (!file || !tinode) return;\n setUploading(true);\n // Fetch the current version right before the write, same optimistic-concurrency protection the\n // name/description editors already have (GroupProfile below re-fetches independently and its\n // possibly-stale copy isn't reused here) -- avatar updates were the one group-profile field with\n // none at all.\n uploadLargeFile(tinode, file)\n .then(({fileId}) => getGroup(topic).then(group => updateGroup(topic, {avatar_file_id: fileId, version: group.version})))\n .then(() => { onToast('群头像已更新'); navigate('group-profile', topic); })\n .catch(err => onToast(err.message || '上传失败')).finally(() => setUploading(false));\n };\n return \n
\n
\n
\n 设置群头像 \n photo_library {uploading ? '正在上传…' : '从相册选择'} \n navigate('group-profile', topic)}>取消 \n
\n
;\n}\n\nfunction GroupQr({topic, onToast}) {\n const ref = React.useRef(null);\n const [data, setData] = React.useState(null);\n React.useEffect(() => {\n if (!topic) return;\n createGroupQRCode(topic).then(setData).catch(() => onToast('二维码生成失败'));\n }, [topic]);\n React.useEffect(() => {\n if (!ref.current || !data) return;\n ref.current.innerHTML = '';\n new QRCode(ref.current, {text: data.qr_payload, width: 190, height: 190, correctLevel: QRCode.CorrectLevel.M});\n }, [data]);\n const group = data && data.group_snapshot;\n const share = () => {\n if (navigator.share && data) {\n navigator.share({title: group && group.name, text: '扫码加入群聊', url: data.qr_payload}).catch(() => {});\n } else if (data) {\n navigator.clipboard.writeText(data.qr_payload).then(() => onToast('链接已复制')).catch(() => onToast('分享失败'));\n }\n };\n const save = () => {\n const canvas = ref.current && ref.current.querySelector('canvas');\n if (!canvas) { onToast('保存失败'); return; }\n const a = document.createElement('a');\n a.href = canvas.toDataURL('image/png');\n a.download = (group ? group.name : 'group') + '-qrcode.png';\n a.click();\n onToast('群二维码已保存');\n };\n return \n
\n
\n \n {group ? group.name : ''} {group ? group.member_count : 0} 位成员 \n
\n 使用APP扫码二维码,加入群聊
\n \n \n share 分享好友 \n download 保存至相册 \n
\n \n
;\n}\n\n// The five backend-persisted governance fields (server/im_http.go imGroupGovernancePatchRequest) --\n// docs/images/群组管理.png showed a 4th toggle \"群成员修改昵称\" that doesn't correspond to any real\n// governance field (its own description text also doesn't match member_upload_files' actual meaning,\n// which a *different*, buggier draft screenshot happened to label correctly). Shipping a toggle with\n// nothing to persist would be worse than a label mismatch, so this uses the mock's original 5-key\n// structure -- which lines up exactly with the 5 real backend fields -- with corrected descriptions.\nconst GOVERNANCE_FIELDS = [\n ['join_approval', '进群验证', '开启后,他人申请加入群聊需群主或管理员同意'],\n ['mute_all', '全体禁言', '开启后,仅群主和管理员可以发言'],\n ['member_upload_files', '群成员文件上传', '关闭后,普通成员将无法上传群文件'],\n ['member_invite', '群成员邀请', '关闭后,仅群主和管理员可以邀请新成员进群'],\n ['member_private_chat', '群成员私信权限', '关闭后,不允许发送名片消息,且普通成员在群聊界面、群组信息内点击头像无反应。']\n];\n\nfunction Governance({topic, tinode, onToast}) {\n // Router page for AdminList/Muted/OwnerSelect/the avatar editor -- remounts (per GroupManagementView's\n // `key={view}` note) and reflashes its 5 toggles every time the user finishes one of those sub-tasks\n // and returns, so this is one of the highest-traffic pages in the file.\n const [gov, setGov] = React.useState(() => (topic && readCachedData('group-governance:' + topic)) || null);\n const [dissolving, setDissolving] = React.useState(false);\n const [loadError, setLoadError] = React.useState(false);\n React.useEffect(() => {\n if (!topic) return;\n setGov(readCachedData('group-governance:' + topic) || null);\n getGroupGovernance(topic).then(d => { writeCachedData('group-governance:' + topic, d); setGov(d); }).catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n const setField = (key, value) => {\n // GET .../governance does return a real `version` (confirmed live) -- omitting it here isn't\n // just \"no version sent\", the server-side UPDATE for this endpoint skips its optimistic-lock\n // WHERE clause entirely whenever version<=0, so two admins toggling different switches at\n // nearly the same time would have the second write silently clobber the first with no conflict\n // signal. Sending the version this page already has on hand costs nothing and closes that gap.\n updateGroupGovernance(topic, {[key]: value, version: gov ? gov.version : 0}).then(data => { writeCachedData('group-governance:' + topic, data); setGov(data); })\n .catch(err => onToast(err.message || '设置失败'));\n };\n const dissolve = () => {\n if (!window.confirm('解散后群聊将无法恢复,确定要解散该群聊吗?')) return;\n const t = tinode ? tinode.getTopic(topic) : null;\n if (!t) return;\n setDissolving(true);\n t.delTopic(true).then(() => { onToast('群聊已解散'); navigate('group-list'); })\n .catch(err => onToast(err.message || '解散失败')).finally(() => setDissolving(false));\n };\n if (!gov) return {loadError ? '群组管理加载失败' : '加载中…'}
;\n return \n
\n
\n navigate('group-avatar', topic)}>设置群头像 chevron_right \n \n navigate('group-join-requests', topic)}>邀请进群申请 chevron_right \n navigate('group-muted', topic)}>禁言的群成员 chevron_right \n navigate('group-admins', topic)}>设置管理员 chevron_right \n navigate('group-owner-select', topic)}>群主管理权转让 chevron_right \n \n {GOVERNANCE_FIELDS.map(([key, label, desc]) => \n {label} {desc} \n setField(key, v)} />\n
)} \n 解散群组 \n \n
;\n}\n\nfunction deriveOwnerAndAdmins(items) {\n return {owner: items.find(m => m.role === 'owner') || null, admins: items.filter(m => m.role === 'admin')};\n}\n\nfunction AdminList({topic, onToast}) {\n // Shares the same 'group-members:'+topic cache entry as GroupSettings' member strip and\n // GroupManagementView's `myRole` lookup -- all three call the identical unfiltered getGroupMembers.\n const cachedMembers = topic && readCachedData('group-members:' + topic);\n const seed = cachedMembers ? deriveOwnerAndAdmins(cachedMembers) : {owner: null, admins: null};\n const [owner, setOwner] = React.useState(() => seed.owner);\n const [admins, setAdmins] = React.useState(() => seed.admins);\n const [toast, setToast] = React.useState('');\n const [loadError, setLoadError] = React.useState(false);\n const load = React.useCallback(() => {\n if (!topic) return;\n const cached = readCachedData('group-members:' + topic);\n if (cached) { const d = deriveOwnerAndAdmins(cached); setOwner(d.owner); setAdmins(d.admins); }\n // Fetch the unfiltered member list rather than {role:'admin'} + a separate per-user profile lookup\n // for the owner -- GET /users/{id}/profile 400s (\"malformed request\", field \"user_id\") when {id} is\n // the caller's own uid, which broke this whenever the viewer is themselves the group's owner.\n // Members cap out at 30/page against a 128-member group limit -- an admin sitting past page 1\n // used to vanish from this list entirely rather than the list just being incomplete.\n fetchAllPages(cursor => getGroupMembers(topic, {cursor})).then(items => {\n writeCachedData('group-members:' + topic, items);\n const d = deriveOwnerAndAdmins(items);\n setOwner(d.owner);\n setAdmins(d.admins);\n }).catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n React.useEffect(() => { load(); }, [load]);\n const remove = userId => {\n deleteGroupAdmin(topic, userId).then(() => { setToast('管理员已移除'); load(); })\n .catch(err => onToast(err.message || '操作失败'));\n };\n return ;\n}\n\n// 参考图 群聊设置.png 里\"群成员\"标题行是可点的(\"查看{N}群成员 >\"),但 GroupSettings 一直没有\n// 对应的落地页——群成员超过预览网格的9人就完全看不到其余成员。复用 MemberPicker 已经在用的\n// 字母分组+搜索逻辑,去掉多选/提交,只读展示每个人的角色。\nfunction GroupMembers({topic, onToast}) {\n const [members, setMembers] = React.useState(() => (topic && readCachedData('group-members:' + topic)) || null);\n const [query, setQuery] = React.useState('');\n const [loadError, setLoadError] = React.useState(false);\n React.useEffect(() => {\n if (!topic) return;\n fetchAllPages(cursor => getGroupMembers(topic, {cursor})).then(items => {\n writeCachedData('group-members:' + topic, items);\n setMembers(items);\n }).catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n const visible = (members || []).filter(m => (m.group_nickname || m.display_name || '').includes(query));\n const groups = groupBy(visible, m => alphaInitial(m.group_nickname || m.display_name));\n const roleLabel = role => role === 'owner' ? '群主' : role === 'admin' ? '管理员' : '';\n return \n
\n
\n
\n {members === null ? {loadError ? '成员列表加载失败' : '加载中…'}
: groups.map(([letter, list]) => \n {letter}
\n {list.map(item => navigateToProfile(topic, item.user_id, item)}>\n {item.group_nickname || item.display_name} {roleLabel(item.role) ? {roleLabel(item.role)} : null} \n )}\n )}\n \n
;\n}\n\n// Shared alphabetically-grouped multi-select picker for admin-add / mute-add (same visual component,\n// three purposes, per docs/images/添加管理员.png vs .../添加管理员-设置成功(1).png which turned out to\n// actually be the mute-add variant of the identical layout).\nfunction MemberPicker({type, topic, onToast}) {\n const mute = type === 'mute-add';\n const back = mute ? 'group-muted' : 'group-admins';\n const [members, setMembers] = React.useState(null);\n const [selected, setSelected] = React.useState([]);\n const [query, setQuery] = React.useState('');\n const [toast, setToast] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n const [loadError, setLoadError] = React.useState(false);\n React.useEffect(() => {\n if (!topic) return;\n fetchAllPages(cursor => getGroupMembers(topic, {cursor, ...(mute ? {muteEligible: true} : {eligibleRole: 'admin'})}))\n .then(items => setMembers(items.filter(m => m.eligible !== false)))\n .catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic, mute]);\n const visible = (members || []).filter(m => (m.group_nickname || m.display_name || '').includes(query));\n const groups = groupBy(visible, m => alphaInitial(m.group_nickname || m.display_name));\n const toggle = id => setSelected(v => v.includes(id) ? v.filter(x => x != id) : v.concat(id));\n const done = () => {\n if (!selected.length || busy) return;\n setBusy(true);\n const call = mute ? muteGroupMembers(topic, selected.map(user_id => ({user_id}))) : addGroupAdmins(topic, selected);\n call.then(result => {\n // 两个批量接口的响应结构不一样,不能用同一套判定:\n // - 添加管理员 POST .../admins/batch 返回 succeeded[],每项带 ok/reason(im_http.go:5377-5392)\n // - 添加禁言 POST .../mutes 返回 {topic, items},只有成功的才进 items,\n // 非法 uid 会被静默 continue(im_http.go:5486-5488),根本没有 succeeded 字段\n // 原来两条路都读 succeeded,禁言那条恒为 undefined → failed 恒为空 → 不管实际成没成都弹\"设置成功\"。\n let failedCount;\n if (mute) {\n const done = (result && Array.isArray(result.items)) ? result.items.length : selected.length;\n failedCount = Math.max(selected.length - done, 0);\n } else {\n failedCount = (result && Array.isArray(result.succeeded)) ? result.succeeded.filter(s => !s.ok).length : 0;\n }\n setToast(failedCount ? `成功设置 ${selected.length - failedCount} 人,${failedCount} 人设置失败` : '设置成功');\n // 导航会让整棵子树重挂载、把 toast 一起销毁。原来 900ms 就跳走,而 CenterToast 的生命\n // 周期是 1400ms —— 参考图里那个「设置成功」实际上只闪一下就被截断,而且从不在目标列表页出现。\n window.setTimeout(() => navigate(back, topic), 1500);\n }).catch(err => onToast(err.message || '设置失败')).finally(() => setBusy(false));\n };\n return \n
\n
\n
\n {members === null ? {loadError ? '成员列表加载失败' : '加载中…'}
: groups.map(([letter, list]) => \n {letter}
\n {list.map(item => toggle(item.user_id)}>\n {item.group_nickname || item.display_name} \n \n {selected.includes(item.user_id) ? check : null}\n \n )}\n )}\n \n
setToast('')} />\n ;\n}\n\nfunction Muted({topic, onToast}) {\n const [items, setItems] = React.useState(() => (topic && readCachedData('group-muted:' + topic)) || null);\n // groupGovernancePayload's mute list only ever returns a flat user_id (no display_name field --\n // confirmed against the real backend struct), so without this it rendered raw ids like \"usr8x2kf9\"\n // instead of names. The full member roster already carries group_nickname/display_name for\n // everyone still in the group, and fetching it here is one extra request for the whole list\n // (not per-row), unlike JoinRequests' per-item getUserProfile lookup.\n const [names, setNames] = React.useState({});\n const [avatars, setAvatars] = React.useState({});\n const [loadError, setLoadError] = React.useState(false);\n const load = React.useCallback(() => {\n if (!topic) return;\n fetchAllPages(cursor => getGroupMutes(topic, cursor)).then(list => {\n writeCachedData('group-muted:' + topic, list);\n setItems(list);\n }).catch(() => { onToast('加载失败'); setLoadError(true); });\n fetchAllPages(cursor => getGroupMembers(topic, {cursor})).then(items => {\n const map = {};\n const avatarMap = {};\n items.forEach(m => {\n map[m.user_id] = m.group_nickname || m.display_name || m.user_id;\n if (m.avatar_file_id) avatarMap[m.user_id] = {avatar_file_id: m.avatar_file_id};\n });\n setNames(map);\n setAvatars(avatarMap);\n }).catch(() => {});\n }, [topic]);\n React.useEffect(() => { setItems((topic && readCachedData('group-muted:' + topic)) || null); load(); }, [topic, load]);\n const unmute = userId => {\n unmuteGroupMember(topic, userId).then(() => { onToast('已解除禁言'); load(); })\n .catch(err => onToast(err.message || '操作失败'));\n };\n return ;\n}\n\nfunction OwnerSelect({topic, onToast}) {\n const [members, setMembers] = React.useState(null);\n const [query, setQuery] = React.useState('');\n const [target, setTarget] = React.useState(null);\n // 后端 serveIMGroupOwnerTransfer 只认 {target_user_id, version},没有任何二次验证/action_token\n // 机制(跟青少年模式关闭那种真的会被服务端拒绝的场景不一样)。群主转让同样不可逆、后果同样\n // 重大,照抄本项目已有的处理这类\"后端没有二次验证但操作本身很危险\"场景的方式——见\n // personal-settings-view.jsx 的 DeleteAccountConfirm:加一步前端自己的密码输入门槛,不追加到\n // 请求体、不指望服务端校验它,只是让\"手滑点确定\"变成需要多一步真实操作才会发生的事。\n const [passwordStep, setPasswordStep] = React.useState(false);\n const [password, setPassword] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n const [loadError, setLoadError] = React.useState(false);\n React.useEffect(() => {\n if (!topic) return;\n fetchAllPages(cursor => getGroupMembers(topic, {cursor, eligibleRole: 'owner'}))\n .then(items => setMembers(items.filter(m => m.eligible !== false)))\n .catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n const visible = (members || []).filter(m => (m.group_nickname || m.display_name || '').includes(query));\n const admins = visible.filter(m => m.role === 'admin');\n const others = visible.filter(m => m.role !== 'admin');\n const reset = () => { setTarget(null); setPasswordStep(false); setPassword(''); };\n const confirm = () => {\n if (!password) { onToast('请输入密码以确认'); return; }\n if (busy || !target) return;\n setBusy(true);\n // transferGroupOwner's `version` param was never supplied here, so the optimistic-lock WHERE\n // clause on the backend's UPDATE was silently skipped (version<=0) -- this is the single most\n // consequential owner-transfer call in the app having zero protection against a concurrent\n // transfer. Fetch the live group version right before the irreversible call rather than trusting\n // any value this page might have cached earlier in its lifetime.\n getGroup(topic).then(group => transferGroupOwner(topic, target.user_id, group.version))\n .then(() => { onToast('群主已转让'); navigate('group-governance', topic); })\n .catch(err => onToast(err.message || '转让失败')).finally(() => setBusy(false));\n };\n const row = item => setTarget(item)}>\n {item.group_nickname || item.display_name} \n ;\n return \n
\n
\n
\n {members === null ? {loadError ? '成员列表加载失败' : '加载中…'}
: <>\n {admins.length ? <>管理员
{admins.map(row)}> : null}\n {others.length ? <>群成员
{others.map(row)}> : null}\n >}\n \n {target && !passwordStep ?
\n 选择新群主 \n {target.group_nickname || target.display_name}成为新群主,确定后你将立即失去群主身份
\n setPasswordStep(true)}>确定 \n 取消 \n : null}\n {target && passwordStep ?
: null}\n
;\n}\n\nconst FILE_TYPE_META = {\n image: ['image', '#3ba55c'], video: ['videocam', '#3b82c4'], audio: ['audiotrack', '#8b5cf6'],\n document: ['description', '#e05d44'], file: ['insert_drive_file', '#8a8f98']\n};\n\nfunction GroupFiles({topic, tinode, onToast}) {\n const [queryInput, setQueryInput] = React.useState('');\n const query = useDebouncedValue(queryInput, 300);\n const [files, setFiles] = React.useState(() => (topic && readCachedData('group-files:' + topic)) || null);\n const [menuOpen, setMenuOpen] = React.useState(false);\n const [uploading, setUploading] = React.useState(null);\n const [loadError, setLoadError] = React.useState(false);\n // groupFilePayload 只给 uploader_id、不给昵称(im_http.go:6532-6559),原来直接把裸 user_id\n // 显示在\"来自\"位置。跟 Muted 页一样,拉一次成员表交叉引用出可读的名字。\n const [uploaderNames, setUploaderNames] = React.useState({});\n const inputRefs = {file: React.useRef(null), image: React.useRef(null), video: React.useRef(null)};\n // 搜索框文案承诺\"搜索文件名或者上传者\",但服务端 ListFiles 的 `q` 只匹配文件名(上传者昵称\n // 这类展示用的名字根本不在服务端索引里,是前端自己拿 getGroupMembers 交叉查出来的)——如果把\n // query 传给服务端,按上传者名字搜索永远是静默的空结果。改成服务端只拿全量列表(本来文件数量\n // 就不大,也没有任何\"加载更多\"分页UI),文件名/上传者两个维度都在本地用已有的 uploaderNames\n // 表一起过滤,让搜索框真正兑现自己的文案。\n const load = React.useCallback(() => {\n if (!topic) return;\n getGroupFiles(topic, {}).then(data => {\n const items = data.items || [];\n writeCachedData('group-files:' + topic, items);\n setFiles(items);\n }).catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n React.useEffect(() => { load(); }, [load]);\n React.useEffect(() => {\n if (!topic) return;\n getGroupMembers(topic).then(data => {\n const map = {};\n (data.items || []).forEach(m => { map[m.user_id] = m.group_nickname || m.display_name || m.user_id; });\n setUploaderNames(map);\n }).catch(() => {});\n }, [topic]);\n const visibleFiles = React.useMemo(() => {\n const all = files || [];\n const q = query.trim().toLowerCase();\n if (!q) return all;\n return all.filter(f => (f.file_name || '').toLowerCase().includes(q) ||\n (uploaderNames[f.uploader_id] || '').toLowerCase().includes(q));\n }, [files, query, uploaderNames]);\n const usedBytes = (files || []).reduce((sum, f) => sum + (f.file_size || 0), 0);\n const pick = kind => { setMenuOpen(false); inputRefs[kind].current && inputRefs[kind].current.click(); };\n const onFile = e => {\n const file = e.target.files && e.target.files[0];\n e.target.value = '';\n if (!file || !tinode) return;\n setUploading({name: file.name, progress: 0});\n uploadLargeFile(tinode, file, frac => setUploading(u => u ? {...u, progress: Math.round(frac * 100)} : u))\n .then(({fileId}) => addGroupFile(topic, {fileId, fileName: file.name, mimeType: file.type, fileSize: file.size}))\n .then(() => { setUploading(null); load(); })\n .catch(err => { setUploading(null); onToast(err.message || '上传失败'); });\n };\n const remove = fileId => {\n deleteGroupFile(topic, fileId).then(() => load()).catch(err => onToast(err.message || '删除失败'));\n };\n const gb = n => (n / (1024 ** 3)).toFixed(2);\n return ;\n}\n\n// 名字叫 bytesToGB 却只输出到 MB —— 1.4GB 的文件会显示成 \"1433.6 MB\"。补上 GB 档。\nfunction bytesToGB(bytes) {\n if (!bytes) return '0 KB';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n if (bytes < 1024 * 1024 * 1024) return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n return (bytes / (1024 * 1024 * 1024)).toFixed(2) + ' GB';\n}\n\n// 标题\"群昵称\"是参考图 设置昵称(1).png 本身的用词(不是笔误)——虽然编辑的其实是 group.name\n// 这个所有人都看得到的真实群名,跟 MyNicknameEditor(\"我在本群的昵称\",个人在群内的显示名,\n// 完全不同的字段)概念上容易混,但这是设计稿明确画出来的文案,不是代码猜的,不要改。\nfunction GroupNameEditor({topic, onToast}) {\n const [group, setGroup] = React.useState(null);\n const [value, setValue] = React.useState('');\n React.useEffect(() => { if (topic) getGroup(topic).then(g => { setGroup(g); setValue(g.name); }).catch(() => onToast('加载失败')); }, [topic]);\n const save = () => {\n if (!value.trim()) return;\n updateGroup(topic, {name: value.trim(), version: group ? group.version : 0}).then(() => {\n onToast('保存成功'); window.setTimeout(() => navigate('group-profile', topic), 600);\n }).catch(err => onToast(err.message || '保存失败'));\n };\n return \n \n setValue(e.target.value)} />{value.length}/11 \n
;\n}\n\nfunction GroupDescriptionEditor({topic, onToast}) {\n const [group, setGroup] = React.useState(null);\n const [value, setValue] = React.useState('');\n React.useEffect(() => { if (topic) getGroup(topic).then(g => { setGroup(g); setValue(g.description || ''); }).catch(() => onToast('加载失败')); }, [topic]);\n const publish = () => {\n updateGroup(topic, {description: value.trim(), version: group ? group.version : 0}).then(() => {\n onToast('保存成功'); window.setTimeout(() => navigate('group-profile', topic), 600);\n }).catch(err => onToast(err.message || '保存失败'));\n };\n return \n \n \n {/* 上限跟后端硬限对齐(im_http.go:4667 超过 200 rune 直接 400 field=description)。\n 参考图标的是 0/225,但那个数字后端不接受——按 225 放行会让用户写满再被服务端打回。 */}\n setValue(e.target.value)} />\n {value.length}/200 \n \n
;\n}\n\n// \"我在本群的昵称\" has no dedicated reference screenshot (see plan notes) -- placed in GroupSettings,\n// governed by the real member_invite... no, by the group_nickname field on groupMemberPayload, gated by\n// the \"群成员修改昵称\" concept the images described (server-side enforcement, not re-checked client-side).\nfunction MyNicknameEditor({topic, onToast}) {\n const [value, setValue] = React.useState('');\n // getGroupMembers' list items never include group_nickname (confirmed live) -- only\n // GET .../members/me/profile actually returns it, same fix as GroupProfile's preview row above.\n React.useEffect(() => {\n if (!topic) return;\n getMyGroupProfile(topic).then(data => setValue(data.nickname || '')).catch(() => {});\n }, [topic]);\n const save = () => {\n updateMyGroupProfile(topic, value.trim(), 0).then(() => {\n onToast('保存成功'); window.setTimeout(() => navigate('group-settings', topic), 600);\n }).catch(err => onToast(err.message || '保存失败'));\n };\n return \n \n setValue(e.target.value)} />群昵称仅在当前群内显示。 \n
;\n}\n\nexport default function GroupManagementView({view, hashParams, myUserId, tinode, onTopicSelected}) {\n const [toast, setToast] = React.useState('');\n const topic = hashParams && hashParams.topic;\n // This container remounts on every navigation step inside the feature (see `key={view}` in\n // sidepanel-view.jsx), and Announcement's edit/publish UI is gated on this role -- uncached, that\n // gate visibly flickers off and back on every time the announcement page (or any sibling page) is\n // opened. Also warms the same shared 'group-members:'+topic entry GroupSettings/AdminList use.\n const roleCacheKey = topic && myUserId ? `group-my-role:${topic}:${myUserId}` : null;\n const [myRole, setMyRole] = React.useState(() => (roleCacheKey && readCachedData(roleCacheKey)) || null);\n React.useEffect(() => {\n if (!topic || !myUserId) { setMyRole(null); return; }\n const key = `group-my-role:${topic}:${myUserId}`;\n setMyRole(readCachedData(key) || null);\n // Used to look this up by paginating the full member list and finding myUserId in it (30/page\n // against a 128-member cap) -- a real owner/admin sitting past page 1 read back as `null`,\n // silently hiding every governance affordance gated on this value. getGroup's own `my_role`\n // (already relied on elsewhere, e.g. the disband-group guard above) isn't paginated at all --\n // it's always exactly \"me\", so this no longer needs the member list at all.\n getGroup(topic).then(group => {\n const role = group ? group.my_role : null;\n writeCachedData(key, role);\n setMyRole(role);\n }).catch(() => {});\n }, [topic, myUserId]);\n let content;\n if (view === 'group-list' || view === 'group-empty') content = ;\n else if (['group-invite', 'group-events', 'group-new-request', 'group-announcement', 'group-summary', 'group-role-message'].includes(view)) content = ;\n else if (view === 'group-join-requests') content = ;\n else if (view === 'group-announcement-detail') content = ;\n else if (view === 'group-settings') content = ;\n else if (view === 'group-profile') content = ;\n else if (view === 'group-avatar') content = ;\n else if (view === 'group-nickname') content = ;\n else if (view === 'group-description') content = ;\n else if (view === 'group-my-nickname') content = ;\n else if (view === 'group-members') content = ;\n else if (view === 'group-qr') content = ;\n else if (view === 'group-governance') content = ;\n else if (['group-admins', 'group-admin-success', 'group-admin-partial', 'group-admin-removed'].includes(view)) content = ;\n else if (view === 'group-admin-add') content = ;\n else if (view === 'group-mute-add') content = ;\n else if (view === 'group-muted') content = ;\n else if (['group-owner-select', 'group-owner-confirm'].includes(view)) content = ;\n else content = ;\n return <>{content} setToast('')} />>;\n}\n","// Login form.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nexport default class LoginView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n login: props.login,\n password: '',\n hostName: props.serverAddress,\n saveToken: props.persist\n };\n this.handleLoginChange = this.handleLoginChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleToggleSaveToken = this.handleToggleSaveToken.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n handleLoginChange(e) {\n this.setState({login: e.target.value});\n }\n\n handlePasswordChange(e) {\n this.setState({password: e.target.value});\n }\n\n handleToggleSaveToken() {\n this.props.onPersistenceChange(!this.state.saveToken);\n this.setState({saveToken: !this.state.saveToken});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onLogin(this.state.login.trim(), this.state.password.trim());\n }\n\n render() {\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n\n return (\n \n \n {\n (login_prompt) => \n }\n \n \n {\n (password_prompt) => \n }\n \n \n \n \n \n \n
\n \n );\n }\n};\n","import React from 'react';\nimport { Tinode } from 'tinode-sdk';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { getBootstrap, getRealnameStatus, getSystemNotifications, markSystemNotificationRead } from '../lib/im-api.js';\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { useCachedData } from '../lib/use-cached-data.js';\nimport { topicDisplayName } from '../lib/utils.js';\n\n// Must go through setUrlSidePanel (not a bare navigateTo(view), which replaces the whole hash) so\n// switching panels from \"messages-home\" doesn't silently drop path[1] -- the currently open\n// conversation topic, which coexists with this panel in the split view once a chat is selected.\n// `topic` 可选:系统消息里的群事件通知需要带着群 topic 跳进对应群聊设置页,写法与\n// group-management-view.jsx 的同名辅助函数保持一致(不带 topic 时显式清掉,避免把上一个页面\n// 残留的 topic 参数带进不相关的页面)。\nconst navigate = (view, topic) => {\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, view);\n hash = topic ? HashNavigation.addUrlParam(hash, 'topic', topic) : HashNavigation.removeUrlParam(hash, 'topic');\n HashNavigation.navigateTo(hash);\n};\n\n// Was a hardcoded FREQUENT_CONTACTS mock (5 fake names, always clicking through to the same\n// direct-message-view.jsx demo regardless of which avatar was tapped -- confirmed independently by\n// a user screenshot showing every contact opening the identical \"接语彤\" script). Real \"frequently\n// contacted\" data doesn't exist as its own bootstrap field, so this derives it from the same\n// `chatList` the conversation list below already uses: P2P topics only (a \"people you talk to\" rail\n// isn't the place for groups), most-recently-touched first.\nfunction frequentContacts(chatList) {\n if (!chatList || chatList.length === 0) return [];\n return chatList\n .filter(item => item.topic && Tinode.isP2PTopicName(item.topic))\n .slice()\n .sort((a, b) => new Date(b.touched || 0).getTime() - new Date(a.touched || 0).getTime())\n .slice(0, 8)\n .map(item => ({\n id: item.topic,\n name: (item.public && item.public.fn) || '未命名',\n avatar: makeImageUrl(item.public && item.public.photo),\n online: !!item.online\n }));\n}\n\n// Matches docs/images/消息页面—长按弹出.png exactly (9 items, in this order -- no \"编辑\" despite\n// bootstrap.message_policy.supported_actions listing it; the mock predates that field and the\n// prototype just doesn't surface an edit action here). 'recall' is gated against supported_actions\n// (server/im_http.go serveIMBootstrap); favorite/forward/translate/select are pure client affordances.\nconst MESSAGE_ACTIONS = [\n {id: 'quote', icon: 'format_quote', label: '引用'},\n {id: 'copy', icon: 'content_copy', label: '复制'},\n {id: 'favorite', icon: 'inventory_2', label: '收藏'},\n {id: 'translate', icon: 'translate', label: '翻译'},\n {id: 'forward', icon: 'reply', label: '转发'},\n {id: 'recall', icon: 'undo', label: '撤回', gated: true},\n {id: 'delete', icon: 'delete_outline', label: '删除', gated: true},\n {id: 'select', icon: 'select_all', label: '多选'},\n // Not in bootstrap.message_policy.supported_actions at all (that list only covers 'recall' for the\n // sender's own message) -- left ungated like the other pure client affordances above.\n {id: 'group_recall', icon: 'restart_alt', label: '群撤回'}\n];\n\nfunction Icon({children}) {\n return {children} ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2200);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\nfunction Avatar({item, small = false}) {\n // The tone modifier is namespaced ('tone-orange', not 'orange') because base.css's original\n // Tinode styles already define bare `.orange`/`.green`/`.blue` as generic `color: ... !important`\n // text-color utility classes -- an unprefixed tone class collides with those and, since\n // `!important` beats any selector this component could use to fight back, silently overrides the\n // intended white icon-on-tint background to whatever that generic utility's text color is (this is\n // exactly why the default/no-tone case rendered an invisible blue-on-blue icon: 'blue' is one of\n // the collision names).\n const className = 'messages-avatar ' + (small ? 'small ' : '') + 'tone-' + (item.tone || 'blue');\n return \n {item.avatar ?
:
{item.icon || 'person'} }\n {item.online !== undefined ?
: null}\n
;\n}\n\n// A chat list row needs a one-line summary even when the latest message isn't plain text. This is a\n// plain-Chinese equivalent of lib/formatters.js's previewFormatter (which needs react-intl wired in,\n// inconsistent with this file's all-hardcoded-Chinese mock strings) -- just enough to label the\n// message by Drafty entity type for a conversation list preview.\nfunction draftyPreview(content) {\n if (typeof content === 'string' || content == null) return content || '';\n if (Array.isArray(content.ent) && content.ent.length) {\n const label = {IM: '[图片]', VD: '[视频]', AU: '[语音]', EX: '[文件]', TC: '[名片]', VC: '[通话]'}[content.ent[0].tp];\n if (label) return label;\n }\n return content.txt || '[消息]';\n}\n\nfunction formatConversationTime(ts) {\n if (!ts) return '';\n const date = new Date(ts);\n const now = new Date();\n const startOfDay = d => new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n const days = Math.round((startOfDay(now) - startOfDay(date)) / 86400000);\n const hhmm = () => date.toLocaleTimeString('zh-CN', {hour: '2-digit', minute: '2-digit'});\n if (days === 0) return hhmm();\n // 参考图 docs/images/消息.png 里昨天的会话显示的是\"昨天21:03\",带具体时间,不是只有\"昨天\"\n if (days === 1) return '昨天' + hhmm();\n if (days < 7) return ['周日', '周一', '周二', '周三', '周四', '周五', '周六'][date.getDay()];\n return date.toLocaleDateString('zh-CN', {month: 'numeric', day: 'numeric'});\n}\n\n// 参考图 系统消息.png 的时间格式是\"6月28日 10:04\"——不带年份、中文月日、不带秒。原来直接用\n// toLocaleString('zh-CN') 默认格式,会输出\"2026/8/20 18:04:00\"(带年份、斜杠、秒),跟设计不符。\nfunction formatNotificationTime(ts) {\n const d = new Date(ts);\n const hh = String(d.getHours()).padStart(2, '0');\n const mm = String(d.getMinutes()).padStart(2, '0');\n return `${d.getMonth() + 1}月${d.getDate()}日 ${hh}:${mm}`;\n}\n\n// Entries (system messages / file assistant) come from bootstrap.entries and are always shown --\n// unlike the old mock, they don't disappear once the user has real conversations (that was a bug).\nfunction entryConversations(bootstrap) {\n if (!bootstrap || !bootstrap.entries) return [];\n const list = [];\n const sys = bootstrap.entries.system_messages;\n if (sys && sys.enabled) {\n // Matches docs/images/消息.png (\"最新公告\"). bootstrap doesn't carry a preview of the latest\n // notification, so this is a static label like the rest of that screenshot's demo content.\n list.push({id: 'system', title: '系统消息', summary: '最新公告', icon: 'notifications', tone: 'orange',\n system: true, unread: sys.unread_count || 0});\n }\n const files = bootstrap.entries.file_assistant;\n if (files && files.enabled) {\n list.push({id: 'files', title: '文件助手', summary: '你上传1份文件', icon: 'folder', tone: 'green',\n fileAssistant: true, topic: files.topic, unread: files.unread_count || 0});\n }\n return list;\n}\n\nfunction normalizeConversations(chatList, myUserId) {\n if (!chatList || chatList.length === 0) return [];\n return chatList.map((item, index) => {\n const latest = typeof item.latestMessage === 'function' ? item.latestMessage() : null;\n let summary = item.private && item.private.comment ? item.private.comment : '暂无消息';\n if (latest) summary = draftyPreview(latest.content);\n if (latest && latest.from === myUserId) summary = '我:' + summary;\n const isGroup = typeof item.topic === 'string' && item.topic.startsWith('grp');\n return {\n id: item.topic || item.user || String(index),\n title: topicDisplayName(item.topic, item.public, '未命名会话'),\n summary,\n time: formatConversationTime(item.touched),\n unread: Math.max(Number(item.unread) || 0, 0),\n // 真实头像:跟同文件 frequentContacts() 一样从 public.photo 取,原来漏了这一项,\n // 导致会话列表每一行都只能落到下面的兜底图标,永远显示不出头像。\n avatar: makeImageUrl(item.public && item.public.photo),\n // 没有真实头像时的兜底图标要区分群聊和单聊,否则群聊也画成单人像,列表里分不出哪条是群\n icon: isGroup ? 'group' : 'person',\n // 在线状态只对单聊有意义:群不存在\"在线\",传 undefined 让 Avatar 不渲染那个状态点\n online: isGroup ? undefined : !!item.online,\n muted: !!(item.acs && item.acs.isMuted && item.acs.isMuted()),\n // 原来读的是 item.pinned——这个键在原生订阅对象上根本不存在,永远 undefined,置顶开关点了\n // 会话列表从来没有过任何视觉变化。真实存放位置是 subscription 原生 private.pinned 字段,\n // 但只对**群聊**成立:group-management-view.jsx 的置顶走 updateGroupMemberSettings ->\n // serveIMGroupMemberSettings,服务端确实写的是 Subs.Private,随原生 {meta} 同步下来(真实\n // 验证:开关点亮后要等下一次重连/刷新才会在这里体现——同一会话内没有实时 {pres} 通知去让\n // 已连接的这份 subscription 缓存失效,这是已知的、这次没有顺手解决的次要延迟,不是没生效)。\n // contact-management-view.jsx 的单聊置顶走的是完全不同的 updateConversationSettings ->\n // serveIMConversationSettings,服务端存进独立的 im_conversation_settings 表,从不写入原生\n // Subs.Private——单聊置顶因此不管等多久重连都不会在这里出现,这是真实的后端架构缺口(没有\n // 批量查询会话设置的接口,前端也不可能为渲染一屏会话列表挨个按 topic 发请求),已记录到\n // 后端问题清单,不是这一行能修的。\n pinned: !!(item.private && item.private.pinned)\n };\n });\n}\n\nfunction BottomNavigation() {\n return \n navigate('workbench')}>dashboard 工作台 \n person 消息 \n ;\n}\n\nfunction QuickMenu({onClose, onAction, permissions}) {\n const actions = [\n {id: 'friends', icon: 'group', label: '朋友'},\n {id: 'profile', icon: 'person_outline', label: '我的'},\n {id: 'create-group', icon: 'add_comment', label: '创建群组', permission: 'create_group'},\n {id: 'add-friend', icon: 'person_add_alt', label: '添加好友', permission: 'user_search'},\n {id: 'scan', icon: 'qr_code_scanner', label: '扫一扫', permission: 'scan_qr'}\n ].filter(item => !item.permission || !permissions || permissions[item.permission] !== false);\n return \n
e.stopPropagation()} role=\"menu\">\n {actions.map(item => onAction(item)}>\n {item.icon} {item.label} \n )}\n
\n
;\n}\n\n// 1.10 实名认证提醒:docs/images/实名认证(安卓).png 显示的是不可跳过的强制态(单按钮\"去实名\n// 认证\",没有关闭/稍后处理)——但那张图对应的是 bootstrap.security.realname.required===true 这个\n// 分支,这个环境(以及目前后端唯一会返回的默认配置)实际是 required:false / allow_skip:true。\n// 照抄参考图做成完全关不掉的弹层,等于把\"实名认证目前是可选的\"这个真实配置,实现成挡住所有人的\n// 强制墙——所以按这两个字段分叉:允许跳过时加一个参考图没画但后端明确允许的关闭按钮;且遵守\n// remind_after,跳过后在这个时长内不重复弹(不是每次进消息首页都弹一次)。\nfunction parseRemindAfter(text) {\n const m = /^(\\d+)\\s*([hdm])$/i.exec(String(text || '').trim());\n if (!m) return 24 * 60 * 60 * 1000;\n const n = Number(m[1]);\n return m[2].toLowerCase() === 'd' ? n * 86400000 : m[2].toLowerCase() === 'h' ? n * 3600000 : n * 60000;\n}\n\nfunction RealnameReminderModal({allowSkip, onDismiss}) {\n return \n
e.stopPropagation()}>\n {allowSkip ?
close : null}\n
实名认证提醒 \n
根据国家法律法规要求,您需先进行实名认证才能使用该项 APP
\n
navigate('realname')}>去实名认证 \n
\n
;\n}\n\nfunction MessageHome({view, connected, chatList, myUserId, onTopicSelected, onOpenScanner}) {\n const [query, setQuery] = React.useState('');\n const [menuOpen, setMenuOpen] = React.useState(view === 'messages-menu');\n const [toast, setToast] = React.useState('');\n // Was `useState(null)` + its own effect -- refetched from scratch (blank entries/badges for a\n // beat) every time this component remounted, e.g. after a trip to another sidepanel and back.\n const [bootstrap] = useCachedData(myUserId ? 'bootstrap:' + myUserId : null, getBootstrap, [myUserId]);\n const offline = view === 'messages-offline' || (!!myUserId && connected === false);\n\n // \"置顶\" only ever changed a background tint (see the `pinned` comment inside\n // normalizeConversations) -- every other IM this product's users have used floats a pinned chat to\n // the top of the list and keeps it there, so a tint-only \"pin\" reads as broken even where the\n // underlying flag is genuinely correct (group chats). Array.prototype.sort is stable (guaranteed\n // since ES2019), so this only reorders pinned-vs-not and otherwise preserves chatList's own\n // ordering. Applied after normalizing, not to the concatenated list, so the two fixed system\n // entries (system_messages/file_assistant) -- which have no `pinned` concept at all -- stay\n // pinned to the very top the way they always have, ahead of even a pinned real conversation.\n const realConversations = normalizeConversations(chatList, myUserId)\n .sort((a, b) => (b.pinned ? 1 : 0) - (a.pinned ? 1 : 0));\n const conversations = entryConversations(bootstrap).concat(realConversations);\n const filtered = conversations.filter(item => `${item.title}${item.summary}`.toLowerCase().includes(query.trim().toLowerCase()));\n const frequent = frequentContacts(chatList);\n\n // bootstrap.security.realname carries required/allow_skip/remind_after, but -- confirmed live --\n // its handler (serveIMBootstrap) builds that block from a 4-field literal that never includes\n // submission_id, unlike the dedicated GET /security/realname endpoint (realNamePayload). The\n // dismissKey fix below depends on submission_id to tell two separate rejections apart; sourcing\n // `status` from bootstrap alone made that fix a no-op in practice (it always fell back to `status`,\n // reproducing the exact bug it was meant to fix). Fetching this separately, the same\n // useCachedData-with-retry way bootstrap itself is fetched, gets the real submission_id.\n const realnameMeta = bootstrap && bootstrap.security && bootstrap.security.realname;\n const [realnameStatus] = useCachedData(myUserId ? 'realname-status:' + myUserId : null, getRealnameStatus, [myUserId]);\n const [reminderDismissed, setReminderDismissed] = React.useState(false);\n // Keyed by submission_id (a new one is minted per resubmission, server/im_http.go's\n // realNamePayload/serveIMRealNameSubmissions), not just status -- two separate rejections both\n // report status:\"rejected\", and without something that actually changes between them, dismissing\n // the first would keep suppressing the reminder for a brand new rejection submitted and rejected\n // again within the same snooze window. Falls back to status for the states that never had a\n // submission (e.g. never-submitted \"unverified\", where there's only ever one such state anyway).\n const dismissKey = (myUserId && realnameStatus) ?\n `realname-reminder-dismissed:${myUserId}:${realnameStatus.submission_id || realnameStatus.status}` : null;\n let lastDismissedAt = 0;\n try { lastDismissedAt = dismissKey ? Number(localStorage.getItem(dismissKey) || 0) : 0; } catch (_) { /* ignore */ }\n const withinSnooze = lastDismissedAt > 0 && (Date.now() - lastDismissedAt) < parseRemindAfter(realnameMeta && realnameMeta.remind_after);\n const showRealnameReminder = !!realnameStatus && !reminderDismissed && !withinSnooze &&\n (realnameStatus.status === 'unverified' || realnameStatus.status === 'rejected');\n const dismissRealnameReminder = () => {\n if (dismissKey) { try { localStorage.setItem(dismissKey, String(Date.now())); } catch (_) { /* ignore */ } }\n setReminderDismissed(true);\n };\n\n const selectConversation = item => {\n if (item.system) {\n navigate('system-messages');\n } else if (item.fileAssistant && item.topic && onTopicSelected) {\n onTopicSelected(item.topic);\n } else if (chatList && chatList.length && onTopicSelected) {\n onTopicSelected(item.id);\n } else {\n navigate('chat-standard');\n }\n };\n\n const runQuickAction = item => {\n setMenuOpen(false);\n if (item.id === 'friends') return navigate('address-book');\n if (item.id === 'profile') return navigate('personal-center');\n if (item.id === 'create-group') return navigate('group-list');\n if (item.id === 'add-friend') return navigate('add-friend');\n if (item.id === 'scan' && onOpenScanner) return onOpenScanner();\n setToast(item.id === 'scan' ? '扫码功能暂不可用' : `${item.label}页面将在对应章节中提供`);\n };\n\n return \n
\n {offline ? 加载中
: 消息 }\n setMenuOpen(true)} aria-label=\"更多功能\">menu \n \n
\n search setQuery(e.target.value)} placeholder=\"搜索\" /> \n {frequent.length > 0 ? \n 常联系的人 \n \n {frequent.map(item =>
onTopicSelected && onTopicSelected(item.id)}>\n {item.name} \n )}\n
\n : null}\n \n {filtered.map(item => selectConversation(item)}>\n \n {item.title} {item.summary} \n {item.time} \n {item.unread ? {item.unread > 99 ? '99+' : item.unread} : item.muted ? notifications_off : null}\n \n )}\n {filtered.length === 0 ? : null}\n \n \n
\n {menuOpen ?
setMenuOpen(false)} onAction={runQuickAction} permissions={bootstrap && bootstrap.permissions} /> : null}\n setToast('')} />\n {showRealnameReminder ? : null}\n ;\n}\n\nfunction MessageActions() {\n const [visible, setVisible] = React.useState(true);\n const [toast, setToast] = React.useState('');\n const [selected, setSelected] = React.useState('');\n const [supportedActions, setSupportedActions] = React.useState(null);\n\n React.useEffect(() => {\n getBootstrap().then(data => setSupportedActions(data.message_policy && data.message_policy.supported_actions)).catch(() => {});\n }, []);\n\n // This screen is a static illustration of the long-press menu (not attached to a real message), so\n // there's no real (topic, seq) to act on -- the real wiring belongs in messages-view.jsx (chapter 4)\n // where an actual message exists. Here we only let the server's declared capabilities decide which\n // gated actions (recall/edit/delete) are worth showing at all.\n const actions = MESSAGE_ACTIONS.filter(item => !item.gated || !supportedActions || supportedActions.includes(item.id));\n\n const runAction = item => {\n setSelected(item.id);\n if (item.id === 'copy' && navigator.clipboard) {\n navigator.clipboard.writeText('明天上午十点开项目会,请准时参加。').catch(() => {});\n }\n setToast(`${item.label}操作已选择`);\n setVisible(false);\n };\n\n return \n
navigate('messages-home')} aria-label=\"返回\">arrow_back_ios_new 项目协作群 \n
\n 今天 10:24
\n {e.preventDefault(); setVisible(true);}}>明天上午十点开项目会,请准时参加。 \n {e.preventDefault(); setVisible(true);}}>收到,我会提前准备材料。 \n {selected ? 已选择:{MESSAGE_ACTIONS.find(item => item.id === selected).label}
: null}\n \n
mic_none 输入消息 sentiment_satisfied_alt add_circle_outline \n {visible ?
setVisible(false)}>\n
e.stopPropagation()} role=\"menu\">\n {actions.map(item => runAction(item)}>\n {item.label} {item.icon} \n )}\n
\n
: null}\n
setToast('')} />\n ;\n}\n\n// 系统通知的 summary 在多处后端代码里被直接填成机器码而不是人话:群事件统一写\n// summary=event.EventType(server/im_group_events.go:42-44,所有群事件共用 title=\"群聊动态\"),\n// 好友申请处理结果写 summary=status(server/im_http.go:5956 与 db/mysql/tenant_adapter.go:8643,8700,\n// 值就是 \"accepted\"/\"rejected\")。已记入后端问题清单,在后端给出可读文案之前前端按已知码兜底翻译。\nconst NOTIFICATION_TEXT = {\n 'group.member.joined': '有成员加入了群聊',\n 'group.member.left': '有成员退出了群聊',\n 'group.member.updated': '群成员资料有更新',\n 'group.mute.updated': '群禁言设置有变更',\n 'group.owner.transferred': '群主已转让',\n 'group.role.updated': '群成员角色有变更',\n 'group.settings.updated': '群设置有更新',\n accepted: '对方已通过你的好友申请',\n rejected: '对方拒绝了你的好友申请',\n // 新样本:security.risk.continue/cancel 事件的 summary 直接是 decision 字面量\n // \"continue\"/\"cancel\"(风险确认审计记录,见 im-api.js 的 confirmRiskChallenge),同样是机器码——\n // 两个 decision 枚举值只有一个\"continue\"曾被收录,\"cancel\"(第11章发消息前风险提示点\"取消发送\"\n // 产生)此前会直接把英文单词\"cancel\"展示在系统消息列表里。\n continue: '你确认继续了一次安全风险提示',\n cancel: '你取消了一次风险操作确认'\n};\n\nfunction systemNotificationText(item) {\n const summary = (item.summary || '').trim();\n // 只在查表命中时才替换。后端的 summary 有些确实是机器码(好友申请通过时是 \"accepted\"),\n // 但也有些就是真实数据——日报提醒的 summary 是纯日期字符串\n // (db/mysql/tenant_adapter.go:4917 传 date.Format(\"2006-01-02\")),会议通知的 summary 是会议标题。\n // 一旦按\"看起来像机器码就吞掉\"来判断,这些真实内容会被换成一句无意义的兜底文案。\n const mapped = NOTIFICATION_TEXT[summary] || NOTIFICATION_TEXT[item.event_type];\n if (mapped) return mapped;\n return summary || '您有一条新的系统通知。';\n}\n\nfunction SystemMessages({authenticated}) {\n const [items, setItems] = React.useState([]);\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState('');\n const [toast, setToast] = React.useState('');\n\n React.useEffect(() => {\n getSystemNotifications().then(data => setItems(data.items || []))\n .catch(err => setError(err.message || '加载失败'))\n .finally(() => setLoading(false));\n }, []);\n\n const markRead = item => {\n if (item.read_at) return;\n setItems(list => list.map(i => i.id === item.id ? {...i, read_at: new Date().toISOString()} : i));\n markSystemNotificationRead(item.id).catch(() => {\n // Roll the optimistic update back on failure -- otherwise the \"new\" badge silently vanishes\n // even though the server never actually recorded this notification as read.\n setItems(list => list.map(i => i.id === item.id ? {...i, read_at: null} : i));\n });\n };\n\n return \n
{ if (!HashNavigation.goBack()) navigate('messages-home'); }} aria-label=\"返回\">arrow_back_ios_new 系统消息 \n
\n {loading ? hourglass_empty 加载中…
: null}\n {error ? error_outline {error}
: null}\n {!loading && !error && items.length === 0 ? notifications_none 暂无系统消息
: null}\n {items.map(item => markRead(item)}>\n {formatNotificationTime(item.created_at)} \n \n
{item.title} {!item.read_at ? 新 : null}\n
{systemNotificationText(item)}
\n {item.action && item.action.device ?
设备: {item.action.device} {item.action.ip ?
IP地址: {item.action.ip} : null} : null}\n {/* 入口按通知自身的 action 决定,不再对所有通知一律显示\"前往安全设置\"。注意 action.topic\n 不能直接当成群:好友申请类通知的 action 里带的是 p2p 会话 topic\n (db/mysql/tenant_adapter.go:8643),只有 grp 前缀才是真的群。都不匹配时不显示按钮,\n 避免把人导到跟这条通知无关的页面。\n 真实好友申请通知的 action 判断改用 event_type 而不是 action.type:实测\n GET /system-notifications 拿到的 friend.request.created 通知,action 里只有\n {user_id},从来没有 type 字段(当初写 action.type==='friend_request' 是凭对接文档\n 猜的,不是照真实响应写的)——导致\"查看新朋友\"按钮对这条最常见的通知永远不出现。 */}\n {item.action && typeof item.action.topic === 'string' && item.action.topic.startsWith('grp') ?\n
{ e.stopPropagation(); navigate('group-settings', item.action.topic); }}>查看群聊 chevron_right :\n item.event_type && item.event_type.startsWith('friend.request') ?\n
{ e.stopPropagation(); navigate('friend-requests'); }}>查看新朋友 chevron_right :\n item.action && (item.action.device || item.action.ip) ?\n
{ e.stopPropagation(); navigate(authenticated ? 'security' : 'identity-check'); }}>前往安全设置 chevron_right :\n null}\n
\n
\n )}\n \n
setToast('')} />\n ;\n}\n\nexport default function MessageCenterView(props) {\n switch (props.view) {\n case 'system-messages': return ;\n case 'message-actions': return ;\n case 'messages-offline':\n case 'messages-menu':\n case 'messages-home':\n default: return ;\n }\n}\n","import React from 'react';\n\nimport HashNavigation from '../lib/navigation.js';\n\nconst navigate = view => HashNavigation.navigateTo(view);\n\nexport const MESSAGE_COMPOSER_VIEWS = [\n 'compose-keyboard', 'mentions-select', 'mentions-complete', 'mentions-message',\n 'emoji-panel', 'emoji-message', 'voice-ready', 'voice-hold', 'voice-recording',\n 'media-uploading', 'media-gallery', 'media-retry', 'upload-file', 'file-message',\n 'message-multiselect', 'favorite-success', 'forward-select', 'forward-multiple',\n 'forward-individual', 'forward-bundle'\n];\n\nconst MEMBERS = [\n {id: 'all', name: '所有人', note: '提醒群内所有成员', avatar: 'campaign'},\n {id: 'annie', name: '安妮', note: '产品设计组', image: 'img/bkg/p09.jpg'},\n {id: 'lizi', name: '栗子来了', note: '前端开发组', image: 'img/bkg/p15.jpg'},\n {id: 'wang', name: '王珊珊', note: '市场运营组', image: 'img/bkg/p14.jpg'},\n {id: 'chen', name: '陈晨', note: '项目管理组', image: 'img/bkg/p05.jpg'}\n];\n\nconst TARGETS = [\n {id: 'file', name: '文件助手', note: '仅自己可见', icon: 'folder_special'},\n {id: 'team', name: '产品研发群', note: '18人', image: 'img/bkg/p22.jpg'},\n {id: 'annie', name: '安妮', note: '在线', image: 'img/bkg/p09.jpg'},\n {id: 'lizi', name: '栗子来了', note: '刚刚活跃', image: 'img/bkg/p15.jpg'},\n {id: 'wang', name: '王珊珊', note: '市场运营组', image: 'img/bkg/p14.jpg'}\n];\n\nconst EMOJIS = ['😀', '😄', '😂', '🥰', '😎', '🤔', '👍', '👏', '🎉', '❤️', '🔥', '💡', '✅', '🙏', '💪', '🌟', '📌', '🚀'];\n\nfunction Icon({children}) {\n return {children} ;\n}\n\nfunction Avatar({item}) {\n return \n {item.image ? : {item.icon || item.avatar || 'person'} }\n ;\n}\n\nfunction Header({title = '产品研发群', subtitle = '18人', onMore}) {\n return ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2000);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\nfunction VoiceBubble({mine = false, duration = 8, unread = false}) {\n return \n {!mine ?
: null}\n
\n graphic_eq {duration}″ {unread ? : null}\n \n {mine ?
: null}\n
;\n}\n\nfunction TextBubble({mine = false, children, selected, onSelect}) {\n return \n {selected !== undefined ?
{selected ? 'check' : ''} : null}\n
\n {!mine ?
: null}\n
{children}
\n {mine ?
: null}\n
\n
;\n}\n\nfunction ImageBubble({progress, failed = false, selected, onSelect}) {\n return \n {selected !== undefined ?
{selected ? 'check' : ''} : null}\n
\n
\n {progress < 100 || failed ?
{failed ? 'refresh' : 'cloud_upload'} {failed ? '上传失败,点击重试' : `${progress}%`} {!failed ?
: null}
: null}\n
\n
\n
\n
;\n}\n\nfunction VideoBubble() {\n return play_circle 00:24 ;\n}\n\nfunction FileBubble({progress = 100, name = '产品需求说明书.pdf', selected, onSelect}) {\n return \n {selected !== undefined ?
{selected ? 'check' : ''} : null}\n
PDF {name} 2.4 MB · {progress < 100 ? `上传中 ${progress}%` : '已发送'} {progress < 100 ?
: null}
{progress < 100 ? 'close' : 'download'} \n
;\n}\n\nfunction BaseTimeline({mode, uploadProgress, selected, toggleSelected}) {\n const selectable = mode === 'message-multiselect' || mode === 'favorite-success';\n return \n 今天 10:24
\n 上午的评审结论已经整理好了,大家有空看一下。 \n toggleSelected('text')}>好的,我补充一下交互细节。 \n {mode === 'mentions-message' ? @安妮 @栗子来了 下午三点一起确认新版流程。 : null}\n {['media-uploading', 'media-gallery', 'media-retry'].includes(mode) ? <>\n \n \n {mode === 'media-gallery' ? <> > : null}\n > : null}\n {['file-message', 'message-multiselect', 'favorite-success'].includes(mode) ? toggleSelected('file')} /> : null}\n {selectable ? toggleSelected('image')} /> : null}\n ;\n}\n\nfunction EmojiPanel({onEmoji, onDelete}) {\n return \n schedule sentiment_satisfied_alt favorite_border \n {EMOJIS.map(emoji => onEmoji(emoji)}>{emoji} )}
\n backspace \n ;\n}\n\nfunction Composer({mode, draft, setDraft, onSend, setMode}) {\n const voice = ['voice-ready', 'voice-hold', 'voice-recording'].includes(mode);\n const emoji = ['emoji-panel', 'emoji-message'].includes(mode);\n const keyDown = event => {\n if (event.key === '@' && mode !== 'mentions-message') window.setTimeout(() => navigate('mentions-select'), 0);\n };\n return <>\n {event.preventDefault(); onSend();}}>\n setMode(voice ? 'compose-keyboard' : 'voice-ready')} aria-label={voice ? '切换键盘' : '切换语音'}>{voice ? 'keyboard' : 'record_voice_over'} \n {voice ? setMode('voice-hold')} onPointerUp={() => setMode('media-uploading')}>按住说话 : setDraft(event.target.value)} onKeyDown={keyDown} placeholder=\"输入消息\" />}\n setMode(emoji ? 'compose-keyboard' : 'emoji-panel')} aria-label=\"表情\">sentiment_satisfied_alt \n {draft.trim() && !voice ? 发送 : navigate('upload-file')} aria-label=\"更多\">add_circle_outline }\n \n {emoji ? setDraft(draft + value)} onDelete={() => setDraft(draft.slice(0, -1))} /> : null}\n >;\n}\n\nfunction VoiceOverlay({cancel = false}) {\n return \n
{cancel ? 'delete_outline' : 'mic'} \n
{[2, 5, 8, 12, 9, 6, 11, 4].map((height, index) => )}
\n
{cancel ? '松开手指,取消发送' : '手指上滑,取消发送'} 00:08 \n
;\n}\n\nfunction MemberPicker({complete}) {\n const [query, setQuery] = React.useState('');\n const [selected, setSelected] = React.useState(complete ? ['annie', 'lizi'] : []);\n const visible = MEMBERS.filter(item => item.name.includes(query) || item.note.includes(query));\n const toggle = id => setSelected(values => values.includes(id) ? values.filter(value => value !== id) : values.concat(id));\n return \n
navigate('compose-keyboard')}>arrow_back_ios_new 选择提醒人 {sessionStorage.setItem('im-mentions', JSON.stringify(selected)); navigate('mentions-message');}}>完成{selected.length ? `(${selected.length})` : ''} \n
search setQuery(event.target.value)} placeholder=\"搜索群成员\" />\n
群成员
\n
{visible.map(item =>
toggle(item.id)}>{item.name} {item.note} {selected.includes(item.id) ? check : null} )}
\n
;\n}\n\nfunction UploadFilePage({onToast}) {\n const [files, setFiles] = React.useState([{name: '产品需求说明书.pdf', size: '2.4 MB', progress: 64}]);\n React.useEffect(() => {\n if (files.every(file => file.progress >= 100)) return undefined;\n const timer = window.setTimeout(() => setFiles(items => items.map(file => ({...file, progress: Math.min(100, file.progress + 6)}))), 300);\n return () => window.clearTimeout(timer);\n }, [files]);\n return ;\n}\n\nfunction ForwardPage({mode, onToast}) {\n const multi = mode !== 'forward-select';\n const confirm = mode === 'forward-individual' || mode === 'forward-bundle';\n const [selected, setSelected] = React.useState(() => {\n if (!confirm) return [];\n try {\n return JSON.parse(sessionStorage.getItem('im-forward-targets')) || ['team', 'annie'];\n } catch (_) {\n return ['team', 'annie'];\n }\n });\n const [query, setQuery] = React.useState('');\n const [comment, setComment] = React.useState('');\n const toggle = id => setSelected(values => values.includes(id) ? values.filter(value => value !== id) : multi ? values.concat(id).slice(0, 9) : [id]);\n const visible = TARGETS.filter(item => item.name.includes(query) || item.note.includes(query));\n return \n
navigate('message-multiselect')}>close {confirm ? (mode === 'forward-bundle' ? '合并转发' : '逐条转发') : '选择转发对象'} {!confirm ? navigate(multi ? 'forward-select' : 'forward-multiple')}>{multi ? '单选' : '多选'} : }\n {!confirm ? <>
search setQuery(event.target.value)} placeholder=\"搜索会话或联系人\" />最近会话
{visible.map(item =>
{toggle(item.id); if (!multi) {sessionStorage.setItem('im-forward-targets', JSON.stringify([item.id])); window.setTimeout(() => navigate('forward-individual'), 0);}}}>{item.name} {item.note} {selected.includes(item.id) ? check : null} )}
{multi ?
已选择 {selected.length}/9 个会话 {sessionStorage.setItem('im-forward-targets', JSON.stringify(selected)); navigate('forward-individual');}}>下一步 : null}> :
发送给 {TARGETS.filter(item => selected.includes(item.id)).map(item =>
{item.name} )}
{mode === 'forward-bundle' ? '产品研发群的聊天记录' : '将逐条发送 3 条消息'} 栗子来了:上午的评审结论已经整理好了
我:好的,我补充一下交互细节。
我:[图片]
setComment(event.target.value)} placeholder=\"给朋友留言\" /> navigate('forward-individual')}>逐条转发 navigate('forward-bundle')}>合并转发
{onToast(`已发送给 ${selected.length} 个会话`); window.setTimeout(() => navigate('chat-standard'), 900);}}>发送 }\n
;\n}\n\nexport default function MessageComposerView({view}) {\n const [mode, setMode] = React.useState(view);\n const [draft, setDraftState] = React.useState(() => sessionStorage.getItem('im-message-composer-draft') || (view === 'emoji-message' ? '收到啦 ' : ''));\n const [uploadProgress, setUploadProgress] = React.useState(view === 'media-uploading' ? 22 : 100);\n const [selected, setSelected] = React.useState(view === 'favorite-success' ? ['text', 'file', 'image'] : ['text', 'image']);\n const [toast, setToast] = React.useState(view === 'favorite-success' ? '已收藏 3 条消息' : '');\n const setDraft = value => {setDraftState(value); sessionStorage.setItem('im-message-composer-draft', value);};\n\n React.useEffect(() => {\n if (mode !== 'media-uploading' || uploadProgress >= 100) return undefined;\n const timer = window.setTimeout(() => setUploadProgress(value => Math.min(100, value + 5)), 350);\n return () => window.clearTimeout(timer);\n }, [mode, uploadProgress]);\n\n if (view === 'mentions-select' || view === 'mentions-complete') return ;\n if (view === 'upload-file') return <> setToast('')} />>;\n if (['forward-select', 'forward-multiple', 'forward-individual', 'forward-bundle'].includes(view)) return <> setToast('')} />>;\n\n const toggleSelected = id => setSelected(values => values.includes(id) ? values.filter(value => value !== id) : values.concat(id));\n const recording = mode === 'voice-hold' || mode === 'voice-recording';\n const multiselect = mode === 'message-multiselect' || mode === 'favorite-success';\n\n return \n
setToast('会话设置')} />\n {multiselect ? navigate('chat-standard')}>close 已选择 {selected.length} 条 setSelected(selected.length ? [] : ['text', 'file', 'image'])}>{selected.length ? '取消全选' : '全选'}
: null}\n \n {multiselect ? navigate('forward-select')}>forward 转发 {setMode('favorite-success'); setToast(`已收藏 ${selected.length} 条消息`);}}>bookmark_border 收藏 {setSelected([]); setToast('已删除所选消息');}}>delete_outline 删除 : {if (!draft.trim()) return; setToast('消息已发送'); setDraft('');}} />}\n {recording ? : null}\n setToast('')} />\n ;\n}\n","// Create new topic and invite users or send an invite.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from '../widgets/contact-list.jsx';\nimport NewTopicById from '../widgets/new-topic-by-id.jsx';\nimport NewTopicGroup from '../widgets/new-topic-group.jsx';\nimport SearchContacts from '../widgets/search-contacts.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { asEmail, asPhone, theCard } from '../lib/utils.js';\n\nconst messages = defineMessages({\n search_for_contacts: {\n id: \"search_for_contacts\",\n defaultMessage: \"Use search to find contacts\",\n description: \"Text shown in contacts view when user entered no search query.\"\n },\n search_no_results: {\n id: \"search_no_results\",\n defaultMessage: \"Search returned no results\",\n description: \"Text shown in contacts view when query returned no results.\"\n },\n search_placeholder: {\n id: \"search_placeholder\",\n defaultMessage: \"List like alice@example.com, +17025550003...\",\n description: \"Placeholder in contacts search field\"\n },\n});\n\nclass NewTopicView extends React.Component {\n constructor(props) {\n super(props);\n\n const urlParams = HashNavigation.parseUrlHash(window.location.hash).params;\n const initialTab = urlParams['tab'] || 'find';\n const initialQuery = initialTab == 'find' ? (urlParams['q'] || null) : null;\n\n this.state = {\n tabSelected: initialTab,\n searchQuery: initialQuery\n };\n\n this.handleTabClick = this.handleTabClick.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleSearchResultSelected = this.handleSearchResultSelected.bind(this);\n this.handleNewGroupSubmit = this.handleNewGroupSubmit.bind(this);\n this.handleGroupByID = this.handleGroupByID.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleTabClick(e) {\n e.preventDefault();\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'tab', e.currentTarget.dataset.id));\n this.setState({tabSelected: e.currentTarget.dataset.id});\n }\n\n handleSearchContacts(query) {\n query = query.trim() || Tinode.DEL_CHAR;\n if (!/[\\s,:]/.test(query) && query != Tinode.DEL_CHAR) {\n // No colons, spaces or commas, not DEL char. Try as email, phone, or alias.\n const email = asEmail(query);\n if (email) {\n query = `${Tinode.TAG_EMAIL}${email}`;\n } else {\n const tel = asPhone(query);\n if (tel) {\n query = `${Tinode.TAG_PHONE}${tel}`;\n } else {\n if (query[0] == '@') {\n // Strip the leading '@' sign if present.\n query = query.substring(1);\n }\n // 'alice' -> 'alias:alice,alice'\n query = `${Tinode.TAG_ALIAS}${query},${query}`;\n }\n }\n }\n this.props.onSearchContacts(query);\n this.setState({searchQuery: Tinode.isNullValue(query) ? null : query});\n }\n\n handleSearchResultSelected(topicName) {\n if (this.state.tabSelected == 'find') {\n HashNavigation.navigateTo(HashNavigation.removeUrlParams(window.location.hash, ['tab', 'q']));\n this.props.onCreateTopic(topicName);\n }\n }\n\n handleNewGroupSubmit(name, description, dataUrl, priv, tags, isChannel) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParams(window.location.hash, ['tab', 'q']));\n this.props.onCreateTopic(undefined,\n {public: theCard(name, dataUrl, null, description), private: priv, tags: tags}, isChannel);\n }\n\n handleGroupByID(topicName) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParams(window.location.hash, ['tab', 'q']));\n this.props.onCreateTopic(topicName);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const no_contacts_placeholder = formatMessage(this.state.searchQuery ?\n messages.search_no_results : messages.search_for_contacts);\n const search_placeholder = formatMessage(messages.search_placeholder);\n return (\n \n
\n {this.state.tabSelected === 'grp' ?\n
:\n\n this.state.tabSelected === 'byid' ?\n
:\n\n
\n \n \n
}\n
\n );\n }\n};\n\nexport default injectIntl(NewTopicView);\n","import React from 'react';\nimport QRCode from 'qrcodejs';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { useCachedData, readCachedData, writeCachedData } from '../lib/use-cached-data.js';\nimport { BASE_APP_NAME, LINK_CONTACT_US } from '../config.js';\nimport { PACKAGE_VERSION } from '../version.js';\nimport {\n getMeProfile, updateMeProfile, getFileUrl, uploadLargeFile,\n getMePrivacy, updateMePrivacy, getYouthMode, enableYouthMode, disableYouthMode, verifyIndependentPassword,\n createMyQRCode, getRealnameStatus\n} from '../lib/im-api.js';\n\nconst navigate = (view, params) => {\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, view);\n Object.entries(params || {}).forEach(([key, value]) => {\n hash = value ? HashNavigation.addUrlParam(hash, key, value) : HashNavigation.removeUrlParam(hash, key);\n });\n HashNavigation.navigateTo(hash);\n};\n\nexport const PERSONAL_SETTINGS_VIEWS = [\n 'personal-center', 'personal-profile', 'profile-nickname', 'profile-birth-date',\n 'profile-signature', 'profile-gender', 'profile-region', 'personal-qrcode', 'android-settings',\n 'cache-clear-confirm', 'clear-history-confirm', 'change-password', 'delete-account-confirm',\n 'app-version', 'privacy-settings', 'friend-discovery-settings',\n 'youth-mode-off', 'youth-mode-on', 'youth-mode-verify',\n 'notification-permission', 'permission-settings-reminder', 'camera-permission-info',\n 'microphone-permission-info'\n];\n\nfunction Icon({children}) { return {children} ; }\n\nfunction Header({title, back = 'personal-center', action, actionLabel, onAction, actionDisabled}) {\n return \n { if (!HashNavigation.goBack()) navigate(back); }} aria-label=\"返回\">arrow_back_ios_new \n {title} \n {action ? {actionLabel || action} : }\n ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2100);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\nfunction Toggle({checked, disabled, onChange}) {\n return onChange(!checked)}> ;\n}\n\nfunction MenuRow({icon, title, value, route, onClick, danger}) {\n return route && navigate(route))}>\n {icon ? {icon} : null}\n {title} {value ? {value} : null} \n {route || onClick ? chevron_right : null}\n ;\n}\n\n// docs/images/我的.png 的\"企业名称\"字段实际上是租户名,不是组织架构的部门 -- 复用 Ch.9 workbench\n// 已经验证过的读取方式(登录时 tenants/resolve 缓存进 localStorage['im-tenant'])。\nfunction tenantName() {\n try { return JSON.parse(window.localStorage.getItem('im-tenant') || '{}').name || ''; } catch (_) { return ''; }\n}\n\nfunction ImgFromFile({fileId, className}) {\n const [url, setUrl] = React.useState(null);\n React.useEffect(() => { let live = true; getFileUrl(fileId).then(u => live && setUrl(u)).catch(() => {}); return () => { live = false; }; }, [fileId]);\n return url ? : ;\n}\n\nfunction PersonalCenter() {\n // Was `useState(null)` + its own effect -- remounting this (e.g. tabbing back from 设置) blanked\n // the name/avatar back to the loading placeholder for a beat even though nothing had changed,\n // same \"switching pages feels like it reloads every time\" complaint this cache already fixed for\n // the workbench/message list/address book.\n const [profile] = useCachedData('me-profile', getMeProfile, []);\n return \n navigate('personal-profile')}>\n {profile && profile.avatar_file_id ? : person }\n {(profile && (profile.nickname || profile.public_account)) || '…'} \n 企业名称:{tenantName() || '…'} \n ID: {(profile && profile.public_account) || '…'} \n chevron_right \n \n \n \n ;\n}\n\n// docs/images/个人信息.png 两张截图字段不完全一样(一张有用户名/职位/公司,另一张有ID号/地区)--\n// 代码调研确认 /me/profile 真实字段只有 avatar/nickname/gender/birth_date/region/signature/email;\n// \"职位/公司\"属于第9章组织架构数据源(这里没有反查接口,不展示);\"ID号\"、\"用户名\"是原型臆造字段,\n// 后端没有对应概念(用户id恒为usrXXX格式),不做。\nfunction PersonalProfile({onToast, tinode}) {\n // Shares the 'me-profile' key with PersonalCenter's already-fixed cache -- this is the hub every\n // field editor below navigates back to on save, so it's revisited constantly.\n const [profile, setProfile] = React.useState(() => readCachedData('me-profile') || null);\n const fileInputRef = React.useRef(null);\n const [uploading, setUploading] = React.useState(false);\n\n const load = () => getMeProfile().then(p => { writeCachedData('me-profile', p); setProfile(p); }).catch(() => {});\n React.useEffect(() => { load(); }, []);\n\n const pickAvatar = () => fileInputRef.current && fileInputRef.current.click();\n const handleAvatarFile = event => {\n const file = event.target.files && event.target.files[0];\n event.target.value = '';\n if (!file || !tinode) return;\n setUploading(true);\n uploadLargeFile(tinode, file).then(({fileId}) => updateMeProfile({avatar_file_id: fileId, version: profile.version}))\n .then(load).then(() => onToast('头像已更新'))\n .catch(err => onToast(err.message || '头像上传失败')).finally(() => setUploading(false));\n };\n\n const genderLabel = {male: '男', female: '女', other: '其他'}[profile && profile.gender] || '未设置';\n\n return ;\n}\n\n// Real field_rules confirmed against server/im_http.go: nickname max_length=32, signature\n// max_length=120 -- the reference screenshots show 120/20 respectively (swapped and wrong),\n// mock code already had the right numbers by luck; kept here but sourced from a constant that\n// matches the server contract rather than the screenshots.\nconst FIELD_LIMITS = {nickname: 32, signature: 120};\n\nfunction TextEditor({field, multiline, title, onToast}) {\n const [profile, setProfile] = React.useState(null);\n const [value, setValue] = React.useState('');\n const [saving, setSaving] = React.useState(false);\n React.useEffect(() => { getMeProfile().then(p => { setProfile(p); setValue(p[field] || ''); }).catch(() => {}); }, [field]);\n\n const save = () => {\n const normalized = value.trim();\n if (field === 'nickname' && !normalized) { onToast('昵称不能为空'); return; }\n setSaving(true);\n updateMeProfile({[field]: normalized, version: profile.version}).then(_ => {\n onToast('资料已保存');\n window.setTimeout(() => navigate('personal-profile'), 500);\n }).catch(err => onToast(err.message || '保存失败')).finally(() => setSaving(false));\n };\n\n const maxLength = FIELD_LIMITS[field];\n return \n
\n
\n \n {multiline ?\n setValue(event.target.value)} /> :\n setValue(event.target.value)} />}\n {value.length}/{maxLength} \n {value ? setValue('')} aria-label=\"清空\">cancel : null}\n \n {field === 'nickname' ? '昵称将展示在联系人资料和聊天页面中' : '签名将展示在你的个人资料页'}
\n \n
;\n}\n\nfunction BirthDateEditor({onToast}) {\n const [profile, setProfile] = React.useState(null);\n const [value, setValue] = React.useState('');\n React.useEffect(() => { getMeProfile().then(p => { setProfile(p); setValue(p.birth_date || ''); }).catch(() => {}); }, []);\n const save = () => {\n updateMeProfile({birth_date: value, version: profile.version}).then(_ => {\n onToast('出生日期已保存');\n window.setTimeout(() => navigate('personal-profile'), 500);\n }).catch(err => onToast(err.message || '保存失败'));\n };\n const today = new Date().toISOString().slice(0, 10);\n return \n
\n
\n cake \n 选择出生日期 setValue(event.target.value)} /> \n 出生日期的可见范围由隐私设置决定
\n \n
;\n}\n\nconst GENDER_OPTIONS = [{value: 'male', label: '男'}, {value: 'female', label: '女'}, {value: 'other', label: '其他'}];\n\nfunction GenderEditor({onToast}) {\n const [profile, setProfile] = React.useState(null);\n React.useEffect(() => { getMeProfile().then(setProfile).catch(() => {}); }, []);\n const choose = value => {\n updateMeProfile({gender: value, version: profile.version}).then(_ => {\n onToast('性别已更新');\n window.setTimeout(() => navigate('personal-profile'), 400);\n }).catch(err => onToast(err.message || '保存失败'));\n };\n return \n {GENDER_OPTIONS.map(opt => choose(opt.value)} disabled={!profile}>\n {opt.label} {profile && profile.gender === opt.value ? check : null}\n )}\n
;\n}\n\nfunction RegionEditor({onToast}) {\n const [profile, setProfile] = React.useState(null);\n const [value, setValue] = React.useState('');\n React.useEffect(() => { getMeProfile().then(p => { setProfile(p); setValue(p.region || ''); }).catch(() => {}); }, []);\n const save = () => {\n updateMeProfile({region: value.trim(), version: profile.version}).then(_ => {\n onToast('地区已保存');\n window.setTimeout(() => navigate('personal-profile'), 500);\n }).catch(err => onToast(err.message || '保存失败'));\n };\n return \n \n setValue(event.target.value)} /> \n
;\n}\n\nfunction PersonalQr({onToast}) {\n // Same shared 'me-profile' key as PersonalCenter/PersonalProfile -- this only needs it for the\n // avatar/name display next to the code. `qr` itself is deliberately NOT cached: createMyQRCode()\n // mints/renews a signed code each call (POST semantics, not a GET), so seeding a stale payload\n // risks showing an already-superseded code that fails to scan -- worse than a brief spinner.\n const [profile, setProfile] = React.useState(() => readCachedData('me-profile') || null);\n const [qr, setQr] = React.useState(null);\n const qrRef = React.useRef(null);\n\n const load = () => {\n createMyQRCode().then(setQr).catch(err => onToast(err.message || '二维码生成失败'));\n };\n React.useEffect(() => {\n getMeProfile().then(p => { writeCachedData('me-profile', p); setProfile(p); }).catch(() => {});\n load();\n }, []);\n\n React.useEffect(() => {\n if (!qr || !qrRef.current) return;\n qrRef.current.innerHTML = '';\n new QRCode(qrRef.current, {text: qr.qr_payload || qr.qr_token, width: 210, height: 210, correctLevel: QRCode.CorrectLevel.M});\n }, [qr]);\n\n return \n \n \n {profile && profile.avatar_file_id ?
:
person }\n
{(profile && profile.nickname) || (profile && profile.public_account)} {tenantName()} \n
\n
\n 扫一扫上面的二维码,加我为好友
\n {qr && qr.expires_at ? 二维码将于 {new Date(qr.expires_at).toLocaleString()} 失效 : null}\n \n \n { load(); onToast('二维码已刷新'); }}>refresh 刷新 \n {\n if (navigator.share && qr) {\n navigator.share({title: '我的名片', text: qr.qr_payload || qr.qr_token}).catch(() => {});\n } else {\n onToast('当前环境不支持分享');\n }\n }}>share 分享 \n
\n ;\n}\n\n// docs/images/设置(iOS).png 只有7项,docs/images/设置(安卓).png 多了\"青少年模式\"/\"实名认证\"两行状态\n// 展示 -- 两个平台业务能力理应一致(文字需求也这么写),采用更完整的安卓版列表,不再区分iOS/安卓两份。\nfunction SettingsList({onToast, onLogout}) {\n // 'youth-mode' is shared with the YouthMode page's own fetch of the same endpoint; 'me-realname'\n // has no other reader today but gets the same treatment for consistency -- both status badges here\n // otherwise flash a plausible-but-possibly-wrong value (realnameLabel's own fallback below shows\n // \"未认证\" the instant this remounts, even while the still-unauthenticated-looking fetch is in\n // flight) rather than a neutral loading placeholder, so caching avoids a *wrong* badge, not just a\n // blank one.\n const [youthSettings, setYouthSettings] = React.useState(() => readCachedData('youth-mode') || null);\n const [realname, setRealname] = React.useState(() => readCachedData('me-realname') || null);\n React.useEffect(() => {\n getYouthMode().then(d => { writeCachedData('youth-mode', d); setYouthSettings(d); }).catch(() => {});\n getRealnameStatus().then(d => { writeCachedData('me-realname', d); setRealname(d); }).catch(() => {});\n }, []);\n const youthEnabled = youthSettings ? youthSettings.enabled : null;\n const realnameStatus = realname ? realname.status : null;\n const realnameLabel = {verified: '已认证', pending: '审核中', rejected: '未通过'}[realnameStatus] || '未认证';\n const logout = () => {\n if (window.confirm('确定要退出当前登录吗?')) {\n onLogout ? onLogout() : onToast('当前环境不支持退出登录');\n }\n };\n return \n \n \n \n \n \n \n {/* security-support-view.jsx 的 FraudAwareness 组件自己的注释就写着这应该是个\n \"always-reachable safety-info page\",但此前没有任何页面真的链接过去——只能靠手改\n hash 才能打开。这是 personal-settings-view.jsx 之外的一个路由,和本文件其它跳转\n 用的是同一套 hash 导航,可以直接指过去。 */}\n \n \n \n 退出当前登录 \n
;\n}\n\nfunction ConfirmSheet({icon, title, body, confirmLabel = '确认', confirmDanger = true, busy, onConfirm, onCancel, children}) {\n return \n {icon} {title} {body}
\n {children}\n {busy ? '处理中…' : confirmLabel} \n 取消 \n ;\n}\n\n// No backend endpoint clears cache/history -- both are pure client-side operations (confirmed:\n// server/main.go's ~74 routes have nothing for either). Cache clearing empties Cache Storage/IDB;\n// clearing all history calls the native Tinode delMessagesAll(false) per open conversation, same\n// method contact-management-view.jsx/group-management-view.jsx already use for single-topic clears.\nfunction CacheClear({onToast}) {\n const [busy, setBusy] = React.useState(false);\n const [done, setDone] = React.useState(false);\n const [freed, setFreed] = React.useState(0);\n const confirm = async () => {\n setBusy(true);\n try {\n // navigator.storage/caches can be entirely absent (private browsing in some browsers, older\n // WebViews) rather than just rejecting -- referencing a missing global throws synchronously,\n // which a bare .catch() on the call below can't catch (it never gets that far), so without\n // this check the whole confirm() throws, `done` never becomes true, and the \"已完成\" state is\n // never reached even though the button correctly stops spinning via `finally`.\n const hasStorageEstimate = typeof navigator !== 'undefined' && navigator.storage && navigator.storage.estimate;\n const hasCaches = typeof caches !== 'undefined';\n const before = hasStorageEstimate ? (await navigator.storage.estimate().catch(() => ({usage: 0}))).usage || 0 : 0;\n if (hasCaches) {\n const keys = await caches.keys();\n await Promise.all(keys.map(k => caches.delete(k)));\n }\n const after = hasStorageEstimate ? (await navigator.storage.estimate().catch(() => ({usage: 0}))).usage || 0 : 0;\n setFreed(Math.max(0, before - after));\n setDone(true);\n } catch (err) {\n onToast(err.message || '清理失败,请重试');\n } finally {\n setBusy(false);\n }\n };\n return navigate('android-settings') : confirm} onCancel={() => navigate('android-settings')} />;\n}\n\nfunction ClearHistoryConfirm({tinode, chatList, onToast}) {\n const [busy, setBusy] = React.useState(false);\n const confirm = () => {\n if (!tinode || !chatList || !chatList.length) { onToast('没有可清除的会话'); navigate('android-settings'); return; }\n setBusy(true);\n Promise.all(chatList.map(c => {\n const topic = tinode.getTopic(c.name);\n return topic ? topic.delMessagesAll(false).catch(() => {}) : Promise.resolve();\n })).then(() => {\n onToast('聊天记录已清空');\n navigate('android-settings');\n }).finally(() => setBusy(false));\n };\n return navigate('android-settings')} />;\n}\n\n// Changing password has no REST endpoint -- it's native Tinode {acc} protocol\n// (Tinode.updateAccountBasic), already wired end-to-end via tinode-web.jsx's\n// handleUpdatePasswordRequest/onUpdatePassword prop (used today by the old acc-security-view.jsx).\n// Reusing that verified callback here instead of reimplementing the WS call.\nfunction ChangePassword({onUpdatePassword, onToast}) {\n const [oldPwd, setOldPwd] = React.useState('');\n const [newPwd, setNewPwd] = React.useState('');\n const [confirmPwd, setConfirmPwd] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n const submit = () => {\n if (!oldPwd || newPwd.length < 6) { onToast('请输入原密码,新密码至少6位'); return; }\n if (newPwd !== confirmPwd) { onToast('两次输入的新密码不一致'); return; }\n if (!onUpdatePassword) { onToast('当前环境不支持修改密码'); return; }\n if (busy) return;\n setBusy(true);\n // 等真实结果再报成功。原来是发出去就立刻弹\"密码已更新\"并跳走,服务端拒绝(密码策略不符等)\n // 时用户看到的仍然是成功提示,密码其实没变。\n Promise.resolve(onUpdatePassword(newPwd)).then(() => {\n onToast('密码已更新');\n window.setTimeout(() => navigate('android-settings'), 500);\n }).catch(err => {\n onToast((err && err.message) || '修改失败,请重试');\n setBusy(false);\n });\n };\n return ;\n}\n\n// Account deletion is also native Tinode ({del what=\"user\" hard=true} -> delCurrentUser(true)),\n// already wired via tinode-web.jsx's handleDeleteAccount/onDeleteAccount prop. Server-side there's\n// no cooldown/soft-delete and no password re-check (confirmed against server/user.go) -- adding a\n// password confirmation step here is a deliberate, conservative frontend-only safeguard given how\n// irreversible and consequential this action is, not something the backend requires.\nfunction DeleteAccountConfirm({onDeleteAccount, onToast}) {\n const [step, setStep] = React.useState(1);\n const [password, setPassword] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n const proceed = () => {\n if (!password) { onToast('请输入密码以确认'); return; }\n if (!onDeleteAccount) { onToast('当前环境不支持注销账号'); return; }\n setBusy(true);\n Promise.resolve(onDeleteAccount()).catch(err => { onToast(err.message || '注销失败'); setBusy(false); });\n };\n if (step === 1) {\n // im_be's replyDelUser -> hub.stopTopicsForUser hard-deletes every group topic this account\n // owns (not just leaves them) -- confirmed against hub.go's topic.owner==uid branch. Callers\n // in those groups get no advance warning and no forced-ownership-transfer prompt, so this has\n // to be disclosed here since it's the only place the user sees before confirming.\n return setStep(2)} onCancel={() => navigate('android-settings')} />;\n }\n return navigate('android-settings')}>\n setPassword(e.target.value)} placeholder=\"登录密码\" />\n ;\n}\n\n// docs/images/版本更新页面.png 其实是\"关于我们\"页(app图标+版本号+用户条款/隐私协议/检测新版本/联系我们),\n// 品牌名图片里出现了5个不同版本(捷信密使/光讯通讯/笔墨讯使/光迅通讯...),判定为设计稿混用了多版本草稿,\n// 统一用代码里已确立的 BASE_APP_NAME(纯品牌名,不带版本号后缀),不采信任何一个图片品牌名。\n// \"检测新版本\"(及跳转应用商店的更新弹窗)是原型给移动端设计的,web版没有应用商店可跳,按要求隐藏。\nfunction AppVersion({onToast}) {\n const currentVersion = PACKAGE_VERSION;\n\n return \n forum {BASE_APP_NAME} 版本 {currentVersion}
\n \n onToast('用户条款')} />\n onToast('隐私协议')} />\n {/* 参考图\"版本更新页面.png\"里这行是明确画出来的,之前漏掉了(跟\"检测新版本\"不一样,\n 那个是核对图片后判断web版没有应用商店可跳、主动决定不做,这里没有类似理由)。\n 图上那个联系邮箱本身很可能是设计稿混用多版本草稿的产物,不采信,复用代码里已有的\n LINK_CONTACT_US——如果这不是最终要用的联系方式,需要产品另外提供真实地址。 */}\n { window.location.href = LINK_CONTACT_US; }} />\n \n \n
;\n}\n\n// docs/images/隐私设置.png 只画了\"添加我的方式\"+\"邀我入群需要验证\"两项,但 UserPrivacySettings\n// 结构体真实还有 profile_visibility/last_seen_visibility/read_receipts 三个字段 -- 图片大概率没拍全,\n// 这三项是真实、有意义的字段,保留;\"邀我入群需要验证\"反过来是图片有但后端完全没有对应字段(代码调研\n// 确认 UserPrivacySettings 里没有这个概念,群邀请入群逻辑本身也不检查任何隐私开关),故不做这一项,\n// 记录为后端缺口而不是造一个点了没有效果的假开关。\nfunction PrivacySettings({onToast}) {\n // Shares 'me-privacy' with FriendDiscoverySettings' identical getMePrivacy() call -- a toggle page,\n // not a text edit form, so a background refetch self-corrects any stale toggle state harmlessly\n // (no risk of clobbering in-progress typing the way a free-text field would).\n const [privacy, setPrivacy] = React.useState(() => readCachedData('me-privacy') || null);\n React.useEffect(() => { getMePrivacy().then(p => { writeCachedData('me-privacy', p); setPrivacy(p); }).catch(() => {}); }, []);\n const update = (key, value) => {\n const prev = privacy;\n setPrivacy({...privacy, [key]: value});\n updateMePrivacy({[key]: value, version: privacy.version}).then(p => { writeCachedData('me-privacy', p); setPrivacy(p); })\n .catch(err => { onToast(err.message || '保存失败'); setPrivacy(prev); writeCachedData('me-privacy', prev); });\n };\n const methodSummary = () => {\n if (!privacy) return '';\n const labels = {account: '账号', phone: '手机号', qr: '二维码', group: '群聊'};\n const on = Object.entries(privacy.add_me_methods || {}).filter(([, v]) => v).map(([k]) => labels[k] || k);\n if (on.length === 4) return '全部允许';\n return on.length ? on.join('、') : '全部关闭';\n };\n // 后端 userPrivacyPayload 会返回 editable{add_me_methods, profile_visibility, last_seen_visibility,\n // read_receipts},用来表达\"企业强制策略锁死了这一项\"。原来完全没读这个字段,被锁的开关照样能点,\n // 点了服务端 400 再回滚,用户只看到开关自己弹回去、不知道为什么。\n const locked = key => !!(privacy && privacy.editable && privacy.editable[key] === false);\n return \n \n {privacy ? \n 显示消息已读状态 {locked('read_receipts') ? '该项由企业统一设置,不可修改' : '关闭后你也无法查看对方的已读状态'} \n update('read_receipts', v)} />
\n 展示最后在线时间 {locked('last_seen_visibility') ? '该项由企业统一设置,不可修改' : '仅向联系人显示'} \n {/* Backend's validVisibility only accepts everyone/friends/nobody -- 'contacts'/'hidden' were\n rejected by the PATCH validator outright (every toggle attempt 400'd and silently reverted),\n and even a lenient backend would enforce the opposite of what turning this \"on\" should do\n (imCanViewLastSeen's default case treats any unrecognized value as hidden). */}\n update('last_seen_visibility', v ? 'friends' : 'nobody')} />
\n 允许好友查看我的资料 {locked('profile_visibility') ? '该项由企业统一设置,不可修改' : '关闭后仅你自己可见'} \n update('profile_visibility', v ? 'friends' : 'nobody')} />
\n : null}\n ;\n}\n\nfunction FriendDiscoverySettings({onToast}) {\n // Same shared 'me-privacy' key as PrivacySettings -- identical resource, so whichever of the two\n // screens is opened first warms the cache for the other.\n const [privacy, setPrivacy] = React.useState(() => readCachedData('me-privacy') || null);\n React.useEffect(() => { getMePrivacy().then(p => { writeCachedData('me-privacy', p); setPrivacy(p); }).catch(() => {}); }, []);\n const update = (key, value) => {\n const prev = privacy;\n const nextMethods = {...(privacy.add_me_methods || {}), [key]: value};\n setPrivacy({...privacy, add_me_methods: nextMethods});\n updateMePrivacy({add_me_methods: nextMethods, version: privacy.version}).then(p => { writeCachedData('me-privacy', p); setPrivacy(p); })\n .catch(err => { onToast(err.message || '保存失败'); setPrivacy(prev); writeCachedData('me-privacy', prev); });\n };\n const rows = [{key: 'account', title: '账号'}, {key: 'phone', title: '手机号'}, {key: 'qr', title: '二维码'}, {key: 'group', title: '群聊'}];\n // 同 PrivacySettings:企业强制策略锁死时不让点,避免\"能点但必然 400 再弹回\"。\n const methodsLocked = !!(privacy && privacy.editable && privacy.editable.add_me_methods === false);\n return \n {methodsLocked ? '添加方式由企业统一设置,不可修改。' : '关闭某种方式后,其他人将无法通过该渠道搜索或添加你。'}
\n {privacy ? {rows.map(row => \n 可通过{row.title}添加我 \n update(row.key, v)} />\n
)} : null}\n ;\n}\n\n// docs/images/青少年模式未开启(安卓).png 的\"每日不超过40分钟\"/\"加好友群聊每日各4次\"是纯前端文案,\n// 代码调研确认 YouthModeSettings.Restrictions 后端真实内容是三个类别码\n// (night_quiet/content_filter/payment_guard),没有任何分钟数/次数字段 -- 这两个具体数字只作为说明\n// 文案展示,不冒充是从后端配置读出来的。使用时长同理没有后端字段,这里做的是纯本地、按自然日重置的\n// 近似计时(刷新/换设备会丢,不追求精确,比完全不显示更贴近原型但明确知道它不是权威数据)。\nconst YOUTH_RULES = [\n `为呵护未成年人健康成长,${BASE_APP_NAME}推出青少年模式。该模式下部分功能将受限制使用`,\n '每天开启后使用时长不超过 40 分钟',\n '限制加好友/群聊次数(主动/被动加好友或群聊每日最多各 4 次)'\n];\nconst YOUTH_USAGE_KEY = 'im-youth-mode-usage';\n\nfunction useYouthUsageSeconds(active) {\n const [seconds, setSeconds] = React.useState(0);\n React.useEffect(() => {\n const today = new Date().toISOString().slice(0, 10);\n let stored = {};\n try { stored = JSON.parse(window.localStorage.getItem(YOUTH_USAGE_KEY) || '{}'); } catch (_) { /* ignore */ }\n if (stored.date !== today) stored = {date: today, seconds: 0};\n setSeconds(stored.seconds || 0);\n if (!active) return undefined;\n const timer = window.setInterval(() => {\n setSeconds(s => {\n const next = s + 1;\n window.localStorage.setItem(YOUTH_USAGE_KEY, JSON.stringify({date: today, seconds: next}));\n return next;\n });\n }, 1000);\n return () => window.clearInterval(timer);\n }, [active]);\n return seconds;\n}\n\nfunction formatHMS(totalSeconds) {\n const h = Math.floor(totalSeconds / 3600);\n const m = Math.floor((totalSeconds % 3600) / 60);\n const s = totalSeconds % 60;\n const pad = n => String(n).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\nfunction YouthMode({onToast}) {\n // Shares 'youth-mode' with SettingsList's badge fetch (see comment there) and gets patched directly\n // by YouthModeVerify right after a successful enable/disable, so navigating back here shows the new\n // state immediately instead of the stale cached one for a moment before self-correcting.\n const [settings, setSettings] = React.useState(() => readCachedData('youth-mode') || null);\n const usage = useYouthUsageSeconds(settings && settings.enabled);\n React.useEffect(() => {\n setSettings(readCachedData('youth-mode') || null);\n getYouthMode().then(d => { writeCachedData('youth-mode', d); setSettings(d); }).catch(err => onToast(err.message || '加载失败'));\n }, []);\n\n const startEnable = () => {\n if (!settings) return;\n if (!settings.password_set) {\n onToast('请先设置独立密码');\n window.setTimeout(() => navigate('identity-check', {ym: 'enable'}), 400);\n return;\n }\n navigate('youth-mode-verify', {ym: 'enable'});\n };\n\n if (!settings) return
;\n\n return \n
\n
\n {settings.enabled ? 'verified_user' : 'child_care'} \n {settings.enabled ? '青少年模式已开启' : '青少年模式未开启'} \n {YOUTH_RULES.map(rule => {rule} )} \n {settings.enabled ? 今日已使用:{formatHMS(usage)}
: null}\n \n
\n settings.enabled ? navigate('youth-mode-verify', {ym: 'disable'}) : startEnable()}>\n {settings.enabled ? '关闭青少年模式' : '开启青少年模式'}\n \n 可在设置中查看青少年模式状态 \n \n
;\n}\n\n// docs/images/青少年模式提示(安卓).png 实际内容是\"今日已达40分钟拦截层\"(文件名误导),其中的\n// \"输入密码继续使用\"选项代码调研确认后端没有任何\"临时解锁但不关闭\"的操作可对应 -- serveIMYouthModeEnable\n// /Disable 只有开/关两种终态,没有\"本次会话继续\"的中间态。不做这个假按钮,只保留真实可行的\"关闭\"路径。\n//\n// 开关流程统一:已设置密码时,输入密码 -> POST .../independent-password/verify 换 action_token\n// (action 按 enable/disable 传 enable_youth_mode/close_youth_mode)-> 调 enable/disable。\n// 未设置密码时开启前必须先走 identity-check(短信验证码)设置密码,这一步不消费于开启本身。\nfunction YouthModeVerify({hashParams, onToast}) {\n const mode = (hashParams && hashParams.ym) || 'disable';\n const [settings, setSettings] = React.useState(null);\n const [password, setPassword] = React.useState('');\n const [error, setError] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n const [lockedUntil, setLockedUntil] = React.useState(0);\n const [now, setNow] = React.useState(Date.now());\n const remainingLockSeconds = lockedUntil ? Math.max(0, Math.ceil((lockedUntil - now) / 1000)) : 0;\n // Self-rescheduling tick, not setInterval -- naturally stops once the countdown reaches 0 instead\n // of needing separate start/stop bookkeeping.\n React.useEffect(() => {\n if (remainingLockSeconds <= 0) return;\n const id = window.setTimeout(() => setNow(Date.now()), 1000);\n return () => window.clearTimeout(id);\n }, [remainingLockSeconds]);\n\n React.useEffect(() => { getYouthMode().then(setSettings).catch(() => {}); }, []);\n\n const submit = () => {\n if (password.length !== 4) { setError('请输入4位独立密码'); return; }\n if (remainingLockSeconds > 0) { return; }\n setBusy(true);\n setError('');\n // Server's serveIMYouthModeEnable consumes the token with a strict action='enable_youth_mode'\n // match (ConsumeActionToken does an exact WHERE action=? lookup) -- minting it tagged\n // 'set_independent_password' meant the lookup could never find it, so every enable attempt\n // 403'd with ACTION_TOKEN_INVALID regardless of a correct password.\n const action = mode === 'enable' ? 'enable_youth_mode' : 'close_youth_mode';\n verifyIndependentPassword(password, 'youth_mode', action).then(({action_token}) => {\n const call = mode === 'enable' ?\n enableYouthMode(settings.policy_version, action_token) :\n disableYouthMode(action_token);\n return call;\n }).then(_ => {\n // Patch the shared cache with the now-known new state before navigating back to YouthMode/\n // SettingsList -- without this they'd briefly show the pre-toggle cached value again and then\n // flip, which is a more confusing flash than the plain loading state they had before caching.\n if (settings) writeCachedData('youth-mode', {...settings, enabled: mode === 'enable'});\n onToast(mode === 'enable' ? '青少年模式已开启' : '青少年模式已关闭');\n window.setTimeout(() => navigate(mode === 'enable' ? 'youth-mode-on' : 'youth-mode-off'), 400);\n }).catch(err => {\n // Server locks out further attempts for retry_after_seconds after too many wrong passwords\n // (any request during that window 429s regardless of whether THIS password is correct) --\n // without tracking that window here, the button stayed enabled the whole time, letting the\n // user fire off more requests that were guaranteed to fail before the lock even lifts.\n if (err.reason === 'TOO_MANY_ATTEMPTS' && err.details && err.details.retry_after_seconds) {\n setLockedUntil(Date.now() + err.details.retry_after_seconds * 1000);\n setNow(Date.now());\n }\n setError(err.message || '验证失败');\n }).finally(() => setBusy(false));\n };\n\n return \n
\n
\n {[0, 1, 2, 3].map(i => {password[i] ? '●' : ''} )}
\n setPassword(e.target.value.replace(/\\D/g, '').slice(0, 4))} aria-label=\"独立密码\" />\n {error ? {error}
: null}\n 0} onClick={submit}>\n {busy ? '验证中…' : remainingLockSeconds > 0 ? `请 ${remainingLockSeconds} 秒后重试` : '确定'}\n \n {/* 一旦设过密码,这个页面就是唯一入口,之前完全没有出路——真忘了密码只能不断输错直到被\n 限流,限流也只是让你等,不会给别的办法。identity-check 走的短信验证码本来就支持在\n password_set:true 时重新设置密码(实测确认过),只是没有从这里链接过去。\n 必须带上当前 mode:IndependentPassword 设完新密码后,服务端每次都会无条件带回\n enable_action_token(与调用者意图无关),原来因为不知道是从\"关闭\"这个流程点进来的,\n 会把这次重置误当成\"继续开启\",用户想关闭青少年模式却被弹\"已开启\"、状态也没有真的关掉。 */}\n navigate('identity-check', {ym: mode})}>忘记独立密码? \n \n
;\n}\n\n// 10.18-10.21:纯静态权限说明卡片,浏览器原生权限API(Notification.requestPermission()/\n// getUserMedia())本身没有\"用途说明\"这个中间步骤,所以这一层完全是前端自己在真正触发系统权限\n// 弹窗前插入的说明UI,不需要任何后端接口 -- 与代码调研确认的\"清缓存/清聊天记录\"是同一类判断。\nconst PERMISSIONS = {\n notification: {icon: 'notifications_active', title: '获取推送权限', text: '向您及时送达重要通知、活动提醒、个性化内容更新等信息。', action: '开启通知', route: 'permission-settings-reminder'},\n reminder: {icon: 'settings', title: '消息推送暂未开启', text: `前往【设置 - 通知管理】一键开启吧!`, action: '好的', secondaryAction: '暂不开启', route: 'android-settings'},\n camera: {icon: 'photo_camera', title: '相机权限使用说明', text: '调用相机拍摄/扫码,为您提供拍照、扫码识别等服务。', action: '继续授权', route: 'messages-home'},\n microphone: {icon: 'mic', title: '麦克风权限使用说明', text: '用于语音消息、语音输入和音视频通话,未授权时不会创建录音文件。', action: '继续授权', route: 'messages-home'}\n};\n\nfunction PermissionGuide({type, onToast}) {\n const config = PERMISSIONS[type];\n const proceed = () => {\n if (type === 'notification' && 'Notification' in window) {\n Notification.requestPermission().then(() => navigate(config.route));\n return;\n }\n onToast(type === 'reminder' ? '请前往系统设置开启通知' : '等待系统授权结果');\n window.setTimeout(() => navigate(config.route), 500);\n };\n return \n
\n
\n {config.icon} \n {config.title} \n {config.text}
\n {config.action} \n {config.secondaryAction ? navigate('messages-home')}>{config.secondaryAction} : null}\n \n
;\n}\n\nexport default function PersonalSettingsView({view, hashParams, myUserId, tinode, chatList, onUpdatePassword, onDeleteAccount, onLogout}) {\n const [toast, setToast] = React.useState('');\n let content;\n if (view === 'personal-center') content = ;\n else if (view === 'personal-profile') content = ;\n else if (view === 'profile-nickname') content = ;\n else if (view === 'profile-signature') content = ;\n else if (view === 'profile-birth-date') content = ;\n else if (view === 'profile-gender') content = ;\n else if (view === 'profile-region') content = ;\n else if (view === 'personal-qrcode') content = ;\n else if (view === 'android-settings') content = ;\n else if (view === 'cache-clear-confirm') content = ;\n else if (view === 'clear-history-confirm') content = ;\n else if (view === 'change-password') content = ;\n else if (view === 'delete-account-confirm') content = ;\n else if (view === 'app-version') content = ;\n else if (view === 'privacy-settings') content = ;\n else if (view === 'friend-discovery-settings') content = ;\n else if (view === 'youth-mode-off' || view === 'youth-mode-on') content = ;\n else if (view === 'youth-mode-verify') content = ;\n else content = ;\n return <>{content} setToast('')} />>;\n}\n","import React from 'react';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { uploadLargeFile, getAbuseReasons, submitAbuseReport, getFeedbackConfig, submitFeedback } from '../lib/im-api.js';\nimport { readCachedData, useCachedData } from '../lib/use-cached-data.js';\n\nconst navigate = (view, params) => {\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, view);\n Object.entries(params || {}).forEach(([key, value]) => {\n hash = value ? HashNavigation.addUrlParam(hash, key, value) : HashNavigation.removeUrlParam(hash, key);\n });\n HashNavigation.navigateTo(hash);\n};\n\nexport const SECURITY_SUPPORT_VIEWS = [\n 'fraud-risk-warning', 'fraud-risk-confirmation', 'abuse-report-reasons',\n 'abuse-report-details', 'user-feedback'\n];\n\nfunction Icon({children}) { return {children} ; }\n\nfunction Header({title, back}) {\n return { if (!HashNavigation.goBack()) navigate(back); }} aria-label=\"返回\">arrow_back_ios_new {title} ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2200);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\n// Backend has no \"content risk scan\" or \"post-send fraud alert\" mechanism (confirmed against\n// im_be/server/im_http.go and session.go -- grepping for 诈骗/反诈/110/fraud in the whole backend\n// only turns up abuse-report reason labels, no scanning logic and no system-notification event type\n// for it). The two reference images (反诈弹窗(安卓).png / 反诈弹窗(二次提示安卓).png) show generic\n// anti-fraud education content that isn't tied to any specific message or backend-driven trigger --\n// there's no field anywhere (bootstrap, profile, settings) indicating \"has this been shown before\".\n// So this is implemented as a standalone, always-reachable safety-info page (not something that\n// pops up automatically), reusing the two designs' content/copy verbatim for their real interactive\n// counterpart: the pre-send URL risk check below (RiskConfirmDialog), which DOES have a real backend\n// (POST /security/urls/check + POST /security/risk-challenges/{id}/confirm).\nfunction FraudAwareness({secondary}) {\n // 这里必须带上 risk-dialog:本页的 ul/li/aside/.risk-emphasis/button.primary 全部样式都挂在\n // base.css 的 .risk-dialog 下(14 条规则),而 .risk-info-page 在 base.css 里一条规则都没有——\n // 只写 risk-info-page 的话整页会渲染成带原生项目符号的裸列表。\n // 图标名也修正了:shield_lock 只存在于 Material Symbols,index.html 加载的是经典 Material Icons,\n // 那套字体里没有这个字形,会原样显示 \"shield_lock\" 这串文本。改用仓库已在用的 verified_user。\n return \n {secondary ? 'warning_amber' : 'verified_user'} \n {secondary ? <>\n 您发送的内容可能涉及诈骗风险,请注意甄别。
\n 切勿轻信陌生人的投资理财、兼职刷单、网络贷款等信息,谨防上当受骗。
\n phone_in_talk 如遇诈骗请立即拨打 110 报警。 \n > : <>\n 为保障您的账号及资金安全,请您注意:
\n \n receipt_long 不参与刷单返利活动 \n currency_yuan 不轻信高收益投资、理财信息 \n person_off 不出租、出借、出售账号及实名信息 \n lock 不向任何人泄露验证码、密码等敏感信息 \n \n 请提高安全防范意识,谨防电信网络诈骗。
\n >}\n navigate(secondary ? 'fraud-risk-warning' : 'personal-center')}>{secondary ? '我已知晓' : '我已阅读并知晓'} \n ;\n}\n\n// Exported for messages-view.jsx to render inline when composing a message that contains a URL --\n// this is the one piece of Ch.11 with a genuine backend mechanism behind it (checkURL/confirmRiskChallenge,\n// verified against im_http.go:1184-1285). `level`/`blocked` come straight from the checkURL response.\nexport function RiskConfirmDialog({level, blocked, onConfirm, onCancel}) {\n return \n {blocked ? 'block' : 'warning_amber'} \n 安全提醒 \n {blocked ? 检测到该内容存在较高安全风险,暂无法发送。
: <>\n 您发送的内容可能涉及诈骗风险,请注意甄别。
\n 切勿轻信陌生人的投资理财、兼职刷单、网络贷款等信息,谨防上当受骗。如遇诈骗请立即拨打 110 报警。
\n >}\n {blocked\n ? 我已知晓 \n : <>我已知晓,继续发送 取消发送 >}\n ;\n}\n\n// target_type is one of user/group/message only (verified against server/store/store.go's\n// AbuseReasons validation and im_http.go's normalizeIMAbuseTarget switch -- there is no\n// \"group_member\" variant server-side; reporting a group member uses target_type=user and simply\n// loses the \"which group\" context, which is a real backend limitation, not something fixable here).\nfunction ReportReasons({hashParams, onToast}) {\n const targetType = (hashParams && hashParams.target_type) || 'user';\n const targetName = (hashParams && hashParams.target_name) || '';\n const [reasons, setReasons] = React.useState(null);\n React.useEffect(() => {\n getAbuseReasons(targetType).then(data => setReasons(Array.isArray(data) ? data : (data && (data.reasons || data.items)) || []))\n .catch(err => { onToast(err.message || '加载失败'); setReasons([]); });\n }, [targetType]);\n const select = reason => navigate('abuse-report-details', {...hashParams, reason_code: reason.reason_code || reason.code, reason_label: reason.label, requires_description: reason.requires_description ? '1' : ''});\n {/* 'personal-center' made sense when contact-management-view.jsx's friend-settings page was the\n only entry point; tinode-web.jsx's handleReportTopic (block-and-report from inside a chat,\n which closes that chat before landing here) now also routes here, and for that origin\n 'personal-center' is a non-sequitur -- messages-home is a reasonable default for both. */}\n return \n {targetName ? account_circle 举报{targetName} 举报人身份不会向对方公开 : null}\n 请选择举报原因 \n {reasons === null ? 加载中…
: \n {reasons.map(reason => select(reason)}>\n {reason.label} chevron_right \n )}\n }\n ;\n}\n\nfunction ReportDetails({hashParams, tinode, onToast}) {\n const reasonLabel = (hashParams && hashParams.reason_label) || '';\n const reasonCode = (hashParams && hashParams.reason_code) || '';\n const requiresDescription = (hashParams && hashParams.requires_description) === '1';\n const [description, setDescription] = React.useState('');\n const [evidence, setEvidence] = React.useState([]);\n const [uploading, setUploading] = React.useState(false);\n const [submitting, setSubmitting] = React.useState(false);\n const [submitted, setSubmitted] = React.useState(null);\n const fileInputRef = React.useRef(null);\n\n const addEvidence = event => {\n const file = event.target.files && event.target.files[0];\n event.target.value = '';\n if (!file || !tinode) return;\n if (evidence.length >= 9) { onToast('最多上传 9 个证据文件'); return; }\n setUploading(true);\n uploadLargeFile(tinode, file).then(({fileId}) => setEvidence(items => items.concat({id: fileId, name: file.name})))\n .catch(err => onToast(err.message || '上传失败')).finally(() => setUploading(false));\n };\n\n const submit = () => {\n if (requiresDescription && !description.trim()) { onToast('请补充问题描述'); return; }\n const target = {type: hashParams.target_type || 'user'};\n if (hashParams.target_type === 'message') { target.topic = hashParams.topic; target.seq = String(hashParams.seq); }\n else if (hashParams.target_type === 'group') { target.topic = hashParams.topic || hashParams.target_id; }\n else { target.user_id = hashParams.target_id; }\n setSubmitting(true);\n submitAbuseReport({target, reason_code: reasonCode, description: description.trim(), evidence_file_ids: evidence.map(e => e.id)})\n .then(result => setSubmitted(result))\n .catch(err => onToast(err.message || '提交失败'))\n .finally(() => setSubmitting(false));\n };\n\n return \n {submitted ?
task_alt 举报已受理 我们会依据平台规则核实处理,举报人身份不会向被举报方公开。
受理编号 {submitted.report_id} navigate('messages-home')}>完成 \n :
\n 举报原因 {reasonLabel} navigate('abuse-report-reasons', hashParams)}>修改 \n 问题描述{requiresDescription ? * : null} setDescription(event.target.value)} placeholder=\"请描述具体情况、发生时间和相关行为\" />{description.length}/500 \n \n 证据材料 图片或文件,最多 9 个 {evidence.length}/9 \n \n {evidence.map(file =>
image {file.name} setEvidence(items => items.filter(item => item.id !== file.id))} aria-label=\"删除证据\">close )}\n
fileInputRef.current && fileInputRef.current.click()}>add_photo_alternate {uploading ? '上传中…' : '添加证据'} \n
\n
\n \n lock 证据仅用于平台审核,将按照安全策略保存和访问。 \n }\n {!submitted ?
{submitting ? '提交中…' : '提交举报'} : null}\n
;\n}\n\n// category is REQUIRED server-side (POST /feedback rejects empty category) but the reference image\n// (意见反馈.png) shows no category-selection UI at all -- picking a sensible default silently would\n// mean every feedback submission gets misfiled under one bucket. A minimal category picker is added\n// here (using the real categories from GET /feedback/config, not the mock's invented four-item list)\n// since it's a real, meaningful, backend-required field -- same judgment call as Ch.6's \"my nickname\n// in this group\" editor: no reference image, but a real backend capability worth a minimal UI for.\n// `contact` (image has no input for it) is left unset -- it's optional server-side, so omitting it\n// doesn't break the request, and adding a field the design never showed would be inventing UI.\nfunction UserFeedback({tinode, onToast}) {\n // Fixed/parameterless config (max files, categories, max length, diagnostics notice) reached from a\n // single entry point (personal-center's \"意见反馈\" row) off the same hub whose own profile fetch is\n // already cached -- seeding both `config` and its derived default `category` together from the same\n // cached object avoids a flash where the category picker renders (gated on `config` alone) with\n // nothing selected yet.\n const cachedFeedbackConfig = readCachedData('feedback-config');\n // Was its own useState + one-shot useEffect with no retry -- a failed first fetch with nothing\n // cached yet left `config` stuck at null for the rest of the page's life (the category picker\n // below never renders since it's gated on `config`, but content/submit stay visible the whole\n // time), and the only way out was a full page reload. Routing through useCachedData gets the same\n // \"one retry after 3s if there's truly nothing cached yet\" behavior bootstrap and friends already\n // have, for free.\n const [config] = useCachedData('feedback-config', getFeedbackConfig, []);\n const [category, setCategory] = React.useState(() => (cachedFeedbackConfig && cachedFeedbackConfig.categories && cachedFeedbackConfig.categories[0]) || '');\n const [content, setContent] = React.useState('');\n const [images, setImages] = React.useState([]);\n const [uploading, setUploading] = React.useState(false);\n const [diagnostics, setDiagnostics] = React.useState(false);\n const [submitting, setSubmitting] = React.useState(false);\n const [submitted, setSubmitted] = React.useState(null);\n const fileInputRef = React.useRef(null);\n const maxFiles = (config && config.attachment_policy && config.attachment_policy.max_files) || 5;\n const maxLength = (config && config.max_length) || 300;\n\n // Only fills in the default once, the first time a fetch (initial or the useCachedData retry)\n // actually resolves without one already picked synchronously above from a warm cache -- doesn't\n // clobber a category the user already changed.\n React.useEffect(() => {\n if (config && config.categories && config.categories.length && !category) {\n setCategory(config.categories[0]);\n }\n }, [config]);\n\n const CATEGORY_LABELS = {bug: '功能异常', suggestion: '产品建议', complaint: '服务投诉', other: '其他'};\n\n const addImage = event => {\n const file = event.target.files && event.target.files[0];\n event.target.value = '';\n if (!file || !tinode) return;\n if (images.length >= maxFiles) { onToast(`最多上传 ${maxFiles} 张图片`); return; }\n setUploading(true);\n uploadLargeFile(tinode, file).then(({fileId}) => setImages(items => items.concat({id: fileId})))\n .catch(err => onToast(err.message || '上传失败')).finally(() => setUploading(false));\n };\n\n const submit = () => {\n if (!content.trim()) { onToast('请填写反馈内容'); return; }\n // category is a required backend field (empty string 400s as MALFORMED_REQUEST) but the picker\n // that sets it only renders once `config` has loaded -- if getFeedbackConfig() is still in\n // flight or failed, `category` can still be '' here while content/submit stay visible the whole\n // time, so this needs its own explicit guard rather than relying on the picker having run.\n if (!category) { onToast('请选择反馈类型'); return; }\n setSubmitting(true);\n submitFeedback({category, content: content.trim(), attachment_file_ids: images.map(i => i.id), include_diagnostics: diagnostics})\n .then(result => setSubmitted(result))\n .catch(err => onToast(err.message || '提交失败'))\n .finally(() => setSubmitting(false));\n };\n\n if (submitted) return mark_email_read 反馈已受理 感谢你的反馈,我们会尽快查看并用于改进产品。
反馈编号 {submitted.feedback_id} navigate('personal-center')}>返回我的 ;\n\n return ;\n}\n\nexport default function SecuritySupportView({view, hashParams, tinode}) {\n const [toast, setToast] = React.useState('');\n let content;\n if (view === 'fraud-risk-warning' || view === 'fraud-risk-confirmation') content = ;\n else if (view === 'abuse-report-reasons') content = ;\n else if (view === 'abuse-report-details') content = ;\n else content = ;\n return <>{content} setToast('')} />>;\n}\n","// Tinode config panel.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\n\nimport HostSelector from '../widgets/host-selector.jsx';\n\nexport default class SettingsView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n transport: props.transport || 'def',\n serverAddress: props.serverAddress,\n secureConnection: props.secureConnection,\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleTransportSelected = this.handleTransportSelected.bind(this);\n this.handleServerAddressChange = this.handleServerAddressChange.bind(this);\n this.handleToggleSecure = this.handleToggleSecure.bind(this);\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onUpdate({\n transport: this.state.transport,\n serverAddress: this.state.serverAddress,\n secureConnection: this.state.secureConnection,\n });\n }\n\n handleTransportSelected(e) {\n this.setState({transport: e.currentTarget.value});\n }\n\n handleServerAddressChange(name) {\n this.setState({serverAddress: name});\n }\n\n handleToggleSecure(e) {\n this.setState({secureConnection: !this.state.secureConnection});\n }\n\n render() {\n const names = {def: \"default\", ws: \"websocket\", lp: \"long polling\"};\n const transportOptions = [];\n ['def', 'ws', 'lp'].forEach(item => {\n const id = 'transport-' + item;\n const name = names[item];\n transportOptions.push(\n \n \n {name} \n \n );\n });\n\n return (\n \n \n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n
\n \n \n \n \n \n
\n \n );\n }\n};\n","import React, { Suspense } from 'react';\nimport { defineMessages, FormattedMessage, injectIntl } from 'react-intl';\n\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport SideNavbar from '../widgets/side-navbar.jsx';\nimport TopicCommonView from './topic-common-view.jsx';\nimport AuthOnboardingView from './auth-onboarding-view.jsx';\nimport MessageCenterView from './message-center-view.jsx';\nimport DirectMessageView from './direct-message-view.jsx';\nimport MessageComposerView, {MESSAGE_COMPOSER_VIEWS} from './message-composer-view.jsx';\nimport ContactManagementView, {CONTACT_MANAGEMENT_VIEWS} from './contact-management-view.jsx';\nimport GroupManagementView, {GROUP_MANAGEMENT_VIEWS} from './group-management-view.jsx';\nimport ContentLibraryView, {CONTENT_LIBRARY_VIEWS} from './content-library-view.jsx';\nimport CallExperienceView, {CALL_EXPERIENCE_VIEWS} from './call-experience-view.jsx';\nimport WorkplaceCollaborationView, {WORKPLACE_COLLABORATION_VIEWS} from './workplace-collaboration-view.jsx';\nimport PersonalSettingsView, {PERSONAL_SETTINGS_VIEWS} from './personal-settings-view.jsx';\nimport SecuritySupportView, {SECURITY_SUPPORT_VIEWS} from './security-support-view.jsx';\n\nconst AccountSettingsView = React.lazy(_ => import('./account-settings-view.jsx'));\nimport ContactsView from './contacts-view.jsx';\nconst CreateAccountView = React.lazy(_ => import('./create-account-view.jsx'));\nimport AccGeneralView from './acc-general-view.jsx';\nimport AccNotificationsView from './acc-notifications-view.jsx';\nconst AccSecurityView = React.lazy(_ => import('./acc-security-view.jsx'));\nimport AccSupportView from './acc-support-view.jsx';\nimport LoginView from './login-view.jsx';\nimport NewTopicView from './new-topic-view.jsx';\nconst PasswordResetView = React.lazy(_ => import('./password-reset-view.jsx'));\nimport SettingsView from './settings-view.jsx';\nimport ValidationView from './validation-view.jsx';\nconst WallpapersView = React.lazy(_ => import('./wallpapers.jsx'));\n\n// Panel titles for translation.\nconst messages = defineMessages({\n login: {\n id: 'sidepanel_title_login',\n description: 'Sidepanel title for LoginView.',\n defaultMessage: 'Sign In'\n },\n register: {\n id: 'sidepanel_title_register',\n description: 'Sidepanel title for CreateAccountView.',\n defaultMessage: 'Create Account'\n },\n settings: {\n id: 'sidepanel_title_settings',\n description: 'Sidepanel title for SettingsView.',\n defaultMessage: 'Settings'\n },\n edit: {\n id: 'sidepanel_title_account_settings',\n description: 'Sidepanel title for AccountSettingsView.',\n defaultMessage: 'Account Settings'\n },\n general: {\n id: 'panel_title_general',\n description: 'Title for TopicCommon.',\n defaultMessage: 'General'\n },\n security: {\n id: 'panel_title_security',\n description: 'Title for TopicSecirity and AccSecurity.',\n defaultMessage: 'Security'\n },\n crop: {\n id: 'panel_title_crop',\n description: 'Title for AvatarCropView.',\n defaultMessage: 'Drag to Adjust'\n },\n notif: {\n id: 'sidepanel_title_acc_notifications',\n description: 'Sidepanel title for AccNotificationsView.',\n defaultMessage: 'Notifications'\n },\n acc_general: {\n id: 'sidepanel_title_acc_general',\n description: 'Sidepanel title for AccGeneralView.',\n defaultMessage: 'General'\n },\n support: {\n id: 'sidepanel_title_acc_support',\n description: 'Sidepanel title for AccSupportView.',\n defaultMessage: 'Support'\n },\n newtpk: {\n id: 'sidepanel_title_newtpk',\n description: 'Sidepanel title for NewTopicView.',\n defaultMessage: 'Start New Chat'\n },\n cred: {\n id: 'sidepanel_title_cred',\n description: 'Sidepanel title for ValidationView.',\n defaultMessage: 'Confirm Credentials'\n },\n reset: {\n id: 'sidepanel_title_reset',\n description: 'Sidepanel title for PasswordResetView.',\n defaultMessage: 'Reset Password'\n },\n archive: {\n id: 'sidepanel_title_archive',\n description: 'Sidepanel title for ContactsView-Archive.',\n defaultMessage: 'Archived Chats'\n },\n blocked: {\n id: 'sidepanel_title_blocked',\n description: 'Sidepanel title for ContactsView-Blocked.',\n defaultMessage: 'Blocked Chats'\n },\n wallpapers: {\n id: 'wallpapers',\n description: 'Link or title for working with wallpapers.',\n defaultMessage: 'Wallpapers'\n }\n});\n\nclass SidepanelView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleNewTopic = this.handleNewTopic.bind(this);\n }\n\n handleNewTopic() {\n this.props.onNavigate('newtpk');\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const view = this.props.state || (this.props.myUserId ? 'messages-home' : 'tenant');\n const chapterOneViews = ['tenant', 'login', 'enterprise-register', 'enterprise-feedback', 'register',\n 'reset', 'identity-check', 'realname', 'realname-verified', 'realname-reminder', 'independent-password'];\n\n if (chapterOneViews.includes(view)) {\n return ;\n }\n\n const chapterTwoViews = ['messages-home', 'messages-offline', 'messages-menu', 'message-actions', 'system-messages'];\n if (chapterTwoViews.includes(view)) {\n const fullPage = !this.props.myUserId || view !== 'messages-home';\n return \n \n
;\n }\n\n const chapterThreeViews = ['chat-inbound-request', 'chat-inbound-message', 'chat-outbound-request',\n 'chat-status', 'chat-friend', 'chat-media', 'chat-blocked', 'chat-deleted', 'chat-standard',\n 'chat-attachments', 'chat-mixed', 'chat-contact-card'];\n if (chapterThreeViews.includes(view)) {\n return \n \n
;\n }\n\n if (MESSAGE_COMPOSER_VIEWS.includes(view)) {\n return \n \n
;\n }\n\n if (CONTACT_MANAGEMENT_VIEWS.includes(view)) {\n return \n \n
;\n }\n\n if (GROUP_MANAGEMENT_VIEWS.includes(view)) {\n return \n \n
;\n }\n\n if (CONTENT_LIBRARY_VIEWS.includes(view)) {\n return \n \n
;\n }\n\n if (CALL_EXPERIENCE_VIEWS.includes(view)) {\n return \n \n
;\n }\n\n if (WORKPLACE_COLLABORATION_VIEWS.includes(view)) {\n return \n \n
;\n }\n\n if (PERSONAL_SETTINGS_VIEWS.includes(view)) {\n return ;\n }\n\n if (SECURITY_SUPPORT_VIEWS.includes(view)) {\n return \n \n
;\n }\n\n let title, avatar, badges;\n if (view == 'contacts') {\n title = this.props.title;\n avatar = this.props.avatar ? this.props.avatar : true;\n badges = this.props.trustedBadges;\n } else {\n title = formatMessage(messages[view]);\n avatar = false;\n badges = null;\n }\n\n let onCancel;\n if (['login', 'contacts'].indexOf(view) == -1) {\n onCancel = this.props.onCancel;\n }\n\n return (\n \n \n\n \n\n \n\n {view === 'login' ?\n :\n\n view === 'register' ?\n
}>\n \n :\n\n view === 'settings' ?\n :\n\n view === 'edit' ?\n }>\n \n :\n\n (view === 'general' || view === 'crop') ?\n :\n\n view === 'acc_general' ?\n :\n\n view === 'notif' ?\n :\n\n view === 'security' ?\n }>\n \n :\n\n view === 'support' ?\n :\n\n view === 'wallpapers' ?\n }>\n \n :\n\n (view === 'contacts' || view == 'archive' || view == 'blocked') ?\n :\n\n view === 'newtpk' ?\n :\n\n view === 'cred' ?\n :\n\n view === 'reset' ?\n }>\n \n :\n null}\n \n );\n }\n};\n\nexport default injectIntl(SidepanelView);\n","// The top-level class to hold all functionality together.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { initializeApp as firebaseInitApp } from 'firebase/app';\nimport { getMessaging as firebaseGetMessaging, getToken as firebaseGetToken,\n deleteToken as firebaseDelToken, onMessage as firebaseOnMessage } from 'firebase/messaging';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Alert from '../widgets/alert.jsx';\nimport ContextMenu from '../widgets/context-menu.jsx';\nimport ForwardDialog from '../widgets/forward-dialog.jsx';\nimport BatchForwardDialog from '../widgets/batch-forward-dialog.jsx';\nimport CallIncoming from '../widgets/call-incoming.jsx';\nimport QrScanner, { GroupJoinPreview } from '../widgets/qr-scanner.jsx';\nconst PhoneCountrySelector = React.lazy(_ => import('../widgets/phone-country-selector.jsx'));\n\nconst InfoView = React.lazy(_ => import('./info-view.jsx'));\nconst MessagesView = React.lazy(_ => import('./messages-view.jsx'));\nimport SidepanelView from './sidepanel-view.jsx';\n\nimport { API_KEY, APP_NAME, BASE_APP_NAME, DEFAULT_COLOR_SCHEME, DEFAULT_P2P_ACCESS_MODE, DEFAULT_TEXT_SIZE, FORWARDED_PREVIEW_LENGTH,\n LOGGING_ENABLED, MEDIA_BREAKPOINT, WAKE_UP_TICK, WAKE_UP_TIMEOUT } from '../config.js';\nimport { CALL_STATE_NONE, CALL_STATE_OUTGOING_INITATED,\n CALL_STATE_INCOMING_RECEIVED, CALL_STATE_IN_PROGRESS,\n CALL_HEAD_STARTED } from '../constants.js';\nimport { PACKAGE_VERSION } from '../version.js';\nimport { base64ReEncode, makeImageUrl } from '../lib/blob-helpers.js';\nimport { detectServerAddress, isLocalHost, isSecureConnection } from '../lib/host-name.js';\nimport LocalStorageUtil from '../lib/local-storage.js';\nimport { getTenantContext, resolveQRCode, createGroupJoinRequest, getBootstrap } from '../lib/im-api.js';\nimport { readCachedData, writeCachedData } from '../lib/use-cached-data.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { secondsToTime } from '../lib/strformat.js'\nimport { defaultWallpaper, theCard, topicDisplayName, updateFavicon } from '../lib/utils.js';\n\n// Sound to play on message received.\nconst POP_SOUND = new Audio('audio/msg.m4a');\n\nconst messages = defineMessages({\n reconnect_countdown: {\n id: 'reconnect_countdown',\n defaultMessage: 'Disconnected. Reconnecting in {seconds}…',\n description: 'Message shown when an app update is available.'\n },\n reconnect_now: {\n id: 'reconnect_now',\n defaultMessage: 'Try now',\n description: 'Prompt for reconnecting now'\n },\n push_init_failed: {\n id: 'push_init_failed',\n defaultMessage: 'Failed to initialize push notifications',\n description: 'Error message when push notifications have failed to initialize.'\n },\n invalid_security_token: {\n id: 'invalid_security_token',\n defaultMessage: 'Invalid security token',\n description: 'Error message when resetting password.'\n },\n no_connection: {\n id: 'no_connection',\n defaultMessage: 'No connection',\n description: 'Warning that the user is offline.'\n },\n code_doesnot_match: {\n id: 'code_doesnot_match',\n defaultMessage: 'Code does not match',\n description: 'Error message when the credential validation code is incorrect.'\n },\n menu_item_info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n menu_item_audio_call: {\n id: 'menu_item_audio_call',\n defaultMessage: 'Call',\n description: 'Start audio call'\n },\n menu_item_video_call: {\n id: 'menu_item_video_call',\n defaultMessage: 'Video call',\n description: 'Start video call'\n },\n cred_confirmed_successfully: {\n id: 'cred_confirmed_successfully',\n defaultMessage: 'Confirmed successfully',\n description: 'Notification message that the credential was successfully validated.'\n },\n password_reset_success: {\n id: 'password_reset_success',\n defaultMessage: 'Password reset successfully',\n description: 'Notification message that the password was successfully reset.'\n },\n select_country: {\n id: 'select_country',\n defaultMessage: 'Select country',\n description: 'Placeholder for the country selector'\n }\n});\n\n// 全部合法的侧栏视图名。抽成模块级常量而不是内联在 handleHashRoute 里,是因为初始化时的\n// \"要不要保留 hash\" 判断也需要同一份名单——那里原来写的是上游 Tinode 遗留的\n// ['cred','reset','register'] 三个名字,本工程新增的上百个路由一个都不在里面,导致带任何新路由的\n// 地址刷新/深链进入都会被 navigateTo('') 清空 hash 弹回首页。\nconst SIDE_PANEL_VIEWS = ['acc_general','archive','blocked','contacts','cred','crop','edit','general',\n 'newtpk','notif','register','reset','security','settings','support','wallpapers',\n 'tenant','login','enterprise-register','enterprise-feedback','identity-check',\n 'realname','realname-verified','realname-reminder','independent-password',\n 'messages-home','messages-offline','messages-menu','message-actions','system-messages',\n 'chat-inbound-request','chat-inbound-message','chat-outbound-request','chat-status',\n 'chat-friend','chat-media','chat-blocked','chat-deleted','chat-standard',\n 'chat-attachments','chat-mixed','chat-contact-card',\n 'compose-keyboard','mentions-select','mentions-complete','mentions-message',\n 'emoji-panel','emoji-message','voice-ready','voice-hold','voice-recording',\n 'media-uploading','media-gallery','media-retry','upload-file','file-message',\n 'message-multiselect','favorite-success','forward-select','forward-multiple',\n 'forward-individual','forward-bundle',\n 'address-book','friend-requests','add-friend','my-friend-qr','friend-qr','friend-search-result',\n 'friend-verification','friend-profile','group-member-profile','friend-settings',\n 'friend-settings-blocked','friend-delete-confirm','block-list','block-confirm','clear-chat-confirm',\n 'group-list','group-empty','group-invite','group-events','group-join-requests',\n 'group-new-request','group-announcement','group-summary','group-announcement-detail',\n 'group-settings','group-profile','group-avatar','group-nickname','group-description',\n 'group-my-nickname','group-members','group-role-message','group-qr','group-governance','group-admins','group-admin-add',\n 'group-admin-success','group-admin-partial','group-admin-removed','group-mute-add',\n 'group-muted','group-owner-select','group-owner-confirm','group-files','group-file-upload',\n 'favorites','favorites-mixed','favorites-files','favorites-text','favorites-voice',\n 'favorites-links','favorites-image','favorites-video','favorites-select','favorite-share','file-download','file-downloading',\n 'file-downloaded','history-search','history-files','history-links','history-images','history-videos',\n 'call-history','call-incoming','audio-call-ringing','audio-call-active','audio-call-muted',\n 'audio-call-speaker','video-call-ringing','video-call-camera-off','video-call-active',\n 'video-call-peer-camera-off','call-minimized',\n 'workbench','organization-directory','meeting-organizer','meeting-attendee',\n 'meeting-create','meeting-detail',\n 'daily-report-editor','daily-report-mine','daily-report-team','daily-report-detail',\n 'monthly-report-editor','monthly-report-mine','monthly-report-team','monthly-report-detail',\n 'executive-mailbox','executive-mailbox-notice',\n 'personal-center','personal-profile','profile-nickname','profile-birth-date',\n 'profile-signature','profile-gender','profile-region','personal-qrcode','android-settings',\n 'cache-clear-confirm','clear-history-confirm','change-password','delete-account-confirm',\n 'app-version','privacy-settings','friend-discovery-settings',\n 'youth-mode-off','youth-mode-on','youth-mode-verify',\n 'notification-permission','permission-settings-reminder','camera-permission-info',\n 'microphone-permission-info',\n 'fraud-risk-warning','fraud-risk-confirmation','abuse-report-reasons',\n 'abuse-report-details','user-feedback',\n ''];\n\n// 登录流程本身的页面。从这些页面登录成功后应该落到工作台;从任何其它页面(刷新触发的自动登录)\n// 则应该留在原处。\nconst AUTH_FLOW_VIEWS = ['tenant', 'login', 'register', 'reset', 'cred',\n 'enterprise-register', 'enterprise-feedback'];\n\n// Tinode 原生 WS 登录失败走的是 {ctrl} 协议,不是 REST 层——im-api.js 里那张\n// REASON_MESSAGES 翻译表只在 REST 请求里生效,这条路径完全绕开它。ctrl.text 是服务端\n// datamodel.go 里固定的英文串(authentication failed / unknown authentication scheme 等),\n// ctrl.params 里也没有像 REST 层那样稳定的 reason 字段可用(已实测确认)。\n// 原来这里直接把 err.message 原样显示,登录密码打错用户看到的是英文 \"authentication failed\",\n// 不是参考图要求的\"账号或密码错误\"。\n//\n// 这张表原来按 err.message 精确匹配裸文案——但 tinode-sdk 的 CommError 构造时会把状态码拼进\n// message 里(\"authentication failed (401)\"),导致这张表实际上从未真正命中过:'authentication\n// failed' 之所以看起来工作正常,纯粹是因为紧接着的 401/403 兜底分支凑巧给出了同一句译文,掩盖\n// 了匹配从未成立这件事;一旦命中 'unknown authentication scheme'(401,跟密码错误共用同一个状态\n// 码,会被兜底分支误判成\"账号或密码错误\")或 'policy violation'(422,不在兜底范围内)这两种更\n//少见的场景,用户就会看到带着 \"(状态码)\" 尾巴的原始英文。translateCtrlError 先去掉这段状态码\n// 后缀再查表,两个问题一并解决。\n//\n// 同一张表也被 handleDisconnect 复用,用来翻译 {hi} 阶段(登录请求发出之前)的连接失败——那个\n// 场景下 permission denied 最常见的真实原因是租户被停用,不是\"账号或密码错误\",所以只在这里放\n// 一份不带 401/403 兜底的裸翻译(loginErrorMessage 自己的兜底只应用在真正的登录尝试上)。\nconst CTRL_ERROR_TEXT_CN = {\n 'authentication failed': '账号或密码错误',\n 'authentication required': '请先登录',\n 'unknown authentication scheme': '登录方式不受支持,请刷新页面重试',\n 'policy violation': '当前操作不符合安全策略要求',\n 'permission denied': '没有权限执行此操作,请重新登录'\n};\nfunction translateCtrlError(err) {\n const raw = err && err.message;\n if (!raw) return null;\n const normalized = raw.replace(/\\s*\\(\\d+\\)\\s*$/, '').trim().toLowerCase();\n return CTRL_ERROR_TEXT_CN[normalized] || null;\n}\nfunction loginErrorMessage(err) {\n const known = translateCtrlError(err);\n if (known) return known;\n // 未知文案时按状态码兜底,401/403 绝大多数场景就是账号或密码错误\n if (err && (err.code === 401 || err.code === 403)) return '账号或密码错误';\n return (err && err.message) || '登录失败,请重试';\n}\n// navigateToCredentialsView 拒绝导航时,ctrl.params.reason 用来给用户一句能看懂的话——目前只有\n// INVITE_CODE_INVALID/INVITE_CODE_REQUIRED 两个真实用真实请求验证过,REVOKED/EXPIRED 是同一命名\n// 规律下合理的兄弟值,未逐一实测,先按同一套文案兜底,不影响已确认的两个分支。\nconst INVITE_CODE_REASON_TEXT_CN = {\n INVITE_CODE_REQUIRED: '请填写邀请码',\n INVITE_CODE_INVALID: '邀请码错误,请重新输入',\n INVITE_CODE_REVOKED: '邀请码已被撤销,请联系管理员获取新的邀请码',\n INVITE_CODE_EXPIRED: '邀请码已过期,请联系管理员获取新的邀请码'\n};\nfunction invalidCredentialsReasonMessage(params) {\n const reason = params && params.reason;\n return (reason && INVITE_CODE_REASON_TEXT_CN[reason]) || '注册信息校验未通过,请检查后重试';\n}\n\n// See armCallRingTimeout below.\nconst CALL_RING_TIMEOUT_MS = 60000;\n\nclass TinodeWeb extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n this.state = this.getBlankState();\n\n this.handleResize = this.handleResize.bind(this);\n this.handleHashRoute = this.handleHashRoute.bind(this);\n this.handleOnline = this.handleOnline.bind(this);\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleColorSchemeChange = this.handleColorSchemeChange.bind(this);\n this.checkForAppUpdate = this.checkForAppUpdate.bind(this);\n this.handleVisibilityEvent = this.handleVisibilityEvent.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleLoginRequest = this.handleLoginRequest.bind(this);\n this.handlePersistenceChange = this.handlePersistenceChange.bind(this);\n this.handleConnected = this.handleConnected.bind(this);\n this.handleAutoreconnectIteration = this.handleAutoreconnectIteration.bind(this);\n this.doLogin = this.doLogin.bind(this);\n this.handleLoginSuccessful = this.handleLoginSuccessful.bind(this);\n this.handleTenantResolved = this.handleTenantResolved.bind(this);\n this.handleDisconnect = this.handleDisconnect.bind(this);\n this.tnMeMetaDesc = this.tnMeMetaDesc.bind(this);\n this.tnMeContactUpdate = this.tnMeContactUpdate.bind(this);\n this.tnMeSubsUpdated = this.tnMeSubsUpdated.bind(this);\n this.resetContactList = this.resetContactList.bind(this);\n this.tnInitFind = this.tnInitFind.bind(this);\n this.tnFndSubsUpdated = this.tnFndSubsUpdated.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleTopicSelected = this.handleTopicSelected.bind(this);\n this.handleHideMessagesView = this.handleHideMessagesView.bind(this);\n this.handleSendMessage = this.handleSendMessage.bind(this);\n this.handleNewChatInvitation = this.handleNewChatInvitation.bind(this);\n this.handleNewAccount = this.handleNewAccount.bind(this);\n this.handleNewAccountRequest = this.handleNewAccountRequest.bind(this);\n this.handleImRegisterRequest = this.handleImRegisterRequest.bind(this);\n this.handleUpdatePasswordRequest = this.handleUpdatePasswordRequest.bind(this);\n this.handleUpdateAccountTagsRequest = this.handleUpdateAccountTagsRequest.bind(this);\n this.handleToggleIncognitoMode = this.handleToggleIncognitoMode.bind(this);\n this.handleChangeColorSchema = this.handleChangeColorSchema.bind(this);\n this.handleChangeTextSize = this.handleChangeTextSize.bind(this);\n this.handleSendOnEnter = this.handleSendOnEnter.bind(this);\n this.handleSelectWallpapers = this.handleSelectWallpapers.bind(this);\n this.handleWallpaperSelected = this.handleWallpaperSelected.bind(this);\n this.handleSettings = this.handleSettings.bind(this);\n this.handleGlobalSettings = this.handleGlobalSettings.bind(this);\n this.handleShowArchive = this.handleShowArchive.bind(this);\n this.handleShowBlocked = this.handleShowBlocked.bind(this);\n this.handleToggleMessageSounds = this.handleToggleMessageSounds.bind(this);\n this.handleCredAdd = this.handleCredAdd.bind(this);\n this.handleCredDelete = this.handleCredDelete.bind(this);\n this.handleCredConfirm = this.handleCredConfirm.bind(this);\n this.initFCMessaging = this.initFCMessaging.bind(this);\n this.toggleFCMToken = this.toggleFCMToken.bind(this);\n this.handlePushMessage = this.handlePushMessage.bind(this);\n this.handleSidepanelCancel = this.handleSidepanelCancel.bind(this);\n this.handleStartTopicRequest = this.handleStartTopicRequest.bind(this);\n this.handleNewTopicCreated = this.handleNewTopicCreated.bind(this);\n this.handleTopicUpdateRequest = this.handleTopicUpdateRequest.bind(this);\n this.handleUnarchive = this.handleUnarchive.bind(this);\n this.handleChangePermissions = this.handleChangePermissions.bind(this);\n this.handleTagsUpdateRequest = this.handleTagsUpdateRequest.bind(this);\n this.handleLogout = this.handleLogout.bind(this);\n this.handleDeleteAccount = this.handleDeleteAccount.bind(this);\n this.handleDeleteTopicRequest = this.handleDeleteTopicRequest.bind(this);\n this.handleDeleteMessagesRequest = this.handleDeleteMessagesRequest.bind(this);\n this.handleLeaveUnsubRequest = this.handleLeaveUnsubRequest.bind(this);\n this.handleBlockTopicRequest = this.handleBlockTopicRequest.bind(this);\n this.handleReportTopic = this.handleReportTopic.bind(this);\n this.handleShareTheCard = this.handleShareTheCard.bind(this);\n this.handleShowContextMenu = this.handleShowContextMenu.bind(this);\n this.defaultTopicContextMenu = this.defaultTopicContextMenu.bind(this);\n this.handleHideContextMenu = this.handleHideContextMenu.bind(this);\n this.handleShowAlert = this.handleShowAlert.bind(this);\n this.handleShowInfoView = this.handleShowInfoView.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleValidateCredentialsRequest = this.handleValidateCredentialsRequest.bind(this);\n this.handlePasswordResetRequest = this.handlePasswordResetRequest.bind(this);\n this.handleResetPassword = this.handleResetPassword.bind(this);\n this.handleContextMenuAction = this.handleContextMenuAction.bind(this);\n this.handleShowCountrySelector = this.handleShowCountrySelector.bind(this);\n\n this.handleShowForwardDialog = this.handleShowForwardDialog.bind(this);\n this.handleHideForwardDialog = this.handleHideForwardDialog.bind(this);\n\n this.handleEnterSelectMode = this.handleEnterSelectMode.bind(this);\n this.handleToggleMessageSelect = this.handleToggleMessageSelect.bind(this);\n this.handleExitSelectMode = this.handleExitSelectMode.bind(this);\n this.handleShowBatchForward = this.handleShowBatchForward.bind(this);\n this.handleHideBatchForward = this.handleHideBatchForward.bind(this);\n\n this.handleOpenScanner = this.handleOpenScanner.bind(this);\n this.handleCloseScanner = this.handleCloseScanner.bind(this);\n this.handleQrDetected = this.handleQrDetected.bind(this);\n this.handleSubmitGroupJoinRequest = this.handleSubmitGroupJoinRequest.bind(this);\n this.handleCancelGroupJoinPreview = this.handleCancelGroupJoinPreview.bind(this);\n\n this.handleStartVideoCall = this.handleStartVideoCall.bind(this);\n this.handleStartAudioCall = this.handleStartAudioCall.bind(this);\n this.handleInfoMessage = this.handleInfoMessage.bind(this);\n this.handleDataMessage = this.handleDataMessage.bind(this);\n this.handleCallClose = this.handleCallClose.bind(this);\n\n this.handleCallInvite = this.handleCallInvite.bind(this);\n this.handleCallRinging = this.handleCallRinging.bind(this);\n this.handleCallHangup = this.handleCallHangup.bind(this);\n this.handleCallSendOffer = this.handleCallSendOffer.bind(this);\n this.handleCallIceCandidate = this.handleCallIceCandidate.bind(this);\n this.handleCallSendAnswer = this.handleCallSendAnswer.bind(this);\n\n this.handleCallAccept = this.handleCallAccept.bind(this);\n\n this.sendMessageToTopic = this.sendMessageToTopic.bind(this);\n\n // FIXME: this is unused.\n this.callTimeoutTimer = null;\n }\n\n getBlankState() {\n const settings = LocalStorageUtil.getObject('settings') || {};\n const persist = !!LocalStorageUtil.getObject('keep-logged-in');\n if (!settings.wallpaper) {\n const wallpaper = defaultWallpaper();\n settings.wallpaper = wallpaper.name || '';\n settings.wallpaperSize = wallpaper.size || 0;\n settings.wallpaperBlur = 0;\n }\n return {\n connected: false,\n // Connected and subscribed to 'me'\n ready: false,\n // Try to re-login on new connection.\n autoLogin: false,\n transport: settings.transport || null,\n serverAddress: settings.serverAddress || detectServerAddress(),\n secureConnection: settings.secureConnection === undefined ?\n isSecureConnection() : settings.secureConnection,\n serverVersion: \"no connection\",\n // \"On\" is the default, so saving the \"off\" state.\n messageSounds: !settings.messageSoundsOff,\n incognitoMode: false,\n // Manually selected color scheme. Default: 'system default' ('auto').\n colorSchema: settings.colorSchema || DEFAULT_COLOR_SCHEME,\n systemColorSchema: window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light',\n // Wallpaper settings.\n wallpaper: settings.wallpaper,\n wallpaperSize: settings.wallpaperSize,\n wallpaperBlur: 0,\n // Text size in points. Default size: 10pt\n textSize: settings.textSize || DEFAULT_TEXT_SIZE,\n // Default: 'plain' (just Enter)\n sendOnEnter: settings.sendOnEnter || 'plain',\n // Persistent request to enable alerts.\n desktopAlerts: persist && !!settings.desktopAlerts,\n // Enable / disable checkbox.\n desktopAlertsEnabled: (isSecureConnection() || isLocalHost()) &&\n (typeof firebaseInitApp != 'undefined') && (typeof navigator != 'undefined') &&\n (typeof FIREBASE_INIT != 'undefined'),\n firebaseToken: persist ? LocalStorageUtil.getObject('firebase-token') : null,\n\n applicationVisible: !document.hidden,\n\n errorText: '',\n errorLevel: null,\n errorAction: undefined,\n errorActionText: null,\n\n sidePanelSelected: 'tenant',\n sidePanelParams: {},\n sidePanelTitle: null,\n sidePanelAvatar: null,\n myTrustedBadges: [],\n loadSpinnerVisible: false,\n\n login: '',\n password: '',\n persist: persist,\n myUserId: null,\n liveConnection: navigator.onLine,\n topicSelected: '',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n newTopicParams: null,\n loginDisabled: false,\n displayMobile: (window.innerWidth <= MEDIA_BREAKPOINT),\n infoPanel: undefined,\n mobilePanel: 'sidepanel',\n\n // Video calls.\n callTopic: undefined,\n callState: CALL_STATE_NONE,\n callAudioOnly: undefined,\n // If true, call state should be transitioned to CALL_STATE_IN_PROGRESS upon\n // switching to the call topic.\n callShouldStart: false,\n\n contextMenuVisible: false,\n contextMenuBounds: null,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuItems: [],\n\n forwardDialogVisible: false,\n forwardMessage: null,\n\n // Ch.4 multi-select: entered via the message context menu's \"menu_item_select\" item.\n selectMode: false,\n selectModeTopic: null,\n selectedSeqs: [],\n batchForwardVisible: false,\n\n // QR scanning (\"扫一扫\", Ch.2/5). Holds live camera state so it's modeled the same way as\n // the call panel/forward dialog above, not as a hash route -- there's nothing to deep-link\n // into mid-scan, and the camera stream needs a reliable single owner to tear down.\n scannerOpen: false,\n // Set once a \"join_group\" QR resolves to a real group the user isn't in yet (status\n // \"can_request\") -- holds enough of the group's summary to render the confirm sheet, plus\n // the scanned token so the join request can reference how it was created.\n groupJoinPreview: null,\n\n // Modal alert dialog.\n alertVisible: false,\n alertParams: {},\n\n // Chats as shown in the ContactsView\n chatList: [],\n // Contacts returned by a search query.\n searchResults: [],\n // Merged results of a search query and p2p chats.\n searchableContacts: [],\n // Credential validation.\n reqCredMethod: undefined,\n credMethod: undefined,\n credCode: undefined,\n credToken: undefined,\n // Topic to go to after login.\n requestedTopic: undefined\n };\n }\n\n componentDidMount() {\n window.addEventListener('resize', this.handleResize);\n this.handleOnlineOn = _ => { this.handleOnline(true); }\n window.addEventListener('online', this.handleOnlineOn);\n this.handleOnlineOff = _ => { this.handleOnline(false); }\n window.addEventListener('offline', this.handleOnlineOff);\n window.addEventListener('hashchange', this.handleHashRoute);\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', this.handleColorSchemeChange);\n\n // Window/tab visible or invisible for pausing timers.\n document.addEventListener('visibilitychange', this.handleVisibilityEvent);\n\n // Listen for Escape key to clear selections.\n document.addEventListener('keydown', this.handleEscapeKey);\n\n document.documentElement.style.colorScheme = this.state.colorSchema == 'auto' ? 'light dark' : this.state.colorSchema;\n document.documentElement.style.setProperty('--message-text-size', `${this.state.textSize}pt`);\n\n this.applyWallpaperSettings(this.state.wallpaper, this.state.wallpaperSize, this.state.wallpaperBlur,\n this.state.colorSchema == 'auto' ? this.state.systemColorSchema : this.state.colorSchema);\n\n // Process background notifications from the service worker.\n if (typeof BroadcastChannel == 'function') {\n const serviceWorkerChannel = new BroadcastChannel('tinode-sw');\n serviceWorkerChannel.addEventListener('message', this.handlePushMessage);\n } else {\n // Safari is broken by design.\n console.warn(\"Your browser does not support BroadcastChannel. Some features will not be available\");\n }\n\n // Detect if computer just woke up from sleep. Checks how much time has passed since the last tick.\n // If too much time has passed then the computer was asleep.\n this.lastWakeUpCheck = new Date().getTime();\n this.wakeUpTicker = setInterval(_ => {\n const now = new Date().getTime();\n if (now - this.lastWakeUpCheck > WAKE_UP_TIMEOUT) {\n // Trigger reconnect.\n this.handleOnlineOn();\n }\n this.lastWakeUpCheck = now;\n }, WAKE_UP_TICK);\n\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n\n new Promise((resolve, reject) => {\n // Must match state.secureConnection's own fallback (line ~233), not just isSecureConnection()\n // directly -- otherwise a tenant resolved on a prior visit (which persists secureConnection via\n // handleTenantResolved) diverges from the client actually constructed here on this load, and\n // handleTenantResolved's own \"did anything change\" check (comparing against this same state)\n // then wrongly concludes there's nothing to reconnect.\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, this.state.secureConnection, this.state.transport,\n this.props.intl.locale, this.state.persist, resolve);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n }).then(_ => {\n // Initialize desktop alerts.\n if (this.state.desktopAlertsEnabled) {\n this.initFCMessaging().catch(_ => {\n // do nothing: handled earlier.\n // catch needed to pervent unnecessary logging of error.\n });\n }\n\n // Read contacts from cache.\n this.resetContactList();\n\n const token = this.state.persist ? LocalStorageUtil.getObject('auth-token') : undefined;\n if (token) {\n this.setState({autoLogin: true});\n\n // When reading from storage, date is returned as string.\n token.expires = new Date(token.expires);\n this.tinode.setAuthToken(token);\n this.tinode.connect().catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n\n // Parse the hash navigation params.\n const parsedNav = HashNavigation.parseUrlHash(window.location.hash);\n // Maybe navigate to home screen.\n if (!SIDE_PANEL_VIEWS.includes(parsedNav.path[0]) || !parsedNav.path[0]) {\n // Save possible topic name.\n this.setState({requestedTopic: parsedNav.path[1]});\n const path = parsedNav.params && parsedNav.params.cred_done ?\n HashNavigation.addUrlParam('', 'cred_done', parsedNav.params.cred_done):\n '';\n HashNavigation.navigateTo(path);\n } else {\n this.handleHashRoute();\n }\n });\n }\n\n componentWillUnmount() {\n window.removeEventListener('resize', this.handleResize);\n window.removeEventListener('hashchange', this.handleHashRoute);\n window.removeEventListener('online', this.handleOnlineOn);\n window.removeEventListener('offline', this.handleOnlineOff);\n window.matchMedia('(prefers-color-scheme: dark)').removeEventListener('change', this.handleColorSchemeChange);\n document.removeEventListener('visibilitychange', this.handleVisibilityEvent);\n document.removeEventListener('keydown', this.handleEscapeKey);\n\n clearInterval(this.wakeUpTicker);\n }\n\n // Setup transport (usually websocket) and server address. This will terminate connection with the server.\n static tnSetup(serverAddress, secureConnection, transport, locale, persistentCache, onSetupCompleted) {\n const tinode = new Tinode({appName: APP_NAME, host: serverAddress, apiKey: API_KEY, transport: transport,\n secure: secureConnection, persist: persistentCache}, onSetupCompleted);\n tinode.setHumanLanguage(locale);\n tinode.enableLogging(LOGGING_ENABLED, true);\n TinodeWeb.installTenantHiPatch(tinode);\n return tinode;\n }\n\n // The server extends two stock packets with fields the JS SDK has no API for (server/datamodel.go):\n // MsgClientHi.Tenant (`hi.tenant`, resolved via POST /v1/im/tenants/resolve) and MsgClientAcc's\n // `username`/`phone`/`invite_code` (used by server/user.go replyCreateUser during registration).\n // #initPacket is a private class field so the only usable hook is wrapping the connection's sendText\n // and injecting fields into the outgoing packet's already-serialized JSON. A cheap substring check\n // keeps this a no-op for the hot path (every {pub}/{note}/... also goes through sendText).\n static installTenantHiPatch(tinode) {\n const conn = tinode && tinode._connection;\n if (!conn || conn.__tenantPatched) {\n return;\n }\n const original = conn.sendText.bind(conn);\n conn.sendText = msg => {\n if (typeof msg == 'string' && (msg.indexOf('\"hi\":') >= 0 || msg.indexOf('\"acc\":') >= 0)) {\n try {\n const parsed = JSON.parse(msg);\n if (parsed.hi) {\n const tenant = getTenantContext();\n if (tenant && tenant.code) {\n parsed.hi.tenant = tenant.code;\n msg = JSON.stringify(parsed);\n }\n } else if (parsed.acc && tinode.__pendingAccExtra) {\n Object.assign(parsed.acc, tinode.__pendingAccExtra);\n tinode.__pendingAccExtra = null;\n msg = JSON.stringify(parsed);\n }\n } catch (e) {\n // Not valid JSON -- send as is.\n }\n }\n return original(msg);\n };\n conn.__tenantPatched = true;\n }\n\n // Tinode received a push notification from the server.\n handlePushMessage(payload) {\n this.tinode.oobNotification(payload.data || {});\n }\n\n initFCMessaging() {\n const {formatMessage, locale} = this.props.intl;\n const onError = (msg, err) => {\n console.error(msg, err);\n this.handleError(formatMessage(messages.push_init_failed), 'err');\n this.setState({firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n }\n\n try {\n this.fcm = firebaseGetMessaging(firebaseInitApp(FIREBASE_INIT, BASE_APP_NAME));\n return navigator.serviceWorker.getRegistration('/service-worker.js').then(reg => {\n return reg || navigator.serviceWorker.register('/service-worker.js').then(reg => {\n this.checkForAppUpdate(reg);\n return reg;\n });\n }).then(reg => {\n // Pass locale and version config to the service worker.\n (reg.active || reg.installing).postMessage(JSON.stringify({locale: locale, version: PACKAGE_VERSION}));\n // Request token.\n return TinodeWeb.requestFCMToken(this.fcm, reg);\n }).then(token => {\n const persist = LocalStorageUtil.getObject('keep-logged-in');\n if (token != this.state.firebaseToken) {\n this.tinode.setDeviceToken(token);\n if (persist) {\n LocalStorageUtil.setObject('firebase-token', token);\n }\n }\n this.setState({firebaseToken: token, desktopAlerts: true});\n if (persist) {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }\n\n // Handhe FCM pushes\n // (a) for channels always,\n // (b) pushes when the app is in foreground but has no focus.\n firebaseOnMessage(this.fcm, payload => { this.handlePushMessage(payload); });\n }).catch(err => {\n // SW registration or FCM has failed :(\n onError(err);\n throw err;\n });\n } catch (err) {\n onError(err);\n return Promise.reject(err);\n }\n }\n\n // Google's FCM API is idiotic.\n static requestFCMToken(fcm, sw) {\n return firebaseGetToken(fcm, {\n serviceWorkerRegistration: sw,\n vapidKey: FIREBASE_INIT.messagingVapidKey\n }).then(token => {\n if (token) {\n return token;\n } else if (typeof Notification != 'undefined') {\n // Try to request permissions.\n return Notification.requestPermission().then(permission => {\n if (permission === 'granted') {\n return firebaseGetToken(fcm, {\n serviceWorkerRegistration: sw,\n vapidKey: FIREBASE_INIT.messagingVapidKey\n }).then(token => {\n if (token) {\n return token;\n } else {\n throw new Error(\"Failed to initialize notifications\");\n }\n });\n } else {\n throw new Error(\"No permission to send notifications: \" + permission);\n }\n });\n }\n throw new Error(\"Notifications are not supported\");\n });\n }\n\n handleResize() {\n const mobile = document.documentElement.clientWidth <= MEDIA_BREAKPOINT;\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n if (this.state.displayMobile != mobile) {\n this.setState({displayMobile: mobile});\n }\n }\n\n handleEscapeKey(e) {\n if (e.key === 'Escape' || e.keyCode === 27) {\n // Clear selections and navigate to base state\n this.setState({\n topicSelected: null,\n errorText: '',\n errorLevel: null,\n mobilePanel: 'sidepanel',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n infoPanel: undefined,\n forwardMessage: null,\n contextMenuVisible: false,\n forwardDialogVisible: false,\n alertVisible: false\n });\n // Navigate to contacts or login view\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', null));\n }\n }\n\n // Check if a newer version of TinodeWeb app is available at the server.\n checkForAppUpdate(reg) {\n reg.onupdatefound = _ => {\n const installingWorker = reg.installing;\n installingWorker.onstatechange = _ => {\n if (installingWorker.state == 'installed' && navigator.serviceWorker.controller) {\n const msg = <>\n \n \n .>;\n this.handleError(msg, 'info');\n }\n }\n }\n }\n\n // Handle for hash navigation (hashchange) event: update state.\n handleHashRoute() {\n const hash = HashNavigation.parseUrlHash(window.location.hash);\n // Start with panel parameters.\n const newState = {\n infoPanel: hash.params.info,\n newTopicTabSelected: hash.params.tab\n };\n\n if (hash.path && hash.path.length > 0) {\n // Left-side panel selector.\n if (SIDE_PANEL_VIEWS.includes(hash.path[0])) {\n newState.sidePanelSelected = hash.path[0];\n newState.sidePanelParams = hash.params;\n } else {\n console.warn(\"Unknown sidepanel view\", hash.path[0]);\n }\n\n // Topic for MessagesView selector.\n let topicName = hash.path[1] || null;\n if (topicName != this.state.topicSelected) {\n if (!Tinode.topicType(topicName)) {\n // Clear invalid topic name and hide messages view on mobile.\n topicName = null;\n newState.mobilePanel = 'sidepanel';\n } else {\n // Topic valid: show messages view on mobile.\n newState.mobilePanel = 'topic-view';\n }\n Object.assign(newState, {\n topicSelected: topicName,\n topicSelectedAcs: this.tinode.getTopicAccessMode(topicName)\n });\n }\n } else {\n // Empty hashpath\n Object.assign(newState, {sidePanelSelected: '', sidePanelParams: {}, topicSelected: null});\n }\n\n // Save credential validation parameters, if available.\n if (hash.params.method) {\n newState.credMethod = hash.params.method;\n }\n if (hash.params.code) {\n newState.credCode = hash.params.code;\n }\n if (hash.params.token) {\n newState.credToken = hash.params.token;\n }\n\n // Show a message if validation was successful.\n if (hash.params.cred_done) {\n Object.assign(newState,\n TinodeWeb.stateForError(this.props.intl.formatMessage(messages.cred_confirmed_successfully), 'info'));\n }\n\n this.setState(newState);\n }\n\n handleOnline(online) {\n if (online) {\n this.handleError();\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n } else {\n this.handleError(this.props.intl.formatMessage(messages.no_connection), 'warn');\n }\n this.setState({liveConnection: online});\n }\n\n handleVisibilityEvent() {\n this.setState({applicationVisible: !document.hidden});\n }\n\n static stateForError(err, level, action, actionText) {\n return {\n errorText: err,\n errorLevel: level,\n errorAction: action,\n errorActionText: actionText,\n callShouldStart: false,\n };\n }\n\n handleError(err, level, action, actionText) {\n this.setState(TinodeWeb.stateForError(err, level, action, actionText));\n }\n\n // User clicked Login button in the side panel.\n handleLoginRequest(login, password) {\n this.setState({\n loginDisabled: true,\n login: login,\n password: password,\n loadSpinnerVisible: true,\n autoLogin: true\n });\n this.handleError('', null);\n\n if (this.tinode.isConnected()) {\n this.doLogin(login, password, null, {meth: this.state.credMethod, resp: this.state.credCode});\n } else {\n this.tinode.connect().catch(err => {\n // Socket error\n this.setState({loginDisabled: false, autoLogin: false, loadSpinnerVisible: false});\n this.handleError(err.message, 'err');\n });\n }\n\n if (this.state.desktopAlertsEnabled && !this.state.firebaseToken) {\n // Firefox and Safari: \"The Notification permission may only be requested from inside a\n // short running user-generated event handler\".\n this.initFCMessaging();\n }\n }\n\n // Enable or disable saving the password and IndexedDB.\n handlePersistenceChange(persist) {\n if (persist) {\n this.tinode.initStorage().then(_ => {\n LocalStorageUtil.setObject('keep-logged-in', true);\n this.setState({persist: true});\n });\n } else {\n this.tinode.clearStorage().then(_ => {\n LocalStorageUtil.setObject('keep-logged-in', false);\n this.setState({persist: false});\n });\n }\n }\n\n // Connection succeeded.\n handleConnected() {\n // Just to be sure.\n clearInterval(this.reconnectCountdown);\n this.handleError();\n\n const params = this.tinode.getServerInfo();\n this.setState({\n serverVersion: params.ver + ' ' + (params.build ? params.build : 'none'),\n // \"reqCred\":{\"auth\":[\"email\"]}\n reqCredMethod: ((params.reqCred || {}).auth || [])[0] || 'email'\n });\n\n if (this.state.autoLogin) {\n this.doLogin(this.state.login, this.state.password, null,\n {meth: this.state.credMethod, resp: this.state.credCode});\n }\n }\n\n // Called for each auto-reconnect iteration.\n handleAutoreconnectIteration(sec, prom) {\n clearInterval(this.reconnectCountdown);\n\n if (sec < 0) {\n // Clear error\n this.handleError();\n return;\n }\n\n if (prom) {\n // Reconnecting now\n prom.then(_ => {\n // Reconnected: clear error\n this.handleError();\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n return;\n }\n\n const {formatMessage} = this.props.intl;\n let count = sec / 1000;\n count = count | count;\n this.reconnectCountdown = setInterval(_ => {\n if (count < -10) {\n // Count could go to negative if computer woke up from sleep.\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n return;\n }\n\n const fmtTime = (count > 99) ? secondsToTime(count) : count;\n this.handleError(\n formatMessage(messages.reconnect_countdown, {seconds: fmtTime}),\n 'warn',\n _ => {\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n },\n formatMessage(messages.reconnect_now)\n );\n count -= 1;\n }, 1000);\n }\n\n // Connection lost. Also covers a {hi} handshake rejected before login ever gets a chance to run\n // (e.g. the tenant being deactivated mid-session) -- that path calls onDisconnect, not the {login}\n // catch block down in doLogin, so without translateCtrlError here it showed the raw English\n // ctrl.text (e.g. \"permission denied (403)\") instead of any Chinese message at all.\n handleDisconnect(err) {\n const known = translateCtrlError(err);\n this.setState({\n connected: false,\n ready: false,\n topicSelectedOnline: false,\n errorText: known || (err && err.message ? err.message : \"Disconnected\"),\n errorLevel: err && err.message ? 'err' : 'warn',\n loginDisabled: false,\n contextMenuVisible: false,\n forwardDialogVisible: false,\n serverVersion: \"no connection\"\n });\n }\n\n doLogin(login, password, tmpToken, cred) {\n if (this.tinode.isAuthenticated()) {\n // Already logged in. Go to default screen.\n HashNavigation.navigateTo('');\n return;\n }\n\n let token = tmpToken || (this.tinode.getAuthToken() || {}).token;\n if (!(login && password) && !token) {\n // No login credentials provided.\n // Make sure we are on the login page.\n HashNavigation.navigateTo('');\n this.setState({loginDisabled: false});\n return;\n }\n\n // Sanitize and package credentail.\n cred = Tinode.credential(cred);\n // May be disconnected.\n let connectionPromise = this.tinode.isConnected() ? Promise.resolve() : this.tinode.connect();\n // Try to login with login/password. If they are not available, try token; if no token, ask for login/password.\n let loginPromise;\n if (login && password) {\n token = null;\n this.setState({password: null});\n loginPromise = connectionPromise.then(_ => this.tinode.loginBasic(login, password, cred));\n } else {\n loginPromise = connectionPromise.then(_ => this.tinode.loginToken(token, cred));\n }\n\n loginPromise.then(ctrl => {\n if (ctrl.code >= 300 && ctrl.text === 'validate credentials') {\n this.setState({loadSpinnerVisible: false});\n if (cred) {\n this.handleError(this.props.intl.formatMessage(messages.code_doesnot_match), 'warn');\n }\n if (!TinodeWeb.navigateToCredentialsView(ctrl.params) && !cred) {\n this.handleError(invalidCredentialsReasonMessage(ctrl.params), 'err');\n }\n } else {\n this.handleLoginSuccessful();\n }\n }).catch(err => {\n const autoLogin = err.code >= 500;\n // Connection or login failed, report error.\n this.setState({\n loginDisabled: false,\n credMethod: undefined,\n credCode: undefined,\n loadSpinnerVisible: false,\n autoLogin: autoLogin\n });\n this.handleError(loginErrorMessage(err), 'err');\n console.warn(\"Login failed\", err);\n if (!autoLogin) {\n if (token) {\n // 存的 token 失效(过期/被撤销)——这属于\"会话没了\",回到登录入口是对的。\n this.handleLogout();\n HashNavigation.navigateTo('');\n }\n // 用户手输账号密码失败(401 之类)时**不要**导航。原来这里无条件 navigateTo(''),\n // 会把 sidePanelSelected 清成 '',render 里 '' 又落到 'tenant',于是密码打错一次就被\n // 弹回企业码页,刚输的账号丢了;而 TenantEntry 不渲染 FormAlert、chapterOne 分支也不渲染\n // ErrorPanel,那句错误提示用户根本看不到。留在登录页,errorText 才能显示出来。\n }\n });\n }\n\n // ctrl.code>=300 / ctrl.text=='validate credentials' is standard Tinode for \"account created,\n // now confirm a real credential (email code etc.)\" -- ctrl.params.cred is guaranteed non-empty in\n // that case. This backend reuses the exact same code/text pair for its own invite-code errors\n // (INVITE_CODE_INVALID/INVITE_CODE_REQUIRED, confirmed live), which carry `reason`/`what` instead\n // of `cred` -- calling this without checking left `params.cred[0]` throwing a raw TypeError that\n // surfaced to the user as unreadable English. Returns whether it actually navigated, so both call\n // sites can show a real error message instead when it didn't.\n static navigateToCredentialsView(params) {\n if (!Array.isArray(params.cred) || !params.cred.length) {\n return false;\n }\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n parsed.path[0] = 'cred';\n parsed.params['method'] = params.cred[0];\n parsed.params['token'] = params.token;\n parsed.params['code'] = params.code;\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n return true;\n }\n\n handleLoginSuccessful() {\n this.handleError();\n\n // Refresh authentication token.\n if (LocalStorageUtil.getObject('keep-logged-in')) {\n LocalStorageUtil.setObject('auth-token', this.tinode.getAuthToken());\n }\n // im-api.js's REST calls (bootstrap, friends, ...) need a bearer token independent of whether the\n // user opted into surviving a browser restart -- sessionStorage covers \"this tab's session\",\n // matching how long the in-memory WS auth actually lasts when \"keep logged in\" is off.\n const authToken = this.tinode.getAuthToken();\n sessionStorage.setItem('im-session-token', authToken ? authToken.token : '');\n\n // On reconnect, requestedTopic is undefined but topicSelected may still be set.\n // Preserve the open topic so it gets restored after re-login.\n const goToTopic = this.state.requestedTopic || this.state.topicSelected;\n // Logged in fine, subscribe to 'me' attaching callbacks from the contacts view.\n const me = this.tinode.getMeTopic();\n me.onMetaDesc = this.tnMeMetaDesc;\n me.onContactUpdate = this.tnMeContactUpdate;\n me.onSubsUpdated = this.tnMeSubsUpdated;\n this.setState({\n connected: true,\n credMethod: undefined,\n credCode: undefined,\n credToken: undefined,\n myUserId: this.tinode.getCurrentUserID(),\n autoLogin: true,\n requestedTopic: undefined,\n });\n // Subscribe, fetch topic desc, the list of subscriptions. Messages are not fetched.\n me.subscribe(\n me.startMetaQuery().\n withLaterSub().\n withDesc().\n withTags().\n withCred().\n build()\n ).catch(err => {\n this.tinode.disconnect();\n localStorage.removeItem('auth-token');\n this.handleError(err.message, 'err');\n HashNavigation.navigateTo('');\n }).finally(_ => {\n this.setState({loadSpinnerVisible: false});\n });\n // The new bottom nav only has \"workbench\" and \"messages\" -- there's no standalone contacts\n // entry point anymore, so landing a fresh login there orphaned the user outside the nav they can\n // actually see. Land on the workbench instead (matches the \"工作台优先\" home screen in the mocks).\n //\n // 但只在\"真的刚走完登录流程\"时才这么跳。这个方法在页面刷新触发自动登录时也会执行,原来无条件\n // 改写 hash,等于把用户刷新前所在的页面冲掉——不管停在个人中心、群设置还是收藏,刷新后一律\n // 被弹到工作台。现在先看当前 hash 是不是一个有效的、非登录流程的视图,是就原样保留。\n const currentView = HashNavigation.parseUrlHash(window.location.hash).path[0];\n const cameFromAuthFlow = !currentView || AUTH_FLOW_VIEWS.includes(currentView) ||\n !SIDE_PANEL_VIEWS.includes(currentView);\n let urlHash = cameFromAuthFlow ?\n HashNavigation.setUrlSidePanel(window.location.hash, 'workbench') : window.location.hash;\n if (goToTopic) {\n urlHash = HashNavigation.setUrlTopic(urlHash, goToTopic);\n }\n HashNavigation.navigateTo(urlHash);\n }\n\n tnMeMetaDesc(desc) {\n if (!desc) {\n return;\n }\n\n if (desc.public) {\n this.setState({\n sidePanelTitle: desc.public.fn,\n sidePanelAvatar: makeImageUrl(desc.public.photo)\n });\n }\n\n if (desc.trusted) {\n const badges = [];\n for (const [key, val] of Object.entries(desc.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n this.setState({\n myTrustedBadges: badges,\n });\n }\n\n if (desc.acs) {\n this.setState({\n incognitoMode: !desc.acs.isPresencer()\n });\n }\n\n if (TinodeWeb.checkIfPinsUpdated(desc, this.state.chatList)) {\n this.resetContactList();\n }\n }\n\n // Reactions to updates to the contact list.\n tnMeContactUpdate(what, cont) {\n if (what == 'on' || what == 'off') {\n this.resetContactList();\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedOnline: (what == 'on')});\n }\n } else if (what == 'read') {\n this.resetContactList();\n } else if (what == 'msg' && cont) {\n // Check if the topic is archived. If so, don't play a sound.\n const topic = this.tinode.getTopic(cont.topic);\n const archived = topic && topic.isArchived();\n\n // New message received. Maybe the message is from the current user, then unread is 0.\n if (cont.unread > 0 && this.state.messageSounds && !archived) {\n // Skip update if the topic is currently open, otherwise the badge will annoyingly flash.\n if (document.hidden || this.state.topicSelected != cont.topic) {\n POP_SOUND.play().catch(_ => {\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n });\n }\n }\n // Reorder contact list to use possibly updated 'touched'.\n this.resetContactList();\n } else if (what == 'recv') {\n // Explicitly ignoring \"recv\" -- it causes no visible updates to contact list.\n } else if (what == 'gone' || what == 'unsub') {\n // Topic deleted or user unsubscribed. Remove topic from view.\n // If the currently selected topic is gone, clear the selection.\n if (this.state.topicSelected == cont.topic) {\n this.handleTopicSelected(null);\n }\n // Redraw without the deleted topic.\n this.resetContactList();\n } else if (what == 'acs') {\n // Permissions changed. If it's for the currently selected topic,\n // update the views.\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedAcs: cont.acs});\n }\n } else if (what == 'del') {\n // TODO: messages deleted (hard or soft) -- update pill counter.\n } else if (what == 'upd' || what == 'call') {\n // upd, call - handled by the SDK. Explicitly ignoring here.\n } else {\n // TODO(gene): handle other types of notifications:\n // * ua -- user agent changes (maybe display a pictogram for mobile/desktop).\n console.info(\"Unsupported (yet) presence update:\", what, \"in\", (cont || {}).topic);\n }\n }\n\n tnMeSubsUpdated(unused) {\n this.resetContactList();\n }\n\n // Merge search results and contact list to create a single flat\n // list of known contacts for GroupManager to use.\n static prepareSearchableContacts(chatList, foundContacts) {\n const merged = {};\n\n // For chatList topics merge only p2p topics and convert them to the\n // same format as foundContacts.\n for (const c of chatList) {\n if (Tinode.isP2PTopicName(c.topic)) {\n merged[c.topic] = {\n user: c.topic,\n updated: c.updated,\n public: c.public,\n private: c.private,\n acs: c.acs\n };\n }\n }\n\n // Add all foundCountacts if they have not been added already.\n for (const c of foundContacts) {\n if (!merged[c.user]) {\n merged[c.user] = c;\n }\n }\n\n return Object.values(merged);\n }\n\n resetContactList() {\n const newState = {\n chatList: []\n };\n\n if (!this.state.ready) {\n newState.ready = true;\n }\n\n const me = this.tinode.getMeTopic();\n me.contacts(c => {\n if (!c.topic && !c.user) {\n // Contacts expect c.topic to be set.\n c.topic = c.name;\n }\n\n newState.chatList.push(c);\n if (this.state.topicSelected == c.topic) {\n newState.topicSelectedOnline = c.online;\n newState.topicSelectedAcs = c.acs;\n }\n });\n\n const past = new Date(0);\n newState.chatList.sort((a, b) => {\n // Pinned topics take precedence.\n const pins = me.pinnedTopicRank(b.topic) - me.pinnedTopicRank(a.topic);\n // Then sort by last touched time.\n return pins != 0 ? pins : (b.touched || past).getTime() - (a.touched || past).getTime();\n });\n\n // Merge search results and chat list.\n newState.searchableContacts = TinodeWeb.prepareSearchableContacts(newState.chatList, this.state.searchResults);\n this.setState(newState);\n }\n\n static checkIfPinsUpdated(me, chatList) {\n for (let i = 0; i < chatList.length; i++) {\n const c = chatList[i];\n if (!!me.pinnedTopicRank(c.topic) != c.pinned) {\n return true;\n }\n }\n return false;\n }\n\n /* Fnd topic: find contacts by tokens */\n tnInitFind() {\n const fnd = this.tinode.getFndTopic();\n fnd.onSubsUpdated = this.tnFndSubsUpdated;\n if (fnd.isSubscribed()) {\n this.tnFndSubsUpdated();\n } else {\n fnd.subscribe(fnd.startMetaQuery().withSub().build()).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n tnFndSubsUpdated() {\n const foundContacts = [];\n // Don't attempt to create P2P topics which already exist. Server will reject the duplicates.\n this.tinode.getFndTopic().contacts((s) => {\n foundContacts.push(s);\n });\n this.setState({\n searchResults: foundContacts,\n searchableContacts: TinodeWeb.prepareSearchableContacts(this.state.chatList, foundContacts)\n });\n }\n\n /** Called when the user enters a contact into the contact search field in the NewAccount panel\n @param query {Array} is an array of contacts to search for\n */\n handleSearchContacts(query) {\n const fnd = this.tinode.getFndTopic();\n fnd.setMeta({desc: {public: query}})\n .then(_ => fnd.getMeta(fnd.startMetaQuery().withSub().build()))\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n // User clicked on a topic in the side panel or deleted a topic.\n handleTopicSelected(topicName) {\n // Clear newTopicParams after use.\n if (this.state.newTopicParams && this.state.newTopicParams._topicName != topicName) {\n this.setState({\n newTopicParams: null\n });\n }\n\n if (topicName) {\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'topic-view',\n infoPanel: undefined\n });\n // Different topic selected.\n if (this.state.topicSelected != topicName) {\n this.setState({\n topicSelectedOnline: this.tinode.isTopicOnline(topicName),\n topicSelectedAcs: this.tinode.getTopicAccessMode(topicName),\n forwardMessage: null\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', topicName));\n }\n } else {\n // Currently selected contact deleted\n this.setState({\n topicSelected: null,\n errorText: '',\n errorLevel: null,\n mobilePanel: 'sidepanel',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n infoPanel: undefined,\n forwardMessage: null\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', null));\n }\n }\n\n // In mobile view user requested to show sidepanel\n handleHideMessagesView() {\n this.setState({\n mobilePanel: 'sidepanel'\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, null));\n }\n\n // User is sending a message, either plain text or a drafty object, possibly\n // with attachments.\n // - msg - Drafty message with content\n // - promise - Promise to be resolved when the upload is completed\n // - uploadCompletionPromise - for tracking progress\n // - head - head dictionary to be attached to the message\n handleSendMessage(msg, uploadCompletionPromise, uploader, head) {\n const topic = this.tinode.getTopic(this.state.topicSelected);\n return this.sendMessageToTopic(topic, msg, uploadCompletionPromise, uploader, head);\n }\n\n sendMessageToTopic(topic, msg, uploadCompletionPromise, uploader, head) {\n msg = topic.createMessage(msg, false);\n // The uploader is used to show progress.\n msg._uploader = uploader;\n\n if (head) {\n msg.head = Object.assign(msg.head || {}, head);\n }\n\n const completion = [];\n if (uploadCompletionPromise) {\n completion.push(uploadCompletionPromise);\n }\n\n if (!topic.isSubscribed()) {\n // Topic is not subscribed yet. Subscribe.\n const subscribePromise =\n topic.subscribe()\n .then(_ => {\n // If there are unsent messages (except video call messages),\n // try sending them now. Unsent video call messages will be dropped.\n let calls = [];\n topic.queuedMessages(pub => {\n if (pub._sending || pub.seq == msg.seq) {\n return;\n }\n if (pub.head && pub.head.webrtc) {\n // Filter out unsent video call messages.\n calls.push(pub.seq);\n return;\n }\n if (topic.isSubscribed()) {\n topic.publishMessage(pub);\n }\n });\n if (calls.length > 0) {\n topic.delMessagesList(calls, true);\n }\n });\n completion.push(subscribePromise);\n }\n\n // TODO: check if return is required.\n return topic.publishDraft(msg, Promise.all(completion))\n .then(ctrl => {\n if (topic.isArchived()) {\n topic.archive(false);\n }\n return ctrl;\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleNewChatInvitation(topicName, action) {\n const topic = this.tinode.getTopic(topicName);\n let response = null;\n switch (action) {\n case 'accept':\n // Accept given permissions.\n const mode = topic.getAccessMode().getGiven();\n response = topic.setMeta({sub: {mode: mode}});\n if (topic.isP2PType()) {\n // For P2P topics change 'given' permission of the peer too.\n // In p2p topics the other user has the same name as the topic.\n response = response.then(_ => topic.setMeta({sub: {user: topicName, mode: mode}}));\n }\n break;\n case 'delete':\n // Ignore invitation by deleting it.\n response = topic.delTopic(true);\n break;\n case 'block':\n // Ban the topic making futher invites impossible.\n // Just self-ban.\n const am = topic.getAccessMode().updateWant('-JP').getWant();\n response = topic.setMeta({sub: {mode: am}}).then(_ => this.handleTopicSelected(null));\n break;\n default:\n console.warn(\"Unknown invitation action\", '\"' + action + '\"\"');\n }\n\n if (response != null) {\n response.catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n // User chose a Sign Up menu item.\n handleNewAccount() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, 'register'));\n }\n\n // Actual registration of a new account.\n handleNewAccountRequest(login_, password_, public_, cred_, tags_) {\n // Clear old error, if any.\n this.handleError();\n\n this.tinode.connect(this.state.serverAddress)\n .then(_ => {\n let attachments;\n if (public_ && public_.photo && public_.photo.ref) {\n attachments = [public_.photo.ref];\n }\n return this.tinode.createAccountBasic(login_, password_,\n {public: public_, tags: tags_, cred: Tinode.credential(cred_), attachments: attachments});\n }).then(ctrl => {\n if (ctrl.code >= 300 && ctrl.text == 'validate credentials') {\n if (!TinodeWeb.navigateToCredentialsView(ctrl.params)) {\n this.handleError(invalidCredentialsReasonMessage(ctrl.params), 'err');\n }\n } else {\n this.handleLoginSuccessful(this);\n }\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n // Registration via the product's username/phone flow (chapter 1.4). `extra` carries the fields the\n // server added to {acc} (username/phone/invite_code, see server/user.go resolveRegistrationAccount) --\n // the SDK has no API for them, so they're injected by the sendText patch installed in tnSetup().\n // `cred_` (when phone was verified through POST /v1/im/auth/verification-codes) is\n // {meth:'tel', val, resp: verification_token, params: {challenge_id}} -- see server/user.go\n // consumeProductVerificationCred, which validates resp/params against the REST-issued token.\n //\n // `login_` must equal what the server's own resolveRegistrationAccount will compute as the\n // account name, or replyCreateUser rejects the whole request with a policy violation before it\n // even looks at username/phone/cred: for phone registration that's the E.164 phone (not blank --\n // registrationSecretMatches requires a non-empty match), for username registration it's the\n // username itself.\n handleImRegisterRequest(login_, password_, displayName, extra, cred_) {\n this.tinode.__pendingAccExtra = extra;\n this.handleNewAccountRequest(login_, password_, theCard(displayName, null), cred_);\n }\n\n handleToggleIncognitoMode(on) {\n // Make state undefined.\n this.setState({incognitoMode: null});\n\n const me = this.tinode.getMeTopic();\n const am = me.getAccessMode().updateWant(on ? '-P' : '+P').getWant();\n me.setMeta({sub: {mode: am}}).catch(err => {\n // Request failed, keep existing state.\n this.setState({incognitoMode: !on});\n this.handleError(err.message, 'err');\n });\n }\n\n // Manual change of color scheme: 'dark', 'light', 'auto'.\n handleChangeColorSchema(schema) {\n this.setState({colorSchema: schema});\n LocalStorageUtil.updateObject('settings', {colorSchema: schema});\n document.documentElement.style.colorScheme = schema == 'auto' ? 'light dark' : schema;\n this.applyColorSchema(schema, this.state.systemColorSchema, this.state.wallpaperSize);\n }\n\n // System color scheme has changed.\n handleColorSchemeChange(event) {\n const systemSchema = event.matches ? 'dark' : 'light';\n this.setState({systemColorSchema: systemSchema});\n this.applyColorSchema(this.state.colorSchema, systemSchema, this.state.wallpaperSize);\n }\n\n applyColorSchema(schema, systemSchema, size) {\n const effectiveSchema = schema == 'auto' ? systemSchema : schema;\n document.documentElement.style.setProperty('--wallpaper-invert', effectiveSchema == 'dark' && size ? '1' : '0');\n document.documentElement.style.setProperty('--wallpaper-brightness', effectiveSchema == 'dark' && !size ? '0.5' : '1');\n }\n\n handleSelectWallpapers() {\n this.handleError();\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, 'wallpapers'));\n }\n\n applyWallpaperSettings(wallpaper, size, blur, effectiveSchema) {\n document.documentElement.style.setProperty('--wallpaper-url', `url('${wallpaper}')`);\n document.documentElement.style.setProperty('--wallpaper-repeat', size ? 'repeat' : 'no-repeat');\n document.documentElement.style.setProperty('--wallpaper-blur', size ? '0px' : `${blur}px`);\n document.documentElement.style.setProperty('--wallpaper-size', size ? `${size}px` : 'cover');\n document.documentElement.style.setProperty('--wallpaper-position', size ? 'unset' : 'center');\n document.documentElement.style.setProperty('--wallpaper-invert', effectiveSchema == 'dark' && size ? '1' : '0');\n document.documentElement.style.setProperty('--wallpaper-brightness', effectiveSchema == 'dark' && !size ? '0.5' : '1');\n }\n\n handleWallpaperSelected(wallpaper, size, blur) {\n this.handleError();\n LocalStorageUtil.updateObject('settings', {wallpaper: wallpaper, wallpaperSize: size, wallpaperBlur: blur});\n this.setState({wallpaper: wallpaper, wallpaperSize: size, wallpaperBlur: blur});\n this.applyWallpaperSettings(wallpaper, size, blur,\n this.state.colorSchema == 'auto' ? this.state.systemColorSchema : this.state.colorSchema);\n }\n\n handleChangeTextSize(size) {\n this.setState({textSize: size | 0});\n LocalStorageUtil.updateObject('settings', {textSize: size});\n document.documentElement.style.setProperty('--message-text-size', `${size}pt`);\n }\n\n handleSendOnEnter(option) {\n this.setState({sendOnEnter: option});\n LocalStorageUtil.updateObject('settings', {sendOnEnter: option});\n }\n\n handleUpdateAccountTagsRequest(_, tags) {\n this.tinode.getMeTopic().setMeta({tags: tags})\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n // User chose Settings menu item.\n handleSettings() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'edit' : 'settings'));\n }\n\n // User updated global parameters.\n handleGlobalSettings(settings) {\n const serverAddress = settings.serverAddress || this.state.serverAddress;\n const transport = settings.transport || this.state.transport;\n const secureConnection = settings.secureConnection === undefined ?\n this.state.secureConnection : settings.secureConnection;\n if (this.tinode) {\n this.tinode.clearStorage();\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n }\n this.tinode = TinodeWeb.tnSetup(serverAddress, secureConnection, transport,\n this.props.intl.locale, LocalStorageUtil.getObject('keep-logged-in'));\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n\n this.setState({\n serverAddress: serverAddress,\n transport: transport,\n secureConnection: secureConnection,\n });\n LocalStorageUtil.setObject('settings', {\n serverAddress: serverAddress,\n transport: transport,\n secureConnection: secureConnection,\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, ''));\n }\n\n // Tenant was resolved via POST /v1/im/tenants/resolve (see auth-onboarding-view.jsx TenantEntry).\n // Persists the tenant context (read by im-api.js and by the {hi}-patching in tnSetup) and, if the\n // resolved tenant genuinely lives on a different host, rebuilds the Tinode client to point there.\n handleTenantResolved(data, requestedCode) {\n const tenant = data.tenant || {};\n const endpoints = data.endpoints || {};\n LocalStorageUtil.setObject('im-tenant', {\n code: tenant.code || requestedCode,\n name: tenant.name || tenant.code || requestedCode,\n endpoints\n });\n\n let host = this.state.serverAddress;\n let secureConnection = this.state.secureConnection;\n if (endpoints.websocket) {\n try {\n const wsUrl = new URL(endpoints.websocket);\n host = wsUrl.host;\n secureConnection = wsUrl.protocol === 'wss:';\n } catch (e) {\n // Malformed endpoint; keep the current host/scheme.\n }\n }\n if (host && (host !== this.state.serverAddress || secureConnection !== this.state.secureConnection)) {\n this.handleGlobalSettings({serverAddress: host, secureConnection});\n }\n // Else: same host/scheme, nothing to reconnect -- the sendText patch installed in tnSetup() reads\n // the tenant context fresh on every {hi}, so the newly-persisted code takes effect immediately.\n }\n\n // User chose 'Archived chats'.\n handleShowArchive() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'archive' : ''));\n }\n\n // User viewes 'Blocked chats'.\n handleShowBlocked() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'blocked' : ''));\n }\n\n toggleFCMToken(enabled) {\n if (enabled) {\n this.setState({desktopAlerts: null});\n if (!this.state.firebaseToken) {\n this.initFCMessaging();\n } else {\n this.setState({desktopAlerts: true});\n if (LocalStorageUtil.getObject('keep-logged-in')) {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }\n }\n } else if (this.state.firebaseToken && this.fcm) {\n firebaseDelToken(this.fcm).catch(err => {\n console.error(\"Unable to delete token.\", err);\n }).finally(_ => {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n localStorage.removeItem('firebase-token');\n this.setState({desktopAlerts: false, firebaseToken: null});\n // Inform the server that the token was deleted.\n this.tinode.setDeviceToken(null);\n });\n } else {\n this.setState({desktopAlerts: false, firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n }\n }\n\n handleToggleMessageSounds(enabled) {\n this.setState({messageSounds: enabled});\n LocalStorageUtil.updateObject('settings', {\n messageSoundsOff: !enabled\n });\n }\n\n handleCredAdd(method, value) {\n const me = this.tinode.getMeTopic();\n me.setMeta({cred: {meth: method, val: value}})\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleCredDelete(method, value) {\n const me = this.tinode.getMeTopic();\n me.delCredential(method, value)\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleCredConfirm(method, response) {\n TinodeWeb.navigateToCredentialsView({cred: [method], code: response});\n }\n\n // User clicked Cancel button in Setting or Sign Up panel.\n handleSidepanelCancel() {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n let path = '';\n if (['security','support','general','notif','acc_general'].includes(parsed.path[0])) {\n path = 'edit';\n } else if ('crop' == parsed.path[0]) {\n path = 'general';\n } else if ('blocked' == parsed.path[0]) {\n path = 'security';\n } else if ('wallpapers' == parsed.path[0]) {\n path = 'acc_general';\n } else if (this.state.myUserId) {\n path = 'contacts';\n }\n parsed.path[0] = path;\n if (parsed.params) {\n delete parsed.params.code;\n delete parsed.params.method;\n delete parsed.params.tab;\n delete parsed.params.scheme;\n delete parsed.params.token;\n }\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n this.setState({errorText: '', errorLevel: null});\n }\n\n // Sidepanel navigator. No need to bind to 'this'.\n basicNavigator(hash) {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, hash));\n }\n\n // Topic info navigator. No need to bind to 'this'.\n infoNavigator(hash) {\n HashNavigation.navigateTo(HashNavigation.setUrlInfoPanel(window.location.hash, hash));\n }\n\n // Request to start a topic, new or selected from search results, or \"by ID\".\n handleStartTopicRequest(topicName, newTopicParams, isChannel) {\n // Check if topic is indeed new. If not, launch it.\n if (topicName && this.tinode.isTopicCached(topicName)) {\n this.handleTopicSelected(topicName);\n return;\n }\n\n const params = {};\n if (Tinode.isP2PTopicName(topicName)) {\n // Because we are initiating the subscription, set 'want' to all permissions.\n params.sub = {mode: DEFAULT_P2P_ACCESS_MODE};\n // Give the other user all permissions too.\n params.desc = {defacs: {auth: DEFAULT_P2P_ACCESS_MODE}};\n } else {\n topicName = topicName || this.tinode.newGroupTopicName(isChannel);\n if (newTopicParams) {\n params.desc = {public: newTopicParams.public, private: {comment: newTopicParams.private}};\n params.tags = newTopicParams.tags;\n }\n }\n params._topicName = topicName;\n this.setState({newTopicParams: params}, _ => {this.handleTopicSelected(topicName)});\n }\n\n // New topic was created, here is the new topic name.\n handleNewTopicCreated(oldName, newName) {\n let nextState = {};\n if (this.state.callShouldStart) {\n nextState = {callState: CALL_STATE_IN_PROGRESS, callShouldStart: false};\n }\n if (this.state.topicSelected == oldName && oldName != newName) {\n // If the current URl contains the old topic name, replace it with new.\n // Update the name of the selected topic first so the navigator doen't clear\n // the state.\n nextState.topicSelected = newName;\n }\n this.setState(nextState, _ => {\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', newName));\n });\n }\n\n handleTopicUpdateRequest(topicName, pub, priv, defacs) {\n this.handleError();\n\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const params = {};\n let attachments;\n if (pub) {\n if (pub.photo) {\n if (pub.photo.ref && pub.photo.ref != Tinode.DEL_CHAR) {\n attachments = [pub.photo.ref];\n } else if (!pub.photo.data || pub.photo.data == Tinode.DEL_CHAR) {\n pub.photo = Tinode.DEL_CHAR;\n }\n }\n params.public = pub;\n }\n\n if (typeof priv == 'string') {\n params.private = (priv === Tinode.DEL_CHAR) ?\n Tinode.DEL_CHAR : {comment: priv};\n }\n if (defacs) {\n params.defacs = defacs;\n }\n topic.setMeta({desc: params, attachments: attachments})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleUnarchive(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n topic.archive(false).catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleUpdatePasswordRequest(password) {\n this.handleError();\n\n if (!password) {\n return Promise.reject(new Error('密码不能为空'));\n }\n // 必须把 Promise 返回出去:调用方(personal-settings-view 的修改密码页)要靠它判断成败。\n // 原来这里只在内部 catch 掉、什么都不返回,调用方拿到 undefined,于是密码策略被服务端拒绝时\n // 用户照样看到\"密码已更新\"并被跳走。跟之前修过的 handleDeleteAccount 是同一类问题。\n return this.tinode.updateAccountBasic(null, this.tinode.getCurrentLogin(), password)\n .catch(err => {\n this.handleError(err.message, 'err');\n throw err;\n });\n }\n\n handleChangePermissions(topicName, mode, uid) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const am = topic.getAccessMode();\n if (uid) {\n am.updateGiven(mode);\n mode = am.getGiven();\n } else {\n am.updateWant(mode);\n mode = am.getWant();\n }\n topic.setMeta({sub: {user: uid, mode: mode}})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleTagsUpdateRequest(topicName, tags) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n topic.setMeta({tags: tags})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleLogout() {\n updateFavicon(0);\n\n // Remove stored data.\n localStorage.removeItem('auth-token');\n localStorage.removeItem('firebase-token');\n localStorage.removeItem('settings');\n sessionStorage.removeItem('im-session-token');\n if (this.state.firebaseToken && this.fcm) {\n // Unsubscribe failures (e.g. 403 token-unsubscribe-failed) should not block logout.\n firebaseDelToken(this.fcm).catch(err => {\n console.warn('Failed to delete FCM token on logout', err);\n });\n }\n\n // Reset color scheme.\n document.documentElement.style.colorScheme = DEFAULT_COLOR_SCHEME == 'auto' ? 'light dark' : DEFAULT_COLOR_SCHEME;\n document.documentElement.style.setProperty('--message-text-size', `${DEFAULT_TEXT_SIZE}pt`);\n\n clearInterval(this.reconnectCountdown);\n\n let cleared;\n if (this.tinode) {\n cleared = this.tinode.clearStorage();\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n } else {\n cleared = Promise.resolve();\n }\n this.setState(this.getBlankState());\n\n cleared.then(_ => {\n // Same fix as the initial tnSetup call in componentDidMount: use the resolved\n // state.secureConnection (settings-aware), not a raw isSecureConnection() page-protocol check.\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, this.state.secureConnection,\n this.state.transport, this.props.intl.locale, LocalStorageUtil.getObject('keep-logged-in'), _ => {\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n HashNavigation.navigateTo('');\n })\n });\n }\n\n handleDeleteAccount() {\n return this.tinode.delCurrentUser(true).then(_ => {\n this.handleLogout();\n });\n }\n\n handleDeleteTopicRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Request to hard-delete topic.\n topic.delTopic(true).then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleDeleteMessagesRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Request hard-delete all messages.\n topic.delMessagesAll(true)\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleLeaveUnsubRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.leave(true).then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleBlockTopicRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.updateMode(null, '-JP')\n .then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleReportTopic(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // The native `this.tinode.report('report', topicName)` call (WS pub to the \"sys\" topic) requires\n // auth.LevelRoot server-side (server/session.go) which a normal logged-in user never has -- it\n // silently fails permission checks and never reaches the abuse-report tables. Route to the real\n // REST reporting flow (im-api.js's getAbuseReasons/submitAbuseReport, backed by POST /reports/abuse)\n // instead of the old dead-end call.\n const isP2P = topic.isP2PType();\n const targetName = topicDisplayName(topicName, topic.public, topicName);\n const params = isP2P\n ? {target_type: 'user', target_id: topicName, target_name: targetName}\n : {target_type: 'group', target_id: topicName, topic: topicName, target_name: targetName};\n\n // Remove J and P permissions (the \"block\" half of \"block and report\").\n topic.updateMode(null, '-JP')\n .then(_ => {\n let hash = HashNavigation.setUrlTopic(window.location.hash, '');\n hash = HashNavigation.setUrlSidePanel(hash, 'abuse-report-reasons');\n Object.entries(params).forEach(([key, value]) => { hash = HashNavigation.addUrlParam(hash, key, value); });\n HashNavigation.navigateTo(hash);\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleShowContextMenu(params, menuItems) {\n this.setState({\n contextMenuVisible: true,\n contextMenuClickAt: {x: params.x, y: params.y},\n contextMenuParams: params,\n contextMenuItems: menuItems || this.defaultTopicContextMenu(params.topicName),\n contextMenuBounds: this.selfRef.current.getBoundingClientRect()\n });\n }\n\n //\n handleShowForwardDialog(params) {\n if (this.state.sidePanelSelected == 'newtpk') {\n // If the Find panel is active, close it.\n this.handleSidepanelCancel();\n }\n const header = params.userName ? '➦ ' + params.userName : '';\n const content = typeof params.content == 'string' ? Drafty.init(params.content) : Drafty.forwardedContent(params.content);\n const preview = Drafty.preview(content, FORWARDED_PREVIEW_LENGTH, true);\n const msg = Drafty.append(Drafty.appendLineBreak(Drafty.mention(header, params.userFrom)), content);\n const msgPreview = Drafty.quote(header, params.userFrom, preview);\n\n const head = {\n forwarded: params.topicName + ':' + params.seq\n };\n this.setState({\n forwardDialogVisible: true,\n forwardMessage: { head: head, msg: msg, preview: msgPreview }\n });\n }\n\n handleShareTheCard(card) {\n this.setState({\n forwardDialogVisible: true,\n forwardMessage: {\n content: card,\n type: card.contentType,\n }\n });\n }\n\n // Extracted out of defaultTopicContextMenu so the new 4.9-4.14 attachment-panel call shortcuts\n // (send-message.jsx) can gate on exactly the same real-world availability check as the existing\n // \"...\" menu items, instead of re-deriving (and risking drifting from) the same three conditions.\n canStartCall(topicName) {\n // Never checked whether a call was already in progress -- the \"...\" menu entry and\n // send-message.jsx's attachment-panel shortcut stayed clickable for the whole (very normal,\n // product-supported) duration of a minimized call. A second click re-arms\n // handleStartVideoCall/handleStartAudioCall's 60s ring timeout and forces callState back to\n // CALL_STATE_OUTGOING_INITATED with no visible effect (the already-mounted CallPanel doesn't\n // react to that prop), silently hanging up the real, healthy call a full minute later.\n if (this.state.callState != CALL_STATE_NONE) {\n return false;\n }\n const topic = this.tinode.getTopic(topicName);\n if (!topic || topic._deleted || !Tinode.isP2PTopicName(topicName)) {\n return false;\n }\n const acs = topic.getAccessMode();\n const writer = !!(acs && acs.isWriter());\n const cachedBootstrap = this.state.myUserId ? readCachedData('bootstrap:' + this.state.myUserId) : null;\n const callFeatureOk = !cachedBootstrap || !cachedBootstrap.features ||\n (cachedBootstrap.features.audio_call !== false && cachedBootstrap.features.video_call !== false);\n return writer && callFeatureOk && !!this.tinode.getServerParam('iceServers');\n }\n\n defaultTopicContextMenu(topicName) {\n const topic = this.tinode.getTopic(topicName);\n\n if (topic._deleted) {\n return [\n 'topic_delete'\n ];\n }\n\n const me = this.tinode.getMeTopic();\n let muted = false, blocked = false, self_blocked = false, subscribed = false, deleter = false,\n archived = false, pinned = false, webrtc = false, p2p = false, self = false;\n if (topic) {\n subscribed = topic.isSubscribed();\n archived = topic.isArchived();\n pinned = me.pinnedTopicRank(topicName) > 0;\n\n const acs = topic.getAccessMode();\n if (acs) {\n muted = acs.isMuted();\n blocked = !acs.isJoiner();\n self_blocked = !acs.isJoiner('want');\n deleter = acs.isDeleter();\n }\n }\n\n // 后端今天新增了一个全局(非按租户)的通话总开关:{pub head:webrtc:...} 现在会先过\n // im_client_feature 这个开关,关闭时整条消息直接被服务端拒绝。这个开关缺失/查询失败时是\n // fail-closed(当成关闭),比 Tinode 协议层的 iceServers 配置更容易出现\"某天突然打不通\"的\n // 情况。canStartCall 统一做这几条判断(也是 4.9-4.14 附件面板通话入口在用的同一份逻辑),\n // 按钮可见性只是一层预判,真正失败时上面 handleCallInvite 已经会报错,这里不做的话用户点了\n // 按钮才发现打不通,做了至少能提前少显示一个注定失败的入口。\n webrtc = this.canStartCall(topicName);\n p2p = Tinode.isP2PTopicName(topicName);\n self = Tinode.isSelfTopicName(topicName);\n\n return [\n subscribed ? {\n title: this.props.intl.formatMessage(messages.menu_item_info),\n handler: this.handleShowInfoView\n } : null,\n subscribed && p2p && webrtc ? {\n title: this.props.intl.formatMessage(messages.menu_item_audio_call),\n handler: this.handleStartAudioCall\n } : null,\n subscribed && p2p && webrtc ? {\n title: this.props.intl.formatMessage(messages.menu_item_video_call),\n handler: this.handleStartVideoCall\n } : null,\n subscribed ? 'messages_clear' : null,\n subscribed && deleter && !self ? 'messages_clear_hard' : null,\n self ? null : (muted ? (blocked ? null : 'topic_unmute') : 'topic_mute'),\n self ? null : (self_blocked ? 'topic_unblock' : 'topic_block'),\n pinned ? 'topic_unpin' : 'topic_pin',\n archived ? 'topic_restore' : 'topic_archive',\n 'topic_delete'\n ];\n }\n\n handleHideContextMenu() {\n this.setState({\n contextMenuVisible: false,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuBounds: null\n });\n }\n\n handleHideForwardDialog(keepForwardedMessage) {\n this.setState({\n forwardDialogVisible: false,\n forwardMessage: keepForwardedMessage ? this.state.forwardMessage : null\n });\n }\n\n handleContextMenuAction(action, promise, params) {\n if (action == 'topic_archive') {\n if (promise && params.topicName && params.topicName == this.state.topicSelected) {\n promise.then(_ => {\n this.handleTopicSelected(null);\n });\n }\n } else if (action == 'menu_item_forward') {\n this.handleShowForwardDialog(params);\n } else if (action == 'menu_item_select') {\n this.handleEnterSelectMode(params);\n }\n }\n\n // Ch.4 multi-select: pre-selects the message that was long-pressed to reach \"多选\".\n handleEnterSelectMode(params) {\n this.setState({\n selectMode: true,\n selectModeTopic: params.topicName,\n selectedSeqs: [params.seq]\n });\n }\n\n handleToggleMessageSelect(seq) {\n const selectedSeqs = this.state.selectedSeqs.includes(seq) ?\n this.state.selectedSeqs.filter(s => s != seq) :\n this.state.selectedSeqs.concat(seq);\n this.setState({selectedSeqs});\n }\n\n handleExitSelectMode() {\n this.setState({selectMode: false, selectModeTopic: null, selectedSeqs: [], batchForwardVisible: false});\n }\n\n handleShowBatchForward() {\n this.setState({batchForwardVisible: true});\n }\n\n handleHideBatchForward() {\n this.setState({batchForwardVisible: false});\n }\n\n handleOpenScanner() {\n this.setState({scannerOpen: true});\n }\n\n handleCloseScanner() {\n this.setState({scannerOpen: false});\n }\n\n // `text` is whatever jsQR decoded from the camera frame -- only codes this app itself generated\n // (createMyQRCode/createGroupQRCode, both `im://qr?token=...&purpose=...`) resolve to anything;\n // a QR code from the outside world (a URL, a WiFi code) is reported as unrecognized rather than\n // silently failing the resolve call with a confusing server error.\n handleQrDetected(text) {\n const hasScheme = typeof text === 'string' && text.indexOf('im://qr') === 0;\n const params = hasScheme ? new URLSearchParams(text.slice(text.indexOf('?') + 1)) : null;\n const token = params ? params.get('token') : null;\n const purpose = params ? params.get('purpose') : null;\n if (!token) {\n this.setState({scannerOpen: false});\n this.handleError('无法识别的二维码', 'err');\n return;\n }\n resolveQRCode(token, purpose).then(data => {\n if (data.purpose === 'join_group' && data.group) {\n if (data.status === 'joined') {\n this.setState({scannerOpen: false});\n this.handleTopicSelected(data.group.topic);\n } else {\n this.setState({scannerOpen: false, groupJoinPreview: {...data.group, qrToken: token}});\n }\n return;\n }\n if (data.user) {\n this.setState({scannerOpen: false});\n // The profile page this navigates to re-fetches via GET /users/{id}/profile, which 403s for\n // anyone who isn't already a friend (server-side privacy default) -- but resolveQRCode's\n // response already carries the same fields unconditionally, so stash it under the same\n // cache key contact-management-view.jsx's Profile/Verification read on mount, the same fix\n // applied there for the account-search entry point into this identical dead end.\n writeCachedData('profile-seed:' + data.user.user_id, {\n ...data.user,\n capabilities: {can_add_friend: !!data.user.can_add}\n });\n let hash = HashNavigation.setUrlTopic(window.location.hash, '');\n hash = HashNavigation.setUrlSidePanel(hash, data.user.relationship === 'friend' ? 'friend-profile' : 'group-member-profile');\n hash = HashNavigation.addUrlParam(hash, 'uid', data.user.user_id);\n HashNavigation.navigateTo(hash);\n return;\n }\n this.setState({scannerOpen: false});\n this.handleError('无法识别的二维码', 'err');\n }).catch(err => {\n this.setState({scannerOpen: false});\n this.handleError(err.message || '二维码已失效', 'err');\n });\n }\n\n handleSubmitGroupJoinRequest(message) {\n const preview = this.state.groupJoinPreview;\n if (!preview) {\n return Promise.resolve();\n }\n return createGroupJoinRequest(preview.topic, {message, source: 'qr', qrToken: preview.qrToken}).then(() => {\n this.setState({groupJoinPreview: null});\n this.handleError('申请已提交,等待管理员通过', 'info');\n }).catch(err => {\n this.handleError(err.message || '申请提交失败', 'err');\n });\n }\n\n handleCancelGroupJoinPreview() {\n this.setState({groupJoinPreview: null});\n }\n\n handleShowAlert(title, content, onConfirm, confirmText, onReject, rejectText) {\n this.setState({\n alertVisible: true,\n alertParams: {\n title: title,\n content: content,\n onConfirm: onConfirm,\n confirm: confirmText,\n onReject: onReject,\n reject: rejectText\n }\n });\n }\n\n // The \"信息\" context-menu item used to always open the old, pre-migration InfoView (info-view.jsx)\n // -- for P2P/group topics that's a real, previously-unnoticed gap: the new contact-management-view.jsx\n // \"friend-settings\" / group-management-view.jsx \"group-settings\" pages (built and verified across\n // Ch.5/6, with real HashNavigation.goBack()-based back navigation) had no way to actually be reached\n // from an open chat's own header -- every test of them this engagement typed the hash directly.\n // InfoView's own back button (handleBackNavigate in info-view.jsx) still hardcodes a single fixed\n // parent per panel and never used real browser history, so routing here fixed both problems at once\n // rather than teaching the old view a second back-navigation scheme it's slated for removal anyway.\n handleShowInfoView() {\n const topicName = this.state.topicSelected;\n if (Tinode.isP2PTopicName(topicName)) {\n // Base the new hash on '' (not window.location.hash) -- the current hash's path[1] still holds\n // the open chat's own topic, and setUrlSidePanel only ever touches path[0]. Reusing the current\n // hash as-is here leaves that topic sitting in path[1] where it collides with group-settings'/\n // friend-settings' own query params, and handleHashRoute re-interprets the leftover path[1] as a\n // fresh topic selection, blanking the whole view -- the exact bug already found and fixed for\n // handleShowAnnouncement/handleShowJoinRequests/handleSendFriendVerification; same fix here.\n let hash = HashNavigation.setUrlSidePanel('', 'friend-settings');\n hash = HashNavigation.addUrlParam(hash, 'uid', topicName);\n HashNavigation.navigateTo(hash);\n return;\n }\n if (!Tinode.isSelfTopicName(topicName)) {\n let hash = HashNavigation.setUrlSidePanel('', 'group-settings');\n hash = HashNavigation.addUrlParam(hash, 'topic', topicName);\n HashNavigation.navigateTo(hash);\n return;\n }\n // \"已保存的消息\" (self topic) has no equivalent new settings page -- keep the old InfoView for it.\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'info', 'info'));\n this.setState({infoPanel: 'info'});\n }\n\n handleMemberUpdateRequest(topicName, added, removed) {\n if (!topicName) {\n return;\n }\n\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n if (added && added.length > 0) {\n added.forEach(uid => {\n topic.invite(uid, null)\n .catch(err => this.handleError(err.message, 'err'));\n });\n }\n\n if (removed && removed.length > 0) {\n removed.forEach(uid => {\n topic.delSubscription(uid)\n .catch(err => this.handleError(err.message, 'err'));\n });\n }\n }\n\n handleValidateCredentialsRequest(cred, code, token) {\n if (this.tinode.isAuthenticated()) {\n // Adding new email or phone number in account setting.\n this.tinode.getMeTopic().setMeta({cred: {meth: cred, resp: code}})\n .then(_ => HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, 'contacts')))\n .catch(err => this.handleError(err.message, 'err'));\n } else {\n // Credential validation on signup.\n this.setState({credMethod: cred, credCode: code, credToken: token});\n this.doLogin(null, null, token, {meth: cred, resp: code});\n }\n }\n\n handlePasswordResetRequest(method, value) {\n // If already connected, connnect() will return a resolved promise.\n return this.tinode.connect()\n .then(_ => this.tinode.requestResetAuthSecret('basic', method, value))\n .catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n\n handleResetPassword(newPassword, tempAuth) {\n const secret = base64ReEncode(tempAuth.secret);\n if (!secret || !tempAuth.scheme) {\n this.handleError(this.props.intl.formatMessage(messages.invalid_security_token), 'err');\n } else {\n this.tinode.connect()\n .then(_ => this.tinode.updateAccountBasic(null, null, newPassword, {scheme: tempAuth.scheme, secret: secret}))\n .then(_ => {\n this.handleError(this.props.intl.formatMessage(messages.password_reset_success), 'info');\n HashNavigation.navigateTo('');\n })\n .catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n handleShowCountrySelector(code, dial, selectedCallback) {\n this.handleShowAlert(this.props.intl.formatMessage(messages.select_country),\n }>\n {\n this.setState({alertVisible: false});\n selectedCallback(c, d);\n }} />\n ,\n null, null, _ => {}, null);\n }\n\n handleStartVideoCall() {\n this.armCallRingTimeout();\n this.setState({\n callTopic: this.state.topicSelected,\n callState: CALL_STATE_OUTGOING_INITATED,\n callAudioOnly: false\n });\n }\n\n handleStartAudioCall() {\n this.armCallRingTimeout();\n this.setState({\n callTopic: this.state.topicSelected,\n callState: CALL_STATE_OUTGOING_INITATED,\n callAudioOnly: true\n });\n }\n\n // this.callTimeoutTimer was declared (and already read/cleared in handleCallClose) but never\n // actually assigned anywhere -- whose 'accept' {note} gets silently dropped, since every\n // call-signaling step after the initial invite is a fire-and-forget {note}, not a {pub} with a\n // server ack, left the caller's UI stuck on \"呼叫中\" forever, with manual hang-up the only way out.\n // This arms a 60s backstop that reuses the exact same hang-up path as clicking cancel by hand\n // (real 'hang-up' note to the peer + the usual top-level state reset), so it doesn't invent any\n // new call-outcome semantics.\n //\n // Note this is a secondary safety net, not the primary defense against a plain unanswered call --\n // the backend already has its own call_establishment_timeout (30s, server/main.go in the im_be\n // reference repo) that ends a genuinely-unanswered call server-side and notifies both parties via\n // {info hang-up}, which handleInfoMessage's 'hang-up' case below already handles independently of\n // this timer. For that common case this 60s timer mostly just no-ops (state has already moved to\n // CALL_STATE_NONE by the time it fires). What it actually guards against is a narrower case: the\n // {info hang-up} notification carrying that server-side timeout is itself lost -- the same class\n // of signaling drop this whole mechanism exists for, just at a different stage. Kept comfortably\n // above the server's own 30s so it never races or duplicates that primary path. Deliberately scoped\n // to just the outgoing-ring wait: adding similar timeouts around mid-call offer/ice-candidate/\n // answer signaling would risk false-positive hangups on connections that are just slow, not\n // actually dropped.\n armCallRingTimeout() {\n clearTimeout(this.callTimeoutTimer);\n this.callTimeoutTimer = setTimeout(() => {\n this.callTimeoutTimer = null;\n if (this.state.callState != CALL_STATE_OUTGOING_INITATED) {\n return;\n }\n this.handleCallHangup(this.state.callTopic, this.state.callSeq);\n this.handleCallClose();\n }, CALL_RING_TIMEOUT_MS);\n }\n\n handleCallInvite(callTopic, callSeq, callState, audioOnly) {\n switch (callState) {\n case CALL_STATE_OUTGOING_INITATED:\n const head = { webrtc: CALL_HEAD_STARTED, aonly: !!audioOnly };\n // sendMessageToTopic 自己的 .catch 会吞掉发送失败(只标记 pub._failed=true 让消息列表画\n // 红色感叹号——这是给聊天气泡设计的反馈方式,通话邀请这条消息不会被用户看到,走这条路径\n // 相当于什么反馈都没有),resolve 成 undefined 而不是 reject。原来这里 `ctrl.code` 直接\n // 解引用,undefined.code 会抛 TypeError,变成一个没人 catch 的 rejected promise——\n // handleCallClose() 根本不会被调用,通话面板会卡在\"呼叫中\"状态出不来,且用户不知道为什么。\n // 今天这条路径已经有真实后果:新的全局通话开关 (im_client_feature) 关闭时服务端会拒绝这条\n // {pub},命中的就是这个从未被验证过的失败分支。\n return this.handleSendMessage(Drafty.videoCall(audioOnly), undefined, undefined, head)\n .then(ctrl => {\n if (!ctrl || ctrl.code < 200 || ctrl.code >= 300 || !ctrl.params || !ctrl.params.seq) {\n this.handleError('通话发起失败,请稍后重试', 'err');\n this.handleCallClose();\n return ctrl;\n }\n this.setState({callSeq: ctrl.params['seq']});\n return ctrl\n }).catch(err => {\n this.handleError((err && err.message) || '通话发起失败,请稍后重试', 'err');\n this.handleCallClose();\n });\n case CALL_STATE_IN_PROGRESS:\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n // We've accepted the call. Let the other side know.\n topic.videoCall('accept', callSeq);\n break;\n }\n }\n\n handleCallRinging(callTopic, callSeq) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('ringing', callSeq);\n }\n\n handleCallHangup(callTopic, callSeq) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('hang-up', callSeq);\n }\n\n handleCallSendOffer(callTopic, callSeq, sdp) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('offer', callSeq, sdp);\n }\n\n handleCallIceCandidate(callTopic, callSeq, candidate) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('ice-candidate', callSeq, candidate);\n }\n handleCallSendAnswer(callTopic, callSeq, sdp) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('answer', callSeq, sdp);\n }\n\n handleCallClose() {\n if (this.callTimeoutTimer) {\n clearTimeout(this.callTimeoutTimer);\n }\n this.setState({\n callTopic: undefined,\n callState: CALL_STATE_NONE,\n callAudioOnly: undefined,\n // callSeq is otherwise only ever set once handleCallInvite's {pub} ack comes back (see its\n // .then() below), never cleared -- without resetting it here, a call ended before that ack\n // arrives (or armCallRingTimeout's hang-up firing before it) leaves this call's callSeq\n // pointing at whatever the *previous* call's seq was, and the next outgoing call could read\n // that stale value for the brief window before its own ack lands.\n callSeq: undefined,\n // handleCallAccept's \"topic not subscribed yet\" branch (below) sets this and waits for\n // handleNewTopicCreated to both flip callState to CALL_STATE_IN_PROGRESS and clear this flag\n // once that subscription succeeds -- but a call closed/abandoned (rejected, or the subscribe\n // itself failing) before that ever happens left this stuck at true with no owner left to clear\n // it. It would then get read by the *next*, entirely unrelated topic subscription that happens\n // to succeed, incorrectly forcing callState to CALL_STATE_IN_PROGRESS for a call that was\n // already given up on.\n callShouldStart: false\n });\n }\n\n handleCallAccept(topicName, setCallTopic, callSeq) {\n clearTimeout(this.callTimeoutTimer);\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n if (topic.isSubscribed()) {\n this.handleTopicSelected(setCallTopic ? topicName : this.state.callTopic);\n const upd = {\n callState: CALL_STATE_IN_PROGRESS\n };\n if (setCallTopic) {\n upd.callTopic = topicName;\n upd.callSeq = callSeq;\n }\n this.setState(upd);\n } else {\n // We need to switch and subscribe to callTopic first.\n this.setState({\n callShouldStart: true,\n }, _ => this.handleTopicSelected(this.state.callTopic));\n }\n }\n\n handleInfoMessage(info) {\n if (info.what != 'call') {\n return;\n }\n switch (info.event) {\n case 'accept':\n // Either branch below means the outgoing ring wait is over one way or another --\n // see armCallRingTimeout.\n clearTimeout(this.callTimeoutTimer);\n // If another my session has accepted the call.\n if (Tinode.isMeTopicName(info.topic) && this.tinode.isMe(info.from)) {\n this.setState({\n callTopic: null,\n callState: CALL_STATE_NONE,\n callSeq: null,\n callAudioOnly: undefined,\n // Same stuck-flag risk handleCallClose() guards against -- this call is being given up\n // on here just as much as a local close/reject would, so it needs the same cleanup.\n callShouldStart: false\n });\n return;\n }\n if (info.topic == this.state.callTopic) {\n // Update state.\n this.setState({callState: CALL_STATE_IN_PROGRESS});\n }\n break;\n case 'hang-up':\n // Remote hangup.\n this.handleCallClose();\n break;\n }\n }\n\n handleDataMessage(data) {\n if (data.head && data.head.webrtc && data.head.webrtc == CALL_HEAD_STARTED && Tinode.isP2PTopicName(data.topic)) {\n // If it's a video call invite message.\n // See if we need to display incoming call UI.\n const topic = this.tinode.getTopic(data.topic);\n if (topic) {\n // Check if a later version of the message exists (which means the call\n // has been either accepted or finished already).\n const msg = topic.latestMsgVersion(data.seq) || data;\n if (msg.head && msg.head.webrtc && msg.head.webrtc == CALL_HEAD_STARTED) {\n // This is a legit new call.\n if (data.from != this.state.myUserId) {\n if (this.state.callState == CALL_STATE_NONE) {\n // Incoming call.\n this.setState({\n callTopic: data.topic,\n callState: CALL_STATE_INCOMING_RECEIVED,\n callSeq: data.seq,\n callAudioOnly: !!msg.head.aonly\n });\n } else {\n // Another call is either in progress or being established.\n // Reject the incoming call.\n this.handleCallHangup(data.topic, data.seq);\n }\n }\n }\n } else {\n console.warn(\"Received vc data message from unknown topic\", data.topic);\n }\n }\n }\n\n render() {\n const colorSchema = this.state.colorSchema !== 'auto' ? this.state.colorSchema : this.state.systemColorSchema;\n const activeProductView = this.state.sidePanelSelected || (this.state.myUserId ? 'messages-home' : 'tenant');\n const chapterOneViews = ['tenant', 'login', 'enterprise-register', 'enterprise-feedback', 'register',\n 'reset', 'identity-check', 'realname', 'realname-verified', 'realname-reminder', 'independent-password'];\n const chapterOneActive = chapterOneViews.includes(activeProductView);\n const chapterTwoFullPage = ['messages-offline', 'messages-menu', 'message-actions', 'system-messages'].includes(activeProductView) ||\n (!this.state.myUserId && activeProductView === 'messages-home');\n const chapterThreeActive = ['chat-inbound-request', 'chat-inbound-message', 'chat-outbound-request',\n 'chat-status', 'chat-friend', 'chat-media', 'chat-blocked', 'chat-deleted', 'chat-standard',\n 'chat-attachments', 'chat-mixed', 'chat-contact-card'].includes(activeProductView);\n const chapterFourActive = ['compose-keyboard', 'mentions-select', 'mentions-complete', 'mentions-message',\n 'emoji-panel', 'emoji-message', 'voice-ready', 'voice-hold', 'voice-recording',\n 'media-uploading', 'media-gallery', 'media-retry', 'upload-file', 'file-message',\n 'message-multiselect', 'favorite-success', 'forward-select', 'forward-multiple',\n 'forward-individual', 'forward-bundle'].includes(activeProductView);\n const chapterFiveActive = ['address-book', 'friend-requests', 'add-friend', 'my-friend-qr', 'friend-qr',\n 'friend-search-result', 'friend-verification', 'friend-profile', 'group-member-profile',\n 'friend-settings', 'friend-settings-blocked', 'friend-delete-confirm', 'block-list',\n 'block-confirm', 'clear-chat-confirm'].includes(activeProductView);\n const chapterSixActive = ['group-list', 'group-empty', 'group-invite', 'group-events',\n 'group-join-requests', 'group-new-request', 'group-announcement', 'group-summary',\n 'group-announcement-detail', 'group-settings', 'group-profile', 'group-avatar',\n 'group-nickname', 'group-description', 'group-my-nickname', 'group-members', 'group-role-message', 'group-qr', 'group-governance',\n 'group-admins', 'group-admin-add', 'group-admin-success', 'group-admin-partial',\n 'group-admin-removed', 'group-mute-add', 'group-muted', 'group-owner-select',\n 'group-owner-confirm', 'group-files', 'group-file-upload'].includes(activeProductView);\n const chapterSevenActive = ['favorites', 'favorites-mixed', 'favorites-files', 'favorites-text',\n 'favorites-voice', 'favorites-links', 'favorites-image', 'favorites-video', 'favorites-select', 'favorite-share', 'file-download',\n 'file-downloading', 'file-downloaded', 'history-search', 'history-files', 'history-links',\n 'history-images', 'history-videos'].includes(activeProductView);\n const callExperienceActive = ['call-history', 'call-incoming', 'audio-call-ringing',\n 'audio-call-active', 'audio-call-muted', 'audio-call-speaker', 'video-call-ringing',\n 'video-call-camera-off', 'video-call-active', 'video-call-peer-camera-off',\n 'call-minimized'].includes(activeProductView);\n const workplaceCollaborationActive = ['workbench', 'organization-directory', 'meeting-organizer',\n 'meeting-attendee', 'meeting-create', 'meeting-detail', 'daily-report-editor', 'daily-report-mine', 'daily-report-team',\n 'daily-report-detail', 'monthly-report-editor', 'monthly-report-mine', 'monthly-report-team',\n 'monthly-report-detail', 'executive-mailbox', 'executive-mailbox-notice'].includes(activeProductView);\n const personalSettingsActive = ['personal-center', 'personal-profile', 'profile-nickname',\n 'profile-birth-date', 'profile-signature', 'profile-gender', 'profile-region', 'personal-qrcode', 'android-settings',\n 'cache-clear-confirm', 'clear-history-confirm', 'change-password', 'delete-account-confirm',\n 'app-version', 'privacy-settings',\n 'friend-discovery-settings', 'youth-mode-off', 'youth-mode-on', 'youth-mode-verify',\n 'notification-permission', 'permission-settings-reminder',\n 'camera-permission-info', 'microphone-permission-info'].includes(activeProductView);\n const securitySupportActive = ['fraud-risk-warning', 'fraud-risk-confirmation',\n 'abuse-report-reasons', 'abuse-report-details', 'user-feedback'].includes(activeProductView);\n return (\n \n {this.state.contextMenuVisible ?\n
{\n if (topicName == this.state.topicSelected) {\n this.handleTopicSelected(null);\n }\n }}\n onError={this.handleError} />\n :\n null\n }\n {this.state.forwardDialogVisible ?\n \n :\n null\n }\n {this.state.batchForwardVisible ?\n { this.handleHideBatchForward(); if (sent) { this.handleExitSelectMode(); } }}\n onInitFind={this.tnInitFind}\n searchResults={this.state.searchResults}\n onSearchContacts={this.handleSearchContacts}\n />\n :\n null\n }\n {this.state.callTopic && this.state.callState == CALL_STATE_INCOMING_RECEIVED ?\n \n :\n null\n }\n {this.state.scannerOpen ?\n \n :\n null\n }\n {this.state.groupJoinPreview ?\n \n :\n null\n }\n {this.state.alertVisible ?\n this.setState({alertVisible: false})) : null}\n reject={this.state.alertParams.reject}\n onConfirm={this.state.alertParams.onConfirm ?\n (_ => {this.setState({alertVisible: false}); this.state.alertParams.onConfirm();}) : null}\n confirm={this.state.alertParams.confirm}\n /> : null}\n\n {!this.state.displayMobile || this.state.mobilePanel == 'sidepanel' ?\n \n : null}\n\n {!chapterOneActive && !chapterTwoFullPage && !chapterThreeActive && !chapterFourActive && !chapterFiveActive && !chapterSixActive && !chapterSevenActive && !callExperienceActive && !workplaceCollaborationActive && !personalSettingsActive && !securitySupportActive && (!this.state.displayMobile || (this.state.mobilePanel == 'topic-view' && !this.state.infoPanel)) ?\n }>\n \n \n : null}\n\n {this.state.infoPanel ?\n }>\n \n \n :\n null\n }\n \n );\n }\n};\n\nexport default injectIntl(TinodeWeb);\n","// View for editing topic parameters (including 'me' topic).\n\nimport React from 'react';\n\nimport TopicDescEdit from '../widgets/topic-desc-edit.jsx';\n\nimport { arrayEqual } from '../lib/utils.js';\n\nexport default class TopicCommonView extends React.Component {\n constructor(props) {\n super(props);\n\n const topic = this.props.tinode.getTopic(this.props.topic);\n const acs = topic.getAccessMode();\n this.state = {\n tags: []\n };\n\n this.previousTagsUpdated = undefined;\n\n this.onTagsUpdated = this.onTagsUpdated.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (topic.onTagsUpdated != this.onTagsUpdated) {\n if (topic.getType() == 'grp') {\n this.previousTagsUpdated = topic.onTagsUpdated;\n topic.onTagsUpdated = this.onTagsUpdated;\n } else {\n this.previousTagsUpdated = undefined;\n }\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onTagsUpdated = this.previousTagsUpdated;\n }\n\n // Server informs that the tags have been updated.\n onTagsUpdated(tags) {\n this.setState({tags: tags});\n\n if (this.previousTagsUpdated && this.previousTagsUpdated != this.onTagsUpdated) {\n this.previousTagsUpdated(tags);\n }\n }\n\n // Request server to change tags.\n handleTagsUpdated(tags) {\n if (!arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n this.props.onUpdateTagsRequest(this.props.topic, tags);\n }\n }\n\n render() {\n return (\n \n \n
\n );\n }\n};\n","// ValidationView: panel for confirming credentials, like email or phone.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n phone: {\n id: 'phone_dative',\n defaultMessage: 'phone',\n description: \"Dative case of 'phone', i.e. 'phone' in 'by phone'\",\n },\n email: {\n id: 'email_dative',\n defaultMessage: 'email',\n description: \"Dative case of 'email', i.e. 'email' in 'by email'\",\n }\n});\n\nclass ValidationView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n code: props.credCode || '',\n codeReceived: props.credCode\n };\n\n this.handleCodeChange = this.handleCodeChange.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n if (nextProps.credCode != prevState.codeReceived) {\n return {\n code: nextProps.credCode || '',\n codeReceived: nextProps.credCode\n };\n }\n\n return prevState;\n }\n\n componentDidMount() {\n // Submit code automatically if it's received from the parent.\n if (this.props.credCode) {\n this.props.onSubmit(this.props.credMethod, this.props.credCode, this.props.credToken);\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n // Submit code automatically if it's received from the parent.\n if (this.state.codeReceived && this.state.code && this.state.code != prevState.code) {\n this.props.onSubmit(this.props.credMethod, this.state.code, this.props.credToken);\n }\n }\n\n\n handleCodeChange(e) {\n this.setState({code: e.target.value.replace(/[^\\d]/g, '')});\n }\n\n handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n } else if (e.key == 'Escape') {\n this.handleCancel(e);\n }\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.code && this.state.code.trim()) {\n this.props.onSubmit(this.props.credMethod, this.state.code.trim(), this.props.credToken);\n }\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel();\n }\n\n render() {\n const { formatMessage } = this.props.intl;\n const methods = {'email': formatMessage(messages.email), 'tel': formatMessage(messages.phone)};\n const method = methods[this.props.credMethod] || this.props.credMethod;\n return (\n \n
\n \n \n \n
\n
\n {\n (numbers_only) => \n } \n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(ValidationView);\n","import React from 'react';\n\nimport ContactList from '../widgets/contact-list.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\nimport {\n uploadLargeFile, getMe, getFileUrl, getUserProfile,\n getWorkbench,\n getOrganizationDepartments, getOrganizationDepartmentMembers, getOrganizationMembers, searchOrganization,\n getMeetings, createMeeting, getMeeting, cancelMeeting, sendMeetingReminders, respondMeeting,\n getDailyReports, createDailyReport, getDailyReport, updateDailyDraft, submitDailyReport, getDailyStatistics, sendDailyReminders,\n getMonthlyReports, createMonthlyReport, getMonthlyReport, updateMonthlyDraft, submitMonthlyReport, reopenMonthlyReport, getMonthlyStatistics,\n getExecutiveMailboxConfig, submitExecutiveMailboxMessage\n} from '../lib/im-api.js';\nimport { useCachedData, readCachedData, writeCachedData } from '../lib/use-cached-data.js';\n\nconst navigate = (view, params) => {\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, view);\n Object.entries(params || {}).forEach(([key, value]) => {\n hash = value ? HashNavigation.addUrlParam(hash, key, value) : HashNavigation.removeUrlParam(hash, key);\n });\n HashNavigation.navigateTo(hash);\n};\n\nexport const WORKPLACE_COLLABORATION_VIEWS = [\n 'workbench', 'organization-directory', 'meeting-organizer', 'meeting-attendee', 'meeting-create', 'meeting-detail',\n 'daily-report-editor', 'daily-report-mine', 'daily-report-team', 'daily-report-detail',\n 'monthly-report-editor', 'monthly-report-mine', 'monthly-report-team', 'monthly-report-detail',\n 'executive-mailbox', 'executive-mailbox-notice'\n];\n\nfunction Icon({children}) { return {children} ; }\n\nfunction Header({title, back = 'workbench', action, actionLabel, onAction, actionDisabled}) {\n return \n { if (!HashNavigation.goBack()) navigate(back); }} aria-label=\"返回\">arrow_back_ios_new \n {title} \n {action ? {action} : }\n ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2100);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\n// \"6月25日 周四(今天)\" style used throughout this chapter's reference screenshots.\nconst WEEKDAYS = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];\nfunction formatMeetingDate(d) {\n const now = new Date();\n const dayDiff = Math.round((new Date(d.getFullYear(), d.getMonth(), d.getDate()) -\n new Date(now.getFullYear(), now.getMonth(), now.getDate())) / 86_400_000);\n const suffix = dayDiff === 0 ? '(今天)' : dayDiff === 1 ? '(明天)' : dayDiff === -1 ? '(昨天)' : '';\n return `${d.getMonth() + 1}月${d.getDate()}日 ${WEEKDAYS[d.getDay()]}${suffix}`;\n}\nfunction formatTime(d) {\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;\n}\n// toISOString() is always UTC -- for any timezone ahead of UTC (e.g. China, UTC+8) this returned\n// the *previous* calendar day for the first several hours of every local day (00:00-08:00 local\n// still reads as \"yesterday\" in UTC), so opening the daily report editor in the early morning\n// loaded/redirected to yesterday's already-submitted report instead of starting today's. Match\n// toMonthInputValue's already-correct local-getters approach instead.\nfunction toDateInputValue(d) {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\n}\n\n// Resolves a bare/prefixed user id to a display name, cached -- organization member/meeting\n// participant ids returned by different Ch.9 endpoints aren't consistently confirmed to carry the\n// 'usr' prefix, so try the id as given first and fall back to prefixing it before giving up.\nconst nameCache = new Map();\nfunction resolveUserName(id, onDone) {\n if (!id) return;\n if (nameCache.has(id)) { onDone(nameCache.get(id)); return; }\n const withPrefix = id.startsWith('usr') ? null : 'usr' + id;\n getUserProfile(id).catch(err => withPrefix ? getUserProfile(withPrefix) : Promise.reject(err)).then(p => {\n const name = (p && (p.display_name || p.nickname || p.public_account)) || id;\n nameCache.set(id, name);\n onDone(name);\n }).catch(() => { nameCache.set(id, id); onDone(id); });\n}\n\n// GET /users/{id}/profile 400s (\"malformed request\") when {id} is the caller's own uid -- same\n// backend restriction AdminList already routes around by never calling this endpoint for the owner.\n// author_id/organizer_id fields here have no such alternative source, so the caller's own id has to\n// be special-cased directly rather than resolved through the same lookup as everyone else's.\nfunction useUserNames(ids, myUserId) {\n const [names, setNames] = React.useState({});\n React.useEffect(() => {\n (ids || []).forEach(id => {\n if (!id || names[id] !== undefined) return;\n const prefixed = id.startsWith('usr') ? id : 'usr' + id;\n if (myUserId && prefixed === myUserId) { setNames(v => ({...v, [id]: '我'})); return; }\n resolveUserName(id, name => setNames(v => ({...v, [id]: name})));\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(ids), myUserId]);\n return names;\n}\n\n// Real module codes confirmed live from GET /workbench (differ from the mock's guessed\n// monthly/daily/organization/meeting/mailbox). 'attendance' (\"打卡\") is a real, enabled module\n// with no reference screenshot or requirements text anywhere in this chapter -- routed to a\n// \"not yet available\" toast rather than guessing a feature with zero design reference.\nconst APP_TONES = {organization: 'red', attendance: 'orange', meetings: 'blue', daily_reports: 'orange', monthly_reports: 'violet', executive_mailbox: 'green'};\nconst APP_ICONS = {organization: 'account_tree', attendance: 'schedule', meetings: 'notifications_active', daily_reports: 'task_alt', monthly_reports: 'event_note', executive_mailbox: 'mail_outline'};\nconst APP_ROUTES = {organization: 'organization-directory', meetings: 'meeting-attendee', daily_reports: 'daily-report-mine', monthly_reports: 'monthly-report-mine', executive_mailbox: 'executive-mailbox'};\n\nfunction Workbench({onToast}) {\n // `me` and `modules` decide whether this screen renders its real content or a blank/loading\n // placeholder -- caching just these two (not the per-icon `icons` map, which fills in gradually\n // regardless) removes the \"blank workbench for a beat\" flash every time the user tabs back to it.\n const [me] = useCachedData('me', getMe, []);\n const [modules, setModules] = React.useState(() => readCachedData('workbench-modules') || []);\n const [icons, setIcons] = React.useState({});\n const [error, setError] = React.useState(null);\n\n React.useEffect(() => {\n getWorkbench().then(data => {\n const list = (data && data.modules) || [];\n writeCachedData('workbench-modules', list);\n setModules(list);\n list.forEach(m => {\n if (m.icon_file_id) {\n getFileUrl(m.icon_file_id).then(url => url && setIcons(v => ({...v, [m.code]: url}))).catch(() => {});\n }\n });\n }).catch(err => setError(err.message || '工作台加载失败'));\n }, []);\n\n const openApp = app => {\n if (APP_ROUTES[app.code]) { navigate(APP_ROUTES[app.code]); return; }\n onToast && onToast('该功能暂未开放');\n };\n\n const profile = me && me.profile;\n return \n \n {profile && profile.avatar_file_id ?\n :\n person }\n {(profile && (profile.nickname || profile.public_account)) || '…'} \n 员工 \n navigate('personal-center')}>tune \n \n 提高效率,从工作台开始 Business applications start from the workbench
business_center \n {error ? {error}
: null}\n {modules.filter(m => m.enabled).map(app => openApp(app)}>\n {/* Namespaced ('tone-red', not 'red') because base.css's original Tinode styles already define\n bare `.red`/`.orange`/`.blue`/`.green` as generic `color: ... !important` text-color\n utilities -- an unprefixed tone class here collided with those and, since `!important`\n beats this span's own `color: #fff`, silently retinted 5 of these 6 icons to whichever\n generic accent color happened to share their tone's name (only 月报's 'violet' has no such\n collision, which is why it alone rendered the intended plain white) instead of the uniform\n white every icon here is meant to have -- same bug, same fix, as message-center-view.jsx's\n Avatar tone class. */}\n \n {icons[app.code] ? : {APP_ICONS[app.code] || 'apps'} }\n {app.unread_count ? {app.unread_count > 99 ? '99+' : app.unread_count} : null}\n \n {app.name} \n )} \n \n dashboard 工作台 \n navigate('messages-home')}>chat_bubble_outline 消息 \n ;\n}\n\n// Resolves a file id to an , used for the few real photo/icon spots in this chapter\n// (workbench module icons, my own avatar) -- most Ch.9 screens use plain icons/text only,\n// confirmed against every reference screenshot, so this is intentionally not used everywhere.\nfunction ImgFromFile({fileId, className}) {\n const [url, setUrl] = React.useState(null);\n React.useEffect(() => { let live = true; getFileUrl(fileId).then(u => live && setUrl(u)).catch(() => {}); return () => { live = false; }; }, [fileId]);\n return url ? : ;\n}\n\n// Depth-based icon per docs/images/部门组织框架.png: level 1 = building, level 2 (collapsed) =\n// hollow diamond / (expanded) = filled blue diamond, level 3+ (a person, not a sub-department) =\n// hollow circle. The backend never returns a depth field (confirmed against organizationDepartmentPayload),\n// so depth is purely how far this node is from the root in the client's own recursion.\n// 层级标注统一用中文数字。原来树形分支只手写到\"二级\"、更深就退化成\"3级\",\n// 而搜索分支又硬传字符串 \"三\",同一个标注两条路径两种格式。\nconst LEVEL_NUMERALS = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十'];\nconst levelLabel = n => LEVEL_NUMERALS[n - 1] || String(n);\n\nfunction DeptRow({dept, depth, expanded, onToggle}) {\n const icon = depth === 0 ? 'business' : 'diamond';\n return \n {icon} \n {dept.name}{typeof dept.member_count === 'number' ? `${dept.member_count}人` : ''}({levelLabel(depth + 1)}级) \n {expanded ? 'expand_more' : 'chevron_right'} \n ;\n}\n\n// Search-result-only department row: no tree position to expand into (search returns a flat\n// match list, not a subtree), so unlike DeptRow this is informational, not clickable.\nfunction SearchDeptRow({dept}) {\n return \n business \n {dept.name}{typeof dept.member_count === 'number' ? `(${dept.member_count}人)` : ''} \n
;\n}\n\nfunction PersonRow({person, depth, isMe, level}) {\n return navigate('group-member-profile', {uid: person.user_id})}>\n radio_button_unchecked \n {person.display_name}({levelLabel(level)}级) \n chevron_right \n ;\n}\n\n// One department node: on first expand, fetches its child departments AND its direct members\n// (two separate calls -- there is no combined endpoint) and renders both, recursing for children.\nfunction DeptNode({dept, depth, myUserId}) {\n const [expanded, setExpanded] = React.useState(depth === 0);\n const [children, setChildren] = React.useState(null);\n const [members, setMembers] = React.useState(null);\n const [loading, setLoading] = React.useState(false);\n const [loadError, setLoadError] = React.useState(false);\n\n const load = () => {\n if (children != null) return;\n setLoading(true);\n setLoadError(false);\n Promise.all([\n dept.child_count ? getOrganizationDepartments(dept.department_id).then(d => d.departments || d.items || []) : Promise.resolve([]),\n dept.member_count ? getOrganizationDepartmentMembers(dept.department_id).then(d => d.members || d.items || []) : Promise.resolve([])\n ]).then(([depts, mems]) => { setChildren(depts); setMembers(mems); })\n // Without this, a rejected Promise.all left children/members at null forever -- rendered as\n // an empty (but not loading) node, indistinguishable from \"this department genuinely has no\n // sub-departments or members\". loadError lets the retry link below tell the two apart.\n .catch(() => setLoadError(true))\n .finally(() => setLoading(false));\n };\n\n const toggle = () => { const next = !expanded; setExpanded(next); if (next) load(); };\n React.useEffect(() => { if (expanded) load(); /* eslint-disable-next-line react-hooks/exhaustive-deps */ }, []);\n\n return <>\n \n {expanded && loading ? 加载中…
: null}\n {expanded && !loading && loadError ?\n 加载失败 { e.preventDefault(); load(); }}>重试
: null}\n {expanded && !loading && !loadError ? <>\n {(children || []).map(child => )}\n {(members || []).map(person => )}\n > : null}\n >;\n}\n\nfunction durationLabel(startAt, endAt) {\n const mins = Math.round((new Date(endAt) - new Date(startAt)) / 60_000);\n if (mins <= 0) return '';\n if (mins % 60 === 0) return `${mins / 60}小时`;\n if (mins < 60) return `${mins}分钟`;\n return `${Math.floor(mins / 60)}小时${mins % 60}分钟`;\n}\n\nconst RESPONSE_LABEL = {accepted: '已接受', declined: '已拒绝', tentative: '待定'};\n\n// 这条只对 GET /meetings(列表)成立——实测确认只有列表接口会解析真实姓名,MeetingCard 只在\n// 列表页使用,不需要额外查询。**创建/详情/更新/取消/我的回应这5个接口不会**(display_name\n// 恒等于裸 user_id,第一次记录这条时误以为\"响应已带姓名解析\"对所有会议接口都成立,被这次复测\n// 用真实创建的会议证伪)——MeetingDetail 复用的是这5个接口之一,接了 useUserNames 兜底。\nfunction MeetingCard({meeting, myUserId, onRespond, onToast}) {\n const organizerName = (meeting.organizer && meeting.organizer.display_name) || meeting.organizer_display_name || meeting.organizer_id;\n const attendeeNames = (meeting.participants || []).map(p => p.display_name || p.user_id).join('、');\n const isOrganizer = meeting.organizer_id === myUserId;\n const [busy, setBusy] = React.useState(false);\n\n const respond = response => {\n setBusy(true);\n // Same stale-version hazard MeetingDetail's respond/cancel already guard against (every\n // participant's response bumps the meeting's version) -- this card's `meeting` prop is\n // whatever the list loaded, which can be behind if another invitee responded since.\n getMeeting(meeting.meeting_id).then(fresh => respondMeeting(fresh.meeting_id, response, fresh.version)).then(_ => {\n onRespond();\n onToast(response === 'accepted' ? '已接受会议邀请' : response === 'declined' ? '已拒绝会议邀请' : '已标记为待定');\n }).catch(err => onToast(err.message || '操作失败')).finally(() => setBusy(false));\n };\n\n return \n {formatMeetingDate(new Date(meeting.start_at))} {formatTime(new Date(meeting.start_at))} \n 会议主题:{meeting.title} \n navigate('meeting-detail', {meeting_id: meeting.meeting_id})}>查看更多chevron_right \n \n \n
发起人 {organizerName} \n
时间 {formatMeetingDate(new Date(meeting.start_at))} \n {meeting.location ?
地点 {meeting.location} : null}\n
参会人 {attendeeNames || '无'} \n
会议时间 {durationLabel(meeting.start_at, meeting.end_at)} \n \n {!isOrganizer ? (\n meeting.my_response && meeting.my_response !== 'pending' ?\n {RESPONSE_LABEL[meeting.my_response] || meeting.my_response} :\n \n respond('declined')}>拒绝 \n respond('accepted')}>接受 \n \n ) : null}\n ;\n}\n\nfunction Meetings({onToast}) {\n const [meetings, setMeetings] = React.useState(() => readCachedData('meetings') || null);\n const [me] = useCachedData('me', getMe, []);\n const myUserId = me && me.user_id;\n\n const load = () => getMeetings().then(d => {\n const list = d.meetings || d.items || [];\n writeCachedData('meetings', list);\n setMeetings(list);\n }).catch(() => setMeetings(prev => prev || []));\n // `load` has a concise arrow body, so it returns the whole promise chain -- passing it directly as\n // the effect callback made React treat that promise as an (invalid) cleanup return value.\n React.useEffect(() => { load(); }, []);\n\n return navigate('meeting-create')} />\n \n {meetings == null ? 加载中…
:\n meetings.length === 0 ? 暂无会议通知
:\n meetings.map(m => )}\n \n ;\n}\n\nfunction MeetingDetail({hashParams, onToast}) {\n const meetingId = hashParams && hashParams.meeting_id;\n const [meeting, setMeeting] = React.useState(() => (meetingId && readCachedData('meeting:' + meetingId)) || null);\n const [me] = useCachedData('me', getMe, []);\n const myUserId = me && me.user_id;\n const [busy, setBusy] = React.useState(false);\n const [loadError, setLoadError] = React.useState(false);\n // 详情/创建/更新/取消/我的回应这5个接口的 organizer.display_name / participants[].display_name\n // 实测就是裸 user_id 本身(只有列表接口 GET /meetings 真的解析姓名)——上面 MeetingCard 那段\n // \"响应已带姓名解析、不需要额外查询\"的注释只对列表成立,本页面复用同一份 useUserNames 兜底\n // (日报/月报详情页已经在用同一套机制)。\n const participantIds = (meeting && meeting.participants || []).map(p => p.user_id);\n const nameIds = meeting ? [meeting.organizer_id, ...participantIds] : [];\n const resolvedNames = useUserNames(nameIds, myUserId);\n const nameFor = (id, fallback) => {\n if (fallback && fallback !== id) return fallback;\n return (id && resolvedNames[id]) || fallback || id;\n };\n\n const load = () => meetingId && getMeeting(meetingId).then(m => { writeCachedData('meeting:' + meetingId, m); setMeeting(m); }).catch(err => { onToast(err.message || '加载失败'); setLoadError(true); });\n React.useEffect(() => {\n // This view is only ever keyed by view-name in sidepanel-view.jsx, not by meeting_id, so jumping\n // directly between two different meetings' details would otherwise briefly show the previous\n // meeting's cached data under the new id -- reseed explicitly from the new id's own cache entry.\n if (meetingId) setMeeting(readCachedData('meeting:' + meetingId) || null);\n load();\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [meetingId]);\n\n if (!meeting) return {loadError ? '会议信息加载失败' : '加载中…'}
;\n\n const counts = {accepted: 0, pending: 0, declined: 0, tentative: 0};\n (meeting.participants || []).forEach(p => { counts[p.response] = (counts[p.response] || 0) + 1; });\n const isOrganizer = meeting.organizer_id === myUserId;\n\n const remind = () => {\n setBusy(true);\n sendMeetingReminders(meeting.meeting_id).then(_ => onToast('已提醒未响应成员')).catch(err => onToast(err.message || '提醒失败')).finally(() => setBusy(false));\n };\n const cancel = () => {\n setBusy(true);\n // Every participant response bumps the meeting's version, so refetch immediately before\n // cancelling to avoid a stale-version rejection.\n getMeeting(meeting.meeting_id).then(fresh => cancelMeeting(fresh.meeting_id, fresh.version))\n .then(_ => { onToast('会议已取消'); load(); }).catch(err => onToast(err.message || '取消失败')).finally(() => setBusy(false));\n };\n const respond = response => {\n setBusy(true);\n getMeeting(meeting.meeting_id).then(fresh => respondMeeting(fresh.meeting_id, response, fresh.version))\n .then(_ => { onToast(RESPONSE_LABEL[response] ? `已${RESPONSE_LABEL[response]}` : '已回应'); load(); })\n .catch(err => onToast(err.message || '操作失败')).finally(() => setBusy(false));\n };\n\n return \n
\n \n {formatMeetingDate(new Date(meeting.start_at))} {formatTime(new Date(meeting.start_at))} \n 会议主题:{meeting.title} \n \n
发起人 {nameFor(meeting.organizer_id, (meeting.organizer && meeting.organizer.display_name) || meeting.organizer_display_name)} \n
时间 {formatMeetingDate(new Date(meeting.start_at))} {formatTime(new Date(meeting.start_at))} - {formatTime(new Date(meeting.end_at))} \n {meeting.location ?
地点 {meeting.location} : null}\n
会议时间 {durationLabel(meeting.start_at, meeting.end_at)} \n \n \n {(meeting.participants || []).map(p => \n {nameFor(p.user_id, p.display_name)} \n {RESPONSE_LABEL[p.response] || '待确认'} \n )}\n \n {!isOrganizer && meeting.permissions && meeting.permissions.can_respond && (!meeting.my_response || meeting.my_response === 'pending') ?\n \n respond('declined')}>无法参加 \n respond('tentative')}>待定 \n respond('accepted')}>接受 \n : null}\n \n {isOrganizer ? \n 参会确认 \n {counts.accepted} 已接受 {counts.pending} 待响应 {counts.declined} 已拒绝
\n \n {meeting.permissions && meeting.permissions.can_remind ? notifications 提醒未响应 : null}\n {/* 后端常量是 \"canceled\" 单 l(store/types/meetings.go:7),原来写成 \"cancelled\" 永远不相等,\n 会议取消之后\"取消会议\"按钮还挂在那儿 */}\n {meeting.permissions && meeting.permissions.can_cancel && meeting.state !== 'canceled' ? 取消会议 : null}\n \n : null}\n \n
;\n}\n\nfunction MeetingCreate({myUserId, tinode, onToast}) {\n const [title, setTitle] = React.useState('');\n const [date, setDate] = React.useState(toDateInputValue(new Date()));\n const [startTime, setStartTime] = React.useState('');\n const [endTime, setEndTime] = React.useState('');\n const [location, setLocation] = React.useState('');\n const [query, setQuery] = React.useState('');\n const [candidates, setCandidates] = React.useState([]);\n const [selected, setSelected] = React.useState([]);\n const [names, setNames] = React.useState({});\n const [submitting, setSubmitting] = React.useState(false);\n\n React.useEffect(() => {\n const handle = window.setTimeout(() => {\n getOrganizationMembers({query}).then(d => setCandidates(d.members || d.items || [])).catch(() => setCandidates([]));\n }, 300);\n return () => window.clearTimeout(handle);\n }, [query]);\n\n const toggle = uid => {\n setSelected(v => v.includes(uid) ? v.filter(x => x != uid) : v.concat(uid));\n const cand = candidates.find(c => c.user_id === uid);\n if (cand) setNames(v => ({...v, [uid]: cand.display_name}));\n };\n\n const contacts = candidates.map(c => ({user: c.user_id, public: {fn: c.display_name}}));\n\n const submit = () => {\n if (!title.trim() || !date || !startTime || !endTime || selected.length === 0) {\n onToast('请完善会议主题、时间与参会人');\n return;\n }\n const startAt = new Date(`${date}T${startTime}:00`).toISOString();\n const endAt = new Date(`${date}T${endTime}:00`).toISOString();\n // Backend 400s with {details:{field:\"end_at\"}} for this (real request confirmed), but nothing\n // upstream of onToast reads `details` -- catching it locally avoids a round-trip for the single\n // most likely input mistake (single shared date, two independent time inputs).\n if (endAt <= startAt) { onToast('结束时间需晚于开始时间'); return; }\n setSubmitting(true);\n createMeeting({title: title.trim(), start_at: startAt, end_at: endAt, location: location.trim(), attendee_user_ids: selected})\n .then(_ => { onToast('会议已发起'); navigate('meeting-attendee'); })\n .catch(err => onToast((err.details && err.details.field === 'end_at') ? '结束时间需晚于开始时间' : (err.message || '发起会议失败')))\n .finally(() => setSubmitting(false));\n };\n\n return ;\n}\n\nfunction OrganizationDirectory({myUserId}) {\n const [query, setQuery] = React.useState('');\n const [searchResults, setSearchResults] = React.useState(null);\n const [roots, setRoots] = React.useState(() => readCachedData('org-roots') || null);\n const [rootsError, setRootsError] = React.useState(false);\n const [tenantName, setTenantName] = React.useState('');\n\n const loadRoots = React.useCallback(() => {\n setRootsError(false);\n getOrganizationDepartments('root').then(d => {\n const list = d.departments || d.items || [];\n writeCachedData('org-roots', list);\n setRoots(list);\n }).catch(() => {\n // Was collapsing a genuine load failure into the exact same `roots: []` state as \"this\n // tenant truly has no departments\" -- rootsError lets the render below tell them apart\n // instead of showing \"暂无组织架构数据\" for what might just be a network blip.\n setRoots(prev => prev || []);\n setRootsError(true);\n });\n }, []);\n\n React.useEffect(() => {\n loadRoots();\n try {\n const tenant = JSON.parse(window.localStorage.getItem('im-tenant') || '{}');\n setTenantName(tenant.name || '');\n } catch (_) { /* ignore */ }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Was calling getOrganizationMembers({query}) -- besides that function's own now-fixed q/query\n // param bug, it only ever returns users, so \"搜索成员或部门\" (search members OR departments) could\n // never actually find a department. searchOrganization is the documented endpoint for this exact\n // box (GET /organization/search?q=&types=department,user) and already existed in im-api.js, matching\n // the real backend, but had no caller anywhere -- a correct implementation nothing used.\n React.useEffect(() => {\n if (!query.trim()) { setSearchResults(null); return; }\n const handle = window.setTimeout(() => {\n searchOrganization(query).then(d => setSearchResults(d.items || [])).catch(() => setSearchResults([]));\n }, 300);\n return () => window.clearTimeout(handle);\n }, [query]);\n\n return \n
\n search \n setQuery(event.target.value)} placeholder=\"搜索成员或部门\" />\n \n {searchResults ?\n \n {searchResults.length === 0 ? 未找到匹配的成员
:\n searchResults.map((item, idx) => item.type === 'department' ?\n :\n )}\n :\n }\n \n
;\n}\n\n// The backend's daily report Content field is a flat string (confirmed against\n// store/types/reports.go -- no entries array exists server-side). docs/images/日报.png shows a\n// repeatable \"起止时间 + 今日工作总结\" block editor, so that's purely a front-end authoring\n// convenience: blocks are joined into one formatted string before being sent as `content`.\nfunction blocksToContent(blocks) {\n return blocks\n .filter(b => b.content.trim())\n .map(b => (b.start && b.end ? `${b.start}-${b.end}\\n` : '') + b.content.trim())\n .join('\\n\\n');\n}\n\nfunction DailyReportEditor({onToast}) {\n const today = toDateInputValue(new Date());\n const cacheKey = 'daily-report-editor:' + today;\n // This composer sits in a side panel next to chat -- a user plausibly starts today's report,\n // switches away to answer a message, and comes back mid-edit, so seed from cache (not just the\n // read-only hub pages) to avoid the blocks textarea flashing back to empty on that round trip.\n // createDailyReport() below always still runs and overwrites this with the server's own state,\n // so a stale/wrong seed here self-corrects within one request -- same \"revalidate in background\"\n // shape as everywhere else, just with a same-shape object rather than a single field.\n const cached = readCachedData(cacheKey);\n const [reportId, setReportId] = React.useState(cached ? cached.reportId : null);\n const [version, setVersion] = React.useState(cached ? cached.version : null);\n // The debounced autosave below reads `version` from inside a setTimeout scheduled by an effect\n // keyed on `blocks`/`reportId` (not `version`) -- if a save request is still in flight when the\n // next edit re-schedules the timer, the new timer's closure captures whatever `version` was at\n // that moment, which can be one save behind the real server version by the time it actually\n // fires (the earlier save's response, which bumps `version`, can land after the new timer was\n // created but before it runs). A ref always reflects the latest value regardless of when the\n // closure was created, so reads through it can't be stale the way a captured state variable can.\n const versionRef = React.useRef(cached ? cached.version : null);\n const setVersionBoth = v => { versionRef.current = v; setVersion(v); };\n const [blocks, setBlocks] = React.useState(cached ? cached.blocks : [{start: '', end: '', content: ''}]);\n const [saved, setSaved] = React.useState(false);\n const [saveError, setSaveError] = React.useState(false);\n const [submitting, setSubmitting] = React.useState(false);\n // Serializes every draft save (the debounced autosave below AND submit()'s own pre-submit save)\n // through one chain, so two overlapping requests can never both read the same not-yet-updated\n // versionRef and race the server -- confirmed live: clicking submit right as/after the debounce\n // timer's own autosave fires can otherwise send two saves built from the same stale version, and\n // whichever the server sees second comes back 409 VERSION_CONFLICT, leaving the report un-submitted\n // with no obvious explanation. Reopening a cached draft and only touching a little before submitting\n // (now a normal flow, where blank-every-time wasn't) makes this window much easier to hit than before.\n const saveChainRef = React.useRef(Promise.resolve());\n const draftTimerRef = React.useRef(null);\n const saveDraft = React.useCallback(nextBlocks => {\n const run = () => updateDailyDraft(reportId, blocksToContent(nextBlocks), versionRef.current, []).then(r => {\n setVersionBoth(r.version); setSaved(true); setSaveError(false);\n writeCachedData(cacheKey, {reportId, version: r.version, blocks: nextBlocks});\n return r;\n });\n const next = saveChainRef.current.then(run);\n saveChainRef.current = next.catch(() => {});\n return next;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [reportId]);\n\n React.useEffect(() => {\n createDailyReport(today).then(r => {\n // createDailyReport is idempotent -- reopening this editor for a day whose report was already\n // submitted returns that same (now non-draft) report instead of erroring. The draft-save\n // endpoint's UPDATE is scoped to `WHERE status='draft'` (im_be's TenantDailyReportSaveDraft),\n // so every autosave against a submitted report's affected-rows count is 0 -> a 409 that used\n // to be silently swallowed. can_edit is the backend's own real-time signal for this (same\n // status check), so redirect to the read-only detail view instead of handing the user a\n // composer that looks editable but can never actually save.\n if (r.permissions && r.permissions.can_edit === false) { navigate('daily-report-detail', {report_id: r.report_id}); return; }\n const nextBlocks = r.content ? [{start: '', end: '', content: r.content}] : [{start: '', end: '', content: ''}];\n setReportId(r.report_id);\n setVersionBoth(r.version);\n setBlocks(nextBlocks);\n writeCachedData(cacheKey, {reportId: r.report_id, version: r.version, blocks: nextBlocks});\n }).catch(err => onToast(err.message || '创建日报失败'));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n if (!reportId) return undefined;\n setSaved(false);\n draftTimerRef.current = window.setTimeout(() => {\n draftTimerRef.current = null;\n saveDraft(blocks).catch(() => setSaveError(true));\n }, 600);\n return () => window.clearTimeout(draftTimerRef.current);\n }, [blocks, reportId, saveDraft]);\n\n const updateBlock = (idx, field, value) => setBlocks(v => v.map((b, i) => i === idx ? {...b, [field]: value} : b));\n const addBlock = () => setBlocks(v => v.concat({start: '', end: '', content: ''}));\n const removeBlock = idx => setBlocks(v => v.length > 1 ? v.filter((_, i) => i !== idx) : v);\n\n const submit = () => {\n const content = blocksToContent(blocks);\n if (!content.trim()) { onToast('请填写今日工作总结'); return; }\n setSubmitting(true);\n if (draftTimerRef.current) { window.clearTimeout(draftTimerRef.current); draftTimerRef.current = null; }\n saveDraft(blocks).then(r => submitDailyReport(reportId, r.version))\n .then(_ => { onToast('日报已提交'); window.setTimeout(() => navigate('daily-report-detail', {report_id: reportId}), 500); })\n .catch(err => onToast(err.message || '提交失败'))\n .finally(() => setSubmitting(false));\n };\n\n return \n
\n {blocks.map((block, idx) => )}\n add 添加时间段 \n {saveError ? '草稿保存失败,请检查网络后重新编辑' : saved ? '草稿已自动保存' : '正在保存草稿…'}
\n \n
{submitting ? '提交中…' : '提交'} \n
;\n}\n\nconst STATUS_LABEL = {submitted: '已提交', draft: '未提交'};\n\nfunction DailyReportCard({report, names, team}) {\n return \n {names[report.author_id] || report.author_id} 员工 \n {STATUS_LABEL[report.status] || report.status} \n {report.content_short || '(未填写内容)'}
\n schedule {report.report_date} \n navigate('daily-report-detail', {report_id: report.report_id})}>查看详情chevron_right \n ;\n}\n\nfunction DailyReportList({team, myUserId, onToast}) {\n const cacheKey = 'daily-reports:' + (team ? 'managed' : 'mine');\n const statsCacheKey = 'daily-stats:' + toDateInputValue(new Date());\n // Seed from cache so re-entering \"我的日报\"/\"团队统计\" (a real user flow: check the list, go fill\n // in today's report, come back) doesn't blank the list out while the identical request re-runs.\n const [reports, setReports] = React.useState(() => readCachedData(cacheKey) || null);\n const [loadError, setLoadError] = React.useState(false);\n const [query, setQuery] = React.useState('');\n const [stats, setStats] = React.useState(() => (team && readCachedData(statsCacheKey)) || null);\n const ids = (reports || []).map(r => r.author_id);\n const names = useUserNames(ids, myUserId);\n\n const load = () => {\n setLoadError(false);\n // Previously swallowed every failure (network error, 403, ...) into a bare empty/stale list --\n // indistinguishable from \"genuinely no reports today\" (which also renders as an empty list).\n // A real failure now surfaces via toast + loadError so the list can say \"加载失败\" instead of\n // silently implying \"暂无日报\", matching how DailyReportDetail/MonthlyReportList already report\n // their own load failures.\n getDailyReports({scope: team ? 'managed' : 'mine'}).then(d => {\n const list = d.reports || d.items || [];\n writeCachedData(cacheKey, list);\n setReports(list);\n }).catch(err => { onToast(err.message || '日报列表加载失败'); setLoadError(true); setReports(prev => prev || []); });\n if (team) getDailyStatistics(toDateInputValue(new Date())).then(s => { writeCachedData(statsCacheKey, s); setStats(s); }).catch(() => {});\n };\n React.useEffect(load, [team]);\n\n const filtered = (reports || []).filter(r => {\n // department_name 后端根本不返回(dailyReportListPayload 的字段只有 report_id/author_id/\n // report_date/content_short/status/draft_updated_at/read_state/version),拼进来恒为空串,\n // 等于占位符承诺的\"部门\"那半个搜索永远搜不到任何东西。改为按真实有的字段搜:姓名 + 摘要内容。\n const hay = team ? `${names[r.author_id] || ''}${r.content_short || ''}` : r.report_date;\n return hay.includes(query);\n });\n\n const remindMissing = () => {\n sendDailyReminders(toDateInputValue(new Date())).then(_ => onToast('已提醒未提交成员'))\n .catch(err => onToast(err.message || '提醒失败'));\n };\n\n return \n
navigate('daily-report-editor')} back={team ? 'daily-report-mine' : 'workbench'} />\n \n {team && stats ? \n {formatMeetingDate(new Date())} 全公司 \n navigate('daily-report-mine')}>我的日报 \n {stats.expected_count || 0} 应提交 \n {stats.submitted_count || 0} 已提交 \n {(stats.expected_count || 0) - (stats.submitted_count || 0)} 未提交
\n notifications_active 提醒未提交成员 \n : null}\n search \n setQuery(e.target.value)} placeholder={team ? '搜索姓名或内容' : '搜索日期'} /> \n {!team ? \n 我的日报 \n navigate('daily-report-team')}>团队统计 \n : null}\n \n {reports == null ? 加载中…
:\n filtered.length === 0 ? {loadError ? '日报列表加载失败' : '暂无日报'}
:\n filtered.map(r => )}\n \n \n ;\n}\n\nfunction DailyReportDetail({hashParams, myUserId, onToast}) {\n const reportId = hashParams && hashParams.report_id;\n const [report, setReport] = React.useState(() => (reportId && readCachedData('daily-report:' + reportId)) || null);\n const [loadError, setLoadError] = React.useState(false);\n const names = useUserNames(report ? [report.author_id] : [], myUserId);\n\n React.useEffect(() => {\n if (!reportId) return;\n // Keyed only by view-name upstream (not report_id), so reseed per-id here rather than relying\n // on the initializer -- see the identical MeetingDetail comment for why that matters.\n setReport(readCachedData('daily-report:' + reportId) || null);\n getDailyReport(reportId).then(r => { writeCachedData('daily-report:' + reportId, r); setReport(r); }).catch(err => { onToast(err.message || '日报加载失败'); setLoadError(true); });\n }, [reportId]);\n if (!report) return {loadError ? '日报加载失败' : '加载中…'}
;\n\n return \n
\n {names[report.author_id] || '…'} 员工 \n {STATUS_LABEL[report.status] || report.status} \n schedule {report.report_date} \n 今日工作总结 {report.content || '未填写'}
\n \n
;\n}\n\nfunction toMonthInputValue(d) { return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`; }\nfunction formatMonthLabel(month) {\n const [y, m] = month.split('-');\n return `${y} 年 ${parseInt(m, 10)} 月`;\n}\n\n// docs/images/月报(1).png shows the second field labeled \"其他事项\" (optional-looking, no\n// asterisk) but the backend's only real second field is `next_plan` (store/types/reports.go),\n// declared required in the backend's own advertised contract (monthlyReportDetailPayload:\n// next_plan_required:true). The 月报 image set also had a confirmed content mix-up elsewhere\n// (月报.png's list content is verbatim 日报 demo text), so it's trusted less than usual here --\n// labeling this field by what it actually stores/is required to avoid silently mislabeling\n// \"next month's plan\" as generic \"other matters\".\nfunction MonthlyReportEditor({onToast}) {\n const month = toMonthInputValue(new Date());\n const cacheKey = 'monthly-report-editor:' + month;\n // Same rationale as DailyReportEditor's cache seed -- see the comment there.\n const cached = readCachedData(cacheKey);\n const [reportId, setReportId] = React.useState(cached ? cached.reportId : null);\n const [version, setVersion] = React.useState(cached ? cached.version : null);\n // See the matching comment in DailyReportEditor -- a ref avoids the debounced-save-in-flight\n // stale-version race that a captured `version` state variable would be exposed to.\n const versionRef = React.useRef(cached ? cached.version : null);\n const setVersionBoth = v => { versionRef.current = v; setVersion(v); };\n const [summary, setSummary] = React.useState(cached ? cached.summary : '');\n const [plan, setPlan] = React.useState(cached ? cached.plan : '');\n // monthlyReportDetailPayload's real validation.max_length is 10000, not the 1000 this page used to\n // hardcode -- confirmed live (a 2000-char draft save was accepted while this UI would have blocked\n // it at 1000). Keep 1000 as the pre-load fallback so the textarea has *some* limit before the first\n // response comes back, not because it's the real cap.\n const [maxLen, setMaxLen] = React.useState(1000);\n // A cached seed can go stale the instant something outside this component's lifetime mutates the\n // report's version -- concretely, MonthlyReportDetail's \"重新编辑\" (reopenMonthlyReport) does that,\n // then navigates straight here. Live-reproduced: reopen -> land here with the cache still holding\n // the pre-reopen version -> the autosave effect below fired on mount before this component's own\n // fresh fetch (below) could correct versionRef, 409'd, and surfaced a scary (and wrong) \"请检查\n // 网络\" toast. Gate the very first autosave on that fresh confirmation whenever there was a cache\n // to distrust; skip the wait entirely (unchanged fast path) when there wasn't one.\n const [hydrated, setHydrated] = React.useState(!cached);\n const [saved, setSaved] = React.useState(false);\n const [saveError, setSaveError] = React.useState(false);\n const [submitting, setSubmitting] = React.useState(false);\n // Same serialized-save fix as DailyReportEditor -- see the comment there. Live-reproduced here: a\n // real submit attempt raced the debounced autosave, both built from version 9, one landed and bumped\n // the server to version 10, the other came back 409 VERSION_CONFLICT and the report never actually\n // got submitted.\n const saveChainRef = React.useRef(Promise.resolve());\n const draftTimerRef = React.useRef(null);\n const saveDraft = React.useCallback((s, p) => {\n const run = () => updateMonthlyDraft(reportId, s, p, versionRef.current, []).then(r => {\n setVersionBoth(r.version); setSaved(true); setSaveError(false);\n writeCachedData(cacheKey, {reportId, version: r.version, summary: s, plan: p});\n return r;\n });\n const next = saveChainRef.current.then(run);\n saveChainRef.current = next.catch(() => {});\n return next;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [reportId]);\n\n React.useEffect(() => {\n createMonthlyReport(month).then(r => {\n // Same already-submitted-report trap as DailyReportEditor -- see the comment there.\n if (r.permissions && r.permissions.can_edit === false) { navigate('monthly-report-detail', {report_id: r.report_id}); return; }\n const nextSummary = r.work_summary || ''; const nextPlan = r.next_plan || '';\n setReportId(r.report_id); setVersionBoth(r.version);\n setSummary(nextSummary); setPlan(nextPlan);\n if (r.validation && r.validation.max_length) setMaxLen(r.validation.max_length);\n writeCachedData(cacheKey, {reportId: r.report_id, version: r.version, summary: nextSummary, plan: nextPlan});\n setHydrated(true);\n }).catch(err => onToast(err.message || '创建月报失败'));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n if (!reportId || !hydrated) return undefined;\n setSaved(false);\n draftTimerRef.current = window.setTimeout(() => {\n draftTimerRef.current = null;\n saveDraft(summary, plan).catch(() => setSaveError(true));\n }, 600);\n return () => window.clearTimeout(draftTimerRef.current);\n }, [summary, plan, reportId, hydrated, saveDraft]);\n\n const submit = () => {\n if (!summary.trim() || !plan.trim()) { onToast('请完成必填内容'); return; }\n setSubmitting(true);\n if (draftTimerRef.current) { window.clearTimeout(draftTimerRef.current); draftTimerRef.current = null; }\n saveDraft(summary, plan).then(r => submitMonthlyReport(reportId, r.version))\n .then(_ => { onToast('月报已提交'); window.setTimeout(() => navigate('monthly-report-detail', {report_id: reportId}), 500); })\n .catch(err => onToast(err.message || '提交失败'))\n .finally(() => setSubmitting(false));\n };\n\n return \n
\n \n * 本月工作总结 \n setSummary(e.target.value)} />{summary.length}/{maxLen} \n * 下月工作计划 \n setPlan(e.target.value)} />{plan.length}/{maxLen} \n {saveError ? '草稿保存失败,请检查网络后重新编辑' : saved ? '草稿已自动保存' : '正在保存草稿…'}
\n \n
{submitting ? '提交中…' : '提交'} \n
;\n}\n\n// 团队统计视图镜像 DailyReportList 的同款设计(这个页面原来只有\"我的月报\"一种,没有任何管理员/\n// 团队入口,日报有的东西月报完全没有)。核对 im_be 源码确认后端接口本身是对称的:\n// TenantMonthlyReportList 的 scope=managed 分支跟日报那边字面上是同一段\n// canUseManagedReports(visibility) 权限校验代码,GET /reports/monthly/statistics 的响应字段\n// (expected_count/submitted_count/missing_count)也跟日报统计完全一致——真实请求过一次确认\n// 无权限账号会收到 403 PERMISSION_DENIED 而不是被拒之前那种误报全公司数据。\n// 唯一确认过不对称的一点:月报没有\"提醒未提交成员\"这个后端能力(日报有\n// POST /reports/daily/reminders,月报连对应路由都不存在),所以团队视图不画这个按钮——\n// 画一个点了必炸404的按钮不算\"镜像\",是给用户挖坑。\nfunction MonthlyReportList({team, myUserId, onToast}) {\n const cacheKey = 'monthly-reports:' + (team ? 'managed' : 'mine');\n const statsCacheKey = 'monthly-stats:' + toMonthInputValue(new Date());\n const [reports, setReports] = React.useState(() => readCachedData(cacheKey) || null);\n const [loadError, setLoadError] = React.useState(false);\n const [query, setQuery] = React.useState('');\n const [stats, setStats] = React.useState(() => (team && readCachedData(statsCacheKey)) || null);\n const ids = (reports || []).map(r => r.author_id);\n const names = useUserNames(ids, myUserId);\n\n const load = () => {\n setLoadError(false);\n getMonthlyReports({scope: team ? 'managed' : 'mine'}).then(d => {\n const list = d.reports || d.items || [];\n writeCachedData(cacheKey, list);\n setReports(list);\n }).catch(err => { onToast(err.message || '月报列表加载失败'); setLoadError(true); setReports(prev => prev || []); });\n if (team) getMonthlyStatistics(toMonthInputValue(new Date())).then(s => { writeCachedData(statsCacheKey, s); setStats(s); }).catch(() => {});\n };\n React.useEffect(load, [team]);\n\n const filtered = (reports || []).filter(r => {\n const hay = team ? `${names[r.author_id] || ''}${r.work_summary_short || ''}` : r.month;\n return (hay || '').includes(query);\n });\n\n return \n
navigate('monthly-report-editor')} back={team ? 'monthly-report-mine' : 'workbench'} />\n \n {team && stats ? \n {formatMonthLabel(toMonthInputValue(new Date()))} 全公司 \n navigate('monthly-report-mine')}>我的月报 \n {stats.expected_count || 0} 应提交 \n {stats.submitted_count || 0} 已提交 \n {(stats.expected_count || 0) - (stats.submitted_count || 0)} 未提交
\n : null}\n search \n setQuery(e.target.value)} placeholder={team ? '搜索姓名或内容' : '搜索月份或内容'} /> \n {!team ? \n 我的月报 \n navigate('monthly-report-team')}>团队统计 \n : null}\n \n {reports == null ? 加载中…
:\n filtered.length === 0 ? {loadError ? '月报列表加载失败' : '暂无月报'}
:\n filtered.map(r => navigate((r.action || (r.status === 'submitted' ? 'view' : 'edit')) === 'view' ? 'monthly-report-detail' : 'monthly-report-editor', {report_id: r.report_id})}>\n calendar_month \n {team ? (names[r.author_id] || r.author_id) : formatMonthLabel(r.month)} \n {team ? formatMonthLabel(r.month) : '工作总结与下月计划'} \n {STATUS_LABEL[r.status] || r.status} \n chevron_right \n )}\n \n \n ;\n}\n\nfunction MonthlyReportDetail({hashParams, myUserId, onToast}) {\n const reportId = hashParams && hashParams.report_id;\n const [report, setReport] = React.useState(() => (reportId && readCachedData('monthly-report:' + reportId)) || null);\n const [loadError, setLoadError] = React.useState(false);\n const [reopening, setReopening] = React.useState(false);\n const names = useUserNames(report ? [report.author_id] : [], myUserId);\n\n React.useEffect(() => {\n if (!reportId) return;\n setReport(readCachedData('monthly-report:' + reportId) || null);\n getMonthlyReport(reportId).then(r => { writeCachedData('monthly-report:' + reportId, r); setReport(r); }).catch(err => { onToast(err.message || '月报加载失败'); setLoadError(true); });\n }, [reportId]);\n if (!report) return {loadError ? '月报加载失败' : '加载中…'}
;\n\n // reopenMonthlyReport is self-service only (server keys the UPDATE off the caller's own uid --\n // see the comment on the im-api.js export), so this button only ever makes sense for the report's\n // own author looking at their own already-submitted report, never a manager viewing someone else's.\n const canReopen = report.author_id === myUserId && report.status === 'submitted';\n const reopen = () => {\n setReopening(true);\n reopenMonthlyReport(report.report_id, report.version)\n .then(() => { onToast('已重新打开,可继续编辑'); navigate('monthly-report-editor'); })\n .catch(err => onToast(err.message || '重新打开失败'))\n .finally(() => setReopening(false));\n };\n\n return \n
\n {names[report.author_id] || '…'} 员工 \n {STATUS_LABEL[report.status] || report.status} \n schedule {formatMonthLabel(report.month)} \n 本月工作总结 {report.work_summary || '未填写'}
\n 下月工作计划 {report.next_plan || '未填写'}
\n {canReopen ? \n {reopening ? '处理中…' : '重新编辑'} : null}\n \n
;\n}\n\n// docs/images/总经理信箱.png has no subject input at all -- just 反馈内容 + 附件 + 实名/匿名. The\n// backend's submission body does accept a real, stored `subject` (store/types/mailbox.go), but\n// never validates it, so a derived summary is sent without exposing a box the image doesn't show.\nfunction deriveSubject(content) {\n const first = content.trim().split('\\n')[0];\n return first.length > 30 ? first.slice(0, 30) + '…' : first;\n}\n\nfunction ExecutiveMailbox({tinode, noticeOnly, onToast}) {\n const [config, setConfig] = React.useState(() => readCachedData('executive-mailbox-config') || null);\n const [content, setContent] = React.useState('');\n const [anonymous, setAnonymous] = React.useState(null);\n const [attachments, setAttachments] = React.useState([]);\n const [uploading, setUploading] = React.useState(false);\n const [submitting, setSubmitting] = React.useState(false);\n const [noticeOpen, setNoticeOpen] = React.useState(!!noticeOnly);\n const fileInputRef = React.useRef(null);\n\n React.useEffect(() => {\n getExecutiveMailboxConfig().then(c => { writeCachedData('executive-mailbox-config', c); setConfig(c); })\n // Keep a prior good value on a transient failure rather than clobbering it to the disabled\n // placeholder -- only fall back to {enabled:false} when there's truly nothing cached yet.\n .catch(() => setConfig(prev => prev || {enabled: false}));\n }, []);\n\n // Real tenant config uses attachment_policy.max_files (confirmed live -- matches the key the\n // 意见反馈 config uses); the Go-side struct literal that only ever backs a tenant with no config\n // row at all names it max_count instead, so check both rather than assuming a single unlimited\n // upload button is fine. Previously nothing here capped the count at all.\n const attachmentPolicy = (config && config.attachment_policy) || {};\n const maxFiles = attachmentPolicy.max_files || attachmentPolicy.max_count || 5;\n\n const pickFile = () => {\n if (attachments.length >= maxFiles) { onToast(`最多上传 ${maxFiles} 个附件`); return; }\n fileInputRef.current && fileInputRef.current.click();\n };\n const handleFile = event => {\n const file = event.target.files && event.target.files[0];\n event.target.value = '';\n if (!file || !tinode) return;\n if (attachments.length >= maxFiles) { onToast(`最多上传 ${maxFiles} 个附件`); return; }\n setUploading(true);\n uploadLargeFile(tinode, file).then(({fileId}) => {\n setAttachments(v => v.concat({fileId, name: file.name}));\n }).catch(err => onToast(err.message || '附件上传失败')).finally(() => setUploading(false));\n };\n\n const submit = () => {\n if (!content.trim()) { onToast('请填写反馈内容'); return; }\n if (config && config.allow_anonymous && !anonymous) { onToast('请选择实名反馈或匿名反馈'); return; }\n setSubmitting(true);\n submitExecutiveMailboxMessage({\n subject: deriveSubject(content),\n content: content.trim(),\n anonymous: anonymous === 'anonymous',\n attachment_file_ids: attachments.map(a => a.fileId)\n }).then(_ => {\n onToast('反馈成功');\n setContent(''); setAttachments([]); setAnonymous(null);\n }).catch(err => onToast(err.message || '提交失败')).finally(() => setSubmitting(false));\n };\n\n if (config && !config.enabled) {\n return ;\n }\n\n return ;\n}\n\nexport default function WorkplaceCollaborationView({view, hashParams, myUserId, tinode, onTopicSelected}) {\n const [toast, setToast] = React.useState('');\n let content;\n if (view === 'workbench') content = ;\n else if (view === 'organization-directory') content = ;\n else if (view === 'meeting-organizer' || view === 'meeting-attendee') content = ;\n else if (view === 'meeting-create') content = ;\n else if (view === 'meeting-detail') content = ;\n else if (view === 'daily-report-editor') content = ;\n else if (view === 'monthly-report-editor') content = ;\n else if (view === 'daily-report-mine' || view === 'daily-report-team') content = ;\n else if (view === 'monthly-report-mine' || view === 'monthly-report-team') content = ;\n else if (view === 'daily-report-detail') content = ;\n else if (view === 'monthly-report-detail') content = ;\n else content = ;\n return <>{content} setToast('')} />>;\n}\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Alert extends React.PureComponent {\n render() {\n return (\n
\n
{this.props.title}
\n
{this.props.content}
\n
\n {this.props.onReject ?\n \n {this.props.reject || }\n \n :\n null\n }\n {this.props.onConfirm ?\n \n {this.props.confirm || }\n \n :\n null\n }\n
\n
\n
);\n }\n};\n","// Audio recorder widget.\n\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat';\nimport { base64ToIntArray } from '../lib/blob-helpers';\n\n// Make canvas bigger than the element size to reduce blurring.\nconst CANVAS_UPSCALING = 2.0;\n// Thickness of a visualization bar.\nconst LINE_WIDTH = 3 * CANVAS_UPSCALING;\n// Spacing between two visualization bars.\nconst SPACING = 2 * CANVAS_UPSCALING;\n// Color of histogram bars.\nconst BAR_COLOR = '#888A';\nconst BAR_COLOR_DARK = '#666C';\nconst THUMB_COLOR = '#1781d7'; // average between dark and light accent colors.\n// Minimum number of amplitude bars to draw.\nconst MIN_PREVIEW_LENGTH = 16;\n\n// 7.5 \"列表中同时只能有一条语音播放\":favorites/history 列表和聊天气泡里的每条语音各自是一个独立\n// AudioPlayer 实例,彼此不知道对方的存在。Module-scoped(不是某个列表父组件的 state)所以跨 tab、\n// 跨收藏/聊天记录也生效,不只是同一个列表内部。\nlet activeAudioPlayer = null;\n\nconst messages = defineMessages({\n icon_title_play: {\n id: 'icon_title_play',\n defaultMessage: 'Play recording',\n description: 'Icon tool tip for starting audio playback'\n }\n});\n\nclass AudioPlayer extends React.PureComponent {\n constructor(props) {\n super(props);\n\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n\n this.state = {\n canPlay: false,\n playing: false,\n currentTime: '0:00',\n duration: this.props.duration > 0 ? secondsToTime(this.props.duration / 1000) : '-:--',\n longMin: this.props.duration >= 600000,\n preview: preview\n };\n\n this.initAudio = this.initAudio.bind(this);\n this.initCanvas = this.initCanvas.bind(this);\n this.resampleBars = this.resampleBars.bind(this);\n this.visualize = this.visualize.bind(this);\n\n this.handlePlay = this.handlePlay.bind(this);\n this.handleSeek = this.handleSeek.bind(this);\n this.handleError = this.handleError.bind(this);\n\n this.audioPlayer = null;\n\n this.viewBuffer = [];\n this.canvasRef = React.createRef();\n }\n\n componentDidMount() {\n if (this.props.src) {\n this.initAudio();\n }\n\n this.initCanvas();\n }\n\n componentWillUnmount() {\n if (activeAudioPlayer === this) {\n activeAudioPlayer = null;\n }\n if (this.audioPlayer) {\n this.audioPlayer.onloadedmetadata = null;\n this.audioPlayer.ontimeupdate = null;\n this.audioPlayer.onended = null;\n this.audioPlayer.pause();\n this.audioPlayer = null;\n }\n }\n\n // Called on the previously-playing instance by whichever other instance is about to start.\n pauseForOtherPlayer() {\n if (this.audioPlayer) {\n this.audioPlayer.pause();\n }\n this.setState({playing: false});\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.src != prevProps.src) {\n this.initAudio();\n }\n\n if (this.props.preview != prevProps.preview) {\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n this.setState({preview: preview}, this.initCanvas);\n }\n }\n\n initAudio() {\n this.audioPlayer = new Audio(this.props.src);\n this.audioPlayer.onloadedmetadata = _ => this.setState({canPlay: true});\n this.audioPlayer.ontimeupdate = _ => this.setState({\n currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)\n });\n this.audioPlayer.onended = _ => {\n this.audioPlayer.currentTime = 0;\n this.setState({playing: false, currentTime: secondsToTime(0, this.state.longMin)});\n if (activeAudioPlayer === this) {\n activeAudioPlayer = null;\n }\n }\n }\n\n initCanvas() {\n // Force canvas aspect ratio to match one of the element + upscale canvas to reduce blurring.\n this.canvasRef.current.width = this.canvasRef.current.offsetWidth * CANVAS_UPSCALING;\n this.canvasRef.current.height = this.canvasRef.current.offsetHeight * CANVAS_UPSCALING;\n\n this.canvasContext = this.canvasRef.current.getContext('2d');\n this.canvasContext.lineCap = 'round';\n\n this.viewBuffer = this.resampleBars(this.state.preview);\n this.visualize();\n }\n\n // Draw amplitude of sound.\n visualize() {\n if (!this.canvasRef.current) {\n return;\n }\n\n const width = this.effectiveWidth;\n const height = this.canvasRef.current.height;\n\n this.canvasContext.lineWidth = LINE_WIDTH;\n\n const drawFrame = _ => {\n if (!this.canvasRef.current || !this.audioPlayer) {\n // The component is unmounted.\n return;\n }\n\n this.canvasContext.clearRect(0, 0, this.canvasRef.current.width, height);\n\n if (this.viewBuffer) {\n if (this.state.playing) {\n window.requestAnimationFrame(drawFrame);\n }\n\n // Current playback position.\n const thumbAt = this.props.duration ?\n Math.max(0, Math.min(this.audioPlayer.currentTime * 1000 / this.props.duration, 1)) * (width - LINE_WIDTH * 2) : -1;\n\n // Draw amplitude bars.\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = BAR_COLOR_DARK;\n for (let i = 0; i < this.viewBuffer.length; i++) {\n let x = 1 + i * (LINE_WIDTH + SPACING) + LINE_WIDTH * 0.5;\n let y = Math.max(this.viewBuffer[i] * height * 0.9, 1);\n\n const color = x < thumbAt ? BAR_COLOR_DARK : BAR_COLOR;\n if (this.canvasContext.strokeStyle != color) {\n this.canvasContext.stroke();\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = color;\n }\n\n this.canvasContext.moveTo(x, (height - y) * 0.5);\n this.canvasContext.lineTo(x, (height + y) * 0.5);\n }\n // Actually draw the bars on canvas.\n this.canvasContext.stroke();\n\n // Draw thumb.\n if (this.props.duration) {\n this.canvasContext.beginPath();\n this.canvasContext.arc(thumbAt + LINE_WIDTH * 2, height * 0.5, LINE_WIDTH * 2, 0, 2 * Math.PI);\n this.canvasContext.fillStyle = THUMB_COLOR;\n this.canvasContext.fill();\n }\n }\n }\n\n drawFrame();\n }\n\n // Quick and dirty downsampling of the original preview bars into a smaller (or equal) number of bars we can display here.\n resampleBars(original) {\n const dstCount = ((this.canvasRef.current.width - SPACING) / (LINE_WIDTH + SPACING)) | 0;\n // Remove extra padding on the right due to fractional bar which is not drawn.\n this.effectiveWidth = dstCount * (LINE_WIDTH + SPACING) + SPACING;\n\n if (!Array.isArray(original) || original.length == 0) {\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n const factor = original.length / dstCount;\n let amps = [];\n let maxAmp = -1;\n for (let i=0; i 0) {\n return amps.map(a => a / maxAmp);\n }\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n handlePlay(e) {\n e.preventDefault();\n if (!this.state.canPlay) {\n return;\n }\n\n if (this.state.playing) {\n this.audioPlayer.pause();\n this.setState({playing: false});\n } else if (this.audioPlayer.readyState >= 2) {\n this.audioPlayer.play();\n this.setState({playing: true}, this.visualize);\n // 4.9 语音未读红点:唯一一个知道\"用户真的点了播放\"这一刻的地方——上层只知道会话/消息本身\n // 有没有被标记已读(原生 Tinode recv/read),跟\"这条语音有没有被真的点开听过\"是两件事。\n // 可选 prop,不传不影响任何现有调用点(收藏页/聊天记录检索也在用这个组件,不需要这个信号)。\n if (this.props.onPlay) {\n this.props.onPlay();\n }\n }\n }\n\n handleError(err) {\n console.error(err);\n }\n\n handleSeek(e) {\n e.preventDefault();\n if (e.target && this.props.duration) {\n const rect = e.target.getBoundingClientRect();\n const offset = (e.clientX - rect.left) / this.effectiveWidth * CANVAS_UPSCALING;\n this.audioPlayer.currentTime = this.props.duration * offset / 1000;\n this.setState({currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)});\n if (!this.state.playing) {\n this.visualize();\n }\n }\n }\n\n render() {\n const playClass = 'material-icons' +\n (this.props.short ? '' : ' large') +\n (this.state.canPlay ? '' : ' disabled');\n const play = (\n {this.state.playing ? 'pause_circle' :\n (this.state.canPlay ? 'play_circle' : 'not_interested')} \n );\n return ({this.props.short ?\n <>\n
\n {play}\n >\n :\n <>\n {play}\n
\n
\n
{this.state.currentTime}/{this.state.duration}
\n
\n >\n }\n
);\n }\n}\n\nexport default injectIntl(AudioPlayer);\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport Cropper from './cropper.jsx';\nimport { imageCrop } from '../lib/blob-helpers.js';\n\nexport default class AvatarCrop extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n scale: 1\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleChange = this.handleChange.bind(this);\n }\n\n // Cut out in image coordinates and desired scale factor.\n handleChange(left, top, width, height, scale) {\n this.setState({\n left: left,\n top: top,\n width: width,\n height: height,\n scale: scale\n });\n }\n\n handleSubmit() {\n imageCrop(this.props.mime, this.props.avatar,\n this.state.left, this.state.top, this.state.width, this.state.height,\n this.state.scale)\n .then(img => {\n this.props.onSubmit(img.mime, img.blob, img.width, img.height);\n })\n .catch(err => {\n this.props.onError(err);\n });\n }\n\n render() {\n return (\n \n
\n \n
\n
\n {this.props.onCancel ?\n \n \n \n : null}\n \n \n \n
\n
\n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\nimport LoadSpinner from './load-spinner.jsx';\n\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nimport { AVATAR_SIZE } from '../config.js';\n\nexport default class AvatarUpload extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n source: props.avatar\n };\n\n this.handleFileReceived = this.handleFileReceived.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.avatar != prevProps.avatar) {\n this.setState({source: this.props.avatar});\n }\n }\n\n handleFileReceived(e) {\n const image = e.target.files[0];\n this.props.onImageUpdated(image.type, URL.createObjectURL(image), image.name);\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n render() {\n // Randomize id value in case more than one AvatarUpload is shown\n // at the same time.\n const randId = 'file-input-avatar-' + ('' + Math.random()).substring(0, 4);\n const className = 'avatar-upload' + (this.props.readOnly ? ' read-only' : '');\n return (\n \n {this.props.readOnly || !this.state.source ?\n null :\n
{e.preventDefault(); this.props.onImageUpdated();}}>\n clear \n }\n {this.state.source ?\n
:\n this.props.readOnly && this.props.uid ?\n
\n \n
\n :\n
{AVATAR_SIZE}×{AVATAR_SIZE}
}\n {this.props.readOnly ? null :\n
}\n {this.props.readOnly ? null :\n
\n file_upload \n }\n
\n
\n );\n }\n};\n","import React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst icon_mapping = {'staff': 'verified_user'};\n\nconst messages = defineMessages({\n badge_verified: {\n id: 'badge_verified',\n defaultMessage: 'Verified/official',\n description: 'Explanation of a verified account or topic badge'\n },\n badge_staff: {\n id: 'badge_staff',\n defaultMessage: 'Staff-managed',\n description: 'Explanation of a staff-managed account or topic badge'\n },\n badge_danger: {\n id: 'badge_danger',\n defaultMessage: 'Untrustworthy',\n description: 'Suspicious or untrustworthy account or topic badge'\n },\n});\n\n\n/* Trusted badges with labels: verified, staff, danger */\nclass BadgeList extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let badges = null;\n if (this.props.trustedBadges && this.props.trustedBadges.length > 0) {\n badges = [];\n this.props.trustedBadges.forEach(b => {\n const comment = this.props.short ? null : formatMessage(messages['badge_' + b]);\n const style = 'material-icons ' + b + '-color';\n badges.push({icon_mapping[b] || b} {comment}
);\n });\n return <>{badges}>;\n }\n return null;\n }\n};\n\nexport default injectIntl(BadgeList);\n","// Batch Forward Dialog: reached from multi-select mode (Ch.4 4.17-4.19). Distinct from\n// ForwardDialog (the single-message quick-forward from the message's own context menu, which\n// stays on the native Tinode pub/sub path) -- this one posts to the dedicated\n// POST /v1/im/messages/forward HTTP endpoint since it needs to fan out to several targets in\n// one call, matching docs/images/转发-单选.png / 转发-多选.png / 转发—逐条转发.png.\nimport React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from './contact-list.jsx';\nimport SearchContacts from './search-contacts.jsx';\n\nimport { forwardMessages } from '../lib/im-api.js';\nimport { topicDisplayName } from '../lib/utils.js';\nimport { readCachedData } from '../lib/use-cached-data.js';\n\n// 与服务端 im_http.go:3560 的硬限一致。目标数另有一层更严的产品限制,见 maxTargets()。\nconst MAX_FORWARD_SOURCES = 100;\nconst MAX_FORWARD_TARGETS = 20;\n\nexport default class BatchForwardDialog extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n query: null,\n multiSelect: false,\n selectedTargets: [],\n confirmTargets: null,\n comment: '',\n sending: false,\n error: null\n };\n\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClose = this.handleClose.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleContactSelected = this.handleContactSelected.bind(this);\n this.handleToggleMultiSelect = this.handleToggleMultiSelect.bind(this);\n this.handleConfirmTargets = this.handleConfirmTargets.bind(this);\n this.handleCancelConfirm = this.handleCancelConfirm.bind(this);\n this.handleSend = this.handleSend.bind(this);\n this.handleCommentChange = this.handleCommentChange.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n document.addEventListener('keyup', this.handleEscapeKey, false);\n }\n\n componentWillUnmount() {\n document.removeEventListener('keyup', this.handleEscapeKey, false);\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n this.props.hide();\n }\n }\n\n handleClose(e) {\n e.preventDefault();\n this.props.hide();\n }\n\n handleSearchContacts(query) {\n this.setState({query: Tinode.isNullValue(query) ? null : query});\n this.props.onSearchContacts(query);\n }\n\n handleToggleMultiSelect(e) {\n e.preventDefault();\n this.setState(s => ({multiSelect: !s.multiSelect, selectedTargets: []}));\n }\n\n // Single-select: picking a contact goes straight to the confirm sheet (docs/images/转发-单选.png).\n // Multi-select: toggles membership; \"确定\" (separate button below) advances to confirm.\n handleContactSelected(uid) {\n if (!this.state.multiSelect) {\n this.setState({confirmTargets: [uid]});\n return;\n }\n this.setState(s => {\n if (s.selectedTargets.includes(uid)) {\n return {selectedTargets: s.selectedTargets.filter(t => t != uid), error: null};\n }\n // 目标数上限:优先用 bootstrap 下发的 limits.max_forward_targets(服务端当前给 9),\n // 拿不到就退到服务端硬限 20(im_http.go:3560)。原来两个都不读,选到 21 个才会撞 400。\n const max = this.forwardTargetLimit();\n if (s.selectedTargets.length >= max) {\n return {error: `最多同时转发给 ${max} 个会话`};\n }\n return {selectedTargets: s.selectedTargets.concat(uid), error: null};\n });\n }\n\n forwardTargetLimit() {\n // 读各视图已经在写的同一份 bootstrap 缓存('bootstrap:'+myUserId),不额外发请求。\n const boot = this.props.myUserId ? readCachedData('bootstrap:' + this.props.myUserId) : null;\n const configured = boot && boot.limits && Number(boot.limits.max_forward_targets);\n return configured > 0 ? Math.min(configured, MAX_FORWARD_TARGETS) : MAX_FORWARD_TARGETS;\n }\n\n handleConfirmTargets(e) {\n e.preventDefault();\n if (this.state.selectedTargets.length) {\n this.setState({confirmTargets: this.state.selectedTargets.slice()});\n }\n }\n\n // 转发模式由\"用哪种方式选的目标\"决定,这是参考图给的规则:\n // 转发—逐条转发.png 右上\"多选\"未点,单选一个目标,占位写 [逐条转发]共2条消息\n // 转发—合并转发—多选状态.png 右上已切\"确定\",勾选多个目标,占位写 [合并转发]共16条消息\n // 服务端两种 mode 现在都支持了(bundle 此前返回 501,已实现)。\n forwardMode() {\n return this.state.multiSelect ? 'bundle' : 'separate';\n }\n\n handleCancelConfirm() {\n this.setState({confirmTargets: null, error: null});\n }\n\n handleCommentChange(e) {\n this.setState({comment: e.target.value});\n }\n\n handleSend() {\n // seq must be a JSON string (server struct tag is `json:\"seq,string\"`), same as favoriteMessages.\n const sources = this.props.seqs.map(seq => ({topic: this.props.topicName, seq: String(seq)}));\n // 服务端硬卡 sources ≤ 100、target_topics ≤ 20(im_http.go:3560),超了直接 400 MALFORMED_REQUEST,\n // 用户只会看到一句无从下手的\"转发失败\"。在本地先拦住并说清楚超了多少。\n if (sources.length > MAX_FORWARD_SOURCES) {\n this.setState({error: `一次最多转发 ${MAX_FORWARD_SOURCES} 条消息,当前已选 ${sources.length} 条`});\n return;\n }\n this.setState({sending: true, error: null});\n forwardMessages(this.forwardMode(), sources, this.state.confirmTargets, this.state.comment.trim()).then(result => {\n const failed = (result && result.failed) || [];\n if (failed.length) {\n this.setState({sending: false, error: `${failed.length} 条转发失败,请重试`});\n return;\n }\n this.props.hide(true);\n }).catch(err => {\n this.setState({sending: false, error: err.message || '转发失败'});\n });\n }\n\n render() {\n if (this.state.confirmTargets) {\n const targets = this.state.confirmTargets.map(uid => this.props.tinode.getTopic(uid) || {name: uid, public: null});\n return (\n \n
\n
发送给
\n
\n {targets.map(t => \n {Tinode.isSelfTopicName(t.name) ? '已保存的消息' : topicDisplayName(t.name, t.public, t.name)} \n chevron_right \n )}\n \n {/* 参考图这一栏是可输入的留言框,原来是个只读
,需求 4.19 与对接文档要求的\n \"附加留言\"根本没法填,comment 永远是空串。方括号那段是占位文案,不是内容。 */}\n
\n {this.state.error ?
{this.state.error}
: null}\n
\n 取消 \n \n {this.state.sending ? '发送中…' : '发送'}\n \n
\n
\n
\n );\n }\n\n let contacts = this.state.query != null ? this.props.searchResults : this.props.contacts;\n contacts = contacts.filter((c) => (c.name != this.props.topicSelected) && c.acs.isJoiner() && c.acs.isWriter());\n\n return (\n
\n
\n
\n
\n {this.state.error ?
{this.state.error}
: null}\n
\n
\n
\n );\n }\n}\n","// The <- button to be displayed in title bars.\nimport React from 'react';\n\nexport default class ButtonBack extends React.PureComponent {\n render() {\n return (\n
{e.preventDefault(); this.props.onBack();}}>\n arrow_back \n \n );\n }\n}\n","// IncomingCall: displays Accept & Reject buttons for incoming calls.\nimport React from 'react';\n\nimport BadgeList from './badge-list.jsx';\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_TITLE_LENGTH, MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_INCOMING_RECEIVED } from '../constants.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { truncateString } from '../lib/strformat.js';\n\nconst RING_SOUND = new Audio('audio/call-in.m4a');\n\nexport default class CallIncoming extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n topic: null,\n fullName: undefined,\n avatar: null,\n trustedBadges: [],\n previousMetaDesc: undefined,\n };\n\n this.resetDesc = this.resetDesc.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.handleRejectCall = this.handleRejectCall.bind(this);\n this.handleAcceptCall = this.handleAcceptCall.bind(this);\n this.ringTimer = null;\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n\n this.resetDesc(topic);\n if (this.props.callState == CALL_STATE_INCOMING_RECEIVED) {\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n RING_SOUND.play().catch(_ => {});\n this.ringTimer = setInterval(_ => {RING_SOUND.play().catch(_ => {})}, 2000);\n this.props.onRinging(this.props.topic, this.props.seq);\n }\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n this.resetDesc(topic, props);\n }\n }\n\n componentWillUnmount() {\n if (this.ringTimer != null) {\n clearInterval(this.ringTimer);\n RING_SOUND.pause();\n }\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.setState({topic: null});\n topic.onMetaDesc = this.previousMetaDesc;\n }\n\n resetDesc(topic) {\n const badges = [];\n if (topic.trusted) {\n for (const [key, val] of Object.entries(topic.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n }\n\n this.setState({\n fullName: truncateString(topic.public ? topic.public.fn : undefined, MAX_TITLE_LENGTH),\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n trustedBadges: badges,\n });\n }\n\n onMetaDesc(desc) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetDesc(topic);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n\n handleAcceptCall() {\n this.props.onAcceptCall(this.props.topic);\n }\n\n handleRejectCall() {\n this.props.onReject(this.props.topic, this.props.seq);\n this.props.onClose();\n }\n\n render() {\n const isAudioOnly = !!this.props.audioOnly;\n const ringing = this.props.callState == CALL_STATE_INCOMING_RECEIVED;\n const surfaceClass = isAudioOnly ? 'call-audio-surface' : 'call-video-surface';\n const photoStyle = this.state.avatar ? {'--incoming-call-photo': `url(${this.state.avatar})`} : null;\n return (\n
\n
\n {this.state.avatar &&\n
}\n
\n
\n \n
\n
{truncateString(this.state.fullName, MAX_PEER_TITLE_LENGTH)}\n \n
{isAudioOnly ? '对方邀请你语音通话...' : '对方邀请你视频通话...'}
\n {ringing &&
}\n
\n
\n {ringing ?\n <>\n \n call_end \n 拒绝 \n \n \n {isAudioOnly ? 'call' : 'videocam'} \n 接听 \n \n >\n :\n null\n }\n \n
\n );\n }\n};\n","// Chat message describing a video or voice call.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\nexport default class CallMessage extends React.PureComponent {\n render() {\n const isCallDropped = ['busy', 'declined', 'disconnected', 'missed'].includes(this.props.callState);\n const successClass = 'material-icons medium ' + (isCallDropped ? 'red' : 'green');\n const callIcon = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n const title = this.props.incoming ?\n
:\n
;\n let duration;\n if (isCallDropped) {\n switch (this.props.callState) {\n case 'busy':\n duration =
;\n break;\n case 'declined':\n duration =
;\n break;\n case 'missed':\n duration = this.props.incoming ?\n
:\n
;\n break;\n default:\n duration =
;\n break;\n }\n } else if (['accepted', 'started'].includes(this.props.callState) && !this.props.duration) {\n // Mirrors call-status.jsx's identical branch (the conversation-list preview for the same\n // message) -- this chat-bubble sibling was missing it, so a call left running (the product\n // supports messaging while a call is minimized/in progress) showed \"0:00\" here instead of\n // \"in progress\" until the call actually ended and the message got its final duration.\n duration =
;\n } else {\n duration =
{secondsToTime(this.props.duration / 1000)} ;\n }\n return
\n
call
\n
\n
{title}
\n
{callIcon} {duration}
\n
\n
;\n }\n}\n","// The counter of unread messages in the topic.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\n// Props:\n// incoming: true | false.\n// callState: 'busy' | 'declined' | 'disconnected' | 'missed'.\n// duration:
(call duration in milliseconds).\nexport default class CallStatus extends React.PureComponent {\n render() {\n const isCallDropped = ['busy', 'declined', 'disconnected', 'missed'].includes(this.props.callState);\n const icon2 = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n let duration;\n if (isCallDropped) {\n switch (this.props.callState) {\n case 'busy':\n duration = ;\n break;\n case 'declined':\n duration = ;\n break;\n case 'missed':\n duration = this.props.incoming ?\n :\n ;\n break;\n default:\n duration = ;\n break;\n }\n } else if (['accepted', 'started'].includes(this.props.callState) && !this.props.duration) {\n duration = \n } else {\n duration = {secondsToTime(this.props.duration / 1000)} ;\n }\n return (\n <>\n \n call {icon2} \n
{duration}\n >\n );\n }\n};\n","import React from 'react';\n\n/* CheckBox: styled three-state checkbox, either clickable or static */\nexport default class CheckBox extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleChange = this.handleChange.bind(this);\n }\n\n handleChange() {\n this.props.onChange(this.props.name, !this.props.checked);\n }\n\n render() {\n let classList = ['material-icons'];\n let iconName;\n if (Array.isArray(this.props.className)) {\n classList.push(...this.props.className);\n } else if (this.props.className) {\n classList.push(this.props.className);\n }\n if (this.props.onChange) {\n if (this.props.checked) {\n classList.push('blue', 'clickable');\n iconName = 'check_box';\n } else if (this.props.checked === false) {\n classList.push('blue', 'clickable');\n iconName = 'check_box_outline_blank';\n } else {\n classList.push('lt-blue');\n iconName = 'indeterminate_check_box';\n }\n } else {\n if (this.props.checked) {\n iconName = 'check_box';\n } else {\n iconName = 'check_box_outline_blank';\n }\n }\n let attrs = {\n className: classList.join(' '),\n id: this.props.id,\n };\n if (this.props.onChange) {\n attrs.onClick = this.handleChange;\n }\n return React.createElement('i', attrs, iconName);\n }\n}\n","import React from 'react';\n\nimport Chip from './chip.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n/* BEGIN ChipInput: group membership widget */\nexport default class ChipInput extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = ChipInput.deriveStateFromProps(props);\n this.state.input = '';\n this.state.focused = false;\n\n this.handleTextInput = this.handleTextInput.bind(this);\n this.removeChipAt = this.removeChipAt.bind(this);\n this.handleChipCancel = this.handleChipCancel.bind(this);\n this.handleFocusGained = this.handleFocusGained.bind(this);\n this.handleFocusLost = this.handleFocusLost.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n static deriveStateFromProps(props) {\n return {\n sortedChips: ChipInput.sortChips(props.chips, props.staticMembers),\n chipIndex: ChipInput.indexChips(props.chips)\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chips != this.props.chips ||\n prevProps.staticMembers != this.props.staticMembers ||\n prevProps.prompt != this.props.prompt) {\n this.setState(ChipInput.deriveStateFromProps(this.props));\n }\n if (!prevState || this.props.chips.length > prevState.sortedChips.length) {\n this.setState({input: ''});\n }\n }\n\n // Map chip index to user name\n static indexChips(chips) {\n const index = {};\n let count = 0;\n chips.forEach(item => {\n index[item.user] = count;\n count ++;\n });\n return index;\n }\n\n // Have non-removable chips appear before all other chips.\n static sortChips(chips, keep) {\n const required = [];\n const normal = [];\n chips.forEach(item => {\n if (keep && keep.includes(item.user)) {\n required.push(item);\n } else {\n normal.push(item);\n }\n });\n return required.concat(normal);\n }\n\n handleTextInput(e) {\n this.setState({input: e.target.value});\n if (this.props.filterFunc) {\n this.props.filterFunc(e.target.value);\n }\n }\n\n removeChipAt(idx) {\n const removed = this.state.sortedChips[idx];\n this.props.onChipRemoved(removed.user, this.state.chipIndex[removed.user]);\n }\n\n handleChipCancel(item, idx) {\n this.removeChipAt(idx);\n }\n\n handleFocusGained() {\n this.setState({focused: true});\n }\n\n handleFocusLost() {\n this.setState({focused: false});\n if (this.props.onFocusLost) {\n this.props.onFocusLost(this.state.input);\n }\n }\n\n handleKeyDown(e) {\n if (e.key === 'Backspace') {\n if (this.state.input.length == 0 && this.state.sortedChips.length > 0) {\n const at = this.state.sortedChips.length - 1;\n if (this.state.sortedChips[at].user !== this.props.staticMembers) {\n this.removeChipAt(at);\n }\n }\n } else if (e.key === 'Enter') {\n if (this.props.onEnter) {\n this.props.onEnter(this.state.input);\n }\n } else if (e.key === 'Escape') {\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n }\n\n render() {\n const chips = [];\n let count = 0;\n const staticMembers = this.props.staticMembers || [];\n this.state.sortedChips.forEach(item => {\n chips.push(\n \n );\n count++;\n });\n const className = \"chip-input\" + (this.state.focused ? ' focused' : '');\n const autoFocus = !(this.props.tabIndex > 0);\n return (\n \n {chips}\n \n
\n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\n\nexport default class Chip extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel(this.props.topic, this.props.index);\n }\n\n render() {\n const title = this.props.title || this.props.topic;\n const className = this.props.invalid ? 'chip invalid' : 'chip';\n return (\n \n {this.props.noAvatar ?\n
:\n
\n \n
\n }\n
{title} \n {this.props.onCancel && !this.props.required ?\n
× \n :
}\n
\n );\n }\n};\n","// A panel included into a list of contacts with an action text.\nimport React from 'react';\nimport { injectIntl } from 'react-intl';\n\nclass ContactAction extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.onAction(this.props.action);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n \n {formatMessage(this.props.title, this.props.values)}
\n \n );\n }\n};\n\nexport default injectIntl(ContactAction);\n","import React from 'react';\n\nconst icon_mapping = {'muted': 'notifications_off', 'banned': 'block', 'staff': 'verified_user'};\n\n/* Contact's labels: [you], or icons [muted], [blocked] */\nexport default class ContactBadges extends React.PureComponent {\n render() {\n let badges = null;\n if (this.props.badges && this.props.badges.length > 0) {\n badges = [];\n this.props.badges.forEach(b => {\n const color = (b.color ? ' ' + b.color : '');\n if (b.icon) {\n badges.push({icon_mapping[b.icon] || b.icon} );\n } else {\n badges.push({b.name} );\n }\n });\n return <>{badges}>;\n }\n return null;\n }\n};\n","// ContactList: component for showing a list of contacts,\n// such as a list of group members in a group chat.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Contact from './contact.jsx';\nimport ContactAction from './contact-action.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { topicDisplayName } from '../lib/utils.js';\n\nimport { MESSAGE_PREVIEW_LENGTH } from '../config.js';\n\nconst messages = defineMessages({\n badge_you: {\n id: 'badge_you',\n defaultMessage: 'you',\n description: 'Badge for indicating the current user'\n },\n badge_owner: {\n id: 'badge_owner',\n defaultMessage: 'owner',\n description: 'Badge for indicating the owner'\n }\n});\n\nclass ContactList extends React.PureComponent {\n render() {\n const { formatMessage } = this.props.intl;\n const showCheckmark = Array.isArray(this.props.topicSelected);\n const contactNodes = [];\n\n // Count of contacts, excluding action items.\n let contactsCount = 0;\n if (this.props.showSelfTopic) {\n const selected = showCheckmark ?\n this.props.topicSelected.some(Tinode.isSelfTopicName) :\n Tinode.isSelfTopicName(this.props.topicSelected);\n contactNodes.push(\n \n );\n contactsCount ++;\n }\n if (this.props.contacts && this.props.contacts.length > 0) {\n // Used keys to prevent duplicates when the user comes both from the 'fnd' and the list of contacts.\n const usedKeys = {};\n this.props.contacts.forEach(c => {\n if (c.action) {\n // Action item\n contactNodes.push(\n );\n } else {\n // Normal contact\n const key = this.props.showMode ? c.user : (c.topic || c.user);\n if (usedKeys[key]) {\n return;\n }\n usedKeys[key] = true;\n // If filter function is provided, filter out the items\n // which don't satisfy the condition.\n if (this.props.filterFunc && this.props.filter) {\n const filterOn = [key];\n if (c.private && c.private.comment) {\n filterOn.push(('' + c.private.comment).toLowerCase());\n }\n const displayName = topicDisplayName(key, c.public, null);\n if (displayName) {\n filterOn.push(('' + displayName).toLowerCase());\n }\n if (!this.props.filterFunc(this.props.filter, filterOn)) {\n return;\n }\n }\n\n const isChannel = Tinode.isChannelTopicName(key);\n const isGroup = !isChannel && Tinode.isGroupTopicName(key);\n const selected = showCheckmark ?\n (this.props.topicSelected.indexOf(key) > -1) :\n (this.props.topicSelected === key);\n const badges = [];\n if (this.props.showMode) {\n if (key == this.props.myUserId) {\n badges.push({name: formatMessage(messages.badge_you), color: 'green'});\n }\n if (c.acs && c.acs.isOwner()) {\n badges.push({name: formatMessage(messages.badge_owner), color: 'blue'});\n }\n }\n\n const comment = Array.isArray(c.private) ?\n c.private.join(',') : (c.private ? c.private.comment : null);\n let preview;\n let forwarded;\n let previewIsResponse;\n let deliveryStatus;\n if (!this.props.showMode && c.latestMessage) {\n const msg = c.latestMessage();\n if (msg) {\n forwarded = msg.head ? msg.head.forwarded : null;\n deliveryStatus = msg._status || c.msgStatus(msg, true);\n previewIsResponse = msg.from != this.props.myUserId;\n if (msg.content) {\n preview = typeof msg.content == 'string' ?\n msg.content.substr(0, MESSAGE_PREVIEW_LENGTH) :\n Drafty.preview(msg.content, MESSAGE_PREVIEW_LENGTH);\n }\n }\n }\n\n contactNodes.push(\n \n );\n contactsCount ++;\n }\n }, this);\n }\n\n return (\n \n {contactsCount == 0 ?\n
\n {this.props.emptyListMessage}\n
\n :\n null\n }\n {contactNodes.length > 0 ?\n
\n :\n null\n }\n
\n );\n }\n};\n\nexport default injectIntl(ContactList);\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactBadges from './contact-badges.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport UnreadBadge from './unread-badge.jsx';\n\nimport { Drafty } from 'tinode-sdk';\n\nimport { previewFormatter } from '../lib/formatters.js';\nimport { deliveryMarker } from '../lib/utils.js';\nimport { truncateString } from '../lib/strformat.js';\n\nconst messages = defineMessages({\n self_topic_name: {\n id: 'self_topic_name',\n defaultMessage: 'Saved messages',\n description: 'Name of self topic for UI'\n },\n self_topic_comment: {\n id: 'self_topic_comment',\n defaultMessage: 'Notes, messages, links, files saved for posterity',\n description: 'Comment for self topic for UI'\n }\n});\n\nclass Contact extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.onSelected) {\n // Index this.props.index is used by GroupManager.\n this.props.onSelected(this.props.item, this.props.index);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({\n topicName: this.props.item,\n topicTitle: this.props.title,\n y: e.pageY,\n x: e.pageX\n });\n }\n\n render() {\n let title = this.props.title;\n const self = Tinode.isSelfTopicName(this.props.item);\n if (!title) {\n if (self) {\n title = this.props.intl.formatMessage(messages.self_topic_name);\n } else {\n title = ;\n }\n } else if (title.length > 30) {\n // Have to support RTL languages too.\n title = truncateString(title, 30);\n }\n const online = this.props.now ? 'online' : 'offline';\n const avatar = this.props.avatar ? this.props.avatar : true;\n const badges = this.props.badges ? this.props.badges.slice() : [];\n const icon_badges = [];\n if (this.props.isVerified) {\n icon_badges.push({icon: 'verified', color: 'verified-color'});\n }\n if (this.props.isStaff) {\n icon_badges.push({icon: 'staff', color: 'staff-color'});\n }\n if (this.props.isDangerous) {\n icon_badges.push({icon: 'dangerous', color: 'danger-color'});\n }\n if (this.props.acs) {\n if (this.props.showMode) {\n badges.push({name: this.props.acs.getMode(), key: 'mode'});\n }\n if (this.props.acs.isMuted()) {\n icon_badges.push({icon: 'muted'});\n }\n if (!this.props.acs.isJoiner()) {\n icon_badges.push({icon: 'banned'});\n }\n }\n\n // The this.props.preview contains alreay shortened Drafty or string.\n let preview;\n if (typeof this.props.preview == 'string') {\n preview = this.props.preview;\n } else if (Drafty.isValid(this.props.preview)) {\n preview = React.createElement(React.Fragment, null, Drafty.format(this.props.preview, previewFormatter,\n {formatMessage: this.props.intl.formatMessage, previewIsResponse: this.props.previewIsResponse}));\n } else if (this.props.preview) {\n preview =\n <>warning_amber \n \n >;\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n const titleClass = 'contact-title' + (this.props.deleted ? ' deleted' : '');\n\n const comment = preview || this.props.comment ||\n (self ? this.props.intl.formatMessage(messages.self_topic_comment) : '\\u00A0');\n const bgColor = this.props.showCheckmark ? null :\n (this.props.selected ? 'selected' : (this.props.pinned ? 'tpinned' : null));\n return (\n \n \n \n {this.props.deleted ? cancel :\n (!self && this.props.showOnline) ? :\n (this.props.showCheckmark && this.props.selected) ?\n check_circle \n : null}\n
\n \n
{title} \n {this.props.isGroup ? group : null}\n {this.props.isChannel ? podcasts : null}\n {!self ? : null}\n {!this.props.deleted ? : null}\n
\n {this.props.showMode ?\n
:\n this.props.small ? null :
{marker}{comment}
}\n
\n {this.props.showContextMenu ?\n \n \n expand_more \n \n : null}\n \n );\n }\n};\n\nexport default injectIntl(Contact);\n","// Context Menu: popup/dropdown menu.\nimport React from 'react';\nimport { injectIntl, defineMessages } from 'react-intl';\nimport { Drafty } from 'tinode-sdk';\n\nimport { REM_SIZE } from '../config.js';\nimport { favoriteMessages, getFavorites, deleteFavorite, recallMessage } from '../lib/im-api.js';\n\n// Session-local record of which (topic, seq) pairs are already favorited, and the favorite_id once\n// resolved. POST /favorites/batch's response only reports counts (created_count/existing_count/\n// failed), never the created id, so \"取消收藏\" (which needs a favorite_id, not a topic/seq) has\n// nothing to delete until a follow-up list lookup resolves it -- cached here so that only has to\n// happen once per message rather than on every menu open. A fresh ContextMenu instance is\n// constructed each time the menu opens (tinode-web.jsx conditionally mounts it), so reading this at\n// construction time is enough to pick the right title/action without any extra plumbing.\nconst favoriteState = new Map();\nfunction favoriteKey(topicName, seq) { return topicName + ':' + seq; }\nfunction findFavorite(topicName, seq) {\n return getFavorites({type: 'all'}).then(data => (data.items || [])\n .find(it => it.source && it.source.topic === topicName && String(it.source.seq) === String(seq)));\n}\n\nconst messages = defineMessages({\n info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n clear_messages: {\n id: 'menu_item_clear_messages',\n defaultMessage: 'Clear messages',\n description: 'Delete all messages'\n },\n clear_for_all: {\n id: 'menu_item_clear_messages_for_all',\n defaultMessage: 'Clear for All',\n description: 'Delete all message(s) for all members'\n },\n delete: {\n id: 'menu_item_delete',\n defaultMessage: 'Delete',\n description: 'Delete selected messages'\n },\n delete_for_all: {\n id: 'menu_item_delete_for_all',\n defaultMessage: 'Delete for All',\n description: 'Delete selected message(s) for all members'\n },\n send_retry: {\n id: 'menu_item_send_retry',\n defaultMessage: 'Retry',\n description: 'Retry sending message'\n },\n mute: {\n id: 'menu_item_mute',\n defaultMessage: 'Mute',\n description: 'Turn off notifications'\n },\n unmute: {\n id: 'menu_item_unmute',\n defaultMessage: 'Unmute',\n description: 'Turn notifications on'\n },\n reply: {\n id: 'menu_item_reply',\n defaultMessage: 'Reply',\n description: 'Reply to message'\n },\n forward: {\n id: 'menu_item_forward',\n defaultMessage: 'Forward',\n description: 'Forward message'\n },\n edit: {\n id: 'menu_item_edit',\n defaultMessage: 'Edit',\n description: 'Edit message'\n },\n topic_delete: {\n id: 'menu_item_delete_topic',\n defaultMessage: 'Delete',\n description: 'Delete entire topic'\n },\n topic_delete_warning: {\n id: 'topic_delete_warning',\n defaultMessage: 'Are you sure you want to delete this conversation? It cannot be undone.',\n description: 'Alert warning when deleting entire topic'\n },\n delete_messages_warning: {\n id: 'delete_messages_warning',\n defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',\n description: 'Alert dialog warning when hard-deleting all messages.'\n },\n unblock: {\n id: 'menu_item_unblock',\n defaultMessage: 'Unblock',\n description: 'Unblock topic or user'\n },\n // Generic string suitable for either topic or user.\n block: {\n id: 'menu_item_block',\n defaultMessage: 'Block',\n description: 'Block topic or user'\n },\n topic_block_warning: {\n id: 'topic_block_warning',\n defaultMessage: 'Are you sure you want to block this conversation?',\n description: 'Alert warning when blocking a topic.'\n },\n member_delete: {\n id: 'menu_item_member_delete',\n defaultMessage: 'Remove',\n description: 'Remove user from topic'\n },\n archive: {\n id: 'menu_item_archive_topic',\n defaultMessage: 'Archive',\n description: 'Move topic from the list of active chats to archive'\n },\n unarchive: {\n id: 'menu_item_restore_topic',\n defaultMessage: 'Restore',\n description: 'Restore topic from archive'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n clear_messages_warning: {\n id: 'clear_messages_warning',\n defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',\n description: 'Alert dialog warning when deleting all messages.'\n },\n pin_message: {\n id: 'pin_message',\n defaultMessage: 'Pin',\n description: 'Menu item [Pin] for pinning message to the top.'\n },\n unpin_message: {\n id: 'unpin_message',\n defaultMessage: 'Unpin',\n description: 'Menu item [Unpin] for un-pinning the message.'\n },\n pin_chat: {\n id: 'pin_chat',\n defaultMessage: 'Pin',\n description: 'Menu item [Pin] for pinning chat to the top.'\n },\n unpin_chat: {\n id: 'unpin_chat',\n defaultMessage: 'Unpin',\n description: 'Menu item [Unpin] for un-pinning the chat.'\n },\n});\n\nclass ContextMenu extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n const {formatMessage} = props.intl;\n\n this.handlePageClick = this.handlePageClick.bind(this);\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClick = this.handleClick.bind(this);\n\n // Preconfigured menu items.\n this.MenuItems = {\n 'topic_info': {\n id: 'topic_info',\n title: formatMessage(messages.info),\n handler: null\n },\n 'messages_clear': {\n id: 'messages_clear',\n title: formatMessage(messages.clear_messages),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n params.topicTitle || formatMessage(messages.clear_messages), // title\n formatMessage(messages.clear_messages_warning), // content\n (_ => { this.deleteMessages(true, false, params, errorHandler); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'messages_clear_hard': {\n id: 'messages_clear_hard',\n title: formatMessage(messages.clear_for_all),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n params.topicTitle || formatMessage(messages.clear_for_all), // title\n formatMessage(messages.delete_messages_warning), // content\n (_ => { return this.deleteMessages(true, true, params, errorHandler); }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'message_delete': {\n id: 'message_delete',\n title: formatMessage(messages.delete),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, false, params, errorHandler);\n }\n },\n 'message_delete_hard': {\n id: 'message_delete_hard',\n title: formatMessage(messages.delete_for_all),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, true, params, errorHandler);\n }\n },\n // Hard-delete but with just 'Delete' title.\n 'message_delete_generic': {\n id: 'message_delete_generic',\n title: formatMessage(messages.delete),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, true, params, errorHandler);\n }\n },\n 'menu_item_send_retry': {\n id: 'menu_item_send_retry',\n title: formatMessage(messages.send_retry),\n handler: (params, errorHandler) => {\n return this.retryMessage(params, errorHandler);\n }\n },\n 'menu_item_reply': {\n id: 'menu_item_reply',\n title: formatMessage(messages.reply),\n handler: (params, errorHandler) => {\n return this.replyToMessage(params, errorHandler);\n }\n },\n 'menu_item_forward': {\n id: 'menu_item_forward',\n title: formatMessage(messages.forward),\n handler: _ => {} /* the action is taken directly in tinode-web */\n },\n 'menu_item_copy': {\n id: 'menu_item_copy',\n title: '复制',\n handler: (params, errorHandler) => {\n return this.copyMessageText(params, errorHandler);\n }\n },\n 'menu_item_favorite': {\n id: 'menu_item_favorite',\n title: favoriteState.has(favoriteKey(props.params && props.params.topicName, props.params && props.params.seq)) ? '取消收藏' : '收藏',\n handler: (params, errorHandler) => {\n return favoriteState.has(favoriteKey(params.topicName, params.seq)) ?\n this.removeFavorite(params, errorHandler) : this.addFavorite(params, errorHandler);\n }\n },\n 'menu_item_recall': {\n id: 'menu_item_recall',\n title: '撤回',\n handler: (params, errorHandler) => {\n return this.recallOwnMessage(params, errorHandler);\n }\n },\n 'menu_item_select': {\n id: 'menu_item_select',\n title: '多选',\n handler: _ => {} /* the action is taken directly in tinode-web, like forward */\n },\n 'menu_item_edit': {\n id: 'menu_item_edit',\n title: formatMessage(messages.edit),\n handler: (params, errorHandler) => {\n return this.editMessage(params, errorHandler);\n }\n },\n 'menu_item_pin': {\n id: 'menu_item_pin',\n title: formatMessage(messages.pin_message),\n handler: (params, errorHandler) => {\n return this.pinMessage(true, params, errorHandler);\n }\n },\n 'menu_item_unpin': {\n id: 'menu_item_unpin',\n title: formatMessage(messages.unpin_message),\n handler: (params, errorHandler) => {\n return this.pinMessage(false, params, errorHandler);\n }\n },\n 'topic_unmute': {\n id: 'topic_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'topic_mute': {\n id: 'topic_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'topic_unblock': {\n id: 'topic_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n 'topic_block': {\n id: 'topic_block',\n title: formatMessage(messages.block),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n params.topicTitle || formatMessage(messages.block), // title\n formatMessage(messages.topic_block_warning), // content\n (_ => this.topicPermissionSetter('-JP', params, errorHandler).then(ctrl => {\n this.props.onTopicRemoved(params.topicName);\n return ctrl;\n })),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_delete': {\n id: 'topic_delete',\n title: formatMessage(messages.topic_delete),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n params.topicTitle || formatMessage(messages.topic_delete), // title\n formatMessage(messages.topic_delete_warning), // content\n (_ => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.delTopic(true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_archive': {\n id: 'topic_archive',\n title: formatMessage(messages.archive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'topic_restore': {\n id: 'topic_restore',\n title: formatMessage(messages.unarchive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(false).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'topic_pin': {\n id: 'topic_pin',\n title: formatMessage(messages.pin_chat),\n handler: (params, errorHandler) => {\n const me = this.props.tinode.getMeTopic();\n if (!me) {\n console.warn(\"'me' topic not found\");\n return;\n }\n return me.pinTopic(params.topicName, true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'topic_unpin': {\n id: 'topic_unpin',\n title: formatMessage(messages.unpin_chat),\n handler: (params, errorHandler) => {\n const me = this.props.tinode.getMeTopic();\n if (!me) {\n console.warn(\"'me' topic not found\");\n return;\n }\n return me.pinTopic(params.topicName, false).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n // menu_item_edit_permissions is defined elsewhere.\n 'permissions': {\n id: 'permissions',\n title: formatMessage(messages.edit_permissions),\n handler: null\n },\n 'member_delete': {\n id: 'member_delete',\n title: formatMessage(messages.member_delete),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic || !params.user) {\n console.warn(\"Topic or user not found: '\" + params.topicName + \"', '\" + params.user + \"'\");\n return;\n }\n return topic.delSubscription(params.user).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'member_mute': {\n id: 'member_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'member_unmute': {\n id: 'member_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'member_block': {\n id: 'member_block',\n title: formatMessage(messages.block),\n handler: this.topicPermissionSetter.bind(this, '-JP')\n },\n 'member_unblock': {\n id: 'member_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n };\n }\n\n componentDidMount() {\n document.addEventListener('mousedown', this.handlePageClick, false);\n document.addEventListener('keyup', this.handleEscapeKey, false);\n }\n\n componentWillUnmount() {\n document.removeEventListener('mousedown', this.handlePageClick, false);\n document.removeEventListener('keyup', this.handleEscapeKey, false);\n }\n\n handlePageClick(e) {\n if (this.selfRef.current.contains(e.target)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n this.props.hide();\n }\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n let item = this.props.items[e.currentTarget.dataset.id];\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n\n if (!item) {\n console.error(\"Invalid menu item ID\", e.currentTarget.dataset.id);\n } else {\n this.props.onAction(\n item.id,\n item.handler(this.props.params, this.props.onError),\n this.props.params);\n }\n }\n\n // Menu Actions\n\n deleteMessages(all, hard, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n\n // We don't know if the message is still pending (e.g. attachment is being uploaded),\n // so try cancelling first. No harm if we can't cancel.\n // The message can be cancelled if transmission to the server has not\n // started yet or if the message send has failed.\n if (!all && topic.cancelSend(params.seq)) {\n return;\n }\n\n const promise = all ?\n topic.delMessagesAll(hard) :\n params.replace > 0 ?\n topic.delMessagesEdits(params.replace, hard) :\n topic.delMessagesList([params.seq], hard);\n\n return promise.catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Copies the message's plain-text content to the clipboard.\n copyMessageText(params, errorHandler) {\n const text = typeof params.content == 'string' ? params.content : Drafty.toPlainText(params.content);\n return navigator.clipboard.writeText(text || '').catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n addFavorite(params, errorHandler) {\n return favoriteMessages([{topic: params.topicName, seq: params.seq}]).then(result => {\n // The request itself resolves 200 even when the specific message couldn't be favorited --\n // real per-item outcomes are only in this body (created_count/existing_count/failed), same\n // \"batch call succeeds at the transport level, item can still fail\" shape already handled for\n // forward/batch-delete elsewhere in this app. Left unchecked, a failed item here (e.g. the\n // backend's message-mirror table hasn't indexed this message yet) shows no error at all --\n // indistinguishable from success -- and silently never appears in 我的收藏.\n const failedItem = result && result.failed && result.failed[0];\n if (failedItem) {\n if (errorHandler) {\n errorHandler(failedItem.reason === 'NOT_FOUND' ? '收藏失败,该消息暂无法收藏,请稍后重试' : '收藏失败', 'err');\n }\n return;\n }\n const key = favoriteKey(params.topicName, params.seq);\n favoriteState.set(key, true);\n // Resolve the real favorite_id in the background so a later \"取消收藏\" has it ready -- see the\n // module-level comment on favoriteState for why this needs a separate lookup at all.\n findFavorite(params.topicName, params.seq).then(match => {\n if (match) favoriteState.set(key, match.favorite_id);\n }).catch(() => {});\n }).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n removeFavorite(params, errorHandler) {\n const key = favoriteKey(params.topicName, params.seq);\n const cached = favoriteState.get(key);\n const finish = favoriteId => deleteFavorite(favoriteId).then(() => favoriteState.delete(key));\n // A real favorite_id may not have resolved yet if this is opened right after addFavorite's own\n // background lookup started -- fall back to looking it up now rather than failing silently.\n const ready = (cached && cached !== true) ? Promise.resolve(cached) : findFavorite(params.topicName, params.seq).then(match => match && match.favorite_id);\n return ready.then(favoriteId => {\n if (!favoriteId) { if (errorHandler) errorHandler('未找到对应收藏', 'err'); return; }\n return finish(favoriteId);\n }).catch(err => {\n if (errorHandler) {\n errorHandler(err.message || '取消收藏失败', 'err');\n }\n });\n }\n\n // Recall (Ch.4): a dedicated backend action distinct from delete -- server-enforced short time\n // window, permission check, and a 'message.recalled' business event for the other party. It does\n // not touch Tinode's own message store, so once the server accepts it we also hard-delete locally\n // (same call the plain 'Delete for All' item uses) to reflect it in this client's live view.\n recallOwnMessage(params, errorHandler) {\n return recallMessage(params.topicName, params.seq).then(_ => {\n return this.deleteMessages(false, true, params, errorHandler);\n }).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Retries sending failed message.\n retryMessage(params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n // Remove the existing message entry.\n if (!topic || !topic.flushMessage(params.seq)) {\n return;\n }\n const msg = topic.createMessage(params.content, false);\n // createMessage only ever fills in head.mime for non-plain-text content -- the original\n // message's x-im-type/reply/mentions/mention_all live in params.head (set by\n // chat-message.jsx's handleContextClick from the props it was rendered with) and would\n // otherwise be silently dropped, unlike the auto-retry path (messages-view.jsx's retrySend)\n // which already forwards the original head. Same merge tinode-web.jsx's\n // sendMessageToTopic does for a fresh send.\n if (params.head) {\n msg.head = Object.assign(msg.head || {}, params.head);\n }\n return topic.publishDraft(msg).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Pin or unpin the message.\n pinMessage(pin, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n return;\n }\n topic.pinMessage(params.seq, pin)\n .catch(err => errorHandler ? errorHandler(err.message, 'err') : null);\n }\n\n // Function is used by context menu to set permissions.\n topicPermissionSetter(mode, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found\", params.topicName);\n return;\n }\n\n let result = topic.updateMode(params.user, mode);\n if (errorHandler) {\n result = result.catch(err => errorHandler(err.message, 'err'));\n }\n return result;\n }\n\n replyToMessage(params, errorHandler) {\n params.pickReply(params.seq, params.content, params.userFrom, params.userName, errorHandler);\n }\n\n editMessage(params, errorHandler) {\n params.editMessage(params.replace || params.seq, params.content, errorHandler);\n }\n\n render() {\n const menu = [];\n let count = 0;\n this.props.items.forEach(item => {\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n if (item && item.title) {\n const className = item.disabled ? 'disabled' : undefined;\n menu.push(\n item.title == '-' ?\n \n :\n {item.title} \n );\n }\n count++;\n });\n\n // Ensure that menu is inside the app-container.\n const hSize = 12 * REM_SIZE;\n const vSize = REM_SIZE * (0.7 + menu.length * 2.5);\n const left = (this.props.bounds.right - this.props.clickAt.x < hSize) ?\n (this.props.clickAt.x - this.props.bounds.left - hSize) :\n (this.props.clickAt.x - this.props.bounds.left);\n const top = (this.props.bounds.bottom - this.props.clickAt.y < vSize) ?\n (this.props.clickAt.y - this.props.bounds.top - vSize) :\n (this.props.clickAt.y - this.props.bounds.top);\n\n const position = {\n left: left + 'px',\n top: top + 'px'\n };\n\n return (\n \n );\n }\n}\n\nexport default injectIntl(ContextMenu);\n","// Image zoom and crop widget.\n\nimport React from 'react';\n\nconst DEFAULT_MAX_ZOOM = 8;\n\nexport default class Cropper extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n // Coordinates of the top left corner of the image in bounding box (container) coordinates.\n panX: 0,\n panY: 0,\n // Origin of the zoom in image coordinates.\n originX: 0,\n originY: 0,\n // Zoom scale.\n zoom: 1,\n // Zoom min and max.\n minZoom: 0.001,\n maxZoom: DEFAULT_MAX_ZOOM,\n };\n\n // References to DOM elements for hooking up events and getting screen dimensions.\n // The transparent element which captures mouse moves (moves with the image).\n this.overlay = React.createRef();\n // The image cutout window or view port (static).\n this.cutout = React.createRef();\n // Scaled and translated image preview.\n this.preview = React.createRef();\n // The main container (static).\n this.boundingBox = React.createRef();\n\n // The original image width and height before any scaling (does not change).\n this.imageWidth = 0;\n this.imageHeight = 0;\n\n // Mouse position when dragging.\n this.mouseX = 0\n this.mouseY = 0;\n // Length of the previous mouse move when dragging.\n this.prevDistance = 0;\n\n // Bounding rectangles of static elements (does not change).\n this.cutoutRect = {};\n this.bBoxRect = {};\n // Center of the bounding box (does not change).\n this.originX = 0;\n this.originY = 0;\n\n this.initScaling = this.initScaling.bind(this);\n this.onZoom = this.onZoom.bind(this);\n this.handleZoom = this.handleZoom.bind(this);\n this.mouseDown = this.mouseDown.bind(this);\n this.mouseUp = this.mouseUp.bind(this);\n this.mouseMove = this.mouseMove.bind(this);\n this.mouseTouch = this.mouseTouch.bind(this);\n this.positionAll = this.positionAll.bind(this);\n this.translate = this.translate.bind(this);\n }\n\n componentDidMount() {\n this.overlay.current.addEventListener('mousedown', this.mouseDown, { passive: true });\n this.overlay.current.addEventListener('touchstart', this.mouseDown, { passive: true });\n\n // The rectangle position is in viewport coordinates.\n this.bBoxRect = this.boundingBox.current.getBoundingClientRect();\n // Center of the bounding box in container coordinates.\n this.originX = this.bBoxRect.width / 2;\n this.originY = this.bBoxRect.height / 2;\n\n // The cutout circle bounds in viewport coordinates.\n this.cutoutRect = this.cutout.current.getBoundingClientRect();\n }\n\n componentWillUnmount() {\n if (this.overlay.current) {\n this.overlay.current.removeEventListener('mousedown', this.mouseDown);\n this.overlay.current.removeEventListener('touchstart', this.mouseDown);\n }\n }\n\n // Position all elements.\n positionAll(panX, panY, zoom) {\n // Zoom origin in image preview coordinates.\n this.setState({\n panX: panX,\n panY: panY,\n zoom: zoom,\n originX: this.originX - panX,\n originY: this.originY - panY,\n });\n\n // Pass cut out coordinates to caller.\n const left = (this.originX - panX) * zoom - this.originX;\n const top = (this.originY - panY) * zoom - this.originY;\n this.props.onChange(\n (left + this.cutoutRect.left - this.bBoxRect.left) / zoom,\n (top + this.cutoutRect.top - this.bBoxRect.top) / zoom,\n this.cutoutRect.width / zoom,\n this.cutoutRect.height / zoom,\n zoom);\n }\n\n // Check if new location is within the limits.\n static checkBound(currPan, img, cutout, delta) {\n let nextDiff = Math.min(0, cutout[0] - img[0] - delta, img[1] - cutout[1] + delta);\n if (nextDiff == 0) {\n // Cutout is completely within the image.\n currPan += delta;\n } else if (Math.min(0, cutout[0] - img[0], img[1] - cutout[1]) < nextDiff) {\n // Cutout is outside of the range but closer to the bound.\n currPan += delta;\n }\n return currPan;\n }\n\n initScaling() {\n // Initialize components.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n this.imageWidth = imgRect.width;\n this.imageHeight = imgRect.height;\n\n // Set zoom slider's min and max values. Make sure the scaled image cannot be smaller than the cutout.\n const minZoom = Math.max(this.cutoutRect.width / imgRect.width, this.cutoutRect.height / imgRect.height);\n this.setState({\n minZoom: minZoom,\n maxZoom: minZoom * DEFAULT_MAX_ZOOM\n });\n\n // Initial zoom level fills the bounding box at the smallest image dimension and overflows the largest, i.e. \"fill\" not \"fit\".\n const zoom = Math.max(this.bBoxRect.width / imgRect.width, this.bBoxRect.height / imgRect.height);\n // Converting from viewport coordinates to container, then panning.\n const panX = this.cutoutRect.left - this.bBoxRect.left -\n (imgRect.width - this.cutoutRect.width) / 2;\n const panY = this.cutoutRect.top - this.bBoxRect.top -\n (imgRect.height - this.cutoutRect.height) / 2;\n\n this.positionAll(panX, panY, zoom);\n }\n\n onZoom(e) {\n this.handleZoom(e.target.value);\n }\n\n handleZoom(zoom) {\n let panX = this.state.panX;\n let panY = this.state.panY;\n\n // Ensure that the image at the new zoom is not outside of the cutout boundaries.\n\n // Calculate image coordinates at the new zoom.\n const imgLeft = this.originX - (this.originX - panX) * zoom;\n const imgRight = imgLeft + this.imageWidth * zoom;\n const imgTop = this.originY - (this.originY - panY) * zoom;\n const imgBottom = imgTop + this.imageHeight * zoom;\n\n // Cutout in the same coordinates as the image.\n const coLeft = this.cutoutRect.left - this.bBoxRect.left;\n const coRight = coLeft + this.cutoutRect.width;\n const coTop = this.cutoutRect.top - this.bBoxRect.top;\n const coBottom = coTop + this.cutoutRect.height;\n\n if (coLeft < imgLeft) {\n panX -= (imgLeft - coLeft) / zoom;\n } else if (coRight > imgRight) {\n panX += (coRight - imgRight) / zoom;\n }\n\n if (coTop < imgTop) {\n panY -= (imgTop - coTop) / zoom;\n } else if (coBottom > imgBottom) {\n panY += (coBottom - imgBottom) /zoom;\n }\n\n this.positionAll(panX, panY, zoom);\n }\n\n mouseDown(e) {\n if (e.touches) {\n this.mouseX = e.touches[0].pageX;\n this.mouseY = e.touches[0].pageY;\n } else {\n this.mouseX = e.pageX;\n this.mouseY = e.pageY;\n }\n\n window.addEventListener('mousemove', this.mouseMove, { passive: false });\n window.addEventListener('touchmove', this.mouseTouch, { passive: false });\n window.addEventListener('mouseup', this.mouseUp, { passive: true });\n window.addEventListener('touchend', this.mouseUp, { passive: true });\n // Disable text selection in the entire document.\n document.body.style['userSelect'] = 'none';\n }\n\n // Perform image panning.\n translate(pageX, pageY) {\n const dX = (pageX - this.mouseX) / this.state.zoom;\n const dY = (pageY - this.mouseY) / this.state.zoom;\n\n this.mouseX = pageX;\n this.mouseY = pageY;\n\n // Make sure the image is within the cutout window.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n // Check if the new position is within the boundaries, and if not if it's closer to them.\n const panX = Cropper.checkBound(this.state.panX, [imgRect.left, imgRect.right],\n [this.cutoutRect.left, this.cutoutRect.right], dX);\n const panY = Cropper.checkBound(this.state.panY, [imgRect.top, imgRect.bottom],\n [this.cutoutRect.top, this.cutoutRect.bottom], dY);\n\n this.positionAll(panX, panY, this.state.zoom);\n }\n\n // Image panning.\n mouseMove(e) {\n e.preventDefault();\n this.translate(e.pageX, e.pageY);\n }\n\n mouseTouch(e) {\n e.preventDefault();\n\n if (e.touches.length == 1) {\n this.translate(e.touches[0].pageX, e.touches[0].pageY);\n return;\n }\n\n // Image zooming by pinching.\n const [touch0, touch1] = e.touches;\n const distance = Math.sqrt((touch0.pageX - touch1.pageX) * (touch0.pageX - touch1.pageX) +\n (touch0.pageY - touch1.pageY) * (touch0.pageY - touch1.pageY));\n\n if (!this.prevDistance) {\n this.prevDistance = distance / this.state.zoom;\n }\n\n let scale = (distance / this.prevDistance);\n this.handleZoom(Math.max(this.minZoom, Math.min(this.maxZoom, scale)));\n }\n\n mouseUp(e) {\n window.removeEventListener('mousemove', this.mouseMove);\n window.removeEventListener('touchmove', this.mouseTouch);\n window.removeEventListener('mouseup', this.mouseUp);\n window.removeEventListener('touchend', this.mouseUp);\n // Re-enable text selection.\n document.body.style['userSelect'] = '';\n\n this.positionAll(this.state.panX, this.state.panY, this.state.zoom);\n }\n\n render() {\n // transform3d: position and scale.\n const t3d = `translate3d(${this.state.panX}px, ${this.state.panY}px, 0) scale(${this.state.zoom})`;\n // transformOrigin: zoom origin.\n const orig = `${this.state.originX}px ${this.state.originY}px`;\n\n // Overlay position and size are exactly equal to the position and size of the transformed image\n // except it uses different coordinates.\n const overlay = {\n top: `${this.originY - this.state.originY * this.state.zoom}px`,\n left: `${this.originX - this.state.originX * this.state.zoom}px`,\n width: `${this.imageWidth * this.state.zoom}px`,\n height: `${this.imageHeight * this.state.zoom}px`\n };\n return (\n \n
\n
\n
\n
\n
\n
\n \n
\n
\n );\n }\n}\n","import React from 'react';\n\nimport MenuCancel from './menu-cancel.jsx';\n\nexport default class ErrorPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n show: false,\n };\n\n this.hide = this.hide.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.level !== this.props.level) {\n this.setState({\n show: !(!this.props.level)\n });\n }\n }\n\n hide() {\n this.setState({show: false});\n if (this.props.onClearError) {\n this.props.onClearError();\n }\n }\n\n render() {\n const icons = {err: 'error', warn: 'warning', info: 'info'}\n const level = icons[this.props.level] || '';\n const className = 'info-box ' + level;\n return (\n \n );\n }\n};\n","// File uload/download progress indicator with a cancel inside.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class FileProgress extends React.PureComponent {\n render() {\n return (\n \n );\n }\n}\n","// Forward Menu: message forwarding popup/dropdown menu.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from './contact-list.jsx';\nimport SearchContacts from './search-contacts.jsx';\n\nexport default class ForwardDialog extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n query: null\n };\n\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClose = this.handleClose.bind(this);\n\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleContactSelected = this.handleContactSelected.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n // Not forwarding the message.\n this.props.hide(false);\n }\n }\n\n handleClose(e) {\n e.preventDefault();\n this.props.hide(false);\n }\n\n handleSearchContacts(query) {\n this.setState({ query: Tinode.isNullValue(query) ? null : query });\n this.props.onSearchContacts(query);\n }\n\n handleContactSelected(uid) {\n this.props.onTopicSelected(uid);\n this.props.hide(true);\n }\n\n render() {\n let contacts = this.state.query != null ? this.props.searchResults : this.props.contacts;\n // Filter out contacts without a 'W' or 'J' permissions as well as the current topic.\n contacts = contacts.filter((c) => {\n return (c.name != this.props.topicSelected) && c.acs.isJoiner() && c.acs.isWriter();\n });\n\n return (\n \n
\n
\n
{\n (search_placeholder) => \n } \n
{\n (not_found_placeholder) => \n } \n
\n
\n );\n }\n}\n","import React from 'react';\n\nimport { KNOWN_HOSTS } from '../config.js';\n\n/* Combobox for selecting host name */\n\nexport default class HostSelector extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n hostName: props.serverAddress,\n changed: false\n };\n\n this.handleHostNameChange = this.handleHostNameChange.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n handleHostNameChange(e) {\n this.setState({hostName: e.target.value, changed: true});\n }\n\n handleEditingFinished() {\n if (this.state.changed) {\n this.setState({changed: false});\n this.props.onServerAddressChange(this.state.hostName.trim());\n }\n }\n\n handleKeyDown(e) {\n if (e.key == 'Enter') {\n this.handleEditingFinished();\n }\n }\n\n render() {\n const hostOptions = [];\n for (let key in KNOWN_HOSTS) {\n let item = KNOWN_HOSTS[key];\n hostOptions.push(\n \n );\n }\n return (\n \n \n \n {hostOptions}\n \n
\n );\n }\n}\n","// In-place text editor. Shows text with an icon which toggles it into an input field.\nimport React from 'react';\n\nimport VisiblePassword from './visible-password.jsx';\n\nexport default class InPlaceEdit extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n this.state = {\n active: props.active,\n initialValue: props.value || '',\n value: props.value || '',\n valid: true\n };\n\n this.handeTextChange = this.handeTextChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleStartEditing = this.handleStartEditing.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n this.handlePasswordFinished = this.handlePasswordFinished.bind(this);\n }\n\n componentDidUpdate(prevProps, prevState) {\n // If text has changed while in read mode, update text and discard changes.\n // Ignore update if in edit mode.\n const newValue = this.props.value || '';\n if (prevState.initialValue != newValue && !prevState.active) {\n this.setState({\n initialValue: newValue,\n value: newValue\n });\n }\n }\n\n handeTextChange(e) {\n this.setState({value: e.target.value || ''});\n if (this.props.validator) {\n Promise.resolve(this.props.validator(e.target.value))\n .then(valid => {\n this.setState({valid: valid});\n })\n .catch(err => {\n // If it's interrupted, then the err is undefined. Ignore it.\n if (err) {\n this.setState({valid: false});\n }\n });\n }\n }\n\n handleKeyDown(e) {\n if (e.keyCode === 27) {\n // Escape pressed\n this.setState({value: this.props.value, active: false});\n } else if (e.keyCode === 13) {\n // Enter pressed\n this.handleEditingFinished(e);\n }\n }\n\n handleStartEditing() {\n if (!this.props.readOnly) {\n this.setState({active: true}, _ => {\n if (this.selfRef.current) {\n this.selfRef.current.focus();\n }\n });\n }\n }\n\n handleEditingFinished(event) {\n const value = this.state.value.trim();\n if (this.props.required && (!event.target.checkValidity() || !value)) {\n // Empty input\n this.setState({value: this.props.value, active: false});\n return;\n }\n this.setState({active: false});\n if ((value || this.props.value) && (value !== this.props.value) && this.state.valid) {\n this.props.onFinished(value);\n }\n }\n\n handlePasswordFinished(value) {\n this.setState({active: false});\n if (value && (value !== this.props.value)) {\n this.props.onFinished(value);\n }\n }\n\n render() {\n if (!this.state.active) {\n let spanText = this.props.type == 'password' ? '••••••••' : this.state.value;\n let spanClass = 'in-place-edit' + (this.props.readOnly ? ' disabled' : '');\n if (!spanText) {\n spanText = this.props.placeholder;\n spanClass += ' placeholder';\n }\n if (!this.props.multiline || this.props.multiline == 1) {\n spanClass += ' short';\n }\n\n return (\n {this.props.iconLeft && {this.props.iconLeft} }\n {spanText} \n {this.props.iconRight && {this.props.iconRight} }\n );\n }\n\n let element;\n const attr = {};\n if (this.props.type == 'password') {\n element = VisiblePassword;\n attr.onFinished = this.handlePasswordFinished;\n } else {\n if (this.props.multiline > 1) {\n element = 'textarea';\n attr.rows = this.props.multiline;\n attr.className = 'in-place-edit';\n } else {\n element = 'input';\n attr.type = this.props.type || 'text';\n attr.className = 'in-place-edit' + (this.props.iconLeft ? ' with-icon-left'\n : this.props.iconRight ? ' with-icon-right' : '');\n if (this.props.maxLength) {\n attr.maxLength=this.props.maxLength;\n }\n }\n attr.value = this.state.value;\n attr.className += this.state.valid ? '' : ' invalid';\n attr.ref = this.selfRef;\n attr.onChange = this.handeTextChange;\n attr.onKeyDown = this.handleKeyDown;\n attr.onBlur = this.handleEditingFinished;\n }\n attr.placeholder = this.props.placeholder;\n attr.required = this.props.required ? 'required' : '';\n attr.autoComplete = this.props.autoComplete;\n attr.autoFocus = true;\n if (this.props.spellCheck !== undefined) {\n attr.spellCheck = this.props.spellCheck ? 'true' : 'false';\n }\n\n if (this.props.iconLeft || this.props.iconRight) {\n return (\n <>\n {this.props.iconLeft && {this.props.iconLeft} }\n {React.createElement(element, attr, null)}\n {this.props.iconRight && {this.props.iconRight} }\n >\n );\n }\n return React.createElement(element, attr, null);\n }\n};\n","// Element which shows static video preview:\n// an image with duration and a play button in the middle.\n\nimport React from 'react';\n\nimport { secondsToTime } from '../lib/strformat.js'\n\nexport default class InlineVideo extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.videoRef = React.createRef();\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(e) {\n if (this.props.onClick) {\n // the click target has to be the image element.\n this.props.onClick(e);\n }\n }\n\n render() {\n const duration = secondsToTime(this.props['data-duration'] / 1000);\n const className = 'inline-video' + (this.props.onClick ? ' image-clickable' : '');\n return (\n \n {React.createElement('img', this.props)}\n
\n {this.props.onClick ?\n
play_arrow \n :\n
}\n
\n {duration ?
{duration}
: null}\n
\n );\n }\n};\n","// Image with a placeholder which is replaced when the promise is resolved.\nimport React from 'react';\n\nexport default class LazyImage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n src: this.props.isvideo ? 'img/blankvid.png' : 'img/blankimg.png',\n style: Object.assign({padding: '4px'}, this.props.style),\n className: this.props.className,\n alt: this.props.alt,\n onClick: this.props.onClick,\n };\n }\n\n componentDidMount() {\n // whenDone is a wrapper around an actual promise to be able to cancel it.\n this.props.whenDone\n .promise\n .then(data => this.setState({src: data.src, style: {...this.state.style, padding: 0}}))\n .catch(_ => this.setState({src: this.props.isvideo ? 'img/broken_video.png' : 'img/broken_image.png'}));\n }\n\n componentWillUnmount() {\n this.props.whenDone.cancel();\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.whenDone != this.props.whenDone) {\n this.setState({src: this.props.isvideo ? 'img/blankvid.png' : 'img/blankimg.png', style: {...this.state.style, padding: '4px'}});\n this.props.whenDone\n .promise\n .then(data => this.setState({src: data.src, style: {...this.state.style, padding: 0}}))\n .catch(_ => this.setState({src: this.props.isvideo ? 'img/broken_video.png' : 'img/broken_image.png'}));\n }\n }\n\n render() {\n return React.createElement('img', this.state);\n }\n};\n","import React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { idToColorClass } from '../lib/strformat.js';\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nimport { SELF_AVATAR_URI } from '../config.js';\n\nexport default class LetterTile extends React.PureComponent {\n render() {\n let avatar;\n if (this.props.avatar === true) {\n if (Tinode.isSelfTopicName(this.props.topic)) {\n avatar = \n } else {\n const isGroup = Tinode.isGroupTopicName(this.props.topic);\n const iconColor = idToColorClass(this.props.topic, isGroup);\n\n if (this.props.topic && this.props.title && this.props.title.trim()) {\n const letter = this.props.title.trim().charAt(0);\n const className = 'lettertile ' + iconColor + (this.props.deleted ? ' disabled' : '');\n avatar = ()\n } else {\n const className = 'material-icons ' + iconColor + (this.props.deleted ? ' disabled' : '');\n avatar = isGroup ? group : person ;\n }\n }\n } else if (this.props.avatar) {\n const url = this.props.authorizeURL(sanitizeUrlForMime(this.props.avatar, 'image'));\n // If avatar image is invalid, show a placeholder.\n const className = 'avatar' + (this.props.deleted ? ' deleted' : '');\n avatar = {e.target.onerror = null; e.target.src=\"img/broken_image.png\"}} />;\n } else {\n avatar = null;\n }\n return avatar;\n }\n}\n","import React from 'react';\n\nexport default class LoadSpinner extends React.PureComponent {\n render() {\n const className = 'load-spinner-box' + (this.props.large ? ' large' : '')\n + (this.props.clear ? ' clear' : '') + (this.props.centered ? ' centered' : '');\n return (this.props.show ?\n : null);\n }\n}\n","// The X menu to be displayed in title bars.\nimport React from 'react';\n\nexport default class MenuCancel extends React.PureComponent {\n render() {\n return (\n {e.preventDefault(); this.props.onCancel();}}>\n close \n \n );\n }\n}\n","import React from 'react';\n\nexport default class MenuContacts extends React.PureComponent {\n render() {\n return (\n \n );\n }\n};\n","import React from 'react';\n\nexport default class MenuStart extends React.PureComponent {\n render() {\n return (\n \n );\n }\n};\n","import QRCode from 'qrcodejs';\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { QRCODE_SIZE } from '../config';\n\nconst messages = defineMessages({\n invalid_id: {\n id: 'error_invalid_id',\n defaultMessage: 'Invalid ID',\n description: 'Error message'\n }\n});\n\nclass NewTopicById extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.qrCodeRef = React.createRef();\n\n this.state = {\n groupId: '',\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n componentDidMount() {\n new QRCode(this.qrCodeRef.current, {\n text: this.props.myURI,\n width: QRCODE_SIZE,\n height: QRCODE_SIZE,\n });\n }\n\n handleChange(e) {\n this.setState({groupId: e.target.value});\n }\n\n handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n }\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.groupId) {\n const name = this.state.groupId.trim();\n const prefix = name.substring(0, 3);\n if (name.length > 3 && ['usr', 'grp', 'chn'].includes(prefix)) {\n this.props.onSubmit(name);\n } else {\n this.props.onError(this.props.intl.formatMessage(messages.invalid_id), 'err');\n }\n }\n }\n\n render() {\n return (\n \n
\n {\n (prompt) => \n } \n
\n
\n \n \n \n
\n
\n
\n
\n );\n }\n};\n\nexport default injectIntl(NewTopicById);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarCrop from './avatar-crop.jsx';\nimport AvatarUpload from './avatar-upload.jsx';\nimport CheckBox from './checkbox.jsx';\nimport TagManager from './tag-manager.jsx';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE, MAX_TITLE_LENGTH,\n MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\nimport { createChatUploader } from '../lib/im-api.js';\nimport { truncateString } from '../lib/strformat.js';\n\nexport default class NewTopicGroup extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.fullName = React.createRef();\n\n this.state = {\n fullName: '', // full/formatted name\n private: '',\n description: '',\n imageUrl: null,\n tags: [],\n isChannel: false,\n newAvatar: null,\n newAvatarMime: null\n };\n\n this.handleFieldEdit = this.handleFieldEdit.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handleTagsChanged = this.handleTagsChanged.bind(this);\n this.handleChannelToggle = this.handleChannelToggle.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n componentDidMount() {\n // this.fullName.current.focus();\n }\n\n handleFieldEdit(name, e) {\n this.setState({[name]: e.target.value || ''});\n }\n\n handleImageChanged(mime, img) {\n this.setState({newAvatar: img, newAvatarMime: mime});\n }\n\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({imageUrl: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n // Same wrong-header bug messages-view.jsx's chat uploads had -- createChatUploader() is the\n // fixed-headers drop-in (see im-api.js for the full explanation).\n const uploader = createChatUploader(this.props.tinode);\n uploader.upload(blob)\n .then(url => this.setState({imageUrl: url}))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => this.setState({imageUrl: makeImageUrl({data: b64.bits, type: mime})}));\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n handleTagsChanged(tags) {\n this.setState({tags: tags});\n }\n\n handleChannelToggle() {\n this.setState({isChannel: !this.state.isChannel});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n\n const fn = truncateString(this.state.fullName.trim(), MAX_TITLE_LENGTH);\n const comment = truncateString(this.state.private.trim(), MAX_TITLE_LENGTH);\n const description = truncateString(this.state.description.trim(), MAX_TOPIC_DESCRIPTION_LENGTH);\n if (fn) {\n this.props.onSubmit(fn, description, this.state.imageUrl, comment, this.state.tags, this.state.isChannel);\n }\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n return (\n \n \n \n \n \n
\n {\n (title) => \n } \n \n \n \n \n
\n \n );\n }\n};\n","// QR scanning (\"扫一扫\", entry points in message-center-view.jsx's quick menu and\n// contact-management-view.jsx's AddFriend page). Both entries used to just toast \"not implemented\n// yet\" -- this is the real camera capture + decode implementation, wired to `resolveQRCode` /\n// `createGroupJoinRequest` (im-api.js), which already existed but had zero call sites.\n//\n// No reference screenshot covers the scanning viewfinder itself -- docs/images/ only has the\n// generate-a-code screens (二维码.png, 群二维码页面.png). The full-screen dark camera view with a\n// bordered square cutout below follows this app's existing full-screen-overlay language (see\n// call-panel.jsx/call-incoming.jsx) rather than a specific design, since there is nothing to match.\nimport React from 'react';\n\nimport jsQR from 'jsqr';\n\nimport { getFileUrl } from '../lib/im-api.js';\n\nfunction Icon({children}) { return {children} ; }\n\n// Decoding a full-resolution camera frame (often 1080p+) with jsQR on every tick is unnecessarily\n// expensive -- a QR code large enough to matter in frame still decodes fine downscaled, and it\n// keeps the scan loop smooth on lower-end phones. 'dontInvert' skips jsQR's extra dark/light\n// inversion pass, which normal on-screen/printed codes (dark modules on a light quiet zone) never\n// need -- also just a perf win for a loop that runs several times a second.\nconst SCAN_INTERVAL_MS = 200;\nconst MAX_SCAN_EDGE = 480;\nconst JSQR_OPTIONS = {inversionAttempts: 'dontInvert'};\n\nexport default class QrScanner extends React.Component {\n constructor(props) {\n super(props);\n this.state = {status: 'starting', errorText: ''};\n this.videoRef = React.createRef();\n this.canvas = document.createElement('canvas');\n this.stream = null;\n this.timer = null;\n this.detected = false;\n\n this.start = this.start.bind(this);\n this.stopStream = this.stopStream.bind(this);\n this.tick = this.tick.bind(this);\n }\n\n componentDidMount() {\n this.start();\n }\n\n componentWillUnmount() {\n this.stopStream();\n }\n\n start() {\n if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {\n this.setState({status: 'error', errorText: '当前浏览器不支持摄像头访问'});\n return;\n }\n this.detected = false;\n this.setState({status: 'starting', errorText: ''});\n // `facingMode` here is a hint, not `{exact: 'environment'}` -- a desktop/laptop with only a\n // front camera still gets a stream instead of failing with OverconstrainedError.\n navigator.mediaDevices.getUserMedia({video: {facingMode: 'environment'}, audio: false}).then(stream => {\n this.stream = stream;\n const video = this.videoRef.current;\n if (!video) {\n // Unmounted while the permission prompt was pending.\n stream.getTracks().forEach(track => track.stop());\n return;\n }\n video.srcObject = stream;\n video.play().catch(() => {});\n this.setState({status: 'scanning'});\n this.timer = window.setInterval(this.tick, SCAN_INTERVAL_MS);\n }).catch(err => {\n const name = err && err.name;\n const text = name === 'NotAllowedError' ? '未获得摄像头权限,请在浏览器设置中允许访问摄像头' :\n name === 'NotFoundError' ? '未检测到可用摄像头' :\n name === 'NotReadableError' ? '摄像头正被其他程序占用' : '摄像头启动失败,请重试';\n this.setState({status: 'error', errorText: text});\n });\n }\n\n stopStream() {\n if (this.timer) {\n window.clearInterval(this.timer);\n this.timer = null;\n }\n if (this.stream) {\n this.stream.getTracks().forEach(track => track.stop());\n this.stream = null;\n }\n }\n\n tick() {\n if (this.detected) {\n return;\n }\n const video = this.videoRef.current;\n if (!video || video.readyState !== video.HAVE_ENOUGH_DATA) {\n return;\n }\n const vw = video.videoWidth;\n const vh = video.videoHeight;\n if (!vw || !vh) {\n return;\n }\n const scale = Math.min(1, MAX_SCAN_EDGE / Math.max(vw, vh));\n const w = Math.round(vw * scale);\n const h = Math.round(vh * scale);\n this.canvas.width = w;\n this.canvas.height = h;\n const ctx = this.canvas.getContext('2d', {willReadFrequently: true});\n ctx.drawImage(video, 0, 0, w, h);\n let frame;\n try {\n frame = ctx.getImageData(0, 0, w, h);\n } catch (err) {\n // A transient decode error (e.g. a tainted canvas mid-permission-change) -- try again on the\n // next tick rather than surfacing an error the user can't act on.\n return;\n }\n const code = jsQR(frame.data, w, h, JSQR_OPTIONS);\n if (code && code.data) {\n this.detected = true;\n this.setState({status: 'resolving'});\n this.stopStream();\n this.props.onDetect(code.data);\n }\n }\n\n render() {\n const {status, errorText} = this.state;\n return \n
\n
\n
\n arrow_back_ios_new \n 扫一扫 \n \n {status === 'starting' ?
正在启动摄像头…
: null}\n {status === 'scanning' ?
将二维码放入框内,即可自动扫描
: null}\n {status === 'resolving' ?
识别中…
: null}\n {status === 'error' ?
\n
error_outline {errorText}
\n
重试 \n
: null}\n
;\n }\n}\n\n// Shown after a \"join_group\" QR resolves to a group the scanner isn't a member of yet\n// (resolveQRCode's `status: \"can_request\"` -- see server/im_http.go's serveIMQRCodesResolve).\n// Joining always goes through the same pending-request/admin-approval pipeline as Ch.6's\n// JoinRequests, regardless of the group's `join_approval` governance toggle (CreateJoinRequest\n// never auto-accepts) -- so this never claims immediate membership, only that a request was sent.\nexport function GroupJoinPreview({group, onSubmit, onCancel}) {\n const [message, setMessage] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n const [avatarUrl, setAvatarUrl] = React.useState(null);\n\n React.useEffect(() => {\n if (!group.avatar_file_id) {\n return undefined;\n }\n let live = true;\n getFileUrl(group.avatar_file_id).then(url => { if (live) setAvatarUrl(url); }).catch(() => {});\n return () => { live = false; };\n }, [group.avatar_file_id]);\n\n const submit = () => {\n setBusy(true);\n Promise.resolve(onSubmit(message.trim())).finally(() => setBusy(false));\n };\n\n return ;\n}\n","import React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nexport default class SearchContacts extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n edited: false,\n search: this.props.initialQuery || ''\n };\n\n this.handleSearchChange = this.handleSearchChange.bind(this);\n this.handleSearch = this.handleSearch.bind(this);\n this.handleClear = this.handleClear.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentWillUnmount() {\n if (this.state.edited) {\n this.setState({search: '', edited: false});\n this.props.onSearchContacts(Tinode.DEL_CHAR);\n }\n }\n\n handleSearchChange(e) {\n this.setState({search: e.target.value});\n }\n\n handleSearch(e) {\n e.preventDefault();\n const query = this.state.search.trim();\n this.setState({edited: (query.length > 0)});\n this.props.onSearchContacts(query.length > 0 ? query : Tinode.DEL_CHAR);\n }\n\n handleClear(e) {\n e.preventDefault();\n if (this.state.edited) {\n this.props.onSearchContacts(Tinode.DEL_CHAR);\n }\n this.setState({search: '', edited: false});\n }\n\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleSearch(e);\n } else if (e.key === 'Escape') {\n e.stopPropagation();\n this.handleClear(e);\n }\n }\n\n render() {\n return (\n \n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\nimport ButtonBack from './button-back.jsx';\nimport ContactBadges from './contact-badges.jsx';\nimport MenuContacts from './menu-contacts.jsx';\nimport MenuStart from './menu-start.jsx';\n\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nexport default class SideNavbar extends React.PureComponent {\n render() {\n const icon_badges = [];\n if (this.props.trustedBadges) {\n this.props.trustedBadges.forEach(b => {\n icon_badges.push({icon: b, color: 'badge-inv'});\n });\n }\n let avatar = null;\n if (this.props.tinode) {\n avatar = this.props.tinode.authorizeURL(sanitizeUrlForMime(this.props.avatar, 'image'));\n }\n return (\n \n {this.props.onCancel ?
: null}\n {avatar ?\n
\n \n
\n :\n null}\n
{this.props.title}
\n {this.props.state === 'login' ?\n
:\n this.props.state === 'contacts' ?\n
:\n null}\n
\n );\n }\n};\n","// TagManager: edit topic or user tags.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { MAX_TAG_COUNT, MAX_TAG_LENGTH, MIN_TAG_LENGTH } from '../config.js';\nimport { arrayEqual } from '../lib/utils.js';\n\nexport default class TagManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tags: this.props.tags || [],\n alias: Tinode.tagByPrefix(this.props.tags, Tinode.TAG_ALIAS) || '',\n tagInput: '',\n activated: this.props.activated\n };\n\n this.handleTagInput = this.handleTagInput.bind(this);\n this.handleAddTag = this.handleAddTag.bind(this);\n this.handleRemoveTag = this.handleRemoveTag.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n const tags = nextProps.tags || [];\n if (!arrayEqual(tags, prevState.tags) && !prevState.activated) {\n return {\n tags: tags || [],\n alias: Tinode.tagByPrefix(tags, Tinode.TAG_ALIAS) || '',\n };\n }\n return null;\n }\n\n handleTagInput(text) {\n this.setState({tagInput: text});\n if (text.length > 0) {\n const last = text[text.length-1];\n if (text[0] == '\"') {\n // This is a quoted string.\n if (text.length > 1 && last == '\"') {\n this.handleAddTag(text.substring(1, text.length-1));\n }\n } else if (last == ',' || last == ' ' || last == ';' || last == '\"') {\n // User entered ',', ' ' or ';'\n this.handleAddTag(text.substring(0, text.length-1).trim());\n }\n }\n }\n\n handleAddTag(tag) {\n const maxTagCount = this.props.tinode.getServerParam(Tinode.MAX_TAG_COUNT, MAX_TAG_COUNT);\n\n if (tag.length > 0 && this.state.tags.length < maxTagCount) {\n const tags = this.state.tags.slice(0);\n tags.push(tag);\n\n this.setState({tags: tags, tagInput: ''});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n return tags;\n }\n return this.state.tags;\n }\n\n handleRemoveTag(tag, index) {\n const tags = this.state.tags.slice(0);\n tags.splice(index, 1);\n this.setState({tags: tags});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n }\n\n handleSubmit() {\n // Add unprocessed input to tags.\n let tags = this.handleAddTag(this.state.tagInput.trim());\n // Add back the alias (and overwrite one possibly added by hand).\n tags = Tinode.setUniqueTag(tags, this.state.alias);\n // Submit the updated list.\n this.props.onSubmit(tags);\n this.setState({activated: false, tags: this.props.tags || []});\n }\n\n handleCancel() {\n this.setState({activated: false, tagInput: '', tags: this.props.tags || []});\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n\n render() {\n const minTagLength = this.props.tinode.getServerParam(Tinode.MIN_TAG_LENGTH, MIN_TAG_LENGTH);\n const maxTagLength = this.props.tinode.getServerParam(Tinode.MAX_TAG_LENGTH, MAX_TAG_LENGTH);\n\n let tags = [];\n if (this.state.activated) {\n this.state.tags.forEach(tag => {\n if (tag != this.state.alias) {\n tags.push({user: tag, invalid: (tag.length < minTagLength || tag.length > maxTagLength)});\n }\n });\n\n } else {\n this.state.tags.forEach(tag => {\n if (tag != this.state.alias) {\n tags.push({tag} );\n }\n });\n if (tags.length == 0) {\n tags = (\n \n \n \n );\n }\n }\n return (\n \n
\n {this.props.title} \n
\n {this.state.activated ?\n
\n
{\n (add_tags_prompt) => \n } \n {this.props.onSubmit || this.props.onCancel ?\n
\n \n \n \n \n \n \n
\n : null}\n
\n :\n
\n }\n
\n );\n }\n};\n","import React from 'react';\nimport { defineMessages, FormattedMessage, injectIntl } from 'react-intl';\nimport { TheCard } from 'tinode-sdk';\n\nimport LetterTile from './letter-tile.jsx';\n\nconst messages = defineMessages({\n unknown_name: {\n id: 'unknown_name',\n defaultMessage: 'Unknown',\n description: 'Name to show when the name is missing'\n }\n});\n\nclass TheCardMini extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleDownload = this.handleDownload.bind(this);\n this.handleMessage = this.handleMessage.bind(this);\n }\n\n handleDownload(e) {\n e.preventDefault();\n try {\n const vcard = TheCard.exportVCard(this.props.content);\n const blob = new Blob([vcard], { type: 'text/vcard' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.style.display = 'none';\n a.href = url;\n a.download = (this.props.content.fn || 'contact') + '.vcf';\n document.body.appendChild(a);\n a.click();\n window.URL.revokeObjectURL(url);\n document.body.removeChild(a);\n } catch (err) {\n console.error(\"Failed to download vcard\", err);\n if (this.props.onError) {\n this.props.onError(\"Failed to download vcard\", 'err');\n }\n }\n }\n\n handleMessage(e) {\n // This is handled by the parent component via props.onAction which expects a click event.\n }\n\n render() {\n const card = this.props.content;\n if (!card) {\n return null;\n }\n\n const uid = TheCard.getFirstTinodeID(card);\n const contacts = TheCard.getEmails(card).concat(TheCard.getPhones(card));\n const org = TheCard.getOrg(card);\n return (\n \n
\n
\n \n
\n
\n
{card.fn || }
\n {org &&
{org}
}\n
\n
\n
\n {uid ?\n <>\n
\n \n \n
\n >\n : contacts.length > 0 ?\n <>\n
\n \n \n
\n >\n : null\n }\n
\n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(TheCardMini);\n","// Widget for editing topic description.\n\nimport React from 'react';\nimport { defineMessages, FormattedMessage, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport AvatarCrop from './avatar-crop.jsx';\nimport AvatarUpload from './avatar-upload.jsx';\nimport InPlaceEdit from './in-place-edit.jsx';\nimport TagManager from './tag-manager.jsx';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE, MAX_TITLE_LENGTH,\n MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\nimport { createChatUploader } from '../lib/im-api.js';\nimport { truncateString } from '../lib/strformat.js';\nimport { arrayEqual, theCard } from '../lib/utils.js';\n\nconst messages = defineMessages({\n alias_invalid: {\n id: 'alias_invalid',\n defaultMessage: '(invalid)',\n description: 'Error message for invalid alias'\n },\n alias_already_taken: {\n id: 'alias_already_taken',\n defaultMessage: '(already taken)',\n description: 'Error message for alias already taken'\n },\n self_topic_name: {\n id: 'self_topic_name',\n defaultMessage: 'Saved messages',\n description: 'Name of self topic for UI'\n },\n self_topic_comment: {\n id: 'self_topic_comment',\n defaultMessage: 'Notes, messages, links, files saved for posterity',\n description: 'Comment for self topic for UI'\n }\n});\n\nconst ALIAS_AVAILABILITY_CHECK_DELAY = 1000; // milliseconds\n\nclass TopicDescEdit extends React.Component {\n constructor(props) {\n super(props);\n\n const topic = this.props.tinode.getTopic(this.props.topic);\n const acs = topic.getAccessMode();\n const isSelf = Tinode.isSelfTopicName(this.props.topic);\n this.state = {\n isMe: Tinode.isMeTopicName(this.props.topic),\n isSelf: isSelf,\n owner: acs && acs.isOwner(),\n fullName: topic.public ? topic.public.fn :\n isSelf ? this.props.intl.formatMessage(messages.self_topic_name) : null,\n private: topic.private ? topic.private.comment : null,\n description: topic.public ? topic.public.note :\n isSelf ? this.props.intl.formatMessage(messages.self_topic_comment) : null,\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n tags: topic.tags() || [],\n newAvatar: null,\n newAvatarMime: null,\n aliasError: ''\n };\n\n this.previousOnTags = null;\n this.aliasCheckTimer = null;\n this.aliasCheckPromise = null;\n\n this.tnNewTags = this.tnNewTags.bind(this);\n this.handleFullNameUpdate = this.handleFullNameUpdate.bind(this);\n this.handleImageUpdated = this.handleImageUpdated.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handlePrivateUpdate = this.handlePrivateUpdate.bind(this);\n this.handleAliasUpdate = this.handleAliasUpdate.bind(this);\n this.handleDescriptionUpdate = this.handleDescriptionUpdate.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n this.validateAlias = this.validateAlias.bind(this);\n this.cancelValidator = this.cancelValidator.bind(this);\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n this.previousOnTags = topic.onTagsUpdated;\n topic.onTagsUpdated = this.tnNewTags;\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onTagsUpdated = this.previousOnTags;\n this.cancelValidator();\n }\n\n tnNewTags(tags) {\n this.setState({tags: tags});\n }\n\n handleFullNameUpdate(fn) {\n fn = truncateString(fn.trim(), MAX_TITLE_LENGTH);\n if (fn && this.state.fullName !== fn) {\n this.setState({fullName: fn});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(fn, null));\n }\n }\n\n handlePrivateUpdate(comment) {\n comment = comment.trim().substring(0, MAX_TITLE_LENGTH);\n if (this.state.private !== comment) {\n this.setState({private: comment});\n this.props.onUpdateTopicDesc(this.props.topic, null, comment || Tinode.DEL_CHAR);\n }\n }\n\n handleDescriptionUpdate(desc) {\n desc = desc.trim().substring(0, MAX_TOPIC_DESCRIPTION_LENGTH);\n if (desc) {\n this.setState({description: desc});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, null, null, desc));\n }\n }\n\n // AvatarUpload widget has changed the avatar: received a new file or deleted the avatar.\n handleImageUpdated(mime, img) {\n // This will show the AvatarCropView is img is not null.\n this.setState({newAvatar: img, newAvatarMime: mime});\n if (!img) {\n // Deleting the avatar.\n this.setState({avatar: null});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, Tinode.DEL_CHAR));\n }\n }\n\n // AvatarCropView calls this method when the user has cropped the image.\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({avatar: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n // Same wrong-header bug messages-view.jsx's chat uploads had -- createChatUploader() is the\n // fixed-headers drop-in (see im-api.js for the full explanation).\n const uploader = createChatUploader(this.props.tinode);\n uploader.upload(blob)\n .then(url => this.props.onUpdateTopicDesc(this.props.topic, theCard(null, url)))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => {\n const du = makeImageUrl({data: b64.bits, type: mime});\n this.setState({source: du});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, du));\n });\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n handleAliasUpdate(alias) {\n alias = (alias || '').trim();\n const tags = alias ?\n Tinode.setUniqueTag(this.state.tags, Tinode.TAG_ALIAS + alias.toLowerCase()) :\n Tinode.clearTagPrefix(this.state.tags, Tinode.TAG_ALIAS);\n this.handleTagsUpdated(tags);\n }\n\n validateAlias(alias) {\n // Reset pending delayed check.\n this.cancelValidator();\n\n alias = alias.trim();\n if (!alias) {\n this.setState({aliasError: ''});\n return true;\n }\n\n const valid = Tinode.isValidTagValue(alias);\n if (!valid) {\n this.setState({aliasError: this.props.intl.formatMessage(messages.alias_invalid)});\n return false;\n }\n this.setState({aliasError: ''});\n\n // Setup a delayed check for alias availability.\n const fnd = this.props.tinode.getFndTopic();\n if (!fnd) {\n // Unable to check alias availability.\n this.setState({aliasError: ''});\n return true;\n }\n this.aliasCheckPromise = {};\n const validationPromise = new Promise((resolve, reject) => {\n this.aliasCheckPromise.resolve = resolve;\n this.aliasCheckPromise.reject = reject;\n });\n this.aliasCheckTimer = setTimeout(_ => {\n this.aliasCheckTimer = null;\n fnd.checkTagUniqueness(`${Tinode.TAG_ALIAS}${alias}`, this.props.topic)\n .then(ok => {\n this.aliasCheckPromise.resolve(ok)\n this.setState({aliasError: ok ? '' : this.props.intl.formatMessage(messages.alias_already_taken)});\n })\n .catch(err => {\n this.aliasCheckPromise.reject(err);\n this.setState({aliasError: err.message});\n });\n }, ALIAS_AVAILABILITY_CHECK_DELAY);\n return validationPromise;\n }\n\n cancelValidator() {\n // Reset pending delayed check.\n if (this.aliasCheckTimer) {\n clearTimeout(this.aliasCheckTimer);\n this.aliasCheckTimer = null;\n this.aliasCheckPromise.reject(null);\n }\n }\n\n handleTagsUpdated(tags) {\n // Check if tags have actually changed.\n if (arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n return;\n }\n this.props.onUpdateTags(tags);\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n const editable = this.state.isMe || (this.state.owner && !this.state.isSelf);\n let alias = this.state.tags && this.state.tags.find(t => t.startsWith('alias:'));\n if (alias) {\n // Remove 'alias:' prefix.\n alias = alias.substring(6);\n }\n\n return (\n <>\n \n
\n \n \n {this.state.isMe ?\n
\n
\n \n \n
\n {\n (full_name_placeholder) => \n } \n
\n
\n :\n <>\n
\n
\n \n
\n
\n {\n (group_name_placeholder) => \n } \n
\n
\n
\n
\n \n \n \n
\n
\n {\n (private_placeholder) => \n } \n
\n
\n >\n }\n {editable || alias ?\n
\n
\n {this.state.aliasError}\n
\n
\n {\n (private_placeholder) => \n } \n
\n
\n : null\n }\n {editable || this.state.description ?\n
\n
\n \n
\n
\n {\n (private_placeholder) => \n } \n
\n
\n : null\n }\n
\n {editable && !this.state.isMe ?\n <>\n
\n {\n (title_tag_manager) => \n } \n >\n : null\n }\n >\n );\n }\n};\n\nexport default injectIntl(TopicDescEdit);\n","// The counter of unread messages in the topic.\nimport React from 'react';\n\nexport default class UnreadBadge extends React.PureComponent {\n render() {\n return (this.props.count > 0 ?\n {this.props.count > 9 ? \"9+\" : this.props.count} \n : null);\n }\n};\n","// Image view with progress bar and a cancel button.\nimport React from 'react';\n\nimport FileProgress from './file-progress.jsx';\n\nexport default class UploadingImage extends React.PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n return (\n \n {React.createElement('img', this.props)}\n
\n \n
\n
\n );\n }\n};\n","// Password with a visiblity toggle.\nimport React from 'react';\n\nexport default class VisiblePassword extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.inputRef = React.createRef();\n\n this.state = {\n value: this.props.value || '',\n visible: false\n };\n\n this.handleVisibility = this.handleVisibility.bind(this);\n this.handeTextChange = this.handeTextChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n }\n\n componentDidMount() {\n if (this.props.autoFocus) {\n this.inputRef.current.focus();\n }\n }\n\n handeTextChange(e) {\n this.setState({value: e.target.value});\n if (this.props.onChange) {\n this.props.onChange(e);\n }\n }\n\n handleVisibility(e) {\n e.preventDefault();\n this.setState({visible: !this.state.visible});\n }\n\n handleKeyDown(e) {\n if (e.keyCode == 27) {\n // Escape pressed\n this.setState({value: this.props.value || '', visible: false});\n if (this.props.onFinished) {\n this.props.onFinished();\n }\n } else if (e.keyCode == 13) {\n // Enter pressed\n this.handleEditingFinished();\n }\n }\n\n handleEditingFinished(e) {\n if (e) {\n let currentTarget = e.currentTarget;\n setTimeout(_ => {\n if (!currentTarget.contains(document.activeElement)) {\n if (this.props.onFinished) {\n this.props.onFinished(this.state.value);\n }\n }\n }, 0);\n } else if (this.props.onFinished) {\n this.props.onFinished(this.state.value.trim());\n }\n }\n\n render() {\n return (\n \n \n \n \n {this.state.visible ? 'visibility' : 'visibility_off'}\n \n \n
\n );\n }\n}\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"jsQR\"] = factory();\n\telse\n\t\troot[\"jsQR\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 3);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix = /** @class */ (function () {\n function BitMatrix(data, width) {\n this.width = width;\n this.height = data.length / width;\n this.data = data;\n }\n BitMatrix.createEmpty = function (width, height) {\n return new BitMatrix(new Uint8ClampedArray(width * height), width);\n };\n BitMatrix.prototype.get = function (x, y) {\n if (x < 0 || x >= this.width || y < 0 || y >= this.height) {\n return false;\n }\n return !!this.data[y * this.width + x];\n };\n BitMatrix.prototype.set = function (x, y, v) {\n this.data[y * this.width + x] = v ? 1 : 0;\n };\n BitMatrix.prototype.setRegion = function (left, top, width, height, v) {\n for (var y = top; y < top + height; y++) {\n for (var x = left; x < left + width; x++) {\n this.set(x, y, !!v);\n }\n }\n };\n return BitMatrix;\n}());\nexports.BitMatrix = BitMatrix;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar GenericGFPoly_1 = __webpack_require__(2);\nfunction addOrSubtractGF(a, b) {\n return a ^ b; // tslint:disable-line:no-bitwise\n}\nexports.addOrSubtractGF = addOrSubtractGF;\nvar GenericGF = /** @class */ (function () {\n function GenericGF(primitive, size, genBase) {\n this.primitive = primitive;\n this.size = size;\n this.generatorBase = genBase;\n this.expTable = new Array(this.size);\n this.logTable = new Array(this.size);\n var x = 1;\n for (var i = 0; i < this.size; i++) {\n this.expTable[i] = x;\n x = x * 2;\n if (x >= this.size) {\n x = (x ^ this.primitive) & (this.size - 1); // tslint:disable-line:no-bitwise\n }\n }\n for (var i = 0; i < this.size - 1; i++) {\n this.logTable[this.expTable[i]] = i;\n }\n this.zero = new GenericGFPoly_1.default(this, Uint8ClampedArray.from([0]));\n this.one = new GenericGFPoly_1.default(this, Uint8ClampedArray.from([1]));\n }\n GenericGF.prototype.multiply = function (a, b) {\n if (a === 0 || b === 0) {\n return 0;\n }\n return this.expTable[(this.logTable[a] + this.logTable[b]) % (this.size - 1)];\n };\n GenericGF.prototype.inverse = function (a) {\n if (a === 0) {\n throw new Error(\"Can't invert 0\");\n }\n return this.expTable[this.size - this.logTable[a] - 1];\n };\n GenericGF.prototype.buildMonomial = function (degree, coefficient) {\n if (degree < 0) {\n throw new Error(\"Invalid monomial degree less than 0\");\n }\n if (coefficient === 0) {\n return this.zero;\n }\n var coefficients = new Uint8ClampedArray(degree + 1);\n coefficients[0] = coefficient;\n return new GenericGFPoly_1.default(this, coefficients);\n };\n GenericGF.prototype.log = function (a) {\n if (a === 0) {\n throw new Error(\"Can't take log(0)\");\n }\n return this.logTable[a];\n };\n GenericGF.prototype.exp = function (a) {\n return this.expTable[a];\n };\n return GenericGF;\n}());\nexports.default = GenericGF;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar GenericGF_1 = __webpack_require__(1);\nvar GenericGFPoly = /** @class */ (function () {\n function GenericGFPoly(field, coefficients) {\n if (coefficients.length === 0) {\n throw new Error(\"No coefficients.\");\n }\n this.field = field;\n var coefficientsLength = coefficients.length;\n if (coefficientsLength > 1 && coefficients[0] === 0) {\n // Leading term must be non-zero for anything except the constant polynomial \"0\"\n var firstNonZero = 1;\n while (firstNonZero < coefficientsLength && coefficients[firstNonZero] === 0) {\n firstNonZero++;\n }\n if (firstNonZero === coefficientsLength) {\n this.coefficients = field.zero.coefficients;\n }\n else {\n this.coefficients = new Uint8ClampedArray(coefficientsLength - firstNonZero);\n for (var i = 0; i < this.coefficients.length; i++) {\n this.coefficients[i] = coefficients[firstNonZero + i];\n }\n }\n }\n else {\n this.coefficients = coefficients;\n }\n }\n GenericGFPoly.prototype.degree = function () {\n return this.coefficients.length - 1;\n };\n GenericGFPoly.prototype.isZero = function () {\n return this.coefficients[0] === 0;\n };\n GenericGFPoly.prototype.getCoefficient = function (degree) {\n return this.coefficients[this.coefficients.length - 1 - degree];\n };\n GenericGFPoly.prototype.addOrSubtract = function (other) {\n var _a;\n if (this.isZero()) {\n return other;\n }\n if (other.isZero()) {\n return this;\n }\n var smallerCoefficients = this.coefficients;\n var largerCoefficients = other.coefficients;\n if (smallerCoefficients.length > largerCoefficients.length) {\n _a = [largerCoefficients, smallerCoefficients], smallerCoefficients = _a[0], largerCoefficients = _a[1];\n }\n var sumDiff = new Uint8ClampedArray(largerCoefficients.length);\n var lengthDiff = largerCoefficients.length - smallerCoefficients.length;\n for (var i = 0; i < lengthDiff; i++) {\n sumDiff[i] = largerCoefficients[i];\n }\n for (var i = lengthDiff; i < largerCoefficients.length; i++) {\n sumDiff[i] = GenericGF_1.addOrSubtractGF(smallerCoefficients[i - lengthDiff], largerCoefficients[i]);\n }\n return new GenericGFPoly(this.field, sumDiff);\n };\n GenericGFPoly.prototype.multiply = function (scalar) {\n if (scalar === 0) {\n return this.field.zero;\n }\n if (scalar === 1) {\n return this;\n }\n var size = this.coefficients.length;\n var product = new Uint8ClampedArray(size);\n for (var i = 0; i < size; i++) {\n product[i] = this.field.multiply(this.coefficients[i], scalar);\n }\n return new GenericGFPoly(this.field, product);\n };\n GenericGFPoly.prototype.multiplyPoly = function (other) {\n if (this.isZero() || other.isZero()) {\n return this.field.zero;\n }\n var aCoefficients = this.coefficients;\n var aLength = aCoefficients.length;\n var bCoefficients = other.coefficients;\n var bLength = bCoefficients.length;\n var product = new Uint8ClampedArray(aLength + bLength - 1);\n for (var i = 0; i < aLength; i++) {\n var aCoeff = aCoefficients[i];\n for (var j = 0; j < bLength; j++) {\n product[i + j] = GenericGF_1.addOrSubtractGF(product[i + j], this.field.multiply(aCoeff, bCoefficients[j]));\n }\n }\n return new GenericGFPoly(this.field, product);\n };\n GenericGFPoly.prototype.multiplyByMonomial = function (degree, coefficient) {\n if (degree < 0) {\n throw new Error(\"Invalid degree less than 0\");\n }\n if (coefficient === 0) {\n return this.field.zero;\n }\n var size = this.coefficients.length;\n var product = new Uint8ClampedArray(size + degree);\n for (var i = 0; i < size; i++) {\n product[i] = this.field.multiply(this.coefficients[i], coefficient);\n }\n return new GenericGFPoly(this.field, product);\n };\n GenericGFPoly.prototype.evaluateAt = function (a) {\n var result = 0;\n if (a === 0) {\n // Just return the x^0 coefficient\n return this.getCoefficient(0);\n }\n var size = this.coefficients.length;\n if (a === 1) {\n // Just the sum of the coefficients\n this.coefficients.forEach(function (coefficient) {\n result = GenericGF_1.addOrSubtractGF(result, coefficient);\n });\n return result;\n }\n result = this.coefficients[0];\n for (var i = 1; i < size; i++) {\n result = GenericGF_1.addOrSubtractGF(this.field.multiply(a, result), this.coefficients[i]);\n }\n return result;\n };\n return GenericGFPoly;\n}());\nexports.default = GenericGFPoly;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar binarizer_1 = __webpack_require__(4);\nvar decoder_1 = __webpack_require__(5);\nvar extractor_1 = __webpack_require__(11);\nvar locator_1 = __webpack_require__(12);\nfunction scan(matrix) {\n var locations = locator_1.locate(matrix);\n if (!locations) {\n return null;\n }\n for (var _i = 0, locations_1 = locations; _i < locations_1.length; _i++) {\n var location_1 = locations_1[_i];\n var extracted = extractor_1.extract(matrix, location_1);\n var decoded = decoder_1.decode(extracted.matrix);\n if (decoded) {\n return {\n binaryData: decoded.bytes,\n data: decoded.text,\n chunks: decoded.chunks,\n version: decoded.version,\n location: {\n topRightCorner: extracted.mappingFunction(location_1.dimension, 0),\n topLeftCorner: extracted.mappingFunction(0, 0),\n bottomRightCorner: extracted.mappingFunction(location_1.dimension, location_1.dimension),\n bottomLeftCorner: extracted.mappingFunction(0, location_1.dimension),\n topRightFinderPattern: location_1.topRight,\n topLeftFinderPattern: location_1.topLeft,\n bottomLeftFinderPattern: location_1.bottomLeft,\n bottomRightAlignmentPattern: location_1.alignmentPattern,\n },\n };\n }\n }\n return null;\n}\nvar defaultOptions = {\n inversionAttempts: \"attemptBoth\",\n};\nfunction jsQR(data, width, height, providedOptions) {\n if (providedOptions === void 0) { providedOptions = {}; }\n var options = defaultOptions;\n Object.keys(options || {}).forEach(function (opt) {\n options[opt] = providedOptions[opt] || options[opt];\n });\n var shouldInvert = options.inversionAttempts === \"attemptBoth\" || options.inversionAttempts === \"invertFirst\";\n var tryInvertedFirst = options.inversionAttempts === \"onlyInvert\" || options.inversionAttempts === \"invertFirst\";\n var _a = binarizer_1.binarize(data, width, height, shouldInvert), binarized = _a.binarized, inverted = _a.inverted;\n var result = scan(tryInvertedFirst ? inverted : binarized);\n if (!result && (options.inversionAttempts === \"attemptBoth\" || options.inversionAttempts === \"invertFirst\")) {\n result = scan(tryInvertedFirst ? binarized : inverted);\n }\n return result;\n}\njsQR.default = jsQR;\nexports.default = jsQR;\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix_1 = __webpack_require__(0);\nvar REGION_SIZE = 8;\nvar MIN_DYNAMIC_RANGE = 24;\nfunction numBetween(value, min, max) {\n return value < min ? min : value > max ? max : value;\n}\n// Like BitMatrix but accepts arbitry Uint8 values\nvar Matrix = /** @class */ (function () {\n function Matrix(width, height) {\n this.width = width;\n this.data = new Uint8ClampedArray(width * height);\n }\n Matrix.prototype.get = function (x, y) {\n return this.data[y * this.width + x];\n };\n Matrix.prototype.set = function (x, y, value) {\n this.data[y * this.width + x] = value;\n };\n return Matrix;\n}());\nfunction binarize(data, width, height, returnInverted) {\n if (data.length !== width * height * 4) {\n throw new Error(\"Malformed data passed to binarizer.\");\n }\n // Convert image to greyscale\n var greyscalePixels = new Matrix(width, height);\n for (var x = 0; x < width; x++) {\n for (var y = 0; y < height; y++) {\n var r = data[((y * width + x) * 4) + 0];\n var g = data[((y * width + x) * 4) + 1];\n var b = data[((y * width + x) * 4) + 2];\n greyscalePixels.set(x, y, 0.2126 * r + 0.7152 * g + 0.0722 * b);\n }\n }\n var horizontalRegionCount = Math.ceil(width / REGION_SIZE);\n var verticalRegionCount = Math.ceil(height / REGION_SIZE);\n var blackPoints = new Matrix(horizontalRegionCount, verticalRegionCount);\n for (var verticalRegion = 0; verticalRegion < verticalRegionCount; verticalRegion++) {\n for (var hortizontalRegion = 0; hortizontalRegion < horizontalRegionCount; hortizontalRegion++) {\n var sum = 0;\n var min = Infinity;\n var max = 0;\n for (var y = 0; y < REGION_SIZE; y++) {\n for (var x = 0; x < REGION_SIZE; x++) {\n var pixelLumosity = greyscalePixels.get(hortizontalRegion * REGION_SIZE + x, verticalRegion * REGION_SIZE + y);\n sum += pixelLumosity;\n min = Math.min(min, pixelLumosity);\n max = Math.max(max, pixelLumosity);\n }\n }\n var average = sum / (Math.pow(REGION_SIZE, 2));\n if (max - min <= MIN_DYNAMIC_RANGE) {\n // If variation within the block is low, assume this is a block with only light or only\n // dark pixels. In that case we do not want to use the average, as it would divide this\n // low contrast area into black and white pixels, essentially creating data out of noise.\n //\n // Default the blackpoint for these blocks to be half the min - effectively white them out\n average = min / 2;\n if (verticalRegion > 0 && hortizontalRegion > 0) {\n // Correct the \"white background\" assumption for blocks that have neighbors by comparing\n // the pixels in this block to the previously calculated black points. This is based on\n // the fact that dark barcode symbology is always surrounded by some amount of light\n // background for which reasonable black point estimates were made. The bp estimated at\n // the boundaries is used for the interior.\n // The (min < bp) is arbitrary but works better than other heuristics that were tried.\n var averageNeighborBlackPoint = (blackPoints.get(hortizontalRegion, verticalRegion - 1) +\n (2 * blackPoints.get(hortizontalRegion - 1, verticalRegion)) +\n blackPoints.get(hortizontalRegion - 1, verticalRegion - 1)) / 4;\n if (min < averageNeighborBlackPoint) {\n average = averageNeighborBlackPoint;\n }\n }\n }\n blackPoints.set(hortizontalRegion, verticalRegion, average);\n }\n }\n var binarized = BitMatrix_1.BitMatrix.createEmpty(width, height);\n var inverted = null;\n if (returnInverted) {\n inverted = BitMatrix_1.BitMatrix.createEmpty(width, height);\n }\n for (var verticalRegion = 0; verticalRegion < verticalRegionCount; verticalRegion++) {\n for (var hortizontalRegion = 0; hortizontalRegion < horizontalRegionCount; hortizontalRegion++) {\n var left = numBetween(hortizontalRegion, 2, horizontalRegionCount - 3);\n var top_1 = numBetween(verticalRegion, 2, verticalRegionCount - 3);\n var sum = 0;\n for (var xRegion = -2; xRegion <= 2; xRegion++) {\n for (var yRegion = -2; yRegion <= 2; yRegion++) {\n sum += blackPoints.get(left + xRegion, top_1 + yRegion);\n }\n }\n var threshold = sum / 25;\n for (var xRegion = 0; xRegion < REGION_SIZE; xRegion++) {\n for (var yRegion = 0; yRegion < REGION_SIZE; yRegion++) {\n var x = hortizontalRegion * REGION_SIZE + xRegion;\n var y = verticalRegion * REGION_SIZE + yRegion;\n var lum = greyscalePixels.get(x, y);\n binarized.set(x, y, lum <= threshold);\n if (returnInverted) {\n inverted.set(x, y, !(lum <= threshold));\n }\n }\n }\n }\n }\n if (returnInverted) {\n return { binarized: binarized, inverted: inverted };\n }\n return { binarized: binarized };\n}\nexports.binarize = binarize;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix_1 = __webpack_require__(0);\nvar decodeData_1 = __webpack_require__(6);\nvar reedsolomon_1 = __webpack_require__(9);\nvar version_1 = __webpack_require__(10);\n// tslint:disable:no-bitwise\nfunction numBitsDiffering(x, y) {\n var z = x ^ y;\n var bitCount = 0;\n while (z) {\n bitCount++;\n z &= z - 1;\n }\n return bitCount;\n}\nfunction pushBit(bit, byte) {\n return (byte << 1) | bit;\n}\n// tslint:enable:no-bitwise\nvar FORMAT_INFO_TABLE = [\n { bits: 0x5412, formatInfo: { errorCorrectionLevel: 1, dataMask: 0 } },\n { bits: 0x5125, formatInfo: { errorCorrectionLevel: 1, dataMask: 1 } },\n { bits: 0x5E7C, formatInfo: { errorCorrectionLevel: 1, dataMask: 2 } },\n { bits: 0x5B4B, formatInfo: { errorCorrectionLevel: 1, dataMask: 3 } },\n { bits: 0x45F9, formatInfo: { errorCorrectionLevel: 1, dataMask: 4 } },\n { bits: 0x40CE, formatInfo: { errorCorrectionLevel: 1, dataMask: 5 } },\n { bits: 0x4F97, formatInfo: { errorCorrectionLevel: 1, dataMask: 6 } },\n { bits: 0x4AA0, formatInfo: { errorCorrectionLevel: 1, dataMask: 7 } },\n { bits: 0x77C4, formatInfo: { errorCorrectionLevel: 0, dataMask: 0 } },\n { bits: 0x72F3, formatInfo: { errorCorrectionLevel: 0, dataMask: 1 } },\n { bits: 0x7DAA, formatInfo: { errorCorrectionLevel: 0, dataMask: 2 } },\n { bits: 0x789D, formatInfo: { errorCorrectionLevel: 0, dataMask: 3 } },\n { bits: 0x662F, formatInfo: { errorCorrectionLevel: 0, dataMask: 4 } },\n { bits: 0x6318, formatInfo: { errorCorrectionLevel: 0, dataMask: 5 } },\n { bits: 0x6C41, formatInfo: { errorCorrectionLevel: 0, dataMask: 6 } },\n { bits: 0x6976, formatInfo: { errorCorrectionLevel: 0, dataMask: 7 } },\n { bits: 0x1689, formatInfo: { errorCorrectionLevel: 3, dataMask: 0 } },\n { bits: 0x13BE, formatInfo: { errorCorrectionLevel: 3, dataMask: 1 } },\n { bits: 0x1CE7, formatInfo: { errorCorrectionLevel: 3, dataMask: 2 } },\n { bits: 0x19D0, formatInfo: { errorCorrectionLevel: 3, dataMask: 3 } },\n { bits: 0x0762, formatInfo: { errorCorrectionLevel: 3, dataMask: 4 } },\n { bits: 0x0255, formatInfo: { errorCorrectionLevel: 3, dataMask: 5 } },\n { bits: 0x0D0C, formatInfo: { errorCorrectionLevel: 3, dataMask: 6 } },\n { bits: 0x083B, formatInfo: { errorCorrectionLevel: 3, dataMask: 7 } },\n { bits: 0x355F, formatInfo: { errorCorrectionLevel: 2, dataMask: 0 } },\n { bits: 0x3068, formatInfo: { errorCorrectionLevel: 2, dataMask: 1 } },\n { bits: 0x3F31, formatInfo: { errorCorrectionLevel: 2, dataMask: 2 } },\n { bits: 0x3A06, formatInfo: { errorCorrectionLevel: 2, dataMask: 3 } },\n { bits: 0x24B4, formatInfo: { errorCorrectionLevel: 2, dataMask: 4 } },\n { bits: 0x2183, formatInfo: { errorCorrectionLevel: 2, dataMask: 5 } },\n { bits: 0x2EDA, formatInfo: { errorCorrectionLevel: 2, dataMask: 6 } },\n { bits: 0x2BED, formatInfo: { errorCorrectionLevel: 2, dataMask: 7 } },\n];\nvar DATA_MASKS = [\n function (p) { return ((p.y + p.x) % 2) === 0; },\n function (p) { return (p.y % 2) === 0; },\n function (p) { return p.x % 3 === 0; },\n function (p) { return (p.y + p.x) % 3 === 0; },\n function (p) { return (Math.floor(p.y / 2) + Math.floor(p.x / 3)) % 2 === 0; },\n function (p) { return ((p.x * p.y) % 2) + ((p.x * p.y) % 3) === 0; },\n function (p) { return ((((p.y * p.x) % 2) + (p.y * p.x) % 3) % 2) === 0; },\n function (p) { return ((((p.y + p.x) % 2) + (p.y * p.x) % 3) % 2) === 0; },\n];\nfunction buildFunctionPatternMask(version) {\n var dimension = 17 + 4 * version.versionNumber;\n var matrix = BitMatrix_1.BitMatrix.createEmpty(dimension, dimension);\n matrix.setRegion(0, 0, 9, 9, true); // Top left finder pattern + separator + format\n matrix.setRegion(dimension - 8, 0, 8, 9, true); // Top right finder pattern + separator + format\n matrix.setRegion(0, dimension - 8, 9, 8, true); // Bottom left finder pattern + separator + format\n // Alignment patterns\n for (var _i = 0, _a = version.alignmentPatternCenters; _i < _a.length; _i++) {\n var x = _a[_i];\n for (var _b = 0, _c = version.alignmentPatternCenters; _b < _c.length; _b++) {\n var y = _c[_b];\n if (!(x === 6 && y === 6 || x === 6 && y === dimension - 7 || x === dimension - 7 && y === 6)) {\n matrix.setRegion(x - 2, y - 2, 5, 5, true);\n }\n }\n }\n matrix.setRegion(6, 9, 1, dimension - 17, true); // Vertical timing pattern\n matrix.setRegion(9, 6, dimension - 17, 1, true); // Horizontal timing pattern\n if (version.versionNumber > 6) {\n matrix.setRegion(dimension - 11, 0, 3, 6, true); // Version info, top right\n matrix.setRegion(0, dimension - 11, 6, 3, true); // Version info, bottom left\n }\n return matrix;\n}\nfunction readCodewords(matrix, version, formatInfo) {\n var dataMask = DATA_MASKS[formatInfo.dataMask];\n var dimension = matrix.height;\n var functionPatternMask = buildFunctionPatternMask(version);\n var codewords = [];\n var currentByte = 0;\n var bitsRead = 0;\n // Read columns in pairs, from right to left\n var readingUp = true;\n for (var columnIndex = dimension - 1; columnIndex > 0; columnIndex -= 2) {\n if (columnIndex === 6) { // Skip whole column with vertical alignment pattern;\n columnIndex--;\n }\n for (var i = 0; i < dimension; i++) {\n var y = readingUp ? dimension - 1 - i : i;\n for (var columnOffset = 0; columnOffset < 2; columnOffset++) {\n var x = columnIndex - columnOffset;\n if (!functionPatternMask.get(x, y)) {\n bitsRead++;\n var bit = matrix.get(x, y);\n if (dataMask({ y: y, x: x })) {\n bit = !bit;\n }\n currentByte = pushBit(bit, currentByte);\n if (bitsRead === 8) { // Whole bytes\n codewords.push(currentByte);\n bitsRead = 0;\n currentByte = 0;\n }\n }\n }\n }\n readingUp = !readingUp;\n }\n return codewords;\n}\nfunction readVersion(matrix) {\n var dimension = matrix.height;\n var provisionalVersion = Math.floor((dimension - 17) / 4);\n if (provisionalVersion <= 6) { // 6 and under dont have version info in the QR code\n return version_1.VERSIONS[provisionalVersion - 1];\n }\n var topRightVersionBits = 0;\n for (var y = 5; y >= 0; y--) {\n for (var x = dimension - 9; x >= dimension - 11; x--) {\n topRightVersionBits = pushBit(matrix.get(x, y), topRightVersionBits);\n }\n }\n var bottomLeftVersionBits = 0;\n for (var x = 5; x >= 0; x--) {\n for (var y = dimension - 9; y >= dimension - 11; y--) {\n bottomLeftVersionBits = pushBit(matrix.get(x, y), bottomLeftVersionBits);\n }\n }\n var bestDifference = Infinity;\n var bestVersion;\n for (var _i = 0, VERSIONS_1 = version_1.VERSIONS; _i < VERSIONS_1.length; _i++) {\n var version = VERSIONS_1[_i];\n if (version.infoBits === topRightVersionBits || version.infoBits === bottomLeftVersionBits) {\n return version;\n }\n var difference = numBitsDiffering(topRightVersionBits, version.infoBits);\n if (difference < bestDifference) {\n bestVersion = version;\n bestDifference = difference;\n }\n difference = numBitsDiffering(bottomLeftVersionBits, version.infoBits);\n if (difference < bestDifference) {\n bestVersion = version;\n bestDifference = difference;\n }\n }\n // We can tolerate up to 3 bits of error since no two version info codewords will\n // differ in less than 8 bits.\n if (bestDifference <= 3) {\n return bestVersion;\n }\n}\nfunction readFormatInformation(matrix) {\n var topLeftFormatInfoBits = 0;\n for (var x = 0; x <= 8; x++) {\n if (x !== 6) { // Skip timing pattern bit\n topLeftFormatInfoBits = pushBit(matrix.get(x, 8), topLeftFormatInfoBits);\n }\n }\n for (var y = 7; y >= 0; y--) {\n if (y !== 6) { // Skip timing pattern bit\n topLeftFormatInfoBits = pushBit(matrix.get(8, y), topLeftFormatInfoBits);\n }\n }\n var dimension = matrix.height;\n var topRightBottomRightFormatInfoBits = 0;\n for (var y = dimension - 1; y >= dimension - 7; y--) { // bottom left\n topRightBottomRightFormatInfoBits = pushBit(matrix.get(8, y), topRightBottomRightFormatInfoBits);\n }\n for (var x = dimension - 8; x < dimension; x++) { // top right\n topRightBottomRightFormatInfoBits = pushBit(matrix.get(x, 8), topRightBottomRightFormatInfoBits);\n }\n var bestDifference = Infinity;\n var bestFormatInfo = null;\n for (var _i = 0, FORMAT_INFO_TABLE_1 = FORMAT_INFO_TABLE; _i < FORMAT_INFO_TABLE_1.length; _i++) {\n var _a = FORMAT_INFO_TABLE_1[_i], bits = _a.bits, formatInfo = _a.formatInfo;\n if (bits === topLeftFormatInfoBits || bits === topRightBottomRightFormatInfoBits) {\n return formatInfo;\n }\n var difference = numBitsDiffering(topLeftFormatInfoBits, bits);\n if (difference < bestDifference) {\n bestFormatInfo = formatInfo;\n bestDifference = difference;\n }\n if (topLeftFormatInfoBits !== topRightBottomRightFormatInfoBits) { // also try the other option\n difference = numBitsDiffering(topRightBottomRightFormatInfoBits, bits);\n if (difference < bestDifference) {\n bestFormatInfo = formatInfo;\n bestDifference = difference;\n }\n }\n }\n // Hamming distance of the 32 masked codes is 7, by construction, so <= 3 bits differing means we found a match\n if (bestDifference <= 3) {\n return bestFormatInfo;\n }\n return null;\n}\nfunction getDataBlocks(codewords, version, ecLevel) {\n var ecInfo = version.errorCorrectionLevels[ecLevel];\n var dataBlocks = [];\n var totalCodewords = 0;\n ecInfo.ecBlocks.forEach(function (block) {\n for (var i = 0; i < block.numBlocks; i++) {\n dataBlocks.push({ numDataCodewords: block.dataCodewordsPerBlock, codewords: [] });\n totalCodewords += block.dataCodewordsPerBlock + ecInfo.ecCodewordsPerBlock;\n }\n });\n // In some cases the QR code will be malformed enough that we pull off more or less than we should.\n // If we pull off less there's nothing we can do.\n // If we pull off more we can safely truncate\n if (codewords.length < totalCodewords) {\n return null;\n }\n codewords = codewords.slice(0, totalCodewords);\n var shortBlockSize = ecInfo.ecBlocks[0].dataCodewordsPerBlock;\n // Pull codewords to fill the blocks up to the minimum size\n for (var i = 0; i < shortBlockSize; i++) {\n for (var _i = 0, dataBlocks_1 = dataBlocks; _i < dataBlocks_1.length; _i++) {\n var dataBlock = dataBlocks_1[_i];\n dataBlock.codewords.push(codewords.shift());\n }\n }\n // If there are any large blocks, pull codewords to fill the last element of those\n if (ecInfo.ecBlocks.length > 1) {\n var smallBlockCount = ecInfo.ecBlocks[0].numBlocks;\n var largeBlockCount = ecInfo.ecBlocks[1].numBlocks;\n for (var i = 0; i < largeBlockCount; i++) {\n dataBlocks[smallBlockCount + i].codewords.push(codewords.shift());\n }\n }\n // Add the rest of the codewords to the blocks. These are the error correction codewords.\n while (codewords.length > 0) {\n for (var _a = 0, dataBlocks_2 = dataBlocks; _a < dataBlocks_2.length; _a++) {\n var dataBlock = dataBlocks_2[_a];\n dataBlock.codewords.push(codewords.shift());\n }\n }\n return dataBlocks;\n}\nfunction decodeMatrix(matrix) {\n var version = readVersion(matrix);\n if (!version) {\n return null;\n }\n var formatInfo = readFormatInformation(matrix);\n if (!formatInfo) {\n return null;\n }\n var codewords = readCodewords(matrix, version, formatInfo);\n var dataBlocks = getDataBlocks(codewords, version, formatInfo.errorCorrectionLevel);\n if (!dataBlocks) {\n return null;\n }\n // Count total number of data bytes\n var totalBytes = dataBlocks.reduce(function (a, b) { return a + b.numDataCodewords; }, 0);\n var resultBytes = new Uint8ClampedArray(totalBytes);\n var resultIndex = 0;\n for (var _i = 0, dataBlocks_3 = dataBlocks; _i < dataBlocks_3.length; _i++) {\n var dataBlock = dataBlocks_3[_i];\n var correctedBytes = reedsolomon_1.decode(dataBlock.codewords, dataBlock.codewords.length - dataBlock.numDataCodewords);\n if (!correctedBytes) {\n return null;\n }\n for (var i = 0; i < dataBlock.numDataCodewords; i++) {\n resultBytes[resultIndex++] = correctedBytes[i];\n }\n }\n try {\n return decodeData_1.decode(resultBytes, version.versionNumber);\n }\n catch (_a) {\n return null;\n }\n}\nfunction decode(matrix) {\n if (matrix == null) {\n return null;\n }\n var result = decodeMatrix(matrix);\n if (result) {\n return result;\n }\n // Decoding didn't work, try mirroring the QR across the topLeft -> bottomRight line.\n for (var x = 0; x < matrix.width; x++) {\n for (var y = x + 1; y < matrix.height; y++) {\n if (matrix.get(x, y) !== matrix.get(y, x)) {\n matrix.set(x, y, !matrix.get(x, y));\n matrix.set(y, x, !matrix.get(y, x));\n }\n }\n }\n return decodeMatrix(matrix);\n}\nexports.decode = decode;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// tslint:disable:no-bitwise\nvar BitStream_1 = __webpack_require__(7);\nvar shiftJISTable_1 = __webpack_require__(8);\nvar Mode;\n(function (Mode) {\n Mode[\"Numeric\"] = \"numeric\";\n Mode[\"Alphanumeric\"] = \"alphanumeric\";\n Mode[\"Byte\"] = \"byte\";\n Mode[\"Kanji\"] = \"kanji\";\n Mode[\"ECI\"] = \"eci\";\n})(Mode = exports.Mode || (exports.Mode = {}));\nvar ModeByte;\n(function (ModeByte) {\n ModeByte[ModeByte[\"Terminator\"] = 0] = \"Terminator\";\n ModeByte[ModeByte[\"Numeric\"] = 1] = \"Numeric\";\n ModeByte[ModeByte[\"Alphanumeric\"] = 2] = \"Alphanumeric\";\n ModeByte[ModeByte[\"Byte\"] = 4] = \"Byte\";\n ModeByte[ModeByte[\"Kanji\"] = 8] = \"Kanji\";\n ModeByte[ModeByte[\"ECI\"] = 7] = \"ECI\";\n // StructuredAppend = 0x3,\n // FNC1FirstPosition = 0x5,\n // FNC1SecondPosition = 0x9,\n})(ModeByte || (ModeByte = {}));\nfunction decodeNumeric(stream, size) {\n var bytes = [];\n var text = \"\";\n var characterCountSize = [10, 12, 14][size];\n var length = stream.readBits(characterCountSize);\n // Read digits in groups of 3\n while (length >= 3) {\n var num = stream.readBits(10);\n if (num >= 1000) {\n throw new Error(\"Invalid numeric value above 999\");\n }\n var a = Math.floor(num / 100);\n var b = Math.floor(num / 10) % 10;\n var c = num % 10;\n bytes.push(48 + a, 48 + b, 48 + c);\n text += a.toString() + b.toString() + c.toString();\n length -= 3;\n }\n // If the number of digits aren't a multiple of 3, the remaining digits are special cased.\n if (length === 2) {\n var num = stream.readBits(7);\n if (num >= 100) {\n throw new Error(\"Invalid numeric value above 99\");\n }\n var a = Math.floor(num / 10);\n var b = num % 10;\n bytes.push(48 + a, 48 + b);\n text += a.toString() + b.toString();\n }\n else if (length === 1) {\n var num = stream.readBits(4);\n if (num >= 10) {\n throw new Error(\"Invalid numeric value above 9\");\n }\n bytes.push(48 + num);\n text += num.toString();\n }\n return { bytes: bytes, text: text };\n}\nvar AlphanumericCharacterCodes = [\n \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\",\n \"9\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\",\n \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\",\n \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\",\n \" \", \"$\", \"%\", \"*\", \"+\", \"-\", \".\", \"/\", \":\",\n];\nfunction decodeAlphanumeric(stream, size) {\n var bytes = [];\n var text = \"\";\n var characterCountSize = [9, 11, 13][size];\n var length = stream.readBits(characterCountSize);\n while (length >= 2) {\n var v = stream.readBits(11);\n var a = Math.floor(v / 45);\n var b = v % 45;\n bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0), AlphanumericCharacterCodes[b].charCodeAt(0));\n text += AlphanumericCharacterCodes[a] + AlphanumericCharacterCodes[b];\n length -= 2;\n }\n if (length === 1) {\n var a = stream.readBits(6);\n bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0));\n text += AlphanumericCharacterCodes[a];\n }\n return { bytes: bytes, text: text };\n}\nfunction decodeByte(stream, size) {\n var bytes = [];\n var text = \"\";\n var characterCountSize = [8, 16, 16][size];\n var length = stream.readBits(characterCountSize);\n for (var i = 0; i < length; i++) {\n var b = stream.readBits(8);\n bytes.push(b);\n }\n try {\n text += decodeURIComponent(bytes.map(function (b) { return \"%\" + (\"0\" + b.toString(16)).substr(-2); }).join(\"\"));\n }\n catch (_a) {\n // failed to decode\n }\n return { bytes: bytes, text: text };\n}\nfunction decodeKanji(stream, size) {\n var bytes = [];\n var text = \"\";\n var characterCountSize = [8, 10, 12][size];\n var length = stream.readBits(characterCountSize);\n for (var i = 0; i < length; i++) {\n var k = stream.readBits(13);\n var c = (Math.floor(k / 0xC0) << 8) | (k % 0xC0);\n if (c < 0x1F00) {\n c += 0x8140;\n }\n else {\n c += 0xC140;\n }\n bytes.push(c >> 8, c & 0xFF);\n text += String.fromCharCode(shiftJISTable_1.shiftJISTable[c]);\n }\n return { bytes: bytes, text: text };\n}\nfunction decode(data, version) {\n var _a, _b, _c, _d;\n var stream = new BitStream_1.BitStream(data);\n // There are 3 'sizes' based on the version. 1-9 is small (0), 10-26 is medium (1) and 27-40 is large (2).\n var size = version <= 9 ? 0 : version <= 26 ? 1 : 2;\n var result = {\n text: \"\",\n bytes: [],\n chunks: [],\n version: version,\n };\n while (stream.available() >= 4) {\n var mode = stream.readBits(4);\n if (mode === ModeByte.Terminator) {\n return result;\n }\n else if (mode === ModeByte.ECI) {\n if (stream.readBits(1) === 0) {\n result.chunks.push({\n type: Mode.ECI,\n assignmentNumber: stream.readBits(7),\n });\n }\n else if (stream.readBits(1) === 0) {\n result.chunks.push({\n type: Mode.ECI,\n assignmentNumber: stream.readBits(14),\n });\n }\n else if (stream.readBits(1) === 0) {\n result.chunks.push({\n type: Mode.ECI,\n assignmentNumber: stream.readBits(21),\n });\n }\n else {\n // ECI data seems corrupted\n result.chunks.push({\n type: Mode.ECI,\n assignmentNumber: -1,\n });\n }\n }\n else if (mode === ModeByte.Numeric) {\n var numericResult = decodeNumeric(stream, size);\n result.text += numericResult.text;\n (_a = result.bytes).push.apply(_a, numericResult.bytes);\n result.chunks.push({\n type: Mode.Numeric,\n text: numericResult.text,\n });\n }\n else if (mode === ModeByte.Alphanumeric) {\n var alphanumericResult = decodeAlphanumeric(stream, size);\n result.text += alphanumericResult.text;\n (_b = result.bytes).push.apply(_b, alphanumericResult.bytes);\n result.chunks.push({\n type: Mode.Alphanumeric,\n text: alphanumericResult.text,\n });\n }\n else if (mode === ModeByte.Byte) {\n var byteResult = decodeByte(stream, size);\n result.text += byteResult.text;\n (_c = result.bytes).push.apply(_c, byteResult.bytes);\n result.chunks.push({\n type: Mode.Byte,\n bytes: byteResult.bytes,\n text: byteResult.text,\n });\n }\n else if (mode === ModeByte.Kanji) {\n var kanjiResult = decodeKanji(stream, size);\n result.text += kanjiResult.text;\n (_d = result.bytes).push.apply(_d, kanjiResult.bytes);\n result.chunks.push({\n type: Mode.Kanji,\n bytes: kanjiResult.bytes,\n text: kanjiResult.text,\n });\n }\n }\n // If there is no data left, or the remaining bits are all 0, then that counts as a termination marker\n if (stream.available() === 0 || stream.readBits(stream.available()) === 0) {\n return result;\n }\n}\nexports.decode = decode;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// tslint:disable:no-bitwise\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitStream = /** @class */ (function () {\n function BitStream(bytes) {\n this.byteOffset = 0;\n this.bitOffset = 0;\n this.bytes = bytes;\n }\n BitStream.prototype.readBits = function (numBits) {\n if (numBits < 1 || numBits > 32 || numBits > this.available()) {\n throw new Error(\"Cannot read \" + numBits.toString() + \" bits\");\n }\n var result = 0;\n // First, read remainder from current byte\n if (this.bitOffset > 0) {\n var bitsLeft = 8 - this.bitOffset;\n var toRead = numBits < bitsLeft ? numBits : bitsLeft;\n var bitsToNotRead = bitsLeft - toRead;\n var mask = (0xFF >> (8 - toRead)) << bitsToNotRead;\n result = (this.bytes[this.byteOffset] & mask) >> bitsToNotRead;\n numBits -= toRead;\n this.bitOffset += toRead;\n if (this.bitOffset === 8) {\n this.bitOffset = 0;\n this.byteOffset++;\n }\n }\n // Next read whole bytes\n if (numBits > 0) {\n while (numBits >= 8) {\n result = (result << 8) | (this.bytes[this.byteOffset] & 0xFF);\n this.byteOffset++;\n numBits -= 8;\n }\n // Finally read a partial byte\n if (numBits > 0) {\n var bitsToNotRead = 8 - numBits;\n var mask = (0xFF >> bitsToNotRead) << bitsToNotRead;\n result = (result << numBits) | ((this.bytes[this.byteOffset] & mask) >> bitsToNotRead);\n this.bitOffset += numBits;\n }\n }\n return result;\n };\n BitStream.prototype.available = function () {\n return 8 * (this.bytes.length - this.byteOffset) - this.bitOffset;\n };\n return BitStream;\n}());\nexports.BitStream = BitStream;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.shiftJISTable = {\n 0x20: 0x0020,\n 0x21: 0x0021,\n 0x22: 0x0022,\n 0x23: 0x0023,\n 0x24: 0x0024,\n 0x25: 0x0025,\n 0x26: 0x0026,\n 0x27: 0x0027,\n 0x28: 0x0028,\n 0x29: 0x0029,\n 0x2A: 0x002A,\n 0x2B: 0x002B,\n 0x2C: 0x002C,\n 0x2D: 0x002D,\n 0x2E: 0x002E,\n 0x2F: 0x002F,\n 0x30: 0x0030,\n 0x31: 0x0031,\n 0x32: 0x0032,\n 0x33: 0x0033,\n 0x34: 0x0034,\n 0x35: 0x0035,\n 0x36: 0x0036,\n 0x37: 0x0037,\n 0x38: 0x0038,\n 0x39: 0x0039,\n 0x3A: 0x003A,\n 0x3B: 0x003B,\n 0x3C: 0x003C,\n 0x3D: 0x003D,\n 0x3E: 0x003E,\n 0x3F: 0x003F,\n 0x40: 0x0040,\n 0x41: 0x0041,\n 0x42: 0x0042,\n 0x43: 0x0043,\n 0x44: 0x0044,\n 0x45: 0x0045,\n 0x46: 0x0046,\n 0x47: 0x0047,\n 0x48: 0x0048,\n 0x49: 0x0049,\n 0x4A: 0x004A,\n 0x4B: 0x004B,\n 0x4C: 0x004C,\n 0x4D: 0x004D,\n 0x4E: 0x004E,\n 0x4F: 0x004F,\n 0x50: 0x0050,\n 0x51: 0x0051,\n 0x52: 0x0052,\n 0x53: 0x0053,\n 0x54: 0x0054,\n 0x55: 0x0055,\n 0x56: 0x0056,\n 0x57: 0x0057,\n 0x58: 0x0058,\n 0x59: 0x0059,\n 0x5A: 0x005A,\n 0x5B: 0x005B,\n 0x5C: 0x00A5,\n 0x5D: 0x005D,\n 0x5E: 0x005E,\n 0x5F: 0x005F,\n 0x60: 0x0060,\n 0x61: 0x0061,\n 0x62: 0x0062,\n 0x63: 0x0063,\n 0x64: 0x0064,\n 0x65: 0x0065,\n 0x66: 0x0066,\n 0x67: 0x0067,\n 0x68: 0x0068,\n 0x69: 0x0069,\n 0x6A: 0x006A,\n 0x6B: 0x006B,\n 0x6C: 0x006C,\n 0x6D: 0x006D,\n 0x6E: 0x006E,\n 0x6F: 0x006F,\n 0x70: 0x0070,\n 0x71: 0x0071,\n 0x72: 0x0072,\n 0x73: 0x0073,\n 0x74: 0x0074,\n 0x75: 0x0075,\n 0x76: 0x0076,\n 0x77: 0x0077,\n 0x78: 0x0078,\n 0x79: 0x0079,\n 0x7A: 0x007A,\n 0x7B: 0x007B,\n 0x7C: 0x007C,\n 0x7D: 0x007D,\n 0x7E: 0x203E,\n 0x8140: 0x3000,\n 0x8141: 0x3001,\n 0x8142: 0x3002,\n 0x8143: 0xFF0C,\n 0x8144: 0xFF0E,\n 0x8145: 0x30FB,\n 0x8146: 0xFF1A,\n 0x8147: 0xFF1B,\n 0x8148: 0xFF1F,\n 0x8149: 0xFF01,\n 0x814A: 0x309B,\n 0x814B: 0x309C,\n 0x814C: 0x00B4,\n 0x814D: 0xFF40,\n 0x814E: 0x00A8,\n 0x814F: 0xFF3E,\n 0x8150: 0xFFE3,\n 0x8151: 0xFF3F,\n 0x8152: 0x30FD,\n 0x8153: 0x30FE,\n 0x8154: 0x309D,\n 0x8155: 0x309E,\n 0x8156: 0x3003,\n 0x8157: 0x4EDD,\n 0x8158: 0x3005,\n 0x8159: 0x3006,\n 0x815A: 0x3007,\n 0x815B: 0x30FC,\n 0x815C: 0x2015,\n 0x815D: 0x2010,\n 0x815E: 0xFF0F,\n 0x815F: 0x005C,\n 0x8160: 0x301C,\n 0x8161: 0x2016,\n 0x8162: 0xFF5C,\n 0x8163: 0x2026,\n 0x8164: 0x2025,\n 0x8165: 0x2018,\n 0x8166: 0x2019,\n 0x8167: 0x201C,\n 0x8168: 0x201D,\n 0x8169: 0xFF08,\n 0x816A: 0xFF09,\n 0x816B: 0x3014,\n 0x816C: 0x3015,\n 0x816D: 0xFF3B,\n 0x816E: 0xFF3D,\n 0x816F: 0xFF5B,\n 0x8170: 0xFF5D,\n 0x8171: 0x3008,\n 0x8172: 0x3009,\n 0x8173: 0x300A,\n 0x8174: 0x300B,\n 0x8175: 0x300C,\n 0x8176: 0x300D,\n 0x8177: 0x300E,\n 0x8178: 0x300F,\n 0x8179: 0x3010,\n 0x817A: 0x3011,\n 0x817B: 0xFF0B,\n 0x817C: 0x2212,\n 0x817D: 0x00B1,\n 0x817E: 0x00D7,\n 0x8180: 0x00F7,\n 0x8181: 0xFF1D,\n 0x8182: 0x2260,\n 0x8183: 0xFF1C,\n 0x8184: 0xFF1E,\n 0x8185: 0x2266,\n 0x8186: 0x2267,\n 0x8187: 0x221E,\n 0x8188: 0x2234,\n 0x8189: 0x2642,\n 0x818A: 0x2640,\n 0x818B: 0x00B0,\n 0x818C: 0x2032,\n 0x818D: 0x2033,\n 0x818E: 0x2103,\n 0x818F: 0xFFE5,\n 0x8190: 0xFF04,\n 0x8191: 0x00A2,\n 0x8192: 0x00A3,\n 0x8193: 0xFF05,\n 0x8194: 0xFF03,\n 0x8195: 0xFF06,\n 0x8196: 0xFF0A,\n 0x8197: 0xFF20,\n 0x8198: 0x00A7,\n 0x8199: 0x2606,\n 0x819A: 0x2605,\n 0x819B: 0x25CB,\n 0x819C: 0x25CF,\n 0x819D: 0x25CE,\n 0x819E: 0x25C7,\n 0x819F: 0x25C6,\n 0x81A0: 0x25A1,\n 0x81A1: 0x25A0,\n 0x81A2: 0x25B3,\n 0x81A3: 0x25B2,\n 0x81A4: 0x25BD,\n 0x81A5: 0x25BC,\n 0x81A6: 0x203B,\n 0x81A7: 0x3012,\n 0x81A8: 0x2192,\n 0x81A9: 0x2190,\n 0x81AA: 0x2191,\n 0x81AB: 0x2193,\n 0x81AC: 0x3013,\n 0x81B8: 0x2208,\n 0x81B9: 0x220B,\n 0x81BA: 0x2286,\n 0x81BB: 0x2287,\n 0x81BC: 0x2282,\n 0x81BD: 0x2283,\n 0x81BE: 0x222A,\n 0x81BF: 0x2229,\n 0x81C8: 0x2227,\n 0x81C9: 0x2228,\n 0x81CA: 0x00AC,\n 0x81CB: 0x21D2,\n 0x81CC: 0x21D4,\n 0x81CD: 0x2200,\n 0x81CE: 0x2203,\n 0x81DA: 0x2220,\n 0x81DB: 0x22A5,\n 0x81DC: 0x2312,\n 0x81DD: 0x2202,\n 0x81DE: 0x2207,\n 0x81DF: 0x2261,\n 0x81E0: 0x2252,\n 0x81E1: 0x226A,\n 0x81E2: 0x226B,\n 0x81E3: 0x221A,\n 0x81E4: 0x223D,\n 0x81E5: 0x221D,\n 0x81E6: 0x2235,\n 0x81E7: 0x222B,\n 0x81E8: 0x222C,\n 0x81F0: 0x212B,\n 0x81F1: 0x2030,\n 0x81F2: 0x266F,\n 0x81F3: 0x266D,\n 0x81F4: 0x266A,\n 0x81F5: 0x2020,\n 0x81F6: 0x2021,\n 0x81F7: 0x00B6,\n 0x81FC: 0x25EF,\n 0x824F: 0xFF10,\n 0x8250: 0xFF11,\n 0x8251: 0xFF12,\n 0x8252: 0xFF13,\n 0x8253: 0xFF14,\n 0x8254: 0xFF15,\n 0x8255: 0xFF16,\n 0x8256: 0xFF17,\n 0x8257: 0xFF18,\n 0x8258: 0xFF19,\n 0x8260: 0xFF21,\n 0x8261: 0xFF22,\n 0x8262: 0xFF23,\n 0x8263: 0xFF24,\n 0x8264: 0xFF25,\n 0x8265: 0xFF26,\n 0x8266: 0xFF27,\n 0x8267: 0xFF28,\n 0x8268: 0xFF29,\n 0x8269: 0xFF2A,\n 0x826A: 0xFF2B,\n 0x826B: 0xFF2C,\n 0x826C: 0xFF2D,\n 0x826D: 0xFF2E,\n 0x826E: 0xFF2F,\n 0x826F: 0xFF30,\n 0x8270: 0xFF31,\n 0x8271: 0xFF32,\n 0x8272: 0xFF33,\n 0x8273: 0xFF34,\n 0x8274: 0xFF35,\n 0x8275: 0xFF36,\n 0x8276: 0xFF37,\n 0x8277: 0xFF38,\n 0x8278: 0xFF39,\n 0x8279: 0xFF3A,\n 0x8281: 0xFF41,\n 0x8282: 0xFF42,\n 0x8283: 0xFF43,\n 0x8284: 0xFF44,\n 0x8285: 0xFF45,\n 0x8286: 0xFF46,\n 0x8287: 0xFF47,\n 0x8288: 0xFF48,\n 0x8289: 0xFF49,\n 0x828A: 0xFF4A,\n 0x828B: 0xFF4B,\n 0x828C: 0xFF4C,\n 0x828D: 0xFF4D,\n 0x828E: 0xFF4E,\n 0x828F: 0xFF4F,\n 0x8290: 0xFF50,\n 0x8291: 0xFF51,\n 0x8292: 0xFF52,\n 0x8293: 0xFF53,\n 0x8294: 0xFF54,\n 0x8295: 0xFF55,\n 0x8296: 0xFF56,\n 0x8297: 0xFF57,\n 0x8298: 0xFF58,\n 0x8299: 0xFF59,\n 0x829A: 0xFF5A,\n 0x829F: 0x3041,\n 0x82A0: 0x3042,\n 0x82A1: 0x3043,\n 0x82A2: 0x3044,\n 0x82A3: 0x3045,\n 0x82A4: 0x3046,\n 0x82A5: 0x3047,\n 0x82A6: 0x3048,\n 0x82A7: 0x3049,\n 0x82A8: 0x304A,\n 0x82A9: 0x304B,\n 0x82AA: 0x304C,\n 0x82AB: 0x304D,\n 0x82AC: 0x304E,\n 0x82AD: 0x304F,\n 0x82AE: 0x3050,\n 0x82AF: 0x3051,\n 0x82B0: 0x3052,\n 0x82B1: 0x3053,\n 0x82B2: 0x3054,\n 0x82B3: 0x3055,\n 0x82B4: 0x3056,\n 0x82B5: 0x3057,\n 0x82B6: 0x3058,\n 0x82B7: 0x3059,\n 0x82B8: 0x305A,\n 0x82B9: 0x305B,\n 0x82BA: 0x305C,\n 0x82BB: 0x305D,\n 0x82BC: 0x305E,\n 0x82BD: 0x305F,\n 0x82BE: 0x3060,\n 0x82BF: 0x3061,\n 0x82C0: 0x3062,\n 0x82C1: 0x3063,\n 0x82C2: 0x3064,\n 0x82C3: 0x3065,\n 0x82C4: 0x3066,\n 0x82C5: 0x3067,\n 0x82C6: 0x3068,\n 0x82C7: 0x3069,\n 0x82C8: 0x306A,\n 0x82C9: 0x306B,\n 0x82CA: 0x306C,\n 0x82CB: 0x306D,\n 0x82CC: 0x306E,\n 0x82CD: 0x306F,\n 0x82CE: 0x3070,\n 0x82CF: 0x3071,\n 0x82D0: 0x3072,\n 0x82D1: 0x3073,\n 0x82D2: 0x3074,\n 0x82D3: 0x3075,\n 0x82D4: 0x3076,\n 0x82D5: 0x3077,\n 0x82D6: 0x3078,\n 0x82D7: 0x3079,\n 0x82D8: 0x307A,\n 0x82D9: 0x307B,\n 0x82DA: 0x307C,\n 0x82DB: 0x307D,\n 0x82DC: 0x307E,\n 0x82DD: 0x307F,\n 0x82DE: 0x3080,\n 0x82DF: 0x3081,\n 0x82E0: 0x3082,\n 0x82E1: 0x3083,\n 0x82E2: 0x3084,\n 0x82E3: 0x3085,\n 0x82E4: 0x3086,\n 0x82E5: 0x3087,\n 0x82E6: 0x3088,\n 0x82E7: 0x3089,\n 0x82E8: 0x308A,\n 0x82E9: 0x308B,\n 0x82EA: 0x308C,\n 0x82EB: 0x308D,\n 0x82EC: 0x308E,\n 0x82ED: 0x308F,\n 0x82EE: 0x3090,\n 0x82EF: 0x3091,\n 0x82F0: 0x3092,\n 0x82F1: 0x3093,\n 0x8340: 0x30A1,\n 0x8341: 0x30A2,\n 0x8342: 0x30A3,\n 0x8343: 0x30A4,\n 0x8344: 0x30A5,\n 0x8345: 0x30A6,\n 0x8346: 0x30A7,\n 0x8347: 0x30A8,\n 0x8348: 0x30A9,\n 0x8349: 0x30AA,\n 0x834A: 0x30AB,\n 0x834B: 0x30AC,\n 0x834C: 0x30AD,\n 0x834D: 0x30AE,\n 0x834E: 0x30AF,\n 0x834F: 0x30B0,\n 0x8350: 0x30B1,\n 0x8351: 0x30B2,\n 0x8352: 0x30B3,\n 0x8353: 0x30B4,\n 0x8354: 0x30B5,\n 0x8355: 0x30B6,\n 0x8356: 0x30B7,\n 0x8357: 0x30B8,\n 0x8358: 0x30B9,\n 0x8359: 0x30BA,\n 0x835A: 0x30BB,\n 0x835B: 0x30BC,\n 0x835C: 0x30BD,\n 0x835D: 0x30BE,\n 0x835E: 0x30BF,\n 0x835F: 0x30C0,\n 0x8360: 0x30C1,\n 0x8361: 0x30C2,\n 0x8362: 0x30C3,\n 0x8363: 0x30C4,\n 0x8364: 0x30C5,\n 0x8365: 0x30C6,\n 0x8366: 0x30C7,\n 0x8367: 0x30C8,\n 0x8368: 0x30C9,\n 0x8369: 0x30CA,\n 0x836A: 0x30CB,\n 0x836B: 0x30CC,\n 0x836C: 0x30CD,\n 0x836D: 0x30CE,\n 0x836E: 0x30CF,\n 0x836F: 0x30D0,\n 0x8370: 0x30D1,\n 0x8371: 0x30D2,\n 0x8372: 0x30D3,\n 0x8373: 0x30D4,\n 0x8374: 0x30D5,\n 0x8375: 0x30D6,\n 0x8376: 0x30D7,\n 0x8377: 0x30D8,\n 0x8378: 0x30D9,\n 0x8379: 0x30DA,\n 0x837A: 0x30DB,\n 0x837B: 0x30DC,\n 0x837C: 0x30DD,\n 0x837D: 0x30DE,\n 0x837E: 0x30DF,\n 0x8380: 0x30E0,\n 0x8381: 0x30E1,\n 0x8382: 0x30E2,\n 0x8383: 0x30E3,\n 0x8384: 0x30E4,\n 0x8385: 0x30E5,\n 0x8386: 0x30E6,\n 0x8387: 0x30E7,\n 0x8388: 0x30E8,\n 0x8389: 0x30E9,\n 0x838A: 0x30EA,\n 0x838B: 0x30EB,\n 0x838C: 0x30EC,\n 0x838D: 0x30ED,\n 0x838E: 0x30EE,\n 0x838F: 0x30EF,\n 0x8390: 0x30F0,\n 0x8391: 0x30F1,\n 0x8392: 0x30F2,\n 0x8393: 0x30F3,\n 0x8394: 0x30F4,\n 0x8395: 0x30F5,\n 0x8396: 0x30F6,\n 0x839F: 0x0391,\n 0x83A0: 0x0392,\n 0x83A1: 0x0393,\n 0x83A2: 0x0394,\n 0x83A3: 0x0395,\n 0x83A4: 0x0396,\n 0x83A5: 0x0397,\n 0x83A6: 0x0398,\n 0x83A7: 0x0399,\n 0x83A8: 0x039A,\n 0x83A9: 0x039B,\n 0x83AA: 0x039C,\n 0x83AB: 0x039D,\n 0x83AC: 0x039E,\n 0x83AD: 0x039F,\n 0x83AE: 0x03A0,\n 0x83AF: 0x03A1,\n 0x83B0: 0x03A3,\n 0x83B1: 0x03A4,\n 0x83B2: 0x03A5,\n 0x83B3: 0x03A6,\n 0x83B4: 0x03A7,\n 0x83B5: 0x03A8,\n 0x83B6: 0x03A9,\n 0x83BF: 0x03B1,\n 0x83C0: 0x03B2,\n 0x83C1: 0x03B3,\n 0x83C2: 0x03B4,\n 0x83C3: 0x03B5,\n 0x83C4: 0x03B6,\n 0x83C5: 0x03B7,\n 0x83C6: 0x03B8,\n 0x83C7: 0x03B9,\n 0x83C8: 0x03BA,\n 0x83C9: 0x03BB,\n 0x83CA: 0x03BC,\n 0x83CB: 0x03BD,\n 0x83CC: 0x03BE,\n 0x83CD: 0x03BF,\n 0x83CE: 0x03C0,\n 0x83CF: 0x03C1,\n 0x83D0: 0x03C3,\n 0x83D1: 0x03C4,\n 0x83D2: 0x03C5,\n 0x83D3: 0x03C6,\n 0x83D4: 0x03C7,\n 0x83D5: 0x03C8,\n 0x83D6: 0x03C9,\n 0x8440: 0x0410,\n 0x8441: 0x0411,\n 0x8442: 0x0412,\n 0x8443: 0x0413,\n 0x8444: 0x0414,\n 0x8445: 0x0415,\n 0x8446: 0x0401,\n 0x8447: 0x0416,\n 0x8448: 0x0417,\n 0x8449: 0x0418,\n 0x844A: 0x0419,\n 0x844B: 0x041A,\n 0x844C: 0x041B,\n 0x844D: 0x041C,\n 0x844E: 0x041D,\n 0x844F: 0x041E,\n 0x8450: 0x041F,\n 0x8451: 0x0420,\n 0x8452: 0x0421,\n 0x8453: 0x0422,\n 0x8454: 0x0423,\n 0x8455: 0x0424,\n 0x8456: 0x0425,\n 0x8457: 0x0426,\n 0x8458: 0x0427,\n 0x8459: 0x0428,\n 0x845A: 0x0429,\n 0x845B: 0x042A,\n 0x845C: 0x042B,\n 0x845D: 0x042C,\n 0x845E: 0x042D,\n 0x845F: 0x042E,\n 0x8460: 0x042F,\n 0x8470: 0x0430,\n 0x8471: 0x0431,\n 0x8472: 0x0432,\n 0x8473: 0x0433,\n 0x8474: 0x0434,\n 0x8475: 0x0435,\n 0x8476: 0x0451,\n 0x8477: 0x0436,\n 0x8478: 0x0437,\n 0x8479: 0x0438,\n 0x847A: 0x0439,\n 0x847B: 0x043A,\n 0x847C: 0x043B,\n 0x847D: 0x043C,\n 0x847E: 0x043D,\n 0x8480: 0x043E,\n 0x8481: 0x043F,\n 0x8482: 0x0440,\n 0x8483: 0x0441,\n 0x8484: 0x0442,\n 0x8485: 0x0443,\n 0x8486: 0x0444,\n 0x8487: 0x0445,\n 0x8488: 0x0446,\n 0x8489: 0x0447,\n 0x848A: 0x0448,\n 0x848B: 0x0449,\n 0x848C: 0x044A,\n 0x848D: 0x044B,\n 0x848E: 0x044C,\n 0x848F: 0x044D,\n 0x8490: 0x044E,\n 0x8491: 0x044F,\n 0x849F: 0x2500,\n 0x84A0: 0x2502,\n 0x84A1: 0x250C,\n 0x84A2: 0x2510,\n 0x84A3: 0x2518,\n 0x84A4: 0x2514,\n 0x84A5: 0x251C,\n 0x84A6: 0x252C,\n 0x84A7: 0x2524,\n 0x84A8: 0x2534,\n 0x84A9: 0x253C,\n 0x84AA: 0x2501,\n 0x84AB: 0x2503,\n 0x84AC: 0x250F,\n 0x84AD: 0x2513,\n 0x84AE: 0x251B,\n 0x84AF: 0x2517,\n 0x84B0: 0x2523,\n 0x84B1: 0x2533,\n 0x84B2: 0x252B,\n 0x84B3: 0x253B,\n 0x84B4: 0x254B,\n 0x84B5: 0x2520,\n 0x84B6: 0x252F,\n 0x84B7: 0x2528,\n 0x84B8: 0x2537,\n 0x84B9: 0x253F,\n 0x84BA: 0x251D,\n 0x84BB: 0x2530,\n 0x84BC: 0x2525,\n 0x84BD: 0x2538,\n 0x84BE: 0x2542,\n 0x889F: 0x4E9C,\n 0x88A0: 0x5516,\n 0x88A1: 0x5A03,\n 0x88A2: 0x963F,\n 0x88A3: 0x54C0,\n 0x88A4: 0x611B,\n 0x88A5: 0x6328,\n 0x88A6: 0x59F6,\n 0x88A7: 0x9022,\n 0x88A8: 0x8475,\n 0x88A9: 0x831C,\n 0x88AA: 0x7A50,\n 0x88AB: 0x60AA,\n 0x88AC: 0x63E1,\n 0x88AD: 0x6E25,\n 0x88AE: 0x65ED,\n 0x88AF: 0x8466,\n 0x88B0: 0x82A6,\n 0x88B1: 0x9BF5,\n 0x88B2: 0x6893,\n 0x88B3: 0x5727,\n 0x88B4: 0x65A1,\n 0x88B5: 0x6271,\n 0x88B6: 0x5B9B,\n 0x88B7: 0x59D0,\n 0x88B8: 0x867B,\n 0x88B9: 0x98F4,\n 0x88BA: 0x7D62,\n 0x88BB: 0x7DBE,\n 0x88BC: 0x9B8E,\n 0x88BD: 0x6216,\n 0x88BE: 0x7C9F,\n 0x88BF: 0x88B7,\n 0x88C0: 0x5B89,\n 0x88C1: 0x5EB5,\n 0x88C2: 0x6309,\n 0x88C3: 0x6697,\n 0x88C4: 0x6848,\n 0x88C5: 0x95C7,\n 0x88C6: 0x978D,\n 0x88C7: 0x674F,\n 0x88C8: 0x4EE5,\n 0x88C9: 0x4F0A,\n 0x88CA: 0x4F4D,\n 0x88CB: 0x4F9D,\n 0x88CC: 0x5049,\n 0x88CD: 0x56F2,\n 0x88CE: 0x5937,\n 0x88CF: 0x59D4,\n 0x88D0: 0x5A01,\n 0x88D1: 0x5C09,\n 0x88D2: 0x60DF,\n 0x88D3: 0x610F,\n 0x88D4: 0x6170,\n 0x88D5: 0x6613,\n 0x88D6: 0x6905,\n 0x88D7: 0x70BA,\n 0x88D8: 0x754F,\n 0x88D9: 0x7570,\n 0x88DA: 0x79FB,\n 0x88DB: 0x7DAD,\n 0x88DC: 0x7DEF,\n 0x88DD: 0x80C3,\n 0x88DE: 0x840E,\n 0x88DF: 0x8863,\n 0x88E0: 0x8B02,\n 0x88E1: 0x9055,\n 0x88E2: 0x907A,\n 0x88E3: 0x533B,\n 0x88E4: 0x4E95,\n 0x88E5: 0x4EA5,\n 0x88E6: 0x57DF,\n 0x88E7: 0x80B2,\n 0x88E8: 0x90C1,\n 0x88E9: 0x78EF,\n 0x88EA: 0x4E00,\n 0x88EB: 0x58F1,\n 0x88EC: 0x6EA2,\n 0x88ED: 0x9038,\n 0x88EE: 0x7A32,\n 0x88EF: 0x8328,\n 0x88F0: 0x828B,\n 0x88F1: 0x9C2F,\n 0x88F2: 0x5141,\n 0x88F3: 0x5370,\n 0x88F4: 0x54BD,\n 0x88F5: 0x54E1,\n 0x88F6: 0x56E0,\n 0x88F7: 0x59FB,\n 0x88F8: 0x5F15,\n 0x88F9: 0x98F2,\n 0x88FA: 0x6DEB,\n 0x88FB: 0x80E4,\n 0x88FC: 0x852D,\n 0x8940: 0x9662,\n 0x8941: 0x9670,\n 0x8942: 0x96A0,\n 0x8943: 0x97FB,\n 0x8944: 0x540B,\n 0x8945: 0x53F3,\n 0x8946: 0x5B87,\n 0x8947: 0x70CF,\n 0x8948: 0x7FBD,\n 0x8949: 0x8FC2,\n 0x894A: 0x96E8,\n 0x894B: 0x536F,\n 0x894C: 0x9D5C,\n 0x894D: 0x7ABA,\n 0x894E: 0x4E11,\n 0x894F: 0x7893,\n 0x8950: 0x81FC,\n 0x8951: 0x6E26,\n 0x8952: 0x5618,\n 0x8953: 0x5504,\n 0x8954: 0x6B1D,\n 0x8955: 0x851A,\n 0x8956: 0x9C3B,\n 0x8957: 0x59E5,\n 0x8958: 0x53A9,\n 0x8959: 0x6D66,\n 0x895A: 0x74DC,\n 0x895B: 0x958F,\n 0x895C: 0x5642,\n 0x895D: 0x4E91,\n 0x895E: 0x904B,\n 0x895F: 0x96F2,\n 0x8960: 0x834F,\n 0x8961: 0x990C,\n 0x8962: 0x53E1,\n 0x8963: 0x55B6,\n 0x8964: 0x5B30,\n 0x8965: 0x5F71,\n 0x8966: 0x6620,\n 0x8967: 0x66F3,\n 0x8968: 0x6804,\n 0x8969: 0x6C38,\n 0x896A: 0x6CF3,\n 0x896B: 0x6D29,\n 0x896C: 0x745B,\n 0x896D: 0x76C8,\n 0x896E: 0x7A4E,\n 0x896F: 0x9834,\n 0x8970: 0x82F1,\n 0x8971: 0x885B,\n 0x8972: 0x8A60,\n 0x8973: 0x92ED,\n 0x8974: 0x6DB2,\n 0x8975: 0x75AB,\n 0x8976: 0x76CA,\n 0x8977: 0x99C5,\n 0x8978: 0x60A6,\n 0x8979: 0x8B01,\n 0x897A: 0x8D8A,\n 0x897B: 0x95B2,\n 0x897C: 0x698E,\n 0x897D: 0x53AD,\n 0x897E: 0x5186,\n 0x8980: 0x5712,\n 0x8981: 0x5830,\n 0x8982: 0x5944,\n 0x8983: 0x5BB4,\n 0x8984: 0x5EF6,\n 0x8985: 0x6028,\n 0x8986: 0x63A9,\n 0x8987: 0x63F4,\n 0x8988: 0x6CBF,\n 0x8989: 0x6F14,\n 0x898A: 0x708E,\n 0x898B: 0x7114,\n 0x898C: 0x7159,\n 0x898D: 0x71D5,\n 0x898E: 0x733F,\n 0x898F: 0x7E01,\n 0x8990: 0x8276,\n 0x8991: 0x82D1,\n 0x8992: 0x8597,\n 0x8993: 0x9060,\n 0x8994: 0x925B,\n 0x8995: 0x9D1B,\n 0x8996: 0x5869,\n 0x8997: 0x65BC,\n 0x8998: 0x6C5A,\n 0x8999: 0x7525,\n 0x899A: 0x51F9,\n 0x899B: 0x592E,\n 0x899C: 0x5965,\n 0x899D: 0x5F80,\n 0x899E: 0x5FDC,\n 0x899F: 0x62BC,\n 0x89A0: 0x65FA,\n 0x89A1: 0x6A2A,\n 0x89A2: 0x6B27,\n 0x89A3: 0x6BB4,\n 0x89A4: 0x738B,\n 0x89A5: 0x7FC1,\n 0x89A6: 0x8956,\n 0x89A7: 0x9D2C,\n 0x89A8: 0x9D0E,\n 0x89A9: 0x9EC4,\n 0x89AA: 0x5CA1,\n 0x89AB: 0x6C96,\n 0x89AC: 0x837B,\n 0x89AD: 0x5104,\n 0x89AE: 0x5C4B,\n 0x89AF: 0x61B6,\n 0x89B0: 0x81C6,\n 0x89B1: 0x6876,\n 0x89B2: 0x7261,\n 0x89B3: 0x4E59,\n 0x89B4: 0x4FFA,\n 0x89B5: 0x5378,\n 0x89B6: 0x6069,\n 0x89B7: 0x6E29,\n 0x89B8: 0x7A4F,\n 0x89B9: 0x97F3,\n 0x89BA: 0x4E0B,\n 0x89BB: 0x5316,\n 0x89BC: 0x4EEE,\n 0x89BD: 0x4F55,\n 0x89BE: 0x4F3D,\n 0x89BF: 0x4FA1,\n 0x89C0: 0x4F73,\n 0x89C1: 0x52A0,\n 0x89C2: 0x53EF,\n 0x89C3: 0x5609,\n 0x89C4: 0x590F,\n 0x89C5: 0x5AC1,\n 0x89C6: 0x5BB6,\n 0x89C7: 0x5BE1,\n 0x89C8: 0x79D1,\n 0x89C9: 0x6687,\n 0x89CA: 0x679C,\n 0x89CB: 0x67B6,\n 0x89CC: 0x6B4C,\n 0x89CD: 0x6CB3,\n 0x89CE: 0x706B,\n 0x89CF: 0x73C2,\n 0x89D0: 0x798D,\n 0x89D1: 0x79BE,\n 0x89D2: 0x7A3C,\n 0x89D3: 0x7B87,\n 0x89D4: 0x82B1,\n 0x89D5: 0x82DB,\n 0x89D6: 0x8304,\n 0x89D7: 0x8377,\n 0x89D8: 0x83EF,\n 0x89D9: 0x83D3,\n 0x89DA: 0x8766,\n 0x89DB: 0x8AB2,\n 0x89DC: 0x5629,\n 0x89DD: 0x8CA8,\n 0x89DE: 0x8FE6,\n 0x89DF: 0x904E,\n 0x89E0: 0x971E,\n 0x89E1: 0x868A,\n 0x89E2: 0x4FC4,\n 0x89E3: 0x5CE8,\n 0x89E4: 0x6211,\n 0x89E5: 0x7259,\n 0x89E6: 0x753B,\n 0x89E7: 0x81E5,\n 0x89E8: 0x82BD,\n 0x89E9: 0x86FE,\n 0x89EA: 0x8CC0,\n 0x89EB: 0x96C5,\n 0x89EC: 0x9913,\n 0x89ED: 0x99D5,\n 0x89EE: 0x4ECB,\n 0x89EF: 0x4F1A,\n 0x89F0: 0x89E3,\n 0x89F1: 0x56DE,\n 0x89F2: 0x584A,\n 0x89F3: 0x58CA,\n 0x89F4: 0x5EFB,\n 0x89F5: 0x5FEB,\n 0x89F6: 0x602A,\n 0x89F7: 0x6094,\n 0x89F8: 0x6062,\n 0x89F9: 0x61D0,\n 0x89FA: 0x6212,\n 0x89FB: 0x62D0,\n 0x89FC: 0x6539,\n 0x8A40: 0x9B41,\n 0x8A41: 0x6666,\n 0x8A42: 0x68B0,\n 0x8A43: 0x6D77,\n 0x8A44: 0x7070,\n 0x8A45: 0x754C,\n 0x8A46: 0x7686,\n 0x8A47: 0x7D75,\n 0x8A48: 0x82A5,\n 0x8A49: 0x87F9,\n 0x8A4A: 0x958B,\n 0x8A4B: 0x968E,\n 0x8A4C: 0x8C9D,\n 0x8A4D: 0x51F1,\n 0x8A4E: 0x52BE,\n 0x8A4F: 0x5916,\n 0x8A50: 0x54B3,\n 0x8A51: 0x5BB3,\n 0x8A52: 0x5D16,\n 0x8A53: 0x6168,\n 0x8A54: 0x6982,\n 0x8A55: 0x6DAF,\n 0x8A56: 0x788D,\n 0x8A57: 0x84CB,\n 0x8A58: 0x8857,\n 0x8A59: 0x8A72,\n 0x8A5A: 0x93A7,\n 0x8A5B: 0x9AB8,\n 0x8A5C: 0x6D6C,\n 0x8A5D: 0x99A8,\n 0x8A5E: 0x86D9,\n 0x8A5F: 0x57A3,\n 0x8A60: 0x67FF,\n 0x8A61: 0x86CE,\n 0x8A62: 0x920E,\n 0x8A63: 0x5283,\n 0x8A64: 0x5687,\n 0x8A65: 0x5404,\n 0x8A66: 0x5ED3,\n 0x8A67: 0x62E1,\n 0x8A68: 0x64B9,\n 0x8A69: 0x683C,\n 0x8A6A: 0x6838,\n 0x8A6B: 0x6BBB,\n 0x8A6C: 0x7372,\n 0x8A6D: 0x78BA,\n 0x8A6E: 0x7A6B,\n 0x8A6F: 0x899A,\n 0x8A70: 0x89D2,\n 0x8A71: 0x8D6B,\n 0x8A72: 0x8F03,\n 0x8A73: 0x90ED,\n 0x8A74: 0x95A3,\n 0x8A75: 0x9694,\n 0x8A76: 0x9769,\n 0x8A77: 0x5B66,\n 0x8A78: 0x5CB3,\n 0x8A79: 0x697D,\n 0x8A7A: 0x984D,\n 0x8A7B: 0x984E,\n 0x8A7C: 0x639B,\n 0x8A7D: 0x7B20,\n 0x8A7E: 0x6A2B,\n 0x8A80: 0x6A7F,\n 0x8A81: 0x68B6,\n 0x8A82: 0x9C0D,\n 0x8A83: 0x6F5F,\n 0x8A84: 0x5272,\n 0x8A85: 0x559D,\n 0x8A86: 0x6070,\n 0x8A87: 0x62EC,\n 0x8A88: 0x6D3B,\n 0x8A89: 0x6E07,\n 0x8A8A: 0x6ED1,\n 0x8A8B: 0x845B,\n 0x8A8C: 0x8910,\n 0x8A8D: 0x8F44,\n 0x8A8E: 0x4E14,\n 0x8A8F: 0x9C39,\n 0x8A90: 0x53F6,\n 0x8A91: 0x691B,\n 0x8A92: 0x6A3A,\n 0x8A93: 0x9784,\n 0x8A94: 0x682A,\n 0x8A95: 0x515C,\n 0x8A96: 0x7AC3,\n 0x8A97: 0x84B2,\n 0x8A98: 0x91DC,\n 0x8A99: 0x938C,\n 0x8A9A: 0x565B,\n 0x8A9B: 0x9D28,\n 0x8A9C: 0x6822,\n 0x8A9D: 0x8305,\n 0x8A9E: 0x8431,\n 0x8A9F: 0x7CA5,\n 0x8AA0: 0x5208,\n 0x8AA1: 0x82C5,\n 0x8AA2: 0x74E6,\n 0x8AA3: 0x4E7E,\n 0x8AA4: 0x4F83,\n 0x8AA5: 0x51A0,\n 0x8AA6: 0x5BD2,\n 0x8AA7: 0x520A,\n 0x8AA8: 0x52D8,\n 0x8AA9: 0x52E7,\n 0x8AAA: 0x5DFB,\n 0x8AAB: 0x559A,\n 0x8AAC: 0x582A,\n 0x8AAD: 0x59E6,\n 0x8AAE: 0x5B8C,\n 0x8AAF: 0x5B98,\n 0x8AB0: 0x5BDB,\n 0x8AB1: 0x5E72,\n 0x8AB2: 0x5E79,\n 0x8AB3: 0x60A3,\n 0x8AB4: 0x611F,\n 0x8AB5: 0x6163,\n 0x8AB6: 0x61BE,\n 0x8AB7: 0x63DB,\n 0x8AB8: 0x6562,\n 0x8AB9: 0x67D1,\n 0x8ABA: 0x6853,\n 0x8ABB: 0x68FA,\n 0x8ABC: 0x6B3E,\n 0x8ABD: 0x6B53,\n 0x8ABE: 0x6C57,\n 0x8ABF: 0x6F22,\n 0x8AC0: 0x6F97,\n 0x8AC1: 0x6F45,\n 0x8AC2: 0x74B0,\n 0x8AC3: 0x7518,\n 0x8AC4: 0x76E3,\n 0x8AC5: 0x770B,\n 0x8AC6: 0x7AFF,\n 0x8AC7: 0x7BA1,\n 0x8AC8: 0x7C21,\n 0x8AC9: 0x7DE9,\n 0x8ACA: 0x7F36,\n 0x8ACB: 0x7FF0,\n 0x8ACC: 0x809D,\n 0x8ACD: 0x8266,\n 0x8ACE: 0x839E,\n 0x8ACF: 0x89B3,\n 0x8AD0: 0x8ACC,\n 0x8AD1: 0x8CAB,\n 0x8AD2: 0x9084,\n 0x8AD3: 0x9451,\n 0x8AD4: 0x9593,\n 0x8AD5: 0x9591,\n 0x8AD6: 0x95A2,\n 0x8AD7: 0x9665,\n 0x8AD8: 0x97D3,\n 0x8AD9: 0x9928,\n 0x8ADA: 0x8218,\n 0x8ADB: 0x4E38,\n 0x8ADC: 0x542B,\n 0x8ADD: 0x5CB8,\n 0x8ADE: 0x5DCC,\n 0x8ADF: 0x73A9,\n 0x8AE0: 0x764C,\n 0x8AE1: 0x773C,\n 0x8AE2: 0x5CA9,\n 0x8AE3: 0x7FEB,\n 0x8AE4: 0x8D0B,\n 0x8AE5: 0x96C1,\n 0x8AE6: 0x9811,\n 0x8AE7: 0x9854,\n 0x8AE8: 0x9858,\n 0x8AE9: 0x4F01,\n 0x8AEA: 0x4F0E,\n 0x8AEB: 0x5371,\n 0x8AEC: 0x559C,\n 0x8AED: 0x5668,\n 0x8AEE: 0x57FA,\n 0x8AEF: 0x5947,\n 0x8AF0: 0x5B09,\n 0x8AF1: 0x5BC4,\n 0x8AF2: 0x5C90,\n 0x8AF3: 0x5E0C,\n 0x8AF4: 0x5E7E,\n 0x8AF5: 0x5FCC,\n 0x8AF6: 0x63EE,\n 0x8AF7: 0x673A,\n 0x8AF8: 0x65D7,\n 0x8AF9: 0x65E2,\n 0x8AFA: 0x671F,\n 0x8AFB: 0x68CB,\n 0x8AFC: 0x68C4,\n 0x8B40: 0x6A5F,\n 0x8B41: 0x5E30,\n 0x8B42: 0x6BC5,\n 0x8B43: 0x6C17,\n 0x8B44: 0x6C7D,\n 0x8B45: 0x757F,\n 0x8B46: 0x7948,\n 0x8B47: 0x5B63,\n 0x8B48: 0x7A00,\n 0x8B49: 0x7D00,\n 0x8B4A: 0x5FBD,\n 0x8B4B: 0x898F,\n 0x8B4C: 0x8A18,\n 0x8B4D: 0x8CB4,\n 0x8B4E: 0x8D77,\n 0x8B4F: 0x8ECC,\n 0x8B50: 0x8F1D,\n 0x8B51: 0x98E2,\n 0x8B52: 0x9A0E,\n 0x8B53: 0x9B3C,\n 0x8B54: 0x4E80,\n 0x8B55: 0x507D,\n 0x8B56: 0x5100,\n 0x8B57: 0x5993,\n 0x8B58: 0x5B9C,\n 0x8B59: 0x622F,\n 0x8B5A: 0x6280,\n 0x8B5B: 0x64EC,\n 0x8B5C: 0x6B3A,\n 0x8B5D: 0x72A0,\n 0x8B5E: 0x7591,\n 0x8B5F: 0x7947,\n 0x8B60: 0x7FA9,\n 0x8B61: 0x87FB,\n 0x8B62: 0x8ABC,\n 0x8B63: 0x8B70,\n 0x8B64: 0x63AC,\n 0x8B65: 0x83CA,\n 0x8B66: 0x97A0,\n 0x8B67: 0x5409,\n 0x8B68: 0x5403,\n 0x8B69: 0x55AB,\n 0x8B6A: 0x6854,\n 0x8B6B: 0x6A58,\n 0x8B6C: 0x8A70,\n 0x8B6D: 0x7827,\n 0x8B6E: 0x6775,\n 0x8B6F: 0x9ECD,\n 0x8B70: 0x5374,\n 0x8B71: 0x5BA2,\n 0x8B72: 0x811A,\n 0x8B73: 0x8650,\n 0x8B74: 0x9006,\n 0x8B75: 0x4E18,\n 0x8B76: 0x4E45,\n 0x8B77: 0x4EC7,\n 0x8B78: 0x4F11,\n 0x8B79: 0x53CA,\n 0x8B7A: 0x5438,\n 0x8B7B: 0x5BAE,\n 0x8B7C: 0x5F13,\n 0x8B7D: 0x6025,\n 0x8B7E: 0x6551,\n 0x8B80: 0x673D,\n 0x8B81: 0x6C42,\n 0x8B82: 0x6C72,\n 0x8B83: 0x6CE3,\n 0x8B84: 0x7078,\n 0x8B85: 0x7403,\n 0x8B86: 0x7A76,\n 0x8B87: 0x7AAE,\n 0x8B88: 0x7B08,\n 0x8B89: 0x7D1A,\n 0x8B8A: 0x7CFE,\n 0x8B8B: 0x7D66,\n 0x8B8C: 0x65E7,\n 0x8B8D: 0x725B,\n 0x8B8E: 0x53BB,\n 0x8B8F: 0x5C45,\n 0x8B90: 0x5DE8,\n 0x8B91: 0x62D2,\n 0x8B92: 0x62E0,\n 0x8B93: 0x6319,\n 0x8B94: 0x6E20,\n 0x8B95: 0x865A,\n 0x8B96: 0x8A31,\n 0x8B97: 0x8DDD,\n 0x8B98: 0x92F8,\n 0x8B99: 0x6F01,\n 0x8B9A: 0x79A6,\n 0x8B9B: 0x9B5A,\n 0x8B9C: 0x4EA8,\n 0x8B9D: 0x4EAB,\n 0x8B9E: 0x4EAC,\n 0x8B9F: 0x4F9B,\n 0x8BA0: 0x4FA0,\n 0x8BA1: 0x50D1,\n 0x8BA2: 0x5147,\n 0x8BA3: 0x7AF6,\n 0x8BA4: 0x5171,\n 0x8BA5: 0x51F6,\n 0x8BA6: 0x5354,\n 0x8BA7: 0x5321,\n 0x8BA8: 0x537F,\n 0x8BA9: 0x53EB,\n 0x8BAA: 0x55AC,\n 0x8BAB: 0x5883,\n 0x8BAC: 0x5CE1,\n 0x8BAD: 0x5F37,\n 0x8BAE: 0x5F4A,\n 0x8BAF: 0x602F,\n 0x8BB0: 0x6050,\n 0x8BB1: 0x606D,\n 0x8BB2: 0x631F,\n 0x8BB3: 0x6559,\n 0x8BB4: 0x6A4B,\n 0x8BB5: 0x6CC1,\n 0x8BB6: 0x72C2,\n 0x8BB7: 0x72ED,\n 0x8BB8: 0x77EF,\n 0x8BB9: 0x80F8,\n 0x8BBA: 0x8105,\n 0x8BBB: 0x8208,\n 0x8BBC: 0x854E,\n 0x8BBD: 0x90F7,\n 0x8BBE: 0x93E1,\n 0x8BBF: 0x97FF,\n 0x8BC0: 0x9957,\n 0x8BC1: 0x9A5A,\n 0x8BC2: 0x4EF0,\n 0x8BC3: 0x51DD,\n 0x8BC4: 0x5C2D,\n 0x8BC5: 0x6681,\n 0x8BC6: 0x696D,\n 0x8BC7: 0x5C40,\n 0x8BC8: 0x66F2,\n 0x8BC9: 0x6975,\n 0x8BCA: 0x7389,\n 0x8BCB: 0x6850,\n 0x8BCC: 0x7C81,\n 0x8BCD: 0x50C5,\n 0x8BCE: 0x52E4,\n 0x8BCF: 0x5747,\n 0x8BD0: 0x5DFE,\n 0x8BD1: 0x9326,\n 0x8BD2: 0x65A4,\n 0x8BD3: 0x6B23,\n 0x8BD4: 0x6B3D,\n 0x8BD5: 0x7434,\n 0x8BD6: 0x7981,\n 0x8BD7: 0x79BD,\n 0x8BD8: 0x7B4B,\n 0x8BD9: 0x7DCA,\n 0x8BDA: 0x82B9,\n 0x8BDB: 0x83CC,\n 0x8BDC: 0x887F,\n 0x8BDD: 0x895F,\n 0x8BDE: 0x8B39,\n 0x8BDF: 0x8FD1,\n 0x8BE0: 0x91D1,\n 0x8BE1: 0x541F,\n 0x8BE2: 0x9280,\n 0x8BE3: 0x4E5D,\n 0x8BE4: 0x5036,\n 0x8BE5: 0x53E5,\n 0x8BE6: 0x533A,\n 0x8BE7: 0x72D7,\n 0x8BE8: 0x7396,\n 0x8BE9: 0x77E9,\n 0x8BEA: 0x82E6,\n 0x8BEB: 0x8EAF,\n 0x8BEC: 0x99C6,\n 0x8BED: 0x99C8,\n 0x8BEE: 0x99D2,\n 0x8BEF: 0x5177,\n 0x8BF0: 0x611A,\n 0x8BF1: 0x865E,\n 0x8BF2: 0x55B0,\n 0x8BF3: 0x7A7A,\n 0x8BF4: 0x5076,\n 0x8BF5: 0x5BD3,\n 0x8BF6: 0x9047,\n 0x8BF7: 0x9685,\n 0x8BF8: 0x4E32,\n 0x8BF9: 0x6ADB,\n 0x8BFA: 0x91E7,\n 0x8BFB: 0x5C51,\n 0x8BFC: 0x5C48,\n 0x8C40: 0x6398,\n 0x8C41: 0x7A9F,\n 0x8C42: 0x6C93,\n 0x8C43: 0x9774,\n 0x8C44: 0x8F61,\n 0x8C45: 0x7AAA,\n 0x8C46: 0x718A,\n 0x8C47: 0x9688,\n 0x8C48: 0x7C82,\n 0x8C49: 0x6817,\n 0x8C4A: 0x7E70,\n 0x8C4B: 0x6851,\n 0x8C4C: 0x936C,\n 0x8C4D: 0x52F2,\n 0x8C4E: 0x541B,\n 0x8C4F: 0x85AB,\n 0x8C50: 0x8A13,\n 0x8C51: 0x7FA4,\n 0x8C52: 0x8ECD,\n 0x8C53: 0x90E1,\n 0x8C54: 0x5366,\n 0x8C55: 0x8888,\n 0x8C56: 0x7941,\n 0x8C57: 0x4FC2,\n 0x8C58: 0x50BE,\n 0x8C59: 0x5211,\n 0x8C5A: 0x5144,\n 0x8C5B: 0x5553,\n 0x8C5C: 0x572D,\n 0x8C5D: 0x73EA,\n 0x8C5E: 0x578B,\n 0x8C5F: 0x5951,\n 0x8C60: 0x5F62,\n 0x8C61: 0x5F84,\n 0x8C62: 0x6075,\n 0x8C63: 0x6176,\n 0x8C64: 0x6167,\n 0x8C65: 0x61A9,\n 0x8C66: 0x63B2,\n 0x8C67: 0x643A,\n 0x8C68: 0x656C,\n 0x8C69: 0x666F,\n 0x8C6A: 0x6842,\n 0x8C6B: 0x6E13,\n 0x8C6C: 0x7566,\n 0x8C6D: 0x7A3D,\n 0x8C6E: 0x7CFB,\n 0x8C6F: 0x7D4C,\n 0x8C70: 0x7D99,\n 0x8C71: 0x7E4B,\n 0x8C72: 0x7F6B,\n 0x8C73: 0x830E,\n 0x8C74: 0x834A,\n 0x8C75: 0x86CD,\n 0x8C76: 0x8A08,\n 0x8C77: 0x8A63,\n 0x8C78: 0x8B66,\n 0x8C79: 0x8EFD,\n 0x8C7A: 0x981A,\n 0x8C7B: 0x9D8F,\n 0x8C7C: 0x82B8,\n 0x8C7D: 0x8FCE,\n 0x8C7E: 0x9BE8,\n 0x8C80: 0x5287,\n 0x8C81: 0x621F,\n 0x8C82: 0x6483,\n 0x8C83: 0x6FC0,\n 0x8C84: 0x9699,\n 0x8C85: 0x6841,\n 0x8C86: 0x5091,\n 0x8C87: 0x6B20,\n 0x8C88: 0x6C7A,\n 0x8C89: 0x6F54,\n 0x8C8A: 0x7A74,\n 0x8C8B: 0x7D50,\n 0x8C8C: 0x8840,\n 0x8C8D: 0x8A23,\n 0x8C8E: 0x6708,\n 0x8C8F: 0x4EF6,\n 0x8C90: 0x5039,\n 0x8C91: 0x5026,\n 0x8C92: 0x5065,\n 0x8C93: 0x517C,\n 0x8C94: 0x5238,\n 0x8C95: 0x5263,\n 0x8C96: 0x55A7,\n 0x8C97: 0x570F,\n 0x8C98: 0x5805,\n 0x8C99: 0x5ACC,\n 0x8C9A: 0x5EFA,\n 0x8C9B: 0x61B2,\n 0x8C9C: 0x61F8,\n 0x8C9D: 0x62F3,\n 0x8C9E: 0x6372,\n 0x8C9F: 0x691C,\n 0x8CA0: 0x6A29,\n 0x8CA1: 0x727D,\n 0x8CA2: 0x72AC,\n 0x8CA3: 0x732E,\n 0x8CA4: 0x7814,\n 0x8CA5: 0x786F,\n 0x8CA6: 0x7D79,\n 0x8CA7: 0x770C,\n 0x8CA8: 0x80A9,\n 0x8CA9: 0x898B,\n 0x8CAA: 0x8B19,\n 0x8CAB: 0x8CE2,\n 0x8CAC: 0x8ED2,\n 0x8CAD: 0x9063,\n 0x8CAE: 0x9375,\n 0x8CAF: 0x967A,\n 0x8CB0: 0x9855,\n 0x8CB1: 0x9A13,\n 0x8CB2: 0x9E78,\n 0x8CB3: 0x5143,\n 0x8CB4: 0x539F,\n 0x8CB5: 0x53B3,\n 0x8CB6: 0x5E7B,\n 0x8CB7: 0x5F26,\n 0x8CB8: 0x6E1B,\n 0x8CB9: 0x6E90,\n 0x8CBA: 0x7384,\n 0x8CBB: 0x73FE,\n 0x8CBC: 0x7D43,\n 0x8CBD: 0x8237,\n 0x8CBE: 0x8A00,\n 0x8CBF: 0x8AFA,\n 0x8CC0: 0x9650,\n 0x8CC1: 0x4E4E,\n 0x8CC2: 0x500B,\n 0x8CC3: 0x53E4,\n 0x8CC4: 0x547C,\n 0x8CC5: 0x56FA,\n 0x8CC6: 0x59D1,\n 0x8CC7: 0x5B64,\n 0x8CC8: 0x5DF1,\n 0x8CC9: 0x5EAB,\n 0x8CCA: 0x5F27,\n 0x8CCB: 0x6238,\n 0x8CCC: 0x6545,\n 0x8CCD: 0x67AF,\n 0x8CCE: 0x6E56,\n 0x8CCF: 0x72D0,\n 0x8CD0: 0x7CCA,\n 0x8CD1: 0x88B4,\n 0x8CD2: 0x80A1,\n 0x8CD3: 0x80E1,\n 0x8CD4: 0x83F0,\n 0x8CD5: 0x864E,\n 0x8CD6: 0x8A87,\n 0x8CD7: 0x8DE8,\n 0x8CD8: 0x9237,\n 0x8CD9: 0x96C7,\n 0x8CDA: 0x9867,\n 0x8CDB: 0x9F13,\n 0x8CDC: 0x4E94,\n 0x8CDD: 0x4E92,\n 0x8CDE: 0x4F0D,\n 0x8CDF: 0x5348,\n 0x8CE0: 0x5449,\n 0x8CE1: 0x543E,\n 0x8CE2: 0x5A2F,\n 0x8CE3: 0x5F8C,\n 0x8CE4: 0x5FA1,\n 0x8CE5: 0x609F,\n 0x8CE6: 0x68A7,\n 0x8CE7: 0x6A8E,\n 0x8CE8: 0x745A,\n 0x8CE9: 0x7881,\n 0x8CEA: 0x8A9E,\n 0x8CEB: 0x8AA4,\n 0x8CEC: 0x8B77,\n 0x8CED: 0x9190,\n 0x8CEE: 0x4E5E,\n 0x8CEF: 0x9BC9,\n 0x8CF0: 0x4EA4,\n 0x8CF1: 0x4F7C,\n 0x8CF2: 0x4FAF,\n 0x8CF3: 0x5019,\n 0x8CF4: 0x5016,\n 0x8CF5: 0x5149,\n 0x8CF6: 0x516C,\n 0x8CF7: 0x529F,\n 0x8CF8: 0x52B9,\n 0x8CF9: 0x52FE,\n 0x8CFA: 0x539A,\n 0x8CFB: 0x53E3,\n 0x8CFC: 0x5411,\n 0x8D40: 0x540E,\n 0x8D41: 0x5589,\n 0x8D42: 0x5751,\n 0x8D43: 0x57A2,\n 0x8D44: 0x597D,\n 0x8D45: 0x5B54,\n 0x8D46: 0x5B5D,\n 0x8D47: 0x5B8F,\n 0x8D48: 0x5DE5,\n 0x8D49: 0x5DE7,\n 0x8D4A: 0x5DF7,\n 0x8D4B: 0x5E78,\n 0x8D4C: 0x5E83,\n 0x8D4D: 0x5E9A,\n 0x8D4E: 0x5EB7,\n 0x8D4F: 0x5F18,\n 0x8D50: 0x6052,\n 0x8D51: 0x614C,\n 0x8D52: 0x6297,\n 0x8D53: 0x62D8,\n 0x8D54: 0x63A7,\n 0x8D55: 0x653B,\n 0x8D56: 0x6602,\n 0x8D57: 0x6643,\n 0x8D58: 0x66F4,\n 0x8D59: 0x676D,\n 0x8D5A: 0x6821,\n 0x8D5B: 0x6897,\n 0x8D5C: 0x69CB,\n 0x8D5D: 0x6C5F,\n 0x8D5E: 0x6D2A,\n 0x8D5F: 0x6D69,\n 0x8D60: 0x6E2F,\n 0x8D61: 0x6E9D,\n 0x8D62: 0x7532,\n 0x8D63: 0x7687,\n 0x8D64: 0x786C,\n 0x8D65: 0x7A3F,\n 0x8D66: 0x7CE0,\n 0x8D67: 0x7D05,\n 0x8D68: 0x7D18,\n 0x8D69: 0x7D5E,\n 0x8D6A: 0x7DB1,\n 0x8D6B: 0x8015,\n 0x8D6C: 0x8003,\n 0x8D6D: 0x80AF,\n 0x8D6E: 0x80B1,\n 0x8D6F: 0x8154,\n 0x8D70: 0x818F,\n 0x8D71: 0x822A,\n 0x8D72: 0x8352,\n 0x8D73: 0x884C,\n 0x8D74: 0x8861,\n 0x8D75: 0x8B1B,\n 0x8D76: 0x8CA2,\n 0x8D77: 0x8CFC,\n 0x8D78: 0x90CA,\n 0x8D79: 0x9175,\n 0x8D7A: 0x9271,\n 0x8D7B: 0x783F,\n 0x8D7C: 0x92FC,\n 0x8D7D: 0x95A4,\n 0x8D7E: 0x964D,\n 0x8D80: 0x9805,\n 0x8D81: 0x9999,\n 0x8D82: 0x9AD8,\n 0x8D83: 0x9D3B,\n 0x8D84: 0x525B,\n 0x8D85: 0x52AB,\n 0x8D86: 0x53F7,\n 0x8D87: 0x5408,\n 0x8D88: 0x58D5,\n 0x8D89: 0x62F7,\n 0x8D8A: 0x6FE0,\n 0x8D8B: 0x8C6A,\n 0x8D8C: 0x8F5F,\n 0x8D8D: 0x9EB9,\n 0x8D8E: 0x514B,\n 0x8D8F: 0x523B,\n 0x8D90: 0x544A,\n 0x8D91: 0x56FD,\n 0x8D92: 0x7A40,\n 0x8D93: 0x9177,\n 0x8D94: 0x9D60,\n 0x8D95: 0x9ED2,\n 0x8D96: 0x7344,\n 0x8D97: 0x6F09,\n 0x8D98: 0x8170,\n 0x8D99: 0x7511,\n 0x8D9A: 0x5FFD,\n 0x8D9B: 0x60DA,\n 0x8D9C: 0x9AA8,\n 0x8D9D: 0x72DB,\n 0x8D9E: 0x8FBC,\n 0x8D9F: 0x6B64,\n 0x8DA0: 0x9803,\n 0x8DA1: 0x4ECA,\n 0x8DA2: 0x56F0,\n 0x8DA3: 0x5764,\n 0x8DA4: 0x58BE,\n 0x8DA5: 0x5A5A,\n 0x8DA6: 0x6068,\n 0x8DA7: 0x61C7,\n 0x8DA8: 0x660F,\n 0x8DA9: 0x6606,\n 0x8DAA: 0x6839,\n 0x8DAB: 0x68B1,\n 0x8DAC: 0x6DF7,\n 0x8DAD: 0x75D5,\n 0x8DAE: 0x7D3A,\n 0x8DAF: 0x826E,\n 0x8DB0: 0x9B42,\n 0x8DB1: 0x4E9B,\n 0x8DB2: 0x4F50,\n 0x8DB3: 0x53C9,\n 0x8DB4: 0x5506,\n 0x8DB5: 0x5D6F,\n 0x8DB6: 0x5DE6,\n 0x8DB7: 0x5DEE,\n 0x8DB8: 0x67FB,\n 0x8DB9: 0x6C99,\n 0x8DBA: 0x7473,\n 0x8DBB: 0x7802,\n 0x8DBC: 0x8A50,\n 0x8DBD: 0x9396,\n 0x8DBE: 0x88DF,\n 0x8DBF: 0x5750,\n 0x8DC0: 0x5EA7,\n 0x8DC1: 0x632B,\n 0x8DC2: 0x50B5,\n 0x8DC3: 0x50AC,\n 0x8DC4: 0x518D,\n 0x8DC5: 0x6700,\n 0x8DC6: 0x54C9,\n 0x8DC7: 0x585E,\n 0x8DC8: 0x59BB,\n 0x8DC9: 0x5BB0,\n 0x8DCA: 0x5F69,\n 0x8DCB: 0x624D,\n 0x8DCC: 0x63A1,\n 0x8DCD: 0x683D,\n 0x8DCE: 0x6B73,\n 0x8DCF: 0x6E08,\n 0x8DD0: 0x707D,\n 0x8DD1: 0x91C7,\n 0x8DD2: 0x7280,\n 0x8DD3: 0x7815,\n 0x8DD4: 0x7826,\n 0x8DD5: 0x796D,\n 0x8DD6: 0x658E,\n 0x8DD7: 0x7D30,\n 0x8DD8: 0x83DC,\n 0x8DD9: 0x88C1,\n 0x8DDA: 0x8F09,\n 0x8DDB: 0x969B,\n 0x8DDC: 0x5264,\n 0x8DDD: 0x5728,\n 0x8DDE: 0x6750,\n 0x8DDF: 0x7F6A,\n 0x8DE0: 0x8CA1,\n 0x8DE1: 0x51B4,\n 0x8DE2: 0x5742,\n 0x8DE3: 0x962A,\n 0x8DE4: 0x583A,\n 0x8DE5: 0x698A,\n 0x8DE6: 0x80B4,\n 0x8DE7: 0x54B2,\n 0x8DE8: 0x5D0E,\n 0x8DE9: 0x57FC,\n 0x8DEA: 0x7895,\n 0x8DEB: 0x9DFA,\n 0x8DEC: 0x4F5C,\n 0x8DED: 0x524A,\n 0x8DEE: 0x548B,\n 0x8DEF: 0x643E,\n 0x8DF0: 0x6628,\n 0x8DF1: 0x6714,\n 0x8DF2: 0x67F5,\n 0x8DF3: 0x7A84,\n 0x8DF4: 0x7B56,\n 0x8DF5: 0x7D22,\n 0x8DF6: 0x932F,\n 0x8DF7: 0x685C,\n 0x8DF8: 0x9BAD,\n 0x8DF9: 0x7B39,\n 0x8DFA: 0x5319,\n 0x8DFB: 0x518A,\n 0x8DFC: 0x5237,\n 0x8E40: 0x5BDF,\n 0x8E41: 0x62F6,\n 0x8E42: 0x64AE,\n 0x8E43: 0x64E6,\n 0x8E44: 0x672D,\n 0x8E45: 0x6BBA,\n 0x8E46: 0x85A9,\n 0x8E47: 0x96D1,\n 0x8E48: 0x7690,\n 0x8E49: 0x9BD6,\n 0x8E4A: 0x634C,\n 0x8E4B: 0x9306,\n 0x8E4C: 0x9BAB,\n 0x8E4D: 0x76BF,\n 0x8E4E: 0x6652,\n 0x8E4F: 0x4E09,\n 0x8E50: 0x5098,\n 0x8E51: 0x53C2,\n 0x8E52: 0x5C71,\n 0x8E53: 0x60E8,\n 0x8E54: 0x6492,\n 0x8E55: 0x6563,\n 0x8E56: 0x685F,\n 0x8E57: 0x71E6,\n 0x8E58: 0x73CA,\n 0x8E59: 0x7523,\n 0x8E5A: 0x7B97,\n 0x8E5B: 0x7E82,\n 0x8E5C: 0x8695,\n 0x8E5D: 0x8B83,\n 0x8E5E: 0x8CDB,\n 0x8E5F: 0x9178,\n 0x8E60: 0x9910,\n 0x8E61: 0x65AC,\n 0x8E62: 0x66AB,\n 0x8E63: 0x6B8B,\n 0x8E64: 0x4ED5,\n 0x8E65: 0x4ED4,\n 0x8E66: 0x4F3A,\n 0x8E67: 0x4F7F,\n 0x8E68: 0x523A,\n 0x8E69: 0x53F8,\n 0x8E6A: 0x53F2,\n 0x8E6B: 0x55E3,\n 0x8E6C: 0x56DB,\n 0x8E6D: 0x58EB,\n 0x8E6E: 0x59CB,\n 0x8E6F: 0x59C9,\n 0x8E70: 0x59FF,\n 0x8E71: 0x5B50,\n 0x8E72: 0x5C4D,\n 0x8E73: 0x5E02,\n 0x8E74: 0x5E2B,\n 0x8E75: 0x5FD7,\n 0x8E76: 0x601D,\n 0x8E77: 0x6307,\n 0x8E78: 0x652F,\n 0x8E79: 0x5B5C,\n 0x8E7A: 0x65AF,\n 0x8E7B: 0x65BD,\n 0x8E7C: 0x65E8,\n 0x8E7D: 0x679D,\n 0x8E7E: 0x6B62,\n 0x8E80: 0x6B7B,\n 0x8E81: 0x6C0F,\n 0x8E82: 0x7345,\n 0x8E83: 0x7949,\n 0x8E84: 0x79C1,\n 0x8E85: 0x7CF8,\n 0x8E86: 0x7D19,\n 0x8E87: 0x7D2B,\n 0x8E88: 0x80A2,\n 0x8E89: 0x8102,\n 0x8E8A: 0x81F3,\n 0x8E8B: 0x8996,\n 0x8E8C: 0x8A5E,\n 0x8E8D: 0x8A69,\n 0x8E8E: 0x8A66,\n 0x8E8F: 0x8A8C,\n 0x8E90: 0x8AEE,\n 0x8E91: 0x8CC7,\n 0x8E92: 0x8CDC,\n 0x8E93: 0x96CC,\n 0x8E94: 0x98FC,\n 0x8E95: 0x6B6F,\n 0x8E96: 0x4E8B,\n 0x8E97: 0x4F3C,\n 0x8E98: 0x4F8D,\n 0x8E99: 0x5150,\n 0x8E9A: 0x5B57,\n 0x8E9B: 0x5BFA,\n 0x8E9C: 0x6148,\n 0x8E9D: 0x6301,\n 0x8E9E: 0x6642,\n 0x8E9F: 0x6B21,\n 0x8EA0: 0x6ECB,\n 0x8EA1: 0x6CBB,\n 0x8EA2: 0x723E,\n 0x8EA3: 0x74BD,\n 0x8EA4: 0x75D4,\n 0x8EA5: 0x78C1,\n 0x8EA6: 0x793A,\n 0x8EA7: 0x800C,\n 0x8EA8: 0x8033,\n 0x8EA9: 0x81EA,\n 0x8EAA: 0x8494,\n 0x8EAB: 0x8F9E,\n 0x8EAC: 0x6C50,\n 0x8EAD: 0x9E7F,\n 0x8EAE: 0x5F0F,\n 0x8EAF: 0x8B58,\n 0x8EB0: 0x9D2B,\n 0x8EB1: 0x7AFA,\n 0x8EB2: 0x8EF8,\n 0x8EB3: 0x5B8D,\n 0x8EB4: 0x96EB,\n 0x8EB5: 0x4E03,\n 0x8EB6: 0x53F1,\n 0x8EB7: 0x57F7,\n 0x8EB8: 0x5931,\n 0x8EB9: 0x5AC9,\n 0x8EBA: 0x5BA4,\n 0x8EBB: 0x6089,\n 0x8EBC: 0x6E7F,\n 0x8EBD: 0x6F06,\n 0x8EBE: 0x75BE,\n 0x8EBF: 0x8CEA,\n 0x8EC0: 0x5B9F,\n 0x8EC1: 0x8500,\n 0x8EC2: 0x7BE0,\n 0x8EC3: 0x5072,\n 0x8EC4: 0x67F4,\n 0x8EC5: 0x829D,\n 0x8EC6: 0x5C61,\n 0x8EC7: 0x854A,\n 0x8EC8: 0x7E1E,\n 0x8EC9: 0x820E,\n 0x8ECA: 0x5199,\n 0x8ECB: 0x5C04,\n 0x8ECC: 0x6368,\n 0x8ECD: 0x8D66,\n 0x8ECE: 0x659C,\n 0x8ECF: 0x716E,\n 0x8ED0: 0x793E,\n 0x8ED1: 0x7D17,\n 0x8ED2: 0x8005,\n 0x8ED3: 0x8B1D,\n 0x8ED4: 0x8ECA,\n 0x8ED5: 0x906E,\n 0x8ED6: 0x86C7,\n 0x8ED7: 0x90AA,\n 0x8ED8: 0x501F,\n 0x8ED9: 0x52FA,\n 0x8EDA: 0x5C3A,\n 0x8EDB: 0x6753,\n 0x8EDC: 0x707C,\n 0x8EDD: 0x7235,\n 0x8EDE: 0x914C,\n 0x8EDF: 0x91C8,\n 0x8EE0: 0x932B,\n 0x8EE1: 0x82E5,\n 0x8EE2: 0x5BC2,\n 0x8EE3: 0x5F31,\n 0x8EE4: 0x60F9,\n 0x8EE5: 0x4E3B,\n 0x8EE6: 0x53D6,\n 0x8EE7: 0x5B88,\n 0x8EE8: 0x624B,\n 0x8EE9: 0x6731,\n 0x8EEA: 0x6B8A,\n 0x8EEB: 0x72E9,\n 0x8EEC: 0x73E0,\n 0x8EED: 0x7A2E,\n 0x8EEE: 0x816B,\n 0x8EEF: 0x8DA3,\n 0x8EF0: 0x9152,\n 0x8EF1: 0x9996,\n 0x8EF2: 0x5112,\n 0x8EF3: 0x53D7,\n 0x8EF4: 0x546A,\n 0x8EF5: 0x5BFF,\n 0x8EF6: 0x6388,\n 0x8EF7: 0x6A39,\n 0x8EF8: 0x7DAC,\n 0x8EF9: 0x9700,\n 0x8EFA: 0x56DA,\n 0x8EFB: 0x53CE,\n 0x8EFC: 0x5468,\n 0x8F40: 0x5B97,\n 0x8F41: 0x5C31,\n 0x8F42: 0x5DDE,\n 0x8F43: 0x4FEE,\n 0x8F44: 0x6101,\n 0x8F45: 0x62FE,\n 0x8F46: 0x6D32,\n 0x8F47: 0x79C0,\n 0x8F48: 0x79CB,\n 0x8F49: 0x7D42,\n 0x8F4A: 0x7E4D,\n 0x8F4B: 0x7FD2,\n 0x8F4C: 0x81ED,\n 0x8F4D: 0x821F,\n 0x8F4E: 0x8490,\n 0x8F4F: 0x8846,\n 0x8F50: 0x8972,\n 0x8F51: 0x8B90,\n 0x8F52: 0x8E74,\n 0x8F53: 0x8F2F,\n 0x8F54: 0x9031,\n 0x8F55: 0x914B,\n 0x8F56: 0x916C,\n 0x8F57: 0x96C6,\n 0x8F58: 0x919C,\n 0x8F59: 0x4EC0,\n 0x8F5A: 0x4F4F,\n 0x8F5B: 0x5145,\n 0x8F5C: 0x5341,\n 0x8F5D: 0x5F93,\n 0x8F5E: 0x620E,\n 0x8F5F: 0x67D4,\n 0x8F60: 0x6C41,\n 0x8F61: 0x6E0B,\n 0x8F62: 0x7363,\n 0x8F63: 0x7E26,\n 0x8F64: 0x91CD,\n 0x8F65: 0x9283,\n 0x8F66: 0x53D4,\n 0x8F67: 0x5919,\n 0x8F68: 0x5BBF,\n 0x8F69: 0x6DD1,\n 0x8F6A: 0x795D,\n 0x8F6B: 0x7E2E,\n 0x8F6C: 0x7C9B,\n 0x8F6D: 0x587E,\n 0x8F6E: 0x719F,\n 0x8F6F: 0x51FA,\n 0x8F70: 0x8853,\n 0x8F71: 0x8FF0,\n 0x8F72: 0x4FCA,\n 0x8F73: 0x5CFB,\n 0x8F74: 0x6625,\n 0x8F75: 0x77AC,\n 0x8F76: 0x7AE3,\n 0x8F77: 0x821C,\n 0x8F78: 0x99FF,\n 0x8F79: 0x51C6,\n 0x8F7A: 0x5FAA,\n 0x8F7B: 0x65EC,\n 0x8F7C: 0x696F,\n 0x8F7D: 0x6B89,\n 0x8F7E: 0x6DF3,\n 0x8F80: 0x6E96,\n 0x8F81: 0x6F64,\n 0x8F82: 0x76FE,\n 0x8F83: 0x7D14,\n 0x8F84: 0x5DE1,\n 0x8F85: 0x9075,\n 0x8F86: 0x9187,\n 0x8F87: 0x9806,\n 0x8F88: 0x51E6,\n 0x8F89: 0x521D,\n 0x8F8A: 0x6240,\n 0x8F8B: 0x6691,\n 0x8F8C: 0x66D9,\n 0x8F8D: 0x6E1A,\n 0x8F8E: 0x5EB6,\n 0x8F8F: 0x7DD2,\n 0x8F90: 0x7F72,\n 0x8F91: 0x66F8,\n 0x8F92: 0x85AF,\n 0x8F93: 0x85F7,\n 0x8F94: 0x8AF8,\n 0x8F95: 0x52A9,\n 0x8F96: 0x53D9,\n 0x8F97: 0x5973,\n 0x8F98: 0x5E8F,\n 0x8F99: 0x5F90,\n 0x8F9A: 0x6055,\n 0x8F9B: 0x92E4,\n 0x8F9C: 0x9664,\n 0x8F9D: 0x50B7,\n 0x8F9E: 0x511F,\n 0x8F9F: 0x52DD,\n 0x8FA0: 0x5320,\n 0x8FA1: 0x5347,\n 0x8FA2: 0x53EC,\n 0x8FA3: 0x54E8,\n 0x8FA4: 0x5546,\n 0x8FA5: 0x5531,\n 0x8FA6: 0x5617,\n 0x8FA7: 0x5968,\n 0x8FA8: 0x59BE,\n 0x8FA9: 0x5A3C,\n 0x8FAA: 0x5BB5,\n 0x8FAB: 0x5C06,\n 0x8FAC: 0x5C0F,\n 0x8FAD: 0x5C11,\n 0x8FAE: 0x5C1A,\n 0x8FAF: 0x5E84,\n 0x8FB0: 0x5E8A,\n 0x8FB1: 0x5EE0,\n 0x8FB2: 0x5F70,\n 0x8FB3: 0x627F,\n 0x8FB4: 0x6284,\n 0x8FB5: 0x62DB,\n 0x8FB6: 0x638C,\n 0x8FB7: 0x6377,\n 0x8FB8: 0x6607,\n 0x8FB9: 0x660C,\n 0x8FBA: 0x662D,\n 0x8FBB: 0x6676,\n 0x8FBC: 0x677E,\n 0x8FBD: 0x68A2,\n 0x8FBE: 0x6A1F,\n 0x8FBF: 0x6A35,\n 0x8FC0: 0x6CBC,\n 0x8FC1: 0x6D88,\n 0x8FC2: 0x6E09,\n 0x8FC3: 0x6E58,\n 0x8FC4: 0x713C,\n 0x8FC5: 0x7126,\n 0x8FC6: 0x7167,\n 0x8FC7: 0x75C7,\n 0x8FC8: 0x7701,\n 0x8FC9: 0x785D,\n 0x8FCA: 0x7901,\n 0x8FCB: 0x7965,\n 0x8FCC: 0x79F0,\n 0x8FCD: 0x7AE0,\n 0x8FCE: 0x7B11,\n 0x8FCF: 0x7CA7,\n 0x8FD0: 0x7D39,\n 0x8FD1: 0x8096,\n 0x8FD2: 0x83D6,\n 0x8FD3: 0x848B,\n 0x8FD4: 0x8549,\n 0x8FD5: 0x885D,\n 0x8FD6: 0x88F3,\n 0x8FD7: 0x8A1F,\n 0x8FD8: 0x8A3C,\n 0x8FD9: 0x8A54,\n 0x8FDA: 0x8A73,\n 0x8FDB: 0x8C61,\n 0x8FDC: 0x8CDE,\n 0x8FDD: 0x91A4,\n 0x8FDE: 0x9266,\n 0x8FDF: 0x937E,\n 0x8FE0: 0x9418,\n 0x8FE1: 0x969C,\n 0x8FE2: 0x9798,\n 0x8FE3: 0x4E0A,\n 0x8FE4: 0x4E08,\n 0x8FE5: 0x4E1E,\n 0x8FE6: 0x4E57,\n 0x8FE7: 0x5197,\n 0x8FE8: 0x5270,\n 0x8FE9: 0x57CE,\n 0x8FEA: 0x5834,\n 0x8FEB: 0x58CC,\n 0x8FEC: 0x5B22,\n 0x8FED: 0x5E38,\n 0x8FEE: 0x60C5,\n 0x8FEF: 0x64FE,\n 0x8FF0: 0x6761,\n 0x8FF1: 0x6756,\n 0x8FF2: 0x6D44,\n 0x8FF3: 0x72B6,\n 0x8FF4: 0x7573,\n 0x8FF5: 0x7A63,\n 0x8FF6: 0x84B8,\n 0x8FF7: 0x8B72,\n 0x8FF8: 0x91B8,\n 0x8FF9: 0x9320,\n 0x8FFA: 0x5631,\n 0x8FFB: 0x57F4,\n 0x8FFC: 0x98FE,\n 0x9040: 0x62ED,\n 0x9041: 0x690D,\n 0x9042: 0x6B96,\n 0x9043: 0x71ED,\n 0x9044: 0x7E54,\n 0x9045: 0x8077,\n 0x9046: 0x8272,\n 0x9047: 0x89E6,\n 0x9048: 0x98DF,\n 0x9049: 0x8755,\n 0x904A: 0x8FB1,\n 0x904B: 0x5C3B,\n 0x904C: 0x4F38,\n 0x904D: 0x4FE1,\n 0x904E: 0x4FB5,\n 0x904F: 0x5507,\n 0x9050: 0x5A20,\n 0x9051: 0x5BDD,\n 0x9052: 0x5BE9,\n 0x9053: 0x5FC3,\n 0x9054: 0x614E,\n 0x9055: 0x632F,\n 0x9056: 0x65B0,\n 0x9057: 0x664B,\n 0x9058: 0x68EE,\n 0x9059: 0x699B,\n 0x905A: 0x6D78,\n 0x905B: 0x6DF1,\n 0x905C: 0x7533,\n 0x905D: 0x75B9,\n 0x905E: 0x771F,\n 0x905F: 0x795E,\n 0x9060: 0x79E6,\n 0x9061: 0x7D33,\n 0x9062: 0x81E3,\n 0x9063: 0x82AF,\n 0x9064: 0x85AA,\n 0x9065: 0x89AA,\n 0x9066: 0x8A3A,\n 0x9067: 0x8EAB,\n 0x9068: 0x8F9B,\n 0x9069: 0x9032,\n 0x906A: 0x91DD,\n 0x906B: 0x9707,\n 0x906C: 0x4EBA,\n 0x906D: 0x4EC1,\n 0x906E: 0x5203,\n 0x906F: 0x5875,\n 0x9070: 0x58EC,\n 0x9071: 0x5C0B,\n 0x9072: 0x751A,\n 0x9073: 0x5C3D,\n 0x9074: 0x814E,\n 0x9075: 0x8A0A,\n 0x9076: 0x8FC5,\n 0x9077: 0x9663,\n 0x9078: 0x976D,\n 0x9079: 0x7B25,\n 0x907A: 0x8ACF,\n 0x907B: 0x9808,\n 0x907C: 0x9162,\n 0x907D: 0x56F3,\n 0x907E: 0x53A8,\n 0x9080: 0x9017,\n 0x9081: 0x5439,\n 0x9082: 0x5782,\n 0x9083: 0x5E25,\n 0x9084: 0x63A8,\n 0x9085: 0x6C34,\n 0x9086: 0x708A,\n 0x9087: 0x7761,\n 0x9088: 0x7C8B,\n 0x9089: 0x7FE0,\n 0x908A: 0x8870,\n 0x908B: 0x9042,\n 0x908C: 0x9154,\n 0x908D: 0x9310,\n 0x908E: 0x9318,\n 0x908F: 0x968F,\n 0x9090: 0x745E,\n 0x9091: 0x9AC4,\n 0x9092: 0x5D07,\n 0x9093: 0x5D69,\n 0x9094: 0x6570,\n 0x9095: 0x67A2,\n 0x9096: 0x8DA8,\n 0x9097: 0x96DB,\n 0x9098: 0x636E,\n 0x9099: 0x6749,\n 0x909A: 0x6919,\n 0x909B: 0x83C5,\n 0x909C: 0x9817,\n 0x909D: 0x96C0,\n 0x909E: 0x88FE,\n 0x909F: 0x6F84,\n 0x90A0: 0x647A,\n 0x90A1: 0x5BF8,\n 0x90A2: 0x4E16,\n 0x90A3: 0x702C,\n 0x90A4: 0x755D,\n 0x90A5: 0x662F,\n 0x90A6: 0x51C4,\n 0x90A7: 0x5236,\n 0x90A8: 0x52E2,\n 0x90A9: 0x59D3,\n 0x90AA: 0x5F81,\n 0x90AB: 0x6027,\n 0x90AC: 0x6210,\n 0x90AD: 0x653F,\n 0x90AE: 0x6574,\n 0x90AF: 0x661F,\n 0x90B0: 0x6674,\n 0x90B1: 0x68F2,\n 0x90B2: 0x6816,\n 0x90B3: 0x6B63,\n 0x90B4: 0x6E05,\n 0x90B5: 0x7272,\n 0x90B6: 0x751F,\n 0x90B7: 0x76DB,\n 0x90B8: 0x7CBE,\n 0x90B9: 0x8056,\n 0x90BA: 0x58F0,\n 0x90BB: 0x88FD,\n 0x90BC: 0x897F,\n 0x90BD: 0x8AA0,\n 0x90BE: 0x8A93,\n 0x90BF: 0x8ACB,\n 0x90C0: 0x901D,\n 0x90C1: 0x9192,\n 0x90C2: 0x9752,\n 0x90C3: 0x9759,\n 0x90C4: 0x6589,\n 0x90C5: 0x7A0E,\n 0x90C6: 0x8106,\n 0x90C7: 0x96BB,\n 0x90C8: 0x5E2D,\n 0x90C9: 0x60DC,\n 0x90CA: 0x621A,\n 0x90CB: 0x65A5,\n 0x90CC: 0x6614,\n 0x90CD: 0x6790,\n 0x90CE: 0x77F3,\n 0x90CF: 0x7A4D,\n 0x90D0: 0x7C4D,\n 0x90D1: 0x7E3E,\n 0x90D2: 0x810A,\n 0x90D3: 0x8CAC,\n 0x90D4: 0x8D64,\n 0x90D5: 0x8DE1,\n 0x90D6: 0x8E5F,\n 0x90D7: 0x78A9,\n 0x90D8: 0x5207,\n 0x90D9: 0x62D9,\n 0x90DA: 0x63A5,\n 0x90DB: 0x6442,\n 0x90DC: 0x6298,\n 0x90DD: 0x8A2D,\n 0x90DE: 0x7A83,\n 0x90DF: 0x7BC0,\n 0x90E0: 0x8AAC,\n 0x90E1: 0x96EA,\n 0x90E2: 0x7D76,\n 0x90E3: 0x820C,\n 0x90E4: 0x8749,\n 0x90E5: 0x4ED9,\n 0x90E6: 0x5148,\n 0x90E7: 0x5343,\n 0x90E8: 0x5360,\n 0x90E9: 0x5BA3,\n 0x90EA: 0x5C02,\n 0x90EB: 0x5C16,\n 0x90EC: 0x5DDD,\n 0x90ED: 0x6226,\n 0x90EE: 0x6247,\n 0x90EF: 0x64B0,\n 0x90F0: 0x6813,\n 0x90F1: 0x6834,\n 0x90F2: 0x6CC9,\n 0x90F3: 0x6D45,\n 0x90F4: 0x6D17,\n 0x90F5: 0x67D3,\n 0x90F6: 0x6F5C,\n 0x90F7: 0x714E,\n 0x90F8: 0x717D,\n 0x90F9: 0x65CB,\n 0x90FA: 0x7A7F,\n 0x90FB: 0x7BAD,\n 0x90FC: 0x7DDA,\n 0x9140: 0x7E4A,\n 0x9141: 0x7FA8,\n 0x9142: 0x817A,\n 0x9143: 0x821B,\n 0x9144: 0x8239,\n 0x9145: 0x85A6,\n 0x9146: 0x8A6E,\n 0x9147: 0x8CCE,\n 0x9148: 0x8DF5,\n 0x9149: 0x9078,\n 0x914A: 0x9077,\n 0x914B: 0x92AD,\n 0x914C: 0x9291,\n 0x914D: 0x9583,\n 0x914E: 0x9BAE,\n 0x914F: 0x524D,\n 0x9150: 0x5584,\n 0x9151: 0x6F38,\n 0x9152: 0x7136,\n 0x9153: 0x5168,\n 0x9154: 0x7985,\n 0x9155: 0x7E55,\n 0x9156: 0x81B3,\n 0x9157: 0x7CCE,\n 0x9158: 0x564C,\n 0x9159: 0x5851,\n 0x915A: 0x5CA8,\n 0x915B: 0x63AA,\n 0x915C: 0x66FE,\n 0x915D: 0x66FD,\n 0x915E: 0x695A,\n 0x915F: 0x72D9,\n 0x9160: 0x758F,\n 0x9161: 0x758E,\n 0x9162: 0x790E,\n 0x9163: 0x7956,\n 0x9164: 0x79DF,\n 0x9165: 0x7C97,\n 0x9166: 0x7D20,\n 0x9167: 0x7D44,\n 0x9168: 0x8607,\n 0x9169: 0x8A34,\n 0x916A: 0x963B,\n 0x916B: 0x9061,\n 0x916C: 0x9F20,\n 0x916D: 0x50E7,\n 0x916E: 0x5275,\n 0x916F: 0x53CC,\n 0x9170: 0x53E2,\n 0x9171: 0x5009,\n 0x9172: 0x55AA,\n 0x9173: 0x58EE,\n 0x9174: 0x594F,\n 0x9175: 0x723D,\n 0x9176: 0x5B8B,\n 0x9177: 0x5C64,\n 0x9178: 0x531D,\n 0x9179: 0x60E3,\n 0x917A: 0x60F3,\n 0x917B: 0x635C,\n 0x917C: 0x6383,\n 0x917D: 0x633F,\n 0x917E: 0x63BB,\n 0x9180: 0x64CD,\n 0x9181: 0x65E9,\n 0x9182: 0x66F9,\n 0x9183: 0x5DE3,\n 0x9184: 0x69CD,\n 0x9185: 0x69FD,\n 0x9186: 0x6F15,\n 0x9187: 0x71E5,\n 0x9188: 0x4E89,\n 0x9189: 0x75E9,\n 0x918A: 0x76F8,\n 0x918B: 0x7A93,\n 0x918C: 0x7CDF,\n 0x918D: 0x7DCF,\n 0x918E: 0x7D9C,\n 0x918F: 0x8061,\n 0x9190: 0x8349,\n 0x9191: 0x8358,\n 0x9192: 0x846C,\n 0x9193: 0x84BC,\n 0x9194: 0x85FB,\n 0x9195: 0x88C5,\n 0x9196: 0x8D70,\n 0x9197: 0x9001,\n 0x9198: 0x906D,\n 0x9199: 0x9397,\n 0x919A: 0x971C,\n 0x919B: 0x9A12,\n 0x919C: 0x50CF,\n 0x919D: 0x5897,\n 0x919E: 0x618E,\n 0x919F: 0x81D3,\n 0x91A0: 0x8535,\n 0x91A1: 0x8D08,\n 0x91A2: 0x9020,\n 0x91A3: 0x4FC3,\n 0x91A4: 0x5074,\n 0x91A5: 0x5247,\n 0x91A6: 0x5373,\n 0x91A7: 0x606F,\n 0x91A8: 0x6349,\n 0x91A9: 0x675F,\n 0x91AA: 0x6E2C,\n 0x91AB: 0x8DB3,\n 0x91AC: 0x901F,\n 0x91AD: 0x4FD7,\n 0x91AE: 0x5C5E,\n 0x91AF: 0x8CCA,\n 0x91B0: 0x65CF,\n 0x91B1: 0x7D9A,\n 0x91B2: 0x5352,\n 0x91B3: 0x8896,\n 0x91B4: 0x5176,\n 0x91B5: 0x63C3,\n 0x91B6: 0x5B58,\n 0x91B7: 0x5B6B,\n 0x91B8: 0x5C0A,\n 0x91B9: 0x640D,\n 0x91BA: 0x6751,\n 0x91BB: 0x905C,\n 0x91BC: 0x4ED6,\n 0x91BD: 0x591A,\n 0x91BE: 0x592A,\n 0x91BF: 0x6C70,\n 0x91C0: 0x8A51,\n 0x91C1: 0x553E,\n 0x91C2: 0x5815,\n 0x91C3: 0x59A5,\n 0x91C4: 0x60F0,\n 0x91C5: 0x6253,\n 0x91C6: 0x67C1,\n 0x91C7: 0x8235,\n 0x91C8: 0x6955,\n 0x91C9: 0x9640,\n 0x91CA: 0x99C4,\n 0x91CB: 0x9A28,\n 0x91CC: 0x4F53,\n 0x91CD: 0x5806,\n 0x91CE: 0x5BFE,\n 0x91CF: 0x8010,\n 0x91D0: 0x5CB1,\n 0x91D1: 0x5E2F,\n 0x91D2: 0x5F85,\n 0x91D3: 0x6020,\n 0x91D4: 0x614B,\n 0x91D5: 0x6234,\n 0x91D6: 0x66FF,\n 0x91D7: 0x6CF0,\n 0x91D8: 0x6EDE,\n 0x91D9: 0x80CE,\n 0x91DA: 0x817F,\n 0x91DB: 0x82D4,\n 0x91DC: 0x888B,\n 0x91DD: 0x8CB8,\n 0x91DE: 0x9000,\n 0x91DF: 0x902E,\n 0x91E0: 0x968A,\n 0x91E1: 0x9EDB,\n 0x91E2: 0x9BDB,\n 0x91E3: 0x4EE3,\n 0x91E4: 0x53F0,\n 0x91E5: 0x5927,\n 0x91E6: 0x7B2C,\n 0x91E7: 0x918D,\n 0x91E8: 0x984C,\n 0x91E9: 0x9DF9,\n 0x91EA: 0x6EDD,\n 0x91EB: 0x7027,\n 0x91EC: 0x5353,\n 0x91ED: 0x5544,\n 0x91EE: 0x5B85,\n 0x91EF: 0x6258,\n 0x91F0: 0x629E,\n 0x91F1: 0x62D3,\n 0x91F2: 0x6CA2,\n 0x91F3: 0x6FEF,\n 0x91F4: 0x7422,\n 0x91F5: 0x8A17,\n 0x91F6: 0x9438,\n 0x91F7: 0x6FC1,\n 0x91F8: 0x8AFE,\n 0x91F9: 0x8338,\n 0x91FA: 0x51E7,\n 0x91FB: 0x86F8,\n 0x91FC: 0x53EA,\n 0x9240: 0x53E9,\n 0x9241: 0x4F46,\n 0x9242: 0x9054,\n 0x9243: 0x8FB0,\n 0x9244: 0x596A,\n 0x9245: 0x8131,\n 0x9246: 0x5DFD,\n 0x9247: 0x7AEA,\n 0x9248: 0x8FBF,\n 0x9249: 0x68DA,\n 0x924A: 0x8C37,\n 0x924B: 0x72F8,\n 0x924C: 0x9C48,\n 0x924D: 0x6A3D,\n 0x924E: 0x8AB0,\n 0x924F: 0x4E39,\n 0x9250: 0x5358,\n 0x9251: 0x5606,\n 0x9252: 0x5766,\n 0x9253: 0x62C5,\n 0x9254: 0x63A2,\n 0x9255: 0x65E6,\n 0x9256: 0x6B4E,\n 0x9257: 0x6DE1,\n 0x9258: 0x6E5B,\n 0x9259: 0x70AD,\n 0x925A: 0x77ED,\n 0x925B: 0x7AEF,\n 0x925C: 0x7BAA,\n 0x925D: 0x7DBB,\n 0x925E: 0x803D,\n 0x925F: 0x80C6,\n 0x9260: 0x86CB,\n 0x9261: 0x8A95,\n 0x9262: 0x935B,\n 0x9263: 0x56E3,\n 0x9264: 0x58C7,\n 0x9265: 0x5F3E,\n 0x9266: 0x65AD,\n 0x9267: 0x6696,\n 0x9268: 0x6A80,\n 0x9269: 0x6BB5,\n 0x926A: 0x7537,\n 0x926B: 0x8AC7,\n 0x926C: 0x5024,\n 0x926D: 0x77E5,\n 0x926E: 0x5730,\n 0x926F: 0x5F1B,\n 0x9270: 0x6065,\n 0x9271: 0x667A,\n 0x9272: 0x6C60,\n 0x9273: 0x75F4,\n 0x9274: 0x7A1A,\n 0x9275: 0x7F6E,\n 0x9276: 0x81F4,\n 0x9277: 0x8718,\n 0x9278: 0x9045,\n 0x9279: 0x99B3,\n 0x927A: 0x7BC9,\n 0x927B: 0x755C,\n 0x927C: 0x7AF9,\n 0x927D: 0x7B51,\n 0x927E: 0x84C4,\n 0x9280: 0x9010,\n 0x9281: 0x79E9,\n 0x9282: 0x7A92,\n 0x9283: 0x8336,\n 0x9284: 0x5AE1,\n 0x9285: 0x7740,\n 0x9286: 0x4E2D,\n 0x9287: 0x4EF2,\n 0x9288: 0x5B99,\n 0x9289: 0x5FE0,\n 0x928A: 0x62BD,\n 0x928B: 0x663C,\n 0x928C: 0x67F1,\n 0x928D: 0x6CE8,\n 0x928E: 0x866B,\n 0x928F: 0x8877,\n 0x9290: 0x8A3B,\n 0x9291: 0x914E,\n 0x9292: 0x92F3,\n 0x9293: 0x99D0,\n 0x9294: 0x6A17,\n 0x9295: 0x7026,\n 0x9296: 0x732A,\n 0x9297: 0x82E7,\n 0x9298: 0x8457,\n 0x9299: 0x8CAF,\n 0x929A: 0x4E01,\n 0x929B: 0x5146,\n 0x929C: 0x51CB,\n 0x929D: 0x558B,\n 0x929E: 0x5BF5,\n 0x929F: 0x5E16,\n 0x92A0: 0x5E33,\n 0x92A1: 0x5E81,\n 0x92A2: 0x5F14,\n 0x92A3: 0x5F35,\n 0x92A4: 0x5F6B,\n 0x92A5: 0x5FB4,\n 0x92A6: 0x61F2,\n 0x92A7: 0x6311,\n 0x92A8: 0x66A2,\n 0x92A9: 0x671D,\n 0x92AA: 0x6F6E,\n 0x92AB: 0x7252,\n 0x92AC: 0x753A,\n 0x92AD: 0x773A,\n 0x92AE: 0x8074,\n 0x92AF: 0x8139,\n 0x92B0: 0x8178,\n 0x92B1: 0x8776,\n 0x92B2: 0x8ABF,\n 0x92B3: 0x8ADC,\n 0x92B4: 0x8D85,\n 0x92B5: 0x8DF3,\n 0x92B6: 0x929A,\n 0x92B7: 0x9577,\n 0x92B8: 0x9802,\n 0x92B9: 0x9CE5,\n 0x92BA: 0x52C5,\n 0x92BB: 0x6357,\n 0x92BC: 0x76F4,\n 0x92BD: 0x6715,\n 0x92BE: 0x6C88,\n 0x92BF: 0x73CD,\n 0x92C0: 0x8CC3,\n 0x92C1: 0x93AE,\n 0x92C2: 0x9673,\n 0x92C3: 0x6D25,\n 0x92C4: 0x589C,\n 0x92C5: 0x690E,\n 0x92C6: 0x69CC,\n 0x92C7: 0x8FFD,\n 0x92C8: 0x939A,\n 0x92C9: 0x75DB,\n 0x92CA: 0x901A,\n 0x92CB: 0x585A,\n 0x92CC: 0x6802,\n 0x92CD: 0x63B4,\n 0x92CE: 0x69FB,\n 0x92CF: 0x4F43,\n 0x92D0: 0x6F2C,\n 0x92D1: 0x67D8,\n 0x92D2: 0x8FBB,\n 0x92D3: 0x8526,\n 0x92D4: 0x7DB4,\n 0x92D5: 0x9354,\n 0x92D6: 0x693F,\n 0x92D7: 0x6F70,\n 0x92D8: 0x576A,\n 0x92D9: 0x58F7,\n 0x92DA: 0x5B2C,\n 0x92DB: 0x7D2C,\n 0x92DC: 0x722A,\n 0x92DD: 0x540A,\n 0x92DE: 0x91E3,\n 0x92DF: 0x9DB4,\n 0x92E0: 0x4EAD,\n 0x92E1: 0x4F4E,\n 0x92E2: 0x505C,\n 0x92E3: 0x5075,\n 0x92E4: 0x5243,\n 0x92E5: 0x8C9E,\n 0x92E6: 0x5448,\n 0x92E7: 0x5824,\n 0x92E8: 0x5B9A,\n 0x92E9: 0x5E1D,\n 0x92EA: 0x5E95,\n 0x92EB: 0x5EAD,\n 0x92EC: 0x5EF7,\n 0x92ED: 0x5F1F,\n 0x92EE: 0x608C,\n 0x92EF: 0x62B5,\n 0x92F0: 0x633A,\n 0x92F1: 0x63D0,\n 0x92F2: 0x68AF,\n 0x92F3: 0x6C40,\n 0x92F4: 0x7887,\n 0x92F5: 0x798E,\n 0x92F6: 0x7A0B,\n 0x92F7: 0x7DE0,\n 0x92F8: 0x8247,\n 0x92F9: 0x8A02,\n 0x92FA: 0x8AE6,\n 0x92FB: 0x8E44,\n 0x92FC: 0x9013,\n 0x9340: 0x90B8,\n 0x9341: 0x912D,\n 0x9342: 0x91D8,\n 0x9343: 0x9F0E,\n 0x9344: 0x6CE5,\n 0x9345: 0x6458,\n 0x9346: 0x64E2,\n 0x9347: 0x6575,\n 0x9348: 0x6EF4,\n 0x9349: 0x7684,\n 0x934A: 0x7B1B,\n 0x934B: 0x9069,\n 0x934C: 0x93D1,\n 0x934D: 0x6EBA,\n 0x934E: 0x54F2,\n 0x934F: 0x5FB9,\n 0x9350: 0x64A4,\n 0x9351: 0x8F4D,\n 0x9352: 0x8FED,\n 0x9353: 0x9244,\n 0x9354: 0x5178,\n 0x9355: 0x586B,\n 0x9356: 0x5929,\n 0x9357: 0x5C55,\n 0x9358: 0x5E97,\n 0x9359: 0x6DFB,\n 0x935A: 0x7E8F,\n 0x935B: 0x751C,\n 0x935C: 0x8CBC,\n 0x935D: 0x8EE2,\n 0x935E: 0x985B,\n 0x935F: 0x70B9,\n 0x9360: 0x4F1D,\n 0x9361: 0x6BBF,\n 0x9362: 0x6FB1,\n 0x9363: 0x7530,\n 0x9364: 0x96FB,\n 0x9365: 0x514E,\n 0x9366: 0x5410,\n 0x9367: 0x5835,\n 0x9368: 0x5857,\n 0x9369: 0x59AC,\n 0x936A: 0x5C60,\n 0x936B: 0x5F92,\n 0x936C: 0x6597,\n 0x936D: 0x675C,\n 0x936E: 0x6E21,\n 0x936F: 0x767B,\n 0x9370: 0x83DF,\n 0x9371: 0x8CED,\n 0x9372: 0x9014,\n 0x9373: 0x90FD,\n 0x9374: 0x934D,\n 0x9375: 0x7825,\n 0x9376: 0x783A,\n 0x9377: 0x52AA,\n 0x9378: 0x5EA6,\n 0x9379: 0x571F,\n 0x937A: 0x5974,\n 0x937B: 0x6012,\n 0x937C: 0x5012,\n 0x937D: 0x515A,\n 0x937E: 0x51AC,\n 0x9380: 0x51CD,\n 0x9381: 0x5200,\n 0x9382: 0x5510,\n 0x9383: 0x5854,\n 0x9384: 0x5858,\n 0x9385: 0x5957,\n 0x9386: 0x5B95,\n 0x9387: 0x5CF6,\n 0x9388: 0x5D8B,\n 0x9389: 0x60BC,\n 0x938A: 0x6295,\n 0x938B: 0x642D,\n 0x938C: 0x6771,\n 0x938D: 0x6843,\n 0x938E: 0x68BC,\n 0x938F: 0x68DF,\n 0x9390: 0x76D7,\n 0x9391: 0x6DD8,\n 0x9392: 0x6E6F,\n 0x9393: 0x6D9B,\n 0x9394: 0x706F,\n 0x9395: 0x71C8,\n 0x9396: 0x5F53,\n 0x9397: 0x75D8,\n 0x9398: 0x7977,\n 0x9399: 0x7B49,\n 0x939A: 0x7B54,\n 0x939B: 0x7B52,\n 0x939C: 0x7CD6,\n 0x939D: 0x7D71,\n 0x939E: 0x5230,\n 0x939F: 0x8463,\n 0x93A0: 0x8569,\n 0x93A1: 0x85E4,\n 0x93A2: 0x8A0E,\n 0x93A3: 0x8B04,\n 0x93A4: 0x8C46,\n 0x93A5: 0x8E0F,\n 0x93A6: 0x9003,\n 0x93A7: 0x900F,\n 0x93A8: 0x9419,\n 0x93A9: 0x9676,\n 0x93AA: 0x982D,\n 0x93AB: 0x9A30,\n 0x93AC: 0x95D8,\n 0x93AD: 0x50CD,\n 0x93AE: 0x52D5,\n 0x93AF: 0x540C,\n 0x93B0: 0x5802,\n 0x93B1: 0x5C0E,\n 0x93B2: 0x61A7,\n 0x93B3: 0x649E,\n 0x93B4: 0x6D1E,\n 0x93B5: 0x77B3,\n 0x93B6: 0x7AE5,\n 0x93B7: 0x80F4,\n 0x93B8: 0x8404,\n 0x93B9: 0x9053,\n 0x93BA: 0x9285,\n 0x93BB: 0x5CE0,\n 0x93BC: 0x9D07,\n 0x93BD: 0x533F,\n 0x93BE: 0x5F97,\n 0x93BF: 0x5FB3,\n 0x93C0: 0x6D9C,\n 0x93C1: 0x7279,\n 0x93C2: 0x7763,\n 0x93C3: 0x79BF,\n 0x93C4: 0x7BE4,\n 0x93C5: 0x6BD2,\n 0x93C6: 0x72EC,\n 0x93C7: 0x8AAD,\n 0x93C8: 0x6803,\n 0x93C9: 0x6A61,\n 0x93CA: 0x51F8,\n 0x93CB: 0x7A81,\n 0x93CC: 0x6934,\n 0x93CD: 0x5C4A,\n 0x93CE: 0x9CF6,\n 0x93CF: 0x82EB,\n 0x93D0: 0x5BC5,\n 0x93D1: 0x9149,\n 0x93D2: 0x701E,\n 0x93D3: 0x5678,\n 0x93D4: 0x5C6F,\n 0x93D5: 0x60C7,\n 0x93D6: 0x6566,\n 0x93D7: 0x6C8C,\n 0x93D8: 0x8C5A,\n 0x93D9: 0x9041,\n 0x93DA: 0x9813,\n 0x93DB: 0x5451,\n 0x93DC: 0x66C7,\n 0x93DD: 0x920D,\n 0x93DE: 0x5948,\n 0x93DF: 0x90A3,\n 0x93E0: 0x5185,\n 0x93E1: 0x4E4D,\n 0x93E2: 0x51EA,\n 0x93E3: 0x8599,\n 0x93E4: 0x8B0E,\n 0x93E5: 0x7058,\n 0x93E6: 0x637A,\n 0x93E7: 0x934B,\n 0x93E8: 0x6962,\n 0x93E9: 0x99B4,\n 0x93EA: 0x7E04,\n 0x93EB: 0x7577,\n 0x93EC: 0x5357,\n 0x93ED: 0x6960,\n 0x93EE: 0x8EDF,\n 0x93EF: 0x96E3,\n 0x93F0: 0x6C5D,\n 0x93F1: 0x4E8C,\n 0x93F2: 0x5C3C,\n 0x93F3: 0x5F10,\n 0x93F4: 0x8FE9,\n 0x93F5: 0x5302,\n 0x93F6: 0x8CD1,\n 0x93F7: 0x8089,\n 0x93F8: 0x8679,\n 0x93F9: 0x5EFF,\n 0x93FA: 0x65E5,\n 0x93FB: 0x4E73,\n 0x93FC: 0x5165,\n 0x9440: 0x5982,\n 0x9441: 0x5C3F,\n 0x9442: 0x97EE,\n 0x9443: 0x4EFB,\n 0x9444: 0x598A,\n 0x9445: 0x5FCD,\n 0x9446: 0x8A8D,\n 0x9447: 0x6FE1,\n 0x9448: 0x79B0,\n 0x9449: 0x7962,\n 0x944A: 0x5BE7,\n 0x944B: 0x8471,\n 0x944C: 0x732B,\n 0x944D: 0x71B1,\n 0x944E: 0x5E74,\n 0x944F: 0x5FF5,\n 0x9450: 0x637B,\n 0x9451: 0x649A,\n 0x9452: 0x71C3,\n 0x9453: 0x7C98,\n 0x9454: 0x4E43,\n 0x9455: 0x5EFC,\n 0x9456: 0x4E4B,\n 0x9457: 0x57DC,\n 0x9458: 0x56A2,\n 0x9459: 0x60A9,\n 0x945A: 0x6FC3,\n 0x945B: 0x7D0D,\n 0x945C: 0x80FD,\n 0x945D: 0x8133,\n 0x945E: 0x81BF,\n 0x945F: 0x8FB2,\n 0x9460: 0x8997,\n 0x9461: 0x86A4,\n 0x9462: 0x5DF4,\n 0x9463: 0x628A,\n 0x9464: 0x64AD,\n 0x9465: 0x8987,\n 0x9466: 0x6777,\n 0x9467: 0x6CE2,\n 0x9468: 0x6D3E,\n 0x9469: 0x7436,\n 0x946A: 0x7834,\n 0x946B: 0x5A46,\n 0x946C: 0x7F75,\n 0x946D: 0x82AD,\n 0x946E: 0x99AC,\n 0x946F: 0x4FF3,\n 0x9470: 0x5EC3,\n 0x9471: 0x62DD,\n 0x9472: 0x6392,\n 0x9473: 0x6557,\n 0x9474: 0x676F,\n 0x9475: 0x76C3,\n 0x9476: 0x724C,\n 0x9477: 0x80CC,\n 0x9478: 0x80BA,\n 0x9479: 0x8F29,\n 0x947A: 0x914D,\n 0x947B: 0x500D,\n 0x947C: 0x57F9,\n 0x947D: 0x5A92,\n 0x947E: 0x6885,\n 0x9480: 0x6973,\n 0x9481: 0x7164,\n 0x9482: 0x72FD,\n 0x9483: 0x8CB7,\n 0x9484: 0x58F2,\n 0x9485: 0x8CE0,\n 0x9486: 0x966A,\n 0x9487: 0x9019,\n 0x9488: 0x877F,\n 0x9489: 0x79E4,\n 0x948A: 0x77E7,\n 0x948B: 0x8429,\n 0x948C: 0x4F2F,\n 0x948D: 0x5265,\n 0x948E: 0x535A,\n 0x948F: 0x62CD,\n 0x9490: 0x67CF,\n 0x9491: 0x6CCA,\n 0x9492: 0x767D,\n 0x9493: 0x7B94,\n 0x9494: 0x7C95,\n 0x9495: 0x8236,\n 0x9496: 0x8584,\n 0x9497: 0x8FEB,\n 0x9498: 0x66DD,\n 0x9499: 0x6F20,\n 0x949A: 0x7206,\n 0x949B: 0x7E1B,\n 0x949C: 0x83AB,\n 0x949D: 0x99C1,\n 0x949E: 0x9EA6,\n 0x949F: 0x51FD,\n 0x94A0: 0x7BB1,\n 0x94A1: 0x7872,\n 0x94A2: 0x7BB8,\n 0x94A3: 0x8087,\n 0x94A4: 0x7B48,\n 0x94A5: 0x6AE8,\n 0x94A6: 0x5E61,\n 0x94A7: 0x808C,\n 0x94A8: 0x7551,\n 0x94A9: 0x7560,\n 0x94AA: 0x516B,\n 0x94AB: 0x9262,\n 0x94AC: 0x6E8C,\n 0x94AD: 0x767A,\n 0x94AE: 0x9197,\n 0x94AF: 0x9AEA,\n 0x94B0: 0x4F10,\n 0x94B1: 0x7F70,\n 0x94B2: 0x629C,\n 0x94B3: 0x7B4F,\n 0x94B4: 0x95A5,\n 0x94B5: 0x9CE9,\n 0x94B6: 0x567A,\n 0x94B7: 0x5859,\n 0x94B8: 0x86E4,\n 0x94B9: 0x96BC,\n 0x94BA: 0x4F34,\n 0x94BB: 0x5224,\n 0x94BC: 0x534A,\n 0x94BD: 0x53CD,\n 0x94BE: 0x53DB,\n 0x94BF: 0x5E06,\n 0x94C0: 0x642C,\n 0x94C1: 0x6591,\n 0x94C2: 0x677F,\n 0x94C3: 0x6C3E,\n 0x94C4: 0x6C4E,\n 0x94C5: 0x7248,\n 0x94C6: 0x72AF,\n 0x94C7: 0x73ED,\n 0x94C8: 0x7554,\n 0x94C9: 0x7E41,\n 0x94CA: 0x822C,\n 0x94CB: 0x85E9,\n 0x94CC: 0x8CA9,\n 0x94CD: 0x7BC4,\n 0x94CE: 0x91C6,\n 0x94CF: 0x7169,\n 0x94D0: 0x9812,\n 0x94D1: 0x98EF,\n 0x94D2: 0x633D,\n 0x94D3: 0x6669,\n 0x94D4: 0x756A,\n 0x94D5: 0x76E4,\n 0x94D6: 0x78D0,\n 0x94D7: 0x8543,\n 0x94D8: 0x86EE,\n 0x94D9: 0x532A,\n 0x94DA: 0x5351,\n 0x94DB: 0x5426,\n 0x94DC: 0x5983,\n 0x94DD: 0x5E87,\n 0x94DE: 0x5F7C,\n 0x94DF: 0x60B2,\n 0x94E0: 0x6249,\n 0x94E1: 0x6279,\n 0x94E2: 0x62AB,\n 0x94E3: 0x6590,\n 0x94E4: 0x6BD4,\n 0x94E5: 0x6CCC,\n 0x94E6: 0x75B2,\n 0x94E7: 0x76AE,\n 0x94E8: 0x7891,\n 0x94E9: 0x79D8,\n 0x94EA: 0x7DCB,\n 0x94EB: 0x7F77,\n 0x94EC: 0x80A5,\n 0x94ED: 0x88AB,\n 0x94EE: 0x8AB9,\n 0x94EF: 0x8CBB,\n 0x94F0: 0x907F,\n 0x94F1: 0x975E,\n 0x94F2: 0x98DB,\n 0x94F3: 0x6A0B,\n 0x94F4: 0x7C38,\n 0x94F5: 0x5099,\n 0x94F6: 0x5C3E,\n 0x94F7: 0x5FAE,\n 0x94F8: 0x6787,\n 0x94F9: 0x6BD8,\n 0x94FA: 0x7435,\n 0x94FB: 0x7709,\n 0x94FC: 0x7F8E,\n 0x9540: 0x9F3B,\n 0x9541: 0x67CA,\n 0x9542: 0x7A17,\n 0x9543: 0x5339,\n 0x9544: 0x758B,\n 0x9545: 0x9AED,\n 0x9546: 0x5F66,\n 0x9547: 0x819D,\n 0x9548: 0x83F1,\n 0x9549: 0x8098,\n 0x954A: 0x5F3C,\n 0x954B: 0x5FC5,\n 0x954C: 0x7562,\n 0x954D: 0x7B46,\n 0x954E: 0x903C,\n 0x954F: 0x6867,\n 0x9550: 0x59EB,\n 0x9551: 0x5A9B,\n 0x9552: 0x7D10,\n 0x9553: 0x767E,\n 0x9554: 0x8B2C,\n 0x9555: 0x4FF5,\n 0x9556: 0x5F6A,\n 0x9557: 0x6A19,\n 0x9558: 0x6C37,\n 0x9559: 0x6F02,\n 0x955A: 0x74E2,\n 0x955B: 0x7968,\n 0x955C: 0x8868,\n 0x955D: 0x8A55,\n 0x955E: 0x8C79,\n 0x955F: 0x5EDF,\n 0x9560: 0x63CF,\n 0x9561: 0x75C5,\n 0x9562: 0x79D2,\n 0x9563: 0x82D7,\n 0x9564: 0x9328,\n 0x9565: 0x92F2,\n 0x9566: 0x849C,\n 0x9567: 0x86ED,\n 0x9568: 0x9C2D,\n 0x9569: 0x54C1,\n 0x956A: 0x5F6C,\n 0x956B: 0x658C,\n 0x956C: 0x6D5C,\n 0x956D: 0x7015,\n 0x956E: 0x8CA7,\n 0x956F: 0x8CD3,\n 0x9570: 0x983B,\n 0x9571: 0x654F,\n 0x9572: 0x74F6,\n 0x9573: 0x4E0D,\n 0x9574: 0x4ED8,\n 0x9575: 0x57E0,\n 0x9576: 0x592B,\n 0x9577: 0x5A66,\n 0x9578: 0x5BCC,\n 0x9579: 0x51A8,\n 0x957A: 0x5E03,\n 0x957B: 0x5E9C,\n 0x957C: 0x6016,\n 0x957D: 0x6276,\n 0x957E: 0x6577,\n 0x9580: 0x65A7,\n 0x9581: 0x666E,\n 0x9582: 0x6D6E,\n 0x9583: 0x7236,\n 0x9584: 0x7B26,\n 0x9585: 0x8150,\n 0x9586: 0x819A,\n 0x9587: 0x8299,\n 0x9588: 0x8B5C,\n 0x9589: 0x8CA0,\n 0x958A: 0x8CE6,\n 0x958B: 0x8D74,\n 0x958C: 0x961C,\n 0x958D: 0x9644,\n 0x958E: 0x4FAE,\n 0x958F: 0x64AB,\n 0x9590: 0x6B66,\n 0x9591: 0x821E,\n 0x9592: 0x8461,\n 0x9593: 0x856A,\n 0x9594: 0x90E8,\n 0x9595: 0x5C01,\n 0x9596: 0x6953,\n 0x9597: 0x98A8,\n 0x9598: 0x847A,\n 0x9599: 0x8557,\n 0x959A: 0x4F0F,\n 0x959B: 0x526F,\n 0x959C: 0x5FA9,\n 0x959D: 0x5E45,\n 0x959E: 0x670D,\n 0x959F: 0x798F,\n 0x95A0: 0x8179,\n 0x95A1: 0x8907,\n 0x95A2: 0x8986,\n 0x95A3: 0x6DF5,\n 0x95A4: 0x5F17,\n 0x95A5: 0x6255,\n 0x95A6: 0x6CB8,\n 0x95A7: 0x4ECF,\n 0x95A8: 0x7269,\n 0x95A9: 0x9B92,\n 0x95AA: 0x5206,\n 0x95AB: 0x543B,\n 0x95AC: 0x5674,\n 0x95AD: 0x58B3,\n 0x95AE: 0x61A4,\n 0x95AF: 0x626E,\n 0x95B0: 0x711A,\n 0x95B1: 0x596E,\n 0x95B2: 0x7C89,\n 0x95B3: 0x7CDE,\n 0x95B4: 0x7D1B,\n 0x95B5: 0x96F0,\n 0x95B6: 0x6587,\n 0x95B7: 0x805E,\n 0x95B8: 0x4E19,\n 0x95B9: 0x4F75,\n 0x95BA: 0x5175,\n 0x95BB: 0x5840,\n 0x95BC: 0x5E63,\n 0x95BD: 0x5E73,\n 0x95BE: 0x5F0A,\n 0x95BF: 0x67C4,\n 0x95C0: 0x4E26,\n 0x95C1: 0x853D,\n 0x95C2: 0x9589,\n 0x95C3: 0x965B,\n 0x95C4: 0x7C73,\n 0x95C5: 0x9801,\n 0x95C6: 0x50FB,\n 0x95C7: 0x58C1,\n 0x95C8: 0x7656,\n 0x95C9: 0x78A7,\n 0x95CA: 0x5225,\n 0x95CB: 0x77A5,\n 0x95CC: 0x8511,\n 0x95CD: 0x7B86,\n 0x95CE: 0x504F,\n 0x95CF: 0x5909,\n 0x95D0: 0x7247,\n 0x95D1: 0x7BC7,\n 0x95D2: 0x7DE8,\n 0x95D3: 0x8FBA,\n 0x95D4: 0x8FD4,\n 0x95D5: 0x904D,\n 0x95D6: 0x4FBF,\n 0x95D7: 0x52C9,\n 0x95D8: 0x5A29,\n 0x95D9: 0x5F01,\n 0x95DA: 0x97AD,\n 0x95DB: 0x4FDD,\n 0x95DC: 0x8217,\n 0x95DD: 0x92EA,\n 0x95DE: 0x5703,\n 0x95DF: 0x6355,\n 0x95E0: 0x6B69,\n 0x95E1: 0x752B,\n 0x95E2: 0x88DC,\n 0x95E3: 0x8F14,\n 0x95E4: 0x7A42,\n 0x95E5: 0x52DF,\n 0x95E6: 0x5893,\n 0x95E7: 0x6155,\n 0x95E8: 0x620A,\n 0x95E9: 0x66AE,\n 0x95EA: 0x6BCD,\n 0x95EB: 0x7C3F,\n 0x95EC: 0x83E9,\n 0x95ED: 0x5023,\n 0x95EE: 0x4FF8,\n 0x95EF: 0x5305,\n 0x95F0: 0x5446,\n 0x95F1: 0x5831,\n 0x95F2: 0x5949,\n 0x95F3: 0x5B9D,\n 0x95F4: 0x5CF0,\n 0x95F5: 0x5CEF,\n 0x95F6: 0x5D29,\n 0x95F7: 0x5E96,\n 0x95F8: 0x62B1,\n 0x95F9: 0x6367,\n 0x95FA: 0x653E,\n 0x95FB: 0x65B9,\n 0x95FC: 0x670B,\n 0x9640: 0x6CD5,\n 0x9641: 0x6CE1,\n 0x9642: 0x70F9,\n 0x9643: 0x7832,\n 0x9644: 0x7E2B,\n 0x9645: 0x80DE,\n 0x9646: 0x82B3,\n 0x9647: 0x840C,\n 0x9648: 0x84EC,\n 0x9649: 0x8702,\n 0x964A: 0x8912,\n 0x964B: 0x8A2A,\n 0x964C: 0x8C4A,\n 0x964D: 0x90A6,\n 0x964E: 0x92D2,\n 0x964F: 0x98FD,\n 0x9650: 0x9CF3,\n 0x9651: 0x9D6C,\n 0x9652: 0x4E4F,\n 0x9653: 0x4EA1,\n 0x9654: 0x508D,\n 0x9655: 0x5256,\n 0x9656: 0x574A,\n 0x9657: 0x59A8,\n 0x9658: 0x5E3D,\n 0x9659: 0x5FD8,\n 0x965A: 0x5FD9,\n 0x965B: 0x623F,\n 0x965C: 0x66B4,\n 0x965D: 0x671B,\n 0x965E: 0x67D0,\n 0x965F: 0x68D2,\n 0x9660: 0x5192,\n 0x9661: 0x7D21,\n 0x9662: 0x80AA,\n 0x9663: 0x81A8,\n 0x9664: 0x8B00,\n 0x9665: 0x8C8C,\n 0x9666: 0x8CBF,\n 0x9667: 0x927E,\n 0x9668: 0x9632,\n 0x9669: 0x5420,\n 0x966A: 0x982C,\n 0x966B: 0x5317,\n 0x966C: 0x50D5,\n 0x966D: 0x535C,\n 0x966E: 0x58A8,\n 0x966F: 0x64B2,\n 0x9670: 0x6734,\n 0x9671: 0x7267,\n 0x9672: 0x7766,\n 0x9673: 0x7A46,\n 0x9674: 0x91E6,\n 0x9675: 0x52C3,\n 0x9676: 0x6CA1,\n 0x9677: 0x6B86,\n 0x9678: 0x5800,\n 0x9679: 0x5E4C,\n 0x967A: 0x5954,\n 0x967B: 0x672C,\n 0x967C: 0x7FFB,\n 0x967D: 0x51E1,\n 0x967E: 0x76C6,\n 0x9680: 0x6469,\n 0x9681: 0x78E8,\n 0x9682: 0x9B54,\n 0x9683: 0x9EBB,\n 0x9684: 0x57CB,\n 0x9685: 0x59B9,\n 0x9686: 0x6627,\n 0x9687: 0x679A,\n 0x9688: 0x6BCE,\n 0x9689: 0x54E9,\n 0x968A: 0x69D9,\n 0x968B: 0x5E55,\n 0x968C: 0x819C,\n 0x968D: 0x6795,\n 0x968E: 0x9BAA,\n 0x968F: 0x67FE,\n 0x9690: 0x9C52,\n 0x9691: 0x685D,\n 0x9692: 0x4EA6,\n 0x9693: 0x4FE3,\n 0x9694: 0x53C8,\n 0x9695: 0x62B9,\n 0x9696: 0x672B,\n 0x9697: 0x6CAB,\n 0x9698: 0x8FC4,\n 0x9699: 0x4FAD,\n 0x969A: 0x7E6D,\n 0x969B: 0x9EBF,\n 0x969C: 0x4E07,\n 0x969D: 0x6162,\n 0x969E: 0x6E80,\n 0x969F: 0x6F2B,\n 0x96A0: 0x8513,\n 0x96A1: 0x5473,\n 0x96A2: 0x672A,\n 0x96A3: 0x9B45,\n 0x96A4: 0x5DF3,\n 0x96A5: 0x7B95,\n 0x96A6: 0x5CAC,\n 0x96A7: 0x5BC6,\n 0x96A8: 0x871C,\n 0x96A9: 0x6E4A,\n 0x96AA: 0x84D1,\n 0x96AB: 0x7A14,\n 0x96AC: 0x8108,\n 0x96AD: 0x5999,\n 0x96AE: 0x7C8D,\n 0x96AF: 0x6C11,\n 0x96B0: 0x7720,\n 0x96B1: 0x52D9,\n 0x96B2: 0x5922,\n 0x96B3: 0x7121,\n 0x96B4: 0x725F,\n 0x96B5: 0x77DB,\n 0x96B6: 0x9727,\n 0x96B7: 0x9D61,\n 0x96B8: 0x690B,\n 0x96B9: 0x5A7F,\n 0x96BA: 0x5A18,\n 0x96BB: 0x51A5,\n 0x96BC: 0x540D,\n 0x96BD: 0x547D,\n 0x96BE: 0x660E,\n 0x96BF: 0x76DF,\n 0x96C0: 0x8FF7,\n 0x96C1: 0x9298,\n 0x96C2: 0x9CF4,\n 0x96C3: 0x59EA,\n 0x96C4: 0x725D,\n 0x96C5: 0x6EC5,\n 0x96C6: 0x514D,\n 0x96C7: 0x68C9,\n 0x96C8: 0x7DBF,\n 0x96C9: 0x7DEC,\n 0x96CA: 0x9762,\n 0x96CB: 0x9EBA,\n 0x96CC: 0x6478,\n 0x96CD: 0x6A21,\n 0x96CE: 0x8302,\n 0x96CF: 0x5984,\n 0x96D0: 0x5B5F,\n 0x96D1: 0x6BDB,\n 0x96D2: 0x731B,\n 0x96D3: 0x76F2,\n 0x96D4: 0x7DB2,\n 0x96D5: 0x8017,\n 0x96D6: 0x8499,\n 0x96D7: 0x5132,\n 0x96D8: 0x6728,\n 0x96D9: 0x9ED9,\n 0x96DA: 0x76EE,\n 0x96DB: 0x6762,\n 0x96DC: 0x52FF,\n 0x96DD: 0x9905,\n 0x96DE: 0x5C24,\n 0x96DF: 0x623B,\n 0x96E0: 0x7C7E,\n 0x96E1: 0x8CB0,\n 0x96E2: 0x554F,\n 0x96E3: 0x60B6,\n 0x96E4: 0x7D0B,\n 0x96E5: 0x9580,\n 0x96E6: 0x5301,\n 0x96E7: 0x4E5F,\n 0x96E8: 0x51B6,\n 0x96E9: 0x591C,\n 0x96EA: 0x723A,\n 0x96EB: 0x8036,\n 0x96EC: 0x91CE,\n 0x96ED: 0x5F25,\n 0x96EE: 0x77E2,\n 0x96EF: 0x5384,\n 0x96F0: 0x5F79,\n 0x96F1: 0x7D04,\n 0x96F2: 0x85AC,\n 0x96F3: 0x8A33,\n 0x96F4: 0x8E8D,\n 0x96F5: 0x9756,\n 0x96F6: 0x67F3,\n 0x96F7: 0x85AE,\n 0x96F8: 0x9453,\n 0x96F9: 0x6109,\n 0x96FA: 0x6108,\n 0x96FB: 0x6CB9,\n 0x96FC: 0x7652,\n 0x9740: 0x8AED,\n 0x9741: 0x8F38,\n 0x9742: 0x552F,\n 0x9743: 0x4F51,\n 0x9744: 0x512A,\n 0x9745: 0x52C7,\n 0x9746: 0x53CB,\n 0x9747: 0x5BA5,\n 0x9748: 0x5E7D,\n 0x9749: 0x60A0,\n 0x974A: 0x6182,\n 0x974B: 0x63D6,\n 0x974C: 0x6709,\n 0x974D: 0x67DA,\n 0x974E: 0x6E67,\n 0x974F: 0x6D8C,\n 0x9750: 0x7336,\n 0x9751: 0x7337,\n 0x9752: 0x7531,\n 0x9753: 0x7950,\n 0x9754: 0x88D5,\n 0x9755: 0x8A98,\n 0x9756: 0x904A,\n 0x9757: 0x9091,\n 0x9758: 0x90F5,\n 0x9759: 0x96C4,\n 0x975A: 0x878D,\n 0x975B: 0x5915,\n 0x975C: 0x4E88,\n 0x975D: 0x4F59,\n 0x975E: 0x4E0E,\n 0x975F: 0x8A89,\n 0x9760: 0x8F3F,\n 0x9761: 0x9810,\n 0x9762: 0x50AD,\n 0x9763: 0x5E7C,\n 0x9764: 0x5996,\n 0x9765: 0x5BB9,\n 0x9766: 0x5EB8,\n 0x9767: 0x63DA,\n 0x9768: 0x63FA,\n 0x9769: 0x64C1,\n 0x976A: 0x66DC,\n 0x976B: 0x694A,\n 0x976C: 0x69D8,\n 0x976D: 0x6D0B,\n 0x976E: 0x6EB6,\n 0x976F: 0x7194,\n 0x9770: 0x7528,\n 0x9771: 0x7AAF,\n 0x9772: 0x7F8A,\n 0x9773: 0x8000,\n 0x9774: 0x8449,\n 0x9775: 0x84C9,\n 0x9776: 0x8981,\n 0x9777: 0x8B21,\n 0x9778: 0x8E0A,\n 0x9779: 0x9065,\n 0x977A: 0x967D,\n 0x977B: 0x990A,\n 0x977C: 0x617E,\n 0x977D: 0x6291,\n 0x977E: 0x6B32,\n 0x9780: 0x6C83,\n 0x9781: 0x6D74,\n 0x9782: 0x7FCC,\n 0x9783: 0x7FFC,\n 0x9784: 0x6DC0,\n 0x9785: 0x7F85,\n 0x9786: 0x87BA,\n 0x9787: 0x88F8,\n 0x9788: 0x6765,\n 0x9789: 0x83B1,\n 0x978A: 0x983C,\n 0x978B: 0x96F7,\n 0x978C: 0x6D1B,\n 0x978D: 0x7D61,\n 0x978E: 0x843D,\n 0x978F: 0x916A,\n 0x9790: 0x4E71,\n 0x9791: 0x5375,\n 0x9792: 0x5D50,\n 0x9793: 0x6B04,\n 0x9794: 0x6FEB,\n 0x9795: 0x85CD,\n 0x9796: 0x862D,\n 0x9797: 0x89A7,\n 0x9798: 0x5229,\n 0x9799: 0x540F,\n 0x979A: 0x5C65,\n 0x979B: 0x674E,\n 0x979C: 0x68A8,\n 0x979D: 0x7406,\n 0x979E: 0x7483,\n 0x979F: 0x75E2,\n 0x97A0: 0x88CF,\n 0x97A1: 0x88E1,\n 0x97A2: 0x91CC,\n 0x97A3: 0x96E2,\n 0x97A4: 0x9678,\n 0x97A5: 0x5F8B,\n 0x97A6: 0x7387,\n 0x97A7: 0x7ACB,\n 0x97A8: 0x844E,\n 0x97A9: 0x63A0,\n 0x97AA: 0x7565,\n 0x97AB: 0x5289,\n 0x97AC: 0x6D41,\n 0x97AD: 0x6E9C,\n 0x97AE: 0x7409,\n 0x97AF: 0x7559,\n 0x97B0: 0x786B,\n 0x97B1: 0x7C92,\n 0x97B2: 0x9686,\n 0x97B3: 0x7ADC,\n 0x97B4: 0x9F8D,\n 0x97B5: 0x4FB6,\n 0x97B6: 0x616E,\n 0x97B7: 0x65C5,\n 0x97B8: 0x865C,\n 0x97B9: 0x4E86,\n 0x97BA: 0x4EAE,\n 0x97BB: 0x50DA,\n 0x97BC: 0x4E21,\n 0x97BD: 0x51CC,\n 0x97BE: 0x5BEE,\n 0x97BF: 0x6599,\n 0x97C0: 0x6881,\n 0x97C1: 0x6DBC,\n 0x97C2: 0x731F,\n 0x97C3: 0x7642,\n 0x97C4: 0x77AD,\n 0x97C5: 0x7A1C,\n 0x97C6: 0x7CE7,\n 0x97C7: 0x826F,\n 0x97C8: 0x8AD2,\n 0x97C9: 0x907C,\n 0x97CA: 0x91CF,\n 0x97CB: 0x9675,\n 0x97CC: 0x9818,\n 0x97CD: 0x529B,\n 0x97CE: 0x7DD1,\n 0x97CF: 0x502B,\n 0x97D0: 0x5398,\n 0x97D1: 0x6797,\n 0x97D2: 0x6DCB,\n 0x97D3: 0x71D0,\n 0x97D4: 0x7433,\n 0x97D5: 0x81E8,\n 0x97D6: 0x8F2A,\n 0x97D7: 0x96A3,\n 0x97D8: 0x9C57,\n 0x97D9: 0x9E9F,\n 0x97DA: 0x7460,\n 0x97DB: 0x5841,\n 0x97DC: 0x6D99,\n 0x97DD: 0x7D2F,\n 0x97DE: 0x985E,\n 0x97DF: 0x4EE4,\n 0x97E0: 0x4F36,\n 0x97E1: 0x4F8B,\n 0x97E2: 0x51B7,\n 0x97E3: 0x52B1,\n 0x97E4: 0x5DBA,\n 0x97E5: 0x601C,\n 0x97E6: 0x73B2,\n 0x97E7: 0x793C,\n 0x97E8: 0x82D3,\n 0x97E9: 0x9234,\n 0x97EA: 0x96B7,\n 0x97EB: 0x96F6,\n 0x97EC: 0x970A,\n 0x97ED: 0x9E97,\n 0x97EE: 0x9F62,\n 0x97EF: 0x66A6,\n 0x97F0: 0x6B74,\n 0x97F1: 0x5217,\n 0x97F2: 0x52A3,\n 0x97F3: 0x70C8,\n 0x97F4: 0x88C2,\n 0x97F5: 0x5EC9,\n 0x97F6: 0x604B,\n 0x97F7: 0x6190,\n 0x97F8: 0x6F23,\n 0x97F9: 0x7149,\n 0x97FA: 0x7C3E,\n 0x97FB: 0x7DF4,\n 0x97FC: 0x806F,\n 0x9840: 0x84EE,\n 0x9841: 0x9023,\n 0x9842: 0x932C,\n 0x9843: 0x5442,\n 0x9844: 0x9B6F,\n 0x9845: 0x6AD3,\n 0x9846: 0x7089,\n 0x9847: 0x8CC2,\n 0x9848: 0x8DEF,\n 0x9849: 0x9732,\n 0x984A: 0x52B4,\n 0x984B: 0x5A41,\n 0x984C: 0x5ECA,\n 0x984D: 0x5F04,\n 0x984E: 0x6717,\n 0x984F: 0x697C,\n 0x9850: 0x6994,\n 0x9851: 0x6D6A,\n 0x9852: 0x6F0F,\n 0x9853: 0x7262,\n 0x9854: 0x72FC,\n 0x9855: 0x7BED,\n 0x9856: 0x8001,\n 0x9857: 0x807E,\n 0x9858: 0x874B,\n 0x9859: 0x90CE,\n 0x985A: 0x516D,\n 0x985B: 0x9E93,\n 0x985C: 0x7984,\n 0x985D: 0x808B,\n 0x985E: 0x9332,\n 0x985F: 0x8AD6,\n 0x9860: 0x502D,\n 0x9861: 0x548C,\n 0x9862: 0x8A71,\n 0x9863: 0x6B6A,\n 0x9864: 0x8CC4,\n 0x9865: 0x8107,\n 0x9866: 0x60D1,\n 0x9867: 0x67A0,\n 0x9868: 0x9DF2,\n 0x9869: 0x4E99,\n 0x986A: 0x4E98,\n 0x986B: 0x9C10,\n 0x986C: 0x8A6B,\n 0x986D: 0x85C1,\n 0x986E: 0x8568,\n 0x986F: 0x6900,\n 0x9870: 0x6E7E,\n 0x9871: 0x7897,\n 0x9872: 0x8155,\n 0x989F: 0x5F0C,\n 0x98A0: 0x4E10,\n 0x98A1: 0x4E15,\n 0x98A2: 0x4E2A,\n 0x98A3: 0x4E31,\n 0x98A4: 0x4E36,\n 0x98A5: 0x4E3C,\n 0x98A6: 0x4E3F,\n 0x98A7: 0x4E42,\n 0x98A8: 0x4E56,\n 0x98A9: 0x4E58,\n 0x98AA: 0x4E82,\n 0x98AB: 0x4E85,\n 0x98AC: 0x8C6B,\n 0x98AD: 0x4E8A,\n 0x98AE: 0x8212,\n 0x98AF: 0x5F0D,\n 0x98B0: 0x4E8E,\n 0x98B1: 0x4E9E,\n 0x98B2: 0x4E9F,\n 0x98B3: 0x4EA0,\n 0x98B4: 0x4EA2,\n 0x98B5: 0x4EB0,\n 0x98B6: 0x4EB3,\n 0x98B7: 0x4EB6,\n 0x98B8: 0x4ECE,\n 0x98B9: 0x4ECD,\n 0x98BA: 0x4EC4,\n 0x98BB: 0x4EC6,\n 0x98BC: 0x4EC2,\n 0x98BD: 0x4ED7,\n 0x98BE: 0x4EDE,\n 0x98BF: 0x4EED,\n 0x98C0: 0x4EDF,\n 0x98C1: 0x4EF7,\n 0x98C2: 0x4F09,\n 0x98C3: 0x4F5A,\n 0x98C4: 0x4F30,\n 0x98C5: 0x4F5B,\n 0x98C6: 0x4F5D,\n 0x98C7: 0x4F57,\n 0x98C8: 0x4F47,\n 0x98C9: 0x4F76,\n 0x98CA: 0x4F88,\n 0x98CB: 0x4F8F,\n 0x98CC: 0x4F98,\n 0x98CD: 0x4F7B,\n 0x98CE: 0x4F69,\n 0x98CF: 0x4F70,\n 0x98D0: 0x4F91,\n 0x98D1: 0x4F6F,\n 0x98D2: 0x4F86,\n 0x98D3: 0x4F96,\n 0x98D4: 0x5118,\n 0x98D5: 0x4FD4,\n 0x98D6: 0x4FDF,\n 0x98D7: 0x4FCE,\n 0x98D8: 0x4FD8,\n 0x98D9: 0x4FDB,\n 0x98DA: 0x4FD1,\n 0x98DB: 0x4FDA,\n 0x98DC: 0x4FD0,\n 0x98DD: 0x4FE4,\n 0x98DE: 0x4FE5,\n 0x98DF: 0x501A,\n 0x98E0: 0x5028,\n 0x98E1: 0x5014,\n 0x98E2: 0x502A,\n 0x98E3: 0x5025,\n 0x98E4: 0x5005,\n 0x98E5: 0x4F1C,\n 0x98E6: 0x4FF6,\n 0x98E7: 0x5021,\n 0x98E8: 0x5029,\n 0x98E9: 0x502C,\n 0x98EA: 0x4FFE,\n 0x98EB: 0x4FEF,\n 0x98EC: 0x5011,\n 0x98ED: 0x5006,\n 0x98EE: 0x5043,\n 0x98EF: 0x5047,\n 0x98F0: 0x6703,\n 0x98F1: 0x5055,\n 0x98F2: 0x5050,\n 0x98F3: 0x5048,\n 0x98F4: 0x505A,\n 0x98F5: 0x5056,\n 0x98F6: 0x506C,\n 0x98F7: 0x5078,\n 0x98F8: 0x5080,\n 0x98F9: 0x509A,\n 0x98FA: 0x5085,\n 0x98FB: 0x50B4,\n 0x98FC: 0x50B2,\n 0x9940: 0x50C9,\n 0x9941: 0x50CA,\n 0x9942: 0x50B3,\n 0x9943: 0x50C2,\n 0x9944: 0x50D6,\n 0x9945: 0x50DE,\n 0x9946: 0x50E5,\n 0x9947: 0x50ED,\n 0x9948: 0x50E3,\n 0x9949: 0x50EE,\n 0x994A: 0x50F9,\n 0x994B: 0x50F5,\n 0x994C: 0x5109,\n 0x994D: 0x5101,\n 0x994E: 0x5102,\n 0x994F: 0x5116,\n 0x9950: 0x5115,\n 0x9951: 0x5114,\n 0x9952: 0x511A,\n 0x9953: 0x5121,\n 0x9954: 0x513A,\n 0x9955: 0x5137,\n 0x9956: 0x513C,\n 0x9957: 0x513B,\n 0x9958: 0x513F,\n 0x9959: 0x5140,\n 0x995A: 0x5152,\n 0x995B: 0x514C,\n 0x995C: 0x5154,\n 0x995D: 0x5162,\n 0x995E: 0x7AF8,\n 0x995F: 0x5169,\n 0x9960: 0x516A,\n 0x9961: 0x516E,\n 0x9962: 0x5180,\n 0x9963: 0x5182,\n 0x9964: 0x56D8,\n 0x9965: 0x518C,\n 0x9966: 0x5189,\n 0x9967: 0x518F,\n 0x9968: 0x5191,\n 0x9969: 0x5193,\n 0x996A: 0x5195,\n 0x996B: 0x5196,\n 0x996C: 0x51A4,\n 0x996D: 0x51A6,\n 0x996E: 0x51A2,\n 0x996F: 0x51A9,\n 0x9970: 0x51AA,\n 0x9971: 0x51AB,\n 0x9972: 0x51B3,\n 0x9973: 0x51B1,\n 0x9974: 0x51B2,\n 0x9975: 0x51B0,\n 0x9976: 0x51B5,\n 0x9977: 0x51BD,\n 0x9978: 0x51C5,\n 0x9979: 0x51C9,\n 0x997A: 0x51DB,\n 0x997B: 0x51E0,\n 0x997C: 0x8655,\n 0x997D: 0x51E9,\n 0x997E: 0x51ED,\n 0x9980: 0x51F0,\n 0x9981: 0x51F5,\n 0x9982: 0x51FE,\n 0x9983: 0x5204,\n 0x9984: 0x520B,\n 0x9985: 0x5214,\n 0x9986: 0x520E,\n 0x9987: 0x5227,\n 0x9988: 0x522A,\n 0x9989: 0x522E,\n 0x998A: 0x5233,\n 0x998B: 0x5239,\n 0x998C: 0x524F,\n 0x998D: 0x5244,\n 0x998E: 0x524B,\n 0x998F: 0x524C,\n 0x9990: 0x525E,\n 0x9991: 0x5254,\n 0x9992: 0x526A,\n 0x9993: 0x5274,\n 0x9994: 0x5269,\n 0x9995: 0x5273,\n 0x9996: 0x527F,\n 0x9997: 0x527D,\n 0x9998: 0x528D,\n 0x9999: 0x5294,\n 0x999A: 0x5292,\n 0x999B: 0x5271,\n 0x999C: 0x5288,\n 0x999D: 0x5291,\n 0x999E: 0x8FA8,\n 0x999F: 0x8FA7,\n 0x99A0: 0x52AC,\n 0x99A1: 0x52AD,\n 0x99A2: 0x52BC,\n 0x99A3: 0x52B5,\n 0x99A4: 0x52C1,\n 0x99A5: 0x52CD,\n 0x99A6: 0x52D7,\n 0x99A7: 0x52DE,\n 0x99A8: 0x52E3,\n 0x99A9: 0x52E6,\n 0x99AA: 0x98ED,\n 0x99AB: 0x52E0,\n 0x99AC: 0x52F3,\n 0x99AD: 0x52F5,\n 0x99AE: 0x52F8,\n 0x99AF: 0x52F9,\n 0x99B0: 0x5306,\n 0x99B1: 0x5308,\n 0x99B2: 0x7538,\n 0x99B3: 0x530D,\n 0x99B4: 0x5310,\n 0x99B5: 0x530F,\n 0x99B6: 0x5315,\n 0x99B7: 0x531A,\n 0x99B8: 0x5323,\n 0x99B9: 0x532F,\n 0x99BA: 0x5331,\n 0x99BB: 0x5333,\n 0x99BC: 0x5338,\n 0x99BD: 0x5340,\n 0x99BE: 0x5346,\n 0x99BF: 0x5345,\n 0x99C0: 0x4E17,\n 0x99C1: 0x5349,\n 0x99C2: 0x534D,\n 0x99C3: 0x51D6,\n 0x99C4: 0x535E,\n 0x99C5: 0x5369,\n 0x99C6: 0x536E,\n 0x99C7: 0x5918,\n 0x99C8: 0x537B,\n 0x99C9: 0x5377,\n 0x99CA: 0x5382,\n 0x99CB: 0x5396,\n 0x99CC: 0x53A0,\n 0x99CD: 0x53A6,\n 0x99CE: 0x53A5,\n 0x99CF: 0x53AE,\n 0x99D0: 0x53B0,\n 0x99D1: 0x53B6,\n 0x99D2: 0x53C3,\n 0x99D3: 0x7C12,\n 0x99D4: 0x96D9,\n 0x99D5: 0x53DF,\n 0x99D6: 0x66FC,\n 0x99D7: 0x71EE,\n 0x99D8: 0x53EE,\n 0x99D9: 0x53E8,\n 0x99DA: 0x53ED,\n 0x99DB: 0x53FA,\n 0x99DC: 0x5401,\n 0x99DD: 0x543D,\n 0x99DE: 0x5440,\n 0x99DF: 0x542C,\n 0x99E0: 0x542D,\n 0x99E1: 0x543C,\n 0x99E2: 0x542E,\n 0x99E3: 0x5436,\n 0x99E4: 0x5429,\n 0x99E5: 0x541D,\n 0x99E6: 0x544E,\n 0x99E7: 0x548F,\n 0x99E8: 0x5475,\n 0x99E9: 0x548E,\n 0x99EA: 0x545F,\n 0x99EB: 0x5471,\n 0x99EC: 0x5477,\n 0x99ED: 0x5470,\n 0x99EE: 0x5492,\n 0x99EF: 0x547B,\n 0x99F0: 0x5480,\n 0x99F1: 0x5476,\n 0x99F2: 0x5484,\n 0x99F3: 0x5490,\n 0x99F4: 0x5486,\n 0x99F5: 0x54C7,\n 0x99F6: 0x54A2,\n 0x99F7: 0x54B8,\n 0x99F8: 0x54A5,\n 0x99F9: 0x54AC,\n 0x99FA: 0x54C4,\n 0x99FB: 0x54C8,\n 0x99FC: 0x54A8,\n 0x9A40: 0x54AB,\n 0x9A41: 0x54C2,\n 0x9A42: 0x54A4,\n 0x9A43: 0x54BE,\n 0x9A44: 0x54BC,\n 0x9A45: 0x54D8,\n 0x9A46: 0x54E5,\n 0x9A47: 0x54E6,\n 0x9A48: 0x550F,\n 0x9A49: 0x5514,\n 0x9A4A: 0x54FD,\n 0x9A4B: 0x54EE,\n 0x9A4C: 0x54ED,\n 0x9A4D: 0x54FA,\n 0x9A4E: 0x54E2,\n 0x9A4F: 0x5539,\n 0x9A50: 0x5540,\n 0x9A51: 0x5563,\n 0x9A52: 0x554C,\n 0x9A53: 0x552E,\n 0x9A54: 0x555C,\n 0x9A55: 0x5545,\n 0x9A56: 0x5556,\n 0x9A57: 0x5557,\n 0x9A58: 0x5538,\n 0x9A59: 0x5533,\n 0x9A5A: 0x555D,\n 0x9A5B: 0x5599,\n 0x9A5C: 0x5580,\n 0x9A5D: 0x54AF,\n 0x9A5E: 0x558A,\n 0x9A5F: 0x559F,\n 0x9A60: 0x557B,\n 0x9A61: 0x557E,\n 0x9A62: 0x5598,\n 0x9A63: 0x559E,\n 0x9A64: 0x55AE,\n 0x9A65: 0x557C,\n 0x9A66: 0x5583,\n 0x9A67: 0x55A9,\n 0x9A68: 0x5587,\n 0x9A69: 0x55A8,\n 0x9A6A: 0x55DA,\n 0x9A6B: 0x55C5,\n 0x9A6C: 0x55DF,\n 0x9A6D: 0x55C4,\n 0x9A6E: 0x55DC,\n 0x9A6F: 0x55E4,\n 0x9A70: 0x55D4,\n 0x9A71: 0x5614,\n 0x9A72: 0x55F7,\n 0x9A73: 0x5616,\n 0x9A74: 0x55FE,\n 0x9A75: 0x55FD,\n 0x9A76: 0x561B,\n 0x9A77: 0x55F9,\n 0x9A78: 0x564E,\n 0x9A79: 0x5650,\n 0x9A7A: 0x71DF,\n 0x9A7B: 0x5634,\n 0x9A7C: 0x5636,\n 0x9A7D: 0x5632,\n 0x9A7E: 0x5638,\n 0x9A80: 0x566B,\n 0x9A81: 0x5664,\n 0x9A82: 0x562F,\n 0x9A83: 0x566C,\n 0x9A84: 0x566A,\n 0x9A85: 0x5686,\n 0x9A86: 0x5680,\n 0x9A87: 0x568A,\n 0x9A88: 0x56A0,\n 0x9A89: 0x5694,\n 0x9A8A: 0x568F,\n 0x9A8B: 0x56A5,\n 0x9A8C: 0x56AE,\n 0x9A8D: 0x56B6,\n 0x9A8E: 0x56B4,\n 0x9A8F: 0x56C2,\n 0x9A90: 0x56BC,\n 0x9A91: 0x56C1,\n 0x9A92: 0x56C3,\n 0x9A93: 0x56C0,\n 0x9A94: 0x56C8,\n 0x9A95: 0x56CE,\n 0x9A96: 0x56D1,\n 0x9A97: 0x56D3,\n 0x9A98: 0x56D7,\n 0x9A99: 0x56EE,\n 0x9A9A: 0x56F9,\n 0x9A9B: 0x5700,\n 0x9A9C: 0x56FF,\n 0x9A9D: 0x5704,\n 0x9A9E: 0x5709,\n 0x9A9F: 0x5708,\n 0x9AA0: 0x570B,\n 0x9AA1: 0x570D,\n 0x9AA2: 0x5713,\n 0x9AA3: 0x5718,\n 0x9AA4: 0x5716,\n 0x9AA5: 0x55C7,\n 0x9AA6: 0x571C,\n 0x9AA7: 0x5726,\n 0x9AA8: 0x5737,\n 0x9AA9: 0x5738,\n 0x9AAA: 0x574E,\n 0x9AAB: 0x573B,\n 0x9AAC: 0x5740,\n 0x9AAD: 0x574F,\n 0x9AAE: 0x5769,\n 0x9AAF: 0x57C0,\n 0x9AB0: 0x5788,\n 0x9AB1: 0x5761,\n 0x9AB2: 0x577F,\n 0x9AB3: 0x5789,\n 0x9AB4: 0x5793,\n 0x9AB5: 0x57A0,\n 0x9AB6: 0x57B3,\n 0x9AB7: 0x57A4,\n 0x9AB8: 0x57AA,\n 0x9AB9: 0x57B0,\n 0x9ABA: 0x57C3,\n 0x9ABB: 0x57C6,\n 0x9ABC: 0x57D4,\n 0x9ABD: 0x57D2,\n 0x9ABE: 0x57D3,\n 0x9ABF: 0x580A,\n 0x9AC0: 0x57D6,\n 0x9AC1: 0x57E3,\n 0x9AC2: 0x580B,\n 0x9AC3: 0x5819,\n 0x9AC4: 0x581D,\n 0x9AC5: 0x5872,\n 0x9AC6: 0x5821,\n 0x9AC7: 0x5862,\n 0x9AC8: 0x584B,\n 0x9AC9: 0x5870,\n 0x9ACA: 0x6BC0,\n 0x9ACB: 0x5852,\n 0x9ACC: 0x583D,\n 0x9ACD: 0x5879,\n 0x9ACE: 0x5885,\n 0x9ACF: 0x58B9,\n 0x9AD0: 0x589F,\n 0x9AD1: 0x58AB,\n 0x9AD2: 0x58BA,\n 0x9AD3: 0x58DE,\n 0x9AD4: 0x58BB,\n 0x9AD5: 0x58B8,\n 0x9AD6: 0x58AE,\n 0x9AD7: 0x58C5,\n 0x9AD8: 0x58D3,\n 0x9AD9: 0x58D1,\n 0x9ADA: 0x58D7,\n 0x9ADB: 0x58D9,\n 0x9ADC: 0x58D8,\n 0x9ADD: 0x58E5,\n 0x9ADE: 0x58DC,\n 0x9ADF: 0x58E4,\n 0x9AE0: 0x58DF,\n 0x9AE1: 0x58EF,\n 0x9AE2: 0x58FA,\n 0x9AE3: 0x58F9,\n 0x9AE4: 0x58FB,\n 0x9AE5: 0x58FC,\n 0x9AE6: 0x58FD,\n 0x9AE7: 0x5902,\n 0x9AE8: 0x590A,\n 0x9AE9: 0x5910,\n 0x9AEA: 0x591B,\n 0x9AEB: 0x68A6,\n 0x9AEC: 0x5925,\n 0x9AED: 0x592C,\n 0x9AEE: 0x592D,\n 0x9AEF: 0x5932,\n 0x9AF0: 0x5938,\n 0x9AF1: 0x593E,\n 0x9AF2: 0x7AD2,\n 0x9AF3: 0x5955,\n 0x9AF4: 0x5950,\n 0x9AF5: 0x594E,\n 0x9AF6: 0x595A,\n 0x9AF7: 0x5958,\n 0x9AF8: 0x5962,\n 0x9AF9: 0x5960,\n 0x9AFA: 0x5967,\n 0x9AFB: 0x596C,\n 0x9AFC: 0x5969,\n 0x9B40: 0x5978,\n 0x9B41: 0x5981,\n 0x9B42: 0x599D,\n 0x9B43: 0x4F5E,\n 0x9B44: 0x4FAB,\n 0x9B45: 0x59A3,\n 0x9B46: 0x59B2,\n 0x9B47: 0x59C6,\n 0x9B48: 0x59E8,\n 0x9B49: 0x59DC,\n 0x9B4A: 0x598D,\n 0x9B4B: 0x59D9,\n 0x9B4C: 0x59DA,\n 0x9B4D: 0x5A25,\n 0x9B4E: 0x5A1F,\n 0x9B4F: 0x5A11,\n 0x9B50: 0x5A1C,\n 0x9B51: 0x5A09,\n 0x9B52: 0x5A1A,\n 0x9B53: 0x5A40,\n 0x9B54: 0x5A6C,\n 0x9B55: 0x5A49,\n 0x9B56: 0x5A35,\n 0x9B57: 0x5A36,\n 0x9B58: 0x5A62,\n 0x9B59: 0x5A6A,\n 0x9B5A: 0x5A9A,\n 0x9B5B: 0x5ABC,\n 0x9B5C: 0x5ABE,\n 0x9B5D: 0x5ACB,\n 0x9B5E: 0x5AC2,\n 0x9B5F: 0x5ABD,\n 0x9B60: 0x5AE3,\n 0x9B61: 0x5AD7,\n 0x9B62: 0x5AE6,\n 0x9B63: 0x5AE9,\n 0x9B64: 0x5AD6,\n 0x9B65: 0x5AFA,\n 0x9B66: 0x5AFB,\n 0x9B67: 0x5B0C,\n 0x9B68: 0x5B0B,\n 0x9B69: 0x5B16,\n 0x9B6A: 0x5B32,\n 0x9B6B: 0x5AD0,\n 0x9B6C: 0x5B2A,\n 0x9B6D: 0x5B36,\n 0x9B6E: 0x5B3E,\n 0x9B6F: 0x5B43,\n 0x9B70: 0x5B45,\n 0x9B71: 0x5B40,\n 0x9B72: 0x5B51,\n 0x9B73: 0x5B55,\n 0x9B74: 0x5B5A,\n 0x9B75: 0x5B5B,\n 0x9B76: 0x5B65,\n 0x9B77: 0x5B69,\n 0x9B78: 0x5B70,\n 0x9B79: 0x5B73,\n 0x9B7A: 0x5B75,\n 0x9B7B: 0x5B78,\n 0x9B7C: 0x6588,\n 0x9B7D: 0x5B7A,\n 0x9B7E: 0x5B80,\n 0x9B80: 0x5B83,\n 0x9B81: 0x5BA6,\n 0x9B82: 0x5BB8,\n 0x9B83: 0x5BC3,\n 0x9B84: 0x5BC7,\n 0x9B85: 0x5BC9,\n 0x9B86: 0x5BD4,\n 0x9B87: 0x5BD0,\n 0x9B88: 0x5BE4,\n 0x9B89: 0x5BE6,\n 0x9B8A: 0x5BE2,\n 0x9B8B: 0x5BDE,\n 0x9B8C: 0x5BE5,\n 0x9B8D: 0x5BEB,\n 0x9B8E: 0x5BF0,\n 0x9B8F: 0x5BF6,\n 0x9B90: 0x5BF3,\n 0x9B91: 0x5C05,\n 0x9B92: 0x5C07,\n 0x9B93: 0x5C08,\n 0x9B94: 0x5C0D,\n 0x9B95: 0x5C13,\n 0x9B96: 0x5C20,\n 0x9B97: 0x5C22,\n 0x9B98: 0x5C28,\n 0x9B99: 0x5C38,\n 0x9B9A: 0x5C39,\n 0x9B9B: 0x5C41,\n 0x9B9C: 0x5C46,\n 0x9B9D: 0x5C4E,\n 0x9B9E: 0x5C53,\n 0x9B9F: 0x5C50,\n 0x9BA0: 0x5C4F,\n 0x9BA1: 0x5B71,\n 0x9BA2: 0x5C6C,\n 0x9BA3: 0x5C6E,\n 0x9BA4: 0x4E62,\n 0x9BA5: 0x5C76,\n 0x9BA6: 0x5C79,\n 0x9BA7: 0x5C8C,\n 0x9BA8: 0x5C91,\n 0x9BA9: 0x5C94,\n 0x9BAA: 0x599B,\n 0x9BAB: 0x5CAB,\n 0x9BAC: 0x5CBB,\n 0x9BAD: 0x5CB6,\n 0x9BAE: 0x5CBC,\n 0x9BAF: 0x5CB7,\n 0x9BB0: 0x5CC5,\n 0x9BB1: 0x5CBE,\n 0x9BB2: 0x5CC7,\n 0x9BB3: 0x5CD9,\n 0x9BB4: 0x5CE9,\n 0x9BB5: 0x5CFD,\n 0x9BB6: 0x5CFA,\n 0x9BB7: 0x5CED,\n 0x9BB8: 0x5D8C,\n 0x9BB9: 0x5CEA,\n 0x9BBA: 0x5D0B,\n 0x9BBB: 0x5D15,\n 0x9BBC: 0x5D17,\n 0x9BBD: 0x5D5C,\n 0x9BBE: 0x5D1F,\n 0x9BBF: 0x5D1B,\n 0x9BC0: 0x5D11,\n 0x9BC1: 0x5D14,\n 0x9BC2: 0x5D22,\n 0x9BC3: 0x5D1A,\n 0x9BC4: 0x5D19,\n 0x9BC5: 0x5D18,\n 0x9BC6: 0x5D4C,\n 0x9BC7: 0x5D52,\n 0x9BC8: 0x5D4E,\n 0x9BC9: 0x5D4B,\n 0x9BCA: 0x5D6C,\n 0x9BCB: 0x5D73,\n 0x9BCC: 0x5D76,\n 0x9BCD: 0x5D87,\n 0x9BCE: 0x5D84,\n 0x9BCF: 0x5D82,\n 0x9BD0: 0x5DA2,\n 0x9BD1: 0x5D9D,\n 0x9BD2: 0x5DAC,\n 0x9BD3: 0x5DAE,\n 0x9BD4: 0x5DBD,\n 0x9BD5: 0x5D90,\n 0x9BD6: 0x5DB7,\n 0x9BD7: 0x5DBC,\n 0x9BD8: 0x5DC9,\n 0x9BD9: 0x5DCD,\n 0x9BDA: 0x5DD3,\n 0x9BDB: 0x5DD2,\n 0x9BDC: 0x5DD6,\n 0x9BDD: 0x5DDB,\n 0x9BDE: 0x5DEB,\n 0x9BDF: 0x5DF2,\n 0x9BE0: 0x5DF5,\n 0x9BE1: 0x5E0B,\n 0x9BE2: 0x5E1A,\n 0x9BE3: 0x5E19,\n 0x9BE4: 0x5E11,\n 0x9BE5: 0x5E1B,\n 0x9BE6: 0x5E36,\n 0x9BE7: 0x5E37,\n 0x9BE8: 0x5E44,\n 0x9BE9: 0x5E43,\n 0x9BEA: 0x5E40,\n 0x9BEB: 0x5E4E,\n 0x9BEC: 0x5E57,\n 0x9BED: 0x5E54,\n 0x9BEE: 0x5E5F,\n 0x9BEF: 0x5E62,\n 0x9BF0: 0x5E64,\n 0x9BF1: 0x5E47,\n 0x9BF2: 0x5E75,\n 0x9BF3: 0x5E76,\n 0x9BF4: 0x5E7A,\n 0x9BF5: 0x9EBC,\n 0x9BF6: 0x5E7F,\n 0x9BF7: 0x5EA0,\n 0x9BF8: 0x5EC1,\n 0x9BF9: 0x5EC2,\n 0x9BFA: 0x5EC8,\n 0x9BFB: 0x5ED0,\n 0x9BFC: 0x5ECF,\n 0x9C40: 0x5ED6,\n 0x9C41: 0x5EE3,\n 0x9C42: 0x5EDD,\n 0x9C43: 0x5EDA,\n 0x9C44: 0x5EDB,\n 0x9C45: 0x5EE2,\n 0x9C46: 0x5EE1,\n 0x9C47: 0x5EE8,\n 0x9C48: 0x5EE9,\n 0x9C49: 0x5EEC,\n 0x9C4A: 0x5EF1,\n 0x9C4B: 0x5EF3,\n 0x9C4C: 0x5EF0,\n 0x9C4D: 0x5EF4,\n 0x9C4E: 0x5EF8,\n 0x9C4F: 0x5EFE,\n 0x9C50: 0x5F03,\n 0x9C51: 0x5F09,\n 0x9C52: 0x5F5D,\n 0x9C53: 0x5F5C,\n 0x9C54: 0x5F0B,\n 0x9C55: 0x5F11,\n 0x9C56: 0x5F16,\n 0x9C57: 0x5F29,\n 0x9C58: 0x5F2D,\n 0x9C59: 0x5F38,\n 0x9C5A: 0x5F41,\n 0x9C5B: 0x5F48,\n 0x9C5C: 0x5F4C,\n 0x9C5D: 0x5F4E,\n 0x9C5E: 0x5F2F,\n 0x9C5F: 0x5F51,\n 0x9C60: 0x5F56,\n 0x9C61: 0x5F57,\n 0x9C62: 0x5F59,\n 0x9C63: 0x5F61,\n 0x9C64: 0x5F6D,\n 0x9C65: 0x5F73,\n 0x9C66: 0x5F77,\n 0x9C67: 0x5F83,\n 0x9C68: 0x5F82,\n 0x9C69: 0x5F7F,\n 0x9C6A: 0x5F8A,\n 0x9C6B: 0x5F88,\n 0x9C6C: 0x5F91,\n 0x9C6D: 0x5F87,\n 0x9C6E: 0x5F9E,\n 0x9C6F: 0x5F99,\n 0x9C70: 0x5F98,\n 0x9C71: 0x5FA0,\n 0x9C72: 0x5FA8,\n 0x9C73: 0x5FAD,\n 0x9C74: 0x5FBC,\n 0x9C75: 0x5FD6,\n 0x9C76: 0x5FFB,\n 0x9C77: 0x5FE4,\n 0x9C78: 0x5FF8,\n 0x9C79: 0x5FF1,\n 0x9C7A: 0x5FDD,\n 0x9C7B: 0x60B3,\n 0x9C7C: 0x5FFF,\n 0x9C7D: 0x6021,\n 0x9C7E: 0x6060,\n 0x9C80: 0x6019,\n 0x9C81: 0x6010,\n 0x9C82: 0x6029,\n 0x9C83: 0x600E,\n 0x9C84: 0x6031,\n 0x9C85: 0x601B,\n 0x9C86: 0x6015,\n 0x9C87: 0x602B,\n 0x9C88: 0x6026,\n 0x9C89: 0x600F,\n 0x9C8A: 0x603A,\n 0x9C8B: 0x605A,\n 0x9C8C: 0x6041,\n 0x9C8D: 0x606A,\n 0x9C8E: 0x6077,\n 0x9C8F: 0x605F,\n 0x9C90: 0x604A,\n 0x9C91: 0x6046,\n 0x9C92: 0x604D,\n 0x9C93: 0x6063,\n 0x9C94: 0x6043,\n 0x9C95: 0x6064,\n 0x9C96: 0x6042,\n 0x9C97: 0x606C,\n 0x9C98: 0x606B,\n 0x9C99: 0x6059,\n 0x9C9A: 0x6081,\n 0x9C9B: 0x608D,\n 0x9C9C: 0x60E7,\n 0x9C9D: 0x6083,\n 0x9C9E: 0x609A,\n 0x9C9F: 0x6084,\n 0x9CA0: 0x609B,\n 0x9CA1: 0x6096,\n 0x9CA2: 0x6097,\n 0x9CA3: 0x6092,\n 0x9CA4: 0x60A7,\n 0x9CA5: 0x608B,\n 0x9CA6: 0x60E1,\n 0x9CA7: 0x60B8,\n 0x9CA8: 0x60E0,\n 0x9CA9: 0x60D3,\n 0x9CAA: 0x60B4,\n 0x9CAB: 0x5FF0,\n 0x9CAC: 0x60BD,\n 0x9CAD: 0x60C6,\n 0x9CAE: 0x60B5,\n 0x9CAF: 0x60D8,\n 0x9CB0: 0x614D,\n 0x9CB1: 0x6115,\n 0x9CB2: 0x6106,\n 0x9CB3: 0x60F6,\n 0x9CB4: 0x60F7,\n 0x9CB5: 0x6100,\n 0x9CB6: 0x60F4,\n 0x9CB7: 0x60FA,\n 0x9CB8: 0x6103,\n 0x9CB9: 0x6121,\n 0x9CBA: 0x60FB,\n 0x9CBB: 0x60F1,\n 0x9CBC: 0x610D,\n 0x9CBD: 0x610E,\n 0x9CBE: 0x6147,\n 0x9CBF: 0x613E,\n 0x9CC0: 0x6128,\n 0x9CC1: 0x6127,\n 0x9CC2: 0x614A,\n 0x9CC3: 0x613F,\n 0x9CC4: 0x613C,\n 0x9CC5: 0x612C,\n 0x9CC6: 0x6134,\n 0x9CC7: 0x613D,\n 0x9CC8: 0x6142,\n 0x9CC9: 0x6144,\n 0x9CCA: 0x6173,\n 0x9CCB: 0x6177,\n 0x9CCC: 0x6158,\n 0x9CCD: 0x6159,\n 0x9CCE: 0x615A,\n 0x9CCF: 0x616B,\n 0x9CD0: 0x6174,\n 0x9CD1: 0x616F,\n 0x9CD2: 0x6165,\n 0x9CD3: 0x6171,\n 0x9CD4: 0x615F,\n 0x9CD5: 0x615D,\n 0x9CD6: 0x6153,\n 0x9CD7: 0x6175,\n 0x9CD8: 0x6199,\n 0x9CD9: 0x6196,\n 0x9CDA: 0x6187,\n 0x9CDB: 0x61AC,\n 0x9CDC: 0x6194,\n 0x9CDD: 0x619A,\n 0x9CDE: 0x618A,\n 0x9CDF: 0x6191,\n 0x9CE0: 0x61AB,\n 0x9CE1: 0x61AE,\n 0x9CE2: 0x61CC,\n 0x9CE3: 0x61CA,\n 0x9CE4: 0x61C9,\n 0x9CE5: 0x61F7,\n 0x9CE6: 0x61C8,\n 0x9CE7: 0x61C3,\n 0x9CE8: 0x61C6,\n 0x9CE9: 0x61BA,\n 0x9CEA: 0x61CB,\n 0x9CEB: 0x7F79,\n 0x9CEC: 0x61CD,\n 0x9CED: 0x61E6,\n 0x9CEE: 0x61E3,\n 0x9CEF: 0x61F6,\n 0x9CF0: 0x61FA,\n 0x9CF1: 0x61F4,\n 0x9CF2: 0x61FF,\n 0x9CF3: 0x61FD,\n 0x9CF4: 0x61FC,\n 0x9CF5: 0x61FE,\n 0x9CF6: 0x6200,\n 0x9CF7: 0x6208,\n 0x9CF8: 0x6209,\n 0x9CF9: 0x620D,\n 0x9CFA: 0x620C,\n 0x9CFB: 0x6214,\n 0x9CFC: 0x621B,\n 0x9D40: 0x621E,\n 0x9D41: 0x6221,\n 0x9D42: 0x622A,\n 0x9D43: 0x622E,\n 0x9D44: 0x6230,\n 0x9D45: 0x6232,\n 0x9D46: 0x6233,\n 0x9D47: 0x6241,\n 0x9D48: 0x624E,\n 0x9D49: 0x625E,\n 0x9D4A: 0x6263,\n 0x9D4B: 0x625B,\n 0x9D4C: 0x6260,\n 0x9D4D: 0x6268,\n 0x9D4E: 0x627C,\n 0x9D4F: 0x6282,\n 0x9D50: 0x6289,\n 0x9D51: 0x627E,\n 0x9D52: 0x6292,\n 0x9D53: 0x6293,\n 0x9D54: 0x6296,\n 0x9D55: 0x62D4,\n 0x9D56: 0x6283,\n 0x9D57: 0x6294,\n 0x9D58: 0x62D7,\n 0x9D59: 0x62D1,\n 0x9D5A: 0x62BB,\n 0x9D5B: 0x62CF,\n 0x9D5C: 0x62FF,\n 0x9D5D: 0x62C6,\n 0x9D5E: 0x64D4,\n 0x9D5F: 0x62C8,\n 0x9D60: 0x62DC,\n 0x9D61: 0x62CC,\n 0x9D62: 0x62CA,\n 0x9D63: 0x62C2,\n 0x9D64: 0x62C7,\n 0x9D65: 0x629B,\n 0x9D66: 0x62C9,\n 0x9D67: 0x630C,\n 0x9D68: 0x62EE,\n 0x9D69: 0x62F1,\n 0x9D6A: 0x6327,\n 0x9D6B: 0x6302,\n 0x9D6C: 0x6308,\n 0x9D6D: 0x62EF,\n 0x9D6E: 0x62F5,\n 0x9D6F: 0x6350,\n 0x9D70: 0x633E,\n 0x9D71: 0x634D,\n 0x9D72: 0x641C,\n 0x9D73: 0x634F,\n 0x9D74: 0x6396,\n 0x9D75: 0x638E,\n 0x9D76: 0x6380,\n 0x9D77: 0x63AB,\n 0x9D78: 0x6376,\n 0x9D79: 0x63A3,\n 0x9D7A: 0x638F,\n 0x9D7B: 0x6389,\n 0x9D7C: 0x639F,\n 0x9D7D: 0x63B5,\n 0x9D7E: 0x636B,\n 0x9D80: 0x6369,\n 0x9D81: 0x63BE,\n 0x9D82: 0x63E9,\n 0x9D83: 0x63C0,\n 0x9D84: 0x63C6,\n 0x9D85: 0x63E3,\n 0x9D86: 0x63C9,\n 0x9D87: 0x63D2,\n 0x9D88: 0x63F6,\n 0x9D89: 0x63C4,\n 0x9D8A: 0x6416,\n 0x9D8B: 0x6434,\n 0x9D8C: 0x6406,\n 0x9D8D: 0x6413,\n 0x9D8E: 0x6426,\n 0x9D8F: 0x6436,\n 0x9D90: 0x651D,\n 0x9D91: 0x6417,\n 0x9D92: 0x6428,\n 0x9D93: 0x640F,\n 0x9D94: 0x6467,\n 0x9D95: 0x646F,\n 0x9D96: 0x6476,\n 0x9D97: 0x644E,\n 0x9D98: 0x652A,\n 0x9D99: 0x6495,\n 0x9D9A: 0x6493,\n 0x9D9B: 0x64A5,\n 0x9D9C: 0x64A9,\n 0x9D9D: 0x6488,\n 0x9D9E: 0x64BC,\n 0x9D9F: 0x64DA,\n 0x9DA0: 0x64D2,\n 0x9DA1: 0x64C5,\n 0x9DA2: 0x64C7,\n 0x9DA3: 0x64BB,\n 0x9DA4: 0x64D8,\n 0x9DA5: 0x64C2,\n 0x9DA6: 0x64F1,\n 0x9DA7: 0x64E7,\n 0x9DA8: 0x8209,\n 0x9DA9: 0x64E0,\n 0x9DAA: 0x64E1,\n 0x9DAB: 0x62AC,\n 0x9DAC: 0x64E3,\n 0x9DAD: 0x64EF,\n 0x9DAE: 0x652C,\n 0x9DAF: 0x64F6,\n 0x9DB0: 0x64F4,\n 0x9DB1: 0x64F2,\n 0x9DB2: 0x64FA,\n 0x9DB3: 0x6500,\n 0x9DB4: 0x64FD,\n 0x9DB5: 0x6518,\n 0x9DB6: 0x651C,\n 0x9DB7: 0x6505,\n 0x9DB8: 0x6524,\n 0x9DB9: 0x6523,\n 0x9DBA: 0x652B,\n 0x9DBB: 0x6534,\n 0x9DBC: 0x6535,\n 0x9DBD: 0x6537,\n 0x9DBE: 0x6536,\n 0x9DBF: 0x6538,\n 0x9DC0: 0x754B,\n 0x9DC1: 0x6548,\n 0x9DC2: 0x6556,\n 0x9DC3: 0x6555,\n 0x9DC4: 0x654D,\n 0x9DC5: 0x6558,\n 0x9DC6: 0x655E,\n 0x9DC7: 0x655D,\n 0x9DC8: 0x6572,\n 0x9DC9: 0x6578,\n 0x9DCA: 0x6582,\n 0x9DCB: 0x6583,\n 0x9DCC: 0x8B8A,\n 0x9DCD: 0x659B,\n 0x9DCE: 0x659F,\n 0x9DCF: 0x65AB,\n 0x9DD0: 0x65B7,\n 0x9DD1: 0x65C3,\n 0x9DD2: 0x65C6,\n 0x9DD3: 0x65C1,\n 0x9DD4: 0x65C4,\n 0x9DD5: 0x65CC,\n 0x9DD6: 0x65D2,\n 0x9DD7: 0x65DB,\n 0x9DD8: 0x65D9,\n 0x9DD9: 0x65E0,\n 0x9DDA: 0x65E1,\n 0x9DDB: 0x65F1,\n 0x9DDC: 0x6772,\n 0x9DDD: 0x660A,\n 0x9DDE: 0x6603,\n 0x9DDF: 0x65FB,\n 0x9DE0: 0x6773,\n 0x9DE1: 0x6635,\n 0x9DE2: 0x6636,\n 0x9DE3: 0x6634,\n 0x9DE4: 0x661C,\n 0x9DE5: 0x664F,\n 0x9DE6: 0x6644,\n 0x9DE7: 0x6649,\n 0x9DE8: 0x6641,\n 0x9DE9: 0x665E,\n 0x9DEA: 0x665D,\n 0x9DEB: 0x6664,\n 0x9DEC: 0x6667,\n 0x9DED: 0x6668,\n 0x9DEE: 0x665F,\n 0x9DEF: 0x6662,\n 0x9DF0: 0x6670,\n 0x9DF1: 0x6683,\n 0x9DF2: 0x6688,\n 0x9DF3: 0x668E,\n 0x9DF4: 0x6689,\n 0x9DF5: 0x6684,\n 0x9DF6: 0x6698,\n 0x9DF7: 0x669D,\n 0x9DF8: 0x66C1,\n 0x9DF9: 0x66B9,\n 0x9DFA: 0x66C9,\n 0x9DFB: 0x66BE,\n 0x9DFC: 0x66BC,\n 0x9E40: 0x66C4,\n 0x9E41: 0x66B8,\n 0x9E42: 0x66D6,\n 0x9E43: 0x66DA,\n 0x9E44: 0x66E0,\n 0x9E45: 0x663F,\n 0x9E46: 0x66E6,\n 0x9E47: 0x66E9,\n 0x9E48: 0x66F0,\n 0x9E49: 0x66F5,\n 0x9E4A: 0x66F7,\n 0x9E4B: 0x670F,\n 0x9E4C: 0x6716,\n 0x9E4D: 0x671E,\n 0x9E4E: 0x6726,\n 0x9E4F: 0x6727,\n 0x9E50: 0x9738,\n 0x9E51: 0x672E,\n 0x9E52: 0x673F,\n 0x9E53: 0x6736,\n 0x9E54: 0x6741,\n 0x9E55: 0x6738,\n 0x9E56: 0x6737,\n 0x9E57: 0x6746,\n 0x9E58: 0x675E,\n 0x9E59: 0x6760,\n 0x9E5A: 0x6759,\n 0x9E5B: 0x6763,\n 0x9E5C: 0x6764,\n 0x9E5D: 0x6789,\n 0x9E5E: 0x6770,\n 0x9E5F: 0x67A9,\n 0x9E60: 0x677C,\n 0x9E61: 0x676A,\n 0x9E62: 0x678C,\n 0x9E63: 0x678B,\n 0x9E64: 0x67A6,\n 0x9E65: 0x67A1,\n 0x9E66: 0x6785,\n 0x9E67: 0x67B7,\n 0x9E68: 0x67EF,\n 0x9E69: 0x67B4,\n 0x9E6A: 0x67EC,\n 0x9E6B: 0x67B3,\n 0x9E6C: 0x67E9,\n 0x9E6D: 0x67B8,\n 0x9E6E: 0x67E4,\n 0x9E6F: 0x67DE,\n 0x9E70: 0x67DD,\n 0x9E71: 0x67E2,\n 0x9E72: 0x67EE,\n 0x9E73: 0x67B9,\n 0x9E74: 0x67CE,\n 0x9E75: 0x67C6,\n 0x9E76: 0x67E7,\n 0x9E77: 0x6A9C,\n 0x9E78: 0x681E,\n 0x9E79: 0x6846,\n 0x9E7A: 0x6829,\n 0x9E7B: 0x6840,\n 0x9E7C: 0x684D,\n 0x9E7D: 0x6832,\n 0x9E7E: 0x684E,\n 0x9E80: 0x68B3,\n 0x9E81: 0x682B,\n 0x9E82: 0x6859,\n 0x9E83: 0x6863,\n 0x9E84: 0x6877,\n 0x9E85: 0x687F,\n 0x9E86: 0x689F,\n 0x9E87: 0x688F,\n 0x9E88: 0x68AD,\n 0x9E89: 0x6894,\n 0x9E8A: 0x689D,\n 0x9E8B: 0x689B,\n 0x9E8C: 0x6883,\n 0x9E8D: 0x6AAE,\n 0x9E8E: 0x68B9,\n 0x9E8F: 0x6874,\n 0x9E90: 0x68B5,\n 0x9E91: 0x68A0,\n 0x9E92: 0x68BA,\n 0x9E93: 0x690F,\n 0x9E94: 0x688D,\n 0x9E95: 0x687E,\n 0x9E96: 0x6901,\n 0x9E97: 0x68CA,\n 0x9E98: 0x6908,\n 0x9E99: 0x68D8,\n 0x9E9A: 0x6922,\n 0x9E9B: 0x6926,\n 0x9E9C: 0x68E1,\n 0x9E9D: 0x690C,\n 0x9E9E: 0x68CD,\n 0x9E9F: 0x68D4,\n 0x9EA0: 0x68E7,\n 0x9EA1: 0x68D5,\n 0x9EA2: 0x6936,\n 0x9EA3: 0x6912,\n 0x9EA4: 0x6904,\n 0x9EA5: 0x68D7,\n 0x9EA6: 0x68E3,\n 0x9EA7: 0x6925,\n 0x9EA8: 0x68F9,\n 0x9EA9: 0x68E0,\n 0x9EAA: 0x68EF,\n 0x9EAB: 0x6928,\n 0x9EAC: 0x692A,\n 0x9EAD: 0x691A,\n 0x9EAE: 0x6923,\n 0x9EAF: 0x6921,\n 0x9EB0: 0x68C6,\n 0x9EB1: 0x6979,\n 0x9EB2: 0x6977,\n 0x9EB3: 0x695C,\n 0x9EB4: 0x6978,\n 0x9EB5: 0x696B,\n 0x9EB6: 0x6954,\n 0x9EB7: 0x697E,\n 0x9EB8: 0x696E,\n 0x9EB9: 0x6939,\n 0x9EBA: 0x6974,\n 0x9EBB: 0x693D,\n 0x9EBC: 0x6959,\n 0x9EBD: 0x6930,\n 0x9EBE: 0x6961,\n 0x9EBF: 0x695E,\n 0x9EC0: 0x695D,\n 0x9EC1: 0x6981,\n 0x9EC2: 0x696A,\n 0x9EC3: 0x69B2,\n 0x9EC4: 0x69AE,\n 0x9EC5: 0x69D0,\n 0x9EC6: 0x69BF,\n 0x9EC7: 0x69C1,\n 0x9EC8: 0x69D3,\n 0x9EC9: 0x69BE,\n 0x9ECA: 0x69CE,\n 0x9ECB: 0x5BE8,\n 0x9ECC: 0x69CA,\n 0x9ECD: 0x69DD,\n 0x9ECE: 0x69BB,\n 0x9ECF: 0x69C3,\n 0x9ED0: 0x69A7,\n 0x9ED1: 0x6A2E,\n 0x9ED2: 0x6991,\n 0x9ED3: 0x69A0,\n 0x9ED4: 0x699C,\n 0x9ED5: 0x6995,\n 0x9ED6: 0x69B4,\n 0x9ED7: 0x69DE,\n 0x9ED8: 0x69E8,\n 0x9ED9: 0x6A02,\n 0x9EDA: 0x6A1B,\n 0x9EDB: 0x69FF,\n 0x9EDC: 0x6B0A,\n 0x9EDD: 0x69F9,\n 0x9EDE: 0x69F2,\n 0x9EDF: 0x69E7,\n 0x9EE0: 0x6A05,\n 0x9EE1: 0x69B1,\n 0x9EE2: 0x6A1E,\n 0x9EE3: 0x69ED,\n 0x9EE4: 0x6A14,\n 0x9EE5: 0x69EB,\n 0x9EE6: 0x6A0A,\n 0x9EE7: 0x6A12,\n 0x9EE8: 0x6AC1,\n 0x9EE9: 0x6A23,\n 0x9EEA: 0x6A13,\n 0x9EEB: 0x6A44,\n 0x9EEC: 0x6A0C,\n 0x9EED: 0x6A72,\n 0x9EEE: 0x6A36,\n 0x9EEF: 0x6A78,\n 0x9EF0: 0x6A47,\n 0x9EF1: 0x6A62,\n 0x9EF2: 0x6A59,\n 0x9EF3: 0x6A66,\n 0x9EF4: 0x6A48,\n 0x9EF5: 0x6A38,\n 0x9EF6: 0x6A22,\n 0x9EF7: 0x6A90,\n 0x9EF8: 0x6A8D,\n 0x9EF9: 0x6AA0,\n 0x9EFA: 0x6A84,\n 0x9EFB: 0x6AA2,\n 0x9EFC: 0x6AA3,\n 0x9F40: 0x6A97,\n 0x9F41: 0x8617,\n 0x9F42: 0x6ABB,\n 0x9F43: 0x6AC3,\n 0x9F44: 0x6AC2,\n 0x9F45: 0x6AB8,\n 0x9F46: 0x6AB3,\n 0x9F47: 0x6AAC,\n 0x9F48: 0x6ADE,\n 0x9F49: 0x6AD1,\n 0x9F4A: 0x6ADF,\n 0x9F4B: 0x6AAA,\n 0x9F4C: 0x6ADA,\n 0x9F4D: 0x6AEA,\n 0x9F4E: 0x6AFB,\n 0x9F4F: 0x6B05,\n 0x9F50: 0x8616,\n 0x9F51: 0x6AFA,\n 0x9F52: 0x6B12,\n 0x9F53: 0x6B16,\n 0x9F54: 0x9B31,\n 0x9F55: 0x6B1F,\n 0x9F56: 0x6B38,\n 0x9F57: 0x6B37,\n 0x9F58: 0x76DC,\n 0x9F59: 0x6B39,\n 0x9F5A: 0x98EE,\n 0x9F5B: 0x6B47,\n 0x9F5C: 0x6B43,\n 0x9F5D: 0x6B49,\n 0x9F5E: 0x6B50,\n 0x9F5F: 0x6B59,\n 0x9F60: 0x6B54,\n 0x9F61: 0x6B5B,\n 0x9F62: 0x6B5F,\n 0x9F63: 0x6B61,\n 0x9F64: 0x6B78,\n 0x9F65: 0x6B79,\n 0x9F66: 0x6B7F,\n 0x9F67: 0x6B80,\n 0x9F68: 0x6B84,\n 0x9F69: 0x6B83,\n 0x9F6A: 0x6B8D,\n 0x9F6B: 0x6B98,\n 0x9F6C: 0x6B95,\n 0x9F6D: 0x6B9E,\n 0x9F6E: 0x6BA4,\n 0x9F6F: 0x6BAA,\n 0x9F70: 0x6BAB,\n 0x9F71: 0x6BAF,\n 0x9F72: 0x6BB2,\n 0x9F73: 0x6BB1,\n 0x9F74: 0x6BB3,\n 0x9F75: 0x6BB7,\n 0x9F76: 0x6BBC,\n 0x9F77: 0x6BC6,\n 0x9F78: 0x6BCB,\n 0x9F79: 0x6BD3,\n 0x9F7A: 0x6BDF,\n 0x9F7B: 0x6BEC,\n 0x9F7C: 0x6BEB,\n 0x9F7D: 0x6BF3,\n 0x9F7E: 0x6BEF,\n 0x9F80: 0x9EBE,\n 0x9F81: 0x6C08,\n 0x9F82: 0x6C13,\n 0x9F83: 0x6C14,\n 0x9F84: 0x6C1B,\n 0x9F85: 0x6C24,\n 0x9F86: 0x6C23,\n 0x9F87: 0x6C5E,\n 0x9F88: 0x6C55,\n 0x9F89: 0x6C62,\n 0x9F8A: 0x6C6A,\n 0x9F8B: 0x6C82,\n 0x9F8C: 0x6C8D,\n 0x9F8D: 0x6C9A,\n 0x9F8E: 0x6C81,\n 0x9F8F: 0x6C9B,\n 0x9F90: 0x6C7E,\n 0x9F91: 0x6C68,\n 0x9F92: 0x6C73,\n 0x9F93: 0x6C92,\n 0x9F94: 0x6C90,\n 0x9F95: 0x6CC4,\n 0x9F96: 0x6CF1,\n 0x9F97: 0x6CD3,\n 0x9F98: 0x6CBD,\n 0x9F99: 0x6CD7,\n 0x9F9A: 0x6CC5,\n 0x9F9B: 0x6CDD,\n 0x9F9C: 0x6CAE,\n 0x9F9D: 0x6CB1,\n 0x9F9E: 0x6CBE,\n 0x9F9F: 0x6CBA,\n 0x9FA0: 0x6CDB,\n 0x9FA1: 0x6CEF,\n 0x9FA2: 0x6CD9,\n 0x9FA3: 0x6CEA,\n 0x9FA4: 0x6D1F,\n 0x9FA5: 0x884D,\n 0x9FA6: 0x6D36,\n 0x9FA7: 0x6D2B,\n 0x9FA8: 0x6D3D,\n 0x9FA9: 0x6D38,\n 0x9FAA: 0x6D19,\n 0x9FAB: 0x6D35,\n 0x9FAC: 0x6D33,\n 0x9FAD: 0x6D12,\n 0x9FAE: 0x6D0C,\n 0x9FAF: 0x6D63,\n 0x9FB0: 0x6D93,\n 0x9FB1: 0x6D64,\n 0x9FB2: 0x6D5A,\n 0x9FB3: 0x6D79,\n 0x9FB4: 0x6D59,\n 0x9FB5: 0x6D8E,\n 0x9FB6: 0x6D95,\n 0x9FB7: 0x6FE4,\n 0x9FB8: 0x6D85,\n 0x9FB9: 0x6DF9,\n 0x9FBA: 0x6E15,\n 0x9FBB: 0x6E0A,\n 0x9FBC: 0x6DB5,\n 0x9FBD: 0x6DC7,\n 0x9FBE: 0x6DE6,\n 0x9FBF: 0x6DB8,\n 0x9FC0: 0x6DC6,\n 0x9FC1: 0x6DEC,\n 0x9FC2: 0x6DDE,\n 0x9FC3: 0x6DCC,\n 0x9FC4: 0x6DE8,\n 0x9FC5: 0x6DD2,\n 0x9FC6: 0x6DC5,\n 0x9FC7: 0x6DFA,\n 0x9FC8: 0x6DD9,\n 0x9FC9: 0x6DE4,\n 0x9FCA: 0x6DD5,\n 0x9FCB: 0x6DEA,\n 0x9FCC: 0x6DEE,\n 0x9FCD: 0x6E2D,\n 0x9FCE: 0x6E6E,\n 0x9FCF: 0x6E2E,\n 0x9FD0: 0x6E19,\n 0x9FD1: 0x6E72,\n 0x9FD2: 0x6E5F,\n 0x9FD3: 0x6E3E,\n 0x9FD4: 0x6E23,\n 0x9FD5: 0x6E6B,\n 0x9FD6: 0x6E2B,\n 0x9FD7: 0x6E76,\n 0x9FD8: 0x6E4D,\n 0x9FD9: 0x6E1F,\n 0x9FDA: 0x6E43,\n 0x9FDB: 0x6E3A,\n 0x9FDC: 0x6E4E,\n 0x9FDD: 0x6E24,\n 0x9FDE: 0x6EFF,\n 0x9FDF: 0x6E1D,\n 0x9FE0: 0x6E38,\n 0x9FE1: 0x6E82,\n 0x9FE2: 0x6EAA,\n 0x9FE3: 0x6E98,\n 0x9FE4: 0x6EC9,\n 0x9FE5: 0x6EB7,\n 0x9FE6: 0x6ED3,\n 0x9FE7: 0x6EBD,\n 0x9FE8: 0x6EAF,\n 0x9FE9: 0x6EC4,\n 0x9FEA: 0x6EB2,\n 0x9FEB: 0x6ED4,\n 0x9FEC: 0x6ED5,\n 0x9FED: 0x6E8F,\n 0x9FEE: 0x6EA5,\n 0x9FEF: 0x6EC2,\n 0x9FF0: 0x6E9F,\n 0x9FF1: 0x6F41,\n 0x9FF2: 0x6F11,\n 0x9FF3: 0x704C,\n 0x9FF4: 0x6EEC,\n 0x9FF5: 0x6EF8,\n 0x9FF6: 0x6EFE,\n 0x9FF7: 0x6F3F,\n 0x9FF8: 0x6EF2,\n 0x9FF9: 0x6F31,\n 0x9FFA: 0x6EEF,\n 0x9FFB: 0x6F32,\n 0x9FFC: 0x6ECC,\n 0xA1: 0xFF61,\n 0xA2: 0xFF62,\n 0xA3: 0xFF63,\n 0xA4: 0xFF64,\n 0xA5: 0xFF65,\n 0xA6: 0xFF66,\n 0xA7: 0xFF67,\n 0xA8: 0xFF68,\n 0xA9: 0xFF69,\n 0xAA: 0xFF6A,\n 0xAB: 0xFF6B,\n 0xAC: 0xFF6C,\n 0xAD: 0xFF6D,\n 0xAE: 0xFF6E,\n 0xAF: 0xFF6F,\n 0xB0: 0xFF70,\n 0xB1: 0xFF71,\n 0xB2: 0xFF72,\n 0xB3: 0xFF73,\n 0xB4: 0xFF74,\n 0xB5: 0xFF75,\n 0xB6: 0xFF76,\n 0xB7: 0xFF77,\n 0xB8: 0xFF78,\n 0xB9: 0xFF79,\n 0xBA: 0xFF7A,\n 0xBB: 0xFF7B,\n 0xBC: 0xFF7C,\n 0xBD: 0xFF7D,\n 0xBE: 0xFF7E,\n 0xBF: 0xFF7F,\n 0xC0: 0xFF80,\n 0xC1: 0xFF81,\n 0xC2: 0xFF82,\n 0xC3: 0xFF83,\n 0xC4: 0xFF84,\n 0xC5: 0xFF85,\n 0xC6: 0xFF86,\n 0xC7: 0xFF87,\n 0xC8: 0xFF88,\n 0xC9: 0xFF89,\n 0xCA: 0xFF8A,\n 0xCB: 0xFF8B,\n 0xCC: 0xFF8C,\n 0xCD: 0xFF8D,\n 0xCE: 0xFF8E,\n 0xCF: 0xFF8F,\n 0xD0: 0xFF90,\n 0xD1: 0xFF91,\n 0xD2: 0xFF92,\n 0xD3: 0xFF93,\n 0xD4: 0xFF94,\n 0xD5: 0xFF95,\n 0xD6: 0xFF96,\n 0xD7: 0xFF97,\n 0xD8: 0xFF98,\n 0xD9: 0xFF99,\n 0xDA: 0xFF9A,\n 0xDB: 0xFF9B,\n 0xDC: 0xFF9C,\n 0xDD: 0xFF9D,\n 0xDE: 0xFF9E,\n 0xDF: 0xFF9F,\n 0xE040: 0x6F3E,\n 0xE041: 0x6F13,\n 0xE042: 0x6EF7,\n 0xE043: 0x6F86,\n 0xE044: 0x6F7A,\n 0xE045: 0x6F78,\n 0xE046: 0x6F81,\n 0xE047: 0x6F80,\n 0xE048: 0x6F6F,\n 0xE049: 0x6F5B,\n 0xE04A: 0x6FF3,\n 0xE04B: 0x6F6D,\n 0xE04C: 0x6F82,\n 0xE04D: 0x6F7C,\n 0xE04E: 0x6F58,\n 0xE04F: 0x6F8E,\n 0xE050: 0x6F91,\n 0xE051: 0x6FC2,\n 0xE052: 0x6F66,\n 0xE053: 0x6FB3,\n 0xE054: 0x6FA3,\n 0xE055: 0x6FA1,\n 0xE056: 0x6FA4,\n 0xE057: 0x6FB9,\n 0xE058: 0x6FC6,\n 0xE059: 0x6FAA,\n 0xE05A: 0x6FDF,\n 0xE05B: 0x6FD5,\n 0xE05C: 0x6FEC,\n 0xE05D: 0x6FD4,\n 0xE05E: 0x6FD8,\n 0xE05F: 0x6FF1,\n 0xE060: 0x6FEE,\n 0xE061: 0x6FDB,\n 0xE062: 0x7009,\n 0xE063: 0x700B,\n 0xE064: 0x6FFA,\n 0xE065: 0x7011,\n 0xE066: 0x7001,\n 0xE067: 0x700F,\n 0xE068: 0x6FFE,\n 0xE069: 0x701B,\n 0xE06A: 0x701A,\n 0xE06B: 0x6F74,\n 0xE06C: 0x701D,\n 0xE06D: 0x7018,\n 0xE06E: 0x701F,\n 0xE06F: 0x7030,\n 0xE070: 0x703E,\n 0xE071: 0x7032,\n 0xE072: 0x7051,\n 0xE073: 0x7063,\n 0xE074: 0x7099,\n 0xE075: 0x7092,\n 0xE076: 0x70AF,\n 0xE077: 0x70F1,\n 0xE078: 0x70AC,\n 0xE079: 0x70B8,\n 0xE07A: 0x70B3,\n 0xE07B: 0x70AE,\n 0xE07C: 0x70DF,\n 0xE07D: 0x70CB,\n 0xE07E: 0x70DD,\n 0xE080: 0x70D9,\n 0xE081: 0x7109,\n 0xE082: 0x70FD,\n 0xE083: 0x711C,\n 0xE084: 0x7119,\n 0xE085: 0x7165,\n 0xE086: 0x7155,\n 0xE087: 0x7188,\n 0xE088: 0x7166,\n 0xE089: 0x7162,\n 0xE08A: 0x714C,\n 0xE08B: 0x7156,\n 0xE08C: 0x716C,\n 0xE08D: 0x718F,\n 0xE08E: 0x71FB,\n 0xE08F: 0x7184,\n 0xE090: 0x7195,\n 0xE091: 0x71A8,\n 0xE092: 0x71AC,\n 0xE093: 0x71D7,\n 0xE094: 0x71B9,\n 0xE095: 0x71BE,\n 0xE096: 0x71D2,\n 0xE097: 0x71C9,\n 0xE098: 0x71D4,\n 0xE099: 0x71CE,\n 0xE09A: 0x71E0,\n 0xE09B: 0x71EC,\n 0xE09C: 0x71E7,\n 0xE09D: 0x71F5,\n 0xE09E: 0x71FC,\n 0xE09F: 0x71F9,\n 0xE0A0: 0x71FF,\n 0xE0A1: 0x720D,\n 0xE0A2: 0x7210,\n 0xE0A3: 0x721B,\n 0xE0A4: 0x7228,\n 0xE0A5: 0x722D,\n 0xE0A6: 0x722C,\n 0xE0A7: 0x7230,\n 0xE0A8: 0x7232,\n 0xE0A9: 0x723B,\n 0xE0AA: 0x723C,\n 0xE0AB: 0x723F,\n 0xE0AC: 0x7240,\n 0xE0AD: 0x7246,\n 0xE0AE: 0x724B,\n 0xE0AF: 0x7258,\n 0xE0B0: 0x7274,\n 0xE0B1: 0x727E,\n 0xE0B2: 0x7282,\n 0xE0B3: 0x7281,\n 0xE0B4: 0x7287,\n 0xE0B5: 0x7292,\n 0xE0B6: 0x7296,\n 0xE0B7: 0x72A2,\n 0xE0B8: 0x72A7,\n 0xE0B9: 0x72B9,\n 0xE0BA: 0x72B2,\n 0xE0BB: 0x72C3,\n 0xE0BC: 0x72C6,\n 0xE0BD: 0x72C4,\n 0xE0BE: 0x72CE,\n 0xE0BF: 0x72D2,\n 0xE0C0: 0x72E2,\n 0xE0C1: 0x72E0,\n 0xE0C2: 0x72E1,\n 0xE0C3: 0x72F9,\n 0xE0C4: 0x72F7,\n 0xE0C5: 0x500F,\n 0xE0C6: 0x7317,\n 0xE0C7: 0x730A,\n 0xE0C8: 0x731C,\n 0xE0C9: 0x7316,\n 0xE0CA: 0x731D,\n 0xE0CB: 0x7334,\n 0xE0CC: 0x732F,\n 0xE0CD: 0x7329,\n 0xE0CE: 0x7325,\n 0xE0CF: 0x733E,\n 0xE0D0: 0x734E,\n 0xE0D1: 0x734F,\n 0xE0D2: 0x9ED8,\n 0xE0D3: 0x7357,\n 0xE0D4: 0x736A,\n 0xE0D5: 0x7368,\n 0xE0D6: 0x7370,\n 0xE0D7: 0x7378,\n 0xE0D8: 0x7375,\n 0xE0D9: 0x737B,\n 0xE0DA: 0x737A,\n 0xE0DB: 0x73C8,\n 0xE0DC: 0x73B3,\n 0xE0DD: 0x73CE,\n 0xE0DE: 0x73BB,\n 0xE0DF: 0x73C0,\n 0xE0E0: 0x73E5,\n 0xE0E1: 0x73EE,\n 0xE0E2: 0x73DE,\n 0xE0E3: 0x74A2,\n 0xE0E4: 0x7405,\n 0xE0E5: 0x746F,\n 0xE0E6: 0x7425,\n 0xE0E7: 0x73F8,\n 0xE0E8: 0x7432,\n 0xE0E9: 0x743A,\n 0xE0EA: 0x7455,\n 0xE0EB: 0x743F,\n 0xE0EC: 0x745F,\n 0xE0ED: 0x7459,\n 0xE0EE: 0x7441,\n 0xE0EF: 0x745C,\n 0xE0F0: 0x7469,\n 0xE0F1: 0x7470,\n 0xE0F2: 0x7463,\n 0xE0F3: 0x746A,\n 0xE0F4: 0x7476,\n 0xE0F5: 0x747E,\n 0xE0F6: 0x748B,\n 0xE0F7: 0x749E,\n 0xE0F8: 0x74A7,\n 0xE0F9: 0x74CA,\n 0xE0FA: 0x74CF,\n 0xE0FB: 0x74D4,\n 0xE0FC: 0x73F1,\n 0xE140: 0x74E0,\n 0xE141: 0x74E3,\n 0xE142: 0x74E7,\n 0xE143: 0x74E9,\n 0xE144: 0x74EE,\n 0xE145: 0x74F2,\n 0xE146: 0x74F0,\n 0xE147: 0x74F1,\n 0xE148: 0x74F8,\n 0xE149: 0x74F7,\n 0xE14A: 0x7504,\n 0xE14B: 0x7503,\n 0xE14C: 0x7505,\n 0xE14D: 0x750C,\n 0xE14E: 0x750E,\n 0xE14F: 0x750D,\n 0xE150: 0x7515,\n 0xE151: 0x7513,\n 0xE152: 0x751E,\n 0xE153: 0x7526,\n 0xE154: 0x752C,\n 0xE155: 0x753C,\n 0xE156: 0x7544,\n 0xE157: 0x754D,\n 0xE158: 0x754A,\n 0xE159: 0x7549,\n 0xE15A: 0x755B,\n 0xE15B: 0x7546,\n 0xE15C: 0x755A,\n 0xE15D: 0x7569,\n 0xE15E: 0x7564,\n 0xE15F: 0x7567,\n 0xE160: 0x756B,\n 0xE161: 0x756D,\n 0xE162: 0x7578,\n 0xE163: 0x7576,\n 0xE164: 0x7586,\n 0xE165: 0x7587,\n 0xE166: 0x7574,\n 0xE167: 0x758A,\n 0xE168: 0x7589,\n 0xE169: 0x7582,\n 0xE16A: 0x7594,\n 0xE16B: 0x759A,\n 0xE16C: 0x759D,\n 0xE16D: 0x75A5,\n 0xE16E: 0x75A3,\n 0xE16F: 0x75C2,\n 0xE170: 0x75B3,\n 0xE171: 0x75C3,\n 0xE172: 0x75B5,\n 0xE173: 0x75BD,\n 0xE174: 0x75B8,\n 0xE175: 0x75BC,\n 0xE176: 0x75B1,\n 0xE177: 0x75CD,\n 0xE178: 0x75CA,\n 0xE179: 0x75D2,\n 0xE17A: 0x75D9,\n 0xE17B: 0x75E3,\n 0xE17C: 0x75DE,\n 0xE17D: 0x75FE,\n 0xE17E: 0x75FF,\n 0xE180: 0x75FC,\n 0xE181: 0x7601,\n 0xE182: 0x75F0,\n 0xE183: 0x75FA,\n 0xE184: 0x75F2,\n 0xE185: 0x75F3,\n 0xE186: 0x760B,\n 0xE187: 0x760D,\n 0xE188: 0x7609,\n 0xE189: 0x761F,\n 0xE18A: 0x7627,\n 0xE18B: 0x7620,\n 0xE18C: 0x7621,\n 0xE18D: 0x7622,\n 0xE18E: 0x7624,\n 0xE18F: 0x7634,\n 0xE190: 0x7630,\n 0xE191: 0x763B,\n 0xE192: 0x7647,\n 0xE193: 0x7648,\n 0xE194: 0x7646,\n 0xE195: 0x765C,\n 0xE196: 0x7658,\n 0xE197: 0x7661,\n 0xE198: 0x7662,\n 0xE199: 0x7668,\n 0xE19A: 0x7669,\n 0xE19B: 0x766A,\n 0xE19C: 0x7667,\n 0xE19D: 0x766C,\n 0xE19E: 0x7670,\n 0xE19F: 0x7672,\n 0xE1A0: 0x7676,\n 0xE1A1: 0x7678,\n 0xE1A2: 0x767C,\n 0xE1A3: 0x7680,\n 0xE1A4: 0x7683,\n 0xE1A5: 0x7688,\n 0xE1A6: 0x768B,\n 0xE1A7: 0x768E,\n 0xE1A8: 0x7696,\n 0xE1A9: 0x7693,\n 0xE1AA: 0x7699,\n 0xE1AB: 0x769A,\n 0xE1AC: 0x76B0,\n 0xE1AD: 0x76B4,\n 0xE1AE: 0x76B8,\n 0xE1AF: 0x76B9,\n 0xE1B0: 0x76BA,\n 0xE1B1: 0x76C2,\n 0xE1B2: 0x76CD,\n 0xE1B3: 0x76D6,\n 0xE1B4: 0x76D2,\n 0xE1B5: 0x76DE,\n 0xE1B6: 0x76E1,\n 0xE1B7: 0x76E5,\n 0xE1B8: 0x76E7,\n 0xE1B9: 0x76EA,\n 0xE1BA: 0x862F,\n 0xE1BB: 0x76FB,\n 0xE1BC: 0x7708,\n 0xE1BD: 0x7707,\n 0xE1BE: 0x7704,\n 0xE1BF: 0x7729,\n 0xE1C0: 0x7724,\n 0xE1C1: 0x771E,\n 0xE1C2: 0x7725,\n 0xE1C3: 0x7726,\n 0xE1C4: 0x771B,\n 0xE1C5: 0x7737,\n 0xE1C6: 0x7738,\n 0xE1C7: 0x7747,\n 0xE1C8: 0x775A,\n 0xE1C9: 0x7768,\n 0xE1CA: 0x776B,\n 0xE1CB: 0x775B,\n 0xE1CC: 0x7765,\n 0xE1CD: 0x777F,\n 0xE1CE: 0x777E,\n 0xE1CF: 0x7779,\n 0xE1D0: 0x778E,\n 0xE1D1: 0x778B,\n 0xE1D2: 0x7791,\n 0xE1D3: 0x77A0,\n 0xE1D4: 0x779E,\n 0xE1D5: 0x77B0,\n 0xE1D6: 0x77B6,\n 0xE1D7: 0x77B9,\n 0xE1D8: 0x77BF,\n 0xE1D9: 0x77BC,\n 0xE1DA: 0x77BD,\n 0xE1DB: 0x77BB,\n 0xE1DC: 0x77C7,\n 0xE1DD: 0x77CD,\n 0xE1DE: 0x77D7,\n 0xE1DF: 0x77DA,\n 0xE1E0: 0x77DC,\n 0xE1E1: 0x77E3,\n 0xE1E2: 0x77EE,\n 0xE1E3: 0x77FC,\n 0xE1E4: 0x780C,\n 0xE1E5: 0x7812,\n 0xE1E6: 0x7926,\n 0xE1E7: 0x7820,\n 0xE1E8: 0x792A,\n 0xE1E9: 0x7845,\n 0xE1EA: 0x788E,\n 0xE1EB: 0x7874,\n 0xE1EC: 0x7886,\n 0xE1ED: 0x787C,\n 0xE1EE: 0x789A,\n 0xE1EF: 0x788C,\n 0xE1F0: 0x78A3,\n 0xE1F1: 0x78B5,\n 0xE1F2: 0x78AA,\n 0xE1F3: 0x78AF,\n 0xE1F4: 0x78D1,\n 0xE1F5: 0x78C6,\n 0xE1F6: 0x78CB,\n 0xE1F7: 0x78D4,\n 0xE1F8: 0x78BE,\n 0xE1F9: 0x78BC,\n 0xE1FA: 0x78C5,\n 0xE1FB: 0x78CA,\n 0xE1FC: 0x78EC,\n 0xE240: 0x78E7,\n 0xE241: 0x78DA,\n 0xE242: 0x78FD,\n 0xE243: 0x78F4,\n 0xE244: 0x7907,\n 0xE245: 0x7912,\n 0xE246: 0x7911,\n 0xE247: 0x7919,\n 0xE248: 0x792C,\n 0xE249: 0x792B,\n 0xE24A: 0x7940,\n 0xE24B: 0x7960,\n 0xE24C: 0x7957,\n 0xE24D: 0x795F,\n 0xE24E: 0x795A,\n 0xE24F: 0x7955,\n 0xE250: 0x7953,\n 0xE251: 0x797A,\n 0xE252: 0x797F,\n 0xE253: 0x798A,\n 0xE254: 0x799D,\n 0xE255: 0x79A7,\n 0xE256: 0x9F4B,\n 0xE257: 0x79AA,\n 0xE258: 0x79AE,\n 0xE259: 0x79B3,\n 0xE25A: 0x79B9,\n 0xE25B: 0x79BA,\n 0xE25C: 0x79C9,\n 0xE25D: 0x79D5,\n 0xE25E: 0x79E7,\n 0xE25F: 0x79EC,\n 0xE260: 0x79E1,\n 0xE261: 0x79E3,\n 0xE262: 0x7A08,\n 0xE263: 0x7A0D,\n 0xE264: 0x7A18,\n 0xE265: 0x7A19,\n 0xE266: 0x7A20,\n 0xE267: 0x7A1F,\n 0xE268: 0x7980,\n 0xE269: 0x7A31,\n 0xE26A: 0x7A3B,\n 0xE26B: 0x7A3E,\n 0xE26C: 0x7A37,\n 0xE26D: 0x7A43,\n 0xE26E: 0x7A57,\n 0xE26F: 0x7A49,\n 0xE270: 0x7A61,\n 0xE271: 0x7A62,\n 0xE272: 0x7A69,\n 0xE273: 0x9F9D,\n 0xE274: 0x7A70,\n 0xE275: 0x7A79,\n 0xE276: 0x7A7D,\n 0xE277: 0x7A88,\n 0xE278: 0x7A97,\n 0xE279: 0x7A95,\n 0xE27A: 0x7A98,\n 0xE27B: 0x7A96,\n 0xE27C: 0x7AA9,\n 0xE27D: 0x7AC8,\n 0xE27E: 0x7AB0,\n 0xE280: 0x7AB6,\n 0xE281: 0x7AC5,\n 0xE282: 0x7AC4,\n 0xE283: 0x7ABF,\n 0xE284: 0x9083,\n 0xE285: 0x7AC7,\n 0xE286: 0x7ACA,\n 0xE287: 0x7ACD,\n 0xE288: 0x7ACF,\n 0xE289: 0x7AD5,\n 0xE28A: 0x7AD3,\n 0xE28B: 0x7AD9,\n 0xE28C: 0x7ADA,\n 0xE28D: 0x7ADD,\n 0xE28E: 0x7AE1,\n 0xE28F: 0x7AE2,\n 0xE290: 0x7AE6,\n 0xE291: 0x7AED,\n 0xE292: 0x7AF0,\n 0xE293: 0x7B02,\n 0xE294: 0x7B0F,\n 0xE295: 0x7B0A,\n 0xE296: 0x7B06,\n 0xE297: 0x7B33,\n 0xE298: 0x7B18,\n 0xE299: 0x7B19,\n 0xE29A: 0x7B1E,\n 0xE29B: 0x7B35,\n 0xE29C: 0x7B28,\n 0xE29D: 0x7B36,\n 0xE29E: 0x7B50,\n 0xE29F: 0x7B7A,\n 0xE2A0: 0x7B04,\n 0xE2A1: 0x7B4D,\n 0xE2A2: 0x7B0B,\n 0xE2A3: 0x7B4C,\n 0xE2A4: 0x7B45,\n 0xE2A5: 0x7B75,\n 0xE2A6: 0x7B65,\n 0xE2A7: 0x7B74,\n 0xE2A8: 0x7B67,\n 0xE2A9: 0x7B70,\n 0xE2AA: 0x7B71,\n 0xE2AB: 0x7B6C,\n 0xE2AC: 0x7B6E,\n 0xE2AD: 0x7B9D,\n 0xE2AE: 0x7B98,\n 0xE2AF: 0x7B9F,\n 0xE2B0: 0x7B8D,\n 0xE2B1: 0x7B9C,\n 0xE2B2: 0x7B9A,\n 0xE2B3: 0x7B8B,\n 0xE2B4: 0x7B92,\n 0xE2B5: 0x7B8F,\n 0xE2B6: 0x7B5D,\n 0xE2B7: 0x7B99,\n 0xE2B8: 0x7BCB,\n 0xE2B9: 0x7BC1,\n 0xE2BA: 0x7BCC,\n 0xE2BB: 0x7BCF,\n 0xE2BC: 0x7BB4,\n 0xE2BD: 0x7BC6,\n 0xE2BE: 0x7BDD,\n 0xE2BF: 0x7BE9,\n 0xE2C0: 0x7C11,\n 0xE2C1: 0x7C14,\n 0xE2C2: 0x7BE6,\n 0xE2C3: 0x7BE5,\n 0xE2C4: 0x7C60,\n 0xE2C5: 0x7C00,\n 0xE2C6: 0x7C07,\n 0xE2C7: 0x7C13,\n 0xE2C8: 0x7BF3,\n 0xE2C9: 0x7BF7,\n 0xE2CA: 0x7C17,\n 0xE2CB: 0x7C0D,\n 0xE2CC: 0x7BF6,\n 0xE2CD: 0x7C23,\n 0xE2CE: 0x7C27,\n 0xE2CF: 0x7C2A,\n 0xE2D0: 0x7C1F,\n 0xE2D1: 0x7C37,\n 0xE2D2: 0x7C2B,\n 0xE2D3: 0x7C3D,\n 0xE2D4: 0x7C4C,\n 0xE2D5: 0x7C43,\n 0xE2D6: 0x7C54,\n 0xE2D7: 0x7C4F,\n 0xE2D8: 0x7C40,\n 0xE2D9: 0x7C50,\n 0xE2DA: 0x7C58,\n 0xE2DB: 0x7C5F,\n 0xE2DC: 0x7C64,\n 0xE2DD: 0x7C56,\n 0xE2DE: 0x7C65,\n 0xE2DF: 0x7C6C,\n 0xE2E0: 0x7C75,\n 0xE2E1: 0x7C83,\n 0xE2E2: 0x7C90,\n 0xE2E3: 0x7CA4,\n 0xE2E4: 0x7CAD,\n 0xE2E5: 0x7CA2,\n 0xE2E6: 0x7CAB,\n 0xE2E7: 0x7CA1,\n 0xE2E8: 0x7CA8,\n 0xE2E9: 0x7CB3,\n 0xE2EA: 0x7CB2,\n 0xE2EB: 0x7CB1,\n 0xE2EC: 0x7CAE,\n 0xE2ED: 0x7CB9,\n 0xE2EE: 0x7CBD,\n 0xE2EF: 0x7CC0,\n 0xE2F0: 0x7CC5,\n 0xE2F1: 0x7CC2,\n 0xE2F2: 0x7CD8,\n 0xE2F3: 0x7CD2,\n 0xE2F4: 0x7CDC,\n 0xE2F5: 0x7CE2,\n 0xE2F6: 0x9B3B,\n 0xE2F7: 0x7CEF,\n 0xE2F8: 0x7CF2,\n 0xE2F9: 0x7CF4,\n 0xE2FA: 0x7CF6,\n 0xE2FB: 0x7CFA,\n 0xE2FC: 0x7D06,\n 0xE340: 0x7D02,\n 0xE341: 0x7D1C,\n 0xE342: 0x7D15,\n 0xE343: 0x7D0A,\n 0xE344: 0x7D45,\n 0xE345: 0x7D4B,\n 0xE346: 0x7D2E,\n 0xE347: 0x7D32,\n 0xE348: 0x7D3F,\n 0xE349: 0x7D35,\n 0xE34A: 0x7D46,\n 0xE34B: 0x7D73,\n 0xE34C: 0x7D56,\n 0xE34D: 0x7D4E,\n 0xE34E: 0x7D72,\n 0xE34F: 0x7D68,\n 0xE350: 0x7D6E,\n 0xE351: 0x7D4F,\n 0xE352: 0x7D63,\n 0xE353: 0x7D93,\n 0xE354: 0x7D89,\n 0xE355: 0x7D5B,\n 0xE356: 0x7D8F,\n 0xE357: 0x7D7D,\n 0xE358: 0x7D9B,\n 0xE359: 0x7DBA,\n 0xE35A: 0x7DAE,\n 0xE35B: 0x7DA3,\n 0xE35C: 0x7DB5,\n 0xE35D: 0x7DC7,\n 0xE35E: 0x7DBD,\n 0xE35F: 0x7DAB,\n 0xE360: 0x7E3D,\n 0xE361: 0x7DA2,\n 0xE362: 0x7DAF,\n 0xE363: 0x7DDC,\n 0xE364: 0x7DB8,\n 0xE365: 0x7D9F,\n 0xE366: 0x7DB0,\n 0xE367: 0x7DD8,\n 0xE368: 0x7DDD,\n 0xE369: 0x7DE4,\n 0xE36A: 0x7DDE,\n 0xE36B: 0x7DFB,\n 0xE36C: 0x7DF2,\n 0xE36D: 0x7DE1,\n 0xE36E: 0x7E05,\n 0xE36F: 0x7E0A,\n 0xE370: 0x7E23,\n 0xE371: 0x7E21,\n 0xE372: 0x7E12,\n 0xE373: 0x7E31,\n 0xE374: 0x7E1F,\n 0xE375: 0x7E09,\n 0xE376: 0x7E0B,\n 0xE377: 0x7E22,\n 0xE378: 0x7E46,\n 0xE379: 0x7E66,\n 0xE37A: 0x7E3B,\n 0xE37B: 0x7E35,\n 0xE37C: 0x7E39,\n 0xE37D: 0x7E43,\n 0xE37E: 0x7E37,\n 0xE380: 0x7E32,\n 0xE381: 0x7E3A,\n 0xE382: 0x7E67,\n 0xE383: 0x7E5D,\n 0xE384: 0x7E56,\n 0xE385: 0x7E5E,\n 0xE386: 0x7E59,\n 0xE387: 0x7E5A,\n 0xE388: 0x7E79,\n 0xE389: 0x7E6A,\n 0xE38A: 0x7E69,\n 0xE38B: 0x7E7C,\n 0xE38C: 0x7E7B,\n 0xE38D: 0x7E83,\n 0xE38E: 0x7DD5,\n 0xE38F: 0x7E7D,\n 0xE390: 0x8FAE,\n 0xE391: 0x7E7F,\n 0xE392: 0x7E88,\n 0xE393: 0x7E89,\n 0xE394: 0x7E8C,\n 0xE395: 0x7E92,\n 0xE396: 0x7E90,\n 0xE397: 0x7E93,\n 0xE398: 0x7E94,\n 0xE399: 0x7E96,\n 0xE39A: 0x7E8E,\n 0xE39B: 0x7E9B,\n 0xE39C: 0x7E9C,\n 0xE39D: 0x7F38,\n 0xE39E: 0x7F3A,\n 0xE39F: 0x7F45,\n 0xE3A0: 0x7F4C,\n 0xE3A1: 0x7F4D,\n 0xE3A2: 0x7F4E,\n 0xE3A3: 0x7F50,\n 0xE3A4: 0x7F51,\n 0xE3A5: 0x7F55,\n 0xE3A6: 0x7F54,\n 0xE3A7: 0x7F58,\n 0xE3A8: 0x7F5F,\n 0xE3A9: 0x7F60,\n 0xE3AA: 0x7F68,\n 0xE3AB: 0x7F69,\n 0xE3AC: 0x7F67,\n 0xE3AD: 0x7F78,\n 0xE3AE: 0x7F82,\n 0xE3AF: 0x7F86,\n 0xE3B0: 0x7F83,\n 0xE3B1: 0x7F88,\n 0xE3B2: 0x7F87,\n 0xE3B3: 0x7F8C,\n 0xE3B4: 0x7F94,\n 0xE3B5: 0x7F9E,\n 0xE3B6: 0x7F9D,\n 0xE3B7: 0x7F9A,\n 0xE3B8: 0x7FA3,\n 0xE3B9: 0x7FAF,\n 0xE3BA: 0x7FB2,\n 0xE3BB: 0x7FB9,\n 0xE3BC: 0x7FAE,\n 0xE3BD: 0x7FB6,\n 0xE3BE: 0x7FB8,\n 0xE3BF: 0x8B71,\n 0xE3C0: 0x7FC5,\n 0xE3C1: 0x7FC6,\n 0xE3C2: 0x7FCA,\n 0xE3C3: 0x7FD5,\n 0xE3C4: 0x7FD4,\n 0xE3C5: 0x7FE1,\n 0xE3C6: 0x7FE6,\n 0xE3C7: 0x7FE9,\n 0xE3C8: 0x7FF3,\n 0xE3C9: 0x7FF9,\n 0xE3CA: 0x98DC,\n 0xE3CB: 0x8006,\n 0xE3CC: 0x8004,\n 0xE3CD: 0x800B,\n 0xE3CE: 0x8012,\n 0xE3CF: 0x8018,\n 0xE3D0: 0x8019,\n 0xE3D1: 0x801C,\n 0xE3D2: 0x8021,\n 0xE3D3: 0x8028,\n 0xE3D4: 0x803F,\n 0xE3D5: 0x803B,\n 0xE3D6: 0x804A,\n 0xE3D7: 0x8046,\n 0xE3D8: 0x8052,\n 0xE3D9: 0x8058,\n 0xE3DA: 0x805A,\n 0xE3DB: 0x805F,\n 0xE3DC: 0x8062,\n 0xE3DD: 0x8068,\n 0xE3DE: 0x8073,\n 0xE3DF: 0x8072,\n 0xE3E0: 0x8070,\n 0xE3E1: 0x8076,\n 0xE3E2: 0x8079,\n 0xE3E3: 0x807D,\n 0xE3E4: 0x807F,\n 0xE3E5: 0x8084,\n 0xE3E6: 0x8086,\n 0xE3E7: 0x8085,\n 0xE3E8: 0x809B,\n 0xE3E9: 0x8093,\n 0xE3EA: 0x809A,\n 0xE3EB: 0x80AD,\n 0xE3EC: 0x5190,\n 0xE3ED: 0x80AC,\n 0xE3EE: 0x80DB,\n 0xE3EF: 0x80E5,\n 0xE3F0: 0x80D9,\n 0xE3F1: 0x80DD,\n 0xE3F2: 0x80C4,\n 0xE3F3: 0x80DA,\n 0xE3F4: 0x80D6,\n 0xE3F5: 0x8109,\n 0xE3F6: 0x80EF,\n 0xE3F7: 0x80F1,\n 0xE3F8: 0x811B,\n 0xE3F9: 0x8129,\n 0xE3FA: 0x8123,\n 0xE3FB: 0x812F,\n 0xE3FC: 0x814B,\n 0xE440: 0x968B,\n 0xE441: 0x8146,\n 0xE442: 0x813E,\n 0xE443: 0x8153,\n 0xE444: 0x8151,\n 0xE445: 0x80FC,\n 0xE446: 0x8171,\n 0xE447: 0x816E,\n 0xE448: 0x8165,\n 0xE449: 0x8166,\n 0xE44A: 0x8174,\n 0xE44B: 0x8183,\n 0xE44C: 0x8188,\n 0xE44D: 0x818A,\n 0xE44E: 0x8180,\n 0xE44F: 0x8182,\n 0xE450: 0x81A0,\n 0xE451: 0x8195,\n 0xE452: 0x81A4,\n 0xE453: 0x81A3,\n 0xE454: 0x815F,\n 0xE455: 0x8193,\n 0xE456: 0x81A9,\n 0xE457: 0x81B0,\n 0xE458: 0x81B5,\n 0xE459: 0x81BE,\n 0xE45A: 0x81B8,\n 0xE45B: 0x81BD,\n 0xE45C: 0x81C0,\n 0xE45D: 0x81C2,\n 0xE45E: 0x81BA,\n 0xE45F: 0x81C9,\n 0xE460: 0x81CD,\n 0xE461: 0x81D1,\n 0xE462: 0x81D9,\n 0xE463: 0x81D8,\n 0xE464: 0x81C8,\n 0xE465: 0x81DA,\n 0xE466: 0x81DF,\n 0xE467: 0x81E0,\n 0xE468: 0x81E7,\n 0xE469: 0x81FA,\n 0xE46A: 0x81FB,\n 0xE46B: 0x81FE,\n 0xE46C: 0x8201,\n 0xE46D: 0x8202,\n 0xE46E: 0x8205,\n 0xE46F: 0x8207,\n 0xE470: 0x820A,\n 0xE471: 0x820D,\n 0xE472: 0x8210,\n 0xE473: 0x8216,\n 0xE474: 0x8229,\n 0xE475: 0x822B,\n 0xE476: 0x8238,\n 0xE477: 0x8233,\n 0xE478: 0x8240,\n 0xE479: 0x8259,\n 0xE47A: 0x8258,\n 0xE47B: 0x825D,\n 0xE47C: 0x825A,\n 0xE47D: 0x825F,\n 0xE47E: 0x8264,\n 0xE480: 0x8262,\n 0xE481: 0x8268,\n 0xE482: 0x826A,\n 0xE483: 0x826B,\n 0xE484: 0x822E,\n 0xE485: 0x8271,\n 0xE486: 0x8277,\n 0xE487: 0x8278,\n 0xE488: 0x827E,\n 0xE489: 0x828D,\n 0xE48A: 0x8292,\n 0xE48B: 0x82AB,\n 0xE48C: 0x829F,\n 0xE48D: 0x82BB,\n 0xE48E: 0x82AC,\n 0xE48F: 0x82E1,\n 0xE490: 0x82E3,\n 0xE491: 0x82DF,\n 0xE492: 0x82D2,\n 0xE493: 0x82F4,\n 0xE494: 0x82F3,\n 0xE495: 0x82FA,\n 0xE496: 0x8393,\n 0xE497: 0x8303,\n 0xE498: 0x82FB,\n 0xE499: 0x82F9,\n 0xE49A: 0x82DE,\n 0xE49B: 0x8306,\n 0xE49C: 0x82DC,\n 0xE49D: 0x8309,\n 0xE49E: 0x82D9,\n 0xE49F: 0x8335,\n 0xE4A0: 0x8334,\n 0xE4A1: 0x8316,\n 0xE4A2: 0x8332,\n 0xE4A3: 0x8331,\n 0xE4A4: 0x8340,\n 0xE4A5: 0x8339,\n 0xE4A6: 0x8350,\n 0xE4A7: 0x8345,\n 0xE4A8: 0x832F,\n 0xE4A9: 0x832B,\n 0xE4AA: 0x8317,\n 0xE4AB: 0x8318,\n 0xE4AC: 0x8385,\n 0xE4AD: 0x839A,\n 0xE4AE: 0x83AA,\n 0xE4AF: 0x839F,\n 0xE4B0: 0x83A2,\n 0xE4B1: 0x8396,\n 0xE4B2: 0x8323,\n 0xE4B3: 0x838E,\n 0xE4B4: 0x8387,\n 0xE4B5: 0x838A,\n 0xE4B6: 0x837C,\n 0xE4B7: 0x83B5,\n 0xE4B8: 0x8373,\n 0xE4B9: 0x8375,\n 0xE4BA: 0x83A0,\n 0xE4BB: 0x8389,\n 0xE4BC: 0x83A8,\n 0xE4BD: 0x83F4,\n 0xE4BE: 0x8413,\n 0xE4BF: 0x83EB,\n 0xE4C0: 0x83CE,\n 0xE4C1: 0x83FD,\n 0xE4C2: 0x8403,\n 0xE4C3: 0x83D8,\n 0xE4C4: 0x840B,\n 0xE4C5: 0x83C1,\n 0xE4C6: 0x83F7,\n 0xE4C7: 0x8407,\n 0xE4C8: 0x83E0,\n 0xE4C9: 0x83F2,\n 0xE4CA: 0x840D,\n 0xE4CB: 0x8422,\n 0xE4CC: 0x8420,\n 0xE4CD: 0x83BD,\n 0xE4CE: 0x8438,\n 0xE4CF: 0x8506,\n 0xE4D0: 0x83FB,\n 0xE4D1: 0x846D,\n 0xE4D2: 0x842A,\n 0xE4D3: 0x843C,\n 0xE4D4: 0x855A,\n 0xE4D5: 0x8484,\n 0xE4D6: 0x8477,\n 0xE4D7: 0x846B,\n 0xE4D8: 0x84AD,\n 0xE4D9: 0x846E,\n 0xE4DA: 0x8482,\n 0xE4DB: 0x8469,\n 0xE4DC: 0x8446,\n 0xE4DD: 0x842C,\n 0xE4DE: 0x846F,\n 0xE4DF: 0x8479,\n 0xE4E0: 0x8435,\n 0xE4E1: 0x84CA,\n 0xE4E2: 0x8462,\n 0xE4E3: 0x84B9,\n 0xE4E4: 0x84BF,\n 0xE4E5: 0x849F,\n 0xE4E6: 0x84D9,\n 0xE4E7: 0x84CD,\n 0xE4E8: 0x84BB,\n 0xE4E9: 0x84DA,\n 0xE4EA: 0x84D0,\n 0xE4EB: 0x84C1,\n 0xE4EC: 0x84C6,\n 0xE4ED: 0x84D6,\n 0xE4EE: 0x84A1,\n 0xE4EF: 0x8521,\n 0xE4F0: 0x84FF,\n 0xE4F1: 0x84F4,\n 0xE4F2: 0x8517,\n 0xE4F3: 0x8518,\n 0xE4F4: 0x852C,\n 0xE4F5: 0x851F,\n 0xE4F6: 0x8515,\n 0xE4F7: 0x8514,\n 0xE4F8: 0x84FC,\n 0xE4F9: 0x8540,\n 0xE4FA: 0x8563,\n 0xE4FB: 0x8558,\n 0xE4FC: 0x8548,\n 0xE540: 0x8541,\n 0xE541: 0x8602,\n 0xE542: 0x854B,\n 0xE543: 0x8555,\n 0xE544: 0x8580,\n 0xE545: 0x85A4,\n 0xE546: 0x8588,\n 0xE547: 0x8591,\n 0xE548: 0x858A,\n 0xE549: 0x85A8,\n 0xE54A: 0x856D,\n 0xE54B: 0x8594,\n 0xE54C: 0x859B,\n 0xE54D: 0x85EA,\n 0xE54E: 0x8587,\n 0xE54F: 0x859C,\n 0xE550: 0x8577,\n 0xE551: 0x857E,\n 0xE552: 0x8590,\n 0xE553: 0x85C9,\n 0xE554: 0x85BA,\n 0xE555: 0x85CF,\n 0xE556: 0x85B9,\n 0xE557: 0x85D0,\n 0xE558: 0x85D5,\n 0xE559: 0x85DD,\n 0xE55A: 0x85E5,\n 0xE55B: 0x85DC,\n 0xE55C: 0x85F9,\n 0xE55D: 0x860A,\n 0xE55E: 0x8613,\n 0xE55F: 0x860B,\n 0xE560: 0x85FE,\n 0xE561: 0x85FA,\n 0xE562: 0x8606,\n 0xE563: 0x8622,\n 0xE564: 0x861A,\n 0xE565: 0x8630,\n 0xE566: 0x863F,\n 0xE567: 0x864D,\n 0xE568: 0x4E55,\n 0xE569: 0x8654,\n 0xE56A: 0x865F,\n 0xE56B: 0x8667,\n 0xE56C: 0x8671,\n 0xE56D: 0x8693,\n 0xE56E: 0x86A3,\n 0xE56F: 0x86A9,\n 0xE570: 0x86AA,\n 0xE571: 0x868B,\n 0xE572: 0x868C,\n 0xE573: 0x86B6,\n 0xE574: 0x86AF,\n 0xE575: 0x86C4,\n 0xE576: 0x86C6,\n 0xE577: 0x86B0,\n 0xE578: 0x86C9,\n 0xE579: 0x8823,\n 0xE57A: 0x86AB,\n 0xE57B: 0x86D4,\n 0xE57C: 0x86DE,\n 0xE57D: 0x86E9,\n 0xE57E: 0x86EC,\n 0xE580: 0x86DF,\n 0xE581: 0x86DB,\n 0xE582: 0x86EF,\n 0xE583: 0x8712,\n 0xE584: 0x8706,\n 0xE585: 0x8708,\n 0xE586: 0x8700,\n 0xE587: 0x8703,\n 0xE588: 0x86FB,\n 0xE589: 0x8711,\n 0xE58A: 0x8709,\n 0xE58B: 0x870D,\n 0xE58C: 0x86F9,\n 0xE58D: 0x870A,\n 0xE58E: 0x8734,\n 0xE58F: 0x873F,\n 0xE590: 0x8737,\n 0xE591: 0x873B,\n 0xE592: 0x8725,\n 0xE593: 0x8729,\n 0xE594: 0x871A,\n 0xE595: 0x8760,\n 0xE596: 0x875F,\n 0xE597: 0x8778,\n 0xE598: 0x874C,\n 0xE599: 0x874E,\n 0xE59A: 0x8774,\n 0xE59B: 0x8757,\n 0xE59C: 0x8768,\n 0xE59D: 0x876E,\n 0xE59E: 0x8759,\n 0xE59F: 0x8753,\n 0xE5A0: 0x8763,\n 0xE5A1: 0x876A,\n 0xE5A2: 0x8805,\n 0xE5A3: 0x87A2,\n 0xE5A4: 0x879F,\n 0xE5A5: 0x8782,\n 0xE5A6: 0x87AF,\n 0xE5A7: 0x87CB,\n 0xE5A8: 0x87BD,\n 0xE5A9: 0x87C0,\n 0xE5AA: 0x87D0,\n 0xE5AB: 0x96D6,\n 0xE5AC: 0x87AB,\n 0xE5AD: 0x87C4,\n 0xE5AE: 0x87B3,\n 0xE5AF: 0x87C7,\n 0xE5B0: 0x87C6,\n 0xE5B1: 0x87BB,\n 0xE5B2: 0x87EF,\n 0xE5B3: 0x87F2,\n 0xE5B4: 0x87E0,\n 0xE5B5: 0x880F,\n 0xE5B6: 0x880D,\n 0xE5B7: 0x87FE,\n 0xE5B8: 0x87F6,\n 0xE5B9: 0x87F7,\n 0xE5BA: 0x880E,\n 0xE5BB: 0x87D2,\n 0xE5BC: 0x8811,\n 0xE5BD: 0x8816,\n 0xE5BE: 0x8815,\n 0xE5BF: 0x8822,\n 0xE5C0: 0x8821,\n 0xE5C1: 0x8831,\n 0xE5C2: 0x8836,\n 0xE5C3: 0x8839,\n 0xE5C4: 0x8827,\n 0xE5C5: 0x883B,\n 0xE5C6: 0x8844,\n 0xE5C7: 0x8842,\n 0xE5C8: 0x8852,\n 0xE5C9: 0x8859,\n 0xE5CA: 0x885E,\n 0xE5CB: 0x8862,\n 0xE5CC: 0x886B,\n 0xE5CD: 0x8881,\n 0xE5CE: 0x887E,\n 0xE5CF: 0x889E,\n 0xE5D0: 0x8875,\n 0xE5D1: 0x887D,\n 0xE5D2: 0x88B5,\n 0xE5D3: 0x8872,\n 0xE5D4: 0x8882,\n 0xE5D5: 0x8897,\n 0xE5D6: 0x8892,\n 0xE5D7: 0x88AE,\n 0xE5D8: 0x8899,\n 0xE5D9: 0x88A2,\n 0xE5DA: 0x888D,\n 0xE5DB: 0x88A4,\n 0xE5DC: 0x88B0,\n 0xE5DD: 0x88BF,\n 0xE5DE: 0x88B1,\n 0xE5DF: 0x88C3,\n 0xE5E0: 0x88C4,\n 0xE5E1: 0x88D4,\n 0xE5E2: 0x88D8,\n 0xE5E3: 0x88D9,\n 0xE5E4: 0x88DD,\n 0xE5E5: 0x88F9,\n 0xE5E6: 0x8902,\n 0xE5E7: 0x88FC,\n 0xE5E8: 0x88F4,\n 0xE5E9: 0x88E8,\n 0xE5EA: 0x88F2,\n 0xE5EB: 0x8904,\n 0xE5EC: 0x890C,\n 0xE5ED: 0x890A,\n 0xE5EE: 0x8913,\n 0xE5EF: 0x8943,\n 0xE5F0: 0x891E,\n 0xE5F1: 0x8925,\n 0xE5F2: 0x892A,\n 0xE5F3: 0x892B,\n 0xE5F4: 0x8941,\n 0xE5F5: 0x8944,\n 0xE5F6: 0x893B,\n 0xE5F7: 0x8936,\n 0xE5F8: 0x8938,\n 0xE5F9: 0x894C,\n 0xE5FA: 0x891D,\n 0xE5FB: 0x8960,\n 0xE5FC: 0x895E,\n 0xE640: 0x8966,\n 0xE641: 0x8964,\n 0xE642: 0x896D,\n 0xE643: 0x896A,\n 0xE644: 0x896F,\n 0xE645: 0x8974,\n 0xE646: 0x8977,\n 0xE647: 0x897E,\n 0xE648: 0x8983,\n 0xE649: 0x8988,\n 0xE64A: 0x898A,\n 0xE64B: 0x8993,\n 0xE64C: 0x8998,\n 0xE64D: 0x89A1,\n 0xE64E: 0x89A9,\n 0xE64F: 0x89A6,\n 0xE650: 0x89AC,\n 0xE651: 0x89AF,\n 0xE652: 0x89B2,\n 0xE653: 0x89BA,\n 0xE654: 0x89BD,\n 0xE655: 0x89BF,\n 0xE656: 0x89C0,\n 0xE657: 0x89DA,\n 0xE658: 0x89DC,\n 0xE659: 0x89DD,\n 0xE65A: 0x89E7,\n 0xE65B: 0x89F4,\n 0xE65C: 0x89F8,\n 0xE65D: 0x8A03,\n 0xE65E: 0x8A16,\n 0xE65F: 0x8A10,\n 0xE660: 0x8A0C,\n 0xE661: 0x8A1B,\n 0xE662: 0x8A1D,\n 0xE663: 0x8A25,\n 0xE664: 0x8A36,\n 0xE665: 0x8A41,\n 0xE666: 0x8A5B,\n 0xE667: 0x8A52,\n 0xE668: 0x8A46,\n 0xE669: 0x8A48,\n 0xE66A: 0x8A7C,\n 0xE66B: 0x8A6D,\n 0xE66C: 0x8A6C,\n 0xE66D: 0x8A62,\n 0xE66E: 0x8A85,\n 0xE66F: 0x8A82,\n 0xE670: 0x8A84,\n 0xE671: 0x8AA8,\n 0xE672: 0x8AA1,\n 0xE673: 0x8A91,\n 0xE674: 0x8AA5,\n 0xE675: 0x8AA6,\n 0xE676: 0x8A9A,\n 0xE677: 0x8AA3,\n 0xE678: 0x8AC4,\n 0xE679: 0x8ACD,\n 0xE67A: 0x8AC2,\n 0xE67B: 0x8ADA,\n 0xE67C: 0x8AEB,\n 0xE67D: 0x8AF3,\n 0xE67E: 0x8AE7,\n 0xE680: 0x8AE4,\n 0xE681: 0x8AF1,\n 0xE682: 0x8B14,\n 0xE683: 0x8AE0,\n 0xE684: 0x8AE2,\n 0xE685: 0x8AF7,\n 0xE686: 0x8ADE,\n 0xE687: 0x8ADB,\n 0xE688: 0x8B0C,\n 0xE689: 0x8B07,\n 0xE68A: 0x8B1A,\n 0xE68B: 0x8AE1,\n 0xE68C: 0x8B16,\n 0xE68D: 0x8B10,\n 0xE68E: 0x8B17,\n 0xE68F: 0x8B20,\n 0xE690: 0x8B33,\n 0xE691: 0x97AB,\n 0xE692: 0x8B26,\n 0xE693: 0x8B2B,\n 0xE694: 0x8B3E,\n 0xE695: 0x8B28,\n 0xE696: 0x8B41,\n 0xE697: 0x8B4C,\n 0xE698: 0x8B4F,\n 0xE699: 0x8B4E,\n 0xE69A: 0x8B49,\n 0xE69B: 0x8B56,\n 0xE69C: 0x8B5B,\n 0xE69D: 0x8B5A,\n 0xE69E: 0x8B6B,\n 0xE69F: 0x8B5F,\n 0xE6A0: 0x8B6C,\n 0xE6A1: 0x8B6F,\n 0xE6A2: 0x8B74,\n 0xE6A3: 0x8B7D,\n 0xE6A4: 0x8B80,\n 0xE6A5: 0x8B8C,\n 0xE6A6: 0x8B8E,\n 0xE6A7: 0x8B92,\n 0xE6A8: 0x8B93,\n 0xE6A9: 0x8B96,\n 0xE6AA: 0x8B99,\n 0xE6AB: 0x8B9A,\n 0xE6AC: 0x8C3A,\n 0xE6AD: 0x8C41,\n 0xE6AE: 0x8C3F,\n 0xE6AF: 0x8C48,\n 0xE6B0: 0x8C4C,\n 0xE6B1: 0x8C4E,\n 0xE6B2: 0x8C50,\n 0xE6B3: 0x8C55,\n 0xE6B4: 0x8C62,\n 0xE6B5: 0x8C6C,\n 0xE6B6: 0x8C78,\n 0xE6B7: 0x8C7A,\n 0xE6B8: 0x8C82,\n 0xE6B9: 0x8C89,\n 0xE6BA: 0x8C85,\n 0xE6BB: 0x8C8A,\n 0xE6BC: 0x8C8D,\n 0xE6BD: 0x8C8E,\n 0xE6BE: 0x8C94,\n 0xE6BF: 0x8C7C,\n 0xE6C0: 0x8C98,\n 0xE6C1: 0x621D,\n 0xE6C2: 0x8CAD,\n 0xE6C3: 0x8CAA,\n 0xE6C4: 0x8CBD,\n 0xE6C5: 0x8CB2,\n 0xE6C6: 0x8CB3,\n 0xE6C7: 0x8CAE,\n 0xE6C8: 0x8CB6,\n 0xE6C9: 0x8CC8,\n 0xE6CA: 0x8CC1,\n 0xE6CB: 0x8CE4,\n 0xE6CC: 0x8CE3,\n 0xE6CD: 0x8CDA,\n 0xE6CE: 0x8CFD,\n 0xE6CF: 0x8CFA,\n 0xE6D0: 0x8CFB,\n 0xE6D1: 0x8D04,\n 0xE6D2: 0x8D05,\n 0xE6D3: 0x8D0A,\n 0xE6D4: 0x8D07,\n 0xE6D5: 0x8D0F,\n 0xE6D6: 0x8D0D,\n 0xE6D7: 0x8D10,\n 0xE6D8: 0x9F4E,\n 0xE6D9: 0x8D13,\n 0xE6DA: 0x8CCD,\n 0xE6DB: 0x8D14,\n 0xE6DC: 0x8D16,\n 0xE6DD: 0x8D67,\n 0xE6DE: 0x8D6D,\n 0xE6DF: 0x8D71,\n 0xE6E0: 0x8D73,\n 0xE6E1: 0x8D81,\n 0xE6E2: 0x8D99,\n 0xE6E3: 0x8DC2,\n 0xE6E4: 0x8DBE,\n 0xE6E5: 0x8DBA,\n 0xE6E6: 0x8DCF,\n 0xE6E7: 0x8DDA,\n 0xE6E8: 0x8DD6,\n 0xE6E9: 0x8DCC,\n 0xE6EA: 0x8DDB,\n 0xE6EB: 0x8DCB,\n 0xE6EC: 0x8DEA,\n 0xE6ED: 0x8DEB,\n 0xE6EE: 0x8DDF,\n 0xE6EF: 0x8DE3,\n 0xE6F0: 0x8DFC,\n 0xE6F1: 0x8E08,\n 0xE6F2: 0x8E09,\n 0xE6F3: 0x8DFF,\n 0xE6F4: 0x8E1D,\n 0xE6F5: 0x8E1E,\n 0xE6F6: 0x8E10,\n 0xE6F7: 0x8E1F,\n 0xE6F8: 0x8E42,\n 0xE6F9: 0x8E35,\n 0xE6FA: 0x8E30,\n 0xE6FB: 0x8E34,\n 0xE6FC: 0x8E4A,\n 0xE740: 0x8E47,\n 0xE741: 0x8E49,\n 0xE742: 0x8E4C,\n 0xE743: 0x8E50,\n 0xE744: 0x8E48,\n 0xE745: 0x8E59,\n 0xE746: 0x8E64,\n 0xE747: 0x8E60,\n 0xE748: 0x8E2A,\n 0xE749: 0x8E63,\n 0xE74A: 0x8E55,\n 0xE74B: 0x8E76,\n 0xE74C: 0x8E72,\n 0xE74D: 0x8E7C,\n 0xE74E: 0x8E81,\n 0xE74F: 0x8E87,\n 0xE750: 0x8E85,\n 0xE751: 0x8E84,\n 0xE752: 0x8E8B,\n 0xE753: 0x8E8A,\n 0xE754: 0x8E93,\n 0xE755: 0x8E91,\n 0xE756: 0x8E94,\n 0xE757: 0x8E99,\n 0xE758: 0x8EAA,\n 0xE759: 0x8EA1,\n 0xE75A: 0x8EAC,\n 0xE75B: 0x8EB0,\n 0xE75C: 0x8EC6,\n 0xE75D: 0x8EB1,\n 0xE75E: 0x8EBE,\n 0xE75F: 0x8EC5,\n 0xE760: 0x8EC8,\n 0xE761: 0x8ECB,\n 0xE762: 0x8EDB,\n 0xE763: 0x8EE3,\n 0xE764: 0x8EFC,\n 0xE765: 0x8EFB,\n 0xE766: 0x8EEB,\n 0xE767: 0x8EFE,\n 0xE768: 0x8F0A,\n 0xE769: 0x8F05,\n 0xE76A: 0x8F15,\n 0xE76B: 0x8F12,\n 0xE76C: 0x8F19,\n 0xE76D: 0x8F13,\n 0xE76E: 0x8F1C,\n 0xE76F: 0x8F1F,\n 0xE770: 0x8F1B,\n 0xE771: 0x8F0C,\n 0xE772: 0x8F26,\n 0xE773: 0x8F33,\n 0xE774: 0x8F3B,\n 0xE775: 0x8F39,\n 0xE776: 0x8F45,\n 0xE777: 0x8F42,\n 0xE778: 0x8F3E,\n 0xE779: 0x8F4C,\n 0xE77A: 0x8F49,\n 0xE77B: 0x8F46,\n 0xE77C: 0x8F4E,\n 0xE77D: 0x8F57,\n 0xE77E: 0x8F5C,\n 0xE780: 0x8F62,\n 0xE781: 0x8F63,\n 0xE782: 0x8F64,\n 0xE783: 0x8F9C,\n 0xE784: 0x8F9F,\n 0xE785: 0x8FA3,\n 0xE786: 0x8FAD,\n 0xE787: 0x8FAF,\n 0xE788: 0x8FB7,\n 0xE789: 0x8FDA,\n 0xE78A: 0x8FE5,\n 0xE78B: 0x8FE2,\n 0xE78C: 0x8FEA,\n 0xE78D: 0x8FEF,\n 0xE78E: 0x9087,\n 0xE78F: 0x8FF4,\n 0xE790: 0x9005,\n 0xE791: 0x8FF9,\n 0xE792: 0x8FFA,\n 0xE793: 0x9011,\n 0xE794: 0x9015,\n 0xE795: 0x9021,\n 0xE796: 0x900D,\n 0xE797: 0x901E,\n 0xE798: 0x9016,\n 0xE799: 0x900B,\n 0xE79A: 0x9027,\n 0xE79B: 0x9036,\n 0xE79C: 0x9035,\n 0xE79D: 0x9039,\n 0xE79E: 0x8FF8,\n 0xE79F: 0x904F,\n 0xE7A0: 0x9050,\n 0xE7A1: 0x9051,\n 0xE7A2: 0x9052,\n 0xE7A3: 0x900E,\n 0xE7A4: 0x9049,\n 0xE7A5: 0x903E,\n 0xE7A6: 0x9056,\n 0xE7A7: 0x9058,\n 0xE7A8: 0x905E,\n 0xE7A9: 0x9068,\n 0xE7AA: 0x906F,\n 0xE7AB: 0x9076,\n 0xE7AC: 0x96A8,\n 0xE7AD: 0x9072,\n 0xE7AE: 0x9082,\n 0xE7AF: 0x907D,\n 0xE7B0: 0x9081,\n 0xE7B1: 0x9080,\n 0xE7B2: 0x908A,\n 0xE7B3: 0x9089,\n 0xE7B4: 0x908F,\n 0xE7B5: 0x90A8,\n 0xE7B6: 0x90AF,\n 0xE7B7: 0x90B1,\n 0xE7B8: 0x90B5,\n 0xE7B9: 0x90E2,\n 0xE7BA: 0x90E4,\n 0xE7BB: 0x6248,\n 0xE7BC: 0x90DB,\n 0xE7BD: 0x9102,\n 0xE7BE: 0x9112,\n 0xE7BF: 0x9119,\n 0xE7C0: 0x9132,\n 0xE7C1: 0x9130,\n 0xE7C2: 0x914A,\n 0xE7C3: 0x9156,\n 0xE7C4: 0x9158,\n 0xE7C5: 0x9163,\n 0xE7C6: 0x9165,\n 0xE7C7: 0x9169,\n 0xE7C8: 0x9173,\n 0xE7C9: 0x9172,\n 0xE7CA: 0x918B,\n 0xE7CB: 0x9189,\n 0xE7CC: 0x9182,\n 0xE7CD: 0x91A2,\n 0xE7CE: 0x91AB,\n 0xE7CF: 0x91AF,\n 0xE7D0: 0x91AA,\n 0xE7D1: 0x91B5,\n 0xE7D2: 0x91B4,\n 0xE7D3: 0x91BA,\n 0xE7D4: 0x91C0,\n 0xE7D5: 0x91C1,\n 0xE7D6: 0x91C9,\n 0xE7D7: 0x91CB,\n 0xE7D8: 0x91D0,\n 0xE7D9: 0x91D6,\n 0xE7DA: 0x91DF,\n 0xE7DB: 0x91E1,\n 0xE7DC: 0x91DB,\n 0xE7DD: 0x91FC,\n 0xE7DE: 0x91F5,\n 0xE7DF: 0x91F6,\n 0xE7E0: 0x921E,\n 0xE7E1: 0x91FF,\n 0xE7E2: 0x9214,\n 0xE7E3: 0x922C,\n 0xE7E4: 0x9215,\n 0xE7E5: 0x9211,\n 0xE7E6: 0x925E,\n 0xE7E7: 0x9257,\n 0xE7E8: 0x9245,\n 0xE7E9: 0x9249,\n 0xE7EA: 0x9264,\n 0xE7EB: 0x9248,\n 0xE7EC: 0x9295,\n 0xE7ED: 0x923F,\n 0xE7EE: 0x924B,\n 0xE7EF: 0x9250,\n 0xE7F0: 0x929C,\n 0xE7F1: 0x9296,\n 0xE7F2: 0x9293,\n 0xE7F3: 0x929B,\n 0xE7F4: 0x925A,\n 0xE7F5: 0x92CF,\n 0xE7F6: 0x92B9,\n 0xE7F7: 0x92B7,\n 0xE7F8: 0x92E9,\n 0xE7F9: 0x930F,\n 0xE7FA: 0x92FA,\n 0xE7FB: 0x9344,\n 0xE7FC: 0x932E,\n 0xE840: 0x9319,\n 0xE841: 0x9322,\n 0xE842: 0x931A,\n 0xE843: 0x9323,\n 0xE844: 0x933A,\n 0xE845: 0x9335,\n 0xE846: 0x933B,\n 0xE847: 0x935C,\n 0xE848: 0x9360,\n 0xE849: 0x937C,\n 0xE84A: 0x936E,\n 0xE84B: 0x9356,\n 0xE84C: 0x93B0,\n 0xE84D: 0x93AC,\n 0xE84E: 0x93AD,\n 0xE84F: 0x9394,\n 0xE850: 0x93B9,\n 0xE851: 0x93D6,\n 0xE852: 0x93D7,\n 0xE853: 0x93E8,\n 0xE854: 0x93E5,\n 0xE855: 0x93D8,\n 0xE856: 0x93C3,\n 0xE857: 0x93DD,\n 0xE858: 0x93D0,\n 0xE859: 0x93C8,\n 0xE85A: 0x93E4,\n 0xE85B: 0x941A,\n 0xE85C: 0x9414,\n 0xE85D: 0x9413,\n 0xE85E: 0x9403,\n 0xE85F: 0x9407,\n 0xE860: 0x9410,\n 0xE861: 0x9436,\n 0xE862: 0x942B,\n 0xE863: 0x9435,\n 0xE864: 0x9421,\n 0xE865: 0x943A,\n 0xE866: 0x9441,\n 0xE867: 0x9452,\n 0xE868: 0x9444,\n 0xE869: 0x945B,\n 0xE86A: 0x9460,\n 0xE86B: 0x9462,\n 0xE86C: 0x945E,\n 0xE86D: 0x946A,\n 0xE86E: 0x9229,\n 0xE86F: 0x9470,\n 0xE870: 0x9475,\n 0xE871: 0x9477,\n 0xE872: 0x947D,\n 0xE873: 0x945A,\n 0xE874: 0x947C,\n 0xE875: 0x947E,\n 0xE876: 0x9481,\n 0xE877: 0x947F,\n 0xE878: 0x9582,\n 0xE879: 0x9587,\n 0xE87A: 0x958A,\n 0xE87B: 0x9594,\n 0xE87C: 0x9596,\n 0xE87D: 0x9598,\n 0xE87E: 0x9599,\n 0xE880: 0x95A0,\n 0xE881: 0x95A8,\n 0xE882: 0x95A7,\n 0xE883: 0x95AD,\n 0xE884: 0x95BC,\n 0xE885: 0x95BB,\n 0xE886: 0x95B9,\n 0xE887: 0x95BE,\n 0xE888: 0x95CA,\n 0xE889: 0x6FF6,\n 0xE88A: 0x95C3,\n 0xE88B: 0x95CD,\n 0xE88C: 0x95CC,\n 0xE88D: 0x95D5,\n 0xE88E: 0x95D4,\n 0xE88F: 0x95D6,\n 0xE890: 0x95DC,\n 0xE891: 0x95E1,\n 0xE892: 0x95E5,\n 0xE893: 0x95E2,\n 0xE894: 0x9621,\n 0xE895: 0x9628,\n 0xE896: 0x962E,\n 0xE897: 0x962F,\n 0xE898: 0x9642,\n 0xE899: 0x964C,\n 0xE89A: 0x964F,\n 0xE89B: 0x964B,\n 0xE89C: 0x9677,\n 0xE89D: 0x965C,\n 0xE89E: 0x965E,\n 0xE89F: 0x965D,\n 0xE8A0: 0x965F,\n 0xE8A1: 0x9666,\n 0xE8A2: 0x9672,\n 0xE8A3: 0x966C,\n 0xE8A4: 0x968D,\n 0xE8A5: 0x9698,\n 0xE8A6: 0x9695,\n 0xE8A7: 0x9697,\n 0xE8A8: 0x96AA,\n 0xE8A9: 0x96A7,\n 0xE8AA: 0x96B1,\n 0xE8AB: 0x96B2,\n 0xE8AC: 0x96B0,\n 0xE8AD: 0x96B4,\n 0xE8AE: 0x96B6,\n 0xE8AF: 0x96B8,\n 0xE8B0: 0x96B9,\n 0xE8B1: 0x96CE,\n 0xE8B2: 0x96CB,\n 0xE8B3: 0x96C9,\n 0xE8B4: 0x96CD,\n 0xE8B5: 0x894D,\n 0xE8B6: 0x96DC,\n 0xE8B7: 0x970D,\n 0xE8B8: 0x96D5,\n 0xE8B9: 0x96F9,\n 0xE8BA: 0x9704,\n 0xE8BB: 0x9706,\n 0xE8BC: 0x9708,\n 0xE8BD: 0x9713,\n 0xE8BE: 0x970E,\n 0xE8BF: 0x9711,\n 0xE8C0: 0x970F,\n 0xE8C1: 0x9716,\n 0xE8C2: 0x9719,\n 0xE8C3: 0x9724,\n 0xE8C4: 0x972A,\n 0xE8C5: 0x9730,\n 0xE8C6: 0x9739,\n 0xE8C7: 0x973D,\n 0xE8C8: 0x973E,\n 0xE8C9: 0x9744,\n 0xE8CA: 0x9746,\n 0xE8CB: 0x9748,\n 0xE8CC: 0x9742,\n 0xE8CD: 0x9749,\n 0xE8CE: 0x975C,\n 0xE8CF: 0x9760,\n 0xE8D0: 0x9764,\n 0xE8D1: 0x9766,\n 0xE8D2: 0x9768,\n 0xE8D3: 0x52D2,\n 0xE8D4: 0x976B,\n 0xE8D5: 0x9771,\n 0xE8D6: 0x9779,\n 0xE8D7: 0x9785,\n 0xE8D8: 0x977C,\n 0xE8D9: 0x9781,\n 0xE8DA: 0x977A,\n 0xE8DB: 0x9786,\n 0xE8DC: 0x978B,\n 0xE8DD: 0x978F,\n 0xE8DE: 0x9790,\n 0xE8DF: 0x979C,\n 0xE8E0: 0x97A8,\n 0xE8E1: 0x97A6,\n 0xE8E2: 0x97A3,\n 0xE8E3: 0x97B3,\n 0xE8E4: 0x97B4,\n 0xE8E5: 0x97C3,\n 0xE8E6: 0x97C6,\n 0xE8E7: 0x97C8,\n 0xE8E8: 0x97CB,\n 0xE8E9: 0x97DC,\n 0xE8EA: 0x97ED,\n 0xE8EB: 0x9F4F,\n 0xE8EC: 0x97F2,\n 0xE8ED: 0x7ADF,\n 0xE8EE: 0x97F6,\n 0xE8EF: 0x97F5,\n 0xE8F0: 0x980F,\n 0xE8F1: 0x980C,\n 0xE8F2: 0x9838,\n 0xE8F3: 0x9824,\n 0xE8F4: 0x9821,\n 0xE8F5: 0x9837,\n 0xE8F6: 0x983D,\n 0xE8F7: 0x9846,\n 0xE8F8: 0x984F,\n 0xE8F9: 0x984B,\n 0xE8FA: 0x986B,\n 0xE8FB: 0x986F,\n 0xE8FC: 0x9870,\n 0xE940: 0x9871,\n 0xE941: 0x9874,\n 0xE942: 0x9873,\n 0xE943: 0x98AA,\n 0xE944: 0x98AF,\n 0xE945: 0x98B1,\n 0xE946: 0x98B6,\n 0xE947: 0x98C4,\n 0xE948: 0x98C3,\n 0xE949: 0x98C6,\n 0xE94A: 0x98E9,\n 0xE94B: 0x98EB,\n 0xE94C: 0x9903,\n 0xE94D: 0x9909,\n 0xE94E: 0x9912,\n 0xE94F: 0x9914,\n 0xE950: 0x9918,\n 0xE951: 0x9921,\n 0xE952: 0x991D,\n 0xE953: 0x991E,\n 0xE954: 0x9924,\n 0xE955: 0x9920,\n 0xE956: 0x992C,\n 0xE957: 0x992E,\n 0xE958: 0x993D,\n 0xE959: 0x993E,\n 0xE95A: 0x9942,\n 0xE95B: 0x9949,\n 0xE95C: 0x9945,\n 0xE95D: 0x9950,\n 0xE95E: 0x994B,\n 0xE95F: 0x9951,\n 0xE960: 0x9952,\n 0xE961: 0x994C,\n 0xE962: 0x9955,\n 0xE963: 0x9997,\n 0xE964: 0x9998,\n 0xE965: 0x99A5,\n 0xE966: 0x99AD,\n 0xE967: 0x99AE,\n 0xE968: 0x99BC,\n 0xE969: 0x99DF,\n 0xE96A: 0x99DB,\n 0xE96B: 0x99DD,\n 0xE96C: 0x99D8,\n 0xE96D: 0x99D1,\n 0xE96E: 0x99ED,\n 0xE96F: 0x99EE,\n 0xE970: 0x99F1,\n 0xE971: 0x99F2,\n 0xE972: 0x99FB,\n 0xE973: 0x99F8,\n 0xE974: 0x9A01,\n 0xE975: 0x9A0F,\n 0xE976: 0x9A05,\n 0xE977: 0x99E2,\n 0xE978: 0x9A19,\n 0xE979: 0x9A2B,\n 0xE97A: 0x9A37,\n 0xE97B: 0x9A45,\n 0xE97C: 0x9A42,\n 0xE97D: 0x9A40,\n 0xE97E: 0x9A43,\n 0xE980: 0x9A3E,\n 0xE981: 0x9A55,\n 0xE982: 0x9A4D,\n 0xE983: 0x9A5B,\n 0xE984: 0x9A57,\n 0xE985: 0x9A5F,\n 0xE986: 0x9A62,\n 0xE987: 0x9A65,\n 0xE988: 0x9A64,\n 0xE989: 0x9A69,\n 0xE98A: 0x9A6B,\n 0xE98B: 0x9A6A,\n 0xE98C: 0x9AAD,\n 0xE98D: 0x9AB0,\n 0xE98E: 0x9ABC,\n 0xE98F: 0x9AC0,\n 0xE990: 0x9ACF,\n 0xE991: 0x9AD1,\n 0xE992: 0x9AD3,\n 0xE993: 0x9AD4,\n 0xE994: 0x9ADE,\n 0xE995: 0x9ADF,\n 0xE996: 0x9AE2,\n 0xE997: 0x9AE3,\n 0xE998: 0x9AE6,\n 0xE999: 0x9AEF,\n 0xE99A: 0x9AEB,\n 0xE99B: 0x9AEE,\n 0xE99C: 0x9AF4,\n 0xE99D: 0x9AF1,\n 0xE99E: 0x9AF7,\n 0xE99F: 0x9AFB,\n 0xE9A0: 0x9B06,\n 0xE9A1: 0x9B18,\n 0xE9A2: 0x9B1A,\n 0xE9A3: 0x9B1F,\n 0xE9A4: 0x9B22,\n 0xE9A5: 0x9B23,\n 0xE9A6: 0x9B25,\n 0xE9A7: 0x9B27,\n 0xE9A8: 0x9B28,\n 0xE9A9: 0x9B29,\n 0xE9AA: 0x9B2A,\n 0xE9AB: 0x9B2E,\n 0xE9AC: 0x9B2F,\n 0xE9AD: 0x9B32,\n 0xE9AE: 0x9B44,\n 0xE9AF: 0x9B43,\n 0xE9B0: 0x9B4F,\n 0xE9B1: 0x9B4D,\n 0xE9B2: 0x9B4E,\n 0xE9B3: 0x9B51,\n 0xE9B4: 0x9B58,\n 0xE9B5: 0x9B74,\n 0xE9B6: 0x9B93,\n 0xE9B7: 0x9B83,\n 0xE9B8: 0x9B91,\n 0xE9B9: 0x9B96,\n 0xE9BA: 0x9B97,\n 0xE9BB: 0x9B9F,\n 0xE9BC: 0x9BA0,\n 0xE9BD: 0x9BA8,\n 0xE9BE: 0x9BB4,\n 0xE9BF: 0x9BC0,\n 0xE9C0: 0x9BCA,\n 0xE9C1: 0x9BB9,\n 0xE9C2: 0x9BC6,\n 0xE9C3: 0x9BCF,\n 0xE9C4: 0x9BD1,\n 0xE9C5: 0x9BD2,\n 0xE9C6: 0x9BE3,\n 0xE9C7: 0x9BE2,\n 0xE9C8: 0x9BE4,\n 0xE9C9: 0x9BD4,\n 0xE9CA: 0x9BE1,\n 0xE9CB: 0x9C3A,\n 0xE9CC: 0x9BF2,\n 0xE9CD: 0x9BF1,\n 0xE9CE: 0x9BF0,\n 0xE9CF: 0x9C15,\n 0xE9D0: 0x9C14,\n 0xE9D1: 0x9C09,\n 0xE9D2: 0x9C13,\n 0xE9D3: 0x9C0C,\n 0xE9D4: 0x9C06,\n 0xE9D5: 0x9C08,\n 0xE9D6: 0x9C12,\n 0xE9D7: 0x9C0A,\n 0xE9D8: 0x9C04,\n 0xE9D9: 0x9C2E,\n 0xE9DA: 0x9C1B,\n 0xE9DB: 0x9C25,\n 0xE9DC: 0x9C24,\n 0xE9DD: 0x9C21,\n 0xE9DE: 0x9C30,\n 0xE9DF: 0x9C47,\n 0xE9E0: 0x9C32,\n 0xE9E1: 0x9C46,\n 0xE9E2: 0x9C3E,\n 0xE9E3: 0x9C5A,\n 0xE9E4: 0x9C60,\n 0xE9E5: 0x9C67,\n 0xE9E6: 0x9C76,\n 0xE9E7: 0x9C78,\n 0xE9E8: 0x9CE7,\n 0xE9E9: 0x9CEC,\n 0xE9EA: 0x9CF0,\n 0xE9EB: 0x9D09,\n 0xE9EC: 0x9D08,\n 0xE9ED: 0x9CEB,\n 0xE9EE: 0x9D03,\n 0xE9EF: 0x9D06,\n 0xE9F0: 0x9D2A,\n 0xE9F1: 0x9D26,\n 0xE9F2: 0x9DAF,\n 0xE9F3: 0x9D23,\n 0xE9F4: 0x9D1F,\n 0xE9F5: 0x9D44,\n 0xE9F6: 0x9D15,\n 0xE9F7: 0x9D12,\n 0xE9F8: 0x9D41,\n 0xE9F9: 0x9D3F,\n 0xE9FA: 0x9D3E,\n 0xE9FB: 0x9D46,\n 0xE9FC: 0x9D48,\n 0xEA40: 0x9D5D,\n 0xEA41: 0x9D5E,\n 0xEA42: 0x9D64,\n 0xEA43: 0x9D51,\n 0xEA44: 0x9D50,\n 0xEA45: 0x9D59,\n 0xEA46: 0x9D72,\n 0xEA47: 0x9D89,\n 0xEA48: 0x9D87,\n 0xEA49: 0x9DAB,\n 0xEA4A: 0x9D6F,\n 0xEA4B: 0x9D7A,\n 0xEA4C: 0x9D9A,\n 0xEA4D: 0x9DA4,\n 0xEA4E: 0x9DA9,\n 0xEA4F: 0x9DB2,\n 0xEA50: 0x9DC4,\n 0xEA51: 0x9DC1,\n 0xEA52: 0x9DBB,\n 0xEA53: 0x9DB8,\n 0xEA54: 0x9DBA,\n 0xEA55: 0x9DC6,\n 0xEA56: 0x9DCF,\n 0xEA57: 0x9DC2,\n 0xEA58: 0x9DD9,\n 0xEA59: 0x9DD3,\n 0xEA5A: 0x9DF8,\n 0xEA5B: 0x9DE6,\n 0xEA5C: 0x9DED,\n 0xEA5D: 0x9DEF,\n 0xEA5E: 0x9DFD,\n 0xEA5F: 0x9E1A,\n 0xEA60: 0x9E1B,\n 0xEA61: 0x9E1E,\n 0xEA62: 0x9E75,\n 0xEA63: 0x9E79,\n 0xEA64: 0x9E7D,\n 0xEA65: 0x9E81,\n 0xEA66: 0x9E88,\n 0xEA67: 0x9E8B,\n 0xEA68: 0x9E8C,\n 0xEA69: 0x9E92,\n 0xEA6A: 0x9E95,\n 0xEA6B: 0x9E91,\n 0xEA6C: 0x9E9D,\n 0xEA6D: 0x9EA5,\n 0xEA6E: 0x9EA9,\n 0xEA6F: 0x9EB8,\n 0xEA70: 0x9EAA,\n 0xEA71: 0x9EAD,\n 0xEA72: 0x9761,\n 0xEA73: 0x9ECC,\n 0xEA74: 0x9ECE,\n 0xEA75: 0x9ECF,\n 0xEA76: 0x9ED0,\n 0xEA77: 0x9ED4,\n 0xEA78: 0x9EDC,\n 0xEA79: 0x9EDE,\n 0xEA7A: 0x9EDD,\n 0xEA7B: 0x9EE0,\n 0xEA7C: 0x9EE5,\n 0xEA7D: 0x9EE8,\n 0xEA7E: 0x9EEF,\n 0xEA80: 0x9EF4,\n 0xEA81: 0x9EF6,\n 0xEA82: 0x9EF7,\n 0xEA83: 0x9EF9,\n 0xEA84: 0x9EFB,\n 0xEA85: 0x9EFC,\n 0xEA86: 0x9EFD,\n 0xEA87: 0x9F07,\n 0xEA88: 0x9F08,\n 0xEA89: 0x76B7,\n 0xEA8A: 0x9F15,\n 0xEA8B: 0x9F21,\n 0xEA8C: 0x9F2C,\n 0xEA8D: 0x9F3E,\n 0xEA8E: 0x9F4A,\n 0xEA8F: 0x9F52,\n 0xEA90: 0x9F54,\n 0xEA91: 0x9F63,\n 0xEA92: 0x9F5F,\n 0xEA93: 0x9F60,\n 0xEA94: 0x9F61,\n 0xEA95: 0x9F66,\n 0xEA96: 0x9F67,\n 0xEA97: 0x9F6C,\n 0xEA98: 0x9F6A,\n 0xEA99: 0x9F77,\n 0xEA9A: 0x9F72,\n 0xEA9B: 0x9F76,\n 0xEA9C: 0x9F95,\n 0xEA9D: 0x9F9C,\n 0xEA9E: 0x9FA0,\n 0xEA9F: 0x582F,\n 0xEAA0: 0x69C7,\n 0xEAA1: 0x9059,\n 0xEAA2: 0x7464,\n 0xEAA3: 0x51DC,\n 0xEAA4: 0x7199,\n};\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar GenericGF_1 = __webpack_require__(1);\nvar GenericGFPoly_1 = __webpack_require__(2);\nfunction runEuclideanAlgorithm(field, a, b, R) {\n var _a;\n // Assume a's degree is >= b's\n if (a.degree() < b.degree()) {\n _a = [b, a], a = _a[0], b = _a[1];\n }\n var rLast = a;\n var r = b;\n var tLast = field.zero;\n var t = field.one;\n // Run Euclidean algorithm until r's degree is less than R/2\n while (r.degree() >= R / 2) {\n var rLastLast = rLast;\n var tLastLast = tLast;\n rLast = r;\n tLast = t;\n // Divide rLastLast by rLast, with quotient in q and remainder in r\n if (rLast.isZero()) {\n // Euclidean algorithm already terminated?\n return null;\n }\n r = rLastLast;\n var q = field.zero;\n var denominatorLeadingTerm = rLast.getCoefficient(rLast.degree());\n var dltInverse = field.inverse(denominatorLeadingTerm);\n while (r.degree() >= rLast.degree() && !r.isZero()) {\n var degreeDiff = r.degree() - rLast.degree();\n var scale = field.multiply(r.getCoefficient(r.degree()), dltInverse);\n q = q.addOrSubtract(field.buildMonomial(degreeDiff, scale));\n r = r.addOrSubtract(rLast.multiplyByMonomial(degreeDiff, scale));\n }\n t = q.multiplyPoly(tLast).addOrSubtract(tLastLast);\n if (r.degree() >= rLast.degree()) {\n return null;\n }\n }\n var sigmaTildeAtZero = t.getCoefficient(0);\n if (sigmaTildeAtZero === 0) {\n return null;\n }\n var inverse = field.inverse(sigmaTildeAtZero);\n return [t.multiply(inverse), r.multiply(inverse)];\n}\nfunction findErrorLocations(field, errorLocator) {\n // This is a direct application of Chien's search\n var numErrors = errorLocator.degree();\n if (numErrors === 1) {\n return [errorLocator.getCoefficient(1)];\n }\n var result = new Array(numErrors);\n var errorCount = 0;\n for (var i = 1; i < field.size && errorCount < numErrors; i++) {\n if (errorLocator.evaluateAt(i) === 0) {\n result[errorCount] = field.inverse(i);\n errorCount++;\n }\n }\n if (errorCount !== numErrors) {\n return null;\n }\n return result;\n}\nfunction findErrorMagnitudes(field, errorEvaluator, errorLocations) {\n // This is directly applying Forney's Formula\n var s = errorLocations.length;\n var result = new Array(s);\n for (var i = 0; i < s; i++) {\n var xiInverse = field.inverse(errorLocations[i]);\n var denominator = 1;\n for (var j = 0; j < s; j++) {\n if (i !== j) {\n denominator = field.multiply(denominator, GenericGF_1.addOrSubtractGF(1, field.multiply(errorLocations[j], xiInverse)));\n }\n }\n result[i] = field.multiply(errorEvaluator.evaluateAt(xiInverse), field.inverse(denominator));\n if (field.generatorBase !== 0) {\n result[i] = field.multiply(result[i], xiInverse);\n }\n }\n return result;\n}\nfunction decode(bytes, twoS) {\n var outputBytes = new Uint8ClampedArray(bytes.length);\n outputBytes.set(bytes);\n var field = new GenericGF_1.default(0x011D, 256, 0); // x^8 + x^4 + x^3 + x^2 + 1\n var poly = new GenericGFPoly_1.default(field, outputBytes);\n var syndromeCoefficients = new Uint8ClampedArray(twoS);\n var error = false;\n for (var s = 0; s < twoS; s++) {\n var evaluation = poly.evaluateAt(field.exp(s + field.generatorBase));\n syndromeCoefficients[syndromeCoefficients.length - 1 - s] = evaluation;\n if (evaluation !== 0) {\n error = true;\n }\n }\n if (!error) {\n return outputBytes;\n }\n var syndrome = new GenericGFPoly_1.default(field, syndromeCoefficients);\n var sigmaOmega = runEuclideanAlgorithm(field, field.buildMonomial(twoS, 1), syndrome, twoS);\n if (sigmaOmega === null) {\n return null;\n }\n var errorLocations = findErrorLocations(field, sigmaOmega[0]);\n if (errorLocations == null) {\n return null;\n }\n var errorMagnitudes = findErrorMagnitudes(field, sigmaOmega[1], errorLocations);\n for (var i = 0; i < errorLocations.length; i++) {\n var position = outputBytes.length - 1 - field.log(errorLocations[i]);\n if (position < 0) {\n return null;\n }\n outputBytes[position] = GenericGF_1.addOrSubtractGF(outputBytes[position], errorMagnitudes[i]);\n }\n return outputBytes;\n}\nexports.decode = decode;\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VERSIONS = [\n {\n infoBits: null,\n versionNumber: 1,\n alignmentPatternCenters: [],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 7,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 19 }],\n },\n {\n ecCodewordsPerBlock: 10,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 16 }],\n },\n {\n ecCodewordsPerBlock: 13,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 13 }],\n },\n {\n ecCodewordsPerBlock: 17,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 9 }],\n },\n ],\n },\n {\n infoBits: null,\n versionNumber: 2,\n alignmentPatternCenters: [6, 18],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 10,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 34 }],\n },\n {\n ecCodewordsPerBlock: 16,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 28 }],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 22 }],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 16 }],\n },\n ],\n },\n {\n infoBits: null,\n versionNumber: 3,\n alignmentPatternCenters: [6, 22],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 15,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 55 }],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 44 }],\n },\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 17 }],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 13 }],\n },\n ],\n },\n {\n infoBits: null,\n versionNumber: 4,\n alignmentPatternCenters: [6, 26],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 20,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 80 }],\n },\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 32 }],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 24 }],\n },\n {\n ecCodewordsPerBlock: 16,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 9 }],\n },\n ],\n },\n {\n infoBits: null,\n versionNumber: 5,\n alignmentPatternCenters: [6, 30],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 108 }],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 43 }],\n },\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 15 },\n { numBlocks: 2, dataCodewordsPerBlock: 16 },\n ],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 11 },\n { numBlocks: 2, dataCodewordsPerBlock: 12 },\n ],\n },\n ],\n },\n {\n infoBits: null,\n versionNumber: 6,\n alignmentPatternCenters: [6, 34],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 68 }],\n },\n {\n ecCodewordsPerBlock: 16,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 27 }],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 19 }],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 15 }],\n },\n ],\n },\n {\n infoBits: 0x07C94,\n versionNumber: 7,\n alignmentPatternCenters: [6, 22, 38],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 20,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 78 }],\n },\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 31 }],\n },\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 14 },\n { numBlocks: 4, dataCodewordsPerBlock: 15 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 13 },\n { numBlocks: 1, dataCodewordsPerBlock: 14 },\n ],\n },\n ],\n },\n {\n infoBits: 0x085BC,\n versionNumber: 8,\n alignmentPatternCenters: [6, 24, 42],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 97 }],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 38 },\n { numBlocks: 2, dataCodewordsPerBlock: 39 },\n ],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 18 },\n { numBlocks: 2, dataCodewordsPerBlock: 19 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 14 },\n { numBlocks: 2, dataCodewordsPerBlock: 15 },\n ],\n },\n ],\n },\n {\n infoBits: 0x09A99,\n versionNumber: 9,\n alignmentPatternCenters: [6, 26, 46],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 116 }],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 36 },\n { numBlocks: 2, dataCodewordsPerBlock: 37 },\n ],\n },\n {\n ecCodewordsPerBlock: 20,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 16 },\n { numBlocks: 4, dataCodewordsPerBlock: 17 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 12 },\n { numBlocks: 4, dataCodewordsPerBlock: 13 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0A4D3,\n versionNumber: 10,\n alignmentPatternCenters: [6, 28, 50],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 68 },\n { numBlocks: 2, dataCodewordsPerBlock: 69 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 43 },\n { numBlocks: 1, dataCodewordsPerBlock: 44 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 19 },\n { numBlocks: 2, dataCodewordsPerBlock: 20 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 15 },\n { numBlocks: 2, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0BBF6,\n versionNumber: 11,\n alignmentPatternCenters: [6, 30, 54],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 20,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 81 }],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 1, dataCodewordsPerBlock: 50 },\n { numBlocks: 4, dataCodewordsPerBlock: 51 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 22 },\n { numBlocks: 4, dataCodewordsPerBlock: 23 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 12 },\n { numBlocks: 8, dataCodewordsPerBlock: 13 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0C762,\n versionNumber: 12,\n alignmentPatternCenters: [6, 32, 58],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 92 },\n { numBlocks: 2, dataCodewordsPerBlock: 93 },\n ],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 36 },\n { numBlocks: 2, dataCodewordsPerBlock: 37 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 20 },\n { numBlocks: 6, dataCodewordsPerBlock: 21 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 7, dataCodewordsPerBlock: 14 },\n { numBlocks: 4, dataCodewordsPerBlock: 15 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0D847,\n versionNumber: 13,\n alignmentPatternCenters: [6, 34, 62],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 107 }],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 37 },\n { numBlocks: 1, dataCodewordsPerBlock: 38 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 20 },\n { numBlocks: 4, dataCodewordsPerBlock: 21 },\n ],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 12, dataCodewordsPerBlock: 11 },\n { numBlocks: 4, dataCodewordsPerBlock: 12 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0E60D,\n versionNumber: 14,\n alignmentPatternCenters: [6, 26, 46, 66],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 115 },\n { numBlocks: 1, dataCodewordsPerBlock: 116 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 40 },\n { numBlocks: 5, dataCodewordsPerBlock: 41 },\n ],\n },\n {\n ecCodewordsPerBlock: 20,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 16 },\n { numBlocks: 5, dataCodewordsPerBlock: 17 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 12 },\n { numBlocks: 5, dataCodewordsPerBlock: 13 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0F928,\n versionNumber: 15,\n alignmentPatternCenters: [6, 26, 48, 70],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 87 },\n { numBlocks: 1, dataCodewordsPerBlock: 88 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 41 },\n { numBlocks: 5, dataCodewordsPerBlock: 42 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 24 },\n { numBlocks: 7, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 12 },\n { numBlocks: 7, dataCodewordsPerBlock: 13 },\n ],\n },\n ],\n },\n {\n infoBits: 0x10B78,\n versionNumber: 16,\n alignmentPatternCenters: [6, 26, 50, 74],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 98 },\n { numBlocks: 1, dataCodewordsPerBlock: 99 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 7, dataCodewordsPerBlock: 45 },\n { numBlocks: 3, dataCodewordsPerBlock: 46 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 15, dataCodewordsPerBlock: 19 },\n { numBlocks: 2, dataCodewordsPerBlock: 20 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 15 },\n { numBlocks: 13, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1145D,\n versionNumber: 17,\n alignmentPatternCenters: [6, 30, 54, 78],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 1, dataCodewordsPerBlock: 107 },\n { numBlocks: 5, dataCodewordsPerBlock: 108 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 10, dataCodewordsPerBlock: 46 },\n { numBlocks: 1, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 1, dataCodewordsPerBlock: 22 },\n { numBlocks: 15, dataCodewordsPerBlock: 23 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 14 },\n { numBlocks: 17, dataCodewordsPerBlock: 15 },\n ],\n },\n ],\n },\n {\n infoBits: 0x12A17,\n versionNumber: 18,\n alignmentPatternCenters: [6, 30, 56, 82],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 120 },\n { numBlocks: 1, dataCodewordsPerBlock: 121 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 9, dataCodewordsPerBlock: 43 },\n { numBlocks: 4, dataCodewordsPerBlock: 44 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 17, dataCodewordsPerBlock: 22 },\n { numBlocks: 1, dataCodewordsPerBlock: 23 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 14 },\n { numBlocks: 19, dataCodewordsPerBlock: 15 },\n ],\n },\n ],\n },\n {\n infoBits: 0x13532,\n versionNumber: 19,\n alignmentPatternCenters: [6, 30, 58, 86],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 113 },\n { numBlocks: 4, dataCodewordsPerBlock: 114 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 44 },\n { numBlocks: 11, dataCodewordsPerBlock: 45 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 17, dataCodewordsPerBlock: 21 },\n { numBlocks: 4, dataCodewordsPerBlock: 22 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 9, dataCodewordsPerBlock: 13 },\n { numBlocks: 16, dataCodewordsPerBlock: 14 },\n ],\n },\n ],\n },\n {\n infoBits: 0x149A6,\n versionNumber: 20,\n alignmentPatternCenters: [6, 34, 62, 90],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 107 },\n { numBlocks: 5, dataCodewordsPerBlock: 108 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 41 },\n { numBlocks: 13, dataCodewordsPerBlock: 42 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 15, dataCodewordsPerBlock: 24 },\n { numBlocks: 5, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 15, dataCodewordsPerBlock: 15 },\n { numBlocks: 10, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x15683,\n versionNumber: 21,\n alignmentPatternCenters: [6, 28, 50, 72, 94],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 116 },\n { numBlocks: 4, dataCodewordsPerBlock: 117 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 42 }],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 17, dataCodewordsPerBlock: 22 },\n { numBlocks: 6, dataCodewordsPerBlock: 23 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 16 },\n { numBlocks: 6, dataCodewordsPerBlock: 17 },\n ],\n },\n ],\n },\n {\n infoBits: 0x168C9,\n versionNumber: 22,\n alignmentPatternCenters: [6, 26, 50, 74, 98],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 111 },\n { numBlocks: 7, dataCodewordsPerBlock: 112 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 46 }],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 7, dataCodewordsPerBlock: 24 },\n { numBlocks: 16, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [{ numBlocks: 34, dataCodewordsPerBlock: 13 }],\n },\n ],\n },\n {\n infoBits: 0x177EC,\n versionNumber: 23,\n alignmentPatternCenters: [6, 30, 54, 74, 102],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 121 },\n { numBlocks: 5, dataCodewordsPerBlock: 122 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 47 },\n { numBlocks: 14, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 24 },\n { numBlocks: 14, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 16, dataCodewordsPerBlock: 15 },\n { numBlocks: 14, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x18EC4,\n versionNumber: 24,\n alignmentPatternCenters: [6, 28, 54, 80, 106],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 117 },\n { numBlocks: 4, dataCodewordsPerBlock: 118 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 45 },\n { numBlocks: 14, dataCodewordsPerBlock: 46 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 24 },\n { numBlocks: 16, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 30, dataCodewordsPerBlock: 16 },\n { numBlocks: 2, dataCodewordsPerBlock: 17 },\n ],\n },\n ],\n },\n {\n infoBits: 0x191E1,\n versionNumber: 25,\n alignmentPatternCenters: [6, 32, 58, 84, 110],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 106 },\n { numBlocks: 4, dataCodewordsPerBlock: 107 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 47 },\n { numBlocks: 13, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 7, dataCodewordsPerBlock: 24 },\n { numBlocks: 22, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 22, dataCodewordsPerBlock: 15 },\n { numBlocks: 13, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1AFAB,\n versionNumber: 26,\n alignmentPatternCenters: [6, 30, 58, 86, 114],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 10, dataCodewordsPerBlock: 114 },\n { numBlocks: 2, dataCodewordsPerBlock: 115 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 46 },\n { numBlocks: 4, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 28, dataCodewordsPerBlock: 22 },\n { numBlocks: 6, dataCodewordsPerBlock: 23 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 33, dataCodewordsPerBlock: 16 },\n { numBlocks: 4, dataCodewordsPerBlock: 17 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1B08E,\n versionNumber: 27,\n alignmentPatternCenters: [6, 34, 62, 90, 118],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 122 },\n { numBlocks: 4, dataCodewordsPerBlock: 123 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 22, dataCodewordsPerBlock: 45 },\n { numBlocks: 3, dataCodewordsPerBlock: 46 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 23 },\n { numBlocks: 26, dataCodewordsPerBlock: 24 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 12, dataCodewordsPerBlock: 15 },\n { numBlocks: 28, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1CC1A,\n versionNumber: 28,\n alignmentPatternCenters: [6, 26, 50, 74, 98, 122],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 117 },\n { numBlocks: 10, dataCodewordsPerBlock: 118 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 45 },\n { numBlocks: 23, dataCodewordsPerBlock: 46 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 24 },\n { numBlocks: 31, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 15 },\n { numBlocks: 31, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1D33F,\n versionNumber: 29,\n alignmentPatternCenters: [6, 30, 54, 78, 102, 126],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 7, dataCodewordsPerBlock: 116 },\n { numBlocks: 7, dataCodewordsPerBlock: 117 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 21, dataCodewordsPerBlock: 45 },\n { numBlocks: 7, dataCodewordsPerBlock: 46 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 1, dataCodewordsPerBlock: 23 },\n { numBlocks: 37, dataCodewordsPerBlock: 24 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 15 },\n { numBlocks: 26, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1ED75,\n versionNumber: 30,\n alignmentPatternCenters: [6, 26, 52, 78, 104, 130],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 115 },\n { numBlocks: 10, dataCodewordsPerBlock: 116 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 47 },\n { numBlocks: 10, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 15, dataCodewordsPerBlock: 24 },\n { numBlocks: 25, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 23, dataCodewordsPerBlock: 15 },\n { numBlocks: 25, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1F250,\n versionNumber: 31,\n alignmentPatternCenters: [6, 30, 56, 82, 108, 134],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 13, dataCodewordsPerBlock: 115 },\n { numBlocks: 3, dataCodewordsPerBlock: 116 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 46 },\n { numBlocks: 29, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 42, dataCodewordsPerBlock: 24 },\n { numBlocks: 1, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 23, dataCodewordsPerBlock: 15 },\n { numBlocks: 28, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x209D5,\n versionNumber: 32,\n alignmentPatternCenters: [6, 34, 60, 86, 112, 138],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 115 }],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 10, dataCodewordsPerBlock: 46 },\n { numBlocks: 23, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 10, dataCodewordsPerBlock: 24 },\n { numBlocks: 35, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 15 },\n { numBlocks: 35, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x216F0,\n versionNumber: 33,\n alignmentPatternCenters: [6, 30, 58, 86, 114, 142],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 17, dataCodewordsPerBlock: 115 },\n { numBlocks: 1, dataCodewordsPerBlock: 116 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 14, dataCodewordsPerBlock: 46 },\n { numBlocks: 21, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 29, dataCodewordsPerBlock: 24 },\n { numBlocks: 19, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 15 },\n { numBlocks: 46, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x228BA,\n versionNumber: 34,\n alignmentPatternCenters: [6, 34, 62, 90, 118, 146],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 13, dataCodewordsPerBlock: 115 },\n { numBlocks: 6, dataCodewordsPerBlock: 116 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 14, dataCodewordsPerBlock: 46 },\n { numBlocks: 23, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 44, dataCodewordsPerBlock: 24 },\n { numBlocks: 7, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 59, dataCodewordsPerBlock: 16 },\n { numBlocks: 1, dataCodewordsPerBlock: 17 },\n ],\n },\n ],\n },\n {\n infoBits: 0x2379F,\n versionNumber: 35,\n alignmentPatternCenters: [6, 30, 54, 78, 102, 126, 150],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 12, dataCodewordsPerBlock: 121 },\n { numBlocks: 7, dataCodewordsPerBlock: 122 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 12, dataCodewordsPerBlock: 47 },\n { numBlocks: 26, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 39, dataCodewordsPerBlock: 24 },\n { numBlocks: 14, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 22, dataCodewordsPerBlock: 15 },\n { numBlocks: 41, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x24B0B,\n versionNumber: 36,\n alignmentPatternCenters: [6, 24, 50, 76, 102, 128, 154],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 121 },\n { numBlocks: 14, dataCodewordsPerBlock: 122 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 47 },\n { numBlocks: 34, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 46, dataCodewordsPerBlock: 24 },\n { numBlocks: 10, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 15 },\n { numBlocks: 64, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x2542E,\n versionNumber: 37,\n alignmentPatternCenters: [6, 28, 54, 80, 106, 132, 158],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 17, dataCodewordsPerBlock: 122 },\n { numBlocks: 4, dataCodewordsPerBlock: 123 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 29, dataCodewordsPerBlock: 46 },\n { numBlocks: 14, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 49, dataCodewordsPerBlock: 24 },\n { numBlocks: 10, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 24, dataCodewordsPerBlock: 15 },\n { numBlocks: 46, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x26A64,\n versionNumber: 38,\n alignmentPatternCenters: [6, 32, 58, 84, 110, 136, 162],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 122 },\n { numBlocks: 18, dataCodewordsPerBlock: 123 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 13, dataCodewordsPerBlock: 46 },\n { numBlocks: 32, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 48, dataCodewordsPerBlock: 24 },\n { numBlocks: 14, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 42, dataCodewordsPerBlock: 15 },\n { numBlocks: 32, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x27541,\n versionNumber: 39,\n alignmentPatternCenters: [6, 26, 54, 82, 110, 138, 166],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 20, dataCodewordsPerBlock: 117 },\n { numBlocks: 4, dataCodewordsPerBlock: 118 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 40, dataCodewordsPerBlock: 47 },\n { numBlocks: 7, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 43, dataCodewordsPerBlock: 24 },\n { numBlocks: 22, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 10, dataCodewordsPerBlock: 15 },\n { numBlocks: 67, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x28C69,\n versionNumber: 40,\n alignmentPatternCenters: [6, 30, 58, 86, 114, 142, 170],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 118 },\n { numBlocks: 6, dataCodewordsPerBlock: 119 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 18, dataCodewordsPerBlock: 47 },\n { numBlocks: 31, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 34, dataCodewordsPerBlock: 24 },\n { numBlocks: 34, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 20, dataCodewordsPerBlock: 15 },\n { numBlocks: 61, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n];\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix_1 = __webpack_require__(0);\nfunction squareToQuadrilateral(p1, p2, p3, p4) {\n var dx3 = p1.x - p2.x + p3.x - p4.x;\n var dy3 = p1.y - p2.y + p3.y - p4.y;\n if (dx3 === 0 && dy3 === 0) { // Affine\n return {\n a11: p2.x - p1.x,\n a12: p2.y - p1.y,\n a13: 0,\n a21: p3.x - p2.x,\n a22: p3.y - p2.y,\n a23: 0,\n a31: p1.x,\n a32: p1.y,\n a33: 1,\n };\n }\n else {\n var dx1 = p2.x - p3.x;\n var dx2 = p4.x - p3.x;\n var dy1 = p2.y - p3.y;\n var dy2 = p4.y - p3.y;\n var denominator = dx1 * dy2 - dx2 * dy1;\n var a13 = (dx3 * dy2 - dx2 * dy3) / denominator;\n var a23 = (dx1 * dy3 - dx3 * dy1) / denominator;\n return {\n a11: p2.x - p1.x + a13 * p2.x,\n a12: p2.y - p1.y + a13 * p2.y,\n a13: a13,\n a21: p4.x - p1.x + a23 * p4.x,\n a22: p4.y - p1.y + a23 * p4.y,\n a23: a23,\n a31: p1.x,\n a32: p1.y,\n a33: 1,\n };\n }\n}\nfunction quadrilateralToSquare(p1, p2, p3, p4) {\n // Here, the adjoint serves as the inverse:\n var sToQ = squareToQuadrilateral(p1, p2, p3, p4);\n return {\n a11: sToQ.a22 * sToQ.a33 - sToQ.a23 * sToQ.a32,\n a12: sToQ.a13 * sToQ.a32 - sToQ.a12 * sToQ.a33,\n a13: sToQ.a12 * sToQ.a23 - sToQ.a13 * sToQ.a22,\n a21: sToQ.a23 * sToQ.a31 - sToQ.a21 * sToQ.a33,\n a22: sToQ.a11 * sToQ.a33 - sToQ.a13 * sToQ.a31,\n a23: sToQ.a13 * sToQ.a21 - sToQ.a11 * sToQ.a23,\n a31: sToQ.a21 * sToQ.a32 - sToQ.a22 * sToQ.a31,\n a32: sToQ.a12 * sToQ.a31 - sToQ.a11 * sToQ.a32,\n a33: sToQ.a11 * sToQ.a22 - sToQ.a12 * sToQ.a21,\n };\n}\nfunction times(a, b) {\n return {\n a11: a.a11 * b.a11 + a.a21 * b.a12 + a.a31 * b.a13,\n a12: a.a12 * b.a11 + a.a22 * b.a12 + a.a32 * b.a13,\n a13: a.a13 * b.a11 + a.a23 * b.a12 + a.a33 * b.a13,\n a21: a.a11 * b.a21 + a.a21 * b.a22 + a.a31 * b.a23,\n a22: a.a12 * b.a21 + a.a22 * b.a22 + a.a32 * b.a23,\n a23: a.a13 * b.a21 + a.a23 * b.a22 + a.a33 * b.a23,\n a31: a.a11 * b.a31 + a.a21 * b.a32 + a.a31 * b.a33,\n a32: a.a12 * b.a31 + a.a22 * b.a32 + a.a32 * b.a33,\n a33: a.a13 * b.a31 + a.a23 * b.a32 + a.a33 * b.a33,\n };\n}\nfunction extract(image, location) {\n var qToS = quadrilateralToSquare({ x: 3.5, y: 3.5 }, { x: location.dimension - 3.5, y: 3.5 }, { x: location.dimension - 6.5, y: location.dimension - 6.5 }, { x: 3.5, y: location.dimension - 3.5 });\n var sToQ = squareToQuadrilateral(location.topLeft, location.topRight, location.alignmentPattern, location.bottomLeft);\n var transform = times(sToQ, qToS);\n var matrix = BitMatrix_1.BitMatrix.createEmpty(location.dimension, location.dimension);\n var mappingFunction = function (x, y) {\n var denominator = transform.a13 * x + transform.a23 * y + transform.a33;\n return {\n x: (transform.a11 * x + transform.a21 * y + transform.a31) / denominator,\n y: (transform.a12 * x + transform.a22 * y + transform.a32) / denominator,\n };\n };\n for (var y = 0; y < location.dimension; y++) {\n for (var x = 0; x < location.dimension; x++) {\n var xValue = x + 0.5;\n var yValue = y + 0.5;\n var sourcePixel = mappingFunction(xValue, yValue);\n matrix.set(x, y, image.get(Math.floor(sourcePixel.x), Math.floor(sourcePixel.y)));\n }\n }\n return {\n matrix: matrix,\n mappingFunction: mappingFunction,\n };\n}\nexports.extract = extract;\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MAX_FINDERPATTERNS_TO_SEARCH = 4;\nvar MIN_QUAD_RATIO = 0.5;\nvar MAX_QUAD_RATIO = 1.5;\nvar distance = function (a, b) { return Math.sqrt(Math.pow((b.x - a.x), 2) + Math.pow((b.y - a.y), 2)); };\nfunction sum(values) {\n return values.reduce(function (a, b) { return a + b; });\n}\n// Takes three finder patterns and organizes them into topLeft, topRight, etc\nfunction reorderFinderPatterns(pattern1, pattern2, pattern3) {\n var _a, _b, _c, _d;\n // Find distances between pattern centers\n var oneTwoDistance = distance(pattern1, pattern2);\n var twoThreeDistance = distance(pattern2, pattern3);\n var oneThreeDistance = distance(pattern1, pattern3);\n var bottomLeft;\n var topLeft;\n var topRight;\n // Assume one closest to other two is B; A and C will just be guesses at first\n if (twoThreeDistance >= oneTwoDistance && twoThreeDistance >= oneThreeDistance) {\n _a = [pattern2, pattern1, pattern3], bottomLeft = _a[0], topLeft = _a[1], topRight = _a[2];\n }\n else if (oneThreeDistance >= twoThreeDistance && oneThreeDistance >= oneTwoDistance) {\n _b = [pattern1, pattern2, pattern3], bottomLeft = _b[0], topLeft = _b[1], topRight = _b[2];\n }\n else {\n _c = [pattern1, pattern3, pattern2], bottomLeft = _c[0], topLeft = _c[1], topRight = _c[2];\n }\n // Use cross product to figure out whether bottomLeft (A) and topRight (C) are correct or flipped in relation to topLeft (B)\n // This asks whether BC x BA has a positive z component, which is the arrangement we want. If it's negative, then\n // we've got it flipped around and should swap topRight and bottomLeft.\n if (((topRight.x - topLeft.x) * (bottomLeft.y - topLeft.y)) - ((topRight.y - topLeft.y) * (bottomLeft.x - topLeft.x)) < 0) {\n _d = [topRight, bottomLeft], bottomLeft = _d[0], topRight = _d[1];\n }\n return { bottomLeft: bottomLeft, topLeft: topLeft, topRight: topRight };\n}\n// Computes the dimension (number of modules on a side) of the QR Code based on the position of the finder patterns\nfunction computeDimension(topLeft, topRight, bottomLeft, matrix) {\n var moduleSize = (sum(countBlackWhiteRun(topLeft, bottomLeft, matrix, 5)) / 7 + // Divide by 7 since the ratio is 1:1:3:1:1\n sum(countBlackWhiteRun(topLeft, topRight, matrix, 5)) / 7 +\n sum(countBlackWhiteRun(bottomLeft, topLeft, matrix, 5)) / 7 +\n sum(countBlackWhiteRun(topRight, topLeft, matrix, 5)) / 7) / 4;\n if (moduleSize < 1) {\n throw new Error(\"Invalid module size\");\n }\n var topDimension = Math.round(distance(topLeft, topRight) / moduleSize);\n var sideDimension = Math.round(distance(topLeft, bottomLeft) / moduleSize);\n var dimension = Math.floor((topDimension + sideDimension) / 2) + 7;\n switch (dimension % 4) {\n case 0:\n dimension++;\n break;\n case 2:\n dimension--;\n break;\n }\n return { dimension: dimension, moduleSize: moduleSize };\n}\n// Takes an origin point and an end point and counts the sizes of the black white run from the origin towards the end point.\n// Returns an array of elements, representing the pixel size of the black white run.\n// Uses a variant of http://en.wikipedia.org/wiki/Bresenham's_line_algorithm\nfunction countBlackWhiteRunTowardsPoint(origin, end, matrix, length) {\n var switchPoints = [{ x: Math.floor(origin.x), y: Math.floor(origin.y) }];\n var steep = Math.abs(end.y - origin.y) > Math.abs(end.x - origin.x);\n var fromX;\n var fromY;\n var toX;\n var toY;\n if (steep) {\n fromX = Math.floor(origin.y);\n fromY = Math.floor(origin.x);\n toX = Math.floor(end.y);\n toY = Math.floor(end.x);\n }\n else {\n fromX = Math.floor(origin.x);\n fromY = Math.floor(origin.y);\n toX = Math.floor(end.x);\n toY = Math.floor(end.y);\n }\n var dx = Math.abs(toX - fromX);\n var dy = Math.abs(toY - fromY);\n var error = Math.floor(-dx / 2);\n var xStep = fromX < toX ? 1 : -1;\n var yStep = fromY < toY ? 1 : -1;\n var currentPixel = true;\n // Loop up until x == toX, but not beyond\n for (var x = fromX, y = fromY; x !== toX + xStep; x += xStep) {\n // Does current pixel mean we have moved white to black or vice versa?\n // Scanning black in state 0,2 and white in state 1, so if we find the wrong\n // color, advance to next state or end if we are in state 2 already\n var realX = steep ? y : x;\n var realY = steep ? x : y;\n if (matrix.get(realX, realY) !== currentPixel) {\n currentPixel = !currentPixel;\n switchPoints.push({ x: realX, y: realY });\n if (switchPoints.length === length + 1) {\n break;\n }\n }\n error += dy;\n if (error > 0) {\n if (y === toY) {\n break;\n }\n y += yStep;\n error -= dx;\n }\n }\n var distances = [];\n for (var i = 0; i < length; i++) {\n if (switchPoints[i] && switchPoints[i + 1]) {\n distances.push(distance(switchPoints[i], switchPoints[i + 1]));\n }\n else {\n distances.push(0);\n }\n }\n return distances;\n}\n// Takes an origin point and an end point and counts the sizes of the black white run in the origin point\n// along the line that intersects with the end point. Returns an array of elements, representing the pixel sizes\n// of the black white run. Takes a length which represents the number of switches from black to white to look for.\nfunction countBlackWhiteRun(origin, end, matrix, length) {\n var _a;\n var rise = end.y - origin.y;\n var run = end.x - origin.x;\n var towardsEnd = countBlackWhiteRunTowardsPoint(origin, end, matrix, Math.ceil(length / 2));\n var awayFromEnd = countBlackWhiteRunTowardsPoint(origin, { x: origin.x - run, y: origin.y - rise }, matrix, Math.ceil(length / 2));\n var middleValue = towardsEnd.shift() + awayFromEnd.shift() - 1; // Substract one so we don't double count a pixel\n return (_a = awayFromEnd.concat(middleValue)).concat.apply(_a, towardsEnd);\n}\n// Takes in a black white run and an array of expected ratios. Returns the average size of the run as well as the \"error\" -\n// that is the amount the run diverges from the expected ratio\nfunction scoreBlackWhiteRun(sequence, ratios) {\n var averageSize = sum(sequence) / sum(ratios);\n var error = 0;\n ratios.forEach(function (ratio, i) {\n error += Math.pow((sequence[i] - ratio * averageSize), 2);\n });\n return { averageSize: averageSize, error: error };\n}\n// Takes an X,Y point and an array of sizes and scores the point against those ratios.\n// For example for a finder pattern takes the ratio list of 1:1:3:1:1 and checks horizontal, vertical and diagonal ratios\n// against that.\nfunction scorePattern(point, ratios, matrix) {\n try {\n var horizontalRun = countBlackWhiteRun(point, { x: -1, y: point.y }, matrix, ratios.length);\n var verticalRun = countBlackWhiteRun(point, { x: point.x, y: -1 }, matrix, ratios.length);\n var topLeftPoint = {\n x: Math.max(0, point.x - point.y) - 1,\n y: Math.max(0, point.y - point.x) - 1,\n };\n var topLeftBottomRightRun = countBlackWhiteRun(point, topLeftPoint, matrix, ratios.length);\n var bottomLeftPoint = {\n x: Math.min(matrix.width, point.x + point.y) + 1,\n y: Math.min(matrix.height, point.y + point.x) + 1,\n };\n var bottomLeftTopRightRun = countBlackWhiteRun(point, bottomLeftPoint, matrix, ratios.length);\n var horzError = scoreBlackWhiteRun(horizontalRun, ratios);\n var vertError = scoreBlackWhiteRun(verticalRun, ratios);\n var diagDownError = scoreBlackWhiteRun(topLeftBottomRightRun, ratios);\n var diagUpError = scoreBlackWhiteRun(bottomLeftTopRightRun, ratios);\n var ratioError = Math.sqrt(horzError.error * horzError.error +\n vertError.error * vertError.error +\n diagDownError.error * diagDownError.error +\n diagUpError.error * diagUpError.error);\n var avgSize = (horzError.averageSize + vertError.averageSize + diagDownError.averageSize + diagUpError.averageSize) / 4;\n var sizeError = (Math.pow((horzError.averageSize - avgSize), 2) +\n Math.pow((vertError.averageSize - avgSize), 2) +\n Math.pow((diagDownError.averageSize - avgSize), 2) +\n Math.pow((diagUpError.averageSize - avgSize), 2)) / avgSize;\n return ratioError + sizeError;\n }\n catch (_a) {\n return Infinity;\n }\n}\nfunction recenterLocation(matrix, p) {\n var leftX = Math.round(p.x);\n while (matrix.get(leftX, Math.round(p.y))) {\n leftX--;\n }\n var rightX = Math.round(p.x);\n while (matrix.get(rightX, Math.round(p.y))) {\n rightX++;\n }\n var x = (leftX + rightX) / 2;\n var topY = Math.round(p.y);\n while (matrix.get(Math.round(x), topY)) {\n topY--;\n }\n var bottomY = Math.round(p.y);\n while (matrix.get(Math.round(x), bottomY)) {\n bottomY++;\n }\n var y = (topY + bottomY) / 2;\n return { x: x, y: y };\n}\nfunction locate(matrix) {\n var finderPatternQuads = [];\n var activeFinderPatternQuads = [];\n var alignmentPatternQuads = [];\n var activeAlignmentPatternQuads = [];\n var _loop_1 = function (y) {\n var length_1 = 0;\n var lastBit = false;\n var scans = [0, 0, 0, 0, 0];\n var _loop_2 = function (x) {\n var v = matrix.get(x, y);\n if (v === lastBit) {\n length_1++;\n }\n else {\n scans = [scans[1], scans[2], scans[3], scans[4], length_1];\n length_1 = 1;\n lastBit = v;\n // Do the last 5 color changes ~ match the expected ratio for a finder pattern? 1:1:3:1:1 of b:w:b:w:b\n var averageFinderPatternBlocksize = sum(scans) / 7;\n var validFinderPattern = Math.abs(scans[0] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n Math.abs(scans[1] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n Math.abs(scans[2] - 3 * averageFinderPatternBlocksize) < 3 * averageFinderPatternBlocksize &&\n Math.abs(scans[3] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n Math.abs(scans[4] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n !v; // And make sure the current pixel is white since finder patterns are bordered in white\n // Do the last 3 color changes ~ match the expected ratio for an alignment pattern? 1:1:1 of w:b:w\n var averageAlignmentPatternBlocksize = sum(scans.slice(-3)) / 3;\n var validAlignmentPattern = Math.abs(scans[2] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize &&\n Math.abs(scans[3] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize &&\n Math.abs(scans[4] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize &&\n v; // Is the current pixel black since alignment patterns are bordered in black\n if (validFinderPattern) {\n // Compute the start and end x values of the large center black square\n var endX_1 = x - scans[3] - scans[4];\n var startX_1 = endX_1 - scans[2];\n var line = { startX: startX_1, endX: endX_1, y: y };\n // Is there a quad directly above the current spot? If so, extend it with the new line. Otherwise, create a new quad with\n // that line as the starting point.\n var matchingQuads = activeFinderPatternQuads.filter(function (q) {\n return (startX_1 >= q.bottom.startX && startX_1 <= q.bottom.endX) ||\n (endX_1 >= q.bottom.startX && startX_1 <= q.bottom.endX) ||\n (startX_1 <= q.bottom.startX && endX_1 >= q.bottom.endX && ((scans[2] / (q.bottom.endX - q.bottom.startX)) < MAX_QUAD_RATIO &&\n (scans[2] / (q.bottom.endX - q.bottom.startX)) > MIN_QUAD_RATIO));\n });\n if (matchingQuads.length > 0) {\n matchingQuads[0].bottom = line;\n }\n else {\n activeFinderPatternQuads.push({ top: line, bottom: line });\n }\n }\n if (validAlignmentPattern) {\n // Compute the start and end x values of the center black square\n var endX_2 = x - scans[4];\n var startX_2 = endX_2 - scans[3];\n var line = { startX: startX_2, y: y, endX: endX_2 };\n // Is there a quad directly above the current spot? If so, extend it with the new line. Otherwise, create a new quad with\n // that line as the starting point.\n var matchingQuads = activeAlignmentPatternQuads.filter(function (q) {\n return (startX_2 >= q.bottom.startX && startX_2 <= q.bottom.endX) ||\n (endX_2 >= q.bottom.startX && startX_2 <= q.bottom.endX) ||\n (startX_2 <= q.bottom.startX && endX_2 >= q.bottom.endX && ((scans[2] / (q.bottom.endX - q.bottom.startX)) < MAX_QUAD_RATIO &&\n (scans[2] / (q.bottom.endX - q.bottom.startX)) > MIN_QUAD_RATIO));\n });\n if (matchingQuads.length > 0) {\n matchingQuads[0].bottom = line;\n }\n else {\n activeAlignmentPatternQuads.push({ top: line, bottom: line });\n }\n }\n }\n };\n for (var x = -1; x <= matrix.width; x++) {\n _loop_2(x);\n }\n finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) { return q.bottom.y !== y && q.bottom.y - q.top.y >= 2; }));\n activeFinderPatternQuads = activeFinderPatternQuads.filter(function (q) { return q.bottom.y === y; });\n alignmentPatternQuads.push.apply(alignmentPatternQuads, activeAlignmentPatternQuads.filter(function (q) { return q.bottom.y !== y; }));\n activeAlignmentPatternQuads = activeAlignmentPatternQuads.filter(function (q) { return q.bottom.y === y; });\n };\n for (var y = 0; y <= matrix.height; y++) {\n _loop_1(y);\n }\n finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) { return q.bottom.y - q.top.y >= 2; }));\n alignmentPatternQuads.push.apply(alignmentPatternQuads, activeAlignmentPatternQuads);\n var finderPatternGroups = finderPatternQuads\n .filter(function (q) { return q.bottom.y - q.top.y >= 2; }) // All quads must be at least 2px tall since the center square is larger than a block\n .map(function (q) {\n var x = (q.top.startX + q.top.endX + q.bottom.startX + q.bottom.endX) / 4;\n var y = (q.top.y + q.bottom.y + 1) / 2;\n if (!matrix.get(Math.round(x), Math.round(y))) {\n return;\n }\n var lengths = [q.top.endX - q.top.startX, q.bottom.endX - q.bottom.startX, q.bottom.y - q.top.y + 1];\n var size = sum(lengths) / lengths.length;\n var score = scorePattern({ x: Math.round(x), y: Math.round(y) }, [1, 1, 3, 1, 1], matrix);\n return { score: score, x: x, y: y, size: size };\n })\n .filter(function (q) { return !!q; }) // Filter out any rejected quads from above\n .sort(function (a, b) { return a.score - b.score; })\n // Now take the top finder pattern options and try to find 2 other options with a similar size.\n .map(function (point, i, finderPatterns) {\n if (i > MAX_FINDERPATTERNS_TO_SEARCH) {\n return null;\n }\n var otherPoints = finderPatterns\n .filter(function (p, ii) { return i !== ii; })\n .map(function (p) { return ({ x: p.x, y: p.y, score: p.score + (Math.pow((p.size - point.size), 2)) / point.size, size: p.size }); })\n .sort(function (a, b) { return a.score - b.score; });\n if (otherPoints.length < 2) {\n return null;\n }\n var score = point.score + otherPoints[0].score + otherPoints[1].score;\n return { points: [point].concat(otherPoints.slice(0, 2)), score: score };\n })\n .filter(function (q) { return !!q; }) // Filter out any rejected finder patterns from above\n .sort(function (a, b) { return a.score - b.score; });\n if (finderPatternGroups.length === 0) {\n return null;\n }\n var _a = reorderFinderPatterns(finderPatternGroups[0].points[0], finderPatternGroups[0].points[1], finderPatternGroups[0].points[2]), topRight = _a.topRight, topLeft = _a.topLeft, bottomLeft = _a.bottomLeft;\n var alignment = findAlignmentPattern(matrix, alignmentPatternQuads, topRight, topLeft, bottomLeft);\n var result = [];\n if (alignment) {\n result.push({\n alignmentPattern: { x: alignment.alignmentPattern.x, y: alignment.alignmentPattern.y },\n bottomLeft: { x: bottomLeft.x, y: bottomLeft.y },\n dimension: alignment.dimension,\n topLeft: { x: topLeft.x, y: topLeft.y },\n topRight: { x: topRight.x, y: topRight.y },\n });\n }\n // We normally use the center of the quads as the location of the tracking points, which is optimal for most cases and will account\n // for a skew in the image. However, In some cases, a slight skew might not be real and instead be caused by image compression\n // errors and/or low resolution. For those cases, we'd be better off centering the point exactly in the middle of the black area. We\n // compute and return the location data for the naively centered points as it is little additional work and allows for multiple\n // attempts at decoding harder images.\n var midTopRight = recenterLocation(matrix, topRight);\n var midTopLeft = recenterLocation(matrix, topLeft);\n var midBottomLeft = recenterLocation(matrix, bottomLeft);\n var centeredAlignment = findAlignmentPattern(matrix, alignmentPatternQuads, midTopRight, midTopLeft, midBottomLeft);\n if (centeredAlignment) {\n result.push({\n alignmentPattern: { x: centeredAlignment.alignmentPattern.x, y: centeredAlignment.alignmentPattern.y },\n bottomLeft: { x: midBottomLeft.x, y: midBottomLeft.y },\n topLeft: { x: midTopLeft.x, y: midTopLeft.y },\n topRight: { x: midTopRight.x, y: midTopRight.y },\n dimension: centeredAlignment.dimension,\n });\n }\n if (result.length === 0) {\n return null;\n }\n return result;\n}\nexports.locate = locate;\nfunction findAlignmentPattern(matrix, alignmentPatternQuads, topRight, topLeft, bottomLeft) {\n var _a;\n // Now that we've found the three finder patterns we can determine the blockSize and the size of the QR code.\n // We'll use these to help find the alignment pattern but also later when we do the extraction.\n var dimension;\n var moduleSize;\n try {\n (_a = computeDimension(topLeft, topRight, bottomLeft, matrix), dimension = _a.dimension, moduleSize = _a.moduleSize);\n }\n catch (e) {\n return null;\n }\n // Now find the alignment pattern\n var bottomRightFinderPattern = {\n x: topRight.x - topLeft.x + bottomLeft.x,\n y: topRight.y - topLeft.y + bottomLeft.y,\n };\n var modulesBetweenFinderPatterns = ((distance(topLeft, bottomLeft) + distance(topLeft, topRight)) / 2 / moduleSize);\n var correctionToTopLeft = 1 - (3 / modulesBetweenFinderPatterns);\n var expectedAlignmentPattern = {\n x: topLeft.x + correctionToTopLeft * (bottomRightFinderPattern.x - topLeft.x),\n y: topLeft.y + correctionToTopLeft * (bottomRightFinderPattern.y - topLeft.y),\n };\n var alignmentPatterns = alignmentPatternQuads\n .map(function (q) {\n var x = (q.top.startX + q.top.endX + q.bottom.startX + q.bottom.endX) / 4;\n var y = (q.top.y + q.bottom.y + 1) / 2;\n if (!matrix.get(Math.floor(x), Math.floor(y))) {\n return;\n }\n var lengths = [q.top.endX - q.top.startX, q.bottom.endX - q.bottom.startX, (q.bottom.y - q.top.y + 1)];\n var size = sum(lengths) / lengths.length;\n var sizeScore = scorePattern({ x: Math.floor(x), y: Math.floor(y) }, [1, 1, 1], matrix);\n var score = sizeScore + distance({ x: x, y: y }, expectedAlignmentPattern);\n return { x: x, y: y, score: score };\n })\n .filter(function (v) { return !!v; })\n .sort(function (a, b) { return a.score - b.score; });\n // If there are less than 15 modules between finder patterns it's a version 1 QR code and as such has no alignmemnt pattern\n // so we can only use our best guess.\n var alignmentPattern = modulesBetweenFinderPatterns >= 15 && alignmentPatterns.length ? alignmentPatterns[0] : expectedAlignmentPattern;\n return { alignmentPattern: alignmentPattern, dimension: dimension };\n}\n\n\n/***/ })\n/******/ ])[\"default\"];\n});","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","/**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\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\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var displayName = outerType.displayName;\n\n if (displayName) {\n return displayName;\n }\n\n var functionName = innerType.displayName || innerType.name || '';\n return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\n\nfunction getComponentNameFromType(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n var outerName = type.displayName || null;\n\n if (outerName !== null) {\n return outerName;\n }\n\n return getComponentNameFromType(type.type) || 'Memo';\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentNameFromType(init(payload));\n } catch (x) {\n return null;\n }\n }\n\n // eslint-disable-next-line no-fallthrough\n }\n }\n\n return null;\n}\n\nvar assign = Object.assign;\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: assign({}, props, {\n value: prevLog\n }),\n info: assign({}, props, {\n value: prevInfo\n }),\n warn: assign({}, props, {\n value: prevWarn\n }),\n error: assign({}, props, {\n value: prevError\n }),\n group: assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if ( !fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"\"\n // but we have a user-provided \"displayName\"\n // splice it in to make the stack more readable.\n\n\n if (fn.displayName && _frame.includes('')) {\n _frame = _frame.replace('', fn.displayName);\n }\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n // eslint-disable-next-line react-internal/prod-error-codes\n var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n return isArrayImpl(a);\n}\n\n/*\n * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe only called in DEV, so void return is not possible.\nfunction typeName(value) {\n {\n // toStringTag is needed for namespaced types like Temporal.Instant\n var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';\n return type;\n }\n} // $FlowFixMe only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n {\n try {\n testStringCoercion(value);\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n\nfunction testStringCoercion(value) {\n // If you ended up here by following an exception call stack, here's what's\n // happened: you supplied an object or symbol value to React (as a prop, key,\n // DOM attribute, CSS property, string ref, etc.) and when React tried to\n // coerce it to a string using `'' + value`, an exception was thrown.\n //\n // The most common types that will cause this exception are `Symbol` instances\n // and Temporal objects like `Temporal.Instant`. But any object that has a\n // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n // exception. (Library authors do this to prevent users from using built-in\n // numeric operators like `+` or comparison operators like `>=` because custom\n // methods are needed to perform accurate arithmetic or comparison.)\n //\n // To fix the problem, coerce this object or symbol value to a string before\n // passing it to React. The most reliable way is usually `String(value)`.\n //\n // To find which value is throwing, check the browser or debugger console.\n // Before this exception was thrown, there should be `console.error` output\n // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n // problem and how that type was used: key, atrribute, input value prop, etc.\n // In most cases, this console output also shows the component and its\n // ancestor components where the exception happened.\n //\n // eslint-disable-next-line react-internal/safe-string-coercion\n return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n {\n if (willCoercionThrow(value)) {\n error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));\n\n return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n }\n }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie.
\n // or
). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n //
, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n {\n checkKeyStringCoercion(maybeKey);\n }\n\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n ref = config.ref;\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\n\nfunction isValidElement(object) {\n {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner$1.current) {\n var name = getComponentNameFromType(ReactCurrentOwner$1.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object') {\n return;\n }\n\n if (isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentNameFromType(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentNameFromType(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\n\nvar didWarnAboutKeySpread = {};\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(source);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n\n var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n var children = props.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n }\n\n {\n if (hasOwnProperty.call(props, 'key')) {\n var componentName = getComponentNameFromType(type);\n var keys = Object.keys(props).filter(function (k) {\n return k !== 'key';\n });\n var beforeExample = keys.length > 0 ? '{key: someKey, ' + keys.join(': ..., ') + ': ...}' : '{key: someKey}';\n\n if (!didWarnAboutKeySpread[componentName + beforeExample]) {\n var afterExample = keys.length > 0 ? '{' + keys.join(': ..., ') + ': ...}' : '{}';\n\n error('A props object containing a \"key\" prop is being spread into JSX:\\n' + ' let props = %s;\\n' + ' <%s {...props} />\\n' + 'React keys must be passed directly to JSX without using spread:\\n' + ' let props = %s;\\n' + ' <%s key={someKey} {...props} />', beforeExample, componentName, afterExample, componentName);\n\n didWarnAboutKeySpread[componentName + beforeExample] = true;\n }\n }\n }\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n }\n} // These two functions exist to still get child warnings in dev\n\nvar jsxDEV$1 = jsxWithValidation ;\n\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsxDEV = jsxDEV$1;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-dev-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-dev-runtime.development.js');\n}\n","module.exports = QRCode;","module.exports = React;","module.exports = ReactDOM;","module.exports = ReactIntl;","module.exports = tinode;","import { Component, ComponentContainer } from '@firebase/component';\nimport { Logger, setUserLogHandler, setLogLevel as setLogLevel$1 } from '@firebase/logger';\nimport { ErrorFactory, base64Decode, getDefaultAppConfig, deepEqual, isBrowser, isWebWorker, FirebaseError, base64urlEncodeWithoutPadding, isIndexedDBAvailable, validateIndexedDBOpenable } from '@firebase/util';\nexport { FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nclass PlatformLoggerServiceImpl {\n constructor(container) {\n this.container = container;\n }\n // In initial implementation, this will be called by installations on\n // auth token refresh, and installations will send this string.\n getPlatformInfoString() {\n const providers = this.container.getProviders();\n // Loop through providers and get library/version pairs from any that are\n // version components.\n return providers\n .map(provider => {\n if (isVersionServiceProvider(provider)) {\n const service = provider.getImmediate();\n return `${service.library}/${service.version}`;\n }\n else {\n return null;\n }\n })\n .filter(logString => logString)\n .join(' ');\n }\n}\n/**\n *\n * @param provider check if this provider provides a VersionService\n *\n * NOTE: Using Provider<'app-version'> is a hack to indicate that the provider\n * provides VersionService. The provider is not necessarily a 'app-version'\n * provider.\n */\nfunction isVersionServiceProvider(provider) {\n const component = provider.getComponent();\n return component?.type === \"VERSION\" /* ComponentType.VERSION */;\n}\n\nconst name$q = \"@firebase/app\";\nconst version$1 = \"0.15.0\";\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst logger = new Logger('@firebase/app');\n\nconst name$p = \"@firebase/app-compat\";\n\nconst name$o = \"@firebase/analytics-compat\";\n\nconst name$n = \"@firebase/analytics\";\n\nconst name$m = \"@firebase/app-check-compat\";\n\nconst name$l = \"@firebase/app-check\";\n\nconst name$k = \"@firebase/auth\";\n\nconst name$j = \"@firebase/auth-compat\";\n\nconst name$i = \"@firebase/database\";\n\nconst name$h = \"@firebase/data-connect\";\n\nconst name$g = \"@firebase/database-compat\";\n\nconst name$f = \"@firebase/functions\";\n\nconst name$e = \"@firebase/functions-compat\";\n\nconst name$d = \"@firebase/installations\";\n\nconst name$c = \"@firebase/installations-compat\";\n\nconst name$b = \"@firebase/messaging\";\n\nconst name$a = \"@firebase/messaging-compat\";\n\nconst name$9 = \"@firebase/performance\";\n\nconst name$8 = \"@firebase/performance-compat\";\n\nconst name$7 = \"@firebase/remote-config\";\n\nconst name$6 = \"@firebase/remote-config-compat\";\n\nconst name$5 = \"@firebase/storage\";\n\nconst name$4 = \"@firebase/storage-compat\";\n\nconst name$3 = \"@firebase/firestore\";\n\nconst name$2 = \"@firebase/ai\";\n\nconst name$1 = \"@firebase/firestore-compat\";\n\nconst name = \"firebase\";\nconst version = \"12.15.0\";\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The default app name\n *\n * @internal\n */\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\nconst PLATFORM_LOG_STRING = {\n [name$q]: 'fire-core',\n [name$p]: 'fire-core-compat',\n [name$n]: 'fire-analytics',\n [name$o]: 'fire-analytics-compat',\n [name$l]: 'fire-app-check',\n [name$m]: 'fire-app-check-compat',\n [name$k]: 'fire-auth',\n [name$j]: 'fire-auth-compat',\n [name$i]: 'fire-rtdb',\n [name$h]: 'fire-data-connect',\n [name$g]: 'fire-rtdb-compat',\n [name$f]: 'fire-fn',\n [name$e]: 'fire-fn-compat',\n [name$d]: 'fire-iid',\n [name$c]: 'fire-iid-compat',\n [name$b]: 'fire-fcm',\n [name$a]: 'fire-fcm-compat',\n [name$9]: 'fire-perf',\n [name$8]: 'fire-perf-compat',\n [name$7]: 'fire-rc',\n [name$6]: 'fire-rc-compat',\n [name$5]: 'fire-gcs',\n [name$4]: 'fire-gcs-compat',\n [name$3]: 'fire-fst',\n [name$1]: 'fire-fst-compat',\n [name$2]: 'fire-vertex',\n 'fire-js': 'fire-js', // Platform identifier for JS SDK.\n [name]: 'fire-js-all'\n};\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @internal\n */\nconst _apps = new Map();\n/**\n * @internal\n */\nconst _serverApps = new Map();\n/**\n * Registered components.\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _components = new Map();\n/**\n * @param component - the component being added to this app's container\n *\n * @internal\n */\nfunction _addComponent(app, component) {\n try {\n app.container.addComponent(component);\n }\n catch (e) {\n logger.debug(`Component ${component.name} failed to register with FirebaseApp ${app.name}`, e);\n }\n}\n/**\n *\n * @internal\n */\nfunction _addOrOverwriteComponent(app, component) {\n app.container.addOrOverwriteComponent(component);\n}\n/**\n *\n * @param component - the component to register\n * @returns whether or not the component is registered successfully\n *\n * @internal\n */\nfunction _registerComponent(component) {\n const componentName = component.name;\n if (_components.has(componentName)) {\n logger.debug(`There were multiple attempts to register component ${componentName}.`);\n return false;\n }\n _components.set(componentName, component);\n // add the component to existing app instances\n for (const app of _apps.values()) {\n _addComponent(app, component);\n }\n for (const serverApp of _serverApps.values()) {\n _addComponent(serverApp, component);\n }\n return true;\n}\n/**\n *\n * @param app - FirebaseApp instance\n * @param name - service name\n *\n * @returns the provider for the service with the matching name\n *\n * @internal\n */\nfunction _getProvider(app, name) {\n const heartbeatController = app.container\n .getProvider('heartbeat')\n .getImmediate({ optional: true });\n if (heartbeatController) {\n void heartbeatController.triggerHeartbeat();\n }\n return app.container.getProvider(name);\n}\n/**\n *\n * @param app - FirebaseApp instance\n * @param name - service name\n * @param instanceIdentifier - service instance identifier in case the service supports multiple instances\n *\n * @internal\n */\nfunction _removeServiceInstance(app, name, instanceIdentifier = DEFAULT_ENTRY_NAME) {\n _getProvider(app, name).clearInstance(instanceIdentifier);\n}\n/**\n *\n * @param obj - an object of type FirebaseApp, FirebaseOptions or FirebaseAppSettings.\n *\n * @returns true if the provide object is of type FirebaseApp.\n *\n * @internal\n */\nfunction _isFirebaseApp(obj) {\n return obj.options !== undefined;\n}\n/**\n *\n * @param obj - an object of type FirebaseApp, FirebaseOptions or FirebaseAppSettings.\n *\n * @returns true if the provided object is of type FirebaseServerAppImpl.\n *\n * @internal\n */\nfunction _isFirebaseServerAppSettings(obj) {\n if (_isFirebaseApp(obj)) {\n return false;\n }\n return ('authIdToken' in obj ||\n 'appCheckToken' in obj ||\n 'releaseOnDeref' in obj ||\n 'automaticDataCollectionEnabled' in obj);\n}\n/**\n *\n * @param obj - an object of type FirebaseApp.\n *\n * @returns true if the provided object is of type FirebaseServerAppImpl.\n *\n * @internal\n */\nfunction _isFirebaseServerApp(obj) {\n if (obj === null || obj === undefined) {\n return false;\n }\n return obj.settings !== undefined;\n}\n/**\n * Test only\n *\n * @internal\n */\nfunction _clearComponents() {\n _components.clear();\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst ERRORS = {\n [\"no-app\" /* AppError.NO_APP */]: \"No Firebase App '{$appName}' has been created - \" +\n 'call initializeApp() first',\n [\"bad-app-name\" /* AppError.BAD_APP_NAME */]: \"Illegal App name: '{$appName}'\",\n [\"duplicate-app\" /* AppError.DUPLICATE_APP */]: \"Firebase App named '{$appName}' already exists with different options or config\",\n [\"app-deleted\" /* AppError.APP_DELETED */]: \"Firebase App named '{$appName}' already deleted\",\n [\"server-app-deleted\" /* AppError.SERVER_APP_DELETED */]: 'Firebase Server App has been deleted',\n [\"no-options\" /* AppError.NO_OPTIONS */]: 'Need to provide options, when not being deployed to hosting via source.',\n [\"invalid-app-argument\" /* AppError.INVALID_APP_ARGUMENT */]: 'firebase.{$appName}() takes either no argument or a ' +\n 'Firebase App instance.',\n [\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */]: 'First argument to `onLog` must be null or a function.',\n [\"idb-open\" /* AppError.IDB_OPEN */]: 'Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.',\n [\"idb-get\" /* AppError.IDB_GET */]: 'Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.',\n [\"idb-set\" /* AppError.IDB_WRITE */]: 'Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.',\n [\"idb-delete\" /* AppError.IDB_DELETE */]: 'Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.',\n [\"finalization-registry-not-supported\" /* AppError.FINALIZATION_REGISTRY_NOT_SUPPORTED */]: 'FirebaseServerApp deleteOnDeref field defined but the JS runtime does not support FinalizationRegistry.',\n [\"invalid-server-app-environment\" /* AppError.INVALID_SERVER_APP_ENVIRONMENT */]: 'FirebaseServerApp is not for use in browser environments.'\n};\nconst ERROR_FACTORY = new ErrorFactory('app', 'Firebase', ERRORS);\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nclass FirebaseAppImpl {\n constructor(options, config, container) {\n this._isDeleted = false;\n this._options = { ...options };\n this._config = { ...config };\n this._name = config.name;\n this._automaticDataCollectionEnabled =\n config.automaticDataCollectionEnabled;\n this._container = container;\n this.container.addComponent(new Component('app', () => this, \"PUBLIC\" /* ComponentType.PUBLIC */));\n }\n get automaticDataCollectionEnabled() {\n this.checkDestroyed();\n return this._automaticDataCollectionEnabled;\n }\n set automaticDataCollectionEnabled(val) {\n this.checkDestroyed();\n this._automaticDataCollectionEnabled = val;\n }\n get name() {\n this.checkDestroyed();\n return this._name;\n }\n get options() {\n this.checkDestroyed();\n return this._options;\n }\n get config() {\n this.checkDestroyed();\n return this._config;\n }\n get container() {\n return this._container;\n }\n get isDeleted() {\n return this._isDeleted;\n }\n set isDeleted(val) {\n this._isDeleted = val;\n }\n /**\n * This function will throw an Error if the App has already been deleted -\n * use before performing API actions on the App.\n */\n checkDestroyed() {\n if (this.isDeleted) {\n throw ERROR_FACTORY.create(\"app-deleted\" /* AppError.APP_DELETED */, { appName: this._name });\n }\n }\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// Parse the token and check to see if the `exp` claim is in the future.\n// Reports an error to the console if the token or claim could not be parsed, or if `exp` is in\n// the past.\nfunction validateTokenTTL(base64Token, tokenName) {\n const secondPart = base64Decode(base64Token.split('.')[1]);\n if (secondPart === null) {\n console.error(`FirebaseServerApp ${tokenName} is invalid: second part could not be parsed.`);\n return;\n }\n const expClaim = JSON.parse(secondPart).exp;\n if (expClaim === undefined) {\n console.error(`FirebaseServerApp ${tokenName} is invalid: expiration claim could not be parsed`);\n return;\n }\n const exp = JSON.parse(secondPart).exp * 1000;\n const now = new Date().getTime();\n const diff = exp - now;\n if (diff <= 0) {\n console.error(`FirebaseServerApp ${tokenName} is invalid: the token has expired.`);\n }\n}\nclass FirebaseServerAppImpl extends FirebaseAppImpl {\n constructor(options, serverConfig, name, container) {\n // Build configuration parameters for the FirebaseAppImpl base class.\n const automaticDataCollectionEnabled = serverConfig.automaticDataCollectionEnabled !== undefined\n ? serverConfig.automaticDataCollectionEnabled\n : true;\n // Create the FirebaseAppSettings object for the FirebaseAppImp constructor.\n const config = {\n name,\n automaticDataCollectionEnabled\n };\n if (options.apiKey !== undefined) {\n // Construct the parent FirebaseAppImp object.\n super(options, config, container);\n }\n else {\n const appImpl = options;\n super(appImpl.options, config, container);\n }\n // Now construct the data for the FirebaseServerAppImpl.\n this._serverConfig = {\n automaticDataCollectionEnabled,\n ...serverConfig\n };\n // Ensure that the current time is within the `authIdtoken` window of validity.\n if (this._serverConfig.authIdToken) {\n validateTokenTTL(this._serverConfig.authIdToken, 'authIdToken');\n }\n // Ensure that the current time is within the `appCheckToken` window of validity.\n if (this._serverConfig.appCheckToken) {\n validateTokenTTL(this._serverConfig.appCheckToken, 'appCheckToken');\n }\n this._finalizationRegistry = null;\n if (typeof FinalizationRegistry !== 'undefined') {\n this._finalizationRegistry = new FinalizationRegistry(() => {\n this.automaticCleanup();\n });\n }\n this._refCount = 0;\n this.incRefCount(this._serverConfig.releaseOnDeref);\n // Do not retain a hard reference to the dref object, otherwise the FinalizationRegistry\n // will never trigger.\n this._serverConfig.releaseOnDeref = undefined;\n serverConfig.releaseOnDeref = undefined;\n registerVersion(name$q, version$1, 'serverapp');\n }\n toJSON() {\n return undefined;\n }\n get refCount() {\n return this._refCount;\n }\n // Increment the reference count of this server app. If an object is provided, register it\n // with the finalization registry.\n incRefCount(obj) {\n if (this.isDeleted) {\n return;\n }\n this._refCount++;\n if (obj !== undefined && this._finalizationRegistry !== null) {\n this._finalizationRegistry.register(obj, this);\n }\n }\n // Decrement the reference count.\n decRefCount() {\n if (this.isDeleted) {\n return 0;\n }\n return --this._refCount;\n }\n // Invoked by the FinalizationRegistry callback to note that this app should go through its\n // reference counts and delete itself if no reference count remain. The coordinating logic that\n // handles this is in deleteApp(...).\n automaticCleanup() {\n void deleteApp(this);\n }\n get settings() {\n this.checkDestroyed();\n return this._serverConfig;\n }\n /**\n * This function will throw an Error if the App has already been deleted -\n * use before performing API actions on the App.\n */\n checkDestroyed() {\n if (this.isDeleted) {\n throw ERROR_FACTORY.create(\"server-app-deleted\" /* AppError.SERVER_APP_DELETED */);\n }\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The current SDK version.\n *\n * @public\n */\nconst SDK_VERSION = version;\nfunction initializeApp(_options, rawConfig = {}) {\n let options = _options;\n if (typeof rawConfig !== 'object') {\n const name = rawConfig;\n rawConfig = { name };\n }\n const config = {\n name: DEFAULT_ENTRY_NAME,\n automaticDataCollectionEnabled: true,\n ...rawConfig\n };\n const name = config.name;\n if (typeof name !== 'string' || !name) {\n throw ERROR_FACTORY.create(\"bad-app-name\" /* AppError.BAD_APP_NAME */, {\n appName: String(name)\n });\n }\n options || (options = getDefaultAppConfig());\n if (!options) {\n throw ERROR_FACTORY.create(\"no-options\" /* AppError.NO_OPTIONS */);\n }\n const existingApp = _apps.get(name);\n if (existingApp) {\n // return the existing app if options and config deep equal the ones in the existing app.\n if (deepEqual(options, existingApp.options) &&\n deepEqual(config, existingApp.config)) {\n return existingApp;\n }\n else {\n throw ERROR_FACTORY.create(\"duplicate-app\" /* AppError.DUPLICATE_APP */, { appName: name });\n }\n }\n const container = new ComponentContainer(name);\n for (const component of _components.values()) {\n container.addComponent(component);\n }\n const newApp = new FirebaseAppImpl(options, config, container);\n _apps.set(name, newApp);\n return newApp;\n}\nfunction initializeServerApp(_options, _serverAppConfig = {}) {\n if (isBrowser() && !isWebWorker()) {\n // FirebaseServerApp isn't designed to be run in browsers.\n throw ERROR_FACTORY.create(\"invalid-server-app-environment\" /* AppError.INVALID_SERVER_APP_ENVIRONMENT */);\n }\n let firebaseOptions;\n let serverAppSettings = _serverAppConfig || {};\n if (_options) {\n if (_isFirebaseApp(_options)) {\n firebaseOptions = _options.options;\n }\n else if (_isFirebaseServerAppSettings(_options)) {\n serverAppSettings = _options;\n }\n else {\n firebaseOptions = _options;\n }\n }\n if (serverAppSettings.automaticDataCollectionEnabled === undefined) {\n serverAppSettings.automaticDataCollectionEnabled = true;\n }\n firebaseOptions || (firebaseOptions = getDefaultAppConfig());\n if (!firebaseOptions) {\n throw ERROR_FACTORY.create(\"no-options\" /* AppError.NO_OPTIONS */);\n }\n // Build an app name based on a hash of the configuration options.\n const nameObj = {\n ...serverAppSettings,\n ...firebaseOptions\n };\n // However, Do not mangle the name based on releaseOnDeref, since it will vary between the\n // construction of FirebaseServerApp instances. For example, if the object is the request headers.\n if (nameObj.releaseOnDeref !== undefined) {\n delete nameObj.releaseOnDeref;\n }\n const hashCode = (s) => {\n return [...s].reduce((hash, c) => (Math.imul(31, hash) + c.charCodeAt(0)) | 0, 0);\n };\n if (serverAppSettings.releaseOnDeref !== undefined) {\n if (typeof FinalizationRegistry === 'undefined') {\n throw ERROR_FACTORY.create(\"finalization-registry-not-supported\" /* AppError.FINALIZATION_REGISTRY_NOT_SUPPORTED */, {});\n }\n }\n const nameString = '' + hashCode(JSON.stringify(nameObj));\n const existingApp = _serverApps.get(nameString);\n if (existingApp) {\n existingApp.incRefCount(serverAppSettings.releaseOnDeref);\n return existingApp;\n }\n const container = new ComponentContainer(nameString);\n for (const component of _components.values()) {\n container.addComponent(component);\n }\n const newApp = new FirebaseServerAppImpl(firebaseOptions, serverAppSettings, nameString, container);\n _serverApps.set(nameString, newApp);\n return newApp;\n}\n/**\n * Retrieves a {@link @firebase/app#FirebaseApp} instance.\n *\n * When called with no arguments, the default app is returned. When an app name\n * is provided, the app corresponding to that name is returned.\n *\n * An exception is thrown if the app being retrieved has not yet been\n * initialized.\n *\n * @example\n * ```javascript\n * // Return the default app\n * const app = getApp();\n * ```\n *\n * @example\n * ```javascript\n * // Return a named app\n * const otherApp = getApp(\"otherApp\");\n * ```\n *\n * @param name - Optional name of the app to return. If no name is\n * provided, the default is `\"[DEFAULT]\"`.\n *\n * @returns The app corresponding to the provided app name.\n * If no app name is provided, the default app is returned.\n *\n * @public\n */\nfunction getApp(name = DEFAULT_ENTRY_NAME) {\n const app = _apps.get(name);\n if (!app && name === DEFAULT_ENTRY_NAME && getDefaultAppConfig()) {\n return initializeApp();\n }\n if (!app) {\n throw ERROR_FACTORY.create(\"no-app\" /* AppError.NO_APP */, { appName: name });\n }\n return app;\n}\n/**\n * A (read-only) array of all initialized apps.\n * @public\n */\nfunction getApps() {\n return Array.from(_apps.values());\n}\n/**\n * Renders this app unusable and frees the resources of all associated\n * services.\n *\n * @example\n * ```javascript\n * deleteApp(app)\n * .then(function() {\n * console.log(\"App deleted successfully\");\n * })\n * .catch(function(error) {\n * console.log(\"Error deleting app:\", error);\n * });\n * ```\n *\n * @public\n */\nasync function deleteApp(app) {\n let cleanupProviders = false;\n const name = app.name;\n if (_apps.has(name)) {\n cleanupProviders = true;\n _apps.delete(name);\n }\n else if (_serverApps.has(name)) {\n const firebaseServerApp = app;\n if (firebaseServerApp.decRefCount() <= 0) {\n _serverApps.delete(name);\n cleanupProviders = true;\n }\n }\n if (cleanupProviders) {\n await Promise.all(app.container\n .getProviders()\n .map(provider => provider.delete()));\n app.isDeleted = true;\n }\n}\n/**\n * Registers a library's name and version for platform logging purposes.\n * @param library - Name of 1p or 3p library (e.g. firestore, angularfire)\n * @param version - Current version of that library.\n * @param variant - Bundle variant, e.g., node, rn, etc.\n *\n * @public\n */\nfunction registerVersion(libraryKeyOrName, version, variant) {\n // TODO: We can use this check to whitelist strings when/if we set up\n // a good whitelist system.\n let library = PLATFORM_LOG_STRING[libraryKeyOrName] ?? libraryKeyOrName;\n if (variant) {\n library += `-${variant}`;\n }\n const libraryMismatch = library.match(/\\s|\\//);\n const versionMismatch = version.match(/\\s|\\//);\n if (libraryMismatch || versionMismatch) {\n const warning = [\n `Unable to register library \"${library}\" with version \"${version}\":`\n ];\n if (libraryMismatch) {\n warning.push(`library name \"${library}\" contains illegal characters (whitespace or \"/\")`);\n }\n if (libraryMismatch && versionMismatch) {\n warning.push('and');\n }\n if (versionMismatch) {\n warning.push(`version name \"${version}\" contains illegal characters (whitespace or \"/\")`);\n }\n logger.warn(warning.join(' '));\n return;\n }\n _registerComponent(new Component(`${library}-version`, () => ({ library, version }), \"VERSION\" /* ComponentType.VERSION */));\n}\n/**\n * Sets log handler for all Firebase SDKs.\n * @param logCallback - An optional custom log handler that executes user code whenever\n * the Firebase SDK makes a logging call.\n *\n * @public\n */\nfunction onLog(logCallback, options) {\n if (logCallback !== null && typeof logCallback !== 'function') {\n throw ERROR_FACTORY.create(\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */);\n }\n setUserLogHandler(logCallback, options);\n}\n/**\n * Sets log level for all Firebase SDKs.\n *\n * All of the log types above the current log level are captured (i.e. if\n * you set the log level to `info`, errors are logged, but `debug` and\n * `verbose` logs are not).\n *\n * @public\n */\nfunction setLogLevel(logLevel) {\n setLogLevel$1(logLevel);\n}\n\n/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst DB_NAME = 'firebase-heartbeat-database';\nconst DB_VERSION = 1;\nconst STORE_NAME = 'firebase-heartbeat-store';\nlet dbPromise = null;\nfunction getDbPromise() {\n if (!dbPromise) {\n dbPromise = openDB(DB_NAME, DB_VERSION, {\n upgrade: (db, oldVersion) => {\n // We don't use 'break' in this switch statement, the fall-through\n // behavior is what we want, because if there are multiple versions between\n // the old version and the current version, we want ALL the migrations\n // that correspond to those versions to run, not only the last one.\n // eslint-disable-next-line default-case\n switch (oldVersion) {\n case 0:\n try {\n db.createObjectStore(STORE_NAME);\n }\n catch (e) {\n // Safari/iOS browsers throw occasional exceptions on\n // db.createObjectStore() that may be a bug. Avoid blocking\n // the rest of the app functionality.\n console.warn(e);\n }\n }\n }\n }).catch(e => {\n throw ERROR_FACTORY.create(\"idb-open\" /* AppError.IDB_OPEN */, {\n originalErrorMessage: e.message\n });\n });\n }\n return dbPromise;\n}\nasync function readHeartbeatsFromIndexedDB(app) {\n try {\n const db = await getDbPromise();\n const tx = db.transaction(STORE_NAME);\n const result = await tx.objectStore(STORE_NAME).get(computeKey(app));\n // We already have the value but tx.done can throw,\n // so we need to await it here to catch errors\n await tx.done;\n return result;\n }\n catch (e) {\n if (e instanceof FirebaseError) {\n logger.warn(e.message);\n }\n else {\n const idbGetError = ERROR_FACTORY.create(\"idb-get\" /* AppError.IDB_GET */, {\n originalErrorMessage: e?.message\n });\n logger.warn(idbGetError.message);\n }\n }\n}\nasync function writeHeartbeatsToIndexedDB(app, heartbeatObject) {\n try {\n const db = await getDbPromise();\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const objectStore = tx.objectStore(STORE_NAME);\n await objectStore.put(heartbeatObject, computeKey(app));\n await tx.done;\n }\n catch (e) {\n if (e instanceof FirebaseError) {\n logger.warn(e.message);\n }\n else {\n const idbGetError = ERROR_FACTORY.create(\"idb-set\" /* AppError.IDB_WRITE */, {\n originalErrorMessage: e?.message\n });\n logger.warn(idbGetError.message);\n }\n }\n}\nfunction computeKey(app) {\n return `${app.name}!${app.options.appId}`;\n}\n\n/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst MAX_HEADER_BYTES = 1024;\nconst MAX_NUM_STORED_HEARTBEATS = 30;\nclass HeartbeatServiceImpl {\n constructor(container) {\n this.container = container;\n /**\n * In-memory cache for heartbeats, used by getHeartbeatsHeader() to generate\n * the header string.\n * Stores one record per date. This will be consolidated into the standard\n * format of one record per user agent string before being sent as a header.\n * Populated from indexedDB when the controller is instantiated and should\n * be kept in sync with indexedDB.\n * Leave public for easier testing.\n */\n this._heartbeatsCache = null;\n const app = this.container.getProvider('app').getImmediate();\n this._storage = new HeartbeatStorageImpl(app);\n this._heartbeatsCachePromise = this._storage.read().then(result => {\n this._heartbeatsCache = result;\n return result;\n });\n }\n /**\n * Called to report a heartbeat. The function will generate\n * a HeartbeatsByUserAgent object, update heartbeatsCache, and persist it\n * to IndexedDB.\n * Note that we only store one heartbeat per day. So if a heartbeat for today is\n * already logged, subsequent calls to this function in the same day will be ignored.\n */\n async triggerHeartbeat() {\n try {\n const platformLogger = this.container\n .getProvider('platform-logger')\n .getImmediate();\n // This is the \"Firebase user agent\" string from the platform logger\n // service, not the browser user agent.\n const agent = platformLogger.getPlatformInfoString();\n const date = getUTCDateString();\n if (this._heartbeatsCache?.heartbeats == null) {\n this._heartbeatsCache = await this._heartbeatsCachePromise;\n // If we failed to construct a heartbeats cache, then return immediately.\n if (this._heartbeatsCache?.heartbeats == null) {\n return;\n }\n }\n // Do not store a heartbeat if one is already stored for this day\n // or if a header has already been sent today.\n if (this._heartbeatsCache.lastSentHeartbeatDate === date ||\n this._heartbeatsCache.heartbeats.some(singleDateHeartbeat => singleDateHeartbeat.date === date)) {\n return;\n }\n else {\n // There is no entry for this date. Create one.\n this._heartbeatsCache.heartbeats.push({ date, agent });\n // If the number of stored heartbeats exceeds the maximum number of stored heartbeats, remove the heartbeat with the earliest date.\n // Since this is executed each time a heartbeat is pushed, the limit can only be exceeded by one, so only one needs to be removed.\n if (this._heartbeatsCache.heartbeats.length > MAX_NUM_STORED_HEARTBEATS) {\n const earliestHeartbeatIdx = getEarliestHeartbeatIdx(this._heartbeatsCache.heartbeats);\n this._heartbeatsCache.heartbeats.splice(earliestHeartbeatIdx, 1);\n }\n }\n return this._storage.overwrite(this._heartbeatsCache);\n }\n catch (e) {\n logger.warn(e);\n }\n }\n /**\n * Returns a base64 encoded string which can be attached to the heartbeat-specific header directly.\n * It also clears all heartbeats from memory as well as in IndexedDB.\n *\n * NOTE: Consuming product SDKs should not send the header if this method\n * returns an empty string.\n */\n async getHeartbeatsHeader() {\n try {\n if (this._heartbeatsCache === null) {\n await this._heartbeatsCachePromise;\n }\n // If it's still null or the array is empty, there is no data to send.\n if (this._heartbeatsCache?.heartbeats == null ||\n this._heartbeatsCache.heartbeats.length === 0) {\n return '';\n }\n const date = getUTCDateString();\n // Extract as many heartbeats from the cache as will fit under the size limit.\n const { heartbeatsToSend, unsentEntries } = extractHeartbeatsForHeader(this._heartbeatsCache.heartbeats);\n const headerString = base64urlEncodeWithoutPadding(JSON.stringify({ version: 2, heartbeats: heartbeatsToSend }));\n // Store last sent date to prevent another being logged/sent for the same day.\n this._heartbeatsCache.lastSentHeartbeatDate = date;\n if (unsentEntries.length > 0) {\n // Store any unsent entries if they exist.\n this._heartbeatsCache.heartbeats = unsentEntries;\n // This seems more likely than emptying the array (below) to lead to some odd state\n // since the cache isn't empty and this will be called again on the next request,\n // and is probably safest if we await it.\n await this._storage.overwrite(this._heartbeatsCache);\n }\n else {\n this._heartbeatsCache.heartbeats = [];\n // Do not wait for this, to reduce latency.\n void this._storage.overwrite(this._heartbeatsCache);\n }\n return headerString;\n }\n catch (e) {\n logger.warn(e);\n return '';\n }\n }\n}\nfunction getUTCDateString() {\n const today = new Date();\n // Returns date format 'YYYY-MM-DD'\n return today.toISOString().substring(0, 10);\n}\nfunction extractHeartbeatsForHeader(heartbeatsCache, maxSize = MAX_HEADER_BYTES) {\n // Heartbeats grouped by user agent in the standard format to be sent in\n // the header.\n const heartbeatsToSend = [];\n // Single date format heartbeats that are not sent.\n let unsentEntries = heartbeatsCache.slice();\n for (const singleDateHeartbeat of heartbeatsCache) {\n // Look for an existing entry with the same user agent.\n const heartbeatEntry = heartbeatsToSend.find(hb => hb.agent === singleDateHeartbeat.agent);\n if (!heartbeatEntry) {\n // If no entry for this user agent exists, create one.\n heartbeatsToSend.push({\n agent: singleDateHeartbeat.agent,\n dates: [singleDateHeartbeat.date]\n });\n if (countBytes(heartbeatsToSend) > maxSize) {\n // If the header would exceed max size, remove the added heartbeat\n // entry and stop adding to the header.\n heartbeatsToSend.pop();\n break;\n }\n }\n else {\n heartbeatEntry.dates.push(singleDateHeartbeat.date);\n // If the header would exceed max size, remove the added date\n // and stop adding to the header.\n if (countBytes(heartbeatsToSend) > maxSize) {\n heartbeatEntry.dates.pop();\n break;\n }\n }\n // Pop unsent entry from queue. (Skipped if adding the entry exceeded\n // quota and the loop breaks early.)\n unsentEntries = unsentEntries.slice(1);\n }\n return {\n heartbeatsToSend,\n unsentEntries\n };\n}\nclass HeartbeatStorageImpl {\n constructor(app) {\n this.app = app;\n this._canUseIndexedDBPromise = this.runIndexedDBEnvironmentCheck();\n }\n async runIndexedDBEnvironmentCheck() {\n if (!isIndexedDBAvailable()) {\n return false;\n }\n else {\n return validateIndexedDBOpenable()\n .then(() => true)\n .catch(() => false);\n }\n }\n /**\n * Read all heartbeats.\n */\n async read() {\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\n if (!canUseIndexedDB) {\n return { heartbeats: [] };\n }\n else {\n const idbHeartbeatObject = await readHeartbeatsFromIndexedDB(this.app);\n if (idbHeartbeatObject?.heartbeats) {\n return idbHeartbeatObject;\n }\n else {\n return { heartbeats: [] };\n }\n }\n }\n // overwrite the storage with the provided heartbeats\n async overwrite(heartbeatsObject) {\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\n if (!canUseIndexedDB) {\n return;\n }\n else {\n const existingHeartbeatsObject = await this.read();\n return writeHeartbeatsToIndexedDB(this.app, {\n lastSentHeartbeatDate: heartbeatsObject.lastSentHeartbeatDate ??\n existingHeartbeatsObject.lastSentHeartbeatDate,\n heartbeats: heartbeatsObject.heartbeats\n });\n }\n }\n // add heartbeats\n async add(heartbeatsObject) {\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\n if (!canUseIndexedDB) {\n return;\n }\n else {\n const existingHeartbeatsObject = await this.read();\n return writeHeartbeatsToIndexedDB(this.app, {\n lastSentHeartbeatDate: heartbeatsObject.lastSentHeartbeatDate ??\n existingHeartbeatsObject.lastSentHeartbeatDate,\n heartbeats: [\n ...existingHeartbeatsObject.heartbeats,\n ...heartbeatsObject.heartbeats\n ]\n });\n }\n }\n}\n/**\n * Calculate bytes of a HeartbeatsByUserAgent array after being wrapped\n * in a platform logging header JSON object, stringified, and converted\n * to base 64.\n */\nfunction countBytes(heartbeatsCache) {\n // base64 has a restricted set of characters, all of which should be 1 byte.\n return base64urlEncodeWithoutPadding(\n // heartbeatsCache wrapper properties\n JSON.stringify({ version: 2, heartbeats: heartbeatsCache })).length;\n}\n/**\n * Returns the index of the heartbeat with the earliest date.\n * If the heartbeats array is empty, -1 is returned.\n */\nfunction getEarliestHeartbeatIdx(heartbeats) {\n if (heartbeats.length === 0) {\n return -1;\n }\n let earliestHeartbeatIdx = 0;\n let earliestHeartbeatDate = heartbeats[0].date;\n for (let i = 1; i < heartbeats.length; i++) {\n if (heartbeats[i].date < earliestHeartbeatDate) {\n earliestHeartbeatDate = heartbeats[i].date;\n earliestHeartbeatIdx = i;\n }\n }\n return earliestHeartbeatIdx;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction registerCoreComponents(variant) {\n _registerComponent(new Component('platform-logger', container => new PlatformLoggerServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\n _registerComponent(new Component('heartbeat', container => new HeartbeatServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\n // Register `app` package.\n registerVersion(name$q, version$1, variant);\n // BUILD_TARGET will be replaced by values like esm, cjs, etc during the compilation\n registerVersion(name$q, version$1, 'esm2020');\n // Register platform SDK identifier (no version).\n registerVersion('fire-js', '');\n}\n\n/**\n * Firebase App\n *\n * @remarks This package coordinates the communication between the different Firebase components\n * @packageDocumentation\n */\nregisterCoreComponents('');\n\nexport { SDK_VERSION, DEFAULT_ENTRY_NAME as _DEFAULT_ENTRY_NAME, _addComponent, _addOrOverwriteComponent, _apps, _clearComponents, _components, _getProvider, _isFirebaseApp, _isFirebaseServerApp, _isFirebaseServerAppSettings, _registerComponent, _removeServiceInstance, _serverApps, deleteApp, getApp, getApps, initializeApp, initializeServerApp, onLog, registerVersion, setLogLevel };\n//# sourceMappingURL=index.esm.js.map\n","import { Deferred } from '@firebase/util';\n\n/**\n * Component for service name T, e.g. `auth`, `auth-internal`\n */\nclass Component {\n /**\n *\n * @param name The public service name, e.g. app, auth, firestore, database\n * @param instanceFactory Service factory responsible for creating the public interface\n * @param type whether the service provided by the component is public or private\n */\n constructor(name, instanceFactory, type) {\n this.name = name;\n this.instanceFactory = instanceFactory;\n this.type = type;\n this.multipleInstances = false;\n /**\n * Properties to be added to the service namespace\n */\n this.serviceProps = {};\n this.instantiationMode = \"LAZY\" /* InstantiationMode.LAZY */;\n this.onInstanceCreated = null;\n }\n setInstantiationMode(mode) {\n this.instantiationMode = mode;\n return this;\n }\n setMultipleInstances(multipleInstances) {\n this.multipleInstances = multipleInstances;\n return this;\n }\n setServiceProps(props) {\n this.serviceProps = props;\n return this;\n }\n setInstanceCreatedCallback(callback) {\n this.onInstanceCreated = callback;\n return this;\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Provider for instance for service name T, e.g. 'auth', 'auth-internal'\n * NameServiceMapping[T] is an alias for the type of the instance\n */\nclass Provider {\n constructor(name, container) {\n this.name = name;\n this.container = container;\n this.component = null;\n this.instances = new Map();\n this.instancesDeferred = new Map();\n this.instancesOptions = new Map();\n this.onInitCallbacks = new Map();\n }\n /**\n * @param identifier A provider can provide multiple instances of a service\n * if this.component.multipleInstances is true.\n */\n get(identifier) {\n // if multipleInstances is not supported, use the default name\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\n if (!this.instancesDeferred.has(normalizedIdentifier)) {\n const deferred = new Deferred();\n this.instancesDeferred.set(normalizedIdentifier, deferred);\n if (this.isInitialized(normalizedIdentifier) ||\n this.shouldAutoInitialize()) {\n // initialize the service if it can be auto-initialized\n try {\n const instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n });\n if (instance) {\n deferred.resolve(instance);\n }\n }\n catch (e) {\n // when the instance factory throws an exception during get(), it should not cause\n // a fatal error. We just return the unresolved promise in this case.\n }\n }\n }\n return this.instancesDeferred.get(normalizedIdentifier).promise;\n }\n getImmediate(options) {\n // if multipleInstances is not supported, use the default name\n const normalizedIdentifier = this.normalizeInstanceIdentifier(options?.identifier);\n const optional = options?.optional ?? false;\n if (this.isInitialized(normalizedIdentifier) ||\n this.shouldAutoInitialize()) {\n try {\n return this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n });\n }\n catch (e) {\n if (optional) {\n return null;\n }\n else {\n throw e;\n }\n }\n }\n else {\n // In case a component is not initialized and should/cannot be auto-initialized at the moment, return null if the optional flag is set, or throw\n if (optional) {\n return null;\n }\n else {\n throw Error(`Service ${this.name} is not available`);\n }\n }\n }\n getComponent() {\n return this.component;\n }\n setComponent(component) {\n if (component.name !== this.name) {\n throw Error(`Mismatching Component ${component.name} for Provider ${this.name}.`);\n }\n if (this.component) {\n throw Error(`Component for ${this.name} has already been provided`);\n }\n this.component = component;\n // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)\n if (!this.shouldAutoInitialize()) {\n return;\n }\n // if the service is eager, initialize the default instance\n if (isComponentEager(component)) {\n try {\n this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });\n }\n catch (e) {\n // when the instance factory for an eager Component throws an exception during the eager\n // initialization, it should not cause a fatal error.\n // TODO: Investigate if we need to make it configurable, because some component may want to cause\n // a fatal error in this case?\n }\n }\n // Create service instances for the pending promises and resolve them\n // NOTE: if this.multipleInstances is false, only the default instance will be created\n // and all promises with resolve with it regardless of the identifier.\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\n const normalizedIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\n try {\n // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.\n const instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n });\n instanceDeferred.resolve(instance);\n }\n catch (e) {\n // when the instance factory throws an exception, it should not cause\n // a fatal error. We just leave the promise unresolved.\n }\n }\n }\n clearInstance(identifier = DEFAULT_ENTRY_NAME) {\n this.instancesDeferred.delete(identifier);\n this.instancesOptions.delete(identifier);\n this.instances.delete(identifier);\n }\n // app.delete() will call this method on every provider to delete the services\n // TODO: should we mark the provider as deleted?\n async delete() {\n const services = Array.from(this.instances.values());\n await Promise.all([\n ...services\n .filter(service => 'INTERNAL' in service) // legacy services\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map(service => service.INTERNAL.delete()),\n ...services\n .filter(service => '_delete' in service) // modularized services\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map(service => service._delete())\n ]);\n }\n isComponentSet() {\n return this.component != null;\n }\n isInitialized(identifier = DEFAULT_ENTRY_NAME) {\n return this.instances.has(identifier);\n }\n getOptions(identifier = DEFAULT_ENTRY_NAME) {\n return this.instancesOptions.get(identifier) || {};\n }\n initialize(opts = {}) {\n const { options = {} } = opts;\n const normalizedIdentifier = this.normalizeInstanceIdentifier(opts.instanceIdentifier);\n if (this.isInitialized(normalizedIdentifier)) {\n throw Error(`${this.name}(${normalizedIdentifier}) has already been initialized`);\n }\n if (!this.isComponentSet()) {\n throw Error(`Component ${this.name} has not been registered yet`);\n }\n const instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier,\n options\n });\n // resolve any pending promise waiting for the service instance\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\n const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\n if (normalizedIdentifier === normalizedDeferredIdentifier) {\n instanceDeferred.resolve(instance);\n }\n }\n return instance;\n }\n /**\n *\n * @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().\n * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.\n *\n * @param identifier An optional instance identifier\n * @returns a function to unregister the callback\n */\n onInit(callback, identifier) {\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\n const existingCallbacks = this.onInitCallbacks.get(normalizedIdentifier) ??\n new Set();\n existingCallbacks.add(callback);\n this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);\n const existingInstance = this.instances.get(normalizedIdentifier);\n if (existingInstance) {\n callback(existingInstance, normalizedIdentifier);\n }\n return () => {\n existingCallbacks.delete(callback);\n };\n }\n /**\n * Invoke onInit callbacks synchronously\n * @param instance the service instance`\n */\n invokeOnInitCallbacks(instance, identifier) {\n const callbacks = this.onInitCallbacks.get(identifier);\n if (!callbacks) {\n return;\n }\n for (const callback of callbacks) {\n try {\n callback(instance, identifier);\n }\n catch {\n // ignore errors in the onInit callback\n }\n }\n }\n getOrInitializeService({ instanceIdentifier, options = {} }) {\n let instance = this.instances.get(instanceIdentifier);\n if (!instance && this.component) {\n instance = this.component.instanceFactory(this.container, {\n instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),\n options\n });\n this.instances.set(instanceIdentifier, instance);\n this.instancesOptions.set(instanceIdentifier, options);\n /**\n * Invoke onInit listeners.\n * Note this.component.onInstanceCreated is different, which is used by the component creator,\n * while onInit listeners are registered by consumers of the provider.\n */\n this.invokeOnInitCallbacks(instance, instanceIdentifier);\n /**\n * Order is important\n * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which\n * makes `isInitialized()` return true.\n */\n if (this.component.onInstanceCreated) {\n try {\n this.component.onInstanceCreated(this.container, instanceIdentifier, instance);\n }\n catch {\n // ignore errors in the onInstanceCreatedCallback\n }\n }\n }\n return instance || null;\n }\n normalizeInstanceIdentifier(identifier = DEFAULT_ENTRY_NAME) {\n if (this.component) {\n return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;\n }\n else {\n return identifier; // assume multiple instances are supported before the component is provided.\n }\n }\n shouldAutoInitialize() {\n return (!!this.component &&\n this.component.instantiationMode !== \"EXPLICIT\" /* InstantiationMode.EXPLICIT */);\n }\n}\n// undefined should be passed to the service factory for the default instance\nfunction normalizeIdentifierForFactory(identifier) {\n return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;\n}\nfunction isComponentEager(component) {\n return component.instantiationMode === \"EAGER\" /* InstantiationMode.EAGER */;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`\n */\nclass ComponentContainer {\n constructor(name) {\n this.name = name;\n this.providers = new Map();\n }\n /**\n *\n * @param component Component being added\n * @param overwrite When a component with the same name has already been registered,\n * if overwrite is true: overwrite the existing component with the new component and create a new\n * provider with the new component. It can be useful in tests where you want to use different mocks\n * for different tests.\n * if overwrite is false: throw an exception\n */\n addComponent(component) {\n const provider = this.getProvider(component.name);\n if (provider.isComponentSet()) {\n throw new Error(`Component ${component.name} has already been registered with ${this.name}`);\n }\n provider.setComponent(component);\n }\n addOrOverwriteComponent(component) {\n const provider = this.getProvider(component.name);\n if (provider.isComponentSet()) {\n // delete the existing provider from the container, so we can register the new component\n this.providers.delete(component.name);\n }\n this.addComponent(component);\n }\n /**\n * getProvider provides a type safe interface where it can only be called with a field name\n * present in NameServiceMapping interface.\n *\n * Firebase SDKs providing services should extend NameServiceMapping interface to register\n * themselves.\n */\n getProvider(name) {\n if (this.providers.has(name)) {\n return this.providers.get(name);\n }\n // create a Provider for a service that hasn't registered with Firebase\n const provider = new Provider(name, this);\n this.providers.set(name, provider);\n return provider;\n }\n getProviders() {\n return Array.from(this.providers.values());\n }\n}\n\nexport { Component, ComponentContainer, Provider };\n//# sourceMappingURL=index.esm.js.map\n","import { _getProvider, getApp, _registerComponent, registerVersion } from '@firebase/app';\nimport { Component } from '@firebase/component';\nimport { ErrorFactory, FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\nconst name = \"@firebase/installations\";\nconst version = \"0.6.22\";\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst PENDING_TIMEOUT_MS = 10000;\nconst PACKAGE_VERSION = `w:${version}`;\nconst INTERNAL_AUTH_VERSION = 'FIS_v2';\nconst INSTALLATIONS_API_URL = 'https://firebaseinstallations.googleapis.com/v1';\nconst TOKEN_EXPIRATION_BUFFER = 60 * 60 * 1000; // One hour\nconst SERVICE = 'installations';\nconst SERVICE_NAME = 'Installations';\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst ERROR_DESCRIPTION_MAP = {\n [\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */]: 'Missing App configuration value: \"{$valueName}\"',\n [\"not-registered\" /* ErrorCode.NOT_REGISTERED */]: 'Firebase Installation is not registered.',\n [\"installation-not-found\" /* ErrorCode.INSTALLATION_NOT_FOUND */]: 'Firebase Installation not found.',\n [\"request-failed\" /* ErrorCode.REQUEST_FAILED */]: '{$requestName} request failed with error \"{$serverCode} {$serverStatus}: {$serverMessage}\"',\n [\"app-offline\" /* ErrorCode.APP_OFFLINE */]: 'Could not process request. Application offline.',\n [\"delete-pending-registration\" /* ErrorCode.DELETE_PENDING_REGISTRATION */]: \"Can't delete installation while there is a pending registration request.\"\n};\nconst ERROR_FACTORY = new ErrorFactory(SERVICE, SERVICE_NAME, ERROR_DESCRIPTION_MAP);\n/** Returns true if error is a FirebaseError that is based on an error from the server. */\nfunction isServerError(error) {\n return (error instanceof FirebaseError &&\n error.code.includes(\"request-failed\" /* ErrorCode.REQUEST_FAILED */));\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction getInstallationsEndpoint({ projectId }) {\n return `${INSTALLATIONS_API_URL}/projects/${projectId}/installations`;\n}\nfunction extractAuthTokenInfoFromResponse(response) {\n return {\n token: response.token,\n requestStatus: 2 /* RequestStatus.COMPLETED */,\n expiresIn: getExpiresInFromResponseExpiresIn(response.expiresIn),\n creationTime: Date.now()\n };\n}\nasync function getErrorFromResponse(requestName, response) {\n const responseJson = await response.json();\n const errorData = responseJson.error;\n return ERROR_FACTORY.create(\"request-failed\" /* ErrorCode.REQUEST_FAILED */, {\n requestName,\n serverCode: errorData.code,\n serverMessage: errorData.message,\n serverStatus: errorData.status\n });\n}\nfunction getHeaders({ apiKey }) {\n return new Headers({\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-goog-api-key': apiKey\n });\n}\nfunction getHeadersWithAuth(appConfig, { refreshToken }) {\n const headers = getHeaders(appConfig);\n headers.append('Authorization', getAuthorizationHeader(refreshToken));\n return headers;\n}\n/**\n * Calls the passed in fetch wrapper and returns the response.\n * If the returned response has a status of 5xx, re-runs the function once and\n * returns the response.\n */\nasync function retryIfServerError(fn) {\n const result = await fn();\n if (result.status >= 500 && result.status < 600) {\n // Internal Server Error. Retry request.\n return fn();\n }\n return result;\n}\nfunction getExpiresInFromResponseExpiresIn(responseExpiresIn) {\n // This works because the server will never respond with fractions of a second.\n return Number(responseExpiresIn.replace('s', '000'));\n}\nfunction getAuthorizationHeader(refreshToken) {\n return `${INTERNAL_AUTH_VERSION} ${refreshToken}`;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function createInstallationRequest({ appConfig, heartbeatServiceProvider }, { fid }) {\n const endpoint = getInstallationsEndpoint(appConfig);\n const headers = getHeaders(appConfig);\n // If heartbeat service exists, add the heartbeat string to the header.\n const heartbeatService = heartbeatServiceProvider.getImmediate({\n optional: true\n });\n if (heartbeatService) {\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\n if (heartbeatsHeader) {\n headers.append('x-firebase-client', heartbeatsHeader);\n }\n }\n const body = {\n fid,\n authVersion: INTERNAL_AUTH_VERSION,\n appId: appConfig.appId,\n sdkVersion: PACKAGE_VERSION\n };\n const request = {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n };\n const response = await retryIfServerError(() => fetch(endpoint, request));\n if (response.ok) {\n const responseValue = await response.json();\n const registeredInstallationEntry = {\n fid: responseValue.fid || fid,\n registrationStatus: 2 /* RequestStatus.COMPLETED */,\n refreshToken: responseValue.refreshToken,\n authToken: extractAuthTokenInfoFromResponse(responseValue.authToken)\n };\n return registeredInstallationEntry;\n }\n else {\n throw await getErrorFromResponse('Create Installation', response);\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Returns a promise that resolves after given time passes. */\nfunction sleep(ms) {\n return new Promise(resolve => {\n setTimeout(resolve, ms);\n });\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction bufferToBase64UrlSafe(array) {\n const b64 = btoa(String.fromCharCode(...array));\n return b64.replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst VALID_FID_PATTERN = /^[cdef][\\w-]{21}$/;\nconst INVALID_FID = '';\n/**\n * Generates a new FID using random values from Web Crypto API.\n * Returns an empty string if FID generation fails for any reason.\n */\nfunction generateFid() {\n try {\n // A valid FID has exactly 22 base64 characters, which is 132 bits, or 16.5\n // bytes. our implementation generates a 17 byte array instead.\n const fidByteArray = new Uint8Array(17);\n const crypto = self.crypto || self.msCrypto;\n crypto.getRandomValues(fidByteArray);\n // Replace the first 4 random bits with the constant FID header of 0b0111.\n fidByteArray[0] = 0b01110000 + (fidByteArray[0] % 0b00010000);\n const fid = encode(fidByteArray);\n return VALID_FID_PATTERN.test(fid) ? fid : INVALID_FID;\n }\n catch {\n // FID generation errored\n return INVALID_FID;\n }\n}\n/** Converts a FID Uint8Array to a base64 string representation. */\nfunction encode(fidByteArray) {\n const b64String = bufferToBase64UrlSafe(fidByteArray);\n // Remove the 23rd character that was added because of the extra 4 bits at the\n // end of our 17 byte array, and the '=' padding.\n return b64String.substr(0, 22);\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Returns a string key that can be used to identify the app. */\nfunction getKey(appConfig) {\n return `${appConfig.appName}!${appConfig.appId}`;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst fidChangeCallbacks = new Map();\n/**\n * Calls the onIdChange callbacks with the new FID value, and broadcasts the\n * change to other tabs.\n */\nfunction fidChanged(appConfig, fid) {\n const key = getKey(appConfig);\n callFidChangeCallbacks(key, fid);\n broadcastFidChange(key, fid);\n}\nfunction addCallback(appConfig, callback) {\n // Open the broadcast channel if it's not already open,\n // to be able to listen to change events from other tabs.\n getBroadcastChannel();\n const key = getKey(appConfig);\n let callbackSet = fidChangeCallbacks.get(key);\n if (!callbackSet) {\n callbackSet = new Set();\n fidChangeCallbacks.set(key, callbackSet);\n }\n callbackSet.add(callback);\n}\nfunction removeCallback(appConfig, callback) {\n const key = getKey(appConfig);\n const callbackSet = fidChangeCallbacks.get(key);\n if (!callbackSet) {\n return;\n }\n callbackSet.delete(callback);\n if (callbackSet.size === 0) {\n fidChangeCallbacks.delete(key);\n }\n // Close broadcast channel if there are no more callbacks.\n closeBroadcastChannel();\n}\nfunction callFidChangeCallbacks(key, fid) {\n const callbacks = fidChangeCallbacks.get(key);\n if (!callbacks) {\n return;\n }\n for (const callback of callbacks) {\n callback(fid);\n }\n}\nfunction broadcastFidChange(key, fid) {\n const channel = getBroadcastChannel();\n if (channel) {\n channel.postMessage({ key, fid });\n }\n closeBroadcastChannel();\n}\nlet broadcastChannel = null;\n/** Opens and returns a BroadcastChannel if it is supported by the browser. */\nfunction getBroadcastChannel() {\n if (!broadcastChannel && 'BroadcastChannel' in self) {\n broadcastChannel = new BroadcastChannel('[Firebase] FID Change');\n broadcastChannel.onmessage = e => {\n callFidChangeCallbacks(e.data.key, e.data.fid);\n };\n }\n return broadcastChannel;\n}\nfunction closeBroadcastChannel() {\n if (fidChangeCallbacks.size === 0 && broadcastChannel) {\n broadcastChannel.close();\n broadcastChannel = null;\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst DATABASE_NAME = 'firebase-installations-database';\nconst DATABASE_VERSION = 1;\nconst OBJECT_STORE_NAME = 'firebase-installations-store';\nlet dbPromise = null;\nfunction getDbPromise() {\n if (!dbPromise) {\n dbPromise = openDB(DATABASE_NAME, DATABASE_VERSION, {\n upgrade: (db, oldVersion) => {\n // We don't use 'break' in this switch statement, the fall-through\n // behavior is what we want, because if there are multiple versions between\n // the old version and the current version, we want ALL the migrations\n // that correspond to those versions to run, not only the last one.\n // eslint-disable-next-line default-case\n switch (oldVersion) {\n case 0:\n db.createObjectStore(OBJECT_STORE_NAME);\n }\n }\n });\n }\n return dbPromise;\n}\n/** Assigns or overwrites the record for the given key with the given value. */\nasync function set(appConfig, value) {\n const key = getKey(appConfig);\n const db = await getDbPromise();\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\n const objectStore = tx.objectStore(OBJECT_STORE_NAME);\n const oldValue = (await objectStore.get(key));\n await objectStore.put(value, key);\n await tx.done;\n if (!oldValue || oldValue.fid !== value.fid) {\n fidChanged(appConfig, value.fid);\n }\n return value;\n}\n/** Removes record(s) from the objectStore that match the given key. */\nasync function remove(appConfig) {\n const key = getKey(appConfig);\n const db = await getDbPromise();\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\n await tx.objectStore(OBJECT_STORE_NAME).delete(key);\n await tx.done;\n}\n/**\n * Atomically updates a record with the result of updateFn, which gets\n * called with the current value. If newValue is undefined, the record is\n * deleted instead.\n * @return Updated value\n */\nasync function update(appConfig, updateFn) {\n const key = getKey(appConfig);\n const db = await getDbPromise();\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\n const store = tx.objectStore(OBJECT_STORE_NAME);\n const oldValue = (await store.get(key));\n const newValue = updateFn(oldValue);\n if (newValue === undefined) {\n await store.delete(key);\n }\n else {\n await store.put(newValue, key);\n }\n await tx.done;\n if (newValue && (!oldValue || oldValue.fid !== newValue.fid)) {\n fidChanged(appConfig, newValue.fid);\n }\n return newValue;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Updates and returns the InstallationEntry from the database.\n * Also triggers a registration request if it is necessary and possible.\n */\nasync function getInstallationEntry(installations) {\n let registrationPromise;\n const installationEntry = await update(installations.appConfig, oldEntry => {\n const installationEntry = updateOrCreateInstallationEntry(oldEntry);\n const entryWithPromise = triggerRegistrationIfNecessary(installations, installationEntry);\n registrationPromise = entryWithPromise.registrationPromise;\n return entryWithPromise.installationEntry;\n });\n if (installationEntry.fid === INVALID_FID) {\n // FID generation failed. Waiting for the FID from the server.\n return { installationEntry: await registrationPromise };\n }\n return {\n installationEntry,\n registrationPromise\n };\n}\n/**\n * Creates a new Installation Entry if one does not exist.\n * Also clears timed out pending requests.\n */\nfunction updateOrCreateInstallationEntry(oldEntry) {\n const entry = oldEntry || {\n fid: generateFid(),\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\n };\n return clearTimedOutRequest(entry);\n}\n/**\n * If the Firebase Installation is not registered yet, this will trigger the\n * registration and return an InProgressInstallationEntry.\n *\n * If registrationPromise does not exist, the installationEntry is guaranteed\n * to be registered.\n */\nfunction triggerRegistrationIfNecessary(installations, installationEntry) {\n if (installationEntry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\n if (!navigator.onLine) {\n // Registration required but app is offline.\n const registrationPromiseWithError = Promise.reject(ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */));\n return {\n installationEntry,\n registrationPromise: registrationPromiseWithError\n };\n }\n // Try registering. Change status to IN_PROGRESS.\n const inProgressEntry = {\n fid: installationEntry.fid,\n registrationStatus: 1 /* RequestStatus.IN_PROGRESS */,\n registrationTime: Date.now()\n };\n const registrationPromise = registerInstallation(installations, inProgressEntry);\n return { installationEntry: inProgressEntry, registrationPromise };\n }\n else if (installationEntry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\n return {\n installationEntry,\n registrationPromise: waitUntilFidRegistration(installations)\n };\n }\n else {\n return { installationEntry };\n }\n}\n/** This will be executed only once for each new Firebase Installation. */\nasync function registerInstallation(installations, installationEntry) {\n try {\n const registeredInstallationEntry = await createInstallationRequest(installations, installationEntry);\n return set(installations.appConfig, registeredInstallationEntry);\n }\n catch (e) {\n if (isServerError(e) && e.customData.serverCode === 409) {\n // Server returned a \"FID cannot be used\" error.\n // Generate a new ID next time.\n await remove(installations.appConfig);\n }\n else {\n // Registration failed. Set FID as not registered.\n await set(installations.appConfig, {\n fid: installationEntry.fid,\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\n });\n }\n throw e;\n }\n}\n/** Call if FID registration is pending in another request. */\nasync function waitUntilFidRegistration(installations) {\n // Unfortunately, there is no way of reliably observing when a value in\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\n // so we need to poll.\n let entry = await updateInstallationRequest(installations.appConfig);\n while (entry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\n // createInstallation request still in progress.\n await sleep(100);\n entry = await updateInstallationRequest(installations.appConfig);\n }\n if (entry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\n // The request timed out or failed in a different call. Try again.\n const { installationEntry, registrationPromise } = await getInstallationEntry(installations);\n if (registrationPromise) {\n return registrationPromise;\n }\n else {\n // if there is no registrationPromise, entry is registered.\n return installationEntry;\n }\n }\n return entry;\n}\n/**\n * Called only if there is a CreateInstallation request in progress.\n *\n * Updates the InstallationEntry in the DB based on the status of the\n * CreateInstallation request.\n *\n * Returns the updated InstallationEntry.\n */\nfunction updateInstallationRequest(appConfig) {\n return update(appConfig, oldEntry => {\n if (!oldEntry) {\n throw ERROR_FACTORY.create(\"installation-not-found\" /* ErrorCode.INSTALLATION_NOT_FOUND */);\n }\n return clearTimedOutRequest(oldEntry);\n });\n}\nfunction clearTimedOutRequest(entry) {\n if (hasInstallationRequestTimedOut(entry)) {\n return {\n fid: entry.fid,\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\n };\n }\n return entry;\n}\nfunction hasInstallationRequestTimedOut(installationEntry) {\n return (installationEntry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */ &&\n installationEntry.registrationTime + PENDING_TIMEOUT_MS < Date.now());\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function generateAuthTokenRequest({ appConfig, heartbeatServiceProvider }, installationEntry) {\n const endpoint = getGenerateAuthTokenEndpoint(appConfig, installationEntry);\n const headers = getHeadersWithAuth(appConfig, installationEntry);\n // If heartbeat service exists, add the heartbeat string to the header.\n const heartbeatService = heartbeatServiceProvider.getImmediate({\n optional: true\n });\n if (heartbeatService) {\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\n if (heartbeatsHeader) {\n headers.append('x-firebase-client', heartbeatsHeader);\n }\n }\n const body = {\n installation: {\n sdkVersion: PACKAGE_VERSION,\n appId: appConfig.appId\n }\n };\n const request = {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n };\n const response = await retryIfServerError(() => fetch(endpoint, request));\n if (response.ok) {\n const responseValue = await response.json();\n const completedAuthToken = extractAuthTokenInfoFromResponse(responseValue);\n return completedAuthToken;\n }\n else {\n throw await getErrorFromResponse('Generate Auth Token', response);\n }\n}\nfunction getGenerateAuthTokenEndpoint(appConfig, { fid }) {\n return `${getInstallationsEndpoint(appConfig)}/${fid}/authTokens:generate`;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Returns a valid authentication token for the installation. Generates a new\n * token if one doesn't exist, is expired or about to expire.\n *\n * Should only be called if the Firebase Installation is registered.\n */\nasync function refreshAuthToken(installations, forceRefresh = false) {\n let tokenPromise;\n const entry = await update(installations.appConfig, oldEntry => {\n if (!isEntryRegistered(oldEntry)) {\n throw ERROR_FACTORY.create(\"not-registered\" /* ErrorCode.NOT_REGISTERED */);\n }\n const oldAuthToken = oldEntry.authToken;\n if (!forceRefresh && isAuthTokenValid(oldAuthToken)) {\n // There is a valid token in the DB.\n return oldEntry;\n }\n else if (oldAuthToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */) {\n // There already is a token request in progress.\n tokenPromise = waitUntilAuthTokenRequest(installations, forceRefresh);\n return oldEntry;\n }\n else {\n // No token or token expired.\n if (!navigator.onLine) {\n throw ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */);\n }\n const inProgressEntry = makeAuthTokenRequestInProgressEntry(oldEntry);\n tokenPromise = fetchAuthTokenFromServer(installations, inProgressEntry);\n return inProgressEntry;\n }\n });\n const authToken = tokenPromise\n ? await tokenPromise\n : entry.authToken;\n return authToken;\n}\n/**\n * Call only if FID is registered and Auth Token request is in progress.\n *\n * Waits until the current pending request finishes. If the request times out,\n * tries once in this thread as well.\n */\nasync function waitUntilAuthTokenRequest(installations, forceRefresh) {\n // Unfortunately, there is no way of reliably observing when a value in\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\n // so we need to poll.\n let entry = await updateAuthTokenRequest(installations.appConfig);\n while (entry.authToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */) {\n // generateAuthToken still in progress.\n await sleep(100);\n entry = await updateAuthTokenRequest(installations.appConfig);\n }\n const authToken = entry.authToken;\n if (authToken.requestStatus === 0 /* RequestStatus.NOT_STARTED */) {\n // The request timed out or failed in a different call. Try again.\n return refreshAuthToken(installations, forceRefresh);\n }\n else {\n return authToken;\n }\n}\n/**\n * Called only if there is a GenerateAuthToken request in progress.\n *\n * Updates the InstallationEntry in the DB based on the status of the\n * GenerateAuthToken request.\n *\n * Returns the updated InstallationEntry.\n */\nfunction updateAuthTokenRequest(appConfig) {\n return update(appConfig, oldEntry => {\n if (!isEntryRegistered(oldEntry)) {\n throw ERROR_FACTORY.create(\"not-registered\" /* ErrorCode.NOT_REGISTERED */);\n }\n const oldAuthToken = oldEntry.authToken;\n if (hasAuthTokenRequestTimedOut(oldAuthToken)) {\n return {\n ...oldEntry,\n authToken: { requestStatus: 0 /* RequestStatus.NOT_STARTED */ }\n };\n }\n return oldEntry;\n });\n}\nasync function fetchAuthTokenFromServer(installations, installationEntry) {\n try {\n const authToken = await generateAuthTokenRequest(installations, installationEntry);\n const updatedInstallationEntry = {\n ...installationEntry,\n authToken\n };\n await set(installations.appConfig, updatedInstallationEntry);\n return authToken;\n }\n catch (e) {\n if (isServerError(e) &&\n (e.customData.serverCode === 401 || e.customData.serverCode === 404)) {\n // Server returned a \"FID not found\" or a \"Invalid authentication\" error.\n // Generate a new ID next time.\n await remove(installations.appConfig);\n }\n else {\n const updatedInstallationEntry = {\n ...installationEntry,\n authToken: { requestStatus: 0 /* RequestStatus.NOT_STARTED */ }\n };\n await set(installations.appConfig, updatedInstallationEntry);\n }\n throw e;\n }\n}\nfunction isEntryRegistered(installationEntry) {\n return (installationEntry !== undefined &&\n installationEntry.registrationStatus === 2 /* RequestStatus.COMPLETED */);\n}\nfunction isAuthTokenValid(authToken) {\n return (authToken.requestStatus === 2 /* RequestStatus.COMPLETED */ &&\n !isAuthTokenExpired(authToken));\n}\nfunction isAuthTokenExpired(authToken) {\n const now = Date.now();\n return (now < authToken.creationTime ||\n authToken.creationTime + authToken.expiresIn < now + TOKEN_EXPIRATION_BUFFER);\n}\n/** Returns an updated InstallationEntry with an InProgressAuthToken. */\nfunction makeAuthTokenRequestInProgressEntry(oldEntry) {\n const inProgressAuthToken = {\n requestStatus: 1 /* RequestStatus.IN_PROGRESS */,\n requestTime: Date.now()\n };\n return {\n ...oldEntry,\n authToken: inProgressAuthToken\n };\n}\nfunction hasAuthTokenRequestTimedOut(authToken) {\n return (authToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */ &&\n authToken.requestTime + PENDING_TIMEOUT_MS < Date.now());\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Creates a Firebase Installation if there isn't one for the app and\n * returns the Installation ID.\n * @param installations - The `Installations` instance.\n *\n * @public\n */\nasync function getId(installations) {\n const installationsImpl = installations;\n const { installationEntry, registrationPromise } = await getInstallationEntry(installationsImpl);\n if (registrationPromise) {\n registrationPromise.catch(console.error);\n }\n else {\n // If the installation is already registered, update the authentication\n // token if needed.\n refreshAuthToken(installationsImpl).catch(console.error);\n }\n return installationEntry.fid;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Returns a Firebase Installations auth token, identifying the current\n * Firebase Installation.\n * @param installations - The `Installations` instance.\n * @param forceRefresh - Force refresh regardless of token expiration.\n *\n * @public\n */\nasync function getToken(installations, forceRefresh = false) {\n const installationsImpl = installations;\n await completeInstallationRegistration(installationsImpl);\n // At this point we either have a Registered Installation in the DB, or we've\n // already thrown an error.\n const authToken = await refreshAuthToken(installationsImpl, forceRefresh);\n return authToken.token;\n}\nasync function completeInstallationRegistration(installations) {\n const { registrationPromise } = await getInstallationEntry(installations);\n if (registrationPromise) {\n // A createInstallation request is in progress. Wait until it finishes.\n await registrationPromise;\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function deleteInstallationRequest(appConfig, installationEntry) {\n const endpoint = getDeleteEndpoint(appConfig, installationEntry);\n const headers = getHeadersWithAuth(appConfig, installationEntry);\n const request = {\n method: 'DELETE',\n headers\n };\n const response = await retryIfServerError(() => fetch(endpoint, request));\n if (!response.ok) {\n throw await getErrorFromResponse('Delete Installation', response);\n }\n}\nfunction getDeleteEndpoint(appConfig, { fid }) {\n return `${getInstallationsEndpoint(appConfig)}/${fid}`;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Deletes the Firebase Installation and all associated data.\n * @param installations - The `Installations` instance.\n *\n * @public\n */\nasync function deleteInstallations(installations) {\n const { appConfig } = installations;\n const entry = await update(appConfig, oldEntry => {\n if (oldEntry && oldEntry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\n // Delete the unregistered entry without sending a deleteInstallation request.\n return undefined;\n }\n return oldEntry;\n });\n if (entry) {\n if (entry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\n // Can't delete while trying to register.\n throw ERROR_FACTORY.create(\"delete-pending-registration\" /* ErrorCode.DELETE_PENDING_REGISTRATION */);\n }\n else if (entry.registrationStatus === 2 /* RequestStatus.COMPLETED */) {\n if (!navigator.onLine) {\n throw ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */);\n }\n else {\n await deleteInstallationRequest(appConfig, entry);\n await remove(appConfig);\n }\n }\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Sets a new callback that will get called when Installation ID changes.\n * Returns an unsubscribe function that will remove the callback when called.\n * @param installations - The `Installations` instance.\n * @param callback - The callback function that is invoked when FID changes.\n * @returns A function that can be called to unsubscribe.\n *\n * @public\n */\nfunction onIdChange(installations, callback) {\n const { appConfig } = installations;\n addCallback(appConfig, callback);\n return () => {\n removeCallback(appConfig, callback);\n };\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Returns an instance of {@link Installations} associated with the given\n * {@link @firebase/app#FirebaseApp} instance.\n * @param app - The {@link @firebase/app#FirebaseApp} instance.\n *\n * @public\n */\nfunction getInstallations(app = getApp()) {\n const installationsImpl = _getProvider(app, 'installations').getImmediate();\n return installationsImpl;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction extractAppConfig(app) {\n if (!app || !app.options) {\n throw getMissingValueError('App Configuration');\n }\n if (!app.name) {\n throw getMissingValueError('App Name');\n }\n // Required app config keys\n const configKeys = [\n 'projectId',\n 'apiKey',\n 'appId'\n ];\n for (const keyName of configKeys) {\n if (!app.options[keyName]) {\n throw getMissingValueError(keyName);\n }\n }\n return {\n appName: app.name,\n projectId: app.options.projectId,\n apiKey: app.options.apiKey,\n appId: app.options.appId\n };\n}\nfunction getMissingValueError(valueName) {\n return ERROR_FACTORY.create(\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */, {\n valueName\n });\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst INSTALLATIONS_NAME = 'installations';\nconst INSTALLATIONS_NAME_INTERNAL = 'installations-internal';\nconst publicFactory = (container) => {\n const app = container.getProvider('app').getImmediate();\n // Throws if app isn't configured properly.\n const appConfig = extractAppConfig(app);\n const heartbeatServiceProvider = _getProvider(app, 'heartbeat');\n const installationsImpl = {\n app,\n appConfig,\n heartbeatServiceProvider,\n _delete: () => Promise.resolve()\n };\n return installationsImpl;\n};\nconst internalFactory = (container) => {\n const app = container.getProvider('app').getImmediate();\n // Internal FIS instance relies on public FIS instance.\n const installations = _getProvider(app, INSTALLATIONS_NAME).getImmediate();\n const installationsInternal = {\n getId: () => getId(installations),\n getToken: (forceRefresh) => getToken(installations, forceRefresh)\n };\n return installationsInternal;\n};\nfunction registerInstallations() {\n _registerComponent(new Component(INSTALLATIONS_NAME, publicFactory, \"PUBLIC\" /* ComponentType.PUBLIC */));\n _registerComponent(new Component(INSTALLATIONS_NAME_INTERNAL, internalFactory, \"PRIVATE\" /* ComponentType.PRIVATE */));\n}\n\n/**\n * The Firebase Installations Web SDK.\n * This SDK does not work in a Node.js environment.\n *\n * @packageDocumentation\n */\nregisterInstallations();\nregisterVersion(name, version);\n// BUILD_TARGET will be replaced by values like esm, cjs, etc during the compilation\nregisterVersion(name, version, 'esm2020');\n\nexport { deleteInstallations, getId, getInstallations, getToken, onIdChange };\n//# sourceMappingURL=index.esm.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A container for all of the Logger instances\n */\nconst instances = [];\n/**\n * The JS SDK supports 5 log levels and also allows a user the ability to\n * silence the logs altogether.\n *\n * The order is a follows:\n * DEBUG < VERBOSE < INFO < WARN < ERROR\n *\n * All of the log types above the current log level will be captured (i.e. if\n * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and\n * `VERBOSE` logs will not)\n */\nvar LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"DEBUG\"] = 0] = \"DEBUG\";\n LogLevel[LogLevel[\"VERBOSE\"] = 1] = \"VERBOSE\";\n LogLevel[LogLevel[\"INFO\"] = 2] = \"INFO\";\n LogLevel[LogLevel[\"WARN\"] = 3] = \"WARN\";\n LogLevel[LogLevel[\"ERROR\"] = 4] = \"ERROR\";\n LogLevel[LogLevel[\"SILENT\"] = 5] = \"SILENT\";\n})(LogLevel || (LogLevel = {}));\nconst levelStringToEnum = {\n 'debug': LogLevel.DEBUG,\n 'verbose': LogLevel.VERBOSE,\n 'info': LogLevel.INFO,\n 'warn': LogLevel.WARN,\n 'error': LogLevel.ERROR,\n 'silent': LogLevel.SILENT\n};\n/**\n * The default log level\n */\nconst defaultLogLevel = LogLevel.INFO;\n/**\n * By default, `console.debug` is not displayed in the developer console (in\n * chrome). To avoid forcing users to have to opt-in to these logs twice\n * (i.e. once for firebase, and once in the console), we are sending `DEBUG`\n * logs to the `console.log` function.\n */\nconst ConsoleMethod = {\n [LogLevel.DEBUG]: 'log',\n [LogLevel.VERBOSE]: 'log',\n [LogLevel.INFO]: 'info',\n [LogLevel.WARN]: 'warn',\n [LogLevel.ERROR]: 'error'\n};\n/**\n * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR\n * messages on to their corresponding console counterparts (if the log method\n * is supported by the current log level)\n */\nconst defaultLogHandler = (instance, logType, ...args) => {\n if (logType < instance.logLevel) {\n return;\n }\n const now = new Date().toISOString();\n const method = ConsoleMethod[logType];\n if (method) {\n console[method](`[${now}] ${instance.name}:`, ...args);\n }\n else {\n throw new Error(`Attempted to log a message with an invalid logType (value: ${logType})`);\n }\n};\nclass Logger {\n /**\n * Gives you an instance of a Logger to capture messages according to\n * Firebase's logging scheme.\n *\n * @param name The name that the logs will be associated with\n */\n constructor(name) {\n this.name = name;\n /**\n * The log level of the given Logger instance.\n */\n this._logLevel = defaultLogLevel;\n /**\n * The main (internal) log handler for the Logger instance.\n * Can be set to a new function in internal package code but not by user.\n */\n this._logHandler = defaultLogHandler;\n /**\n * The optional, additional, user-defined log handler for the Logger instance.\n */\n this._userLogHandler = null;\n /**\n * Capture the current instance for later use\n */\n instances.push(this);\n }\n get logLevel() {\n return this._logLevel;\n }\n set logLevel(val) {\n if (!(val in LogLevel)) {\n throw new TypeError(`Invalid value \"${val}\" assigned to \\`logLevel\\``);\n }\n this._logLevel = val;\n }\n // Workaround for setter/getter having to be the same type.\n setLogLevel(val) {\n this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val;\n }\n get logHandler() {\n return this._logHandler;\n }\n set logHandler(val) {\n if (typeof val !== 'function') {\n throw new TypeError('Value assigned to `logHandler` must be a function');\n }\n this._logHandler = val;\n }\n get userLogHandler() {\n return this._userLogHandler;\n }\n set userLogHandler(val) {\n this._userLogHandler = val;\n }\n /**\n * The functions below are all based on the `console` interface\n */\n debug(...args) {\n this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args);\n this._logHandler(this, LogLevel.DEBUG, ...args);\n }\n log(...args) {\n this._userLogHandler &&\n this._userLogHandler(this, LogLevel.VERBOSE, ...args);\n this._logHandler(this, LogLevel.VERBOSE, ...args);\n }\n info(...args) {\n this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args);\n this._logHandler(this, LogLevel.INFO, ...args);\n }\n warn(...args) {\n this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args);\n this._logHandler(this, LogLevel.WARN, ...args);\n }\n error(...args) {\n this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args);\n this._logHandler(this, LogLevel.ERROR, ...args);\n }\n}\nfunction setLogLevel(level) {\n instances.forEach(inst => {\n inst.setLogLevel(level);\n });\n}\nfunction setUserLogHandler(logCallback, options) {\n for (const instance of instances) {\n let customLogLevel = null;\n if (options && options.level) {\n customLogLevel = levelStringToEnum[options.level];\n }\n if (logCallback === null) {\n instance.userLogHandler = null;\n }\n else {\n instance.userLogHandler = (instance, level, ...args) => {\n const message = args\n .map(arg => {\n if (arg == null) {\n return null;\n }\n else if (typeof arg === 'string') {\n return arg;\n }\n else if (typeof arg === 'number' || typeof arg === 'boolean') {\n return arg.toString();\n }\n else if (arg instanceof Error) {\n return arg.message;\n }\n else {\n try {\n return JSON.stringify(arg);\n }\n catch (ignored) {\n return null;\n }\n }\n })\n .filter(arg => arg)\n .join(' ');\n if (level >= (customLogLevel ?? instance.logLevel)) {\n logCallback({\n level: LogLevel[level].toLowerCase(),\n message,\n args,\n type: instance.name\n });\n }\n };\n }\n }\n}\n\nexport { LogLevel, Logger, setLogLevel, setUserLogHandler };\n//# sourceMappingURL=index.esm.js.map\n","import { onIdChange } from '@firebase/installations';\nimport { Component } from '@firebase/component';\nimport { openDB, deleteDB } from 'idb';\nimport { ErrorFactory, validateIndexedDBOpenable, isIndexedDBAvailable, areCookiesEnabled, getModularInstance } from '@firebase/util';\nimport { _registerComponent, registerVersion, _getProvider, getApp } from '@firebase/app';\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst DEFAULT_SW_PATH = '/firebase-messaging-sw.js';\nconst DEFAULT_SW_SCOPE = '/firebase-cloud-messaging-push-scope';\nconst DEFAULT_VAPID_KEY = 'BDOU99-h67HcA6JeFXHbSNMu7e2yNNu3RzoMj8TM4W88jITfq7ZmPvIM1Iv-4_l2LxQcYwhqby2xGpWwzjfAnG4';\nconst ENDPOINT = 'https://fcmregistrations.googleapis.com/v1';\nconst CONSOLE_CAMPAIGN_ID = 'google.c.a.c_id';\nconst CONSOLE_CAMPAIGN_NAME = 'google.c.a.c_l';\nconst CONSOLE_CAMPAIGN_TIME = 'google.c.a.ts';\n/** Set to '1' if Analytics is enabled for the campaign */\nconst CONSOLE_CAMPAIGN_ANALYTICS_ENABLED = 'google.c.a.e';\nconst DEFAULT_REGISTRATION_TIMEOUT = 10000;\nvar MessageType$1;\n(function (MessageType) {\n MessageType[MessageType[\"DATA_MESSAGE\"] = 1] = \"DATA_MESSAGE\";\n MessageType[MessageType[\"DISPLAY_NOTIFICATION\"] = 3] = \"DISPLAY_NOTIFICATION\";\n})(MessageType$1 || (MessageType$1 = {}));\n\n/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under the License\n * is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\n * or implied. See the License for the specific language governing permissions and limitations under\n * the License.\n */\nvar MessageType;\n(function (MessageType) {\n MessageType[\"PUSH_RECEIVED\"] = \"push-received\";\n MessageType[\"NOTIFICATION_CLICKED\"] = \"notification-clicked\";\n MessageType[\"FID_REGISTERED\"] = \"fid-registered\";\n})(MessageType || (MessageType = {}));\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction arrayToBase64(array) {\n const uint8Array = new Uint8Array(array);\n const base64String = btoa(String.fromCharCode(...uint8Array));\n return base64String.replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n}\nfunction base64ToArray(base64String) {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding)\n .replace(/\\-/g, '+')\n .replace(/_/g, '/');\n const rawData = atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst OLD_DB_NAME = 'fcm_token_details_db';\n/**\n * The last DB version of 'fcm_token_details_db' was 4. This is one higher, so that the upgrade\n * callback is called for all versions of the old DB.\n */\nconst OLD_DB_VERSION = 5;\nconst OLD_OBJECT_STORE_NAME = 'fcm_token_object_Store';\nasync function migrateOldDatabase(senderId) {\n if ('databases' in indexedDB) {\n // indexedDb.databases() is an IndexedDB v3 API and does not exist in all browsers. TODO: Remove\n // typecast when it lands in TS types.\n const databases = await indexedDB.databases();\n const dbNames = databases.map(db => db.name);\n if (!dbNames.includes(OLD_DB_NAME)) {\n // old DB didn't exist, no need to open.\n return null;\n }\n }\n let tokenDetails = null;\n const db = await openDB(OLD_DB_NAME, OLD_DB_VERSION, {\n upgrade: async (db, oldVersion, newVersion, upgradeTransaction) => {\n if (oldVersion < 2) {\n // Database too old, skip migration.\n return;\n }\n if (!db.objectStoreNames.contains(OLD_OBJECT_STORE_NAME)) {\n // Database did not exist. Nothing to do.\n return;\n }\n const objectStore = upgradeTransaction.objectStore(OLD_OBJECT_STORE_NAME);\n const value = await objectStore.index('fcmSenderId').get(senderId);\n await objectStore.clear();\n if (!value) {\n // No entry in the database, nothing to migrate.\n return;\n }\n if (oldVersion === 2) {\n const oldDetails = value;\n if (!oldDetails.auth || !oldDetails.p256dh || !oldDetails.endpoint) {\n return;\n }\n tokenDetails = {\n token: oldDetails.fcmToken,\n createTime: oldDetails.createTime ?? Date.now(),\n subscriptionOptions: {\n auth: oldDetails.auth,\n p256dh: oldDetails.p256dh,\n endpoint: oldDetails.endpoint,\n swScope: oldDetails.swScope,\n vapidKey: typeof oldDetails.vapidKey === 'string'\n ? oldDetails.vapidKey\n : arrayToBase64(oldDetails.vapidKey)\n }\n };\n }\n else if (oldVersion === 3) {\n const oldDetails = value;\n tokenDetails = {\n token: oldDetails.fcmToken,\n createTime: oldDetails.createTime,\n subscriptionOptions: {\n auth: arrayToBase64(oldDetails.auth),\n p256dh: arrayToBase64(oldDetails.p256dh),\n endpoint: oldDetails.endpoint,\n swScope: oldDetails.swScope,\n vapidKey: arrayToBase64(oldDetails.vapidKey)\n }\n };\n }\n else if (oldVersion === 4) {\n const oldDetails = value;\n tokenDetails = {\n token: oldDetails.fcmToken,\n createTime: oldDetails.createTime,\n subscriptionOptions: {\n auth: arrayToBase64(oldDetails.auth),\n p256dh: arrayToBase64(oldDetails.p256dh),\n endpoint: oldDetails.endpoint,\n swScope: oldDetails.swScope,\n vapidKey: arrayToBase64(oldDetails.vapidKey)\n }\n };\n }\n }\n });\n db.close();\n // Delete all old databases.\n await deleteDB(OLD_DB_NAME);\n await deleteDB('fcm_vapid_details_db');\n await deleteDB('undefined');\n return checkTokenDetails(tokenDetails) ? tokenDetails : null;\n}\nfunction checkTokenDetails(tokenDetails) {\n if (!tokenDetails || !tokenDetails.subscriptionOptions) {\n return false;\n }\n const { subscriptionOptions } = tokenDetails;\n return (typeof tokenDetails.createTime === 'number' &&\n tokenDetails.createTime > 0 &&\n typeof tokenDetails.token === 'string' &&\n tokenDetails.token.length > 0 &&\n typeof subscriptionOptions.auth === 'string' &&\n subscriptionOptions.auth.length > 0 &&\n typeof subscriptionOptions.p256dh === 'string' &&\n subscriptionOptions.p256dh.length > 0 &&\n typeof subscriptionOptions.endpoint === 'string' &&\n subscriptionOptions.endpoint.length > 0 &&\n typeof subscriptionOptions.swScope === 'string' &&\n subscriptionOptions.swScope.length > 0 &&\n typeof subscriptionOptions.vapidKey === 'string' &&\n subscriptionOptions.vapidKey.length > 0);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst ERROR_MAP = {\n [\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */]: 'Missing App configuration value: \"{$valueName}\"',\n [\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */]: 'This method is available in a Window context.',\n [\"only-available-in-sw\" /* ErrorCode.AVAILABLE_IN_SW */]: 'This method is available in a service worker context.',\n [\"permission-default\" /* ErrorCode.PERMISSION_DEFAULT */]: 'The notification permission was not granted and dismissed instead.',\n [\"permission-blocked\" /* ErrorCode.PERMISSION_BLOCKED */]: 'The notification permission was not granted and blocked instead.',\n [\"unsupported-browser\" /* ErrorCode.UNSUPPORTED_BROWSER */]: \"This browser doesn't support the API's required to use the Firebase SDK.\",\n [\"indexed-db-unsupported\" /* ErrorCode.INDEXED_DB_UNSUPPORTED */]: \"This browser doesn't support indexedDb.open() (ex. Safari iFrame, Firefox Private Browsing, etc)\",\n [\"failed-service-worker-registration\" /* ErrorCode.FAILED_DEFAULT_REGISTRATION */]: 'We are unable to register the default service worker. {$browserErrorMessage}',\n [\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */]: 'A problem occurred while subscribing the user to FCM: {$errorInfo}',\n [\"token-subscribe-no-token\" /* ErrorCode.TOKEN_SUBSCRIBE_NO_TOKEN */]: 'FCM returned no token when subscribing the user to push.',\n [\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */]: 'A problem occurred while creating an FCM registration via FID: {$errorInfo}',\n [\"fid-unregister-failed\" /* ErrorCode.FID_UNREGISTER_FAILED */]: 'A problem occurred while unregistering the FCM registration via FID: {$errorInfo}',\n [\"fid-registration-idb-schema-unavailable\" /* ErrorCode.FID_REGISTRATION_IDB_SCHEMA_UNAVAILABLE */]: 'Unable to read or persist FID registration metadata because the messaging ' +\n 'IndexedDB schema is unavailable (for example, the database could not be ' +\n 'upgraded to the latest version).',\n [\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */]: 'A problem occurred while unsubscribing the ' +\n 'user from FCM: {$errorInfo}',\n [\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */]: 'A problem occurred while updating the user from FCM: {$errorInfo}',\n [\"token-update-no-token\" /* ErrorCode.TOKEN_UPDATE_NO_TOKEN */]: 'FCM returned no token when updating the user to push.',\n [\"use-sw-after-get-token\" /* ErrorCode.USE_SW_AFTER_GET_TOKEN */]: 'The useServiceWorker() method may only be called once and must be ' +\n 'called before calling getToken() to ensure your service worker is used.',\n [\"invalid-sw-registration\" /* ErrorCode.INVALID_SW_REGISTRATION */]: 'The input to useServiceWorker() must be a ServiceWorkerRegistration.',\n [\"invalid-bg-handler\" /* ErrorCode.INVALID_BG_HANDLER */]: 'The input to setBackgroundMessageHandler() must be a function.',\n [\"invalid-vapid-key\" /* ErrorCode.INVALID_VAPID_KEY */]: 'The public VAPID key must be a string.',\n [\"use-vapid-key-after-get-token\" /* ErrorCode.USE_VAPID_KEY_AFTER_GET_TOKEN */]: 'The usePublicVapidKey() method may only be called once and must be ' +\n 'called before calling getToken() to ensure your VAPID key is used.',\n [\"invalid-on-registered-handler\" /* ErrorCode.INVALID_ON_REGISTERED_HANDLER */]: 'No onRegistered callback handler was provided or registered. Implement onRegistered() before register().'\n};\nconst ERROR_FACTORY = new ErrorFactory('messaging', 'Messaging', ERROR_MAP);\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst DATABASE_NAME = 'firebase-messaging-database';\nconst DATABASE_VERSION = 2;\nconst TOKEN_OBJECT_STORE_NAME = 'firebase-messaging-store';\nconst FID_REGISTRATION_OBJECT_STORE_NAME = 'firebase-messaging-fid-registration-store';\nconst defaultIdb = { openDB, deleteDB };\nlet idbImpl = defaultIdb;\n// Open v2, but fall back to v1 if upgrade/open fails. Cache as `unknown` and guard store access.\nlet dbPromise = null;\nfunction migrateMessagingDb(upgradeDb, oldVersion, targetSchemaVersion) {\n // Intentional fall-through for v2: run all intermediate migrations.\n // eslint-disable-next-line default-case\n switch (oldVersion) {\n case 0:\n upgradeDb.createObjectStore(TOKEN_OBJECT_STORE_NAME);\n if (targetSchemaVersion === 1) {\n break;\n }\n // fall through\n case 1:\n if (targetSchemaVersion === 2) {\n upgradeDb.createObjectStore(FID_REGISTRATION_OBJECT_STORE_NAME);\n }\n }\n}\nfunction createOpenDbOptions(targetSchemaVersion) {\n return {\n upgrade: (upgradeDb, oldVersion) => {\n migrateMessagingDb(upgradeDb, oldVersion, targetSchemaVersion);\n },\n blocked: () => {\n /* no-op */\n },\n blocking: (_currentVersion, _blockedVersion, event) => {\n dbPromise = null;\n event.target?.close();\n },\n terminated: () => {\n dbPromise = null;\n }\n };\n}\nfunction getDbPromise() {\n if (!dbPromise) {\n const openLatest = idbImpl.openDB(DATABASE_NAME, DATABASE_VERSION, createOpenDbOptions(2));\n // Assign synchronously to avoid concurrent openDB() calls.\n dbPromise = openLatest.catch(() => idbImpl.openDB(DATABASE_NAME, DATABASE_VERSION - 1, createOpenDbOptions(1)));\n }\n return dbPromise;\n}\nfunction hasObjectStore(db, storeName) {\n return db.objectStoreNames.contains(storeName);\n}\nfunction assertFidRegistrationObjectStore(db) {\n if (!hasObjectStore(db, FID_REGISTRATION_OBJECT_STORE_NAME)) {\n throw ERROR_FACTORY.create(\"fid-registration-idb-schema-unavailable\" /* ErrorCode.FID_REGISTRATION_IDB_SCHEMA_UNAVAILABLE */);\n }\n}\nasync function dbGet(firebaseDependencies) {\n const key = getKey(firebaseDependencies);\n const db = await getDbPromise();\n const tokenDetails = (await db\n .transaction(TOKEN_OBJECT_STORE_NAME)\n .objectStore(TOKEN_OBJECT_STORE_NAME)\n .get(key));\n if (tokenDetails) {\n return tokenDetails;\n }\n else {\n const oldTokenDetails = await migrateOldDatabase(firebaseDependencies.appConfig.senderId);\n if (oldTokenDetails) {\n await dbSet(firebaseDependencies, oldTokenDetails);\n return oldTokenDetails;\n }\n }\n}\nasync function dbSet(firebaseDependencies, tokenDetails) {\n const key = getKey(firebaseDependencies);\n const db = await getDbPromise();\n const stores = [TOKEN_OBJECT_STORE_NAME];\n const hasFidStore = hasObjectStore(db, FID_REGISTRATION_OBJECT_STORE_NAME);\n if (hasFidStore) {\n stores.push(FID_REGISTRATION_OBJECT_STORE_NAME);\n }\n const tx = db.transaction(stores, 'readwrite');\n await tx.objectStore(TOKEN_OBJECT_STORE_NAME).put(tokenDetails, key);\n if (hasFidStore) {\n await tx.objectStore(FID_REGISTRATION_OBJECT_STORE_NAME).delete(key);\n }\n await tx.done;\n return tokenDetails;\n}\nasync function dbRemove(firebaseDependencies) {\n const key = getKey(firebaseDependencies);\n const db = await getDbPromise();\n const tx = db.transaction(TOKEN_OBJECT_STORE_NAME, 'readwrite');\n await tx.objectStore(TOKEN_OBJECT_STORE_NAME).delete(key);\n await tx.done;\n}\nasync function dbGetFidRegistration(firebaseDependencies) {\n const key = getKey(firebaseDependencies);\n const db = await getDbPromise();\n assertFidRegistrationObjectStore(db);\n return (await db\n .transaction(FID_REGISTRATION_OBJECT_STORE_NAME)\n .objectStore(FID_REGISTRATION_OBJECT_STORE_NAME)\n .get(key));\n}\nasync function dbSetFidRegistration(firebaseDependencies, details) {\n const key = getKey(firebaseDependencies);\n const db = await getDbPromise();\n assertFidRegistrationObjectStore(db);\n const tx = db.transaction([TOKEN_OBJECT_STORE_NAME, FID_REGISTRATION_OBJECT_STORE_NAME], 'readwrite');\n await tx.objectStore(FID_REGISTRATION_OBJECT_STORE_NAME).put(details, key);\n await tx.objectStore(TOKEN_OBJECT_STORE_NAME).delete(key);\n await tx.done;\n return details;\n}\nasync function dbRemoveFidRegistration(firebaseDependencies) {\n const key = getKey(firebaseDependencies);\n const db = await getDbPromise();\n assertFidRegistrationObjectStore(db);\n const tx = db.transaction(FID_REGISTRATION_OBJECT_STORE_NAME, 'readwrite');\n await tx.objectStore(FID_REGISTRATION_OBJECT_STORE_NAME).delete(key);\n await tx.done;\n}\nfunction getKey({ appConfig }) {\n return appConfig.appId;\n}\n\nconst name = \"@firebase/messaging\";\nconst version = \"0.13.0\";\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Max attempts (initial fetch + retries) when CreateRegistration `fetch()` throws. */\nconst FID_REGISTRATION_FETCH_MAX_ATTEMPTS = 3;\n/** Base delay in ms; backoff is `BASE * 2^attempt` after each failed attempt. */\nconst FID_REGISTRATION_FETCH_BASE_BACKOFF_MS = 1000;\nasync function requestGetToken(firebaseDependencies, subscriptionOptions) {\n const headers = await getHeaders(firebaseDependencies);\n const body = getBody(subscriptionOptions, firebaseDependencies.appConfig.appName, \n /* includeSdkVersion= */ false);\n const subscribeOptions = {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n };\n let responseData;\n try {\n const response = await fetch(getEndpoint(firebaseDependencies.appConfig), subscribeOptions);\n responseData = await response.json();\n }\n catch (err) {\n throw ERROR_FACTORY.create(\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */, {\n errorInfo: err?.toString()\n });\n }\n if (responseData.error) {\n const message = responseData.error.message;\n throw ERROR_FACTORY.create(\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */, {\n errorInfo: message\n });\n }\n if (!responseData.token) {\n throw ERROR_FACTORY.create(\"token-subscribe-no-token\" /* ErrorCode.TOKEN_SUBSCRIBE_NO_TOKEN */);\n }\n return responseData.token;\n}\nasync function requestCreateRegistration(firebaseDependencies, subscriptionOptions) {\n const headers = await getHeaders(firebaseDependencies);\n const body = getBody(subscriptionOptions, firebaseDependencies.appConfig.appName, \n /* includeSdkVersion= */ true);\n const subscribeOptions = {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n };\n let response;\n try {\n response = await fetchWithExponentialRetry(() => fetch(getEndpoint(firebaseDependencies.appConfig), subscribeOptions), FID_REGISTRATION_FETCH_MAX_ATTEMPTS, FID_REGISTRATION_FETCH_BASE_BACKOFF_MS);\n }\n catch (err) {\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: err?.toString()\n });\n }\n if (response.ok) {\n const responseFid = await parseCreateRegistrationSuccessFid(response);\n return { responseFid };\n }\n // `fetch()` succeeded, but the backend returned a non-2xx response.\n // Best-effort parse the body to extract `error.message`, but always fail with\n // `FID_REGISTRATION_FAILED` to keep the error surface uniform.\n // Best-effort extraction of error details; the main signal is response.ok / status.\n let responseData;\n try {\n responseData = (await response.json());\n }\n catch (err) {\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: response.statusText\n });\n }\n const message = responseData.error?.message ?? response.statusText;\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: message\n });\n}\n/**\n * Deletes an FCM Web registration via DeleteRegistration using the Firebase Installation ID (FID).\n */\nasync function requestDeleteRegistration(firebaseDependencies, fid) {\n const headers = await getHeaders(firebaseDependencies);\n const options = {\n method: 'DELETE',\n headers\n };\n let response;\n try {\n response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${fid}`, options);\n }\n catch (err) {\n throw ERROR_FACTORY.create(\"fid-unregister-failed\" /* ErrorCode.FID_UNREGISTER_FAILED */, {\n errorInfo: err?.toString()\n });\n }\n if (response.ok) {\n return;\n }\n // Best-effort parse error details; surface uniform error code.\n try {\n const responseData = (await response.json());\n const message = responseData.error?.message ?? response.statusText;\n throw message;\n }\n catch (err) {\n // If parsing failed, fall back to status text.\n throw ERROR_FACTORY.create(\"fid-unregister-failed\" /* ErrorCode.FID_UNREGISTER_FAILED */, {\n errorInfo: (typeof err === 'string' && err) ||\n response.statusText ||\n err?.toString()\n });\n }\n}\n/**\n * Parses a successful CreateRegistration body. The backend must return JSON with a non-empty\n * string `name`: a resource name `projects/{projectId}/registrations/{fid}`\n */\nasync function parseCreateRegistrationSuccessFid(response) {\n const text = await response.text();\n if (!text.trim()) {\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: 'CreateRegistration succeeded but response body is empty'\n });\n }\n let data;\n try {\n data = JSON.parse(text);\n }\n catch {\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: 'CreateRegistration succeeded but response body is not valid JSON'\n });\n }\n const name = data.name;\n if (typeof name !== 'string' || name.length === 0) {\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: 'CreateRegistration succeeded but response did not include a non-empty name'\n });\n }\n return parseFidFromRegistrationResourceName(name);\n}\nconst REGISTRATIONS_NAME_SEGMENT = '/registrations/';\n/** Extracts the Firebase Installation ID from CreateRegistration `name` (resource path). */\nfunction parseFidFromRegistrationResourceName(name) {\n const segmentIndex = name.indexOf(REGISTRATIONS_NAME_SEGMENT);\n if (segmentIndex !== -1) {\n const fid = name.slice(segmentIndex + REGISTRATIONS_NAME_SEGMENT.length);\n if (fid.length > 0) {\n return fid;\n }\n }\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: 'CreateRegistration succeeded but response name is not a valid registration resource name'\n });\n}\nasync function requestUpdateToken(firebaseDependencies, tokenDetails) {\n const headers = await getHeaders(firebaseDependencies);\n const body = getBody(tokenDetails.subscriptionOptions, firebaseDependencies.appConfig.appName, \n /* includeSdkVersion= */ false);\n const updateOptions = {\n method: 'PATCH',\n headers,\n body: JSON.stringify(body)\n };\n let responseData;\n try {\n const response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${tokenDetails.token}`, updateOptions);\n responseData = await response.json();\n }\n catch (err) {\n throw ERROR_FACTORY.create(\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */, {\n errorInfo: err?.toString()\n });\n }\n if (responseData.error) {\n const message = responseData.error.message;\n throw ERROR_FACTORY.create(\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */, {\n errorInfo: message\n });\n }\n if (!responseData.token) {\n throw ERROR_FACTORY.create(\"token-update-no-token\" /* ErrorCode.TOKEN_UPDATE_NO_TOKEN */);\n }\n return responseData.token;\n}\nasync function requestDeleteToken(firebaseDependencies, token) {\n const headers = await getHeaders(firebaseDependencies);\n const unsubscribeOptions = {\n method: 'DELETE',\n headers\n };\n try {\n const response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${token}`, unsubscribeOptions);\n const responseData = await response.json();\n if (responseData.error) {\n const message = responseData.error.message;\n throw ERROR_FACTORY.create(\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */, {\n errorInfo: message\n });\n }\n }\n catch (err) {\n throw ERROR_FACTORY.create(\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */, {\n errorInfo: err?.toString()\n });\n }\n}\n/**\n * Re-runs `operation` when it throws, with exponential backoff between attempts.\n * Rethrows the last error if all attempts fail.\n */\nasync function fetchWithExponentialRetry(operation, maxAttempts, baseBackoffMs) {\n let lastError;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await operation();\n }\n catch (err) {\n lastError = err;\n if (attempt < maxAttempts - 1) {\n const delayMs = baseBackoffMs * Math.pow(2, attempt);\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n }\n throw lastError;\n}\nfunction getEndpoint({ projectId }) {\n return `${ENDPOINT}/projects/${projectId}/registrations`;\n}\nasync function getHeaders({ appConfig, installations }) {\n const authToken = await installations.getToken();\n return new Headers({\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-goog-api-key': appConfig.apiKey,\n 'x-goog-firebase-installations-auth': `FIS ${authToken}`\n });\n}\n/**\n * Hostname for the registering web client (e.g. `www.example.com`), or the app name\n * (`appNameFallback`) when the scope cannot be resolved (e.g. some test environments).\n */\nfunction getRegistrationOrigin(swScope, appNameFallback) {\n try {\n if (/^[a-zA-Z][a-zA-Z\\d+\\-.]*:/.test(swScope)) {\n return new URL(swScope).host;\n }\n }\n catch {\n // Fall through to relative-scope handling.\n }\n try {\n if (typeof self !== 'undefined' && self.location?.href) {\n return new URL(swScope, self.location.origin).host;\n }\n }\n catch {\n // Fall through.\n }\n if (typeof self !== 'undefined' && self.location?.host) {\n return self.location.host;\n }\n return appNameFallback;\n}\nfunction getBody({ p256dh, auth, endpoint, vapidKey, swScope }, appNameFallback, includeSdkVersion) {\n const body = {\n web: {\n origin: getRegistrationOrigin(swScope, appNameFallback),\n endpoint,\n auth,\n p256dh\n }\n };\n if (includeSdkVersion) {\n // eslint-disable-next-line camelcase\n body.fcm_sdk_version = version;\n }\n if (vapidKey !== DEFAULT_VAPID_KEY) {\n body.web.applicationPubKey = vapidKey;\n }\n return body;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// UpdateRegistration will be called once every week.\nconst TOKEN_EXPIRATION_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\nasync function getTokenInternal(messaging) {\n const pushSubscription = await getPushSubscription$1(messaging.swRegistration, messaging.vapidKey);\n const subscriptionOptions = {\n vapidKey: messaging.vapidKey,\n swScope: messaging.swRegistration.scope,\n endpoint: pushSubscription.endpoint,\n auth: arrayToBase64(pushSubscription.getKey('auth')),\n p256dh: arrayToBase64(pushSubscription.getKey('p256dh'))\n };\n const tokenDetails = await dbGet(messaging.firebaseDependencies);\n if (!tokenDetails) {\n // No token, get a new one.\n return getNewToken(messaging.firebaseDependencies, subscriptionOptions);\n }\n else if (!isTokenValid(tokenDetails.subscriptionOptions, subscriptionOptions)) {\n // Invalid token, get a new one.\n try {\n await requestDeleteToken(messaging.firebaseDependencies, tokenDetails.token);\n }\n catch (e) {\n // Suppress errors because of #2364\n console.warn(e);\n }\n return getNewToken(messaging.firebaseDependencies, subscriptionOptions);\n }\n else if (Date.now() >= tokenDetails.createTime + TOKEN_EXPIRATION_MS) {\n // Weekly token refresh\n return updateToken(messaging, {\n token: tokenDetails.token,\n createTime: Date.now(),\n subscriptionOptions\n });\n }\n else {\n // Valid token, nothing to do.\n return tokenDetails.token;\n }\n}\n/**\n * Legacy getToken() path: there is a token row in IndexedDB. Revoke it with FCM, drop the row, and\n * clear any leftover FID registration metadata (apps may mix APIs).\n */\nasync function revokeLegacyFcmTokenAndClearCaches(messaging, tokenDetails) {\n await requestDeleteToken(messaging.firebaseDependencies, tokenDetails.token);\n await dbRemove(messaging.firebaseDependencies);\n await removeFidRegistrationBestEffort(messaging.firebaseDependencies);\n}\n/**\n * No legacy token row: the client may only have FID-based registration (register() flow). If so,\n * delete that registration on the server, always scrub local FID metadata, then surface\n * onUnregistered when we actually had an FID.\n */\nasync function revokeFidRegistrationIfStored(messaging) {\n const stored = await dbGetFidRegistration(messaging.firebaseDependencies).catch(() => undefined);\n const fid = stored?.fid;\n if (fid) {\n await requestDeleteRegistration(messaging.firebaseDependencies, fid);\n }\n await removeFidRegistrationBestEffort(messaging.firebaseDependencies);\n if (fid) {\n notifyOnUnregistered(messaging, fid);\n }\n}\n/**\n * Revokes the app's FCM registration: legacy token (getToken/deleteToken) and/or FID-based\n * registration (register/unregister), clears local caches, notifies onUnregistered when a stored\n * FID existed, then unsubscribes the push subscription when present.\n */\nasync function revokeRegistrationInternal(messaging) {\n const tokenDetails = await dbGet(messaging.firebaseDependencies);\n if (tokenDetails) {\n await revokeLegacyFcmTokenAndClearCaches(messaging, tokenDetails);\n }\n else {\n await revokeFidRegistrationIfStored(messaging);\n }\n // Unsubscribe from the push subscription.\n const pushSubscription = await messaging.swRegistration.pushManager.getSubscription();\n if (pushSubscription) {\n return pushSubscription.unsubscribe();\n }\n // If there's no SW, consider it a success.\n return true;\n}\nasync function updateToken(messaging, tokenDetails) {\n try {\n const updatedToken = await requestUpdateToken(messaging.firebaseDependencies, tokenDetails);\n const updatedTokenDetails = {\n ...tokenDetails,\n token: updatedToken,\n createTime: Date.now()\n };\n await dbSet(messaging.firebaseDependencies, updatedTokenDetails);\n return updatedToken;\n }\n catch (e) {\n throw e;\n }\n}\nasync function getNewToken(firebaseDependencies, subscriptionOptions) {\n const token = await requestGetToken(firebaseDependencies, subscriptionOptions);\n const tokenDetails = {\n token,\n createTime: Date.now(),\n subscriptionOptions\n };\n await dbSet(firebaseDependencies, tokenDetails);\n return tokenDetails.token;\n}\n/**\n * Gets a PushSubscription for the current user.\n */\nasync function getPushSubscription$1(swRegistration, vapidKey) {\n const subscription = await swRegistration.pushManager.getSubscription();\n if (subscription) {\n return subscription;\n }\n return swRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n // Chrome <= 75 doesn't support base64-encoded VAPID key. For backward compatibility, VAPID key\n // submitted to pushManager#subscribe must be of type Uint8Array.\n applicationServerKey: base64ToArray(vapidKey)\n });\n}\n/**\n * Checks if the saved tokenDetails object matches the configuration provided.\n */\nfunction isTokenValid(dbOptions, currentOptions) {\n const isVapidKeyEqual = currentOptions.vapidKey === dbOptions.vapidKey;\n const isEndpointEqual = currentOptions.endpoint === dbOptions.endpoint;\n const isAuthEqual = currentOptions.auth === dbOptions.auth;\n const isP256dhEqual = currentOptions.p256dh === dbOptions.p256dh;\n return isVapidKeyEqual && isEndpointEqual && isAuthEqual && isP256dhEqual;\n}\n/** Clears FID registration metadata; apps may mix legacy getToken() with FID register/unregister. */\nasync function removeFidRegistrationBestEffort(firebaseDependencies) {\n try {\n await dbRemoveFidRegistration(firebaseDependencies);\n }\n catch {\n // Ignore.\n }\n}\nfunction notifyOnRegistered(messaging, fid) {\n const handler = messaging.onRegisteredHandler;\n if (!handler) {\n return;\n }\n if (typeof handler === 'function') {\n handler(fid);\n }\n else {\n handler.next(fid);\n }\n}\nfunction notifyOnUnregistered(messaging, fid) {\n const handler = messaging.onUnregisteredHandler;\n if (!handler) {\n return;\n }\n if (typeof handler === 'function') {\n handler(fid);\n }\n else {\n handler.next(fid);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function registerDefaultSw(messaging) {\n try {\n messaging.swRegistration = await navigator.serviceWorker.register(DEFAULT_SW_PATH, {\n scope: DEFAULT_SW_SCOPE\n });\n // The timing when browser updates sw when sw has an update is unreliable from experiment. It\n // leads to version conflict when the SDK upgrades to a newer version in the main page, but sw\n // is stuck with the old version. For example,\n // https://github.com/firebase/firebase-js-sdk/issues/2590 The following line reliably updates\n // sw if there was an update.\n messaging.swRegistration.update().catch(() => {\n /* it is non blocking and we don't care if it failed */\n });\n await waitForRegistrationActive(messaging.swRegistration);\n }\n catch (e) {\n throw ERROR_FACTORY.create(\"failed-service-worker-registration\" /* ErrorCode.FAILED_DEFAULT_REGISTRATION */, {\n browserErrorMessage: e?.message\n });\n }\n}\n/**\n * Waits for registration to become active. MDN documentation claims that\n * a service worker registration should be ready to use after awaiting\n * navigator.serviceWorker.register() but that doesn't seem to be the case in\n * practice, causing the SDK to throw errors when calling\n * swRegistration.pushManager.subscribe() too soon after register(). The only\n * solution seems to be waiting for the service worker registration `state`\n * to become \"active\".\n */\nasync function waitForRegistrationActive(registration) {\n return new Promise((resolve, reject) => {\n const rejectTimeout = setTimeout(() => reject(new Error(`Service worker not registered after ${DEFAULT_REGISTRATION_TIMEOUT} ms`)), DEFAULT_REGISTRATION_TIMEOUT);\n const incomingSw = registration.installing || registration.waiting;\n if (registration.active) {\n clearTimeout(rejectTimeout);\n resolve();\n }\n else if (incomingSw) {\n incomingSw.onstatechange = ev => {\n if (ev.target?.state === 'activated') {\n incomingSw.onstatechange = null;\n clearTimeout(rejectTimeout);\n resolve();\n }\n };\n }\n else {\n clearTimeout(rejectTimeout);\n reject(new Error('No incoming service worker found.'));\n }\n });\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function updateSwReg(messaging, swRegistration) {\n if (!swRegistration && !messaging.swRegistration) {\n await registerDefaultSw(messaging);\n }\n if (!swRegistration && !!messaging.swRegistration) {\n return;\n }\n if (!(swRegistration instanceof ServiceWorkerRegistration)) {\n throw ERROR_FACTORY.create(\"invalid-sw-registration\" /* ErrorCode.INVALID_SW_REGISTRATION */);\n }\n messaging.swRegistration = swRegistration;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function updateVapidKey(messaging, vapidKey) {\n if (!!vapidKey) {\n messaging.vapidKey = vapidKey;\n }\n else if (!messaging.vapidKey) {\n messaging.vapidKey = DEFAULT_VAPID_KEY;\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Retries when CreateRegistration echoes an FID that does not match Installations.getId(). */\nconst FID_REGISTRATION_FID_MATCH_MAX_ATTEMPTS = 3;\n/**\n * For the new FID-based register path:\n * - Create (or refresh) an FCM Web registration in the backend via CreateRegistration.\n * - Use the FIS auth token produced by the installations instance (implicitly associated with FID).\n * - CreateRegistration must echo the installation in `name` (e.g.\n * `projects/{projectId}/registrations/{fid}`); it must match `expectedFid` from\n * Installations.getId(). On mismatch we refresh the auth token and retry, then fail with\n * `fid-registration-failed`.\n */\nasync function registerFcmRegistrationWithFid(messaging, expectedFid) {\n const pushSubscription = await getPushSubscription(messaging.swRegistration, messaging.vapidKey);\n const subscriptionOptions = {\n vapidKey: messaging.vapidKey,\n swScope: messaging.swRegistration.scope,\n endpoint: pushSubscription.endpoint,\n auth: arrayToBase64(pushSubscription.getKey('auth')),\n p256dh: arrayToBase64(pushSubscription.getKey('p256dh'))\n };\n const installations = messaging.firebaseDependencies.installations;\n for (let attempt = 0; attempt < FID_REGISTRATION_FID_MATCH_MAX_ATTEMPTS; attempt++) {\n const { responseFid } = await requestCreateRegistration(messaging.firebaseDependencies, subscriptionOptions);\n if (responseFid === expectedFid) {\n return;\n }\n // If CreateRegistration echoes an unexpected FID, the FIS auth token used for the request may\n // be stale relative to the installation the backend associates with the call. Force-refresh\n // the token before retrying so the next attempt uses credentials aligned with Installations.\n if (attempt < FID_REGISTRATION_FID_MATCH_MAX_ATTEMPTS - 1) {\n await installations.getToken(true);\n }\n }\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: 'CreateRegistration response FID does not match Firebase Installation ID'\n });\n}\nasync function getPushSubscription(swRegistration, vapidKey) {\n const subscription = await swRegistration.pushManager.getSubscription();\n if (subscription) {\n return subscription;\n }\n // Chrome/Firefox require applicationServerKey to be of type Uint8Array.\n return swRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n // `PushManager.subscribe` expects a `BufferSource`; `base64ToArray` produces a typed array.\n // Cast to satisfy the lib typing differences across TS DOM versions.\n applicationServerKey: base64ToArray(vapidKey)\n });\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst FID_REGISTRATION_REFRESH_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\n/**\n * Registers the app instance with FCM using its Firebase Installation ID (FID). The FID is\n * delivered via the `onRegistered` callback. Call this to establish an FID-based identity.\n * Once `onRegistered` provides an FID, instruct your backend to remove any legacy token\n * previously associated with this instance. The backend send API supports FID as a target.\n *\n * When called multiple times, `onRegistered` is invoked on each call with the current FID.\n * Backend registration sync runs on first register, when the FID changes, or on weekly refresh.\n *\n * @param messaging - The MessagingService instance.\n * @param options - Optional. Same options as getToken (vapidKey, serviceWorkerRegistration).\n */\nasync function register$1(messaging, options) {\n if (!navigator) {\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\n }\n if (Notification.permission === 'default') {\n await Notification.requestPermission();\n }\n if (Notification.permission !== 'granted') {\n throw ERROR_FACTORY.create(\"permission-blocked\" /* ErrorCode.PERMISSION_BLOCKED */);\n }\n if (!messaging.onRegisteredHandler) {\n throw ERROR_FACTORY.create(\"invalid-on-registered-handler\" /* ErrorCode.INVALID_ON_REGISTERED_HANDLER */);\n }\n await updateVapidKey(messaging, options?.vapidKey);\n await updateSwReg(messaging, options?.serviceWorkerRegistration);\n // Keep the queue alive after a failed register() so future calls can retry.\n const prev = messaging._registerNotifyChain.catch(() => { });\n messaging._registerNotifyChain = prev.then(async () => {\n const fid = await messaging.firebaseDependencies.installations.getId();\n const stored = await dbGetFidRegistration(messaging.firebaseDependencies);\n const now = Date.now();\n const shouldRefresh = !stored ||\n stored.fid !== fid ||\n now >= stored.lastRegisterTime + FID_REGISTRATION_REFRESH_MS;\n if (shouldRefresh) {\n await registerFcmRegistrationWithFid(messaging, fid);\n await dbSetFidRegistration(messaging.firebaseDependencies, {\n fid,\n lastRegisterTime: now,\n vapidKey: messaging.vapidKey\n });\n }\n const handler = messaging.onRegisteredHandler;\n if (!handler) {\n throw ERROR_FACTORY.create(\"invalid-on-registered-handler\" /* ErrorCode.INVALID_ON_REGISTERED_HANDLER */);\n }\n notifyOnRegistered(messaging, fid);\n });\n return messaging._registerNotifyChain;\n}\n\n/**\n * @license\n * Copyright 2026 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * When the Firebase Installation ID changes, re-run `register()` so FCM registration and\n * onRegistered run for the new FID. No-op if no onRegistered handler is set or the app\n * instance was never registered with FCM.\n */\nfunction subscribeFidChangeRegistration(messaging, installations) {\n return onIdChange(installations, () => {\n void (async () => {\n if (!messaging.onRegisteredHandler) {\n return;\n }\n const stored = await dbGetFidRegistration(messaging.firebaseDependencies);\n if (!stored) {\n return;\n }\n await register$1(messaging).catch(() => {\n // Best-effort: permission may be revoked or SW unavailable after FID rotation.\n });\n })();\n });\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction externalizePayload(internalPayload) {\n const payload = {\n from: internalPayload.from,\n // eslint-disable-next-line camelcase\n collapseKey: internalPayload.collapse_key,\n // eslint-disable-next-line camelcase\n messageId: internalPayload.fcmMessageId\n };\n propagateNotificationPayload(payload, internalPayload);\n propagateDataPayload(payload, internalPayload);\n propagateFcmOptions(payload, internalPayload);\n return payload;\n}\nfunction propagateNotificationPayload(payload, messagePayloadInternal) {\n if (!messagePayloadInternal.notification) {\n return;\n }\n payload.notification = {};\n const title = messagePayloadInternal.notification.title;\n if (!!title) {\n payload.notification.title = title;\n }\n const body = messagePayloadInternal.notification.body;\n if (!!body) {\n payload.notification.body = body;\n }\n const image = messagePayloadInternal.notification.image;\n if (!!image) {\n payload.notification.image = image;\n }\n const icon = messagePayloadInternal.notification.icon;\n if (!!icon) {\n payload.notification.icon = icon;\n }\n}\nfunction propagateDataPayload(payload, messagePayloadInternal) {\n if (!messagePayloadInternal.data) {\n return;\n }\n payload.data = messagePayloadInternal.data;\n}\nfunction propagateFcmOptions(payload, messagePayloadInternal) {\n // fcmOptions.link value is written into notification.click_action. see more in b/232072111\n if (!messagePayloadInternal.fcmOptions &&\n !messagePayloadInternal.notification?.click_action) {\n return;\n }\n payload.fcmOptions = {};\n const link = messagePayloadInternal.fcmOptions?.link ??\n messagePayloadInternal.notification?.click_action;\n if (!!link) {\n payload.fcmOptions.link = link;\n }\n // eslint-disable-next-line camelcase\n const analyticsLabel = messagePayloadInternal.fcmOptions?.analytics_label;\n if (!!analyticsLabel) {\n payload.fcmOptions.analyticsLabel = analyticsLabel;\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction isConsoleMessage(data) {\n // This message has a campaign ID, meaning it was sent using the Firebase Console.\n return typeof data === 'object' && !!data && CONSOLE_CAMPAIGN_ID in data;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n_mergeStrings('AzSCbw63g1R0nCw85jG8', 'Iaya3yLKwmgvh7cF0q4');\nfunction _mergeStrings(s1, s2) {\n const resultArray = [];\n for (let i = 0; i < s1.length; i++) {\n resultArray.push(s1.charAt(i));\n if (i < s2.length) {\n resultArray.push(s2.charAt(i));\n }\n }\n return resultArray.join('');\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction extractAppConfig(app) {\n if (!app || !app.options) {\n throw getMissingValueError('App Configuration Object');\n }\n if (!app.name) {\n throw getMissingValueError('App Name');\n }\n // Required app config keys\n const configKeys = [\n 'projectId',\n 'apiKey',\n 'appId',\n 'messagingSenderId'\n ];\n const { options } = app;\n for (const keyName of configKeys) {\n if (!options[keyName]) {\n throw getMissingValueError(keyName);\n }\n }\n return {\n appName: app.name,\n projectId: options.projectId,\n apiKey: options.apiKey,\n appId: options.appId,\n senderId: options.messagingSenderId\n };\n}\nfunction getMissingValueError(valueName) {\n return ERROR_FACTORY.create(\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */, {\n valueName\n });\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nclass MessagingService {\n constructor(app, installations, analyticsProvider) {\n // logging is only done with end user consent. Default to false.\n this.deliveryMetricsExportedToBigQueryEnabled = false;\n this.onBackgroundMessageHandler = null;\n this.onMessageHandler = null;\n /** Observer for the event that the app instance is registered with FCM via Firebase Installation ID (FID). */\n this.onRegisteredHandler = null;\n /** Observer for the event that the app instance is unregistered from FCM (FID no longer active). */\n this.onUnregisteredHandler = null;\n /**\n * Serializes the FID get + compare + notify step so concurrent register() calls\n * do not race each other.\n */\n this._registerNotifyChain = Promise.resolve();\n /** Unsubscribe from Installations `onIdChange` when messaging is deleted. */\n this._fidChangeUnsubscribe = null;\n this.logEvents = [];\n /**\n * Single source of truth for the logging loop lifecycle.\n *\n * `scheduled` holds the active timer id; `flushing` indicates an async dispatch\n * is in progress (prevents duplicate starts); `stopped` means idle.\n */\n this.logQueue = { state: 'stopped' };\n const appConfig = extractAppConfig(app);\n this.firebaseDependencies = {\n app,\n appConfig,\n installations,\n analyticsProvider\n };\n }\n _delete() {\n if (this._fidChangeUnsubscribe) {\n this._fidChangeUnsubscribe();\n this._fidChangeUnsubscribe = null;\n }\n if (this.logQueue.state === 'scheduled') {\n clearTimeout(this.logQueue.timerId);\n }\n this.logQueue = { state: 'stopped' };\n return Promise.resolve();\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function getToken$1(messaging, options) {\n if (!navigator) {\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\n }\n if (Notification.permission === 'default') {\n await Notification.requestPermission();\n }\n if (Notification.permission !== 'granted') {\n throw ERROR_FACTORY.create(\"permission-blocked\" /* ErrorCode.PERMISSION_BLOCKED */);\n }\n await updateVapidKey(messaging, options?.vapidKey);\n await updateSwReg(messaging, options?.serviceWorkerRegistration);\n return getTokenInternal(messaging);\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function logToScion(messaging, messageType, data) {\n const eventType = getEventType(messageType);\n const analytics = await messaging.firebaseDependencies.analyticsProvider.get();\n analytics.logEvent(eventType, {\n /* eslint-disable camelcase */\n message_id: data[CONSOLE_CAMPAIGN_ID],\n message_name: data[CONSOLE_CAMPAIGN_NAME],\n message_time: data[CONSOLE_CAMPAIGN_TIME],\n message_device_time: Math.floor(Date.now() / 1000)\n /* eslint-enable camelcase */\n });\n}\nfunction getEventType(messageType) {\n switch (messageType) {\n case MessageType.NOTIFICATION_CLICKED:\n return 'notification_open';\n case MessageType.PUSH_RECEIVED:\n return 'notification_foreground';\n default:\n throw new Error();\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function messageEventListener(messaging, event) {\n const internalPayload = event.data;\n if (!internalPayload.isFirebaseMessaging) {\n return;\n }\n if (messaging.onMessageHandler &&\n internalPayload.messageType === MessageType.PUSH_RECEIVED) {\n if (typeof messaging.onMessageHandler === 'function') {\n messaging.onMessageHandler(externalizePayload(internalPayload));\n }\n else {\n messaging.onMessageHandler.next(externalizePayload(internalPayload));\n }\n }\n if (messaging.onRegisteredHandler &&\n internalPayload.messageType === MessageType.FID_REGISTERED) {\n const fid = internalPayload.fid;\n if (typeof messaging.onRegisteredHandler === 'function') {\n messaging.onRegisteredHandler(fid);\n }\n else {\n messaging.onRegisteredHandler.next(fid);\n }\n }\n // Log to Scion if applicable\n const dataPayload = internalPayload.data;\n if (isConsoleMessage(dataPayload) &&\n dataPayload[CONSOLE_CAMPAIGN_ANALYTICS_ENABLED] === '1') {\n await logToScion(messaging, internalPayload.messageType, dataPayload);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst WindowMessagingFactory = (container) => {\n const messaging = new MessagingService(container.getProvider('app').getImmediate(), container.getProvider('installations-internal').getImmediate(), container.getProvider('analytics-internal'));\n navigator.serviceWorker.addEventListener('message', e => messageEventListener(messaging, e));\n messaging._fidChangeUnsubscribe = subscribeFidChangeRegistration(messaging, container.getProvider('installations').getImmediate());\n return messaging;\n};\nconst WindowMessagingInternalFactory = (container) => {\n const messaging = container\n .getProvider('messaging')\n .getImmediate();\n const messagingInternal = {\n getToken: (options) => getToken$1(messaging, options),\n register: (options) => register$1(messaging, options)\n };\n return messagingInternal;\n};\nfunction registerMessagingInWindow() {\n _registerComponent(new Component('messaging', WindowMessagingFactory, \"PUBLIC\" /* ComponentType.PUBLIC */));\n _registerComponent(new Component('messaging-internal', WindowMessagingInternalFactory, \"PRIVATE\" /* ComponentType.PRIVATE */));\n registerVersion(name, version);\n // BUILD_TARGET will be replaced by values like esm, cjs, etc during the compilation\n registerVersion(name, version, 'esm2020');\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Checks if all required APIs exist in the browser.\n * @returns a Promise that resolves to a boolean.\n *\n * @public\n */\nasync function isWindowSupported() {\n try {\n // This throws if open() is unsupported, so adding it to the conditional\n // statement below can cause an uncaught error.\n await validateIndexedDBOpenable();\n }\n catch (e) {\n return false;\n }\n // firebase-js-sdk/issues/2393 reveals that idb#open in Safari iframe and Firefox private browsing\n // might be prohibited to run. In these contexts, an error would be thrown during the messaging\n // instantiating phase, informing the developers to import/call isSupported for special handling.\n return (typeof window !== 'undefined' &&\n isIndexedDBAvailable() &&\n areCookiesEnabled() &&\n 'serviceWorker' in navigator &&\n 'PushManager' in window &&\n 'Notification' in window &&\n 'fetch' in window &&\n ServiceWorkerRegistration.prototype.hasOwnProperty('showNotification') &&\n PushSubscription.prototype.hasOwnProperty('getKey'));\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function deleteToken$1(messaging) {\n if (!navigator) {\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\n }\n if (!messaging.swRegistration) {\n await registerDefaultSw(messaging);\n }\n return revokeRegistrationInternal(messaging);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction onMessage$1(messaging, nextOrObserver) {\n if (!navigator) {\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\n }\n messaging.onMessageHandler = nextOrObserver;\n return () => {\n messaging.onMessageHandler = null;\n };\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Subscribes to an event that the app instance is registered with FCM via Firebase Installation ID (FID).\n * Use the FID passed to the callback to upload it to your application server.\n *\n * @param messaging - The {@link MessagingService} instance.\n * @param nextOrObserver - A function or observer object called when an FID is registered.\n * @returns Unsubscribe function to stop listening.\n */\nfunction onRegistered$1(messaging, nextOrObserver) {\n messaging.onRegisteredHandler = nextOrObserver;\n return () => {\n if (messaging.onRegisteredHandler === nextOrObserver) {\n messaging.onRegisteredHandler = null;\n }\n };\n}\n\n/**\n * @license\n * Copyright 2026 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Subscribes to an event that the app instance is unregistered from FCM so the FID is no longer active.\n * Use this to notify your backend to remove this FID to prevent 404 errors on send.\n *\n * @param messaging - The {@link MessagingService} instance.\n * @param nextOrObserver - A function or observer object called with the unregistered FID.\n * @returns Unsubscribe function to stop listening.\n */\nfunction onUnregistered$1(messaging, nextOrObserver) {\n messaging.onUnregisteredHandler = nextOrObserver;\n return () => {\n if (messaging.onUnregisteredHandler === nextOrObserver) {\n messaging.onUnregisteredHandler = null;\n }\n };\n}\n\n/**\n * @license\n * Copyright 2026 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Unregisters the app instance from FCM by deleting its FID-based registration.\n *\n * On success, triggers the `onUnregistered` callback (if set) with the unregistered FID.\n *\n * @param messaging - The MessagingService instance.\n */\nasync function unregister$1(messaging) {\n if (!navigator) {\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\n }\n // Prefer the last successfully registered FID from local metadata when available.\n const stored = await dbGetFidRegistration(messaging.firebaseDependencies).catch(() => undefined);\n const fid = stored?.fid ?? (await messaging.firebaseDependencies.installations.getId());\n await requestDeleteRegistration(messaging.firebaseDependencies, fid);\n // Best-effort local cleanup; still resolve even if schema is unavailable.\n try {\n await dbRemoveFidRegistration(messaging.firebaseDependencies);\n }\n catch {\n // Ignore.\n }\n // Best-effort cleanup of legacy token details created via getToken().\n try {\n await dbRemove(messaging.firebaseDependencies);\n }\n catch {\n // Ignore.\n }\n const handler = messaging.onUnregisteredHandler;\n if (!handler) {\n return;\n }\n if (typeof handler === 'function') {\n handler(fid);\n }\n else {\n handler.next(fid);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Retrieves a Firebase Cloud Messaging instance.\n *\n * @returns The Firebase Cloud Messaging instance associated with the provided firebase app.\n *\n * @public\n */\nfunction getMessagingInWindow(app = getApp()) {\n // Conscious decision to make this async check non-blocking during the messaging instance\n // initialization phase for performance consideration. An error would be thrown latter for\n // developer's information. Developers can then choose to import and call `isSupported` for\n // special handling.\n isWindowSupported().then(isSupported => {\n // If `isWindowSupported()` resolved, but returned false.\n if (!isSupported) {\n throw ERROR_FACTORY.create(\"unsupported-browser\" /* ErrorCode.UNSUPPORTED_BROWSER */);\n }\n }, _ => {\n // If `isWindowSupported()` rejected.\n throw ERROR_FACTORY.create(\"indexed-db-unsupported\" /* ErrorCode.INDEXED_DB_UNSUPPORTED */);\n });\n return _getProvider(getModularInstance(app), 'messaging').getImmediate();\n}\n/**\n * Subscribes the {@link Messaging} instance to push notifications. Returns a Firebase Cloud\n * Messaging registration token that can be used to send push messages to that {@link Messaging}\n * instance.\n *\n * If notification permission isn't already granted, this method asks the user for permission. The\n * returned promise rejects if the user does not allow the app to show notifications.\n *\n * @param messaging - The {@link Messaging} instance.\n * @param options - Provides an optional vapid key and an optional service worker registration.\n *\n * @returns The promise resolves with an FCM registration token.\n *\n * @deprecated Use {@link register} together with {@link onRegistered} for Firebase\n * Installation ID-based messaging instead of retrieving an FCM registration token with this API.\n *\n * @public\n */\nasync function getToken(messaging, options) {\n messaging = getModularInstance(messaging);\n return getToken$1(messaging, options);\n}\n/**\n * Deletes the registration token associated with this {@link Messaging} instance and unsubscribes\n * the {@link Messaging} instance from the push subscription.\n *\n * If there is no legacy registration token but the client has FID-based registration metadata\n * (from {@link register}), this deletes that registration on the server, clears local metadata, and\n * invokes {@link onUnregistered} with the removed FID when successful.\n *\n * @param messaging - The {@link Messaging} instance.\n *\n * @returns The promise resolves when the token has been successfully deleted.\n *\n * @deprecated Use {@link onUnregistered} to observe when the client is no longer\n * registered and update your backend accordingly, instead of explicitly deleting the\n * registration token with this API.\n *\n * @public\n */\nfunction deleteToken(messaging) {\n messaging = getModularInstance(messaging);\n return deleteToken$1(messaging);\n}\n/**\n * When a push message is received and the user is currently on a page for your origin, the\n * message is passed to the page and an `onMessage()` event is dispatched with the payload of\n * the push message.\n *\n *\n * @param messaging - The {@link Messaging} instance.\n * @param nextOrObserver - This function, or observer object with `next` defined,\n * is called when a message is received and the user is currently viewing your page.\n * @returns To stop listening for messages execute this returned function.\n *\n * @public\n */\nfunction onMessage(messaging, nextOrObserver) {\n messaging = getModularInstance(messaging);\n return onMessage$1(messaging, nextOrObserver);\n}\n/**\n * Registers the app instance with FCM using its Firebase Installation ID (FID). The FID is\n * delivered via the {@link onRegistered} callback, not as a return value. Call this to establish\n * an FID-based identity; once {@link onRegistered} provides an FID, instruct your backend to\n * remove any legacy token previously associated with this instance. The backend send API\n * supports FID as a target.\n *\n * @param messaging - The {@link Messaging} instance.\n * @param options - Optional. VAPID key and/or service worker registration (same as getToken).\n * @returns Promise that resolves when registration has been initiated; FID is delivered via onRegistered.\n *\n * @public\n */\nasync function register(messaging, options) {\n messaging = getModularInstance(messaging);\n return register$1(messaging, options);\n}\n/**\n * Unregisters the app instance from FCM by deleting its FID-based registration.\n * On success, triggers {@link onUnregistered} (if registered) with the unregistered FID.\n *\n * @param messaging - The {@link Messaging} instance.\n *\n * @public\n */\nasync function unregister(messaging) {\n messaging = getModularInstance(messaging);\n return unregister$1(messaging);\n}\n/**\n * Subscribes to an event that the app instance is registered with FCM via Firebase Installation ID (FID).\n * Use the FID passed to the callback to upload it to your application server. When you receive an FID\n * after calling {@link register}, instruct your backend to remove any legacy token for this instance.\n *\n * @param messaging - The {@link Messaging} instance.\n * @param nextOrObserver - A function or observer object called when an FID is registered.\n * @returns Unsubscribe function to stop listening.\n *\n * @public\n */\nfunction onRegistered(messaging, nextOrObserver) {\n messaging = getModularInstance(messaging);\n return onRegistered$1(messaging, nextOrObserver);\n}\n/**\n * Subscribes to an event that the app instance is unregistered from FCM (FID no longer active).\n * Use this to notify your backend to remove this FID to prevent 404 errors on send.\n *\n * @param messaging - The {@link Messaging} instance.\n * @param nextOrObserver - A function or observer object called with the unregistered FID.\n * @returns Unsubscribe function to stop listening.\n *\n * @public\n */\nfunction onUnregistered(messaging, nextOrObserver) {\n messaging = getModularInstance(messaging);\n return onUnregistered$1(messaging, nextOrObserver);\n}\n\n/**\n * The Firebase Cloud Messaging Web SDK.\n * This SDK does not work in a Node.js environment.\n *\n * @packageDocumentation\n */\nregisterMessagingInWindow();\n\nexport { deleteToken, getMessagingInWindow as getMessaging, getToken, isWindowSupported as isSupported, onMessage, onRegistered, onUnregistered, register, unregister };\n//# sourceMappingURL=index.esm.js.map\n","const getDefaultsFromPostinstall = () => (undefined);\nexport { getDefaultsFromPostinstall };","import { registerVersion } from '@firebase/app';\nexport * from '@firebase/app';\n\nvar name = \"firebase\";\nvar version = \"12.15.0\";\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nregisterVersion(name, version, 'app');\n//# sourceMappingURL=index.esm.js.map\n","export * from '@firebase/messaging';\n//# sourceMappingURL=index.esm.js.map\n","import { w as wrap, r as replaceTraps } from './wrap-idb-value.js';\nexport { u as unwrap, w as wrap } from './wrap-idb-value.js';\n\n/**\n * Open a database.\n *\n * @param name Name of the database.\n * @param version Schema version.\n * @param callbacks Additional callbacks.\n */\nfunction openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {\n const request = indexedDB.open(name, version);\n const openPromise = wrap(request);\n if (upgrade) {\n request.addEventListener('upgradeneeded', (event) => {\n upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction), event);\n });\n }\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event.newVersion, event));\n }\n openPromise\n .then((db) => {\n if (terminated)\n db.addEventListener('close', () => terminated());\n if (blocking) {\n db.addEventListener('versionchange', (event) => blocking(event.oldVersion, event.newVersion, event));\n }\n })\n .catch(() => { });\n return openPromise;\n}\n/**\n * Delete a database.\n *\n * @param name Name of the database.\n */\nfunction deleteDB(name, { blocked } = {}) {\n const request = indexedDB.deleteDatabase(name);\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event));\n }\n return wrap(request).then(() => undefined);\n}\n\nconst readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'];\nconst writeMethods = ['put', 'add', 'delete', 'clear'];\nconst cachedMethods = new Map();\nfunction getMethod(target, prop) {\n if (!(target instanceof IDBDatabase &&\n !(prop in target) &&\n typeof prop === 'string')) {\n return;\n }\n if (cachedMethods.get(prop))\n return cachedMethods.get(prop);\n const targetFuncName = prop.replace(/FromIndex$/, '');\n const useIndex = prop !== targetFuncName;\n const isWrite = writeMethods.includes(targetFuncName);\n if (\n // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.\n !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) ||\n !(isWrite || readMethods.includes(targetFuncName))) {\n return;\n }\n const method = async function (storeName, ...args) {\n // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :(\n const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly');\n let target = tx.store;\n if (useIndex)\n target = target.index(args.shift());\n // Must reject if op rejects.\n // If it's a write operation, must reject if tx.done rejects.\n // Must reject with op rejection first.\n // Must resolve with op value.\n // Must handle both promises (no unhandled rejections)\n return (await Promise.all([\n target[targetFuncName](...args),\n isWrite && tx.done,\n ]))[0];\n };\n cachedMethods.set(prop, method);\n return method;\n}\nreplaceTraps((oldTraps) => ({\n ...oldTraps,\n get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),\n has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop),\n}));\n\nexport { deleteDB, openDB };\n","const instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);\n\nlet idbProxyableTypes;\nlet cursorAdvanceMethods;\n// This is a function to prevent it throwing up in node environments.\nfunction getIdbProxyableTypes() {\n return (idbProxyableTypes ||\n (idbProxyableTypes = [\n IDBDatabase,\n IDBObjectStore,\n IDBIndex,\n IDBCursor,\n IDBTransaction,\n ]));\n}\n// This is a function to prevent it throwing up in node environments.\nfunction getCursorAdvanceMethods() {\n return (cursorAdvanceMethods ||\n (cursorAdvanceMethods = [\n IDBCursor.prototype.advance,\n IDBCursor.prototype.continue,\n IDBCursor.prototype.continuePrimaryKey,\n ]));\n}\nconst cursorRequestMap = new WeakMap();\nconst transactionDoneMap = new WeakMap();\nconst transactionStoreNamesMap = new WeakMap();\nconst transformCache = new WeakMap();\nconst reverseTransformCache = new WeakMap();\nfunction promisifyRequest(request) {\n const promise = new Promise((resolve, reject) => {\n const unlisten = () => {\n request.removeEventListener('success', success);\n request.removeEventListener('error', error);\n };\n const success = () => {\n resolve(wrap(request.result));\n unlisten();\n };\n const error = () => {\n reject(request.error);\n unlisten();\n };\n request.addEventListener('success', success);\n request.addEventListener('error', error);\n });\n promise\n .then((value) => {\n // Since cursoring reuses the IDBRequest (*sigh*), we cache it for later retrieval\n // (see wrapFunction).\n if (value instanceof IDBCursor) {\n cursorRequestMap.set(value, request);\n }\n // Catching to avoid \"Uncaught Promise exceptions\"\n })\n .catch(() => { });\n // This mapping exists in reverseTransformCache but doesn't doesn't exist in transformCache. This\n // is because we create many promises from a single IDBRequest.\n reverseTransformCache.set(promise, request);\n return promise;\n}\nfunction cacheDonePromiseForTransaction(tx) {\n // Early bail if we've already created a done promise for this transaction.\n if (transactionDoneMap.has(tx))\n return;\n const done = new Promise((resolve, reject) => {\n const unlisten = () => {\n tx.removeEventListener('complete', complete);\n tx.removeEventListener('error', error);\n tx.removeEventListener('abort', error);\n };\n const complete = () => {\n resolve();\n unlisten();\n };\n const error = () => {\n reject(tx.error || new DOMException('AbortError', 'AbortError'));\n unlisten();\n };\n tx.addEventListener('complete', complete);\n tx.addEventListener('error', error);\n tx.addEventListener('abort', error);\n });\n // Cache it for later retrieval.\n transactionDoneMap.set(tx, done);\n}\nlet idbProxyTraps = {\n get(target, prop, receiver) {\n if (target instanceof IDBTransaction) {\n // Special handling for transaction.done.\n if (prop === 'done')\n return transactionDoneMap.get(target);\n // Polyfill for objectStoreNames because of Edge.\n if (prop === 'objectStoreNames') {\n return target.objectStoreNames || transactionStoreNamesMap.get(target);\n }\n // Make tx.store return the only store in the transaction, or undefined if there are many.\n if (prop === 'store') {\n return receiver.objectStoreNames[1]\n ? undefined\n : receiver.objectStore(receiver.objectStoreNames[0]);\n }\n }\n // Else transform whatever we get back.\n return wrap(target[prop]);\n },\n set(target, prop, value) {\n target[prop] = value;\n return true;\n },\n has(target, prop) {\n if (target instanceof IDBTransaction &&\n (prop === 'done' || prop === 'store')) {\n return true;\n }\n return prop in target;\n },\n};\nfunction replaceTraps(callback) {\n idbProxyTraps = callback(idbProxyTraps);\n}\nfunction wrapFunction(func) {\n // Due to expected object equality (which is enforced by the caching in `wrap`), we\n // only create one new func per func.\n // Edge doesn't support objectStoreNames (booo), so we polyfill it here.\n if (func === IDBDatabase.prototype.transaction &&\n !('objectStoreNames' in IDBTransaction.prototype)) {\n return function (storeNames, ...args) {\n const tx = func.call(unwrap(this), storeNames, ...args);\n transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);\n return wrap(tx);\n };\n }\n // Cursor methods are special, as the behaviour is a little more different to standard IDB. In\n // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the\n // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense\n // with real promises, so each advance methods returns a new promise for the cursor object, or\n // undefined if the end of the cursor has been reached.\n if (getCursorAdvanceMethods().includes(func)) {\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n func.apply(unwrap(this), args);\n return wrap(cursorRequestMap.get(this));\n };\n }\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n return wrap(func.apply(unwrap(this), args));\n };\n}\nfunction transformCachableValue(value) {\n if (typeof value === 'function')\n return wrapFunction(value);\n // This doesn't return, it just creates a 'done' promise for the transaction,\n // which is later returned for transaction.done (see idbObjectHandler).\n if (value instanceof IDBTransaction)\n cacheDonePromiseForTransaction(value);\n if (instanceOfAny(value, getIdbProxyableTypes()))\n return new Proxy(value, idbProxyTraps);\n // Return the same value back if we're not going to transform it.\n return value;\n}\nfunction wrap(value) {\n // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because\n // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached.\n if (value instanceof IDBRequest)\n return promisifyRequest(value);\n // If we've already transformed this value before, reuse the transformed value.\n // This is faster, but it also provides object equality.\n if (transformCache.has(value))\n return transformCache.get(value);\n const newValue = transformCachableValue(value);\n // Not all types are transformed.\n // These may be primitive types, so they can't be WeakMap keys.\n if (newValue !== value) {\n transformCache.set(value, newValue);\n reverseTransformCache.set(newValue, value);\n }\n return newValue;\n}\nconst unwrap = (value) => reverseTransformCache.get(value);\n\nexport { reverseTransformCache as a, instanceOfAny as i, replaceTraps as r, unwrap as u, wrap as w };\n","const DoubleUnicodePrefixReg = /^[\\uD800-\\uDBFF]$/;\r\nconst DoubleUnicodeSuffixReg = /^[\\uDC00-\\uDFFF]$/;\r\nconst DoubleUnicodeReg = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\r\nvar Probability;\r\n(function (Probability) {\r\n Probability[Probability[\"Unknown\"] = 1e-13] = \"Unknown\";\r\n Probability[Probability[\"Rule\"] = 1e-12] = \"Rule\";\r\n Probability[Probability[\"DICT\"] = 2e-8] = \"DICT\";\r\n Probability[Probability[\"Surname\"] = 1] = \"Surname\";\r\n Probability[Probability[\"Custom\"] = 1] = \"Custom\";\r\n})(Probability || (Probability = {}));\r\nconst Priority = {\r\n Normal: 1,\r\n Surname: 10,\r\n Custom: 100,\r\n};\n\nexport { DoubleUnicodePrefixReg, DoubleUnicodeReg, DoubleUnicodeSuffixReg, Priority, Probability };\n","import { PatternsNormal } from '../../data/patterns.mjs';\nexport { PatternsNormal } from '../../data/patterns.mjs';\nimport { maxProbability } from './max-probability.mjs';\nimport { minTokenization } from './min-tokenization.mjs';\nimport { reverseMaxMatch } from './reverse-max-match.mjs';\nimport { Priority } from '../constant.mjs';\nimport { splitString } from '../utils.mjs';\n\nvar TokenizationAlgorithm;\r\n(function (TokenizationAlgorithm) {\r\n TokenizationAlgorithm[TokenizationAlgorithm[\"ReverseMaxMatch\"] = 1] = \"ReverseMaxMatch\";\r\n TokenizationAlgorithm[TokenizationAlgorithm[\"MaxProbability\"] = 2] = \"MaxProbability\";\r\n TokenizationAlgorithm[TokenizationAlgorithm[\"MinTokenization\"] = 3] = \"MinTokenization\";\r\n})(TokenizationAlgorithm || (TokenizationAlgorithm = {}));\r\nclass TrieNode {\r\n constructor(parent, key = \"\") {\r\n this.children = new Map();\r\n this.fail = null;\r\n this.patterns = [];\r\n this.parent = parent;\r\n this.key = key;\r\n }\r\n}\r\nclass AC {\r\n constructor() {\r\n this.dictMap = new Map();\r\n this.queues = [];\r\n this.root = new TrieNode(null);\r\n }\r\n build(patternList) {\r\n this.buildTrie(patternList);\r\n this.buildFailPointer();\r\n }\r\n // 构建 trie 树\r\n buildTrie(patternList) {\r\n for (let pattern of patternList) {\r\n const zhChars = splitString(pattern.zh);\r\n let cur = this.root;\r\n for (let i = 0; i < zhChars.length; i++) {\r\n let c = zhChars[i];\r\n if (!cur.children.has(c)) {\r\n const trieNode = new TrieNode(cur, c);\r\n cur.children.set(c, trieNode);\r\n this.addNodeToQueues(trieNode, i + 1);\r\n }\r\n cur = cur.children.get(c);\r\n }\r\n this.insertPattern(cur.patterns, pattern);\r\n pattern.node = cur;\r\n this.addPatternToDictMap(pattern);\r\n }\r\n }\r\n // 构建失败指针\r\n buildFailPointer() {\r\n let queue = [];\r\n let queueIndex = 0;\r\n this.queues.forEach((_queue) => {\r\n queue = queue.concat(_queue);\r\n });\r\n this.queues = [];\r\n while (queue.length > queueIndex) {\r\n let node = queue[queueIndex++];\r\n let failNode = node.parent && node.parent.fail;\r\n let key = node.key;\r\n while (failNode && !failNode.children.has(key)) {\r\n failNode = failNode.fail;\r\n }\r\n if (!failNode) {\r\n node.fail = this.root;\r\n }\r\n else {\r\n node.fail = failNode.children.get(key);\r\n }\r\n }\r\n }\r\n // 将 pattern 添加到 dictMap 中\r\n addPatternToDictMap(pattern) {\r\n if (!this.dictMap.has(pattern.dict)) {\r\n this.dictMap.set(pattern.dict, new Set());\r\n }\r\n this.dictMap.get(pattern.dict).add(pattern);\r\n }\r\n addNodeToQueues(trieNode, depth) {\r\n if (!this.queues[depth]) {\r\n this.queues[depth] = [];\r\n }\r\n this.queues[depth].push(trieNode);\r\n }\r\n // 按照优先级插入 pattern\r\n insertPattern(patterns, pattern) {\r\n for (let i = patterns.length - 1; i >= 0; i--) {\r\n const _pattern = patterns[i];\r\n if (pattern.priority === _pattern.priority &&\r\n pattern.probability >= _pattern.probability) {\r\n patterns[i + 1] = _pattern;\r\n }\r\n else if (pattern.priority > _pattern.priority) {\r\n patterns[i + 1] = _pattern;\r\n }\r\n else {\r\n patterns[i + 1] = pattern;\r\n return;\r\n }\r\n }\r\n patterns[0] = pattern;\r\n }\r\n removeDict(dictName) {\r\n if (this.dictMap.has(dictName)) {\r\n const set = this.dictMap.get(dictName);\r\n set.forEach((pattern) => {\r\n pattern.node.patterns = pattern.node.patterns.filter((_pattern) => _pattern !== pattern);\r\n });\r\n this.dictMap.delete(dictName);\r\n }\r\n }\r\n // 搜索字符串返回匹配的模式串\r\n match(text, surname, zhChars = splitString(text)) {\r\n let cur = this.root;\r\n let result = [];\r\n for (let i = 0; i < zhChars.length; i++) {\r\n let c = zhChars[i];\r\n let next = cur.children.size ? cur.children.get(c) : undefined;\r\n while (!next && cur !== this.root) {\r\n if (!cur.fail) {\r\n cur = this.root;\r\n break;\r\n }\r\n cur = cur.fail;\r\n next = cur.children.size ? cur.children.get(c) : undefined;\r\n }\r\n if (next) {\r\n cur = next;\r\n const pattern = cur.patterns.find((item) => {\r\n if (surname === \"off\") {\r\n return item.priority !== Priority.Surname;\r\n }\r\n else if (surname === \"head\") {\r\n return item.length - 1 - i === 0;\r\n }\r\n else {\r\n return true;\r\n }\r\n });\r\n if (pattern) {\r\n result.push(Object.assign(Object.assign({}, pattern), { index: i - pattern.length + 1 }));\r\n }\r\n let failNode = cur.fail;\r\n while (failNode !== null) {\r\n const pattern = failNode.patterns.find((item) => {\r\n if (surname === \"off\") {\r\n return item.priority !== Priority.Surname;\r\n }\r\n else if (surname === \"head\") {\r\n return item.length - 1 - i === 0;\r\n }\r\n else {\r\n return true;\r\n }\r\n });\r\n if (pattern) {\r\n result.push(Object.assign(Object.assign({}, pattern), { index: i - pattern.length + 1 }));\r\n }\r\n failNode = failNode.fail;\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n search(text, surname, algorithm = 2 /* TokenizationAlgorithm.MaxProbability */, zhChars = splitString(text)) {\r\n const patterns = this.match(text, surname, zhChars);\r\n if (algorithm === 1 /* TokenizationAlgorithm.ReverseMaxMatch */) {\r\n return reverseMaxMatch(patterns);\r\n }\r\n else if (algorithm === 3 /* TokenizationAlgorithm.MinTokenization */) {\r\n return minTokenization(patterns, zhChars.length);\r\n }\r\n return maxProbability(patterns, zhChars.length);\r\n }\r\n}\r\nlet acBuilt = false;\r\nconst acTree = new AC();\r\nfunction ensureAcBuilt() {\r\n if (!acBuilt) {\r\n acTree.build(PatternsNormal);\r\n acBuilt = true;\r\n }\r\n}\r\nfunction scheduleAcBuild() {\r\n if (typeof requestIdleCallback === \"function\") {\r\n requestIdleCallback(() => ensureAcBuilt());\r\n }\r\n else {\r\n setTimeout(ensureAcBuilt, 0);\r\n }\r\n}\r\nscheduleAcBuild();\n\nexport { AC, TokenizationAlgorithm, acTree, ensureAcBuilt, scheduleAcBuild };\n","import { Priority } from '../constant.mjs';\n\n// 根据 probability 和 decimal 获取两个概率中最大的\r\nfunction getMaxProbability(a, b) {\r\n if (!a) {\r\n return b;\r\n }\r\n if (a.decimal < b.decimal) {\r\n return a;\r\n }\r\n else if (a.decimal === b.decimal) {\r\n return a.probability > b.probability ? a : b;\r\n }\r\n else {\r\n return b;\r\n }\r\n}\r\n// probability 小于 1e-300 时,为防止小数溢出需要进位\r\nfunction checkDecimal(prob) {\r\n if (prob.probability < 1e-300) {\r\n prob.probability *= 1e300;\r\n prob.decimal += 1;\r\n }\r\n}\r\nfunction getPatternDecimal(pattern) {\r\n if (pattern.priority === Priority.Custom) {\r\n return -(pattern.length * pattern.length * 100);\r\n }\r\n if (pattern.priority === Priority.Surname) {\r\n return -(pattern.length * pattern.length * 10);\r\n }\r\n return 0;\r\n}\r\n// 最大概率算法\r\nfunction maxProbability(patterns, length) {\r\n const dp = [];\r\n const terminalDP = {\r\n probability: 1,\r\n decimal: 0,\r\n nextIndex: length,\r\n };\r\n let patternIndex = patterns.length - 1;\r\n let pattern = patterns[patternIndex];\r\n // 按照长度去除重叠词\r\n for (let i = length - 1; i >= 0; i--) {\r\n // suffix\r\n const suffixDP = i + 1 >= length ? terminalDP : dp[i + 1];\r\n const nextIndex = suffixDP.pattern ? i + 1 : suffixDP.nextIndex;\r\n while (pattern && pattern.index + pattern.length - 1 === i) {\r\n const startIndex = pattern.index;\r\n const curDP = {\r\n probability: pattern.probability * suffixDP.probability,\r\n decimal: suffixDP.decimal + getPatternDecimal(pattern),\r\n pattern,\r\n nextIndex,\r\n };\r\n checkDecimal(curDP);\r\n dp[startIndex] = getMaxProbability(dp[startIndex], curDP);\r\n pattern = patterns[--patternIndex];\r\n }\r\n // dp[i]\r\n const iDP = {\r\n probability: 1e-13 /* Probability.Unknown */ * suffixDP.probability,\r\n decimal: 0,\r\n nextIndex,\r\n };\r\n checkDecimal(iDP);\r\n dp[i] = getMaxProbability(dp[i], iDP);\r\n }\r\n const result = [];\r\n let index = 0;\r\n while (index < length) {\r\n const item = dp[index];\r\n if (item.pattern) {\r\n result.push(item.pattern);\r\n }\r\n index = item.nextIndex;\r\n }\r\n return result;\r\n}\n\nexport { maxProbability };\n","import { Priority } from '../constant.mjs';\n\n// 取最少分词数\r\nfunction getMinCount(a, b) {\r\n if (!a) {\r\n return b;\r\n }\r\n return a.count <= b.count ? a : b;\r\n}\r\nfunction getPatternCount(pattern) {\r\n if (pattern.priority === Priority.Custom) {\r\n return -(pattern.length * pattern.length * 100000);\r\n }\r\n if (pattern.priority === Priority.Surname) {\r\n return -(pattern.length * pattern.length * 100);\r\n }\r\n return 1;\r\n}\r\n// 最少分词算法\r\nfunction minTokenization(patterns, length) {\r\n const dp = [];\r\n let patternIndex = patterns.length - 1;\r\n let pattern = patterns[patternIndex];\r\n // 按照长度去除重叠词\r\n for (let i = length - 1; i >= 0; i--) {\r\n // suffix\r\n const suffixDP = i + 1 >= length\r\n ? { count: 0, patterns: [] }\r\n : dp[i + 1];\r\n while (pattern && pattern.index + pattern.length - 1 === i) {\r\n const startIndex = pattern.index;\r\n const curDP = {\r\n count: getPatternCount(pattern) + suffixDP.count,\r\n patterns: suffixDP.patterns,\r\n concatPattern: pattern\r\n };\r\n dp[startIndex] = getMinCount(dp[startIndex], curDP);\r\n pattern = patterns[--patternIndex];\r\n }\r\n // dp[i]\r\n const iDP = {\r\n count: 1 + suffixDP.count,\r\n patterns: suffixDP.patterns,\r\n };\r\n dp[i] = getMinCount(dp[i], iDP);\r\n if (dp[i].concatPattern) {\r\n dp[i].patterns = dp[i].patterns.concat(dp[i].concatPattern);\r\n dp[i].concatPattern = undefined;\r\n delete dp[i + 1];\r\n }\r\n }\r\n return dp[0].patterns.reverse();\r\n}\n\nexport { minTokenization };\n","// 判断 pre 是否可以被忽略的重叠词\r\nfunction isIgnorablePattern(cur, pre) {\r\n // 未重叠\r\n if (pre.index + pre.length <= cur.index) {\r\n return false;\r\n }\r\n if (pre.priority > cur.priority) {\r\n return false;\r\n }\r\n if (pre.priority === cur.priority && pre.length > cur.length) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n// 逆向最大匹配算法\r\nfunction reverseMaxMatch(patterns) {\r\n const filteredArr = [];\r\n // 按照长度去除重叠词\r\n for (let i = patterns.length - 1; i >= 0;) {\r\n const { index } = patterns[i];\r\n let j = i - 1;\r\n while (j >= 0 && isIgnorablePattern(patterns[i], patterns[j])) {\r\n j--;\r\n }\r\n if (j < 0 || patterns[j].index + patterns[j].length <= index) {\r\n filteredArr.push(patterns[i]);\r\n }\r\n i = j;\r\n }\r\n return filteredArr.reverse();\r\n}\n\nexport { reverseMaxMatch };\n","import { DoubleUnicodeReg, DoubleUnicodePrefixReg, DoubleUnicodeSuffixReg } from './constant.mjs';\n\nfunction stringLength(text) {\r\n var _a;\r\n return text.length - (((_a = text.match(DoubleUnicodeReg)) === null || _a === void 0 ? void 0 : _a.length) || 0);\r\n}\r\n// 双音节字符处理\r\nfunction splitString(text) {\r\n DoubleUnicodeReg.lastIndex = 0;\r\n if (!DoubleUnicodeReg.test(text)) {\r\n return text.split(\"\");\r\n }\r\n const result = [];\r\n let i = 0;\r\n while (i < text.length) {\r\n const char = text[i];\r\n if (DoubleUnicodePrefixReg.test(char) &&\r\n DoubleUnicodeSuffixReg.test(text[i + 1])) {\r\n result.push(text.substring(i, i + 2));\r\n i += 2;\r\n }\r\n else {\r\n result.push(char);\r\n i += 1;\r\n }\r\n }\r\n return result;\r\n}\r\nclass FastDictFactory {\r\n constructor() {\r\n this.NumberDICT = [];\r\n this.StringDICT = new Map();\r\n }\r\n get(word) {\r\n if (word.length > 1) {\r\n return this.StringDICT.get(word);\r\n }\r\n else {\r\n const code = word.charCodeAt(0);\r\n return this.NumberDICT[code];\r\n }\r\n }\r\n set(word, pinyin) {\r\n if (word.length > 1) {\r\n this.StringDICT.set(word, pinyin);\r\n }\r\n else {\r\n const code = word.charCodeAt(0);\r\n this.NumberDICT[code] = pinyin;\r\n }\r\n }\r\n clear() {\r\n this.NumberDICT = [];\r\n this.StringDICT.clear();\r\n }\r\n}\n\nexport { FastDictFactory, splitString, stringLength };\n","import { FastDictFactory } from '../../common/utils.mjs';\n\nconst customMultipleDict = new FastDictFactory();\r\nconst customPolyphonicDict = new FastDictFactory();\n\nexport { customMultipleDict, customPolyphonicDict };\n","import DICT1 from '../../data/dict1.mjs';\nimport { customMultipleDict } from '../custom/state.mjs';\nimport Surnames from '../../data/surname.mjs';\n\n/** 获取单字的全部拼音,供 pinyin、polyphonic 和 match 复用。 */\r\nconst getAllPinyin = (char, surname = \"off\") => {\r\n let pinyin = DICT1.get(char) ? DICT1.get(char).split(\" \") : [];\r\n if (customMultipleDict.get(char)) {\r\n pinyin = customMultipleDict.get(char).split(\" \");\r\n }\r\n else if (surname !== \"off\") {\r\n const surnamePinyin = Surnames[char];\r\n if (surnamePinyin) {\r\n pinyin = [surnamePinyin].concat(pinyin.filter((py) => py !== surnamePinyin));\r\n }\r\n }\r\n return pinyin;\r\n};\n\nexport { getAllPinyin };\n","import { InitialList, doubleFinalList, SpecialInitialList, SpecialFinalList, SpecialFinalMap, toneSandhiList, toneSandhiIgnoreSuffix, toneSandhiMap } from '../../data/special.mjs';\nimport DICT1 from '../../data/dict1.mjs';\nimport { getAllPinyin } from './all.mjs';\nexport { getAllPinyin } from './all.mjs';\nimport { ensureAcBuilt, acTree } from '../../common/segmentit/index.mjs';\nimport { Priority } from '../../common/constant.mjs';\nimport { splitString } from '../../common/utils.mjs';\nimport { getTraditionalDict } from '../traditional/index.mjs';\n\nconst getSingleWordPinyin = (char) => {\r\n const pinyin = DICT1.get(char);\r\n // 若查到, 则返回第一个拼音; 若未查到, 返回原字符\r\n if (!pinyin)\r\n return char;\r\n const index = pinyin.indexOf(\" \");\r\n return index === -1 ? pinyin : pinyin.slice(0, index);\r\n};\r\nconst getTraditionalWords = (word) => {\r\n const traditionalWords = [];\r\n const traditionalDict = getTraditionalDict();\r\n for (let i = 0; i < word.length; i++) {\r\n const key = word[i];\r\n const code = key.charCodeAt(0);\r\n if (traditionalDict[code]) {\r\n traditionalWords[i] = traditionalDict[code];\r\n }\r\n else {\r\n traditionalWords[i] = key;\r\n }\r\n }\r\n return traditionalWords.join(\"\");\r\n};\r\nconst getPinyin = (word, list, surname, segmentit, traditional, zhChars = splitString(word)) => {\r\n ensureAcBuilt();\r\n const searchWord = traditional ? getTraditionalWords(word) : word;\r\n const searchChars = traditional ? splitString(searchWord) : zhChars;\r\n const matches = acTree.search(searchWord, surname, segmentit, searchChars);\r\n let matchIndex = 0;\r\n const processFuncs = getProcessFuncs(word);\r\n for (let i = 0; i < zhChars.length;) {\r\n const match = matches[matchIndex];\r\n if (match && i === match.index) {\r\n if (match.length === 1 && match.priority <= Priority.Normal) {\r\n const char = zhChars[i];\r\n match.zh = char;\r\n let pinyin = \"\";\r\n pinyin = processSepecialPinyin(char, zhChars[i - 1], zhChars[i + 1], processFuncs);\r\n list[i] = {\r\n origin: char,\r\n result: pinyin,\r\n isZh: pinyin !== char,\r\n originPinyin: pinyin,\r\n };\r\n i++;\r\n matchIndex++;\r\n continue;\r\n }\r\n const pinyins = match.pinyin.split(\" \");\r\n let pinyinIndex = 0;\r\n if (traditional) {\r\n match.zh = zhChars\r\n .slice(match.index, match.index + match.length)\r\n .join(\"\");\r\n }\r\n for (let j = 0; j < match.length; j++) {\r\n list[i + j] = {\r\n origin: zhChars[j + match.index],\r\n result: pinyins[pinyinIndex] || \"\",\r\n isZh: true,\r\n originPinyin: pinyins[pinyinIndex] || \"\",\r\n };\r\n pinyinIndex++;\r\n }\r\n i += match.length;\r\n matchIndex++;\r\n }\r\n else {\r\n const char = zhChars[i];\r\n let pinyin = \"\";\r\n pinyin = processSepecialPinyin(char, zhChars[i - 1], zhChars[i + 1], processFuncs);\r\n list[i] = {\r\n origin: char,\r\n result: pinyin,\r\n isZh: pinyin !== char,\r\n originPinyin: pinyin,\r\n };\r\n i++;\r\n }\r\n }\r\n return { list, matches };\r\n};\r\nconst getPinyinWithoutTone = (pinyin) => {\r\n return pinyin\r\n .replace(/(ā|á|ǎ|à)/g, \"a\")\r\n .replace(/(ō|ó|ǒ|ò)/g, \"o\")\r\n .replace(/(ē|é|ě|è)/g, \"e\")\r\n .replace(/(ī|í|ǐ|ì)/g, \"i\")\r\n .replace(/(ū|ú|ǔ|ù)/g, \"u\")\r\n .replace(/(ǖ|ǘ|ǚ|ǜ)/g, \"ü\")\r\n .replace(/(n̄|ń|ň|ǹ)/g, \"n\")\r\n .replace(/(m̄|ḿ|m̌|m̀)/g, \"m\")\r\n .replace(/(ê̄|ế|ê̌|ề)/g, \"ê\");\r\n};\r\nconst getMultiplePinyin = (word, surname = \"off\") => {\r\n let pinyin = getAllPinyin(word, surname);\r\n if (pinyin.length > 0) {\r\n return pinyin.map((value) => ({\r\n origin: word,\r\n result: value,\r\n isZh: true,\r\n originPinyin: value,\r\n }));\r\n }\r\n else {\r\n return [\r\n {\r\n origin: word,\r\n result: word,\r\n isZh: false,\r\n originPinyin: word,\r\n },\r\n ];\r\n }\r\n};\r\nconst getInitialAndFinal = (pinyin, initialPattern) => {\r\n const pinyin_arr = pinyin.split(\" \");\r\n const initial_arr = [];\r\n const final_arr = [];\r\n for (let _pinyin of pinyin_arr) {\r\n for (let _initial of InitialList) {\r\n if (_pinyin.startsWith(_initial)) {\r\n let _final = _pinyin.slice(_initial.length);\r\n if (SpecialInitialList.indexOf(_initial) !== -1 &&\r\n SpecialFinalList.indexOf(_final) !== -1) {\r\n // 针对 jqx 的 u 特殊处理\r\n _final = SpecialFinalMap[_final];\r\n }\r\n initial_arr.push(_initial);\r\n final_arr.push(_final);\r\n break;\r\n }\r\n }\r\n }\r\n if (initialPattern === \"standard\") {\r\n initial_arr.forEach((initial, index) => {\r\n if (initial === \"y\" || initial === \"w\") {\r\n initial_arr[index] = \"\";\r\n }\r\n });\r\n }\r\n return {\r\n final: final_arr.join(\" \"),\r\n initial: initial_arr.join(\" \"), // 声母\r\n };\r\n};\r\nfunction getFinalPartsFromFinal(final) {\r\n let head = \"\", body = \"\", tail = \"\";\r\n if (doubleFinalList.indexOf(getPinyinWithoutTone(final)) !== -1) {\r\n head = final[0];\r\n body = final[1];\r\n tail = final.slice(2);\r\n }\r\n else {\r\n body = final[0] || \"\";\r\n tail = final.slice(1) || \"\";\r\n }\r\n return { head, body, tail };\r\n}\r\nconst getFinalParts = (pinyin) => {\r\n const { final } = getInitialAndFinal(pinyin);\r\n return getFinalPartsFromFinal(final);\r\n};\r\nconst getNumOfTone = (pinyin) => {\r\n const reg_tone1 = /(ā|ō|ē|ī|ū|ǖ|n̄|m̄|ê̄)/;\r\n const reg_tone2 = /(á|ó|é|í|ú|ǘ|ń|ḿ|ế)/;\r\n const reg_tone3 = /(ǎ|ǒ|ě|ǐ|ǔ|ǚ|ň|m̌|ê̌)/;\r\n const reg_tone4 = /(à|ò|è|ì|ù|ǜ|ǹ|m̀|ề)/;\r\n const reg_tone0 = /(a|o|e|i|u|ü|ê)/;\r\n const special_tone = /(n|m)$/;\r\n const tone_num_arr = [];\r\n const pinyin_arr = pinyin.split(\" \");\r\n pinyin_arr.forEach((_pinyin) => {\r\n if (reg_tone1.test(_pinyin)) {\r\n tone_num_arr.push(\"1\");\r\n }\r\n else if (reg_tone2.test(_pinyin)) {\r\n tone_num_arr.push(\"2\");\r\n }\r\n else if (reg_tone3.test(_pinyin)) {\r\n tone_num_arr.push(\"3\");\r\n }\r\n else if (reg_tone4.test(_pinyin)) {\r\n tone_num_arr.push(\"4\");\r\n }\r\n else if (reg_tone0.test(_pinyin)) {\r\n tone_num_arr.push(\"0\");\r\n }\r\n else if (special_tone.test(_pinyin)) {\r\n tone_num_arr.push(\"0\");\r\n }\r\n else {\r\n tone_num_arr.push(\"\");\r\n }\r\n });\r\n return tone_num_arr.join(\" \");\r\n};\r\nconst getPinyinWithNum = (pinyin, originPinyin) => {\r\n const pinyin_arr = getPinyinWithoutTone(pinyin).split(\" \");\r\n const tone_num_arr = getNumOfTone(originPinyin).split(\" \");\r\n const res_arr = [];\r\n pinyin_arr.forEach((item, index) => {\r\n res_arr.push(`${item}${tone_num_arr[index]}`);\r\n });\r\n return res_arr.join(\" \");\r\n};\r\nconst getFirstLetter = (pinyin, isZh) => {\r\n const first_letter_arr = [];\r\n const pinyin_arr = pinyin.split(\" \");\r\n pinyin_arr.forEach((pinyin) => {\r\n first_letter_arr.push(isZh ? pinyin[0] : pinyin);\r\n });\r\n return first_letter_arr.join(\" \");\r\n};\r\n// 处理「一」和 「不」字的变调\r\nfunction processToneSandhi(cur, pre, next) {\r\n if (toneSandhiList.indexOf(cur) === -1) {\r\n return getSingleWordPinyin(cur);\r\n }\r\n // 轻声变调:说不说,说一说,叠词之间发音为轻声\r\n if (pre === next && pre && getSingleWordPinyin(pre) !== pre) {\r\n return getPinyinWithoutTone(getSingleWordPinyin(cur));\r\n }\r\n // 「一」和 「不」字变调处理\r\n if (next &&\r\n !toneSandhiIgnoreSuffix[cur].includes(next)) {\r\n const nextPinyin = getSingleWordPinyin(next);\r\n if (nextPinyin !== next) {\r\n const nextTone = getNumOfTone(nextPinyin);\r\n const pinyinMap = toneSandhiMap[cur];\r\n for (let pinyin in pinyinMap) {\r\n const tones = pinyinMap[pinyin];\r\n if (tones.indexOf(Number(nextTone)) !== -1) {\r\n return pinyin;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n// 处理「了」字的变调\r\nfunction processToneSandhiLiao(cur, pre, _) {\r\n if (cur === \"了\" && (!pre || !DICT1.get(pre))) {\r\n return \"liǎo\";\r\n }\r\n}\r\n// 处理叠字符[々]\r\nfunction processReduplicationChar(cur, pre, _) {\r\n if (cur === \"々\") {\r\n if (!pre || !DICT1.get(pre)) {\r\n return \"tóng\";\r\n }\r\n else {\r\n return DICT1.get(pre).split(\" \")[0];\r\n }\r\n }\r\n}\r\nfunction getProcessFuncs(text) {\r\n const processes = [];\r\n if (text.includes(\"々\")) {\r\n processes.push(processReduplicationChar);\r\n }\r\n processes.push(processToneSandhiLiao);\r\n processes.push(processToneSandhi);\r\n return processes;\r\n}\r\nfunction processSepecialPinyin(cur, pre, next, funcs) {\r\n for (let func of funcs) {\r\n const res = func(cur, pre, next);\r\n if (res) {\r\n return res;\r\n }\r\n }\r\n return getSingleWordPinyin(cur);\r\n}\n\nexport { getFinalParts, getFinalPartsFromFinal, getFirstLetter, getInitialAndFinal, getMultiplePinyin, getNumOfTone, getPinyin, getPinyinWithNum, getPinyinWithoutTone, getSingleWordPinyin, processToneSandhi };\n","import { splitString } from '../../common/utils.mjs';\nimport { getPinyin } from './handle.mjs';\nimport { validateType, middlewareToneSandhi, middleWareNonZh, middlewareMultiple, middlewarePattern, middlewareToneType, middlewareV, middlewareType } from './middlewares.mjs';\n\nconst DEFAULT_OPTIONS = {\r\n pattern: \"pinyin\",\r\n toneType: \"symbol\",\r\n type: \"string\",\r\n multiple: false,\r\n mode: \"normal\",\r\n removeNonZh: false,\r\n nonZh: \"spaced\",\r\n v: false,\r\n separator: \" \",\r\n toneSandhi: true,\r\n segmentit: 2 /* TokenizationAlgorithm.MaxProbability */,\r\n};\r\n/**\r\n * @description: 获取汉语字符串的拼音\r\n * @param {string} word 要转换的汉语字符串\r\n * @param {CompleteOptions=} options 配置项\r\n * @return {string | string[] | AllData[]} options.type 为 string 时,返回字符串,中间用空格隔开;为 array 时,返回拼音字符串数组;为 all 时返回全部信息的数组\r\n */\r\nfunction pinyin(word, options) {\r\n options = Object.assign(Object.assign({}, DEFAULT_OPTIONS), (options || {}));\r\n // 校验 word 类型是否正确\r\n const legal = validateType(word);\r\n if (!legal) {\r\n return word;\r\n }\r\n // 传入空字符串\r\n if (word === \"\") {\r\n return options.type === \"array\" || options.type === \"all\" ? [] : \"\";\r\n }\r\n if (options.surname === undefined) {\r\n if (options.mode === \"surname\") {\r\n options.surname = \"all\";\r\n }\r\n else {\r\n options.surname = \"off\";\r\n }\r\n }\r\n if (options.type === \"all\") {\r\n options.pattern = \"pinyin\";\r\n }\r\n if (options.pattern === \"num\") {\r\n options.toneType = \"none\";\r\n }\r\n if (options.removeNonZh) {\r\n options.nonZh = \"removed\";\r\n }\r\n const zhChars = splitString(word);\r\n let _list = Array(zhChars.length);\r\n let { list } = getPinyin(word, _list, options.surname, options.segmentit, options.traditional, zhChars);\r\n // 一和不变调处理\r\n list = middlewareToneSandhi(list, options.toneSandhi);\r\n // nonZh 参数及 removeNonZh 参数\r\n list = middleWareNonZh(list, options);\r\n // multiple 参数\r\n const multipleList = middlewareMultiple(word, options);\r\n if (multipleList) {\r\n list = multipleList;\r\n }\r\n // pattern 参数\r\n middlewarePattern(list, options);\r\n // toneType参数处理\r\n middlewareToneType(list, options);\r\n // v参数处理\r\n middlewareV(list, options);\r\n // type 参数处理\r\n return middlewareType(list, options, word);\r\n}\n\nexport { pinyin };\n","import { stringLength } from '../../common/utils.mjs';\nimport { getMultiplePinyin, getFinalParts, getFirstLetter, getInitialAndFinal, getNumOfTone, getPinyinWithNum, getPinyinWithoutTone, getFinalPartsFromFinal } from './handle.mjs';\nimport DICT1 from '../../data/dict1.mjs';\nimport { getAllPinyin } from './all.mjs';\n\n// 验证输入是否为字符串\r\nconst validateType = (word) => {\r\n if (typeof word !== \"string\") {\r\n console.error(\"The first param of pinyin is error: \" +\r\n word +\r\n ' is not assignable to type \"string\".');\r\n return false;\r\n }\r\n else {\r\n return true;\r\n }\r\n};\r\nfunction isNonZhScope(char, scope) {\r\n if (scope instanceof RegExp) {\r\n // Global and sticky regexes retain lastIndex between calls.\r\n if (scope.global || scope.sticky) {\r\n scope.lastIndex = 0;\r\n }\r\n return scope.test(char);\r\n }\r\n return true;\r\n}\r\n// nonZh 属性处理\r\nconst middleWareNonZh = (list, options) => {\r\n let nonZh = options.nonZh;\r\n if (nonZh === \"removed\") {\r\n return list.filter((item) => item.isZh || !isNonZhScope(item.origin, options.nonZhScope));\r\n }\r\n else if (nonZh === \"consecutive\") {\r\n for (let i = list.length - 2; i >= 0; i--) {\r\n const cur = list[i];\r\n const pre = list[i + 1];\r\n if (!cur.isZh &&\r\n !pre.isZh &&\r\n isNonZhScope(cur.origin, options.nonZhScope) &&\r\n isNonZhScope(pre.origin, options.nonZhScope)) {\r\n cur.origin += pre.origin;\r\n cur.result += pre.result;\r\n pre.delete = true;\r\n }\r\n }\r\n return list.filter((item) => !item.delete);\r\n }\r\n else {\r\n return list;\r\n }\r\n};\r\n// multiple 属性处理\r\nconst middlewareMultiple = (word, options) => {\r\n if (options.multiple && stringLength(word) === 1) {\r\n return getMultiplePinyin(word, options.surname);\r\n }\r\n else {\r\n return false;\r\n }\r\n};\r\n// pattern 属性处理\r\nconst middlewarePattern = (list, options) => {\r\n switch (options.pattern) {\r\n case \"pinyin\":\r\n break;\r\n case \"num\":\r\n list.forEach((item) => {\r\n item.result = item.isZh ? getNumOfTone(item.result) : \"\";\r\n });\r\n break;\r\n case \"initial\":\r\n list.forEach((item) => {\r\n item.result = item.isZh\r\n ? getInitialAndFinal(item.result, options.initialPattern).initial\r\n : \"\";\r\n });\r\n break;\r\n case \"final\":\r\n list.forEach((item) => {\r\n item.result = item.isZh\r\n ? getInitialAndFinal(item.result, options.initialPattern).final\r\n : \"\";\r\n });\r\n break;\r\n case \"first\":\r\n list.forEach((item) => {\r\n item.result = getFirstLetter(item.result, item.isZh);\r\n });\r\n break;\r\n case \"finalHead\":\r\n list.forEach((item) => {\r\n item.result = item.isZh ? getFinalParts(item.result).head : \"\";\r\n });\r\n break;\r\n case \"finalBody\":\r\n list.forEach((item) => {\r\n item.result = item.isZh ? getFinalParts(item.result).body : \"\";\r\n });\r\n break;\r\n case \"finalTail\":\r\n list.forEach((item) => {\r\n item.result = item.isZh ? getFinalParts(item.result).tail : \"\";\r\n });\r\n break;\r\n }\r\n};\r\n// toneType 属性处理\r\nconst middlewareToneType = (list, options) => {\r\n switch (options.toneType) {\r\n case \"symbol\":\r\n break;\r\n case \"none\":\r\n list.forEach((item) => {\r\n if (item.isZh) {\r\n item.result = getPinyinWithoutTone(item.result);\r\n }\r\n });\r\n break;\r\n case \"num\": {\r\n list.forEach((item) => {\r\n if (item.isZh) {\r\n item.result = getPinyinWithNum(item.result, item.originPinyin);\r\n }\r\n });\r\n break;\r\n }\r\n }\r\n};\r\n// v 属性处理\r\nconst middlewareV = (list, options) => {\r\n if (options.v) {\r\n list.forEach((item) => {\r\n if (item.isZh) {\r\n item.result = item.result.replace(/ü/g, typeof options.v === \"string\" ? options.v : \"v\");\r\n }\r\n });\r\n }\r\n};\r\n// type 属性处理\r\nconst middlewareType = (list, options, word) => {\r\n if (options.multiple && stringLength(word) === 1) {\r\n let last = \"\";\r\n list = list.filter((item) => {\r\n const res = item.result !== last;\r\n last = item.result;\r\n return res;\r\n });\r\n }\r\n if (options.type === \"array\") {\r\n return list.map((item) => item.result);\r\n }\r\n if (options.type === \"all\") {\r\n return list.map((item) => {\r\n const pinyin = item.isZh ? item.result : \"\";\r\n const { initial, final } = getInitialAndFinal(pinyin, options.initialPattern);\r\n const { head, body, tail } = getFinalPartsFromFinal(final);\r\n let polyphonic = [];\r\n if (pinyin !== \"\") {\r\n polyphonic = [pinyin].concat(getAllPinyin(item.origin, options.surname).filter((item) => item !== pinyin));\r\n }\r\n return {\r\n origin: item.origin,\r\n pinyin,\r\n initial,\r\n final,\r\n first: getFirstLetter(item.result, item.isZh),\r\n finalHead: head,\r\n finalBody: body,\r\n finalTail: tail,\r\n num: Number(getNumOfTone(item.originPinyin)),\r\n isZh: item.isZh,\r\n polyphonic,\r\n inZhRange: !!DICT1.get(item.origin),\r\n result: item.result,\r\n };\r\n });\r\n }\r\n return list.map((item) => item.result).join(options.separator);\r\n};\r\n// 是否开启变调\r\nconst middlewareToneSandhi = (list, toneSandhi) => {\r\n if (toneSandhi === false) {\r\n list.forEach((item) => {\r\n if (item.origin === \"一\") {\r\n item.result = item.originPinyin = \"yī\";\r\n }\r\n else if (item.origin === \"不\") {\r\n item.result = item.originPinyin = \"bù\";\r\n }\r\n });\r\n }\r\n return list;\r\n};\n\nexport { isNonZhScope, middleWareNonZh, middlewareMultiple, middlewarePattern, middlewareToneSandhi, middlewareToneType, middlewareType, middlewareV, validateType };\n","const traditionalDict = [];\r\nfunction addTraditionalDict(dict) {\r\n for (let key in dict) {\r\n const value = dict[key];\r\n const code = key.charCodeAt(0);\r\n traditionalDict[code] = value;\r\n }\r\n}\r\nfunction getTraditionalDict() {\r\n return traditionalDict;\r\n}\n\nexport { addTraditionalDict, getTraditionalDict };\n","import { FastDictFactory } from '../common/utils.mjs';\n\nconst map = {\r\n 'bǎng páng pāng': ['膀'],\r\n líng: [\r\n '〇',\r\n '伶',\r\n '凌',\r\n '刢',\r\n '囹',\r\n '坽',\r\n '夌',\r\n '姈',\r\n '婈',\r\n '孁',\r\n '岺',\r\n '彾',\r\n '掕',\r\n '昤',\r\n '朎',\r\n '柃',\r\n '棂',\r\n '櫺',\r\n '欞',\r\n '泠',\r\n '淩',\r\n '澪',\r\n '灵',\r\n '燯',\r\n '爧',\r\n '狑',\r\n '玲',\r\n '琌',\r\n '瓴',\r\n '皊',\r\n '砱',\r\n '祾',\r\n '秢',\r\n '竛',\r\n '笭',\r\n '紷',\r\n '綾',\r\n '绫',\r\n '羐',\r\n '羚',\r\n '翎',\r\n '聆',\r\n '舲',\r\n '苓',\r\n '菱',\r\n '蓤',\r\n '蔆',\r\n '蕶',\r\n '蛉',\r\n '衑',\r\n '裬',\r\n '詅',\r\n '跉',\r\n '軨',\r\n '輘',\r\n '酃',\r\n '醽',\r\n '鈴',\r\n '錂',\r\n '铃',\r\n '閝',\r\n '陵',\r\n '零',\r\n '霊',\r\n '霗',\r\n '霛',\r\n '霝',\r\n '靈',\r\n '駖',\r\n '魿',\r\n '鯪',\r\n '鲮',\r\n '鴒',\r\n '鸰',\r\n '鹷',\r\n '麢',\r\n '齡',\r\n '齢',\r\n '龄',\r\n '龗',\r\n '㥄',\r\n ],\r\n yī: [\r\n '一',\r\n '乊',\r\n '伊',\r\n '依',\r\n '医',\r\n '吚',\r\n '咿',\r\n '噫',\r\n '壱',\r\n '壹',\r\n '夁',\r\n '嫛',\r\n '嬄',\r\n '弌',\r\n '揖',\r\n '撎',\r\n '檹',\r\n '毉',\r\n '洢',\r\n '渏',\r\n '漪',\r\n '瑿',\r\n '畩',\r\n '祎',\r\n '禕',\r\n '稦',\r\n '繄',\r\n '蛜',\r\n '衤',\r\n '譩',\r\n '辷',\r\n '郼',\r\n '醫',\r\n '銥',\r\n '铱',\r\n '鷖',\r\n '鹥',\r\n '黟',\r\n '黳',\r\n ],\r\n 'dīng zhēng': ['丁'],\r\n 'kǎo qiǎo yú': ['丂'],\r\n qī: [\r\n '七',\r\n '倛',\r\n '僛',\r\n '凄',\r\n '嘁',\r\n '墄',\r\n '娸',\r\n '悽',\r\n '慼',\r\n '慽',\r\n '戚',\r\n '捿',\r\n '柒',\r\n '桤',\r\n '桼',\r\n '棲',\r\n '榿',\r\n '欺',\r\n '沏',\r\n '淒',\r\n '漆',\r\n '紪',\r\n '緀',\r\n '萋',\r\n '褄',\r\n '諆',\r\n '迉',\r\n '郪',\r\n '鏚',\r\n '霋',\r\n '魌',\r\n '鶈',\r\n ],\r\n shàng: ['丄', '尙', '尚', '恦', '緔', '绱'],\r\n xià: [\r\n '丅',\r\n '下',\r\n '乤',\r\n '圷',\r\n '夏',\r\n '夓',\r\n '懗',\r\n '梺',\r\n '疜',\r\n '睱',\r\n '罅',\r\n '鎼',\r\n '鏬',\r\n ],\r\n hǎn: ['丆', '喊', '浫', '罕', '豃', '㘎'],\r\n 'wàn mò': ['万'],\r\n zhàng: [\r\n '丈',\r\n '仗',\r\n '墇',\r\n '嶂',\r\n '帐',\r\n '帳',\r\n '幛',\r\n '扙',\r\n '杖',\r\n '涱',\r\n '痮',\r\n '瘬',\r\n '瘴',\r\n '瞕',\r\n '粀',\r\n '胀',\r\n '脹',\r\n '賬',\r\n '账',\r\n '障',\r\n ],\r\n sān: ['三', '厁', '叁', '弎', '毵', '毶', '毿', '犙', '鬖'],\r\n 'shàng shǎng shang': ['上'],\r\n 'qí jī': ['丌', '其', '奇'],\r\n 'bù fǒu': ['不'],\r\n 'yǔ yù yú': ['与'],\r\n miǎn: [\r\n '丏',\r\n '偭',\r\n '免',\r\n '冕',\r\n '勉',\r\n '勔',\r\n '喕',\r\n '娩',\r\n '愐',\r\n '汅',\r\n '沔',\r\n '湎',\r\n '睌',\r\n '緬',\r\n '缅',\r\n '腼',\r\n '葂',\r\n '靦',\r\n '鮸',\r\n '𩾃',\r\n ],\r\n gài: [\r\n '丐',\r\n '乢',\r\n '匃',\r\n '匄',\r\n '戤',\r\n '概',\r\n '槩',\r\n '槪',\r\n '溉',\r\n '漑',\r\n '瓂',\r\n '葢',\r\n '鈣',\r\n '钙',\r\n '𬮿',\r\n ],\r\n chǒu: ['丑', '丒', '侴', '吜', '杽', '瞅', '矁', '醜', '魗'],\r\n zhuān: [\r\n '专',\r\n '叀',\r\n '嫥',\r\n '専',\r\n '專',\r\n '瑼',\r\n '甎',\r\n '砖',\r\n '磗',\r\n '磚',\r\n '蟤',\r\n '諯',\r\n '鄟',\r\n '顓',\r\n '颛',\r\n '鱄',\r\n '䏝',\r\n ],\r\n 'qiě jū': ['且'],\r\n pī: [\r\n '丕',\r\n '伓',\r\n '伾',\r\n '噼',\r\n '坯',\r\n '岯',\r\n '憵',\r\n '批',\r\n '披',\r\n '炋',\r\n '狉',\r\n '狓',\r\n '砒',\r\n '磇',\r\n '礔',\r\n '礕',\r\n '秛',\r\n '秠',\r\n '耚',\r\n '豾',\r\n '邳',\r\n '鈚',\r\n '鉟',\r\n '銔',\r\n '錃',\r\n '錍',\r\n '霹',\r\n '駓',\r\n '髬',\r\n '魾',\r\n '𬳵',\r\n ],\r\n shì: [\r\n '世',\r\n '丗',\r\n '亊',\r\n '事',\r\n '仕',\r\n '侍',\r\n '冟',\r\n '势',\r\n '勢',\r\n '卋',\r\n '呩',\r\n '嗜',\r\n '噬',\r\n '士',\r\n '奭',\r\n '嬕',\r\n '室',\r\n '市',\r\n '式',\r\n '弑',\r\n '弒',\r\n '恀',\r\n '恃',\r\n '戺',\r\n '拭',\r\n '揓',\r\n '是',\r\n '昰',\r\n '枾',\r\n '柿',\r\n '栻',\r\n '澨',\r\n '烒',\r\n '煶',\r\n '眂',\r\n '眎',\r\n '眡',\r\n '睗',\r\n '示',\r\n '礻',\r\n '筮',\r\n '簭',\r\n '舐',\r\n '舓',\r\n '襫',\r\n '視',\r\n '视',\r\n '觢',\r\n '試',\r\n '誓',\r\n '諡',\r\n '謚',\r\n '试',\r\n '谥',\r\n '貰',\r\n '贳',\r\n '軾',\r\n '轼',\r\n '逝',\r\n '遾',\r\n '釈',\r\n '释',\r\n '釋',\r\n '鈰',\r\n '鉃',\r\n '鉽',\r\n '铈',\r\n '飾',\r\n '餙',\r\n '餝',\r\n '饰',\r\n '鰘',\r\n '䏡',\r\n '𬤊',\r\n ],\r\n qiū: [\r\n '丘',\r\n '丠',\r\n '坵',\r\n '媝',\r\n '恘',\r\n '恷',\r\n '楸',\r\n '秋',\r\n '秌',\r\n '穐',\r\n '篍',\r\n '緧',\r\n '萩',\r\n '蘒',\r\n '蚯',\r\n '蝵',\r\n '蟗',\r\n '蠤',\r\n '趥',\r\n '邱',\r\n '鞦',\r\n '鞧',\r\n '鰌',\r\n '鰍',\r\n '鳅',\r\n '鶖',\r\n '鹙',\r\n '龝',\r\n ],\r\n bǐng: [\r\n '丙',\r\n '屛',\r\n '怲',\r\n '抦',\r\n '昞',\r\n '昺',\r\n '柄',\r\n '棅',\r\n '炳',\r\n '禀',\r\n '秉',\r\n '稟',\r\n '苪',\r\n '蛃',\r\n '邴',\r\n '鈵',\r\n '陃',\r\n '鞆',\r\n '餅',\r\n '餠',\r\n '饼',\r\n ],\r\n yè: [\r\n '业',\r\n '亱',\r\n '僷',\r\n '墷',\r\n '夜',\r\n '嶪',\r\n '嶫',\r\n '抴',\r\n '捙',\r\n '擛',\r\n '擪',\r\n '擫',\r\n '晔',\r\n '曄',\r\n '曅',\r\n '曗',\r\n '曳',\r\n '曵',\r\n '枼',\r\n '枽',\r\n '業',\r\n '洂',\r\n '液',\r\n '澲',\r\n '烨',\r\n '燁',\r\n '爗',\r\n '璍',\r\n '皣',\r\n '瞱',\r\n '瞸',\r\n '礏',\r\n '腋',\r\n '葉',\r\n '謁',\r\n '谒',\r\n '邺',\r\n '鄴',\r\n '鍱',\r\n '鐷',\r\n '靥',\r\n '靨',\r\n '頁',\r\n '页',\r\n '餣',\r\n '饁',\r\n '馌',\r\n '驜',\r\n '鵺',\r\n '鸈',\r\n ],\r\n cóng: [\r\n '丛',\r\n '从',\r\n '叢',\r\n '婃',\r\n '孮',\r\n '従',\r\n '徔',\r\n '徖',\r\n '悰',\r\n '樷',\r\n '欉',\r\n '淙',\r\n '灇',\r\n '爜',\r\n '琮',\r\n '藂',\r\n '誴',\r\n '賨',\r\n '賩',\r\n '錝',\r\n ],\r\n dōng: [\r\n '东',\r\n '倲',\r\n '冬',\r\n '咚',\r\n '埬',\r\n '岽',\r\n '崬',\r\n '徚',\r\n '昸',\r\n '東',\r\n '氡',\r\n '氭',\r\n '涷',\r\n '笗',\r\n '苳',\r\n '菄',\r\n '蝀',\r\n '鮗',\r\n '鯟',\r\n '鶇',\r\n '鶫',\r\n '鸫',\r\n '鼕',\r\n '𬟽',\r\n ],\r\n sī: [\r\n '丝',\r\n '俬',\r\n '凘',\r\n '厮',\r\n '司',\r\n '咝',\r\n '嘶',\r\n '噝',\r\n '媤',\r\n '廝',\r\n '恖',\r\n '撕',\r\n '斯',\r\n '楒',\r\n '泀',\r\n '澌',\r\n '燍',\r\n '禗',\r\n '禠',\r\n '私',\r\n '糹',\r\n '絲',\r\n '緦',\r\n '纟',\r\n '缌',\r\n '罳',\r\n '蕬',\r\n '虒',\r\n '蛳',\r\n '蜤',\r\n '螄',\r\n '蟖',\r\n '蟴',\r\n '鉰',\r\n '銯',\r\n '鍶',\r\n '鐁',\r\n '锶',\r\n '颸',\r\n '飔',\r\n '騦',\r\n '鷥',\r\n '鸶',\r\n '鼶',\r\n '㟃',\r\n ],\r\n chéng: [\r\n '丞',\r\n '呈',\r\n '城',\r\n '埕',\r\n '堘',\r\n '塍',\r\n '塖',\r\n '宬',\r\n '峸',\r\n '惩',\r\n '懲',\r\n '成',\r\n '承',\r\n '挰',\r\n '掁',\r\n '揨',\r\n '枨',\r\n '棖',\r\n '橙',\r\n '檙',\r\n '洆',\r\n '溗',\r\n '澂',\r\n '珵',\r\n '珹',\r\n '畻',\r\n '程',\r\n '窚',\r\n '筬',\r\n '絾',\r\n '脭',\r\n '荿',\r\n '誠',\r\n '诚',\r\n '郕',\r\n '酲',\r\n '鋮',\r\n '铖',\r\n '騬',\r\n '鯎',\r\n ],\r\n diū: ['丟', '丢', '銩', '铥'],\r\n liǎng: [\r\n '両',\r\n '两',\r\n '兩',\r\n '唡',\r\n '啢',\r\n '掚',\r\n '緉',\r\n '脼',\r\n '蜽',\r\n '裲',\r\n '魉',\r\n '魎',\r\n '𬜯',\r\n ],\r\n yǒu: [\r\n '丣',\r\n '卣',\r\n '友',\r\n '梄',\r\n '湵',\r\n '牖',\r\n '禉',\r\n '羑',\r\n '聈',\r\n '苃',\r\n '莠',\r\n '蜏',\r\n '酉',\r\n '銪',\r\n '铕',\r\n '黝',\r\n ],\r\n yán: [\r\n '严',\r\n '厳',\r\n '啱',\r\n '喦',\r\n '嚴',\r\n '塩',\r\n '壛',\r\n '壧',\r\n '妍',\r\n '姸',\r\n '娫',\r\n '娮',\r\n '岩',\r\n '嵒',\r\n '嵓',\r\n '巌',\r\n '巖',\r\n '巗',\r\n '延',\r\n '揅',\r\n '昖',\r\n '楌',\r\n '檐',\r\n '櫩',\r\n '欕',\r\n '沿',\r\n '炎',\r\n '炏',\r\n '狿',\r\n '琂',\r\n '盐',\r\n '碞',\r\n '筵',\r\n '簷',\r\n '莚',\r\n '蔅',\r\n '虤',\r\n '蜒',\r\n '言',\r\n '訁',\r\n '訮',\r\n '詽',\r\n '讠',\r\n '郔',\r\n '閆',\r\n '閻',\r\n '闫',\r\n '阎',\r\n '顏',\r\n '顔',\r\n '颜',\r\n '鹽',\r\n '麣',\r\n '𫄧',\r\n ],\r\n bìng: [\r\n '並',\r\n '併',\r\n '倂',\r\n '傡',\r\n '垪',\r\n '摒',\r\n '栤',\r\n '病',\r\n '窉',\r\n '竝',\r\n '誁',\r\n '靐',\r\n '鮩',\r\n ],\r\n 'sàng sāng': ['丧'],\r\n gǔn: [\r\n '丨',\r\n '惃',\r\n '滚',\r\n '滾',\r\n '磙',\r\n '緄',\r\n '绲',\r\n '蓘',\r\n '蔉',\r\n '衮',\r\n '袞',\r\n '輥',\r\n '辊',\r\n '鮌',\r\n '鯀',\r\n '鲧',\r\n ],\r\n jiū: [\r\n '丩',\r\n '勼',\r\n '啾',\r\n '揪',\r\n '揫',\r\n '朻',\r\n '究',\r\n '糾',\r\n '纠',\r\n '萛',\r\n '赳',\r\n '阄',\r\n '鬏',\r\n '鬮',\r\n '鳩',\r\n '鸠',\r\n ],\r\n 'gè gě': ['个', '個', '各'],\r\n yā: [\r\n '丫',\r\n '圧',\r\n '孲',\r\n '庘',\r\n '押',\r\n '枒',\r\n '桠',\r\n '椏',\r\n '錏',\r\n '鐚',\r\n '鴉',\r\n '鴨',\r\n '鵶',\r\n '鸦',\r\n '鸭',\r\n ],\r\n pán: [\r\n '丬',\r\n '媻',\r\n '幋',\r\n '槃',\r\n '洀',\r\n '瀊',\r\n '爿',\r\n '盘',\r\n '盤',\r\n '磐',\r\n '縏',\r\n '蒰',\r\n '蟠',\r\n '蹒',\r\n '蹣',\r\n '鎜',\r\n '鞶',\r\n ],\r\n 'zhōng zhòng': ['中'],\r\n jǐ: [\r\n '丮',\r\n '妀',\r\n '己',\r\n '戟',\r\n '挤',\r\n '掎',\r\n '撠',\r\n '擠',\r\n '橶',\r\n '泲',\r\n '犱',\r\n '脊',\r\n '虮',\r\n '蟣',\r\n '魢',\r\n '鱾',\r\n '麂',\r\n ],\r\n jiè: [\r\n '丯',\r\n '介',\r\n '借',\r\n '唶',\r\n '堺',\r\n '屆',\r\n '届',\r\n '岕',\r\n '庎',\r\n '徣',\r\n '戒',\r\n '楐',\r\n '犗',\r\n '玠',\r\n '琾',\r\n '界',\r\n '畍',\r\n '疥',\r\n '砎',\r\n '蚧',\r\n '蛶',\r\n '衸',\r\n '褯',\r\n '誡',\r\n '诫',\r\n '鎅',\r\n '骱',\r\n '魪',\r\n ],\r\n fēng: [\r\n '丰',\r\n '仹',\r\n '偑',\r\n '僼',\r\n '凨',\r\n '凬',\r\n '凮',\r\n '妦',\r\n '寷',\r\n '封',\r\n '峯',\r\n '峰',\r\n '崶',\r\n '枫',\r\n '楓',\r\n '檒',\r\n '沣',\r\n '沨',\r\n '渢',\r\n '灃',\r\n '烽',\r\n '犎',\r\n '猦',\r\n '琒',\r\n '疯',\r\n '瘋',\r\n '盽',\r\n '砜',\r\n '碸',\r\n '篈',\r\n '蘴',\r\n '蜂',\r\n '蠭',\r\n '豐',\r\n '鄷',\r\n '酆',\r\n '鋒',\r\n '鎽',\r\n '鏠',\r\n '锋',\r\n '霻',\r\n '靊',\r\n '飌',\r\n '麷',\r\n ],\r\n 'guàn kuàng': ['丱'],\r\n chuàn: ['串', '汌', '玔', '賗', '釧', '钏'],\r\n chǎn: [\r\n '丳',\r\n '产',\r\n '冁',\r\n '剷',\r\n '囅',\r\n '嵼',\r\n '旵',\r\n '浐',\r\n '滻',\r\n '灛',\r\n '產',\r\n '産',\r\n '簅',\r\n '蒇',\r\n '蕆',\r\n '諂',\r\n '譂',\r\n '讇',\r\n '谄',\r\n '鏟',\r\n '铲',\r\n '閳',\r\n '闡',\r\n '阐',\r\n '骣',\r\n '𬊤',\r\n ],\r\n lín: [\r\n '临',\r\n '冧',\r\n '壣',\r\n '崊',\r\n '嶙',\r\n '斴',\r\n '晽',\r\n '暽',\r\n '林',\r\n '潾',\r\n '瀶',\r\n '燐',\r\n '琳',\r\n '璘',\r\n '瞵',\r\n '碄',\r\n '磷',\r\n '粦',\r\n '粼',\r\n '繗',\r\n '翷',\r\n '臨',\r\n '轔',\r\n '辚',\r\n '遴',\r\n '邻',\r\n '鄰',\r\n '鏻',\r\n '阾',\r\n '隣',\r\n '霖',\r\n '驎',\r\n '鱗',\r\n '鳞',\r\n '麐',\r\n '麟',\r\n '𬴊',\r\n '𬭸',\r\n ],\r\n zhuó: [\r\n '丵',\r\n '劅',\r\n '卓',\r\n '啄',\r\n '圴',\r\n '妰',\r\n '娺',\r\n '撯',\r\n '擆',\r\n '擢',\r\n '斫',\r\n '斮',\r\n '斱',\r\n '斲',\r\n '斵',\r\n '晫',\r\n '椓',\r\n '浊',\r\n '浞',\r\n '濁',\r\n '灼',\r\n '烵',\r\n '琸',\r\n '硺',\r\n '禚',\r\n '窡',\r\n '籗',\r\n '籱',\r\n '罬',\r\n '茁',\r\n '蠗',\r\n '蠿',\r\n '諁',\r\n '諑',\r\n '謶',\r\n '诼',\r\n '酌',\r\n '鐲',\r\n '镯',\r\n '鵫',\r\n '鷟',\r\n '䓬',\r\n '𬸦',\r\n ],\r\n zhǔ: [\r\n '丶',\r\n '主',\r\n '劯',\r\n '嘱',\r\n '囑',\r\n '宔',\r\n '帾',\r\n '拄',\r\n '渚',\r\n '濐',\r\n '煑',\r\n '煮',\r\n '燝',\r\n '瞩',\r\n '矚',\r\n '罜',\r\n '詝',\r\n '陼',\r\n '鸀',\r\n '麈',\r\n '𬣞',\r\n ],\r\n bā: [\r\n '丷',\r\n '仈',\r\n '八',\r\n '叭',\r\n '哵',\r\n '夿',\r\n '岜',\r\n '巴',\r\n '捌',\r\n '朳',\r\n '玐',\r\n '疤',\r\n '笆',\r\n '粑',\r\n '羓',\r\n '芭',\r\n '蚆',\r\n '豝',\r\n '釟',\r\n ],\r\n wán: [\r\n '丸',\r\n '刓',\r\n '完',\r\n '岏',\r\n '抏',\r\n '捖',\r\n '汍',\r\n '烷',\r\n '玩',\r\n '琓',\r\n '笂',\r\n '紈',\r\n '纨',\r\n '翫',\r\n '芄',\r\n '貦',\r\n '頑',\r\n '顽',\r\n ],\r\n dān: [\r\n '丹',\r\n '勯',\r\n '匰',\r\n '単',\r\n '妉',\r\n '媅',\r\n '殚',\r\n '殫',\r\n '甔',\r\n '眈',\r\n '砃',\r\n '箪',\r\n '簞',\r\n '耼',\r\n '耽',\r\n '聃',\r\n '聸',\r\n '褝',\r\n '襌',\r\n '躭',\r\n '郸',\r\n '鄲',\r\n '酖',\r\n '頕',\r\n ],\r\n 'wèi wéi': ['为'],\r\n 'jǐng dǎn': ['丼'],\r\n 'lì lí': ['丽'],\r\n jǔ: [\r\n '举',\r\n '弆',\r\n '挙',\r\n '擧',\r\n '椇',\r\n '榉',\r\n '榘',\r\n '櫸',\r\n '欅',\r\n '矩',\r\n '筥',\r\n '聥',\r\n '舉',\r\n '莒',\r\n '蒟',\r\n '襷',\r\n '踽',\r\n '齟',\r\n '龃',\r\n ],\r\n piě: ['丿', '苤', '鐅', '𬭯'],\r\n fú: [\r\n '乀',\r\n '伏',\r\n '俘',\r\n '凫',\r\n '刜',\r\n '匐',\r\n '咈',\r\n '哹',\r\n '垘',\r\n '孚',\r\n '岪',\r\n '巿',\r\n '帗',\r\n '幅',\r\n '幞',\r\n '弗',\r\n '彿',\r\n '怫',\r\n '扶',\r\n '柫',\r\n '栿',\r\n '桴',\r\n '氟',\r\n '泭',\r\n '浮',\r\n '涪',\r\n '澓',\r\n '炥',\r\n '玸',\r\n '甶',\r\n '畉',\r\n '癁',\r\n '祓',\r\n '福',\r\n '稪',\r\n '符',\r\n '箙',\r\n '紱',\r\n '紼',\r\n '絥',\r\n '綍',\r\n '绂',\r\n '绋',\r\n '罘',\r\n '罦',\r\n '翇',\r\n '艀',\r\n '芙',\r\n '芣',\r\n '苻',\r\n '茀',\r\n '茯',\r\n '菔',\r\n '葍',\r\n '虙',\r\n '蚨',\r\n '蜉',\r\n '蝠',\r\n '袚',\r\n '袱',\r\n '襆',\r\n '襥',\r\n '諨',\r\n '豧',\r\n '踾',\r\n '輻',\r\n '辐',\r\n '郛',\r\n '鉘',\r\n '鉜',\r\n '韍',\r\n '韨',\r\n '颫',\r\n '髴',\r\n '鮄',\r\n '鮲',\r\n '鳧',\r\n '鳬',\r\n '鴔',\r\n '鵩',\r\n '黻',\r\n ],\r\n 'yí jí': ['乁'],\r\n yì: [\r\n '乂',\r\n '义',\r\n '亄',\r\n '亦',\r\n '亿',\r\n '伇',\r\n '伿',\r\n '佾',\r\n '俋',\r\n '億',\r\n '兿',\r\n '刈',\r\n '劓',\r\n '劮',\r\n '勚',\r\n '勩',\r\n '匇',\r\n '呓',\r\n '呭',\r\n '呹',\r\n '唈',\r\n '囈',\r\n '圛',\r\n '坄',\r\n '垼',\r\n '埸',\r\n '奕',\r\n '嫕',\r\n '嬑',\r\n '寱',\r\n '屹',\r\n '峄',\r\n '嶧',\r\n '帟',\r\n '帠',\r\n '幆',\r\n '廙',\r\n '异',\r\n '弈',\r\n '弋',\r\n '役',\r\n '忆',\r\n '怈',\r\n '怿',\r\n '悒',\r\n '意',\r\n '憶',\r\n '懌',\r\n '懿',\r\n '抑',\r\n '挹',\r\n '敡',\r\n '易',\r\n '晹',\r\n '曀',\r\n '曎',\r\n '杙',\r\n '枍',\r\n '棭',\r\n '榏',\r\n '槸',\r\n '檍',\r\n '歝',\r\n '殔',\r\n '殪',\r\n '殹',\r\n '毅',\r\n '浂',\r\n '浥',\r\n '浳',\r\n '湙',\r\n '溢',\r\n '潩',\r\n '澺',\r\n '瀷',\r\n '炈',\r\n '焲',\r\n '熠',\r\n '熤',\r\n '熼',\r\n '燚',\r\n '燡',\r\n '燱',\r\n '獈',\r\n '玴',\r\n '異',\r\n '疫',\r\n '痬',\r\n '瘗',\r\n '瘞',\r\n '瘱',\r\n '癔',\r\n '益',\r\n '瞖',\r\n '穓',\r\n '竩',\r\n '篒',\r\n '縊',\r\n '繶',\r\n '繹',\r\n '绎',\r\n '缢',\r\n '義',\r\n '羿',\r\n '翊',\r\n '翌',\r\n '翳',\r\n '翼',\r\n '耴',\r\n '肄',\r\n '肊',\r\n '膉',\r\n '臆',\r\n '艗',\r\n '艺',\r\n '芅',\r\n '苅',\r\n '萟',\r\n '蓺',\r\n '薏',\r\n '藙',\r\n '藝',\r\n '蘙',\r\n '虉',\r\n '蜴',\r\n '螠',\r\n '衪',\r\n '袣',\r\n '裔',\r\n '裛',\r\n '褹',\r\n '襼',\r\n '訲',\r\n '訳',\r\n '詍',\r\n '詣',\r\n '誼',\r\n '譯',\r\n '議',\r\n '讛',\r\n '议',\r\n '译',\r\n '诣',\r\n '谊',\r\n '豙',\r\n '豛',\r\n '豷',\r\n '貖',\r\n '贀',\r\n '跇',\r\n '轶',\r\n '逸',\r\n '邑',\r\n '鄓',\r\n '醷',\r\n '釴',\r\n '鈠',\r\n '鎰',\r\n '鐿',\r\n '镒',\r\n '镱',\r\n '阣',\r\n '隿',\r\n '霬',\r\n '饐',\r\n '駅',\r\n '驛',\r\n '驿',\r\n '骮',\r\n '鮨',\r\n '鶂',\r\n '鶃',\r\n '鶍',\r\n '鷁',\r\n '鷊',\r\n '鷧',\r\n '鷾',\r\n '鸃',\r\n '鹝',\r\n '鹢',\r\n '黓',\r\n '齸',\r\n '𬬩',\r\n '㑊',\r\n '𫄷',\r\n '𬟁',\r\n ],\r\n nǎi: ['乃', '倷', '奶', '嬭', '廼', '氖', '疓', '艿', '迺', '釢'],\r\n wǔ: [\r\n '乄',\r\n '五',\r\n '仵',\r\n '伍',\r\n '侮',\r\n '倵',\r\n '儛',\r\n '午',\r\n '啎',\r\n '妩',\r\n '娬',\r\n '嫵',\r\n '庑',\r\n '廡',\r\n '忤',\r\n '怃',\r\n '憮',\r\n '摀',\r\n '武',\r\n '潕',\r\n '熓',\r\n '牾',\r\n '玝',\r\n '珷',\r\n '瑦',\r\n '甒',\r\n '碔',\r\n '舞',\r\n '躌',\r\n '迕',\r\n '逜',\r\n '陚',\r\n '鵡',\r\n '鹉',\r\n '𣲘',\r\n ],\r\n jiǔ: [\r\n '久',\r\n '乆',\r\n '九',\r\n '乣',\r\n '奺',\r\n '杦',\r\n '汣',\r\n '灸',\r\n '玖',\r\n '紤',\r\n '舏',\r\n '酒',\r\n '镹',\r\n '韭',\r\n '韮',\r\n ],\r\n 'tuō zhé': ['乇', '杔', '馲'],\r\n 'me mó ma yāo': ['么'],\r\n zhī: [\r\n '之',\r\n '倁',\r\n '卮',\r\n '巵',\r\n '搘',\r\n '支',\r\n '栀',\r\n '梔',\r\n '椥',\r\n '榰',\r\n '汁',\r\n '泜',\r\n '疷',\r\n '祗',\r\n '祬',\r\n '秓',\r\n '稙',\r\n '綕',\r\n '肢',\r\n '胑',\r\n '胝',\r\n '脂',\r\n '芝',\r\n '蘵',\r\n '蜘',\r\n '衼',\r\n '隻',\r\n '鳷',\r\n '鴲',\r\n '鼅',\r\n '𦭜',\r\n ],\r\n 'wū wù': ['乌'],\r\n zhà: [\r\n '乍',\r\n '咤',\r\n '宱',\r\n '搾',\r\n '榨',\r\n '溠',\r\n '痄',\r\n '蚱',\r\n '詐',\r\n '诈',\r\n '醡',\r\n '霅',\r\n '䃎',\r\n ],\r\n hū: [\r\n '乎',\r\n '乯',\r\n '匢',\r\n '匫',\r\n '呼',\r\n '唿',\r\n '嘑',\r\n '垀',\r\n '寣',\r\n '幠',\r\n '忽',\r\n '惚',\r\n '昒',\r\n '歑',\r\n '泘',\r\n '淴',\r\n '滹',\r\n '烀',\r\n '苸',\r\n '虍',\r\n '虖',\r\n '謼',\r\n '軤',\r\n '轷',\r\n '雐',\r\n ],\r\n fá: [\r\n '乏',\r\n '伐',\r\n '傠',\r\n '坺',\r\n '垡',\r\n '墢',\r\n '姂',\r\n '栰',\r\n '浌',\r\n '瞂',\r\n '笩',\r\n '筏',\r\n '罚',\r\n '罰',\r\n '罸',\r\n '藅',\r\n '閥',\r\n '阀',\r\n ],\r\n 'lè yuè yào lào': ['乐', '樂'],\r\n yín: [\r\n '乑',\r\n '吟',\r\n '噖',\r\n '嚚',\r\n '圁',\r\n '垠',\r\n '夤',\r\n '婬',\r\n '寅',\r\n '峾',\r\n '崟',\r\n '崯',\r\n '檭',\r\n '殥',\r\n '泿',\r\n '淫',\r\n '滛',\r\n '烎',\r\n '犾',\r\n '狺',\r\n '璌',\r\n '硍',\r\n '碒',\r\n '荶',\r\n '蔩',\r\n '訔',\r\n '訚',\r\n '訡',\r\n '誾',\r\n '鄞',\r\n '鈝',\r\n '銀',\r\n '银',\r\n '霪',\r\n '鷣',\r\n '齦',\r\n ],\r\n pīng: ['乒', '俜', '娉', '涄', '甹', '砯', '聠', '艵', '頩'],\r\n pāng: ['乓', '滂', '胮', '膖', '雱', '霶'],\r\n qiáo: [\r\n '乔',\r\n '侨',\r\n '僑',\r\n '嫶',\r\n '憔',\r\n '桥',\r\n '槗',\r\n '樵',\r\n '橋',\r\n '櫵',\r\n '犞',\r\n '瞧',\r\n '硚',\r\n '礄',\r\n '荍',\r\n '荞',\r\n '蕎',\r\n '藮',\r\n '譙',\r\n '趫',\r\n '鐈',\r\n '鞒',\r\n '鞽',\r\n '顦',\r\n ],\r\n hǔ: ['乕', '琥', '萀', '虎', '虝', '錿', '鯱'],\r\n guāi: ['乖'],\r\n 'chéng shèng': ['乗', '乘', '娍'],\r\n yǐ: [\r\n '乙',\r\n '乛',\r\n '以',\r\n '倚',\r\n '偯',\r\n '嬟',\r\n '崺',\r\n '已',\r\n '庡',\r\n '扆',\r\n '攺',\r\n '敼',\r\n '旑',\r\n '旖',\r\n '檥',\r\n '矣',\r\n '礒',\r\n '笖',\r\n '舣',\r\n '艤',\r\n '苡',\r\n '苢',\r\n '蚁',\r\n '螘',\r\n '蟻',\r\n '裿',\r\n '踦',\r\n '輢',\r\n '轙',\r\n '逘',\r\n '酏',\r\n '釔',\r\n '鈘',\r\n '鉯',\r\n '钇',\r\n '顗',\r\n '鳦',\r\n '齮',\r\n '𫖮',\r\n '𬺈',\r\n ],\r\n 'háo yǐ': ['乚'],\r\n 'niè miē': ['乜'],\r\n qǐ: [\r\n '乞',\r\n '企',\r\n '启',\r\n '唘',\r\n '啓',\r\n '啔',\r\n '啟',\r\n '婍',\r\n '屺',\r\n '杞',\r\n '棨',\r\n '玘',\r\n '盀',\r\n '綺',\r\n '绮',\r\n '芑',\r\n '諬',\r\n '起',\r\n '邔',\r\n '闙',\r\n ],\r\n yě: ['也', '冶', '嘢', '埜', '壄', '漜', '野'],\r\n xí: [\r\n '习',\r\n '喺',\r\n '媳',\r\n '嶍',\r\n '席',\r\n '椺',\r\n '檄',\r\n '漝',\r\n '習',\r\n '蓆',\r\n '袭',\r\n '襲',\r\n '覡',\r\n '觋',\r\n '謵',\r\n '趘',\r\n '郋',\r\n '鎴',\r\n '隰',\r\n '霫',\r\n '飁',\r\n '騱',\r\n '騽',\r\n '驨',\r\n '鰼',\r\n '鳛',\r\n '𠅤',\r\n '𫘬',\r\n ],\r\n xiāng: [\r\n '乡',\r\n '厢',\r\n '廂',\r\n '忀',\r\n '楿',\r\n '欀',\r\n '湘',\r\n '瓖',\r\n '稥',\r\n '箱',\r\n '緗',\r\n '缃',\r\n '膷',\r\n '芗',\r\n '萫',\r\n '葙',\r\n '薌',\r\n '襄',\r\n '郷',\r\n '鄉',\r\n '鄊',\r\n '鄕',\r\n '鑲',\r\n '镶',\r\n '香',\r\n '驤',\r\n '骧',\r\n '鱜',\r\n '麘',\r\n '𬙋',\r\n ],\r\n shū: [\r\n '书',\r\n '倏',\r\n '倐',\r\n '儵',\r\n '叔',\r\n '姝',\r\n '尗',\r\n '抒',\r\n '掓',\r\n '摅',\r\n '攄',\r\n '書',\r\n '枢',\r\n '梳',\r\n '樞',\r\n '殊',\r\n '殳',\r\n '毹',\r\n '毺',\r\n '淑',\r\n '瀭',\r\n '焂',\r\n '疎',\r\n '疏',\r\n '紓',\r\n '綀',\r\n '纾',\r\n '舒',\r\n '菽',\r\n '蔬',\r\n '踈',\r\n '軗',\r\n '輸',\r\n '输',\r\n '鄃',\r\n '陎',\r\n '鮛',\r\n '鵨',\r\n ],\r\n dǒu: ['乧', '抖', '枓', '蚪', '鈄', '阧', '陡'],\r\n shǐ: [\r\n '乨',\r\n '使',\r\n '兘',\r\n '史',\r\n '始',\r\n '宩',\r\n '屎',\r\n '榁',\r\n '矢',\r\n '笶',\r\n '豕',\r\n '鉂',\r\n '駛',\r\n '驶',\r\n ],\r\n jī: [\r\n '乩',\r\n '僟',\r\n '击',\r\n '刉',\r\n '刏',\r\n '剞',\r\n '叽',\r\n '唧',\r\n '喞',\r\n '嗘',\r\n '嘰',\r\n '圾',\r\n '基',\r\n '墼',\r\n '姬',\r\n '屐',\r\n '嵆',\r\n '嵇',\r\n '撃',\r\n '擊',\r\n '朞',\r\n '机',\r\n '枅',\r\n '樭',\r\n '機',\r\n '毄',\r\n '激',\r\n '犄',\r\n '玑',\r\n '璣',\r\n '畸',\r\n '畿',\r\n '癪',\r\n '矶',\r\n '磯',\r\n '积',\r\n '積',\r\n '笄',\r\n '筓',\r\n '箕',\r\n '簊',\r\n '緁',\r\n '羁',\r\n '羇',\r\n '羈',\r\n '耭',\r\n '肌',\r\n '芨',\r\n '虀',\r\n '覉',\r\n '覊',\r\n '譏',\r\n '譤',\r\n '讥',\r\n '賫',\r\n '賷',\r\n '赍',\r\n '跻',\r\n '踑',\r\n '躋',\r\n '躸',\r\n '銈',\r\n '錤',\r\n '鐖',\r\n '鑇',\r\n '鑙',\r\n '隮',\r\n '雞',\r\n '鞿',\r\n '韲',\r\n '飢',\r\n '饑',\r\n '饥',\r\n '魕',\r\n '鳮',\r\n '鶏',\r\n '鶺',\r\n '鷄',\r\n '鸄',\r\n '鸡',\r\n '齎',\r\n '齏',\r\n '齑',\r\n '𬯀',\r\n '𫓯',\r\n '𫓹',\r\n '𫌀',\r\n ],\r\n náng: ['乪', '嚢', '欜', '蠰', '饢'],\r\n jiā: [\r\n '乫',\r\n '佳',\r\n '傢',\r\n '加',\r\n '嘉',\r\n '抸',\r\n '枷',\r\n '梜',\r\n '毠',\r\n '泇',\r\n '浃',\r\n '浹',\r\n '犌',\r\n '猳',\r\n '珈',\r\n '痂',\r\n '笳',\r\n '糘',\r\n '耞',\r\n '腵',\r\n '葭',\r\n '袈',\r\n '豭',\r\n '貑',\r\n '跏',\r\n '迦',\r\n '鉫',\r\n '鎵',\r\n '镓',\r\n '鴐',\r\n '麚',\r\n '𬂩',\r\n ],\r\n jù: [\r\n '乬',\r\n '倨',\r\n '倶',\r\n '具',\r\n '剧',\r\n '劇',\r\n '勮',\r\n '埧',\r\n '埾',\r\n '壉',\r\n '姖',\r\n '屦',\r\n '屨',\r\n '岠',\r\n '巨',\r\n '巪',\r\n '怇',\r\n '惧',\r\n '愳',\r\n '懅',\r\n '懼',\r\n '拒',\r\n '拠',\r\n '昛',\r\n '歫',\r\n '洰',\r\n '澽',\r\n '炬',\r\n '烥',\r\n '犋',\r\n '秬',\r\n '窭',\r\n '窶',\r\n '簴',\r\n '粔',\r\n '耟',\r\n '聚',\r\n '虡',\r\n '蚷',\r\n '詎',\r\n '讵',\r\n '豦',\r\n '距',\r\n '踞',\r\n '躆',\r\n '遽',\r\n '邭',\r\n '醵',\r\n '鉅',\r\n '鐻',\r\n '钜',\r\n '颶',\r\n '飓',\r\n '駏',\r\n '鮔',\r\n ],\r\n shí: [\r\n '乭',\r\n '十',\r\n '埘',\r\n '塒',\r\n '姼',\r\n '实',\r\n '実',\r\n '寔',\r\n '實',\r\n '峕',\r\n '嵵',\r\n '时',\r\n '旹',\r\n '時',\r\n '榯',\r\n '湜',\r\n '溡',\r\n '炻',\r\n '祏',\r\n '竍',\r\n '蚀',\r\n '蝕',\r\n '辻',\r\n '遈',\r\n '鉐',\r\n '飠',\r\n '饣',\r\n '鮖',\r\n '鰣',\r\n '鲥',\r\n '鼫',\r\n '鼭',\r\n ],\r\n mǎo: ['乮', '冇', '卯', '峁', '戼', '昴', '泖', '笷', '蓩', '鉚', '铆'],\r\n mǎi: ['买', '嘪', '荬', '蕒', '買', '鷶'],\r\n luàn: ['乱', '亂', '釠'],\r\n rǔ: ['乳', '擩', '汝', '肗', '辱', '鄏'],\r\n xué: [\r\n '乴',\r\n '学',\r\n '學',\r\n '峃',\r\n '嶨',\r\n '斈',\r\n '泶',\r\n '澩',\r\n '燢',\r\n '穴',\r\n '茓',\r\n '袕',\r\n '踅',\r\n '鷽',\r\n '鸴',\r\n ],\r\n yǎn: [\r\n '䶮',\r\n '乵',\r\n '俨',\r\n '偃',\r\n '儼',\r\n '兖',\r\n '兗',\r\n '厣',\r\n '厴',\r\n '噞',\r\n '孍',\r\n '嵃',\r\n '巘',\r\n '巚',\r\n '弇',\r\n '愝',\r\n '戭',\r\n '扊',\r\n '抁',\r\n '掩',\r\n '揜',\r\n '曮',\r\n '椼',\r\n '檿',\r\n '沇',\r\n '渷',\r\n '演',\r\n '琰',\r\n '甗',\r\n '眼',\r\n '罨',\r\n '萒',\r\n '蝘',\r\n '衍',\r\n '褗',\r\n '躽',\r\n '遃',\r\n '郾',\r\n '隒',\r\n '顩',\r\n '魇',\r\n '魘',\r\n '鰋',\r\n '鶠',\r\n '黡',\r\n '黤',\r\n '黬',\r\n '黭',\r\n '黶',\r\n '鼴',\r\n '鼹',\r\n '齴',\r\n '龑',\r\n '𬸘',\r\n '𬙂',\r\n '𪩘',\r\n ],\r\n fǔ: [\r\n '乶',\r\n '俌',\r\n '俛',\r\n '俯',\r\n '府',\r\n '弣',\r\n '抚',\r\n '拊',\r\n '撫',\r\n '斧',\r\n '椨',\r\n '滏',\r\n '焤',\r\n '甫',\r\n '盙',\r\n '簠',\r\n '腐',\r\n '腑',\r\n '蜅',\r\n '輔',\r\n '辅',\r\n '郙',\r\n '釜',\r\n '釡',\r\n '阝',\r\n '頫',\r\n '鬴',\r\n '黼',\r\n '㕮',\r\n '𫖯',\r\n ],\r\n shā: [\r\n '乷',\r\n '唦',\r\n '杀',\r\n '桬',\r\n '殺',\r\n '毮',\r\n '猀',\r\n '痧',\r\n '砂',\r\n '硰',\r\n '紗',\r\n '繺',\r\n '纱',\r\n '蔱',\r\n '裟',\r\n '鎩',\r\n '铩',\r\n '閷',\r\n '髿',\r\n '魦',\r\n '鯊',\r\n '鯋',\r\n '鲨',\r\n ],\r\n nǎ: ['乸', '雫'],\r\n qián: [\r\n '乹',\r\n '亁',\r\n '仱',\r\n '偂',\r\n '前',\r\n '墘',\r\n '媊',\r\n '岒',\r\n '拑',\r\n '掮',\r\n '榩',\r\n '橬',\r\n '歬',\r\n '潛',\r\n '潜',\r\n '濳',\r\n '灊',\r\n '箝',\r\n '葥',\r\n '虔',\r\n '軡',\r\n '鈐',\r\n '鉗',\r\n '銭',\r\n '錢',\r\n '鎆',\r\n '钤',\r\n '钱',\r\n '钳',\r\n '靬',\r\n '騚',\r\n '騝',\r\n '鰬',\r\n '黔',\r\n '黚',\r\n ],\r\n suǒ: [\r\n '乺',\r\n '唢',\r\n '嗩',\r\n '所',\r\n '暛',\r\n '溑',\r\n '溹',\r\n '琐',\r\n '琑',\r\n '瑣',\r\n '索',\r\n '褨',\r\n '鎖',\r\n '鎻',\r\n '鏁',\r\n '锁',\r\n ],\r\n yú: [\r\n '乻',\r\n '于',\r\n '亐',\r\n '伃',\r\n '余',\r\n '堣',\r\n '堬',\r\n '妤',\r\n '娛',\r\n '娯',\r\n '娱',\r\n '嬩',\r\n '崳',\r\n '嵎',\r\n '嵛',\r\n '愚',\r\n '扵',\r\n '揄',\r\n '旟',\r\n '楡',\r\n '楰',\r\n '榆',\r\n '欤',\r\n '歈',\r\n '歟',\r\n '歶',\r\n '渔',\r\n '渝',\r\n '湡',\r\n '漁',\r\n '澞',\r\n '牏',\r\n '狳',\r\n '玗',\r\n '玙',\r\n '瑜',\r\n '璵',\r\n '盂',\r\n '睮',\r\n '窬',\r\n '竽',\r\n '籅',\r\n '羭',\r\n '腴',\r\n '臾',\r\n '舁',\r\n '舆',\r\n '艅',\r\n '茰',\r\n '萮',\r\n '萸',\r\n '蕍',\r\n '蘛',\r\n '虞',\r\n '虶',\r\n '蝓',\r\n '螸',\r\n '衧',\r\n '褕',\r\n '覦',\r\n '觎',\r\n '諛',\r\n '謣',\r\n '谀',\r\n '踰',\r\n '輿',\r\n '轝',\r\n '逾',\r\n '邘',\r\n '酑',\r\n '鍝',\r\n '隅',\r\n '雓',\r\n '雩',\r\n '餘',\r\n '馀',\r\n '騟',\r\n '骬',\r\n '髃',\r\n '魚',\r\n '魣',\r\n '鮽',\r\n '鯲',\r\n '鰅',\r\n '鱼',\r\n '鷠',\r\n '鸆',\r\n '齵',\r\n ],\r\n zhù: [\r\n '乼',\r\n '伫',\r\n '佇',\r\n '住',\r\n '坾',\r\n '墸',\r\n '壴',\r\n '嵀',\r\n '拀',\r\n '杼',\r\n '柱',\r\n '樦',\r\n '殶',\r\n '注',\r\n '炷',\r\n '疰',\r\n '眝',\r\n '祝',\r\n '祩',\r\n '竚',\r\n '筯',\r\n '箸',\r\n '篫',\r\n '簗',\r\n '紵',\r\n '紸',\r\n '纻',\r\n '羜',\r\n '翥',\r\n '苎',\r\n '莇',\r\n '蛀',\r\n '註',\r\n '貯',\r\n '贮',\r\n '跓',\r\n '軴',\r\n '鉒',\r\n '鋳',\r\n '鑄',\r\n '铸',\r\n '馵',\r\n '駐',\r\n '驻',\r\n ],\r\n zhě: ['乽', '者', '褶', '襵', '赭', '踷', '鍺', '锗'],\r\n 'qián gān': ['乾'],\r\n 'zhì luàn': ['乿'],\r\n guī: [\r\n '亀',\r\n '圭',\r\n '妫',\r\n '媯',\r\n '嫢',\r\n '嬀',\r\n '帰',\r\n '归',\r\n '摫',\r\n '椝',\r\n '槻',\r\n '槼',\r\n '櫷',\r\n '歸',\r\n '珪',\r\n '瑰',\r\n '璝',\r\n '瓌',\r\n '皈',\r\n '瞡',\r\n '硅',\r\n '茥',\r\n '蘬',\r\n '規',\r\n '规',\r\n '邽',\r\n '郌',\r\n '閨',\r\n '闺',\r\n '騩',\r\n '鬶',\r\n '鬹',\r\n ],\r\n 'lǐn lìn': ['亃'],\r\n jué: [\r\n '亅',\r\n '决',\r\n '刔',\r\n '劂',\r\n '匷',\r\n '厥',\r\n '噊',\r\n '孒',\r\n '孓',\r\n '崛',\r\n '崫',\r\n '嶥',\r\n '彏',\r\n '憠',\r\n '憰',\r\n '戄',\r\n '抉',\r\n '挗',\r\n '掘',\r\n '攫',\r\n '桷',\r\n '橛',\r\n '橜',\r\n '欮',\r\n '氒',\r\n '決',\r\n '灍',\r\n '焳',\r\n '熦',\r\n '爑',\r\n '爴',\r\n '爵',\r\n '獗',\r\n '玃',\r\n '玦',\r\n '玨',\r\n '珏',\r\n '瑴',\r\n '瘚',\r\n '矍',\r\n '矡',\r\n '砄',\r\n '絕',\r\n '絶',\r\n '绝',\r\n '臄',\r\n '芵',\r\n '蕝',\r\n '蕨',\r\n '虳',\r\n '蟨',\r\n '蟩',\r\n '觖',\r\n '觮',\r\n '觼',\r\n '訣',\r\n '譎',\r\n '诀',\r\n '谲',\r\n '貜',\r\n '赽',\r\n '趉',\r\n '蹷',\r\n '躩',\r\n '鈌',\r\n '鐍',\r\n '鐝',\r\n '钁',\r\n '镢',\r\n '鴂',\r\n '鴃',\r\n '鷢',\r\n '𫘝',\r\n '㵐',\r\n '𫔎',\r\n ],\r\n 'le liǎo': ['了'],\r\n 'gè mā': ['亇'],\r\n 'yǔ yú': ['予', '懙'],\r\n zhēng: [\r\n '争',\r\n '佂',\r\n '凧',\r\n '姃',\r\n '媜',\r\n '峥',\r\n '崝',\r\n '崢',\r\n '征',\r\n '徰',\r\n '炡',\r\n '烝',\r\n '爭',\r\n '狰',\r\n '猙',\r\n '癥',\r\n '眐',\r\n '睁',\r\n '睜',\r\n '筝',\r\n '箏',\r\n '篜',\r\n '聇',\r\n '脀',\r\n '蒸',\r\n '踭',\r\n '鉦',\r\n '錚',\r\n '鏳',\r\n '鬇',\r\n ],\r\n èr: ['二', '刵', '咡', '弍', '弐', '樲', '誀', '貮', '貳', '贰', '髶'],\r\n chù: [\r\n '亍',\r\n '傗',\r\n '儊',\r\n '怵',\r\n '憷',\r\n '搐',\r\n '斶',\r\n '歜',\r\n '珿',\r\n '琡',\r\n '矗',\r\n '竌',\r\n '絀',\r\n '绌',\r\n '臅',\r\n '触',\r\n '觸',\r\n '豖',\r\n '鄐',\r\n '閦',\r\n '黜',\r\n ],\r\n kuī: ['亏', '刲', '岿', '巋', '盔', '窥', '窺', '聧', '虧', '闚', '顝'],\r\n yún: [\r\n '云',\r\n '伝',\r\n '勻',\r\n '匀',\r\n '囩',\r\n '妘',\r\n '愪',\r\n '抣',\r\n '昀',\r\n '橒',\r\n '沄',\r\n '涢',\r\n '溳',\r\n '澐',\r\n '熉',\r\n '畇',\r\n '秐',\r\n '筼',\r\n '篔',\r\n '紜',\r\n '縜',\r\n '纭',\r\n '耘',\r\n '芸',\r\n '蒷',\r\n '蕓',\r\n '郧',\r\n '鄖',\r\n '鋆',\r\n '雲',\r\n ],\r\n hù: [\r\n '互',\r\n '冱',\r\n '嗀',\r\n '嚛',\r\n '婟',\r\n '嫭',\r\n '嫮',\r\n '岵',\r\n '帍',\r\n '弖',\r\n '怙',\r\n '戶',\r\n '户',\r\n '戸',\r\n '戽',\r\n '扈',\r\n '护',\r\n '昈',\r\n '槴',\r\n '沍',\r\n '沪',\r\n '滬',\r\n '熩',\r\n '瓠',\r\n '祜',\r\n '笏',\r\n '簄',\r\n '粐',\r\n '綔',\r\n '蔰',\r\n '護',\r\n '豰',\r\n '鄠',\r\n '鍙',\r\n '頀',\r\n '鱯',\r\n '鳠',\r\n '鳸',\r\n '鸌',\r\n '鹱',\r\n ],\r\n qí: [\r\n '亓',\r\n '剘',\r\n '埼',\r\n '岐',\r\n '岓',\r\n '崎',\r\n '嵜',\r\n '愭',\r\n '掑',\r\n '斉',\r\n '斊',\r\n '旂',\r\n '旗',\r\n '棊',\r\n '棋',\r\n '檱',\r\n '櫀',\r\n '歧',\r\n '淇',\r\n '濝',\r\n '猉',\r\n '玂',\r\n '琦',\r\n '琪',\r\n '璂',\r\n '畦',\r\n '疧',\r\n '碁',\r\n '碕',\r\n '祁',\r\n '祈',\r\n '祺',\r\n '禥',\r\n '竒',\r\n '簯',\r\n '簱',\r\n '籏',\r\n '粸',\r\n '綥',\r\n '綦',\r\n '肵',\r\n '脐',\r\n '臍',\r\n '艩',\r\n '芪',\r\n '萁',\r\n '萕',\r\n '蕲',\r\n '藄',\r\n '蘄',\r\n '蚑',\r\n '蚚',\r\n '蛴',\r\n '蜝',\r\n '蜞',\r\n '螧',\r\n '蠐',\r\n '褀',\r\n '軝',\r\n '鄿',\r\n '釮',\r\n '錡',\r\n '锜',\r\n '陭',\r\n '頎',\r\n '颀',\r\n '騎',\r\n '騏',\r\n '騹',\r\n '骐',\r\n '骑',\r\n '鬐',\r\n '鬿',\r\n '鯕',\r\n '鰭',\r\n '鲯',\r\n '鳍',\r\n '鵸',\r\n '鶀',\r\n '麒',\r\n '麡',\r\n '𨙸',\r\n '𬨂',\r\n '䓫',\r\n ],\r\n jǐng: [\r\n '井',\r\n '儆',\r\n '刭',\r\n '剄',\r\n '坓',\r\n '宑',\r\n '幜',\r\n '憬',\r\n '暻',\r\n '殌',\r\n '汫',\r\n '汬',\r\n '澋',\r\n '璄',\r\n '璟',\r\n '璥',\r\n '穽',\r\n '肼',\r\n '蟼',\r\n '警',\r\n '阱',\r\n '頚',\r\n '頸',\r\n ],\r\n sì: [\r\n '亖',\r\n '佀',\r\n '価',\r\n '儩',\r\n '兕',\r\n '嗣',\r\n '四',\r\n '姒',\r\n '娰',\r\n '孠',\r\n '寺',\r\n '巳',\r\n '柶',\r\n '榹',\r\n '汜',\r\n '泗',\r\n '泤',\r\n '洍',\r\n '洠',\r\n '涘',\r\n '瀃',\r\n '牭',\r\n '祀',\r\n '禩',\r\n '竢',\r\n '笥',\r\n '耜',\r\n '肂',\r\n '肆',\r\n '蕼',\r\n '覗',\r\n '貄',\r\n '釲',\r\n '鈶',\r\n '鈻',\r\n '飤',\r\n '飼',\r\n '饲',\r\n '駟',\r\n '騃',\r\n '驷',\r\n ],\r\n suì: [\r\n '亗',\r\n '嬘',\r\n '岁',\r\n '嵗',\r\n '旞',\r\n '檖',\r\n '歲',\r\n '歳',\r\n '澻',\r\n '煫',\r\n '燧',\r\n '璲',\r\n '砕',\r\n '碎',\r\n '祟',\r\n '禭',\r\n '穂',\r\n '穗',\r\n '穟',\r\n '繀',\r\n '繐',\r\n '繸',\r\n '襚',\r\n '誶',\r\n '譢',\r\n '谇',\r\n '賥',\r\n '邃',\r\n '鐆',\r\n '鐩',\r\n '隧',\r\n '韢',\r\n '𫟦',\r\n '𬭼',\r\n ],\r\n gèn: ['亘', '亙', '揯', '搄', '茛'],\r\n yà: [\r\n '亚',\r\n '亜',\r\n '俹',\r\n '冴',\r\n '劜',\r\n '圔',\r\n '圠',\r\n '埡',\r\n '娅',\r\n '婭',\r\n '揠',\r\n '氩',\r\n '氬',\r\n '犽',\r\n '砑',\r\n '稏',\r\n '聐',\r\n '襾',\r\n '覀',\r\n '訝',\r\n '讶',\r\n '迓',\r\n '齾',\r\n ],\r\n 'xiē suò': ['些'],\r\n 'qí zhāi': ['亝', '齊'],\r\n 'yā yà': ['亞', '压', '垭', '壓', '铔'],\r\n 'jí qì': ['亟', '焏'],\r\n tóu: ['亠', '投', '頭', '骰'],\r\n 'wáng wú': ['亡'],\r\n 'kàng háng gāng': ['亢'],\r\n dà: ['亣', '眔'],\r\n jiāo: [\r\n '交',\r\n '僬',\r\n '娇',\r\n '嬌',\r\n '峧',\r\n '嶕',\r\n '嶣',\r\n '憍',\r\n '椒',\r\n '浇',\r\n '澆',\r\n '焦',\r\n '礁',\r\n '穚',\r\n '簥',\r\n '胶',\r\n '膠',\r\n '膲',\r\n '茭',\r\n '茮',\r\n '蕉',\r\n '虠',\r\n '蛟',\r\n '蟭',\r\n '跤',\r\n '轇',\r\n '郊',\r\n '鐎',\r\n '驕',\r\n '骄',\r\n '鮫',\r\n '鲛',\r\n '鵁',\r\n '鷦',\r\n '鷮',\r\n '鹪',\r\n '䴔',\r\n ],\r\n hài: ['亥', '嗐', '害', '氦', '餀', '饚', '駭', '駴', '骇'],\r\n 'hēng pēng': ['亨'],\r\n mǔ: [\r\n '亩',\r\n '姆',\r\n '峔',\r\n '拇',\r\n '母',\r\n '牡',\r\n '牳',\r\n '畂',\r\n '畆',\r\n '畒',\r\n '畝',\r\n '畞',\r\n '畮',\r\n '砪',\r\n '胟',\r\n '踇',\r\n '鉧',\r\n '𬭁',\r\n '𧿹',\r\n ],\r\n ye: ['亪'],\r\n xiǎng: [\r\n '享',\r\n '亯',\r\n '响',\r\n '想',\r\n '晑',\r\n '蚃',\r\n '蠁',\r\n '響',\r\n '飨',\r\n '餉',\r\n '饗',\r\n '饷',\r\n '鮝',\r\n '鯗',\r\n '鱶',\r\n '鲞',\r\n ],\r\n jīng: [\r\n '京',\r\n '亰',\r\n '兢',\r\n '坕',\r\n '坙',\r\n '婛',\r\n '惊',\r\n '旌',\r\n '旍',\r\n '晶',\r\n '橸',\r\n '泾',\r\n '涇',\r\n '猄',\r\n '睛',\r\n '秔',\r\n '稉',\r\n '粳',\r\n '精',\r\n '経',\r\n '經',\r\n '綡',\r\n '聙',\r\n '腈',\r\n '茎',\r\n '荆',\r\n '荊',\r\n '菁',\r\n '葏',\r\n '驚',\r\n '鯨',\r\n '鲸',\r\n '鶁',\r\n '鶄',\r\n '麖',\r\n '麠',\r\n '鼱',\r\n '䴖',\r\n ],\r\n tíng: [\r\n '亭',\r\n '停',\r\n '婷',\r\n '嵉',\r\n '庭',\r\n '廷',\r\n '楟',\r\n '榳',\r\n '筳',\r\n '聤',\r\n '莛',\r\n '葶',\r\n '蜓',\r\n '蝏',\r\n '諪',\r\n '邒',\r\n '霆',\r\n '鼮',\r\n '䗴',\r\n ],\r\n liàng: ['亮', '喨', '悢', '晾', '湸', '諒', '谅', '輌', '輛', '辆', '鍄'],\r\n 'qīn qìng': ['亲', '親'],\r\n bó: [\r\n '亳',\r\n '仢',\r\n '侼',\r\n '僰',\r\n '博',\r\n '帛',\r\n '愽',\r\n '懪',\r\n '挬',\r\n '搏',\r\n '欂',\r\n '浡',\r\n '淿',\r\n '渤',\r\n '煿',\r\n '牔',\r\n '狛',\r\n '瓝',\r\n '礴',\r\n '秡',\r\n '箔',\r\n '簙',\r\n '糪',\r\n '胉',\r\n '脖',\r\n '膊',\r\n '舶',\r\n '艊',\r\n '萡',\r\n '葧',\r\n '袯',\r\n '襏',\r\n '襮',\r\n '謈',\r\n '踣',\r\n '郣',\r\n '鈸',\r\n '鉑',\r\n '鋍',\r\n '鎛',\r\n '鑮',\r\n '钹',\r\n '铂',\r\n '镈',\r\n '餺',\r\n '馎',\r\n '馛',\r\n '馞',\r\n '駁',\r\n '駮',\r\n '驳',\r\n '髆',\r\n '鵓',\r\n '鹁',\r\n ],\r\n yòu: [\r\n '亴',\r\n '佑',\r\n '佦',\r\n '侑',\r\n '又',\r\n '右',\r\n '哊',\r\n '唀',\r\n '囿',\r\n '姷',\r\n '宥',\r\n '峟',\r\n '幼',\r\n '狖',\r\n '祐',\r\n '蚴',\r\n '誘',\r\n '诱',\r\n '貁',\r\n '迶',\r\n '酭',\r\n '釉',\r\n '鼬',\r\n ],\r\n xiè: [\r\n '亵',\r\n '伳',\r\n '偞',\r\n '偰',\r\n '僁',\r\n '卨',\r\n '卸',\r\n '噧',\r\n '塮',\r\n '夑',\r\n '媟',\r\n '屑',\r\n '屧',\r\n '廨',\r\n '徢',\r\n '懈',\r\n '暬',\r\n '械',\r\n '榍',\r\n '榭',\r\n '泻',\r\n '洩',\r\n '渫',\r\n '澥',\r\n '瀉',\r\n '瀣',\r\n '灺',\r\n '炧',\r\n '炨',\r\n '燮',\r\n '爕',\r\n '獬',\r\n '祄',\r\n '禼',\r\n '糏',\r\n '紲',\r\n '絏',\r\n '絬',\r\n '繲',\r\n '纈',\r\n '绁',\r\n '缷',\r\n '薢',\r\n '薤',\r\n '蟹',\r\n '蠏',\r\n '褉',\r\n '褻',\r\n '謝',\r\n '谢',\r\n '躞',\r\n '邂',\r\n '靾',\r\n '韰',\r\n '齂',\r\n '齘',\r\n '齛',\r\n '齥',\r\n '𬹼',\r\n '𤫉',\r\n ],\r\n 'dǎn dàn': ['亶', '馾'],\r\n lián: [\r\n '亷',\r\n '劆',\r\n '匲',\r\n '匳',\r\n '嗹',\r\n '噒',\r\n '奁',\r\n '奩',\r\n '嫾',\r\n '帘',\r\n '廉',\r\n '怜',\r\n '憐',\r\n '涟',\r\n '漣',\r\n '濂',\r\n '濓',\r\n '瀮',\r\n '熑',\r\n '燫',\r\n '簾',\r\n '籢',\r\n '籨',\r\n '縺',\r\n '翴',\r\n '联',\r\n '聨',\r\n '聫',\r\n '聮',\r\n '聯',\r\n '臁',\r\n '莲',\r\n '蓮',\r\n '薕',\r\n '螊',\r\n '蠊',\r\n '裢',\r\n '褳',\r\n '覝',\r\n '謰',\r\n '蹥',\r\n '连',\r\n '連',\r\n '鎌',\r\n '鐮',\r\n '镰',\r\n '鬑',\r\n '鰱',\r\n '鲢',\r\n ],\r\n duǒ: [\r\n '亸',\r\n '哚',\r\n '嚲',\r\n '埵',\r\n '崜',\r\n '朵',\r\n '朶',\r\n '綞',\r\n '缍',\r\n '趓',\r\n '躱',\r\n '躲',\r\n '軃',\r\n ],\r\n 'wěi mén': ['亹', '斖'],\r\n rén: ['人', '亻', '仁', '壬', '忈', '忎', '朲', '秂', '芢', '魜', '鵀'],\r\n jí: [\r\n '亼',\r\n '亽',\r\n '伋',\r\n '佶',\r\n '偮',\r\n '卙',\r\n '即',\r\n '卽',\r\n '及',\r\n '叝',\r\n '吉',\r\n '堲',\r\n '塉',\r\n '姞',\r\n '嫉',\r\n '岌',\r\n '嵴',\r\n '嶯',\r\n '彶',\r\n '忣',\r\n '急',\r\n '愱',\r\n '戢',\r\n '揤',\r\n '极',\r\n '棘',\r\n '楫',\r\n '極',\r\n '槉',\r\n '檝',\r\n '殛',\r\n '汲',\r\n '湒',\r\n '潗',\r\n '疾',\r\n '瘠',\r\n '皍',\r\n '笈',\r\n '箿',\r\n '籍',\r\n '級',\r\n '级',\r\n '膌',\r\n '艥',\r\n '蒺',\r\n '蕀',\r\n '蕺',\r\n '蝍',\r\n '螏',\r\n '襋',\r\n '觙',\r\n '谻',\r\n '踖',\r\n '蹐',\r\n '躤',\r\n '輯',\r\n '轚',\r\n '辑',\r\n '郆',\r\n '銡',\r\n '鍓',\r\n '鏶',\r\n '集',\r\n '雧',\r\n '霵',\r\n '鹡',\r\n '㴔',\r\n ],\r\n wáng: ['亾', '仼', '兦', '莣', '蚟'],\r\n 'shén shí': ['什'],\r\n lè: [\r\n '仂',\r\n '叻',\r\n '忇',\r\n '氻',\r\n '泐',\r\n '玏',\r\n '砳',\r\n '簕',\r\n '艻',\r\n '阞',\r\n '韷',\r\n '餎',\r\n '鰳',\r\n '鱳',\r\n '鳓',\r\n ],\r\n dīng: ['仃', '叮', '帄', '玎', '疔', '盯', '耵', '虰', '靪'],\r\n zè: ['仄', '崱', '庂', '捑', '昃', '昗', '汄'],\r\n 'jǐn jìn': ['仅', '僅', '嫤'],\r\n 'pú pū': ['仆'],\r\n 'chóu qiú': ['仇'],\r\n zhǎng: ['仉', '幥', '掌', '礃'],\r\n jīn: [\r\n '今',\r\n '堻',\r\n '巾',\r\n '惍',\r\n '斤',\r\n '津',\r\n '珒',\r\n '琻',\r\n '璡',\r\n '砛',\r\n '筋',\r\n '荕',\r\n '衿',\r\n '襟',\r\n '觔',\r\n '金',\r\n '釒',\r\n '釿',\r\n '钅',\r\n '鹶',\r\n '黅',\r\n '𬬱',\r\n ],\r\n bīng: ['仌', '仒', '兵', '冫', '冰', '掤', '氷', '鋲'],\r\n réng: ['仍', '礽', '芿', '辸', '陾'],\r\n fó: ['仏', '坲', '梻'],\r\n 'jīn sǎn': ['仐'],\r\n lún: [\r\n '仑',\r\n '伦',\r\n '侖',\r\n '倫',\r\n '囵',\r\n '圇',\r\n '婨',\r\n '崘',\r\n '崙',\r\n '棆',\r\n '沦',\r\n '淪',\r\n '磮',\r\n '腀',\r\n '菕',\r\n '蜦',\r\n '踚',\r\n '輪',\r\n '轮',\r\n '錀',\r\n '陯',\r\n '鯩',\r\n '𬬭',\r\n ],\r\n cāng: [\r\n '仓',\r\n '仺',\r\n '倉',\r\n '凔',\r\n '嵢',\r\n '沧',\r\n '滄',\r\n '濸',\r\n '獊',\r\n '舱',\r\n '艙',\r\n '苍',\r\n '蒼',\r\n '螥',\r\n '鸧',\r\n ],\r\n 'zǎi zǐ zī': ['仔'],\r\n tā: ['他', '塌', '它', '榙', '溻', '牠', '祂', '褟', '趿', '遢', '闧'],\r\n fù: [\r\n '付',\r\n '偩',\r\n '傅',\r\n '冨',\r\n '副',\r\n '咐',\r\n '坿',\r\n '复',\r\n '妇',\r\n '婦',\r\n '媍',\r\n '嬔',\r\n '富',\r\n '復',\r\n '椱',\r\n '祔',\r\n '禣',\r\n '竎',\r\n '緮',\r\n '縛',\r\n '缚',\r\n '腹',\r\n '萯',\r\n '蕧',\r\n '蚹',\r\n '蛗',\r\n '蝜',\r\n '蝮',\r\n '袝',\r\n '複',\r\n '覄',\r\n '覆',\r\n '訃',\r\n '詂',\r\n '讣',\r\n '負',\r\n '賦',\r\n '賻',\r\n '负',\r\n '赋',\r\n '赙',\r\n '赴',\r\n '輹',\r\n '鍑',\r\n '鍢',\r\n '阜',\r\n '附',\r\n '馥',\r\n '駙',\r\n '驸',\r\n '鮒',\r\n '鰒',\r\n '鲋',\r\n '鳆',\r\n '㳇',\r\n ],\r\n xiān: [\r\n '仙',\r\n '仚',\r\n '佡',\r\n '僊',\r\n '僲',\r\n '先',\r\n '嘕',\r\n '奾',\r\n '屳',\r\n '廯',\r\n '忺',\r\n '憸',\r\n '掀',\r\n '暹',\r\n '杴',\r\n '氙',\r\n '珗',\r\n '祆',\r\n '秈',\r\n '籼',\r\n '繊',\r\n '纎',\r\n '纖',\r\n '苮',\r\n '褼',\r\n '襳',\r\n '跹',\r\n '蹮',\r\n '躚',\r\n '酰',\r\n '鍁',\r\n '锨',\r\n '韯',\r\n '韱',\r\n '馦',\r\n '鱻',\r\n '鶱',\r\n '𬸣',\r\n ],\r\n 'tuō chà duó': ['仛'],\r\n hóng: [\r\n '仜',\r\n '吰',\r\n '垬',\r\n '妅',\r\n '娂',\r\n '宏',\r\n '宖',\r\n '弘',\r\n '彋',\r\n '汯',\r\n '泓',\r\n '洪',\r\n '浤',\r\n '渱',\r\n '潂',\r\n '玒',\r\n '玜',\r\n '竑',\r\n '竤',\r\n '篊',\r\n '粠',\r\n '紘',\r\n '紭',\r\n '綋',\r\n '纮',\r\n '翃',\r\n '翝',\r\n '耾',\r\n '苰',\r\n '荭',\r\n '葒',\r\n '葓',\r\n '谹',\r\n '谼',\r\n '鈜',\r\n '鉷',\r\n '鋐',\r\n '閎',\r\n '闳',\r\n '霐',\r\n '霟',\r\n '鞃',\r\n '魟',\r\n '鴻',\r\n '鸿',\r\n '黉',\r\n '黌',\r\n '𫟹',\r\n '𬭎',\r\n ],\r\n tóng: [\r\n '仝',\r\n '佟',\r\n '哃',\r\n '峂',\r\n '峝',\r\n '庝',\r\n '彤',\r\n '晍',\r\n '曈',\r\n '桐',\r\n '氃',\r\n '浵',\r\n '潼',\r\n '犝',\r\n '獞',\r\n '眮',\r\n '瞳',\r\n '砼',\r\n '秱',\r\n '童',\r\n '粡',\r\n '膧',\r\n '茼',\r\n '蚒',\r\n '詷',\r\n '赨',\r\n '酮',\r\n '鉖',\r\n '鉵',\r\n '銅',\r\n '铜',\r\n '餇',\r\n '鮦',\r\n '鲖',\r\n '𫍣',\r\n '𦒍',\r\n ],\r\n rèn: [\r\n '仞',\r\n '仭',\r\n '刃',\r\n '刄',\r\n '妊',\r\n '姙',\r\n '屻',\r\n '岃',\r\n '扨',\r\n '牣',\r\n '祍',\r\n '紉',\r\n '紝',\r\n '絍',\r\n '纫',\r\n '纴',\r\n '肕',\r\n '腍',\r\n '衽',\r\n '袵',\r\n '訒',\r\n '認',\r\n '认',\r\n '讱',\r\n '軔',\r\n '轫',\r\n '鈓',\r\n '靭',\r\n '靱',\r\n '韌',\r\n '韧',\r\n '飪',\r\n '餁',\r\n '饪',\r\n ],\r\n qiān: [\r\n '仟',\r\n '佥',\r\n '僉',\r\n '千',\r\n '圲',\r\n '奷',\r\n '孯',\r\n '岍',\r\n '悭',\r\n '愆',\r\n '慳',\r\n '扦',\r\n '拪',\r\n '搴',\r\n '撁',\r\n '攐',\r\n '攑',\r\n '攓',\r\n '杄',\r\n '櫏',\r\n '汘',\r\n '汧',\r\n '牵',\r\n '牽',\r\n '竏',\r\n '签',\r\n '簽',\r\n '籖',\r\n '籤',\r\n '粁',\r\n '芊',\r\n '茾',\r\n '蚈',\r\n '褰',\r\n '諐',\r\n '謙',\r\n '谦',\r\n '谸',\r\n '迁',\r\n '遷',\r\n '釺',\r\n '鈆',\r\n '鉛',\r\n '鏲',\r\n '钎',\r\n '阡',\r\n '韆',\r\n '顅',\r\n '騫',\r\n '骞',\r\n '鬜',\r\n '鬝',\r\n '鵮',\r\n '鹐',\r\n ],\r\n 'gǎn hàn': ['仠'],\r\n 'yì gē': ['仡'],\r\n dài: [\r\n '代',\r\n '侢',\r\n '叇',\r\n '垈',\r\n '埭',\r\n '岱',\r\n '帒',\r\n '带',\r\n '帯',\r\n '帶',\r\n '廗',\r\n '怠',\r\n '戴',\r\n '曃',\r\n '柋',\r\n '殆',\r\n '瀻',\r\n '玳',\r\n '瑇',\r\n '甙',\r\n '簤',\r\n '紿',\r\n '緿',\r\n '绐',\r\n '艜',\r\n '蝳',\r\n '袋',\r\n '襶',\r\n '貣',\r\n '贷',\r\n '蹛',\r\n '軑',\r\n '軚',\r\n '軩',\r\n '轪',\r\n '迨',\r\n '霴',\r\n '靆',\r\n '鴏',\r\n '黛',\r\n '黱',\r\n ],\r\n 'lìng líng lǐng': ['令'],\r\n chào: ['仦', '耖', '觘'],\r\n 'cháng zhǎng': ['仧', '兏', '長', '长'],\r\n sā: ['仨'],\r\n cháng: [\r\n '仩',\r\n '偿',\r\n '償',\r\n '嘗',\r\n '嚐',\r\n '嫦',\r\n '尝',\r\n '常',\r\n '徜',\r\n '瑺',\r\n '瓺',\r\n '甞',\r\n '肠',\r\n '腸',\r\n '膓',\r\n '苌',\r\n '萇',\r\n '镸',\r\n '鱨',\r\n '鲿',\r\n ],\r\n yí: [\r\n '仪',\r\n '侇',\r\n '儀',\r\n '冝',\r\n '匜',\r\n '咦',\r\n '圯',\r\n '夷',\r\n '姨',\r\n '宐',\r\n '宜',\r\n '宧',\r\n '寲',\r\n '峓',\r\n '嶬',\r\n '嶷',\r\n '巸',\r\n '彛',\r\n '彜',\r\n '彝',\r\n '彞',\r\n '怡',\r\n '恞',\r\n '扅',\r\n '暆',\r\n '栘',\r\n '椬',\r\n '椸',\r\n '沂',\r\n '洟',\r\n '熪',\r\n '瓵',\r\n '痍',\r\n '移',\r\n '簃',\r\n '籎',\r\n '羠',\r\n '胰',\r\n '萓',\r\n '蛦',\r\n '螔',\r\n '觺',\r\n '謻',\r\n '貽',\r\n '贻',\r\n '跠',\r\n '迻',\r\n '遺',\r\n '鏔',\r\n '頉',\r\n '頤',\r\n '頥',\r\n '顊',\r\n '颐',\r\n '饴',\r\n '鮧',\r\n '鴺',\r\n ],\r\n mù: [\r\n '仫',\r\n '凩',\r\n '募',\r\n '墓',\r\n '幕',\r\n '幙',\r\n '慔',\r\n '慕',\r\n '暮',\r\n '暯',\r\n '木',\r\n '楘',\r\n '毣',\r\n '沐',\r\n '炑',\r\n '牧',\r\n '狇',\r\n '目',\r\n '睦',\r\n '穆',\r\n '艒',\r\n '苜',\r\n '莯',\r\n '蚞',\r\n '鉬',\r\n '钼',\r\n '雮',\r\n '霂',\r\n ],\r\n 'men mén': ['们'],\r\n fǎn: ['仮', '反', '橎', '返'],\r\n 'chào miǎo': ['仯'],\r\n 'yǎng áng': ['仰'],\r\n zhòng: [\r\n '仲',\r\n '众',\r\n '堹',\r\n '妕',\r\n '媑',\r\n '狆',\r\n '眾',\r\n '祌',\r\n '筗',\r\n '茽',\r\n '蚛',\r\n '衆',\r\n '衶',\r\n '諥',\r\n ],\r\n 'pǐ pí': ['仳'],\r\n wò: [\r\n '仴',\r\n '偓',\r\n '卧',\r\n '媉',\r\n '幄',\r\n '握',\r\n '楃',\r\n '沃',\r\n '渥',\r\n '濣',\r\n '瓁',\r\n '瞃',\r\n '硪',\r\n '肟',\r\n '腛',\r\n '臥',\r\n '齷',\r\n '龌',\r\n ],\r\n jiàn: [\r\n '件',\r\n '俴',\r\n '健',\r\n '僭',\r\n '剑',\r\n '剣',\r\n '剱',\r\n '劍',\r\n '劎',\r\n '劒',\r\n '劔',\r\n '墹',\r\n '寋',\r\n '建',\r\n '徤',\r\n '擶',\r\n '旔',\r\n '楗',\r\n '毽',\r\n '洊',\r\n '涧',\r\n '澗',\r\n '牮',\r\n '珔',\r\n '瞷',\r\n '磵',\r\n '礀',\r\n '箭',\r\n '糋',\r\n '繝',\r\n '腱',\r\n '臶',\r\n '舰',\r\n '艦',\r\n '荐',\r\n '薦',\r\n '覸',\r\n '諓',\r\n '諫',\r\n '譛',\r\n '谏',\r\n '賎',\r\n '賤',\r\n '贱',\r\n '趝',\r\n '践',\r\n '踐',\r\n '踺',\r\n '轞',\r\n '鉴',\r\n '鍳',\r\n '鍵',\r\n '鐱',\r\n '鑑',\r\n '鑒',\r\n '鑬',\r\n '鑳',\r\n '键',\r\n '間',\r\n '餞',\r\n '饯',\r\n '𬣡',\r\n ],\r\n 'jià jiè jie': ['价'],\r\n 'yǎo fó': ['仸'],\r\n 'rèn rén': ['任'],\r\n 'fèn bīn': ['份'],\r\n dī: [\r\n '仾',\r\n '低',\r\n '啲',\r\n '埞',\r\n '堤',\r\n '岻',\r\n '彽',\r\n '樀',\r\n '滴',\r\n '磾',\r\n '秪',\r\n '羝',\r\n '袛',\r\n '趆',\r\n '隄',\r\n '鞮',\r\n '䃅',\r\n ],\r\n fǎng: [\r\n '仿',\r\n '倣',\r\n '旊',\r\n '昉',\r\n '昘',\r\n '瓬',\r\n '眆',\r\n '紡',\r\n '纺',\r\n '舫',\r\n '訪',\r\n '访',\r\n '髣',\r\n '鶭',\r\n ],\r\n zhōng: [\r\n '伀',\r\n '刣',\r\n '妐',\r\n '幒',\r\n '彸',\r\n '忠',\r\n '柊',\r\n '汷',\r\n '泈',\r\n '炂',\r\n '盅',\r\n '籦',\r\n '終',\r\n '终',\r\n '舯',\r\n '蔠',\r\n '蜙',\r\n '螤',\r\n '螽',\r\n '衳',\r\n '衷',\r\n '蹱',\r\n '鈡',\r\n '鍾',\r\n '鐘',\r\n '钟',\r\n '锺',\r\n '鴤',\r\n '鼨',\r\n ],\r\n pèi: [\r\n '伂',\r\n '佩',\r\n '姵',\r\n '帔',\r\n '斾',\r\n '旆',\r\n '沛',\r\n '浿',\r\n '珮',\r\n '蓜',\r\n '轡',\r\n '辔',\r\n '配',\r\n '霈',\r\n '馷',\r\n ],\r\n diào: [\r\n '伄',\r\n '吊',\r\n '弔',\r\n '掉',\r\n '瘹',\r\n '盄',\r\n '窎',\r\n '窵',\r\n '竨',\r\n '訋',\r\n '釣',\r\n '鈟',\r\n '銱',\r\n '鋽',\r\n '鑃',\r\n '钓',\r\n '铞',\r\n '雿',\r\n '魡',\r\n ],\r\n dùn: [\r\n '伅',\r\n '潡',\r\n '炖',\r\n '燉',\r\n '盾',\r\n '砘',\r\n '碷',\r\n '踲',\r\n '逇',\r\n '遁',\r\n '遯',\r\n '鈍',\r\n '钝',\r\n ],\r\n wěn: ['伆', '刎', '吻', '呅', '抆', '桽', '稳', '穏', '穩', '紊', '肳', '脗'],\r\n xǐn: ['伈'],\r\n kàng: ['伉', '匟', '囥', '抗', '炕', '鈧', '钪'],\r\n ài: [\r\n '伌',\r\n '僾',\r\n '塧',\r\n '壒',\r\n '嫒',\r\n '嬡',\r\n '愛',\r\n '懓',\r\n '暧',\r\n '曖',\r\n '爱',\r\n '瑷',\r\n '璦',\r\n '皧',\r\n '瞹',\r\n '砹',\r\n '硋',\r\n '碍',\r\n '礙',\r\n '薆',\r\n '譺',\r\n '賹',\r\n '鑀',\r\n '隘',\r\n '靉',\r\n '餲',\r\n '馤',\r\n '鱫',\r\n '鴱',\r\n ],\r\n 'jì qí': ['伎', '薺'],\r\n 'xiū xǔ': ['休'],\r\n 'jìn yín': ['伒'],\r\n dǎn: [\r\n '伔',\r\n '刐',\r\n '撢',\r\n '玬',\r\n '瓭',\r\n '紞',\r\n '胆',\r\n '膽',\r\n '衴',\r\n '賧',\r\n '赕',\r\n '黕',\r\n '𬘘',\r\n ],\r\n fū: [\r\n '伕',\r\n '呋',\r\n '娐',\r\n '孵',\r\n '尃',\r\n '怤',\r\n '懯',\r\n '敷',\r\n '旉',\r\n '玞',\r\n '砆',\r\n '稃',\r\n '筟',\r\n '糐',\r\n '綒',\r\n '肤',\r\n '膚',\r\n '荂',\r\n '荴',\r\n '衭',\r\n '趺',\r\n '跗',\r\n '邞',\r\n '鄜',\r\n '酜',\r\n '鈇',\r\n '麩',\r\n '麬',\r\n '麱',\r\n '麸',\r\n '𫓧',\r\n ],\r\n tǎng: [\r\n '伖',\r\n '傥',\r\n '儻',\r\n '埫',\r\n '戃',\r\n '曭',\r\n '爣',\r\n '矘',\r\n '躺',\r\n '鎲',\r\n '钂',\r\n '镋',\r\n ],\r\n yōu: [\r\n '优',\r\n '優',\r\n '呦',\r\n '嚘',\r\n '峳',\r\n '幽',\r\n '忧',\r\n '悠',\r\n '憂',\r\n '攸',\r\n '櫌',\r\n '滺',\r\n '瀀',\r\n '纋',\r\n '羪',\r\n '耰',\r\n '逌',\r\n '鄾',\r\n '麀',\r\n ],\r\n huǒ: ['伙', '夥', '火', '煷', '邩', '鈥', '钬'],\r\n 'huì kuài': ['会', '會', '浍', '璯'],\r\n yǔ: [\r\n '伛',\r\n '俁',\r\n '俣',\r\n '偊',\r\n '傴',\r\n '匬',\r\n '噳',\r\n '圄',\r\n '圉',\r\n '宇',\r\n '寙',\r\n '屿',\r\n '嶼',\r\n '庾',\r\n '挧',\r\n '敔',\r\n '斞',\r\n '楀',\r\n '瑀',\r\n '瘐',\r\n '祤',\r\n '禹',\r\n '穥',\r\n '窳',\r\n '羽',\r\n '與',\r\n '萭',\r\n '貐',\r\n '鄅',\r\n '頨',\r\n '麌',\r\n '齬',\r\n '龉',\r\n '㺄',\r\n ],\r\n cuì: [\r\n '伜',\r\n '啛',\r\n '忰',\r\n '悴',\r\n '毳',\r\n '淬',\r\n '焠',\r\n '疩',\r\n '瘁',\r\n '竁',\r\n '粋',\r\n '粹',\r\n '紣',\r\n '綷',\r\n '翆',\r\n '翠',\r\n '脃',\r\n '脆',\r\n '脺',\r\n '膬',\r\n '膵',\r\n '臎',\r\n '萃',\r\n '襊',\r\n '顇',\r\n ],\r\n sǎn: ['伞', '傘', '糤', '繖', '饊', '馓'],\r\n wěi: [\r\n '伟',\r\n '伪',\r\n '偉',\r\n '偽',\r\n '僞',\r\n '儰',\r\n '娓',\r\n '寪',\r\n '屗',\r\n '崣',\r\n '嶉',\r\n '徫',\r\n '愇',\r\n '捤',\r\n '暐',\r\n '梶',\r\n '洧',\r\n '浘',\r\n '渨',\r\n '炜',\r\n '煒',\r\n '猥',\r\n '玮',\r\n '瑋',\r\n '痿',\r\n '緯',\r\n '纬',\r\n '腲',\r\n '艉',\r\n '芛',\r\n '苇',\r\n '荱',\r\n '萎',\r\n '葦',\r\n '蒍',\r\n '蔿',\r\n '蜼',\r\n '諉',\r\n '诿',\r\n '踓',\r\n '鍡',\r\n '韑',\r\n '韙',\r\n '韡',\r\n '韪',\r\n '頠',\r\n '颹',\r\n '骩',\r\n '骪',\r\n '骫',\r\n '鮪',\r\n '鲔',\r\n '𫇭',\r\n '𬀩',\r\n '𬱟',\r\n ],\r\n 'chuán zhuàn': ['传', '傳'],\r\n 'chē jū': ['伡', '俥', '车'],\r\n 'jū chē': ['車'],\r\n yá: [\r\n '伢',\r\n '厑',\r\n '厓',\r\n '堐',\r\n '岈',\r\n '崕',\r\n '崖',\r\n '涯',\r\n '漄',\r\n '牙',\r\n '玡',\r\n '琊',\r\n '睚',\r\n '笌',\r\n '芽',\r\n '蚜',\r\n '衙',\r\n '齖',\r\n ],\r\n qiàn: [\r\n '伣',\r\n '俔',\r\n '倩',\r\n '儙',\r\n '刋',\r\n '壍',\r\n '嬱',\r\n '悓',\r\n '棈',\r\n '椠',\r\n '槧',\r\n '欠',\r\n '歉',\r\n '皘',\r\n '篏',\r\n '篟',\r\n '縴',\r\n '芡',\r\n '蒨',\r\n '蔳',\r\n '輤',\r\n '𬘬',\r\n ],\r\n shāng: [\r\n '伤',\r\n '傷',\r\n '商',\r\n '墒',\r\n '慯',\r\n '殇',\r\n '殤',\r\n '滳',\r\n '漡',\r\n '熵',\r\n '蔏',\r\n '螪',\r\n '觞',\r\n '觴',\r\n '謪',\r\n '鬺',\r\n ],\r\n chāng: [\r\n '伥',\r\n '倀',\r\n '娼',\r\n '昌',\r\n '椙',\r\n '淐',\r\n '猖',\r\n '琩',\r\n '菖',\r\n '裮',\r\n '錩',\r\n '锠',\r\n '閶',\r\n '阊',\r\n '鯧',\r\n '鲳',\r\n '鼚',\r\n ],\r\n 'chen cāng': ['伧'],\r\n xùn: [\r\n '伨',\r\n '侚',\r\n '卂',\r\n '噀',\r\n '巺',\r\n '巽',\r\n '徇',\r\n '愻',\r\n '殉',\r\n '殾',\r\n '汛',\r\n '潠',\r\n '狥',\r\n '蕈',\r\n '訊',\r\n '訓',\r\n '訙',\r\n '训',\r\n '讯',\r\n '迅',\r\n '迿',\r\n '逊',\r\n '遜',\r\n '鑂',\r\n '顨',\r\n '馴',\r\n '驯',\r\n ],\r\n xìn: ['伩', '囟', '孞', '脪', '舋', '衅', '訫', '釁', '阠', '顖'],\r\n chǐ: [\r\n '伬',\r\n '侈',\r\n '卶',\r\n '叺',\r\n '呎',\r\n '垑',\r\n '恥',\r\n '歯',\r\n '耻',\r\n '肔',\r\n '胣',\r\n '蚇',\r\n '裭',\r\n '褫',\r\n '豉',\r\n '鉹',\r\n '齒',\r\n '齿',\r\n ],\r\n 'xián xuán': ['伭'],\r\n 'nú nǔ': ['伮'],\r\n 'bó bǎi': ['伯'],\r\n 'gū gù': ['估'],\r\n nǐ: ['伱', '你', '儞', '孴', '拟', '擬', '旎', '晲', '狔', '苨', '薿', '隬'],\r\n 'nì ní': ['伲'],\r\n bàn: [\r\n '伴',\r\n '办',\r\n '半',\r\n '姅',\r\n '怑',\r\n '扮',\r\n '瓣',\r\n '秚',\r\n '絆',\r\n '绊',\r\n '辦',\r\n '鉡',\r\n '靽',\r\n ],\r\n xù: [\r\n '伵',\r\n '侐',\r\n '勖',\r\n '勗',\r\n '卹',\r\n '叙',\r\n '垿',\r\n '壻',\r\n '婿',\r\n '序',\r\n '恤',\r\n '敍',\r\n '敘',\r\n '旭',\r\n '昫',\r\n '朂',\r\n '槒',\r\n '欰',\r\n '殈',\r\n '汿',\r\n '沀',\r\n '洫',\r\n '溆',\r\n '漵',\r\n '潊',\r\n '烅',\r\n '烼',\r\n '煦',\r\n '獝',\r\n '珬',\r\n '盢',\r\n '瞁',\r\n '稸',\r\n '絮',\r\n '続',\r\n '緒',\r\n '緖',\r\n '續',\r\n '绪',\r\n '续',\r\n '聓',\r\n '聟',\r\n '蓄',\r\n '藚',\r\n '訹',\r\n '賉',\r\n '酗',\r\n '頊',\r\n '鱮',\r\n '㳚',\r\n ],\r\n zhòu: [\r\n '伷',\r\n '僽',\r\n '冑',\r\n '呪',\r\n '咒',\r\n '咮',\r\n '宙',\r\n '昼',\r\n '晝',\r\n '甃',\r\n '皱',\r\n '皺',\r\n '籀',\r\n '籒',\r\n '籕',\r\n '粙',\r\n '紂',\r\n '縐',\r\n '纣',\r\n '绉',\r\n '胄',\r\n '荮',\r\n '葤',\r\n '詋',\r\n '酎',\r\n '駎',\r\n '驟',\r\n '骤',\r\n '㤘',\r\n '㑇',\r\n ],\r\n shēn: [\r\n '伸',\r\n '侁',\r\n '兟',\r\n '呻',\r\n '堔',\r\n '妽',\r\n '娠',\r\n '屾',\r\n '峷',\r\n '扟',\r\n '敒',\r\n '曑',\r\n '柛',\r\n '氠',\r\n '深',\r\n '燊',\r\n '珅',\r\n '甡',\r\n '甧',\r\n '申',\r\n '眒',\r\n '砷',\r\n '穼',\r\n '籶',\r\n '籸',\r\n '糂',\r\n '紳',\r\n '绅',\r\n '罙',\r\n '罧',\r\n '葠',\r\n '蓡',\r\n '蔘',\r\n '薓',\r\n '裑',\r\n '訷',\r\n '詵',\r\n '诜',\r\n '身',\r\n '駪',\r\n '鯓',\r\n '鯵',\r\n '鰺',\r\n '鲹',\r\n '鵢',\r\n '𬳽',\r\n ],\r\n qū: [\r\n '伹',\r\n '佉',\r\n '匤',\r\n '呿',\r\n '坥',\r\n '屈',\r\n '岖',\r\n '岴',\r\n '嶇',\r\n '憈',\r\n '抾',\r\n '敺',\r\n '浀',\r\n '煀',\r\n '祛',\r\n '筁',\r\n '粬',\r\n '胠',\r\n '蛆',\r\n '蛐',\r\n '袪',\r\n '覻',\r\n '詘',\r\n '诎',\r\n '趍',\r\n '躯',\r\n '軀',\r\n '阹',\r\n '駆',\r\n '駈',\r\n '驅',\r\n '驱',\r\n '髷',\r\n '魼',\r\n '鰸',\r\n '鱋',\r\n '鶌',\r\n '麯',\r\n '麴',\r\n '麹',\r\n '黢',\r\n '㭕',\r\n '𪨰',\r\n '䓛',\r\n ],\r\n 'sì cì': ['伺'],\r\n bēng: ['伻', '嘣', '奟', '崩', '嵭', '閍'],\r\n 'sì shì': ['似'],\r\n 'jiā qié gā': ['伽'],\r\n 'yǐ chì': ['佁'],\r\n 'diàn tián': ['佃', '钿'],\r\n 'hān gàn': ['佄'],\r\n mài: [\r\n '佅',\r\n '劢',\r\n '勱',\r\n '卖',\r\n '唛',\r\n '売',\r\n '脈',\r\n '衇',\r\n '賣',\r\n '迈',\r\n '邁',\r\n '霡',\r\n '霢',\r\n '麥',\r\n '麦',\r\n '鿏',\r\n ],\r\n dàn: [\r\n '但',\r\n '僤',\r\n '啖',\r\n '啗',\r\n '啿',\r\n '噉',\r\n '嚪',\r\n '帎',\r\n '憺',\r\n '旦',\r\n '柦',\r\n '氮',\r\n '沊',\r\n '泹',\r\n '淡',\r\n '狚',\r\n '疍',\r\n '癚',\r\n '禫',\r\n '窞',\r\n '腅',\r\n '萏',\r\n '蓞',\r\n '蛋',\r\n '蜑',\r\n '觛',\r\n '訑',\r\n '誕',\r\n '诞',\r\n '贉',\r\n '霮',\r\n '餤',\r\n '饏',\r\n '駳',\r\n '髧',\r\n '鴠',\r\n '𫢸',\r\n ],\r\n bù: [\r\n '佈',\r\n '勏',\r\n '吥',\r\n '咘',\r\n '埗',\r\n '埠',\r\n '布',\r\n '廍',\r\n '怖',\r\n '悑',\r\n '步',\r\n '歨',\r\n '歩',\r\n '瓿',\r\n '篰',\r\n '荹',\r\n '蔀',\r\n '踄',\r\n '部',\r\n '郶',\r\n '鈈',\r\n '钚',\r\n '餢',\r\n ],\r\n bǐ: [\r\n '佊',\r\n '俾',\r\n '匕',\r\n '夶',\r\n '妣',\r\n '彼',\r\n '朼',\r\n '柀',\r\n '比',\r\n '毞',\r\n '沘',\r\n '疕',\r\n '秕',\r\n '笔',\r\n '筆',\r\n '粃',\r\n '聛',\r\n '舭',\r\n '貏',\r\n '鄙',\r\n ],\r\n 'zhāo shào': ['佋'],\r\n cǐ: ['佌', '此', '泚', '皉', '𫚖'],\r\n wèi: [\r\n '位',\r\n '卫',\r\n '味',\r\n '喂',\r\n '墛',\r\n '媦',\r\n '慰',\r\n '懀',\r\n '未',\r\n '渭',\r\n '煟',\r\n '熭',\r\n '犚',\r\n '猬',\r\n '畏',\r\n '緭',\r\n '罻',\r\n '胃',\r\n '苿',\r\n '菋',\r\n '藯',\r\n '蘶',\r\n '蝟',\r\n '螱',\r\n '衛',\r\n '衞',\r\n '褽',\r\n '謂',\r\n '讆',\r\n '讏',\r\n '谓',\r\n '躗',\r\n '躛',\r\n '軎',\r\n '轊',\r\n '鏏',\r\n '霨',\r\n '餧',\r\n '餵',\r\n '饖',\r\n '魏',\r\n '鮇',\r\n '鳚',\r\n ],\r\n zuǒ: ['佐', '左', '繓'],\r\n yǎng: [\r\n '佒',\r\n '傟',\r\n '养',\r\n '坱',\r\n '岟',\r\n '慃',\r\n '懩',\r\n '攁',\r\n '氧',\r\n '氱',\r\n '炴',\r\n '痒',\r\n '癢',\r\n '礢',\r\n '紻',\r\n '蝆',\r\n '軮',\r\n '養',\r\n '駚',\r\n ],\r\n 'tǐ tī': ['体', '體'],\r\n zhàn: [\r\n '佔',\r\n '偡',\r\n '嶘',\r\n '战',\r\n '戦',\r\n '戰',\r\n '栈',\r\n '桟',\r\n '棧',\r\n '湛',\r\n '站',\r\n '綻',\r\n '绽',\r\n '菚',\r\n '蘸',\r\n '虥',\r\n '虦',\r\n '譧',\r\n '轏',\r\n '驏',\r\n ],\r\n 'hé hē hè': ['何'],\r\n bì: [\r\n '佖',\r\n '咇',\r\n '哔',\r\n '嗶',\r\n '坒',\r\n '堛',\r\n '壁',\r\n '奰',\r\n '妼',\r\n '婢',\r\n '嬖',\r\n '币',\r\n '幣',\r\n '幤',\r\n '庇',\r\n '庳',\r\n '廦',\r\n '弊',\r\n '弻',\r\n '弼',\r\n '彃',\r\n '必',\r\n '怭',\r\n '愊',\r\n '愎',\r\n '敝',\r\n '斃',\r\n '梐',\r\n '毕',\r\n '毖',\r\n '毙',\r\n '湢',\r\n '滗',\r\n '滭',\r\n '潷',\r\n '煏',\r\n '熚',\r\n '狴',\r\n '獘',\r\n '獙',\r\n '珌',\r\n '璧',\r\n '畀',\r\n '畢',\r\n '疪',\r\n '痹',\r\n '痺',\r\n '皕',\r\n '睤',\r\n '碧',\r\n '筚',\r\n '箅',\r\n '箆',\r\n '篦',\r\n '篳',\r\n '粊',\r\n '綼',\r\n '縪',\r\n '繴',\r\n '罼',\r\n '腷',\r\n '苾',\r\n '荜',\r\n '萆',\r\n '萞',\r\n '蓖',\r\n '蓽',\r\n '蔽',\r\n '薜',\r\n '蜌',\r\n '袐',\r\n '襅',\r\n '襞',\r\n '襣',\r\n '觱',\r\n '詖',\r\n '诐',\r\n '貱',\r\n '贔',\r\n '赑',\r\n '跸',\r\n '蹕',\r\n '躃',\r\n '躄',\r\n '避',\r\n '邲',\r\n '鄨',\r\n '鄪',\r\n '鉍',\r\n '鏎',\r\n '鐴',\r\n '铋',\r\n '閇',\r\n '閉',\r\n '閟',\r\n '闭',\r\n '陛',\r\n '韠',\r\n '飶',\r\n '饆',\r\n '馝',\r\n '駜',\r\n '驆',\r\n '髀',\r\n '魓',\r\n '鮅',\r\n '鷝',\r\n '鷩',\r\n '鼊',\r\n ],\r\n tuó: [\r\n '佗',\r\n '坨',\r\n '堶',\r\n '岮',\r\n '槖',\r\n '橐',\r\n '沱',\r\n '砣',\r\n '砤',\r\n '碢',\r\n '紽',\r\n '詑',\r\n '跎',\r\n '酡',\r\n '阤',\r\n '陀',\r\n '陁',\r\n '駝',\r\n '駞',\r\n '騨',\r\n '驒',\r\n '驝',\r\n '驼',\r\n '鮀',\r\n '鴕',\r\n '鸵',\r\n '鼉',\r\n '鼍',\r\n '鼧',\r\n '𬶍',\r\n ],\r\n shé: ['佘', '舌', '虵', '蛥'],\r\n 'yì dié': ['佚', '昳', '泆', '軼'],\r\n 'fó fú bì bó': ['佛'],\r\n 'zuò zuō': ['作'],\r\n gōu: [\r\n '佝',\r\n '沟',\r\n '溝',\r\n '痀',\r\n '篝',\r\n '簼',\r\n '緱',\r\n '缑',\r\n '袧',\r\n '褠',\r\n '鈎',\r\n '鉤',\r\n '钩',\r\n '鞲',\r\n '韝',\r\n ],\r\n nìng: ['佞', '侫', '倿', '寕', '泞', '澝', '濘'],\r\n qú: [\r\n '佢',\r\n '劬',\r\n '戵',\r\n '斪',\r\n '欋',\r\n '欔',\r\n '氍',\r\n '淭',\r\n '灈',\r\n '爠',\r\n '璖',\r\n '璩',\r\n '癯',\r\n '磲',\r\n '籧',\r\n '絇',\r\n '胊',\r\n '臞',\r\n '菃',\r\n '葋',\r\n '蕖',\r\n '蘧',\r\n '蟝',\r\n '蠷',\r\n '蠼',\r\n '衐',\r\n '衢',\r\n '躣',\r\n '軥',\r\n '鑺',\r\n '鴝',\r\n '鸜',\r\n '鸲',\r\n '鼩',\r\n ],\r\n 'yōng yòng': ['佣'],\r\n wǎ: ['佤', '咓', '砙', '邷'],\r\n kǎ: ['佧', '垰', '胩', '裃', '鉲'],\r\n bāo: [\r\n '佨',\r\n '勹',\r\n '包',\r\n '孢',\r\n '煲',\r\n '笣',\r\n '胞',\r\n '苞',\r\n '蕔',\r\n '裦',\r\n '褒',\r\n '襃',\r\n '闁',\r\n '齙',\r\n '龅',\r\n ],\r\n 'huái huí': ['佪'],\r\n 'gé hè': ['佫'],\r\n lǎo: [\r\n '佬',\r\n '咾',\r\n '恅',\r\n '栳',\r\n '狫',\r\n '珯',\r\n '硓',\r\n '老',\r\n '耂',\r\n '荖',\r\n '蛯',\r\n '轑',\r\n '銠',\r\n '铑',\r\n '鮱',\r\n ],\r\n xiáng: ['佭', '庠', '栙', '祥', '絴', '翔', '詳', '跭'],\r\n gé: [\r\n '佮',\r\n '匌',\r\n '呄',\r\n '嗝',\r\n '塥',\r\n '愅',\r\n '挌',\r\n '搿',\r\n '槅',\r\n '櫊',\r\n '滆',\r\n '膈',\r\n '臵',\r\n '茖',\r\n '觡',\r\n '諽',\r\n '輵',\r\n '轕',\r\n '閣',\r\n '阁',\r\n '隔',\r\n '鞷',\r\n '韐',\r\n '韚',\r\n '騔',\r\n '骼',\r\n '鮯',\r\n ],\r\n yáng: [\r\n '佯',\r\n '劷',\r\n '垟',\r\n '崸',\r\n '徉',\r\n '扬',\r\n '揚',\r\n '敭',\r\n '旸',\r\n '昜',\r\n '暘',\r\n '杨',\r\n '楊',\r\n '洋',\r\n '炀',\r\n '珜',\r\n '疡',\r\n '瘍',\r\n '眻',\r\n '蛘',\r\n '諹',\r\n '輰',\r\n '鍚',\r\n '钖',\r\n '阦',\r\n '阳',\r\n '陽',\r\n '霷',\r\n '颺',\r\n '飏',\r\n '鰑',\r\n '鴹',\r\n '鸉',\r\n ],\r\n bǎi: ['佰', '捭', '摆', '擺', '栢', '百', '竡', '粨', '襬'],\r\n fǎ: ['佱', '峜', '法', '灋', '砝', '鍅'],\r\n mǐng: ['佲', '凕', '姳', '慏', '酩'],\r\n 'èr nài': ['佴'],\r\n hěn: ['佷', '很', '狠', '詪', '𬣳'],\r\n huó: ['佸', '活'],\r\n guǐ: [\r\n '佹',\r\n '匦',\r\n '匭',\r\n '厬',\r\n '垝',\r\n '姽',\r\n '宄',\r\n '庋',\r\n '庪',\r\n '恑',\r\n '晷',\r\n '湀',\r\n '癸',\r\n '祪',\r\n '簋',\r\n '蛫',\r\n '蟡',\r\n '觤',\r\n '詭',\r\n '诡',\r\n '軌',\r\n '轨',\r\n '陒',\r\n '鬼',\r\n ],\r\n quán: [\r\n '佺',\r\n '全',\r\n '啳',\r\n '埢',\r\n '姾',\r\n '峑',\r\n '巏',\r\n '拳',\r\n '搼',\r\n '权',\r\n '楾',\r\n '権',\r\n '權',\r\n '泉',\r\n '洤',\r\n '湶',\r\n '牷',\r\n '犈',\r\n '瑔',\r\n '痊',\r\n '硂',\r\n '筌',\r\n '縓',\r\n '荃',\r\n '葲',\r\n '蜷',\r\n '蠸',\r\n '觠',\r\n '詮',\r\n '诠',\r\n '跧',\r\n '踡',\r\n '輇',\r\n '辁',\r\n '醛',\r\n '銓',\r\n '铨',\r\n '闎',\r\n '顴',\r\n '颧',\r\n '駩',\r\n '騡',\r\n '鬈',\r\n '鰁',\r\n '鳈',\r\n '齤',\r\n ],\r\n tiāo: ['佻', '庣', '旫', '祧', '聎'],\r\n jiǎo: [\r\n '佼',\r\n '儌',\r\n '孂',\r\n '挢',\r\n '搅',\r\n '撟',\r\n '撹',\r\n '攪',\r\n '敫',\r\n '敽',\r\n '敿',\r\n '晈',\r\n '暞',\r\n '曒',\r\n '灚',\r\n '燞',\r\n '狡',\r\n '璬',\r\n '皎',\r\n '皦',\r\n '絞',\r\n '纐',\r\n '绞',\r\n '腳',\r\n '臫',\r\n '蟜',\r\n '譑',\r\n '賋',\r\n '踋',\r\n '鉸',\r\n '铰',\r\n '餃',\r\n '饺',\r\n '鱎',\r\n '龣',\r\n ],\r\n cì: [\r\n '佽',\r\n '刾',\r\n '庛',\r\n '朿',\r\n '栨',\r\n '次',\r\n '絘',\r\n '茦',\r\n '莿',\r\n '蛓',\r\n '螆',\r\n '賜',\r\n '赐',\r\n ],\r\n xíng: [\r\n '侀',\r\n '刑',\r\n '哘',\r\n '型',\r\n '娙',\r\n '形',\r\n '洐',\r\n '硎',\r\n '蛵',\r\n '邢',\r\n '郉',\r\n '鈃',\r\n '鉶',\r\n '銒',\r\n '钘',\r\n '铏',\r\n '陉',\r\n '陘',\r\n '餳',\r\n '𫰛',\r\n ],\r\n tuō: [\r\n '侂',\r\n '咃',\r\n '咜',\r\n '圫',\r\n '托',\r\n '拕',\r\n '拖',\r\n '汑',\r\n '脫',\r\n '脱',\r\n '莌',\r\n '袥',\r\n '託',\r\n '讬',\r\n '飥',\r\n '饦',\r\n '魠',\r\n '鮵',\r\n ],\r\n kǎn: ['侃', '偘', '冚', '坎', '惂', '砍', '莰', '輡', '轗', '顑'],\r\n zhí: [\r\n '侄',\r\n '値',\r\n '值',\r\n '埴',\r\n '執',\r\n '姪',\r\n '嬂',\r\n '戠',\r\n '执',\r\n '摭',\r\n '植',\r\n '樴',\r\n '淔',\r\n '漐',\r\n '直',\r\n '禃',\r\n '絷',\r\n '縶',\r\n '聀',\r\n '职',\r\n '職',\r\n '膱',\r\n '蟙',\r\n '跖',\r\n '踯',\r\n '蹠',\r\n '躑',\r\n '軄',\r\n '釞',\r\n '馽',\r\n ],\r\n gāi: [\r\n '侅',\r\n '垓',\r\n '姟',\r\n '峐',\r\n '晐',\r\n '畡',\r\n '祴',\r\n '荄',\r\n '該',\r\n '该',\r\n '豥',\r\n '賅',\r\n '賌',\r\n '赅',\r\n '陔',\r\n ],\r\n lái: [\r\n '來',\r\n '俫',\r\n '倈',\r\n '崃',\r\n '崍',\r\n '庲',\r\n '来',\r\n '梾',\r\n '棶',\r\n '涞',\r\n '淶',\r\n '猍',\r\n '琜',\r\n '筙',\r\n '箂',\r\n '莱',\r\n '萊',\r\n '逨',\r\n '郲',\r\n '錸',\r\n '铼',\r\n '騋',\r\n '鯠',\r\n '鶆',\r\n '麳',\r\n ],\r\n kuǎ: ['侉', '咵', '垮', '銙'],\r\n gōng: [\r\n '侊',\r\n '公',\r\n '功',\r\n '匑',\r\n '匔',\r\n '塨',\r\n '宫',\r\n '宮',\r\n '工',\r\n '幊',\r\n '弓',\r\n '恭',\r\n '攻',\r\n '杛',\r\n '碽',\r\n '糼',\r\n '糿',\r\n '肱',\r\n '觥',\r\n '觵',\r\n '躬',\r\n '躳',\r\n '髸',\r\n '龔',\r\n '龚',\r\n '䢼',\r\n ],\r\n lì: [\r\n '例',\r\n '俐',\r\n '俪',\r\n '傈',\r\n '儮',\r\n '儷',\r\n '凓',\r\n '利',\r\n '力',\r\n '励',\r\n '勵',\r\n '历',\r\n '厉',\r\n '厤',\r\n '厯',\r\n '厲',\r\n '叓',\r\n '吏',\r\n '呖',\r\n '唎',\r\n '唳',\r\n '嚦',\r\n '囇',\r\n '坜',\r\n '塛',\r\n '壢',\r\n '娳',\r\n '婯',\r\n '屴',\r\n '岦',\r\n '悧',\r\n '悷',\r\n '慄',\r\n '戾',\r\n '搮',\r\n '暦',\r\n '曆',\r\n '曞',\r\n '朸',\r\n '枥',\r\n '栃',\r\n '栗',\r\n '栛',\r\n '檪',\r\n '櫔',\r\n '櫪',\r\n '欐',\r\n '歴',\r\n '歷',\r\n '沥',\r\n '沴',\r\n '涖',\r\n '溧',\r\n '濿',\r\n '瀝',\r\n '爏',\r\n '犡',\r\n '猁',\r\n '珕',\r\n '瑮',\r\n '瓅',\r\n '瓑',\r\n '瓥',\r\n '疬',\r\n '痢',\r\n '癧',\r\n '盭',\r\n '睙',\r\n '砅',\r\n '砺',\r\n '砾',\r\n '磿',\r\n '礪',\r\n '礫',\r\n '礰',\r\n '禲',\r\n '秝',\r\n '立',\r\n '笠',\r\n '篥',\r\n '粒',\r\n '粝',\r\n '糲',\r\n '脷',\r\n '苈',\r\n '茘',\r\n '荔',\r\n '莅',\r\n '莉',\r\n '蒚',\r\n '蒞',\r\n '藶',\r\n '蚸',\r\n '蛎',\r\n '蛠',\r\n '蜧',\r\n '蝷',\r\n '蠇',\r\n '蠣',\r\n '詈',\r\n '讈',\r\n '赲',\r\n '轢',\r\n '轣',\r\n '轹',\r\n '酈',\r\n '鉝',\r\n '隶',\r\n '隷',\r\n '雳',\r\n '靂',\r\n '靋',\r\n '鬁',\r\n '鳨',\r\n '鴗',\r\n '鷅',\r\n '麜',\r\n '𫵷',\r\n '𬍛',\r\n ],\r\n yīn: [\r\n '侌',\r\n '凐',\r\n '喑',\r\n '噾',\r\n '囙',\r\n '因',\r\n '垔',\r\n '堙',\r\n '姻',\r\n '婣',\r\n '愔',\r\n '慇',\r\n '栶',\r\n '氤',\r\n '洇',\r\n '溵',\r\n '濦',\r\n '瘖',\r\n '禋',\r\n '秵',\r\n '筃',\r\n '絪',\r\n '緸',\r\n '茵',\r\n '蒑',\r\n '蔭',\r\n '裀',\r\n '諲',\r\n '銦',\r\n '铟',\r\n '闉',\r\n '阥',\r\n '阴',\r\n '陰',\r\n '陻',\r\n '隂',\r\n '霒',\r\n '霠',\r\n '鞇',\r\n '音',\r\n '韾',\r\n '駰',\r\n '骃',\r\n '齗',\r\n '𬘡',\r\n '𬤇',\r\n '𬮱',\r\n ],\r\n mǐ: [\r\n '侎',\r\n '孊',\r\n '弭',\r\n '敉',\r\n '洣',\r\n '渳',\r\n '灖',\r\n '米',\r\n '粎',\r\n '羋',\r\n '脒',\r\n '芈',\r\n '葞',\r\n '蔝',\r\n '銤',\r\n ],\r\n zhū: [\r\n '侏',\r\n '株',\r\n '槠',\r\n '橥',\r\n '櫧',\r\n '櫫',\r\n '洙',\r\n '潴',\r\n '瀦',\r\n '猪',\r\n '珠',\r\n '硃',\r\n '秼',\r\n '絑',\r\n '茱',\r\n '蕏',\r\n '蛛',\r\n '蝫',\r\n '蠩',\r\n '袾',\r\n '誅',\r\n '諸',\r\n '诛',\r\n '诸',\r\n '豬',\r\n '跦',\r\n '邾',\r\n '銖',\r\n '铢',\r\n '駯',\r\n '鮢',\r\n '鯺',\r\n '鴸',\r\n '鼄',\r\n ],\r\n ān: [\r\n '侒',\r\n '偣',\r\n '媕',\r\n '安',\r\n '峖',\r\n '庵',\r\n '桉',\r\n '氨',\r\n '盦',\r\n '盫',\r\n '腤',\r\n '菴',\r\n '萻',\r\n '葊',\r\n '蓭',\r\n '誝',\r\n '諳',\r\n '谙',\r\n '鞌',\r\n '鞍',\r\n '韽',\r\n '馣',\r\n '鮟',\r\n '鵪',\r\n '鶕',\r\n '鹌',\r\n '𩽾',\r\n ],\r\n lù: [\r\n '侓',\r\n '僇',\r\n '勎',\r\n '勠',\r\n '圥',\r\n '坴',\r\n '塶',\r\n '娽',\r\n '峍',\r\n '廘',\r\n '彔',\r\n '录',\r\n '戮',\r\n '摝',\r\n '椂',\r\n '樚',\r\n '淕',\r\n '淥',\r\n '渌',\r\n '漉',\r\n '潞',\r\n '琭',\r\n '璐',\r\n '甪',\r\n '盝',\r\n '睩',\r\n '硉',\r\n '祿',\r\n '禄',\r\n '稑',\r\n '穋',\r\n '箓',\r\n '簏',\r\n '簬',\r\n '簵',\r\n '簶',\r\n '籙',\r\n '粶',\r\n '蔍',\r\n '蕗',\r\n '虂',\r\n '螰',\r\n '賂',\r\n '赂',\r\n '趢',\r\n '路',\r\n '踛',\r\n '蹗',\r\n '輅',\r\n '轆',\r\n '辂',\r\n '辘',\r\n '逯',\r\n '醁',\r\n '錄',\r\n '録',\r\n '錴',\r\n '鏴',\r\n '陸',\r\n '騄',\r\n '騼',\r\n '鯥',\r\n '鴼',\r\n '鵦',\r\n '鵱',\r\n '鷺',\r\n '鹭',\r\n '鹿',\r\n '麓',\r\n '𫘧',\r\n ],\r\n móu: ['侔', '劺', '恈', '眸', '蛑', '謀', '谋', '踎', '鍪', '鴾', '麰'],\r\n ér: [\r\n '侕',\r\n '儿',\r\n '児',\r\n '兒',\r\n '峏',\r\n '栭',\r\n '洏',\r\n '粫',\r\n '而',\r\n '胹',\r\n '荋',\r\n '袻',\r\n '輀',\r\n '轜',\r\n '陑',\r\n '隭',\r\n '髵',\r\n '鮞',\r\n '鲕',\r\n '鴯',\r\n '鸸',\r\n ],\r\n 'dòng tǒng tóng': ['侗'],\r\n chà: ['侘', '奼', '姹', '岔', '汊', '詫', '诧'],\r\n chì: [\r\n '侙',\r\n '傺',\r\n '勅',\r\n '勑',\r\n '叱',\r\n '啻',\r\n '彳',\r\n '恜',\r\n '慗',\r\n '憏',\r\n '懘',\r\n '抶',\r\n '敕',\r\n '斥',\r\n '杘',\r\n '湁',\r\n '灻',\r\n '炽',\r\n '烾',\r\n '熾',\r\n '痓',\r\n '痸',\r\n '瘛',\r\n '翄',\r\n '翅',\r\n '翤',\r\n '翨',\r\n '腟',\r\n '赤',\r\n '趩',\r\n '遫',\r\n '鉓',\r\n '雴',\r\n '飭',\r\n '饬',\r\n '鶒',\r\n '鷘',\r\n ],\r\n 'gòng gōng': ['供', '共'],\r\n zhōu: [\r\n '侜',\r\n '周',\r\n '喌',\r\n '州',\r\n '徟',\r\n '洲',\r\n '淍',\r\n '炿',\r\n '烐',\r\n '珘',\r\n '矪',\r\n '舟',\r\n '謅',\r\n '譸',\r\n '诌',\r\n '賙',\r\n '赒',\r\n '輈',\r\n '輖',\r\n '辀',\r\n '週',\r\n '郮',\r\n '銂',\r\n '霌',\r\n '駲',\r\n '騆',\r\n '鵃',\r\n '鸼',\r\n ],\r\n rú: [\r\n '侞',\r\n '儒',\r\n '嚅',\r\n '如',\r\n '嬬',\r\n '孺',\r\n '帤',\r\n '曘',\r\n '桇',\r\n '渪',\r\n '濡',\r\n '筎',\r\n '茹',\r\n '蕠',\r\n '薷',\r\n '蝡',\r\n '蠕',\r\n '袽',\r\n '襦',\r\n '邚',\r\n '醹',\r\n '銣',\r\n '铷',\r\n '顬',\r\n '颥',\r\n '鱬',\r\n '鴑',\r\n '鴽',\r\n ],\r\n 'jiàn cún': ['侟'],\r\n xiá: [\r\n '侠',\r\n '俠',\r\n '匣',\r\n '峡',\r\n '峽',\r\n '敮',\r\n '暇',\r\n '柙',\r\n '炠',\r\n '烚',\r\n '狎',\r\n '狭',\r\n '狹',\r\n '珨',\r\n '瑕',\r\n '硖',\r\n '硤',\r\n '碬',\r\n '祫',\r\n '筪',\r\n '縖',\r\n '翈',\r\n '舝',\r\n '舺',\r\n '蕸',\r\n '赮',\r\n '轄',\r\n '辖',\r\n '遐',\r\n '鍜',\r\n '鎋',\r\n '陜',\r\n '陿',\r\n '霞',\r\n '騢',\r\n '魻',\r\n '鶷',\r\n '黠',\r\n ],\r\n lǚ: [\r\n '侣',\r\n '侶',\r\n '儢',\r\n '吕',\r\n '呂',\r\n '屡',\r\n '屢',\r\n '履',\r\n '挔',\r\n '捛',\r\n '旅',\r\n '梠',\r\n '焒',\r\n '祣',\r\n '稆',\r\n '穭',\r\n '絽',\r\n '縷',\r\n '缕',\r\n '膂',\r\n '膐',\r\n '褛',\r\n '褸',\r\n '郘',\r\n '鋁',\r\n '铝',\r\n ],\r\n ta: ['侤'],\r\n 'jiǎo yáo': ['侥', '僥', '徺'],\r\n zhēn: [\r\n '侦',\r\n '偵',\r\n '寊',\r\n '帧',\r\n '帪',\r\n '幀',\r\n '搸',\r\n '斟',\r\n '桢',\r\n '楨',\r\n '榛',\r\n '樼',\r\n '殝',\r\n '浈',\r\n '湞',\r\n '潧',\r\n '澵',\r\n '獉',\r\n '珍',\r\n '珎',\r\n '瑧',\r\n '甄',\r\n '眞',\r\n '真',\r\n '砧',\r\n '碪',\r\n '祯',\r\n '禎',\r\n '禛',\r\n '箴',\r\n '胗',\r\n '臻',\r\n '葴',\r\n '蒖',\r\n '蓁',\r\n '薽',\r\n '貞',\r\n '贞',\r\n '轃',\r\n '遉',\r\n '酙',\r\n '針',\r\n '鉁',\r\n '錱',\r\n '鍼',\r\n '针',\r\n '鱵',\r\n ],\r\n 'cè zè zhāi': ['侧', '側'],\r\n kuài: [\r\n '侩',\r\n '儈',\r\n '凷',\r\n '哙',\r\n '噲',\r\n '圦',\r\n '块',\r\n '塊',\r\n '巜',\r\n '廥',\r\n '快',\r\n '旝',\r\n '欳',\r\n '狯',\r\n '獪',\r\n '筷',\r\n '糩',\r\n '脍',\r\n '膾',\r\n '郐',\r\n '鄶',\r\n '鱠',\r\n '鲙',\r\n ],\r\n chái: ['侪', '儕', '喍', '柴', '犲', '祡', '豺'],\r\n nóng: [\r\n '侬',\r\n '儂',\r\n '农',\r\n '哝',\r\n '噥',\r\n '檂',\r\n '欁',\r\n '浓',\r\n '濃',\r\n '燶',\r\n '禯',\r\n '秾',\r\n '穠',\r\n '脓',\r\n '膿',\r\n '蕽',\r\n '襛',\r\n '譨',\r\n '農',\r\n '辳',\r\n '醲',\r\n '鬞',\r\n '𬪩',\r\n ],\r\n jǐn: [\r\n '侭',\r\n '儘',\r\n '卺',\r\n '厪',\r\n '巹',\r\n '槿',\r\n '漌',\r\n '瑾',\r\n '紧',\r\n '緊',\r\n '菫',\r\n '蓳',\r\n '謹',\r\n '谨',\r\n '錦',\r\n '锦',\r\n '饉',\r\n '馑',\r\n ],\r\n 'hóu hòu': ['侯', '矦'],\r\n jiǒng: [\r\n '侰',\r\n '僒',\r\n '冏',\r\n '囧',\r\n '泂',\r\n '澃',\r\n '炯',\r\n '烱',\r\n '煚',\r\n '煛',\r\n '熲',\r\n '燛',\r\n '窘',\r\n '綗',\r\n '褧',\r\n '迥',\r\n '逈',\r\n '顈',\r\n '颎',\r\n '䌹',\r\n ],\r\n 'chěng tǐng': ['侱'],\r\n 'zhèn zhēn': ['侲', '揕'],\r\n zuò: [\r\n '侳',\r\n '做',\r\n '唑',\r\n '坐',\r\n '岝',\r\n '岞',\r\n '座',\r\n '祚',\r\n '糳',\r\n '胙',\r\n '葃',\r\n '葄',\r\n '蓙',\r\n '袏',\r\n '阼',\r\n ],\r\n qīn: [\r\n '侵',\r\n '兓',\r\n '媇',\r\n '嵚',\r\n '嶔',\r\n '欽',\r\n '衾',\r\n '誛',\r\n '钦',\r\n '顉',\r\n '駸',\r\n '骎',\r\n '鮼',\r\n ],\r\n jú: [\r\n '侷',\r\n '啹',\r\n '婅',\r\n '局',\r\n '巈',\r\n '椈',\r\n '橘',\r\n '泦',\r\n '淗',\r\n '湨',\r\n '焗',\r\n '犑',\r\n '狊',\r\n '粷',\r\n '菊',\r\n '蘜',\r\n '趜',\r\n '跼',\r\n '蹫',\r\n '輂',\r\n '郹',\r\n '閰',\r\n '駶',\r\n '驧',\r\n '鵙',\r\n '鵴',\r\n '鶪',\r\n '鼰',\r\n '鼳',\r\n '䴗',\r\n ],\r\n 'shù dōu': ['侸'],\r\n tǐng: [\r\n '侹',\r\n '圢',\r\n '娗',\r\n '挺',\r\n '涏',\r\n '烶',\r\n '珽',\r\n '脡',\r\n '艇',\r\n '誔',\r\n '頲',\r\n '颋',\r\n ],\r\n shèn: [\r\n '侺',\r\n '愼',\r\n '慎',\r\n '昚',\r\n '涁',\r\n '渗',\r\n '滲',\r\n '瘆',\r\n '瘮',\r\n '眘',\r\n '祳',\r\n '肾',\r\n '胂',\r\n '脤',\r\n '腎',\r\n '蜃',\r\n '蜄',\r\n '鋠',\r\n ],\r\n 'tuì tuó': ['侻'],\r\n nán: [\r\n '侽',\r\n '喃',\r\n '娚',\r\n '抩',\r\n '暔',\r\n '枏',\r\n '柟',\r\n '楠',\r\n '男',\r\n '畘',\r\n '莮',\r\n '萳',\r\n '遖',\r\n ],\r\n xiāo: [\r\n '侾',\r\n '哓',\r\n '嘵',\r\n '嚻',\r\n '囂',\r\n '婋',\r\n '宯',\r\n '宵',\r\n '庨',\r\n '彇',\r\n '揱',\r\n '枭',\r\n '枵',\r\n '梟',\r\n '櫹',\r\n '歊',\r\n '毊',\r\n '消',\r\n '潇',\r\n '瀟',\r\n '灱',\r\n '灲',\r\n '烋',\r\n '焇',\r\n '猇',\r\n '獢',\r\n '痚',\r\n '痟',\r\n '硝',\r\n '硣',\r\n '窙',\r\n '箫',\r\n '簘',\r\n '簫',\r\n '綃',\r\n '绡',\r\n '翛',\r\n '膮',\r\n '萧',\r\n '蕭',\r\n '虈',\r\n '虓',\r\n '蟂',\r\n '蟏',\r\n '蟰',\r\n '蠨',\r\n '踃',\r\n '逍',\r\n '銷',\r\n '销',\r\n '霄',\r\n '颵',\r\n '驍',\r\n '骁',\r\n '髇',\r\n '髐',\r\n '魈',\r\n '鴞',\r\n '鴵',\r\n '鷍',\r\n '鸮',\r\n ],\r\n 'biàn pián': ['便', '緶', '缏'],\r\n tuǐ: ['俀', '腿', '蹆', '骽'],\r\n xì: [\r\n '係',\r\n '匸',\r\n '卌',\r\n '呬',\r\n '墍',\r\n '屃',\r\n '屓',\r\n '屭',\r\n '忥',\r\n '怬',\r\n '恄',\r\n '椞',\r\n '潝',\r\n '潟',\r\n '澙',\r\n '熂',\r\n '犔',\r\n '磶',\r\n '禊',\r\n '細',\r\n '綌',\r\n '縘',\r\n '细',\r\n '绤',\r\n '舃',\r\n '舄',\r\n '蕮',\r\n '虩',\r\n '衋',\r\n '覤',\r\n '赩',\r\n '趇',\r\n '郤',\r\n '釳',\r\n '阋',\r\n '隙',\r\n '隟',\r\n '霼',\r\n '餼',\r\n '饩',\r\n '鬩',\r\n '黖',\r\n ],\r\n cù: [\r\n '促',\r\n '媨',\r\n '憱',\r\n '猝',\r\n '瘄',\r\n '瘯',\r\n '簇',\r\n '縬',\r\n '脨',\r\n '蔟',\r\n '誎',\r\n '趗',\r\n '踧',\r\n '踿',\r\n '蹙',\r\n '蹴',\r\n '蹵',\r\n '醋',\r\n '顣',\r\n '鼀',\r\n ],\r\n é: [\r\n '俄',\r\n '囮',\r\n '娥',\r\n '峉',\r\n '峨',\r\n '峩',\r\n '涐',\r\n '珴',\r\n '皒',\r\n '睋',\r\n '磀',\r\n '莪',\r\n '訛',\r\n '誐',\r\n '譌',\r\n '讹',\r\n '迗',\r\n '鈋',\r\n '鋨',\r\n '锇',\r\n '頟',\r\n '額',\r\n '额',\r\n '魤',\r\n '鵝',\r\n '鵞',\r\n '鹅',\r\n ],\r\n qiú: [\r\n '俅',\r\n '叴',\r\n '唒',\r\n '囚',\r\n '崷',\r\n '巯',\r\n '巰',\r\n '扏',\r\n '梂',\r\n '殏',\r\n '毬',\r\n '求',\r\n '汓',\r\n '泅',\r\n '浗',\r\n '湭',\r\n '煪',\r\n '犰',\r\n '玌',\r\n '球',\r\n '璆',\r\n '皳',\r\n '盚',\r\n '紌',\r\n '絿',\r\n '肍',\r\n '芁',\r\n '莍',\r\n '虬',\r\n '虯',\r\n '蛷',\r\n '裘',\r\n '觓',\r\n '觩',\r\n '訄',\r\n '訅',\r\n '賕',\r\n '赇',\r\n '逎',\r\n '逑',\r\n '遒',\r\n '酋',\r\n '釚',\r\n '釻',\r\n '銶',\r\n '頄',\r\n '鮂',\r\n '鯄',\r\n '鰽',\r\n '鼽',\r\n '𨱇',\r\n ],\r\n xú: ['俆', '徐', '禑'],\r\n 'guàng kuāng': ['俇'],\r\n kù: [\r\n '俈',\r\n '喾',\r\n '嚳',\r\n '库',\r\n '庫',\r\n '廤',\r\n '瘔',\r\n '絝',\r\n '绔',\r\n '袴',\r\n '裤',\r\n '褲',\r\n '酷',\r\n ],\r\n wù: [\r\n '俉',\r\n '务',\r\n '務',\r\n '勿',\r\n '卼',\r\n '坞',\r\n '塢',\r\n '奦',\r\n '婺',\r\n '寤',\r\n '屼',\r\n '岉',\r\n '嵨',\r\n '忢',\r\n '悞',\r\n '悟',\r\n '悮',\r\n '戊',\r\n '扤',\r\n '晤',\r\n '杌',\r\n '溩',\r\n '焐',\r\n '熃',\r\n '物',\r\n '痦',\r\n '矹',\r\n '窹',\r\n '粅',\r\n '蘁',\r\n '誤',\r\n '误',\r\n '鋈',\r\n '阢',\r\n '隖',\r\n '雾',\r\n '霚',\r\n '霧',\r\n '靰',\r\n '騖',\r\n '骛',\r\n '鶩',\r\n '鹜',\r\n '鼿',\r\n '齀',\r\n ],\r\n jùn: [\r\n '俊',\r\n '儁',\r\n '呁',\r\n '埈',\r\n '寯',\r\n '峻',\r\n '懏',\r\n '捃',\r\n '攟',\r\n '晙',\r\n '棞',\r\n '燇',\r\n '珺',\r\n '畯',\r\n '竣',\r\n '箟',\r\n '蜠',\r\n '賐',\r\n '郡',\r\n '陖',\r\n '餕',\r\n '馂',\r\n '駿',\r\n '骏',\r\n '鵔',\r\n '鵕',\r\n '鵘',\r\n '䐃',\r\n ],\r\n liáng: [\r\n '俍',\r\n '墚',\r\n '梁',\r\n '椋',\r\n '樑',\r\n '粮',\r\n '粱',\r\n '糧',\r\n '良',\r\n '輬',\r\n '辌',\r\n '𫟅',\r\n ],\r\n zǔ: ['俎', '唨', '爼', '祖', '組', '组', '詛', '诅', '鎺', '阻', '靻'],\r\n 'qiào xiào': ['俏'],\r\n yǒng: [\r\n '俑',\r\n '勇',\r\n '勈',\r\n '咏',\r\n '埇',\r\n '塎',\r\n '嵱',\r\n '彮',\r\n '怺',\r\n '恿',\r\n '悀',\r\n '惥',\r\n '愑',\r\n '愹',\r\n '慂',\r\n '柡',\r\n '栐',\r\n '永',\r\n '泳',\r\n '湧',\r\n '甬',\r\n '蛹',\r\n '詠',\r\n '踊',\r\n '踴',\r\n '鯒',\r\n '鲬',\r\n ],\r\n hùn: ['俒', '倱', '圂', '尡', '慁', '掍', '溷', '焝', '睴', '觨', '諢', '诨'],\r\n jìng: [\r\n '俓',\r\n '傹',\r\n '境',\r\n '妌',\r\n '婙',\r\n '婧',\r\n '弪',\r\n '弳',\r\n '径',\r\n '徑',\r\n '敬',\r\n '曔',\r\n '桱',\r\n '梷',\r\n '浄',\r\n '瀞',\r\n '獍',\r\n '痉',\r\n '痙',\r\n '竞',\r\n '竟',\r\n '竫',\r\n '競',\r\n '竸',\r\n '胫',\r\n '脛',\r\n '莖',\r\n '誩',\r\n '踁',\r\n '迳',\r\n '逕',\r\n '鏡',\r\n '镜',\r\n '靖',\r\n '静',\r\n '靜',\r\n '鵛',\r\n ],\r\n sàn: ['俕', '閐'],\r\n pěi: ['俖'],\r\n sú: ['俗'],\r\n xī: [\r\n '俙',\r\n '僖',\r\n '兮',\r\n '凞',\r\n '卥',\r\n '厀',\r\n '吸',\r\n '唏',\r\n '唽',\r\n '嘻',\r\n '噏',\r\n '嚱',\r\n '夕',\r\n '奚',\r\n '嬆',\r\n '嬉',\r\n '屖',\r\n '嵠',\r\n '巇',\r\n '希',\r\n '徆',\r\n '徯',\r\n '息',\r\n '悉',\r\n '悕',\r\n '惁',\r\n '惜',\r\n '昔',\r\n '晞',\r\n '晰',\r\n '晳',\r\n '曦',\r\n '析',\r\n '桸',\r\n '榽',\r\n '樨',\r\n '橀',\r\n '欷',\r\n '氥',\r\n '汐',\r\n '浠',\r\n '淅',\r\n '渓',\r\n '溪',\r\n '烯',\r\n '焁',\r\n '焈',\r\n '焟',\r\n '熄',\r\n '熈',\r\n '熙',\r\n '熹',\r\n '熺',\r\n '熻',\r\n '燨',\r\n '爔',\r\n '牺',\r\n '犀',\r\n '犠',\r\n '犧',\r\n '琋',\r\n '瘜',\r\n '皙',\r\n '睎',\r\n '瞦',\r\n '矽',\r\n '硒',\r\n '磎',\r\n '礂',\r\n '稀',\r\n '穸',\r\n '窸',\r\n '粞',\r\n '糦',\r\n '緆',\r\n '繥',\r\n '羲',\r\n '翕',\r\n '翖',\r\n '肸',\r\n '肹',\r\n '膝',\r\n '舾',\r\n '莃',\r\n '菥',\r\n '蒠',\r\n '蜥',\r\n '螅',\r\n '蟋',\r\n '蠵',\r\n '西',\r\n '觹',\r\n '觽',\r\n '觿',\r\n '譆',\r\n '谿',\r\n '豀',\r\n '豨',\r\n '豯',\r\n '貕',\r\n '赥',\r\n '邜',\r\n '鄎',\r\n '酅',\r\n '醯',\r\n '釸',\r\n '錫',\r\n '鏭',\r\n '鐊',\r\n '鑴',\r\n '锡',\r\n '隵',\r\n '餏',\r\n '饎',\r\n '饻',\r\n '鯑',\r\n '鵗',\r\n '鸂',\r\n '鼷',\r\n ],\r\n lǐ: [\r\n '俚',\r\n '娌',\r\n '峢',\r\n '峲',\r\n '李',\r\n '欚',\r\n '浬',\r\n '澧',\r\n '理',\r\n '礼',\r\n '禮',\r\n '粴',\r\n '裏',\r\n '裡',\r\n '豊',\r\n '逦',\r\n '邐',\r\n '醴',\r\n '鋰',\r\n '锂',\r\n '鯉',\r\n '鱧',\r\n '鱱',\r\n '鲤',\r\n '鳢',\r\n ],\r\n bǎo: [\r\n '保',\r\n '堢',\r\n '媬',\r\n '宝',\r\n '寚',\r\n '寳',\r\n '寶',\r\n '珤',\r\n '緥',\r\n '葆',\r\n '藵',\r\n '褓',\r\n '賲',\r\n '靌',\r\n '飹',\r\n '飽',\r\n '饱',\r\n '駂',\r\n '鳵',\r\n '鴇',\r\n '鸨',\r\n ],\r\n 'yú shù yù': ['俞'],\r\n 'sì qí': ['俟'],\r\n 'xìn shēn': ['信'],\r\n xiū: [\r\n '俢',\r\n '修',\r\n '咻',\r\n '庥',\r\n '樇',\r\n '烌',\r\n '羞',\r\n '脙',\r\n '脩',\r\n '臹',\r\n '貅',\r\n '銝',\r\n '鎀',\r\n '飍',\r\n '饈',\r\n '馐',\r\n '髤',\r\n '髹',\r\n '鮴',\r\n '鱃',\r\n '鵂',\r\n '鸺',\r\n '䗛',\r\n ],\r\n dì: [\r\n '俤',\r\n '偙',\r\n '僀',\r\n '埊',\r\n '墑',\r\n '墬',\r\n '娣',\r\n '帝',\r\n '怟',\r\n '旳',\r\n '梊',\r\n '焍',\r\n '玓',\r\n '甋',\r\n '眱',\r\n '睇',\r\n '碲',\r\n '祶',\r\n '禘',\r\n '第',\r\n '締',\r\n '缔',\r\n '腣',\r\n '菂',\r\n '蒂',\r\n '蔕',\r\n '蝃',\r\n '蝭',\r\n '螮',\r\n '諦',\r\n '谛',\r\n '踶',\r\n '递',\r\n '逓',\r\n '遞',\r\n '遰',\r\n '鉪',\r\n '𤧛',\r\n '䗖',\r\n ],\r\n chóu: [\r\n '俦',\r\n '儔',\r\n '嬦',\r\n '惆',\r\n '愁',\r\n '懤',\r\n '栦',\r\n '燽',\r\n '畴',\r\n '疇',\r\n '皗',\r\n '稠',\r\n '筹',\r\n '籌',\r\n '絒',\r\n '綢',\r\n '绸',\r\n '菗',\r\n '詶',\r\n '讎',\r\n '讐',\r\n '踌',\r\n '躊',\r\n '酧',\r\n '酬',\r\n '醻',\r\n '雔',\r\n '雠',\r\n '雦',\r\n ],\r\n zhì: [\r\n '俧',\r\n '偫',\r\n '儨',\r\n '制',\r\n '劕',\r\n '垁',\r\n '娡',\r\n '寘',\r\n '帙',\r\n '帜',\r\n '幟',\r\n '庢',\r\n '庤',\r\n '廌',\r\n '彘',\r\n '徏',\r\n '徝',\r\n '志',\r\n '忮',\r\n '懥',\r\n '懫',\r\n '挃',\r\n '挚',\r\n '掷',\r\n '摯',\r\n '擲',\r\n '旘',\r\n '晊',\r\n '智',\r\n '栉',\r\n '桎',\r\n '梽',\r\n '櫍',\r\n '櫛',\r\n '治',\r\n '洷',\r\n '滍',\r\n '滞',\r\n '滯',\r\n '潌',\r\n '瀄',\r\n '炙',\r\n '熫',\r\n '狾',\r\n '猘',\r\n '璏',\r\n '瓆',\r\n '痔',\r\n '痣',\r\n '礩',\r\n '祑',\r\n '秩',\r\n '秷',\r\n '稚',\r\n '稺',\r\n '穉',\r\n '窒',\r\n '紩',\r\n '緻',\r\n '置',\r\n '翐',\r\n '膣',\r\n '至',\r\n '致',\r\n '芖',\r\n '蛭',\r\n '袟',\r\n '袠',\r\n '製',\r\n '覟',\r\n '觗',\r\n '觯',\r\n '觶',\r\n '誌',\r\n '豑',\r\n '豒',\r\n '貭',\r\n '質',\r\n '贄',\r\n '质',\r\n '贽',\r\n '跱',\r\n '踬',\r\n '躓',\r\n '輊',\r\n '轾',\r\n '郅',\r\n '銍',\r\n '鋕',\r\n '鑕',\r\n '铚',\r\n '锧',\r\n '陟',\r\n '隲',\r\n '雉',\r\n '駤',\r\n '騭',\r\n '騺',\r\n '驇',\r\n '骘',\r\n '鯯',\r\n '鴙',\r\n '鷙',\r\n '鸷',\r\n '𬃊',\r\n ],\r\n 'liǎ liǎng': ['俩'],\r\n jiǎn: [\r\n '俭',\r\n '倹',\r\n '儉',\r\n '减',\r\n '剪',\r\n '堿',\r\n '弿',\r\n '彅',\r\n '戩',\r\n '戬',\r\n '拣',\r\n '挸',\r\n '捡',\r\n '揀',\r\n '撿',\r\n '枧',\r\n '柬',\r\n '梘',\r\n '检',\r\n '検',\r\n '檢',\r\n '減',\r\n '湕',\r\n '瀽',\r\n '瑐',\r\n '睑',\r\n '瞼',\r\n '硷',\r\n '碱',\r\n '礆',\r\n '笕',\r\n '筧',\r\n '简',\r\n '簡',\r\n '絸',\r\n '繭',\r\n '翦',\r\n '茧',\r\n '藆',\r\n '蠒',\r\n '裥',\r\n '襇',\r\n '襉',\r\n '襺',\r\n '詃',\r\n '謇',\r\n '謭',\r\n '譾',\r\n '谫',\r\n '趼',\r\n '蹇',\r\n '鐗',\r\n '鬋',\r\n '鰎',\r\n '鹸',\r\n '鹻',\r\n '鹼',\r\n ],\r\n huò: [\r\n '俰',\r\n '咟',\r\n '嚯',\r\n '嚿',\r\n '奯',\r\n '彠',\r\n '惑',\r\n '或',\r\n '擭',\r\n '旤',\r\n '曤',\r\n '檴',\r\n '沎',\r\n '湱',\r\n '瀖',\r\n '獲',\r\n '癨',\r\n '眓',\r\n '矐',\r\n '祸',\r\n '禍',\r\n '穫',\r\n '窢',\r\n '耯',\r\n '臛',\r\n '艧',\r\n '获',\r\n '蒦',\r\n '藿',\r\n '蠖',\r\n '謋',\r\n '貨',\r\n '货',\r\n '鍃',\r\n '鑊',\r\n '镬',\r\n '雘',\r\n '霍',\r\n '靃',\r\n '韄',\r\n '㸌',\r\n ],\r\n 'jù jū': ['俱', '据', '鋸', '锯'],\r\n xiào: [\r\n '俲',\r\n '傚',\r\n '効',\r\n '咲',\r\n '哮',\r\n '啸',\r\n '嘋',\r\n '嘨',\r\n '嘯',\r\n '孝',\r\n '效',\r\n '斅',\r\n '斆',\r\n '歗',\r\n '涍',\r\n '熽',\r\n '笑',\r\n '詨',\r\n '誟',\r\n ],\r\n pái: ['俳', '徘', '牌', '犤', '猅', '簰', '簲', '輫'],\r\n biào: ['俵', '鰾', '鳔'],\r\n 'chù tì': ['俶'],\r\n fèi: [\r\n '俷',\r\n '剕',\r\n '厞',\r\n '吠',\r\n '屝',\r\n '废',\r\n '廃',\r\n '廢',\r\n '昲',\r\n '曊',\r\n '櫠',\r\n '沸',\r\n '濷',\r\n '狒',\r\n '癈',\r\n '肺',\r\n '萉',\r\n '費',\r\n '费',\r\n '鐨',\r\n '镄',\r\n '陫',\r\n '靅',\r\n '鼣',\r\n ],\r\n fèng: ['俸', '凤', '奉', '湗', '焨', '煈', '賵', '赗', '鳯', '鳳', '鴌'],\r\n ǎn: ['俺', '唵', '埯', '揞', '罯', '銨', '铵'],\r\n bèi: [\r\n '俻',\r\n '倍',\r\n '偝',\r\n '偹',\r\n '備',\r\n '僃',\r\n '备',\r\n '悖',\r\n '惫',\r\n '愂',\r\n '憊',\r\n '昁',\r\n '梖',\r\n '焙',\r\n '牬',\r\n '犕',\r\n '狈',\r\n '狽',\r\n '珼',\r\n '琲',\r\n '碚',\r\n '禙',\r\n '糒',\r\n '苝',\r\n '蓓',\r\n '蛽',\r\n '褙',\r\n '貝',\r\n '贝',\r\n '軰',\r\n '輩',\r\n '辈',\r\n '邶',\r\n '郥',\r\n '鄁',\r\n '鋇',\r\n '鐾',\r\n '钡',\r\n '鞁',\r\n '鞴',\r\n '𬇙',\r\n ],\r\n yù: [\r\n '俼',\r\n '儥',\r\n '喅',\r\n '喩',\r\n '喻',\r\n '域',\r\n '堉',\r\n '妪',\r\n '嫗',\r\n '寓',\r\n '峪',\r\n '嶎',\r\n '庽',\r\n '彧',\r\n '御',\r\n '愈',\r\n '慾',\r\n '戫',\r\n '昱',\r\n '棛',\r\n '棜',\r\n '棫',\r\n '櫲',\r\n '欎',\r\n '欝',\r\n '欲',\r\n '毓',\r\n '浴',\r\n '淯',\r\n '滪',\r\n '潏',\r\n '澦',\r\n '灪',\r\n '焴',\r\n '煜',\r\n '燏',\r\n '燠',\r\n '爩',\r\n '狱',\r\n '獄',\r\n '玉',\r\n '琙',\r\n '瘉',\r\n '癒',\r\n '砡',\r\n '硢',\r\n '硲',\r\n '礇',\r\n '礖',\r\n '礜',\r\n '禦',\r\n '秗',\r\n '稢',\r\n '稶',\r\n '篽',\r\n '籞',\r\n '籲',\r\n '粖',\r\n '緎',\r\n '罭',\r\n '聿',\r\n '肀',\r\n '艈',\r\n '芋',\r\n '芌',\r\n '茟',\r\n '蒮',\r\n '蓣',\r\n '蓹',\r\n '蕷',\r\n '蘌',\r\n '蜟',\r\n '蜮',\r\n '袬',\r\n '裕',\r\n '誉',\r\n '諭',\r\n '譽',\r\n '谕',\r\n '豫',\r\n '軉',\r\n '輍',\r\n '逳',\r\n '遇',\r\n '遹',\r\n '郁',\r\n '醧',\r\n '鈺',\r\n '鋊',\r\n '錥',\r\n '鐭',\r\n '钰',\r\n '閾',\r\n '阈',\r\n '雤',\r\n '霱',\r\n '預',\r\n '预',\r\n '飫',\r\n '饇',\r\n '饫',\r\n '馭',\r\n '驈',\r\n '驭',\r\n '鬰',\r\n '鬱',\r\n '鬻',\r\n '魊',\r\n '鱊',\r\n '鳿',\r\n '鴥',\r\n '鴧',\r\n '鴪',\r\n '鵒',\r\n '鷸',\r\n '鸒',\r\n '鹆',\r\n '鹬',\r\n ],\r\n xīn: [\r\n '俽',\r\n '噺',\r\n '妡',\r\n '嬜',\r\n '廞',\r\n '心',\r\n '忄',\r\n '忻',\r\n '惞',\r\n '新',\r\n '昕',\r\n '杺',\r\n '欣',\r\n '歆',\r\n '炘',\r\n '盺',\r\n '薪',\r\n '訢',\r\n '辛',\r\n '邤',\r\n '鈊',\r\n '鋅',\r\n '鑫',\r\n '锌',\r\n '馨',\r\n '馫',\r\n '䜣',\r\n '𫷷',\r\n ],\r\n 'hǔ chí': ['俿'],\r\n jiù: [\r\n '倃',\r\n '僦',\r\n '匓',\r\n '匛',\r\n '匶',\r\n '厩',\r\n '咎',\r\n '就',\r\n '廄',\r\n '廏',\r\n '廐',\r\n '慦',\r\n '捄',\r\n '救',\r\n '旧',\r\n '柩',\r\n '柾',\r\n '桕',\r\n '欍',\r\n '殧',\r\n '疚',\r\n '臼',\r\n '舅',\r\n '舊',\r\n '鯦',\r\n '鷲',\r\n '鹫',\r\n '麔',\r\n '齨',\r\n '㠇',\r\n ],\r\n yáo: [\r\n '倄',\r\n '傜',\r\n '嗂',\r\n '垚',\r\n '堯',\r\n '姚',\r\n '媱',\r\n '尧',\r\n '尭',\r\n '峣',\r\n '嶢',\r\n '嶤',\r\n '徭',\r\n '揺',\r\n '搖',\r\n '摇',\r\n '摿',\r\n '暚',\r\n '榣',\r\n '烑',\r\n '爻',\r\n '猺',\r\n '珧',\r\n '瑤',\r\n '瑶',\r\n '磘',\r\n '窑',\r\n '窯',\r\n '窰',\r\n '肴',\r\n '蘨',\r\n '謠',\r\n '謡',\r\n '谣',\r\n '軺',\r\n '轺',\r\n '遙',\r\n '遥',\r\n '邎',\r\n '顤',\r\n '颻',\r\n '飖',\r\n '餆',\r\n '餚',\r\n '鰩',\r\n '鱙',\r\n '鳐',\r\n ],\r\n 'cuì zú': ['倅'],\r\n 'liǎng liǎ': ['倆'],\r\n wǎn: [\r\n '倇',\r\n '唍',\r\n '婉',\r\n '惋',\r\n '挽',\r\n '晚',\r\n '晥',\r\n '晩',\r\n '晼',\r\n '梚',\r\n '椀',\r\n '琬',\r\n '畹',\r\n '皖',\r\n '盌',\r\n '碗',\r\n '綩',\r\n '綰',\r\n '绾',\r\n '脘',\r\n '萖',\r\n '踠',\r\n '輓',\r\n '鋔',\r\n ],\r\n zǒng: [\r\n '倊',\r\n '偬',\r\n '傯',\r\n '嵸',\r\n '总',\r\n '惣',\r\n '捴',\r\n '搃',\r\n '摠',\r\n '燪',\r\n '総',\r\n '緫',\r\n '縂',\r\n '總',\r\n '蓗',\r\n ],\r\n guān: [\r\n '倌',\r\n '关',\r\n '官',\r\n '棺',\r\n '瘝',\r\n '癏',\r\n '窤',\r\n '蒄',\r\n '関',\r\n '闗',\r\n '關',\r\n '鰥',\r\n '鱞',\r\n '鳏',\r\n ],\r\n tiǎn: [\r\n '倎',\r\n '唺',\r\n '忝',\r\n '悿',\r\n '晪',\r\n '殄',\r\n '淟',\r\n '睓',\r\n '腆',\r\n '舔',\r\n '覥',\r\n '觍',\r\n '賟',\r\n '錪',\r\n '餂',\r\n ],\r\n mén: ['們', '扪', '捫', '璊', '菛', '虋', '鍆', '钔', '門', '閅', '门', '𫞩'],\r\n 'dǎo dào': ['倒'],\r\n 'tán tàn': ['倓', '埮'],\r\n 'juè jué': ['倔'],\r\n chuí: [\r\n '倕',\r\n '垂',\r\n '埀',\r\n '捶',\r\n '搥',\r\n '桘',\r\n '棰',\r\n '槌',\r\n '箠',\r\n '腄',\r\n '菙',\r\n '錘',\r\n '鎚',\r\n '锤',\r\n '陲',\r\n '顀',\r\n ],\r\n xìng: [\r\n '倖',\r\n '姓',\r\n '婞',\r\n '嬹',\r\n '幸',\r\n '性',\r\n '悻',\r\n '杏',\r\n '涬',\r\n '緈',\r\n '臖',\r\n '荇',\r\n '莕',\r\n '葕',\r\n ],\r\n péng: [\r\n '倗',\r\n '傰',\r\n '塜',\r\n '塳',\r\n '弸',\r\n '憉',\r\n '捀',\r\n '朋',\r\n '棚',\r\n '椖',\r\n '樥',\r\n '硼',\r\n '稝',\r\n '竼',\r\n '篷',\r\n '纄',\r\n '膨',\r\n '芃',\r\n '蓬',\r\n '蘕',\r\n '蟚',\r\n '蟛',\r\n '袶',\r\n '輣',\r\n '錋',\r\n '鑝',\r\n '韸',\r\n '韼',\r\n '騯',\r\n '髼',\r\n '鬅',\r\n '鬔',\r\n '鵬',\r\n '鹏',\r\n ],\r\n 'tǎng cháng': ['倘'],\r\n hòu: [\r\n '候',\r\n '厚',\r\n '后',\r\n '垕',\r\n '堠',\r\n '後',\r\n '洉',\r\n '茩',\r\n '豞',\r\n '逅',\r\n '郈',\r\n '鮜',\r\n '鱟',\r\n '鲎',\r\n '鲘',\r\n ],\r\n tì: [\r\n '倜',\r\n '剃',\r\n '嚏',\r\n '嚔',\r\n '屉',\r\n '屜',\r\n '悌',\r\n '悐',\r\n '惕',\r\n '惖',\r\n '戻',\r\n '掦',\r\n '替',\r\n '朑',\r\n '歒',\r\n '殢',\r\n '涕',\r\n '瓋',\r\n '笹',\r\n '籊',\r\n '薙',\r\n '褅',\r\n '逖',\r\n '逷',\r\n '髰',\r\n '鬀',\r\n '鬄',\r\n ],\r\n gàn: [\r\n '倝',\r\n '凎',\r\n '幹',\r\n '榦',\r\n '檊',\r\n '淦',\r\n '灨',\r\n '盰',\r\n '紺',\r\n '绀',\r\n '詌',\r\n '贑',\r\n '赣',\r\n '骭',\r\n '㽏',\r\n ],\r\n 'liàng jìng': ['倞', '靓'],\r\n suī: [\r\n '倠',\r\n '哸',\r\n '夊',\r\n '滖',\r\n '濉',\r\n '眭',\r\n '睢',\r\n '芕',\r\n '荽',\r\n '荾',\r\n '虽',\r\n '雖',\r\n '鞖',\r\n ],\r\n 'chàng chāng': ['倡'],\r\n jié: [\r\n '倢',\r\n '偼',\r\n '傑',\r\n '刦',\r\n '刧',\r\n '刼',\r\n '劫',\r\n '劼',\r\n '卩',\r\n '卪',\r\n '婕',\r\n '媫',\r\n '孑',\r\n '岊',\r\n '崨',\r\n '嵥',\r\n '嶻',\r\n '巀',\r\n '幯',\r\n '截',\r\n '捷',\r\n '掶',\r\n '擮',\r\n '昅',\r\n '杢',\r\n '杰',\r\n '桀',\r\n '桝',\r\n '楬',\r\n '楶',\r\n '榤',\r\n '洁',\r\n '滐',\r\n '潔',\r\n '狤',\r\n '睫',\r\n '礍',\r\n '竭',\r\n '節',\r\n '羯',\r\n '莭',\r\n '蓵',\r\n '蛣',\r\n '蜐',\r\n '蠘',\r\n '蠞',\r\n '蠽',\r\n '衱',\r\n '袺',\r\n '訐',\r\n '詰',\r\n '誱',\r\n '讦',\r\n '踕',\r\n '迼',\r\n '鉣',\r\n '鍻',\r\n '镼',\r\n '頡',\r\n '鮚',\r\n '鲒',\r\n '㛃',\r\n ],\r\n 'kǒng kōng': ['倥'],\r\n juàn: [\r\n '倦',\r\n '劵',\r\n '奆',\r\n '慻',\r\n '桊',\r\n '淃',\r\n '狷',\r\n '獧',\r\n '眷',\r\n '睊',\r\n '睠',\r\n '絭',\r\n '絹',\r\n '绢',\r\n '罥',\r\n '羂',\r\n '腃',\r\n '蔨',\r\n '鄄',\r\n '餋',\r\n ],\r\n zōng: [\r\n '倧',\r\n '堫',\r\n '宗',\r\n '嵏',\r\n '嵕',\r\n '惾',\r\n '朡',\r\n '棕',\r\n '椶',\r\n '熧',\r\n '猣',\r\n '磫',\r\n '緃',\r\n '翪',\r\n '腙',\r\n '葼',\r\n '蝬',\r\n '豵',\r\n '踨',\r\n '踪',\r\n '蹤',\r\n '鍐',\r\n '鑁',\r\n '騌',\r\n '騣',\r\n '骔',\r\n '鬃',\r\n '鬉',\r\n '鬷',\r\n '鯮',\r\n '鯼',\r\n ],\r\n ní: [\r\n '倪',\r\n '坭',\r\n '埿',\r\n '尼',\r\n '屔',\r\n '怩',\r\n '淣',\r\n '猊',\r\n '籾',\r\n '聣',\r\n '蚭',\r\n '蜺',\r\n '觬',\r\n '貎',\r\n '跜',\r\n '輗',\r\n '郳',\r\n '鈮',\r\n '铌',\r\n '霓',\r\n '馜',\r\n '鯢',\r\n '鲵',\r\n '麑',\r\n '齯',\r\n '𫐐',\r\n '𫠜',\r\n ],\r\n zhuō: [\r\n '倬',\r\n '拙',\r\n '捉',\r\n '桌',\r\n '梲',\r\n '棁',\r\n '棳',\r\n '槕',\r\n '涿',\r\n '窧',\r\n '鐯',\r\n '䦃',\r\n ],\r\n 'wō wēi': ['倭'],\r\n luǒ: ['倮', '剆', '曪', '瘰', '癳', '臝', '蓏', '蠃', '裸', '躶'],\r\n sōng: [\r\n '倯',\r\n '凇',\r\n '娀',\r\n '崧',\r\n '嵩',\r\n '庺',\r\n '憽',\r\n '松',\r\n '枀',\r\n '枩',\r\n '柗',\r\n '梥',\r\n '檧',\r\n '淞',\r\n '濍',\r\n '硹',\r\n '菘',\r\n '鬆',\r\n ],\r\n lèng: ['倰', '堎', '愣', '睖', '踜'],\r\n zì: [\r\n '倳',\r\n '剚',\r\n '字',\r\n '恣',\r\n '渍',\r\n '漬',\r\n '牸',\r\n '眥',\r\n '眦',\r\n '胔',\r\n '胾',\r\n '自',\r\n '茡',\r\n '荢',\r\n ],\r\n bèn: ['倴', '坌', '捹', '撪', '渀', '笨', '逩'],\r\n cǎi: ['倸', '啋', '婇', '彩', '採', '棌', '毝', '睬', '綵', '跴', '踩'],\r\n zhài: ['债', '債', '寨', '瘵', '砦'],\r\n yē: ['倻', '吔', '噎', '擨', '暍', '椰', '歋', '潱', '蠮'],\r\n shà: ['倽', '唼', '喢', '歃', '箑', '翜', '翣', '萐', '閯', '霎'],\r\n qīng: [\r\n '倾',\r\n '傾',\r\n '卿',\r\n '圊',\r\n '寈',\r\n '氢',\r\n '氫',\r\n '淸',\r\n '清',\r\n '蜻',\r\n '軽',\r\n '輕',\r\n '轻',\r\n '郬',\r\n '錆',\r\n '鑋',\r\n '靑',\r\n '青',\r\n '鯖',\r\n ],\r\n yīng: [\r\n '偀',\r\n '嘤',\r\n '噟',\r\n '嚶',\r\n '婴',\r\n '媖',\r\n '嫈',\r\n '嬰',\r\n '孆',\r\n '孾',\r\n '愥',\r\n '撄',\r\n '攖',\r\n '朠',\r\n '桜',\r\n '樱',\r\n '櫻',\r\n '渶',\r\n '煐',\r\n '珱',\r\n '瑛',\r\n '璎',\r\n '瓔',\r\n '甇',\r\n '甖',\r\n '碤',\r\n '礯',\r\n '緓',\r\n '纓',\r\n '绬',\r\n '缨',\r\n '罂',\r\n '罃',\r\n '罌',\r\n '膺',\r\n '英',\r\n '莺',\r\n '蘡',\r\n '蝧',\r\n '蠳',\r\n '褮',\r\n '譻',\r\n '賏',\r\n '軈',\r\n '鑍',\r\n '锳',\r\n '霙',\r\n '韺',\r\n '鴬',\r\n '鶑',\r\n '鶧',\r\n '鶯',\r\n '鷪',\r\n '鷹',\r\n '鸎',\r\n '鸚',\r\n '鹦',\r\n '鹰',\r\n '䓨',\r\n ],\r\n 'chēng chèn': ['偁', '爯'],\r\n ruǎn: ['偄', '朊', '瑌', '瓀', '碝', '礝', '腝', '軟', '輭', '软', '阮'],\r\n 'zhòng tóng': ['偅'],\r\n chǔn: ['偆', '惷', '睶', '萶', '蠢', '賰'],\r\n 'jiǎ jià': ['假'],\r\n 'jì jié': ['偈'],\r\n 'bǐng bìng': ['偋'],\r\n ruò: [\r\n '偌',\r\n '叒',\r\n '嵶',\r\n '弱',\r\n '楉',\r\n '焫',\r\n '爇',\r\n '箬',\r\n '篛',\r\n '蒻',\r\n '鄀',\r\n '鰙',\r\n '鰯',\r\n '鶸',\r\n ],\r\n tí: [\r\n '偍',\r\n '厗',\r\n '啼',\r\n '嗁',\r\n '崹',\r\n '漽',\r\n '瑅',\r\n '睼',\r\n '禵',\r\n '稊',\r\n '緹',\r\n '缇',\r\n '罤',\r\n '蕛',\r\n '褆',\r\n '謕',\r\n '趧',\r\n '蹄',\r\n '蹏',\r\n '醍',\r\n '鍗',\r\n '題',\r\n '题',\r\n '騠',\r\n '鮷',\r\n '鯷',\r\n '鳀',\r\n '鵜',\r\n '鷤',\r\n '鹈',\r\n '𫘨',\r\n ],\r\n wēi: [\r\n '偎',\r\n '危',\r\n '喴',\r\n '威',\r\n '媙',\r\n '嶶',\r\n '巍',\r\n '微',\r\n '愄',\r\n '揋',\r\n '揻',\r\n '椳',\r\n '楲',\r\n '溦',\r\n '烓',\r\n '煨',\r\n '燰',\r\n '癓',\r\n '縅',\r\n '葨',\r\n '葳',\r\n '薇',\r\n '蜲',\r\n '蝛',\r\n '覣',\r\n '詴',\r\n '逶',\r\n '隇',\r\n '隈',\r\n '霺',\r\n '鰃',\r\n '鰄',\r\n '鳂',\r\n ],\r\n piān: ['偏', '囨', '媥', '楄', '犏', '篇', '翩', '鍂'],\r\n yàn: [\r\n '偐',\r\n '厌',\r\n '厭',\r\n '唁',\r\n '喭',\r\n '嚈',\r\n '嚥',\r\n '堰',\r\n '妟',\r\n '姲',\r\n '嬊',\r\n '嬿',\r\n '宴',\r\n '彥',\r\n '彦',\r\n '敥',\r\n '晏',\r\n '暥',\r\n '曕',\r\n '曣',\r\n '滟',\r\n '灎',\r\n '灔',\r\n '灧',\r\n '灩',\r\n '焔',\r\n '焰',\r\n '焱',\r\n '熖',\r\n '燄',\r\n '牪',\r\n '猒',\r\n '砚',\r\n '硯',\r\n '艳',\r\n '艶',\r\n '艷',\r\n '覎',\r\n '觃',\r\n '觾',\r\n '諺',\r\n '讌',\r\n '讞',\r\n '谚',\r\n '谳',\r\n '豓',\r\n '豔',\r\n '贋',\r\n '贗',\r\n '赝',\r\n '軅',\r\n '酀',\r\n '酽',\r\n '醼',\r\n '釅',\r\n '雁',\r\n '餍',\r\n '饜',\r\n '騐',\r\n '験',\r\n '騴',\r\n '驗',\r\n '驠',\r\n '验',\r\n '鬳',\r\n '鳫',\r\n '鴈',\r\n '鴳',\r\n '鷃',\r\n '鷰',\r\n '齞',\r\n ],\r\n 'tǎng dàng': ['偒'],\r\n è: [\r\n '偔',\r\n '匎',\r\n '卾',\r\n '厄',\r\n '呝',\r\n '咢',\r\n '噩',\r\n '垩',\r\n '堊',\r\n '堮',\r\n '岋',\r\n '崿',\r\n '廅',\r\n '悪',\r\n '愕',\r\n '戹',\r\n '扼',\r\n '搤',\r\n '搹',\r\n '擜',\r\n '櫮',\r\n '歞',\r\n '歺',\r\n '湂',\r\n '琧',\r\n '砈',\r\n '砐',\r\n '硆',\r\n '腭',\r\n '苊',\r\n '萼',\r\n '蕚',\r\n '蚅',\r\n '蝁',\r\n '覨',\r\n '諤',\r\n '讍',\r\n '谔',\r\n '豟',\r\n '軛',\r\n '軶',\r\n '轭',\r\n '遌',\r\n '遏',\r\n '遻',\r\n '鄂',\r\n '鈪',\r\n '鍔',\r\n '鑩',\r\n '锷',\r\n '阨',\r\n '阸',\r\n '頞',\r\n '顎',\r\n '颚',\r\n '餓',\r\n '餩',\r\n '饿',\r\n '鰐',\r\n '鰪',\r\n '鱷',\r\n '鳄',\r\n '鶚',\r\n '鹗',\r\n '齃',\r\n '齶',\r\n '𫫇',\r\n '𥔲',\r\n ],\r\n xié: [\r\n '偕',\r\n '勰',\r\n '协',\r\n '協',\r\n '嗋',\r\n '垥',\r\n '奊',\r\n '恊',\r\n '愶',\r\n '拹',\r\n '携',\r\n '撷',\r\n '擕',\r\n '擷',\r\n '攜',\r\n '斜',\r\n '旪',\r\n '熁',\r\n '燲',\r\n '綊',\r\n '緳',\r\n '縀',\r\n '缬',\r\n '翓',\r\n '胁',\r\n '脅',\r\n '脇',\r\n '脋',\r\n '膎',\r\n '蝢',\r\n '衺',\r\n '襭',\r\n '諧',\r\n '讗',\r\n '谐',\r\n '鞋',\r\n '鞵',\r\n '龤',\r\n '㙦',\r\n ],\r\n chě: ['偖', '扯', '撦'],\r\n shěng: ['偗', '渻', '眚'],\r\n chā: [\r\n '偛',\r\n '嗏',\r\n '扠',\r\n '挿',\r\n '插',\r\n '揷',\r\n '疀',\r\n '臿',\r\n '艖',\r\n '銟',\r\n '鍤',\r\n '锸',\r\n '餷',\r\n ],\r\n huáng: [\r\n '偟',\r\n '凰',\r\n '喤',\r\n '堭',\r\n '墴',\r\n '媓',\r\n '崲',\r\n '徨',\r\n '惶',\r\n '楻',\r\n '湟',\r\n '煌',\r\n '獚',\r\n '瑝',\r\n '璜',\r\n '癀',\r\n '皇',\r\n '磺',\r\n '穔',\r\n '篁',\r\n '簧',\r\n '艎',\r\n '葟',\r\n '蝗',\r\n '蟥',\r\n '諻',\r\n '趪',\r\n '遑',\r\n '鍠',\r\n '鐄',\r\n '锽',\r\n '隍',\r\n '韹',\r\n '餭',\r\n '騜',\r\n '鰉',\r\n '鱑',\r\n '鳇',\r\n '鷬',\r\n '黃',\r\n '黄',\r\n '𨱑',\r\n ],\r\n yǎo: [\r\n '偠',\r\n '咬',\r\n '婹',\r\n '宎',\r\n '岆',\r\n '杳',\r\n '柼',\r\n '榚',\r\n '溔',\r\n '狕',\r\n '窅',\r\n '窈',\r\n '舀',\r\n '苭',\r\n '闄',\r\n '騕',\r\n '鷕',\r\n '齩',\r\n ],\r\n 'chǒu qiào': ['偢'],\r\n yóu: [\r\n '偤',\r\n '尤',\r\n '庮',\r\n '怣',\r\n '沋',\r\n '油',\r\n '浟',\r\n '游',\r\n '犹',\r\n '猶',\r\n '猷',\r\n '由',\r\n '疣',\r\n '秞',\r\n '肬',\r\n '莜',\r\n '莸',\r\n '蕕',\r\n '蚰',\r\n '蝣',\r\n '訧',\r\n '輏',\r\n '輶',\r\n '逰',\r\n '遊',\r\n '邮',\r\n '郵',\r\n '鈾',\r\n '铀',\r\n '駀',\r\n '魷',\r\n '鮋',\r\n '鱿',\r\n '鲉',\r\n '𬨎',\r\n ],\r\n xū: [\r\n '偦',\r\n '墟',\r\n '媭',\r\n '嬃',\r\n '楈',\r\n '欨',\r\n '歔',\r\n '燸',\r\n '疞',\r\n '盱',\r\n '綇',\r\n '縃',\r\n '繻',\r\n '胥',\r\n '蕦',\r\n '虗',\r\n '虚',\r\n '虛',\r\n '蝑',\r\n '裇',\r\n '訏',\r\n '許',\r\n '諝',\r\n '譃',\r\n '谞',\r\n '鑐',\r\n '需',\r\n '須',\r\n '须',\r\n '顼',\r\n '驉',\r\n '鬚',\r\n '魆',\r\n '魖',\r\n '𬣙',\r\n '𦈡',\r\n ],\r\n zhā: [\r\n '偧',\r\n '哳',\r\n '抯',\r\n '挓',\r\n '揸',\r\n '摣',\r\n '樝',\r\n '渣',\r\n '皶',\r\n '觰',\r\n '譇',\r\n '齄',\r\n '齇',\r\n ],\r\n cī: ['偨', '疵', '蠀', '趀', '骴', '髊', '齹'],\r\n bī: ['偪', '屄', '楅', '毴', '豍', '逼', '鰏', '鲾', '鵖'],\r\n xún: [\r\n '偱',\r\n '噚',\r\n '寻',\r\n '尋',\r\n '峋',\r\n '巡',\r\n '廵',\r\n '循',\r\n '恂',\r\n '揗',\r\n '攳',\r\n '旬',\r\n '杊',\r\n '栒',\r\n '桪',\r\n '樳',\r\n '洵',\r\n '浔',\r\n '潯',\r\n '燅',\r\n '燖',\r\n '珣',\r\n '璕',\r\n '畃',\r\n '紃',\r\n '荀',\r\n '蟳',\r\n '詢',\r\n '询',\r\n '鄩',\r\n '鱏',\r\n '鱘',\r\n '鲟',\r\n '𬘓',\r\n '𬩽',\r\n '𬍤',\r\n '𬊈',\r\n ],\r\n 'cāi sī': ['偲'],\r\n duān: ['偳', '媏', '端', '褍', '鍴'],\r\n ǒu: ['偶', '吘', '嘔', '耦', '腢', '蕅', '藕', '𬉼', '𠙶'],\r\n tōu: ['偷', '偸', '鍮'],\r\n 'zán zá zǎ': ['偺'],\r\n 'lǚ lóu': ['偻', '僂'],\r\n fèn: [\r\n '偾',\r\n '僨',\r\n '奋',\r\n '奮',\r\n '弅',\r\n '忿',\r\n '愤',\r\n '憤',\r\n '瀵',\r\n '瞓',\r\n '秎',\r\n '粪',\r\n '糞',\r\n '膹',\r\n '鱝',\r\n '鲼',\r\n ],\r\n 'kuǐ guī': ['傀'],\r\n sǒu: ['傁', '叜', '叟', '嗾', '櫢', '瞍', '薮', '藪'],\r\n 'zhì sī tí': ['傂'],\r\n sù: [\r\n '傃',\r\n '僳',\r\n '嗉',\r\n '塐',\r\n '塑',\r\n '夙',\r\n '嫊',\r\n '愫',\r\n '憟',\r\n '榡',\r\n '樎',\r\n '樕',\r\n '殐',\r\n '泝',\r\n '涑',\r\n '溯',\r\n '溸',\r\n '潚',\r\n '潥',\r\n '玊',\r\n '珟',\r\n '璛',\r\n '簌',\r\n '粛',\r\n '粟',\r\n '素',\r\n '縤',\r\n '肃',\r\n '肅',\r\n '膆',\r\n '蔌',\r\n '藗',\r\n '觫',\r\n '訴',\r\n '謖',\r\n '诉',\r\n '谡',\r\n '趚',\r\n '蹜',\r\n '速',\r\n '遡',\r\n '遬',\r\n '鋉',\r\n '餗',\r\n '驌',\r\n '骕',\r\n '鱐',\r\n '鷫',\r\n '鹔',\r\n '𫗧',\r\n ],\r\n xiā: ['傄', '煆', '瞎', '虲', '谺', '颬', '鰕'],\r\n 'yuàn yuán': ['傆', '媛'],\r\n rǒng: ['傇', '冗', '宂', '氄', '軵'],\r\n nù: ['傉', '怒'],\r\n yùn: [\r\n '傊',\r\n '孕',\r\n '恽',\r\n '惲',\r\n '愠',\r\n '慍',\r\n '枟',\r\n '腪',\r\n '蕴',\r\n '薀',\r\n '藴',\r\n '蘊',\r\n '褞',\r\n '貟',\r\n '运',\r\n '運',\r\n '郓',\r\n '鄆',\r\n '酝',\r\n '醖',\r\n '醞',\r\n '韗',\r\n '韞',\r\n '韵',\r\n '韻',\r\n '餫',\r\n ],\r\n 'gòu jiǎng': ['傋'],\r\n mà: ['傌', '嘜', '榪', '睰', '祃', '禡', '罵', '閁', '駡', '骂', '鬕'],\r\n bàng: [\r\n '傍',\r\n '塝',\r\n '棒',\r\n '玤',\r\n '稖',\r\n '艕',\r\n '蒡',\r\n '蜯',\r\n '謗',\r\n '谤',\r\n '鎊',\r\n '镑',\r\n ],\r\n diān: [\r\n '傎',\r\n '厧',\r\n '嵮',\r\n '巅',\r\n '巓',\r\n '巔',\r\n '掂',\r\n '攧',\r\n '敁',\r\n '槇',\r\n '滇',\r\n '癫',\r\n '癲',\r\n '蹎',\r\n '顚',\r\n '顛',\r\n '颠',\r\n '齻',\r\n ],\r\n táng: [\r\n '傏',\r\n '唐',\r\n '啺',\r\n '坣',\r\n '堂',\r\n '塘',\r\n '搪',\r\n '棠',\r\n '榶',\r\n '溏',\r\n '漟',\r\n '煻',\r\n '瑭',\r\n '磄',\r\n '禟',\r\n '篖',\r\n '糃',\r\n '糖',\r\n '糛',\r\n '膅',\r\n '膛',\r\n '蓎',\r\n '螗',\r\n '螳',\r\n '赯',\r\n '踼',\r\n '鄌',\r\n '醣',\r\n '鎕',\r\n '隚',\r\n '餹',\r\n '饄',\r\n '鶶',\r\n '䣘',\r\n ],\r\n hào: [\r\n '傐',\r\n '哠',\r\n '恏',\r\n '昊',\r\n '昦',\r\n '晧',\r\n '暠',\r\n '暤',\r\n '暭',\r\n '曍',\r\n '浩',\r\n '淏',\r\n '澔',\r\n '灏',\r\n '灝',\r\n '皓',\r\n '皜',\r\n '皞',\r\n '皡',\r\n '皥',\r\n '耗',\r\n '聕',\r\n '薃',\r\n '號',\r\n '鄗',\r\n '顥',\r\n '颢',\r\n '鰝',\r\n ],\r\n 'xī xì': ['傒'],\r\n shān: [\r\n '傓',\r\n '删',\r\n '刪',\r\n '剼',\r\n '圸',\r\n '山',\r\n '挻',\r\n '搧',\r\n '柵',\r\n '檆',\r\n '潸',\r\n '澘',\r\n '煽',\r\n '狦',\r\n '珊',\r\n '笘',\r\n '縿',\r\n '羴',\r\n '羶',\r\n '脠',\r\n '舢',\r\n '芟',\r\n '衫',\r\n '跚',\r\n '軕',\r\n '邖',\r\n '閊',\r\n '鯅',\r\n ],\r\n 'qiàn jiān': ['傔'],\r\n 'què jué': ['傕', '埆'],\r\n 'cāng chen': ['傖'],\r\n róng: [\r\n '傛',\r\n '媶',\r\n '嫆',\r\n '嬫',\r\n '容',\r\n '峵',\r\n '嵘',\r\n '嶸',\r\n '戎',\r\n '搈',\r\n '曧',\r\n '栄',\r\n '榕',\r\n '榮',\r\n '榵',\r\n '毧',\r\n '溶',\r\n '瀜',\r\n '烿',\r\n '熔',\r\n '狨',\r\n '瑢',\r\n '穁',\r\n '絨',\r\n '绒',\r\n '羢',\r\n '肜',\r\n '茙',\r\n '茸',\r\n '荣',\r\n '蓉',\r\n '蝾',\r\n '融',\r\n '螎',\r\n '蠑',\r\n '褣',\r\n '鎔',\r\n '镕',\r\n '駥',\r\n ],\r\n 'tà tàn': ['傝'],\r\n suō: [\r\n '傞',\r\n '唆',\r\n '嗍',\r\n '嗦',\r\n '娑',\r\n '摍',\r\n '桫',\r\n '梭',\r\n '睃',\r\n '簑',\r\n '簔',\r\n '羧',\r\n '莏',\r\n '蓑',\r\n '趖',\r\n '鮻',\r\n ],\r\n dǎi: ['傣', '歹'],\r\n zài: ['傤', '儎', '再', '在', '扗', '洅', '載', '酨'],\r\n gǔ: [\r\n '傦',\r\n '古',\r\n '啒',\r\n '尳',\r\n '愲',\r\n '榖',\r\n '榾',\r\n '汩',\r\n '淈',\r\n '濲',\r\n '瀔',\r\n '牯',\r\n '皷',\r\n '皼',\r\n '盬',\r\n '瞽',\r\n '穀',\r\n '罟',\r\n '羖',\r\n '股',\r\n '脵',\r\n '臌',\r\n '薣',\r\n '蛊',\r\n '蠱',\r\n '詁',\r\n '诂',\r\n '轂',\r\n '逧',\r\n '鈷',\r\n '钴',\r\n '餶',\r\n '馉',\r\n '鼓',\r\n '鼔',\r\n '𦙶',\r\n ],\r\n bīn: [\r\n '傧',\r\n '宾',\r\n '彬',\r\n '斌',\r\n '椕',\r\n '滨',\r\n '濒',\r\n '濱',\r\n '濵',\r\n '瀕',\r\n '繽',\r\n '缤',\r\n '虨',\r\n '豩',\r\n '豳',\r\n '賓',\r\n '賔',\r\n '邠',\r\n '鑌',\r\n '镔',\r\n '霦',\r\n '顮',\r\n ],\r\n chǔ: [\r\n '储',\r\n '儲',\r\n '杵',\r\n '椘',\r\n '楚',\r\n '楮',\r\n '檚',\r\n '濋',\r\n '璴',\r\n '础',\r\n '礎',\r\n '禇',\r\n '處',\r\n '齭',\r\n '齼',\r\n '𬺓',\r\n ],\r\n nuó: ['傩', '儺', '挪', '梛', '橠'],\r\n 'cān càn': ['傪'],\r\n lěi: [\r\n '傫',\r\n '儡',\r\n '厽',\r\n '垒',\r\n '塁',\r\n '壘',\r\n '壨',\r\n '櫐',\r\n '灅',\r\n '癗',\r\n '矋',\r\n '磊',\r\n '礨',\r\n '耒',\r\n '蕌',\r\n '蕾',\r\n '藟',\r\n '蘽',\r\n '蠝',\r\n '誄',\r\n '讄',\r\n '诔',\r\n '鑸',\r\n '鸓',\r\n ],\r\n cuī: ['催', '凗', '墔', '崔', '嵟', '慛', '摧', '榱', '獕', '磪', '鏙'],\r\n yōng: [\r\n '傭',\r\n '嗈',\r\n '墉',\r\n '壅',\r\n '嫞',\r\n '庸',\r\n '廱',\r\n '慵',\r\n '拥',\r\n '擁',\r\n '滽',\r\n '灉',\r\n '牅',\r\n '痈',\r\n '癕',\r\n '癰',\r\n '臃',\r\n '邕',\r\n '郺',\r\n '鄘',\r\n '鏞',\r\n '镛',\r\n '雍',\r\n '雝',\r\n '饔',\r\n '鱅',\r\n '鳙',\r\n '鷛',\r\n ],\r\n 'zāo cáo': ['傮'],\r\n sǒng: ['傱', '嵷', '怂', '悚', '愯', '慫', '竦', '耸', '聳', '駷', '㧐'],\r\n ào: [\r\n '傲',\r\n '坳',\r\n '垇',\r\n '墺',\r\n '奡',\r\n '嫯',\r\n '岙',\r\n '岰',\r\n '嶴',\r\n '懊',\r\n '擙',\r\n '澳',\r\n '鏊',\r\n '驁',\r\n '骜',\r\n ],\r\n 'qī còu': ['傶'],\r\n chuǎng: ['傸', '磢', '闖', '闯'],\r\n shǎ: ['傻', '儍'],\r\n hàn: [\r\n '傼',\r\n '垾',\r\n '悍',\r\n '憾',\r\n '扞',\r\n '捍',\r\n '撖',\r\n '撼',\r\n '旱',\r\n '晘',\r\n '暵',\r\n '汉',\r\n '涆',\r\n '漢',\r\n '瀚',\r\n '焊',\r\n '猂',\r\n '皔',\r\n '睅',\r\n '翰',\r\n '莟',\r\n '菡',\r\n '蛿',\r\n '蜭',\r\n '螒',\r\n '譀',\r\n '輚',\r\n '釬',\r\n '銲',\r\n '鋎',\r\n '雗',\r\n '頷',\r\n '顄',\r\n '颔',\r\n '駻',\r\n '鶾',\r\n ],\r\n zhāng: [\r\n '傽',\r\n '嫜',\r\n '张',\r\n '張',\r\n '彰',\r\n '慞',\r\n '暲',\r\n '樟',\r\n '漳',\r\n '獐',\r\n '璋',\r\n '章',\r\n '粻',\r\n '蔁',\r\n '蟑',\r\n '遧',\r\n '鄣',\r\n '鏱',\r\n '餦',\r\n '騿',\r\n '鱆',\r\n '麞',\r\n ],\r\n 'yān yàn': ['傿', '墕', '嬮'],\r\n 'piào biāo': ['僄', '骠'],\r\n liàn: [\r\n '僆',\r\n '堜',\r\n '媡',\r\n '恋',\r\n '戀',\r\n '楝',\r\n '殓',\r\n '殮',\r\n '湅',\r\n '潋',\r\n '澰',\r\n '瀲',\r\n '炼',\r\n '煉',\r\n '瑓',\r\n '練',\r\n '纞',\r\n '练',\r\n '萰',\r\n '錬',\r\n '鍊',\r\n '鏈',\r\n '链',\r\n '鰊',\r\n '𬶠',\r\n ],\r\n màn: [\r\n '㵘',\r\n '僈',\r\n '墁',\r\n '幔',\r\n '慢',\r\n '曼',\r\n '漫',\r\n '澷',\r\n '熳',\r\n '獌',\r\n '縵',\r\n '缦',\r\n '蔄',\r\n '蘰',\r\n '鄤',\r\n '鏝',\r\n '镘',\r\n '𬜬',\r\n ],\r\n 'tàn tǎn': ['僋'],\r\n yíng: [\r\n '僌',\r\n '営',\r\n '塋',\r\n '嬴',\r\n '攍',\r\n '楹',\r\n '櫿',\r\n '溁',\r\n '溋',\r\n '滢',\r\n '潆',\r\n '濙',\r\n '濚',\r\n '濴',\r\n '瀅',\r\n '瀛',\r\n '瀠',\r\n '瀯',\r\n '灐',\r\n '灜',\r\n '熒',\r\n '營',\r\n '瑩',\r\n '盁',\r\n '盈',\r\n '禜',\r\n '籝',\r\n '籯',\r\n '縈',\r\n '茔',\r\n '荧',\r\n '莹',\r\n '萤',\r\n '营',\r\n '萦',\r\n '萾',\r\n '蓥',\r\n '藀',\r\n '蛍',\r\n '蝇',\r\n '蝿',\r\n '螢',\r\n '蠅',\r\n '謍',\r\n '贏',\r\n '赢',\r\n '迎',\r\n '鎣',\r\n ],\r\n dòng: [\r\n '働',\r\n '冻',\r\n '凍',\r\n '动',\r\n '動',\r\n '姛',\r\n '戙',\r\n '挏',\r\n '栋',\r\n '棟',\r\n '湩',\r\n '硐',\r\n '胨',\r\n '胴',\r\n '腖',\r\n '迵',\r\n '霘',\r\n '駧',\r\n ],\r\n zhuàn: [\r\n '僎',\r\n '啭',\r\n '囀',\r\n '堟',\r\n '撰',\r\n '灷',\r\n '瑑',\r\n '篆',\r\n '腞',\r\n '蒃',\r\n '襈',\r\n '譔',\r\n '饌',\r\n '馔',\r\n ],\r\n xiàng: [\r\n '像',\r\n '勨',\r\n '向',\r\n '嚮',\r\n '姠',\r\n '嶑',\r\n '曏',\r\n '橡',\r\n '珦',\r\n '缿',\r\n '蟓',\r\n '衖',\r\n '襐',\r\n '象',\r\n '鐌',\r\n '項',\r\n '项',\r\n '鱌',\r\n ],\r\n shàn: [\r\n '僐',\r\n '善',\r\n '墠',\r\n '墡',\r\n '嬗',\r\n '擅',\r\n '敾',\r\n '椫',\r\n '樿',\r\n '歚',\r\n '汕',\r\n '灗',\r\n '疝',\r\n '磰',\r\n '繕',\r\n '缮',\r\n '膳',\r\n '蟮',\r\n '蟺',\r\n '訕',\r\n '謆',\r\n '譱',\r\n '讪',\r\n '贍',\r\n '赡',\r\n '赸',\r\n '鄯',\r\n '鐥',\r\n '饍',\r\n '騸',\r\n '骟',\r\n '鱓',\r\n '鱔',\r\n '鳝',\r\n '𫮃',\r\n ],\r\n 'tuí tuǐ': ['僓'],\r\n zǔn: ['僔', '噂', '撙', '譐'],\r\n pú: [\r\n '僕',\r\n '匍',\r\n '圤',\r\n '墣',\r\n '濮',\r\n '獛',\r\n '璞',\r\n '瞨',\r\n '穙',\r\n '莆',\r\n '菐',\r\n '菩',\r\n '葡',\r\n '蒱',\r\n '蒲',\r\n '贌',\r\n '酺',\r\n '鏷',\r\n '镤',\r\n ],\r\n láo: [\r\n '僗',\r\n '劳',\r\n '労',\r\n '勞',\r\n '哰',\r\n '崂',\r\n '嶗',\r\n '憥',\r\n '朥',\r\n '浶',\r\n '牢',\r\n '痨',\r\n '癆',\r\n '窂',\r\n '簩',\r\n '醪',\r\n '鐒',\r\n '铹',\r\n '顟',\r\n '髝',\r\n '𫭼',\r\n ],\r\n chǎng: ['僘', '厰', '廠', '敞', '昶', '氅', '鋹', '𬬮'],\r\n guāng: [\r\n '僙',\r\n '光',\r\n '咣',\r\n '垙',\r\n '姯',\r\n '洸',\r\n '灮',\r\n '炗',\r\n '炚',\r\n '炛',\r\n '烡',\r\n '珖',\r\n '胱',\r\n '茪',\r\n '輄',\r\n '銧',\r\n '黆',\r\n '𨐈',\r\n ],\r\n liáo: [\r\n '僚',\r\n '嘹',\r\n '嫽',\r\n '寥',\r\n '寮',\r\n '尞',\r\n '屪',\r\n '嵺',\r\n '嶚',\r\n '嶛',\r\n '廫',\r\n '憀',\r\n '敹',\r\n '暸',\r\n '橑',\r\n '獠',\r\n '璙',\r\n '疗',\r\n '療',\r\n '竂',\r\n '簝',\r\n '繚',\r\n '缭',\r\n '聊',\r\n '膋',\r\n '膫',\r\n '藔',\r\n '蟟',\r\n '豂',\r\n '賿',\r\n '蹘',\r\n '辽',\r\n '遼',\r\n '飉',\r\n '髎',\r\n '鷯',\r\n '鹩',\r\n ],\r\n dèng: ['僜', '凳', '墱', '嶝', '櫈', '瞪', '磴', '覴', '邓', '鄧', '隥'],\r\n 'chán zhàn zhuàn': ['僝'],\r\n bō: [\r\n '僠',\r\n '嶓',\r\n '拨',\r\n '撥',\r\n '播',\r\n '波',\r\n '溊',\r\n '玻',\r\n '癶',\r\n '盋',\r\n '砵',\r\n '碆',\r\n '礡',\r\n '缽',\r\n '菠',\r\n '袰',\r\n '蹳',\r\n '鉢',\r\n '钵',\r\n '餑',\r\n '饽',\r\n '驋',\r\n '鱍',\r\n '𬭛',\r\n ],\r\n huì: [\r\n '僡',\r\n '匯',\r\n '卉',\r\n '喙',\r\n '嘒',\r\n '嚖',\r\n '圚',\r\n '嬒',\r\n '寭',\r\n '屶',\r\n '屷',\r\n '彗',\r\n '彙',\r\n '彚',\r\n '徻',\r\n '恚',\r\n '恵',\r\n '惠',\r\n '慧',\r\n '憓',\r\n '懳',\r\n '晦',\r\n '暳',\r\n '槥',\r\n '橞',\r\n '檅',\r\n '櫘',\r\n '汇',\r\n '泋',\r\n '滙',\r\n '潓',\r\n '烩',\r\n '燴',\r\n '獩',\r\n '璤',\r\n '瞺',\r\n '硊',\r\n '秽',\r\n '穢',\r\n '篲',\r\n '絵',\r\n '繪',\r\n '绘',\r\n '翙',\r\n '翽',\r\n '荟',\r\n '蔧',\r\n '蕙',\r\n '薈',\r\n '薉',\r\n '蟪',\r\n '詯',\r\n '誨',\r\n '諱',\r\n '譓',\r\n '譿',\r\n '讳',\r\n '诲',\r\n '賄',\r\n '贿',\r\n '鐬',\r\n '闠',\r\n '阓',\r\n '靧',\r\n '頮',\r\n '顪',\r\n '颒',\r\n '餯',\r\n '𬤝',\r\n '𬭬',\r\n ],\r\n chuǎn: ['僢', '喘', '舛', '荈', '踳'],\r\n 'tiě jiàn': ['僣'],\r\n sēng: ['僧', '鬙'],\r\n xiàn: [\r\n '僩',\r\n '僴',\r\n '哯',\r\n '垷',\r\n '塪',\r\n '姭',\r\n '娊',\r\n '宪',\r\n '岘',\r\n '峴',\r\n '憲',\r\n '撊',\r\n '晛',\r\n '橌',\r\n '橺',\r\n '涀',\r\n '瀗',\r\n '献',\r\n '獻',\r\n '现',\r\n '現',\r\n '県',\r\n '睍',\r\n '粯',\r\n '糮',\r\n '絤',\r\n '綫',\r\n '線',\r\n '线',\r\n '缐',\r\n '羡',\r\n '羨',\r\n '腺',\r\n '臔',\r\n '臽',\r\n '苋',\r\n '莧',\r\n '誢',\r\n '豏',\r\n '鋧',\r\n '錎',\r\n '限',\r\n '陥',\r\n '陷',\r\n '霰',\r\n '餡',\r\n '馅',\r\n '麲',\r\n '鼸',\r\n '𬀪',\r\n '𪾢',\r\n ],\r\n 'yù jú': ['僪'],\r\n 'è wū': ['僫'],\r\n 'tóng zhuàng': ['僮'],\r\n lǐn: [\r\n '僯',\r\n '凛',\r\n '凜',\r\n '廩',\r\n '廪',\r\n '懍',\r\n '懔',\r\n '撛',\r\n '檁',\r\n '檩',\r\n '澟',\r\n '癛',\r\n '癝',\r\n ],\r\n gù: [\r\n '僱',\r\n '凅',\r\n '固',\r\n '堌',\r\n '崓',\r\n '崮',\r\n '故',\r\n '梏',\r\n '棝',\r\n '牿',\r\n '痼',\r\n '祻',\r\n '錮',\r\n '锢',\r\n '雇',\r\n '顧',\r\n '顾',\r\n '鯝',\r\n '鲴',\r\n ],\r\n jiāng: [\r\n '僵',\r\n '壃',\r\n '姜',\r\n '橿',\r\n '殭',\r\n '江',\r\n '畕',\r\n '疅',\r\n '礓',\r\n '繮',\r\n '缰',\r\n '翞',\r\n '茳',\r\n '葁',\r\n '薑',\r\n '螀',\r\n '螿',\r\n '豇',\r\n '韁',\r\n '鱂',\r\n '鳉',\r\n ],\r\n mǐn: [\r\n '僶',\r\n '冺',\r\n '刡',\r\n '勄',\r\n '悯',\r\n '惽',\r\n '愍',\r\n '慜',\r\n '憫',\r\n '抿',\r\n '敃',\r\n '敏',\r\n '敯',\r\n '泯',\r\n '潣',\r\n '皿',\r\n '笢',\r\n '笽',\r\n '簢',\r\n '蠠',\r\n '閔',\r\n '閩',\r\n '闵',\r\n '闽',\r\n '鰵',\r\n '鳘',\r\n '黽',\r\n ],\r\n jìn: [\r\n '僸',\r\n '凚',\r\n '噤',\r\n '嚍',\r\n '墐',\r\n '壗',\r\n '妗',\r\n '嬧',\r\n '搢',\r\n '晉',\r\n '晋',\r\n '枃',\r\n '殣',\r\n '浕',\r\n '浸',\r\n '溍',\r\n '濅',\r\n '濜',\r\n '烬',\r\n '煡',\r\n '燼',\r\n '琎',\r\n '瑨',\r\n '璶',\r\n '盡',\r\n '祲',\r\n '縉',\r\n '缙',\r\n '荩',\r\n '藎',\r\n '覲',\r\n '觐',\r\n '賮',\r\n '贐',\r\n '赆',\r\n '近',\r\n '进',\r\n '進',\r\n '靳',\r\n '齽',\r\n ],\r\n 'jià jie': ['價'],\r\n qiào: [\r\n '僺',\r\n '峭',\r\n '帩',\r\n '撬',\r\n '殻',\r\n '窍',\r\n '竅',\r\n '誚',\r\n '诮',\r\n '躈',\r\n '陗',\r\n '鞩',\r\n '韒',\r\n '髚',\r\n ],\r\n pì: ['僻', '媲', '嫓', '屁', '澼', '甓', '疈', '譬', '闢', '鷿', '鸊', '䴙'],\r\n sài: ['僿', '簺', '賽', '赛'],\r\n 'chán tǎn shàn': ['儃'],\r\n 'dāng dàng': ['儅', '当', '闣'],\r\n xuān: [\r\n '儇',\r\n '喧',\r\n '塇',\r\n '媗',\r\n '宣',\r\n '愃',\r\n '愋',\r\n '揎',\r\n '昍',\r\n '暄',\r\n '煊',\r\n '煖',\r\n '瑄',\r\n '睻',\r\n '矎',\r\n '禤',\r\n '箮',\r\n '翧',\r\n '翾',\r\n '萱',\r\n '萲',\r\n '蓒',\r\n '蕿',\r\n '藼',\r\n '蘐',\r\n '蝖',\r\n '蠉',\r\n '諠',\r\n '諼',\r\n '譞',\r\n '谖',\r\n '軒',\r\n '轩',\r\n '鍹',\r\n '駽',\r\n '鰚',\r\n '𫓶',\r\n '𫍽',\r\n ],\r\n 'dān dàn': ['儋', '擔', '瘅'],\r\n càn: ['儏', '澯', '灿', '燦', '璨', '粲', '薒', '謲'],\r\n 'bīn bìn': ['儐'],\r\n 'án àn': ['儑'],\r\n tái: [\r\n '儓',\r\n '坮',\r\n '嬯',\r\n '抬',\r\n '擡',\r\n '檯',\r\n '炱',\r\n '炲',\r\n '籉',\r\n '臺',\r\n '薹',\r\n '跆',\r\n '邰',\r\n '颱',\r\n '鮐',\r\n '鲐',\r\n ],\r\n lán: [\r\n '儖',\r\n '兰',\r\n '囒',\r\n '婪',\r\n '岚',\r\n '嵐',\r\n '幱',\r\n '拦',\r\n '攔',\r\n '斓',\r\n '斕',\r\n '栏',\r\n '欄',\r\n '欗',\r\n '澜',\r\n '瀾',\r\n '灆',\r\n '灡',\r\n '燣',\r\n '燷',\r\n '璼',\r\n '篮',\r\n '籃',\r\n '籣',\r\n '繿',\r\n '葻',\r\n '蓝',\r\n '藍',\r\n '蘫',\r\n '蘭',\r\n '褴',\r\n '襕',\r\n '襤',\r\n '襴',\r\n '襽',\r\n '譋',\r\n '讕',\r\n '谰',\r\n '躝',\r\n '鑭',\r\n '镧',\r\n '闌',\r\n '阑',\r\n '韊',\r\n '𬒗',\r\n ],\r\n 'nǐ yì ài yí': ['儗'],\r\n méng: [\r\n '儚',\r\n '幪',\r\n '曚',\r\n '朦',\r\n '橗',\r\n '檬',\r\n '氋',\r\n '溕',\r\n '濛',\r\n '甍',\r\n '甿',\r\n '盟',\r\n '礞',\r\n '艨',\r\n '莔',\r\n '萌',\r\n '蕄',\r\n '虻',\r\n '蝱',\r\n '鄳',\r\n '鄸',\r\n '霿',\r\n '靀',\r\n '顭',\r\n '饛',\r\n '鯍',\r\n '鸏',\r\n '鹲',\r\n '𫑡',\r\n '㠓',\r\n ],\r\n níng: [\r\n '儜',\r\n '凝',\r\n '咛',\r\n '嚀',\r\n '嬣',\r\n '柠',\r\n '橣',\r\n '檸',\r\n '狞',\r\n '獰',\r\n '聍',\r\n '聹',\r\n '薴',\r\n '鑏',\r\n '鬡',\r\n '鸋',\r\n ],\r\n qióng: [\r\n '儝',\r\n '卭',\r\n '宆',\r\n '惸',\r\n '憌',\r\n '桏',\r\n '橩',\r\n '焪',\r\n '焭',\r\n '煢',\r\n '熍',\r\n '琼',\r\n '瓊',\r\n '睘',\r\n '穷',\r\n '穹',\r\n '窮',\r\n '竆',\r\n '笻',\r\n '筇',\r\n '舼',\r\n '茕',\r\n '藑',\r\n '藭',\r\n '蛩',\r\n '蛬',\r\n '赹',\r\n '跫',\r\n '邛',\r\n '銎',\r\n '䓖',\r\n ],\r\n liè: [\r\n '儠',\r\n '冽',\r\n '列',\r\n '劣',\r\n '劽',\r\n '埒',\r\n '埓',\r\n '姴',\r\n '峛',\r\n '巤',\r\n '挒',\r\n '捩',\r\n '栵',\r\n '洌',\r\n '浖',\r\n '烈',\r\n '烮',\r\n '煭',\r\n '犣',\r\n '猎',\r\n '猟',\r\n '獵',\r\n '聗',\r\n '脟',\r\n '茢',\r\n '蛚',\r\n '趔',\r\n '躐',\r\n '迾',\r\n '颲',\r\n '鬛',\r\n '鬣',\r\n '鮤',\r\n '鱲',\r\n '鴷',\r\n '䴕',\r\n '𫚭',\r\n ],\r\n kuǎng: ['儣', '夼', '懭'],\r\n bào: [\r\n '儤',\r\n '勽',\r\n '報',\r\n '忁',\r\n '报',\r\n '抱',\r\n '曓',\r\n '爆',\r\n '犦',\r\n '菢',\r\n '虣',\r\n '蚫',\r\n '豹',\r\n '鉋',\r\n '鑤',\r\n '铇',\r\n '骲',\r\n '髱',\r\n '鮑',\r\n '鲍',\r\n ],\r\n biāo: [\r\n '儦',\r\n '墂',\r\n '幖',\r\n '彪',\r\n '标',\r\n '標',\r\n '滮',\r\n '瀌',\r\n '熛',\r\n '爂',\r\n '猋',\r\n '瘭',\r\n '磦',\r\n '膘',\r\n '臕',\r\n '謤',\r\n '贆',\r\n '鏢',\r\n '鑣',\r\n '镖',\r\n '镳',\r\n '颮',\r\n '颷',\r\n '飆',\r\n '飇',\r\n '飈',\r\n '飊',\r\n '飑',\r\n '飙',\r\n '飚',\r\n '驫',\r\n '骉',\r\n '髟',\r\n ],\r\n zǎn: ['儧', '儹', '噆', '攅', '昝', '趱', '趲'],\r\n háo: [\r\n '儫',\r\n '嗥',\r\n '嘷',\r\n '噑',\r\n '嚎',\r\n '壕',\r\n '椃',\r\n '毜',\r\n '毫',\r\n '濠',\r\n '獆',\r\n '獔',\r\n '竓',\r\n '籇',\r\n '蚝',\r\n '蠔',\r\n '譹',\r\n '豪',\r\n ],\r\n qìng: ['儬', '凊', '庆', '慶', '櫦', '濪', '碃', '磬', '罄', '靘'],\r\n chèn: [\r\n '儭',\r\n '嚫',\r\n '榇',\r\n '櫬',\r\n '疢',\r\n '衬',\r\n '襯',\r\n '讖',\r\n '谶',\r\n '趁',\r\n '趂',\r\n '齓',\r\n '齔',\r\n '龀',\r\n ],\r\n téng: [\r\n '儯',\r\n '幐',\r\n '滕',\r\n '漛',\r\n '疼',\r\n '籐',\r\n '籘',\r\n '縢',\r\n '腾',\r\n '藤',\r\n '虅',\r\n '螣',\r\n '誊',\r\n '謄',\r\n '邆',\r\n '駦',\r\n '騰',\r\n '驣',\r\n '鰧',\r\n '䲢',\r\n ],\r\n 'lǒng lóng lòng': ['儱'],\r\n 'chán chàn': ['儳'],\r\n 'ráng xiāng': ['儴', '勷'],\r\n 'huì xié': ['儶'],\r\n luó: [\r\n '儸',\r\n '攞',\r\n '椤',\r\n '欏',\r\n '猡',\r\n '玀',\r\n '箩',\r\n '籮',\r\n '罗',\r\n '羅',\r\n '脶',\r\n '腡',\r\n '萝',\r\n '蘿',\r\n '螺',\r\n '覼',\r\n '逻',\r\n '邏',\r\n '鏍',\r\n '鑼',\r\n '锣',\r\n '镙',\r\n '饠',\r\n '騾',\r\n '驘',\r\n '骡',\r\n '鸁',\r\n ],\r\n léi: [\r\n '儽',\r\n '嫘',\r\n '檑',\r\n '欙',\r\n '瓃',\r\n '畾',\r\n '縲',\r\n '纍',\r\n '纝',\r\n '缧',\r\n '罍',\r\n '羸',\r\n '蔂',\r\n '蘲',\r\n '虆',\r\n '轠',\r\n '鐳',\r\n '鑘',\r\n '镭',\r\n '雷',\r\n '靁',\r\n '鱩',\r\n '鼺',\r\n ],\r\n 'nàng nāng': ['儾'],\r\n 'wù wū': ['兀'],\r\n yǔn: [\r\n '允',\r\n '喗',\r\n '夽',\r\n '抎',\r\n '殒',\r\n '殞',\r\n '狁',\r\n '磒',\r\n '荺',\r\n '賱',\r\n '鈗',\r\n '阭',\r\n '陨',\r\n '隕',\r\n '霣',\r\n '馻',\r\n '齫',\r\n '齳',\r\n ],\r\n zān: ['兂', '橵', '簪', '簮', '糌', '鐕', '鐟', '鵤'],\r\n yuán: [\r\n '元',\r\n '円',\r\n '原',\r\n '厡',\r\n '厵',\r\n '园',\r\n '圆',\r\n '圎',\r\n '園',\r\n '圓',\r\n '垣',\r\n '塬',\r\n '媴',\r\n '嫄',\r\n '援',\r\n '榞',\r\n '榬',\r\n '橼',\r\n '櫞',\r\n '沅',\r\n '湲',\r\n '源',\r\n '溒',\r\n '爰',\r\n '猨',\r\n '猿',\r\n '笎',\r\n '緣',\r\n '縁',\r\n '缘',\r\n '羱',\r\n '茒',\r\n '薗',\r\n '蝝',\r\n '蝯',\r\n '螈',\r\n '袁',\r\n '褤',\r\n '謜',\r\n '轅',\r\n '辕',\r\n '邍',\r\n '邧',\r\n '酛',\r\n '鈨',\r\n '鎱',\r\n '騵',\r\n '魭',\r\n '鶢',\r\n '鶰',\r\n '黿',\r\n '鼋',\r\n '𫘪',\r\n ],\r\n xiōng: [\r\n '兄',\r\n '兇',\r\n '凶',\r\n '匂',\r\n '匈',\r\n '哅',\r\n '忷',\r\n '恟',\r\n '汹',\r\n '洶',\r\n '胷',\r\n '胸',\r\n '芎',\r\n '訩',\r\n '詾',\r\n '讻',\r\n ],\r\n chōng: [\r\n '充',\r\n '嘃',\r\n '忡',\r\n '憃',\r\n '憧',\r\n '摏',\r\n '沖',\r\n '浺',\r\n '珫',\r\n '罿',\r\n '翀',\r\n '舂',\r\n '艟',\r\n '茺',\r\n '衝',\r\n '蹖',\r\n '㳘',\r\n ],\r\n zhào: [\r\n '兆',\r\n '垗',\r\n '旐',\r\n '曌',\r\n '枛',\r\n '櫂',\r\n '照',\r\n '燳',\r\n '狣',\r\n '瞾',\r\n '笊',\r\n '罀',\r\n '罩',\r\n '羄',\r\n '肁',\r\n '肇',\r\n '肈',\r\n '詔',\r\n '诏',\r\n '赵',\r\n '趙',\r\n '鮡',\r\n '𬶐',\r\n ],\r\n 'duì ruì yuè': ['兊', '兌', '兑'],\r\n kè: [\r\n '克',\r\n '刻',\r\n '勀',\r\n '勊',\r\n '堁',\r\n '娔',\r\n '客',\r\n '恪',\r\n '愙',\r\n '氪',\r\n '溘',\r\n '碦',\r\n '緙',\r\n '缂',\r\n '艐',\r\n '衉',\r\n '課',\r\n '课',\r\n '錁',\r\n '锞',\r\n '騍',\r\n '骒',\r\n ],\r\n tù: ['兎', '兔', '堍', '迌', '鵵'],\r\n dǎng: ['党', '攩', '欓', '譡', '讜', '谠', '黨', '𣗋'],\r\n dōu: ['兜', '兠', '唗', '橷', '篼', '蔸'],\r\n huǎng: [\r\n '兤',\r\n '奛',\r\n '幌',\r\n '怳',\r\n '恍',\r\n '晄',\r\n '炾',\r\n '熀',\r\n '縨',\r\n '詤',\r\n '謊',\r\n '谎',\r\n ],\r\n rù: ['入', '嗕', '媷', '扖', '杁', '洳', '溽', '縟', '缛', '蓐', '褥', '鳰'],\r\n nèi: ['內', '氝', '氞', '錗'],\r\n 'yú shù': ['兪'],\r\n 'liù lù': ['六'],\r\n han: ['兯', '爳'],\r\n tiān: ['兲', '天', '婖', '添', '酟', '靔', '靝', '黇'],\r\n 'xīng xìng': ['兴'],\r\n diǎn: [\r\n '典',\r\n '嚸',\r\n '奌',\r\n '婰',\r\n '敟',\r\n '椣',\r\n '点',\r\n '碘',\r\n '蒧',\r\n '蕇',\r\n '踮',\r\n '點',\r\n ],\r\n 'zī cí': ['兹'],\r\n jiān: [\r\n '兼',\r\n '冿',\r\n '囏',\r\n '坚',\r\n '堅',\r\n '奸',\r\n '姦',\r\n '姧',\r\n '尖',\r\n '幵',\r\n '惤',\r\n '戋',\r\n '戔',\r\n '搛',\r\n '椾',\r\n '樫',\r\n '櫼',\r\n '歼',\r\n '殱',\r\n '殲',\r\n '湔',\r\n '瀐',\r\n '瀸',\r\n '煎',\r\n '熞',\r\n '熸',\r\n '牋',\r\n '瑊',\r\n '睷',\r\n '礛',\r\n '礷',\r\n '笺',\r\n '箋',\r\n '緘',\r\n '縑',\r\n '缄',\r\n '缣',\r\n '肩',\r\n '艰',\r\n '艱',\r\n '菅',\r\n '菺',\r\n '葌',\r\n '蒹',\r\n '蔪',\r\n '蕑',\r\n '蕳',\r\n '虃',\r\n '譼',\r\n '豜',\r\n '鑯',\r\n '雃',\r\n '鞯',\r\n '韀',\r\n '韉',\r\n '餰',\r\n '馢',\r\n '鰔',\r\n '鰜',\r\n '鰹',\r\n '鲣',\r\n '鳒',\r\n '鵑',\r\n '鵳',\r\n '鶼',\r\n '鹣',\r\n '麉',\r\n ],\r\n shòu: [\r\n '兽',\r\n '受',\r\n '售',\r\n '壽',\r\n '夀',\r\n '寿',\r\n '授',\r\n '狩',\r\n '獣',\r\n '獸',\r\n '痩',\r\n '瘦',\r\n '綬',\r\n '绶',\r\n '膄',\r\n ],\r\n jì: [\r\n '兾',\r\n '冀',\r\n '剂',\r\n '剤',\r\n '劑',\r\n '勣',\r\n '坖',\r\n '垍',\r\n '塈',\r\n '妓',\r\n '季',\r\n '寂',\r\n '寄',\r\n '廭',\r\n '彑',\r\n '徛',\r\n '忌',\r\n '悸',\r\n '惎',\r\n '懻',\r\n '技',\r\n '旡',\r\n '既',\r\n '旣',\r\n '暨',\r\n '暩',\r\n '曁',\r\n '梞',\r\n '檕',\r\n '檵',\r\n '洎',\r\n '漃',\r\n '漈',\r\n '瀱',\r\n '痵',\r\n '癠',\r\n '禝',\r\n '稩',\r\n '稷',\r\n '穄',\r\n '穊',\r\n '穧',\r\n '紀',\r\n '継',\r\n '績',\r\n '繋',\r\n '繼',\r\n '继',\r\n '绩',\r\n '罽',\r\n '臮',\r\n '芰',\r\n '茍',\r\n '茤',\r\n '葪',\r\n '蓟',\r\n '蔇',\r\n '薊',\r\n '蘎',\r\n '蘮',\r\n '蘻',\r\n '裚',\r\n '襀',\r\n '覬',\r\n '觊',\r\n '計',\r\n '記',\r\n '誋',\r\n '计',\r\n '记',\r\n '跡',\r\n '跽',\r\n '蹟',\r\n '迹',\r\n '际',\r\n '際',\r\n '霁',\r\n '霽',\r\n '驥',\r\n '骥',\r\n '髻',\r\n '鬾',\r\n '魝',\r\n '魥',\r\n '鯚',\r\n '鯽',\r\n '鰶',\r\n '鰿',\r\n '鱀',\r\n '鱭',\r\n '鲚',\r\n '鲫',\r\n '鵋',\r\n '鷑',\r\n '齌',\r\n '𪟝',\r\n '𬶨',\r\n '𬶭',\r\n ],\r\n jiōng: ['冂', '冋', '坰', '埛', '扃', '蘏', '蘔', '駉', '駫', '𬳶'],\r\n mào: [\r\n '冃',\r\n '冐',\r\n '媢',\r\n '帽',\r\n '愗',\r\n '懋',\r\n '暓',\r\n '柕',\r\n '楙',\r\n '毷',\r\n '瑁',\r\n '皃',\r\n '眊',\r\n '瞀',\r\n '耄',\r\n '茂',\r\n '萺',\r\n '蝐',\r\n '袤',\r\n '覒',\r\n '貌',\r\n '貿',\r\n '贸',\r\n '鄚',\r\n '鄮',\r\n ],\r\n rǎn: ['冄', '冉', '姌', '媣', '染', '珃', '苒', '蒅', '䎃'],\r\n 'nèi nà': ['内'],\r\n gāng: [\r\n '冈',\r\n '冮',\r\n '刚',\r\n '剛',\r\n '堈',\r\n '堽',\r\n '岡',\r\n '掆',\r\n '摃',\r\n '棡',\r\n '牨',\r\n '犅',\r\n '疘',\r\n '綱',\r\n '纲',\r\n '缸',\r\n '罁',\r\n '罡',\r\n '肛',\r\n '釭',\r\n '鎠',\r\n '㭎',\r\n ],\r\n cè: [\r\n '冊',\r\n '册',\r\n '厕',\r\n '厠',\r\n '夨',\r\n '廁',\r\n '恻',\r\n '惻',\r\n '憡',\r\n '敇',\r\n '测',\r\n '測',\r\n '笧',\r\n '策',\r\n '筞',\r\n '筴',\r\n '箣',\r\n '荝',\r\n '萗',\r\n '萴',\r\n '蓛',\r\n ],\r\n guǎ: ['冎', '剐', '剮', '叧', '寡'],\r\n 'mào mò': ['冒'],\r\n gòu: [\r\n '冓',\r\n '啂',\r\n '坸',\r\n '垢',\r\n '够',\r\n '夠',\r\n '媾',\r\n '彀',\r\n '搆',\r\n '撀',\r\n '构',\r\n '構',\r\n '煹',\r\n '覯',\r\n '觏',\r\n '訽',\r\n '詬',\r\n '诟',\r\n '購',\r\n '购',\r\n '遘',\r\n '雊',\r\n ],\r\n xǔ: ['冔', '喣', '暊', '栩', '珝', '盨', '糈', '詡', '諿', '诩', '鄦', '醑'],\r\n mì: [\r\n '冖',\r\n '冪',\r\n '嘧',\r\n '塓',\r\n '宻',\r\n '密',\r\n '峚',\r\n '幂',\r\n '幎',\r\n '幦',\r\n '怽',\r\n '榓',\r\n '樒',\r\n '櫁',\r\n '汨',\r\n '淧',\r\n '滵',\r\n '漞',\r\n '濗',\r\n '熐',\r\n '羃',\r\n '蔤',\r\n '蜜',\r\n '覓',\r\n '覔',\r\n '覛',\r\n '觅',\r\n '謐',\r\n '谧',\r\n '鼏',\r\n ],\r\n 'yóu yín': ['冘'],\r\n xiě: ['写', '冩', '藛'],\r\n jūn: [\r\n '军',\r\n '君',\r\n '均',\r\n '桾',\r\n '汮',\r\n '皲',\r\n '皸',\r\n '皹',\r\n '碅',\r\n '莙',\r\n '蚐',\r\n '袀',\r\n '覠',\r\n '軍',\r\n '鈞',\r\n '銁',\r\n '銞',\r\n '鍕',\r\n '钧',\r\n '頵',\r\n '鮶',\r\n '鲪',\r\n '麏',\r\n ],\r\n mí: [\r\n '冞',\r\n '擟',\r\n '瀰',\r\n '爢',\r\n '猕',\r\n '獼',\r\n '祢',\r\n '禰',\r\n '縻',\r\n '蒾',\r\n '藌',\r\n '蘪',\r\n '蘼',\r\n '袮',\r\n '詸',\r\n '謎',\r\n '迷',\r\n '醚',\r\n '醾',\r\n '醿',\r\n '釄',\r\n '镾',\r\n '鸍',\r\n '麊',\r\n '麋',\r\n '麛',\r\n ],\r\n 'guān guàn': ['冠', '覌', '観', '觀', '观'],\r\n měng: [\r\n '冡',\r\n '勐',\r\n '懵',\r\n '掹',\r\n '猛',\r\n '獴',\r\n '艋',\r\n '蜢',\r\n '蠓',\r\n '錳',\r\n '锰',\r\n '鯭',\r\n '鼆',\r\n ],\r\n zhǒng: ['冢', '塚', '尰', '歱', '煄', '瘇', '肿', '腫', '踵'],\r\n zuì: [\r\n '冣',\r\n '嶵',\r\n '晬',\r\n '最',\r\n '栬',\r\n '槜',\r\n '檇',\r\n '檌',\r\n '祽',\r\n '絊',\r\n '罪',\r\n '蕞',\r\n '辠',\r\n '酔',\r\n '酻',\r\n '醉',\r\n '錊',\r\n ],\r\n yuān: [\r\n '冤',\r\n '剈',\r\n '囦',\r\n '嬽',\r\n '寃',\r\n '棩',\r\n '淵',\r\n '渁',\r\n '渆',\r\n '渊',\r\n '渕',\r\n '灁',\r\n '眢',\r\n '肙',\r\n '葾',\r\n '蒬',\r\n '蜎',\r\n '蜵',\r\n '駌',\r\n '鳶',\r\n '鴛',\r\n '鵷',\r\n '鸢',\r\n '鸳',\r\n '鹓',\r\n '鼘',\r\n '鼝',\r\n ],\r\n míng: [\r\n '冥',\r\n '名',\r\n '明',\r\n '暝',\r\n '朙',\r\n '榠',\r\n '洺',\r\n '溟',\r\n '猽',\r\n '眀',\r\n '眳',\r\n '瞑',\r\n '茗',\r\n '螟',\r\n '覭',\r\n '詺',\r\n '鄍',\r\n '銘',\r\n '铭',\r\n '鳴',\r\n '鸣',\r\n ],\r\n kòu: [\r\n '冦',\r\n '叩',\r\n '宼',\r\n '寇',\r\n '扣',\r\n '敂',\r\n '滱',\r\n '窛',\r\n '筘',\r\n '簆',\r\n '蔲',\r\n '蔻',\r\n '釦',\r\n '鷇',\r\n ],\r\n tài: [\r\n '冭',\r\n '太',\r\n '夳',\r\n '忲',\r\n '态',\r\n '態',\r\n '汰',\r\n '汱',\r\n '泰',\r\n '溙',\r\n '肽',\r\n '舦',\r\n '酞',\r\n '鈦',\r\n '钛',\r\n ],\r\n 'féng píng': ['冯', '馮'],\r\n 'chōng chòng': ['冲'],\r\n kuàng: [\r\n '况',\r\n '圹',\r\n '壙',\r\n '岲',\r\n '懬',\r\n '旷',\r\n '昿',\r\n '曠',\r\n '框',\r\n '況',\r\n '爌',\r\n '眖',\r\n '眶',\r\n '矿',\r\n '砿',\r\n '礦',\r\n '穬',\r\n '絋',\r\n '絖',\r\n '纊',\r\n '纩',\r\n '貺',\r\n '贶',\r\n '軦',\r\n '邝',\r\n '鄺',\r\n '鉱',\r\n '鋛',\r\n '鑛',\r\n '黋',\r\n ],\r\n lěng: ['冷'],\r\n pàn: [\r\n '冸',\r\n '判',\r\n '叛',\r\n '沜',\r\n '泮',\r\n '溿',\r\n '炍',\r\n '牉',\r\n '畔',\r\n '盼',\r\n '聁',\r\n '袢',\r\n '襻',\r\n '詊',\r\n '鋬',\r\n '鑻',\r\n '頖',\r\n '鵥',\r\n ],\r\n fā: ['冹', '彂', '沷', '発', '發'],\r\n xiǎn: [\r\n '冼',\r\n '尟',\r\n '尠',\r\n '崄',\r\n '嶮',\r\n '幰',\r\n '攇',\r\n '显',\r\n '櫶',\r\n '毨',\r\n '灦',\r\n '烍',\r\n '燹',\r\n '狝',\r\n '猃',\r\n '獫',\r\n '獮',\r\n '玁',\r\n '禒',\r\n '筅',\r\n '箲',\r\n '藓',\r\n '蘚',\r\n '蚬',\r\n '蜆',\r\n '譣',\r\n '赻',\r\n '跣',\r\n '鍌',\r\n '险',\r\n '険',\r\n '險',\r\n '韅',\r\n '顕',\r\n '顯',\r\n '㬎',\r\n ],\r\n qià: ['冾', '圶', '帢', '恰', '殎', '洽', '硈', '胢', '髂'],\r\n 'jìng chēng': ['净', '凈', '淨'],\r\n sōu: [\r\n '凁',\r\n '嗖',\r\n '廀',\r\n '廋',\r\n '捜',\r\n '搜',\r\n '摉',\r\n '溲',\r\n '獀',\r\n '艘',\r\n '蒐',\r\n '螋',\r\n '鄋',\r\n '醙',\r\n '鎪',\r\n '锼',\r\n '颼',\r\n '飕',\r\n '餿',\r\n '馊',\r\n '騪',\r\n ],\r\n měi: [\r\n '凂',\r\n '媄',\r\n '媺',\r\n '嬍',\r\n '嵄',\r\n '挴',\r\n '毎',\r\n '每',\r\n '浼',\r\n '渼',\r\n '燘',\r\n '美',\r\n '躾',\r\n '鎂',\r\n '镁',\r\n '黣',\r\n ],\r\n tú: [\r\n '凃',\r\n '図',\r\n '图',\r\n '圖',\r\n '圗',\r\n '塗',\r\n '屠',\r\n '峹',\r\n '嵞',\r\n '庩',\r\n '廜',\r\n '徒',\r\n '悇',\r\n '揬',\r\n '涂',\r\n '瘏',\r\n '筡',\r\n '腯',\r\n '荼',\r\n '蒤',\r\n '跿',\r\n '途',\r\n '酴',\r\n '鈯',\r\n '鍎',\r\n '馟',\r\n '駼',\r\n '鵌',\r\n '鶟',\r\n '鷋',\r\n '鷵',\r\n '𬳿',\r\n ],\r\n zhǔn: ['准', '凖', '埻', '準', '𬘯'],\r\n 'liáng liàng': ['凉', '涼', '量'],\r\n diāo: [\r\n '凋',\r\n '刁',\r\n '刟',\r\n '叼',\r\n '奝',\r\n '弴',\r\n '彫',\r\n '汈',\r\n '琱',\r\n '碉',\r\n '簓',\r\n '虭',\r\n '蛁',\r\n '貂',\r\n '錭',\r\n '雕',\r\n '鮉',\r\n '鯛',\r\n '鲷',\r\n '鵰',\r\n '鼦',\r\n ],\r\n còu: ['凑', '湊', '腠', '輳', '辏'],\r\n ái: ['凒', '啀', '嘊', '捱', '溰', '癌', '皑', '皚'],\r\n duó: ['凙', '剫', '夺', '奪', '痥', '踱', '鈬', '鐸', '铎'],\r\n dú: [\r\n '凟',\r\n '匵',\r\n '嬻',\r\n '椟',\r\n '櫝',\r\n '殰',\r\n '涜',\r\n '牍',\r\n '牘',\r\n '犊',\r\n '犢',\r\n '独',\r\n '獨',\r\n '瓄',\r\n '皾',\r\n '裻',\r\n '読',\r\n '讀',\r\n '讟',\r\n '豄',\r\n '贕',\r\n '錖',\r\n '鑟',\r\n '韇',\r\n '韣',\r\n '韥',\r\n '騳',\r\n '髑',\r\n '黩',\r\n '黷',\r\n ],\r\n 'jǐ jī': ['几'],\r\n fán: [\r\n '凡',\r\n '凢',\r\n '凣',\r\n '匥',\r\n '墦',\r\n '杋',\r\n '柉',\r\n '棥',\r\n '樊',\r\n '瀿',\r\n '烦',\r\n '煩',\r\n '燔',\r\n '璠',\r\n '矾',\r\n '礬',\r\n '笲',\r\n '籵',\r\n '緐',\r\n '羳',\r\n '舤',\r\n '舧',\r\n '薠',\r\n '蘩',\r\n '蠜',\r\n '襎',\r\n '蹯',\r\n '釩',\r\n '鐇',\r\n '鐢',\r\n '钒',\r\n '鷭',\r\n '𫔍',\r\n '𬸪',\r\n ],\r\n jū: [\r\n '凥',\r\n '匊',\r\n '娵',\r\n '婮',\r\n '居',\r\n '崌',\r\n '抅',\r\n '挶',\r\n '掬',\r\n '梮',\r\n '椐',\r\n '檋',\r\n '毩',\r\n '毱',\r\n '泃',\r\n '涺',\r\n '狙',\r\n '琚',\r\n '疽',\r\n '砠',\r\n '罝',\r\n '腒',\r\n '艍',\r\n '蜛',\r\n '裾',\r\n '諊',\r\n '跔',\r\n '踘',\r\n '躹',\r\n '陱',\r\n '雎',\r\n '鞠',\r\n '鞫',\r\n '駒',\r\n '驹',\r\n '鮈',\r\n '鴡',\r\n '鶋',\r\n '𬶋',\r\n ],\r\n 'chù chǔ': ['処', '处'],\r\n zhǐ: [\r\n '凪',\r\n '劧',\r\n '咫',\r\n '址',\r\n '坧',\r\n '帋',\r\n '恉',\r\n '扺',\r\n '指',\r\n '旨',\r\n '枳',\r\n '止',\r\n '汦',\r\n '沚',\r\n '洔',\r\n '淽',\r\n '疻',\r\n '砋',\r\n '祉',\r\n '秖',\r\n '紙',\r\n '纸',\r\n '芷',\r\n '藢',\r\n '衹',\r\n '襧',\r\n '訨',\r\n '趾',\r\n '軹',\r\n '轵',\r\n '酯',\r\n '阯',\r\n '黹',\r\n ],\r\n píng: [\r\n '凭',\r\n '凴',\r\n '呯',\r\n '坪',\r\n '塀',\r\n '岼',\r\n '帡',\r\n '帲',\r\n '幈',\r\n '平',\r\n '慿',\r\n '憑',\r\n '枰',\r\n '洴',\r\n '焩',\r\n '玶',\r\n '瓶',\r\n '甁',\r\n '竮',\r\n '箳',\r\n '簈',\r\n '缾',\r\n '荓',\r\n '萍',\r\n '蓱',\r\n '蚲',\r\n '蛢',\r\n '評',\r\n '评',\r\n '軿',\r\n '輧',\r\n '郱',\r\n '鮃',\r\n '鲆',\r\n ],\r\n kǎi: [\r\n '凯',\r\n '凱',\r\n '剀',\r\n '剴',\r\n '垲',\r\n '塏',\r\n '恺',\r\n '愷',\r\n '慨',\r\n '暟',\r\n '蒈',\r\n '輆',\r\n '鍇',\r\n '鎧',\r\n '铠',\r\n '锴',\r\n '闓',\r\n '闿',\r\n '颽',\r\n ],\r\n gān: [\r\n '凲',\r\n '坩',\r\n '尲',\r\n '尴',\r\n '尶',\r\n '尷',\r\n '柑',\r\n '泔',\r\n '漧',\r\n '玕',\r\n '甘',\r\n '疳',\r\n '矸',\r\n '竿',\r\n '筸',\r\n '粓',\r\n '肝',\r\n '苷',\r\n '迀',\r\n '酐',\r\n '魐',\r\n ],\r\n 'kǎn qiǎn': ['凵'],\r\n tū: [\r\n '凸',\r\n '堗',\r\n '嶀',\r\n '捸',\r\n '涋',\r\n '湥',\r\n '痜',\r\n '禿',\r\n '秃',\r\n '突',\r\n '葖',\r\n '鋵',\r\n '鵚',\r\n '鼵',\r\n '㻬',\r\n ],\r\n 'āo wā': ['凹'],\r\n chū: ['出', '初', '岀', '摴', '榋', '樗', '貙', '齣', '䢺', '䝙'],\r\n dàng: [\r\n '凼',\r\n '圵',\r\n '垱',\r\n '壋',\r\n '档',\r\n '檔',\r\n '氹',\r\n '璗',\r\n '瓽',\r\n '盪',\r\n '瞊',\r\n '砀',\r\n '碭',\r\n '礑',\r\n '簜',\r\n '荡',\r\n '菪',\r\n '蕩',\r\n '蘯',\r\n '趤',\r\n '逿',\r\n '雼',\r\n '𬍡',\r\n ],\r\n hán: [\r\n '函',\r\n '凾',\r\n '含',\r\n '圅',\r\n '娢',\r\n '寒',\r\n '崡',\r\n '晗',\r\n '梒',\r\n '浛',\r\n '涵',\r\n '澏',\r\n '焓',\r\n '琀',\r\n '甝',\r\n '筨',\r\n '蜬',\r\n '邗',\r\n '邯',\r\n '鋡',\r\n '韓',\r\n '韩',\r\n ],\r\n záo: ['凿', '鑿'],\r\n dāo: ['刀', '刂', '忉', '氘', '舠', '螩', '釖', '魛', '鱽'],\r\n chuāng: ['刅', '摐', '牎', '牕', '疮', '瘡', '窓', '窗', '窻'],\r\n 'fēn fèn': ['分'],\r\n 'qiè qiē': ['切'],\r\n kān: ['刊', '勘', '堪', '戡', '栞', '龕', '龛'],\r\n cǔn: ['刌', '忖'],\r\n chú: [\r\n '刍',\r\n '厨',\r\n '幮',\r\n '廚',\r\n '橱',\r\n '櫉',\r\n '櫥',\r\n '滁',\r\n '犓',\r\n '篨',\r\n '耡',\r\n '芻',\r\n '蒢',\r\n '蒭',\r\n '蜍',\r\n '蟵',\r\n '豠',\r\n '趎',\r\n '蹰',\r\n '躇',\r\n '躕',\r\n '鉏',\r\n '鋤',\r\n '锄',\r\n '除',\r\n '雏',\r\n '雛',\r\n '鶵',\r\n ],\r\n 'huà huá': ['划'],\r\n lí: [\r\n '刕',\r\n '剓',\r\n '剺',\r\n '劙',\r\n '厘',\r\n '喱',\r\n '嚟',\r\n '囄',\r\n '嫠',\r\n '孷',\r\n '廲',\r\n '悡',\r\n '梨',\r\n '梸',\r\n '棃',\r\n '漓',\r\n '灕',\r\n '犁',\r\n '犂',\r\n '狸',\r\n '琍',\r\n '璃',\r\n '瓈',\r\n '盠',\r\n '睝',\r\n '离',\r\n '穲',\r\n '竰',\r\n '筣',\r\n '篱',\r\n '籬',\r\n '糎',\r\n '縭',\r\n '缡',\r\n '罹',\r\n '艃',\r\n '荲',\r\n '菞',\r\n '蓠',\r\n '蔾',\r\n '藜',\r\n '蘺',\r\n '蜊',\r\n '蟍',\r\n '蟸',\r\n '蠫',\r\n '褵',\r\n '謧',\r\n '貍',\r\n '醨',\r\n '鋫',\r\n '錅',\r\n '鏫',\r\n '鑗',\r\n '離',\r\n '驪',\r\n '骊',\r\n '鯏',\r\n '鯬',\r\n '鱺',\r\n '鲡',\r\n '鵹',\r\n '鸝',\r\n '鹂',\r\n '黎',\r\n '黧',\r\n '㰀',\r\n ],\r\n yuè: [\r\n '刖',\r\n '嬳',\r\n '岄',\r\n '岳',\r\n '嶽',\r\n '恱',\r\n '悅',\r\n '悦',\r\n '戉',\r\n '抈',\r\n '捳',\r\n '月',\r\n '樾',\r\n '瀹',\r\n '爚',\r\n '玥',\r\n '礿',\r\n '禴',\r\n '篗',\r\n '籆',\r\n '籥',\r\n '籰',\r\n '粤',\r\n '粵',\r\n '蘥',\r\n '蚎',\r\n '蚏',\r\n '説',\r\n '越',\r\n '跀',\r\n '跃',\r\n '躍',\r\n '軏',\r\n '鈅',\r\n '鉞',\r\n '鑰',\r\n '钺',\r\n '閱',\r\n '閲',\r\n '阅',\r\n '鸑',\r\n '鸙',\r\n '黦',\r\n '龠',\r\n '𫐄',\r\n '𬸚',\r\n ],\r\n liú: [\r\n '刘',\r\n '劉',\r\n '嚠',\r\n '媹',\r\n '嵧',\r\n '旈',\r\n '旒',\r\n '榴',\r\n '橊',\r\n '流',\r\n '浏',\r\n '瀏',\r\n '琉',\r\n '瑠',\r\n '瑬',\r\n '璢',\r\n '畄',\r\n '留',\r\n '畱',\r\n '疁',\r\n '瘤',\r\n '癅',\r\n '硫',\r\n '蒥',\r\n '蓅',\r\n '蟉',\r\n '裗',\r\n '鎏',\r\n '鏐',\r\n '鐂',\r\n '镠',\r\n '飀',\r\n '飅',\r\n '飗',\r\n '駠',\r\n '駵',\r\n '騮',\r\n '驑',\r\n '骝',\r\n '鰡',\r\n '鶹',\r\n '鹠',\r\n '麍',\r\n ],\r\n zé: [\r\n '则',\r\n '則',\r\n '啧',\r\n '嘖',\r\n '嫧',\r\n '帻',\r\n '幘',\r\n '択',\r\n '樍',\r\n '歵',\r\n '沢',\r\n '泎',\r\n '溭',\r\n '皟',\r\n '瞔',\r\n '矠',\r\n '礋',\r\n '箦',\r\n '簀',\r\n '舴',\r\n '蔶',\r\n '蠌',\r\n '襗',\r\n '謮',\r\n '賾',\r\n '赜',\r\n '迮',\r\n '鸅',\r\n '齚',\r\n '齰',\r\n ],\r\n 'chuàng chuāng': ['创', '創'],\r\n qù: ['刞', '厺', '去', '閴', '闃', '阒', '麮', '鼁'],\r\n 'bié biè': ['別', '别'],\r\n 'páo bào': ['刨'],\r\n 'chǎn chàn': ['刬', '剗', '幝'],\r\n guā: [\r\n '刮',\r\n '劀',\r\n '桰',\r\n '歄',\r\n '煱',\r\n '瓜',\r\n '胍',\r\n '踻',\r\n '颪',\r\n '颳',\r\n '騧',\r\n '鴰',\r\n '鸹',\r\n ],\r\n gēng: [\r\n '刯',\r\n '庚',\r\n '椩',\r\n '浭',\r\n '焿',\r\n '畊',\r\n '絚',\r\n '羮',\r\n '羹',\r\n '耕',\r\n '菮',\r\n '賡',\r\n '赓',\r\n '鶊',\r\n '鹒',\r\n ],\r\n dào: [\r\n '到',\r\n '噵',\r\n '悼',\r\n '椡',\r\n '檤',\r\n '燾',\r\n '瓙',\r\n '盗',\r\n '盜',\r\n '稲',\r\n '稻',\r\n '纛',\r\n '翿',\r\n '艔',\r\n '菿',\r\n '衜',\r\n '衟',\r\n '軇',\r\n '道',\r\n ],\r\n chuàng: ['刱', '剏', '剙', '怆', '愴'],\r\n kū: ['刳', '哭', '圐', '堀', '枯', '桍', '矻', '窟', '跍', '郀', '骷', '鮬'],\r\n duò: [\r\n '刴',\r\n '剁',\r\n '墯',\r\n '尮',\r\n '惰',\r\n '憜',\r\n '挅',\r\n '桗',\r\n '舵',\r\n '跥',\r\n '跺',\r\n '陊',\r\n '陏',\r\n '飿',\r\n '饳',\r\n '鵽',\r\n ],\r\n 'shuā shuà': ['刷'],\r\n 'quàn xuàn': ['券'],\r\n 'chà shā': ['刹', '剎'],\r\n 'cì cī': ['刺'],\r\n guì: [\r\n '刽',\r\n '刿',\r\n '劊',\r\n '劌',\r\n '撌',\r\n '攰',\r\n '昋',\r\n '桂',\r\n '椢',\r\n '槶',\r\n '樻',\r\n '櫃',\r\n '猤',\r\n '禬',\r\n '筀',\r\n '蓕',\r\n '襘',\r\n '貴',\r\n '贵',\r\n '跪',\r\n '鐀',\r\n '鑎',\r\n '鞼',\r\n '鱖',\r\n '鱥',\r\n ],\r\n lóu: [\r\n '剅',\r\n '娄',\r\n '婁',\r\n '廔',\r\n '楼',\r\n '樓',\r\n '溇',\r\n '漊',\r\n '熡',\r\n '耧',\r\n '耬',\r\n '艛',\r\n '蒌',\r\n '蔞',\r\n '蝼',\r\n '螻',\r\n '謱',\r\n '軁',\r\n '遱',\r\n '鞻',\r\n '髅',\r\n '髏',\r\n '𪣻',\r\n ],\r\n cuò: [\r\n '剉',\r\n '剒',\r\n '厝',\r\n '夎',\r\n '挫',\r\n '措',\r\n '棤',\r\n '莝',\r\n '莡',\r\n '蓌',\r\n '逪',\r\n '銼',\r\n '錯',\r\n '锉',\r\n '错',\r\n ],\r\n 'xiāo xuē': ['削'],\r\n 'kēi kè': ['剋', '尅'],\r\n 'là lá': ['剌'],\r\n tī: ['剔', '梯', '踢', '銻', '锑', '鷈', '鷉', '䏲', '䴘'],\r\n pōu: ['剖'],\r\n wān: ['剜', '塆', '壪', '帵', '弯', '彎', '湾', '潫', '灣', '睕', '蜿', '豌'],\r\n 'bāo bō': ['剝', '剥'],\r\n duō: ['剟', '咄', '哆', '嚉', '多', '夛', '掇', '毲', '畓', '裰', '㙍'],\r\n qíng: [\r\n '剠',\r\n '勍',\r\n '夝',\r\n '情',\r\n '擎',\r\n '晴',\r\n '暒',\r\n '棾',\r\n '樈',\r\n '檠',\r\n '氰',\r\n '甠',\r\n '硘',\r\n '葝',\r\n '黥',\r\n ],\r\n 'yǎn shàn': ['剡'],\r\n 'dū zhuó': ['剢'],\r\n yān: [\r\n '剦',\r\n '嫣',\r\n '崦',\r\n '嶖',\r\n '恹',\r\n '懕',\r\n '懨',\r\n '樮',\r\n '淊',\r\n '淹',\r\n '漹',\r\n '烟',\r\n '焉',\r\n '焑',\r\n '煙',\r\n '珚',\r\n '篶',\r\n '胭',\r\n '臙',\r\n '菸',\r\n '鄢',\r\n '醃',\r\n '閹',\r\n '阉',\r\n '黫',\r\n ],\r\n huō: ['剨', '劐', '吙', '攉', '秴', '耠', '锪', '騞', '𬴃'],\r\n shèng: [\r\n '剩',\r\n '剰',\r\n '勝',\r\n '圣',\r\n '墭',\r\n '嵊',\r\n '晠',\r\n '榺',\r\n '橳',\r\n '琞',\r\n '聖',\r\n '蕂',\r\n '貹',\r\n '賸',\r\n ],\r\n 'duān zhì': ['剬'],\r\n wū: [\r\n '剭',\r\n '呜',\r\n '嗚',\r\n '圬',\r\n '屋',\r\n '巫',\r\n '弙',\r\n '杇',\r\n '歍',\r\n '汙',\r\n '汚',\r\n '污',\r\n '洿',\r\n '烏',\r\n '窏',\r\n '箼',\r\n '螐',\r\n '誈',\r\n '誣',\r\n '诬',\r\n '邬',\r\n '鄔',\r\n '鎢',\r\n '钨',\r\n '鰞',\r\n '鴮',\r\n ],\r\n gē: [\r\n '割',\r\n '哥',\r\n '圪',\r\n '彁',\r\n '戈',\r\n '戓',\r\n '戨',\r\n '歌',\r\n '滒',\r\n '犵',\r\n '肐',\r\n '袼',\r\n '謌',\r\n '鎶',\r\n '鴚',\r\n '鴿',\r\n '鸽',\r\n ],\r\n 'dá zhá': ['剳'],\r\n chuán: ['剶', '暷', '椽', '篅', '舡', '舩', '船', '輲', '遄'],\r\n 'tuán zhuān': ['剸', '漙', '篿'],\r\n 'lù jiū': ['剹'],\r\n pēng: ['剻', '匉', '嘭', '怦', '恲', '抨', '梈', '烹', '砰', '軯', '駍'],\r\n piāo: ['剽', '勡', '慓', '旚', '犥', '翲', '螵', '飃', '飄', '飘', '魒'],\r\n kōu: ['剾', '彄', '抠', '摳', '眍', '瞘', '芤', '𫸩'],\r\n 'jiǎo chāo': ['剿', '劋', '勦', '摷'],\r\n qiāo: [\r\n '劁',\r\n '勪',\r\n '墝',\r\n '幧',\r\n '敲',\r\n '橇',\r\n '毃',\r\n '燆',\r\n '硗',\r\n '磽',\r\n '繑',\r\n '趬',\r\n '跷',\r\n '踍',\r\n '蹺',\r\n '蹻',\r\n '郻',\r\n '鄡',\r\n '鄥',\r\n '鍫',\r\n '鍬',\r\n '鐰',\r\n '锹',\r\n '頝',\r\n ],\r\n 'huá huà': ['劃'],\r\n 'zhā zhá': ['劄'],\r\n 'pī pǐ': ['劈', '悂'],\r\n tāng: ['劏', '嘡', '羰', '薚', '蝪', '蹚', '鞺', '鼞'],\r\n chán: [\r\n '劖',\r\n '嚵',\r\n '壥',\r\n '婵',\r\n '嬋',\r\n '巉',\r\n '廛',\r\n '棎',\r\n '毚',\r\n '湹',\r\n '潹',\r\n '潺',\r\n '澶',\r\n '瀍',\r\n '瀺',\r\n '煘',\r\n '獑',\r\n '磛',\r\n '緾',\r\n '纏',\r\n '纒',\r\n '缠',\r\n '艬',\r\n '蝉',\r\n '蟐',\r\n '蟬',\r\n '蟾',\r\n '誗',\r\n '讒',\r\n '谗',\r\n '躔',\r\n '鄽',\r\n '酁',\r\n '鋋',\r\n '鑱',\r\n '镵',\r\n '饞',\r\n '馋',\r\n ],\r\n zuān: ['劗', '躜', '躦', '鉆', '鑚'],\r\n mó: [\r\n '劘',\r\n '嫫',\r\n '嬤',\r\n '嬷',\r\n '尛',\r\n '摹',\r\n '擵',\r\n '橅',\r\n '糢',\r\n '膜',\r\n '藦',\r\n '蘑',\r\n '謨',\r\n '謩',\r\n '谟',\r\n '饃',\r\n '饝',\r\n '馍',\r\n '髍',\r\n '魔',\r\n '魹',\r\n ],\r\n zhú: [\r\n '劚',\r\n '斸',\r\n '曯',\r\n '欘',\r\n '灟',\r\n '炢',\r\n '烛',\r\n '燭',\r\n '爥',\r\n '瘃',\r\n '竹',\r\n '笁',\r\n '笜',\r\n '舳',\r\n '茿',\r\n '蓫',\r\n '蠋',\r\n '蠾',\r\n '躅',\r\n '逐',\r\n '逫',\r\n '钃',\r\n '鱁',\r\n ],\r\n quàn: ['劝', '勧', '勸', '牶', '韏'],\r\n 'jìn jìng': ['劤', '劲', '勁'],\r\n kēng: ['劥', '坑', '牼', '硁', '硜', '誙', '銵', '鍞', '鏗', '铿', '阬'],\r\n 'xié liè': ['劦'],\r\n 'zhù chú': ['助'],\r\n nǔ: ['努', '弩', '砮', '胬'],\r\n shào: ['劭', '卲', '哨', '潲', '紹', '綤', '绍', '袑', '邵'],\r\n miǎo: ['劰', '杪', '淼', '渺', '眇', '秒', '篎', '緲', '缈', '藐', '邈'],\r\n kǒu: ['劶', '口'],\r\n wā: [\r\n '劸',\r\n '娲',\r\n '媧',\r\n '屲',\r\n '挖',\r\n '攨',\r\n '洼',\r\n '溛',\r\n '漥',\r\n '瓾',\r\n '畖',\r\n '穵',\r\n '窊',\r\n '窪',\r\n '蛙',\r\n '韈',\r\n '鼃',\r\n ],\r\n kuāng: [\r\n '劻',\r\n '匡',\r\n '匩',\r\n '哐',\r\n '恇',\r\n '洭',\r\n '筐',\r\n '筺',\r\n '誆',\r\n '诓',\r\n '軭',\r\n '邼',\r\n ],\r\n hé: [\r\n '劾',\r\n '咊',\r\n '啝',\r\n '姀',\r\n '峆',\r\n '敆',\r\n '曷',\r\n '柇',\r\n '楁',\r\n '毼',\r\n '河',\r\n '涸',\r\n '渮',\r\n '澕',\r\n '熆',\r\n '皬',\r\n '盇',\r\n '盉',\r\n '盍',\r\n '盒',\r\n '禾',\r\n '篕',\r\n '籺',\r\n '粭',\r\n '翮',\r\n '菏',\r\n '萂',\r\n '覈',\r\n '訸',\r\n '詥',\r\n '郃',\r\n '釛',\r\n '鉌',\r\n '鑉',\r\n '閡',\r\n '闔',\r\n '阂',\r\n '阖',\r\n '鞨',\r\n '頜',\r\n '餄',\r\n '饸',\r\n '魺',\r\n '鹖',\r\n '麧',\r\n '齕',\r\n '龁',\r\n '龢',\r\n '𬌗',\r\n ],\r\n gào: [\r\n '勂',\r\n '吿',\r\n '告',\r\n '峼',\r\n '祮',\r\n '祰',\r\n '禞',\r\n '筶',\r\n '誥',\r\n '诰',\r\n '郜',\r\n '鋯',\r\n '锆',\r\n ],\r\n 'bó bèi': ['勃'],\r\n láng: [\r\n '勆',\r\n '嫏',\r\n '廊',\r\n '斏',\r\n '桹',\r\n '榔',\r\n '樃',\r\n '欴',\r\n '狼',\r\n '琅',\r\n '瑯',\r\n '硠',\r\n '稂',\r\n '艆',\r\n '蓈',\r\n '蜋',\r\n '螂',\r\n '躴',\r\n '郒',\r\n '郞',\r\n '鋃',\r\n '鎯',\r\n '锒',\r\n ],\r\n xūn: [\r\n '勋',\r\n '勛',\r\n '勲',\r\n '勳',\r\n '嚑',\r\n '坃',\r\n '埙',\r\n '塤',\r\n '壎',\r\n '壦',\r\n '曛',\r\n '燻',\r\n '獯',\r\n '矄',\r\n '纁',\r\n '臐',\r\n '薫',\r\n '薰',\r\n '蘍',\r\n '醺',\r\n '𫄸',\r\n ],\r\n 'juàn juān': ['勌', '瓹'],\r\n 'lè lēi': ['勒'],\r\n kài: ['勓', '炌', '烗', '鎎'],\r\n 'wěng yǎng': ['勜'],\r\n qín: [\r\n '勤',\r\n '嗪',\r\n '噙',\r\n '嶜',\r\n '庈',\r\n '懃',\r\n '懄',\r\n '捦',\r\n '擒',\r\n '斳',\r\n '檎',\r\n '澿',\r\n '珡',\r\n '琴',\r\n '琹',\r\n '瘽',\r\n '禽',\r\n '秦',\r\n '耹',\r\n '芩',\r\n '芹',\r\n '菦',\r\n '螓',\r\n '蠄',\r\n '鈙',\r\n '鈫',\r\n '雂',\r\n '靲',\r\n '鳹',\r\n '鵭',\r\n ],\r\n jiàng: [\r\n '勥',\r\n '匞',\r\n '匠',\r\n '嵹',\r\n '弜',\r\n '弶',\r\n '摾',\r\n '櫤',\r\n '洚',\r\n '滰',\r\n '犟',\r\n '糡',\r\n '糨',\r\n '絳',\r\n '绛',\r\n '謽',\r\n '酱',\r\n '醤',\r\n '醬',\r\n ],\r\n fān: [\r\n '勫',\r\n '嬏',\r\n '帆',\r\n '幡',\r\n '忛',\r\n '憣',\r\n '旙',\r\n '旛',\r\n '繙',\r\n '翻',\r\n '藩',\r\n '轓',\r\n '颿',\r\n '飜',\r\n '鱕',\r\n ],\r\n juān: ['勬', '姢', '娟', '捐', '涓', '蠲', '裐', '鎸', '鐫', '镌', '鹃'],\r\n 'tóng dòng': ['勭', '烔', '燑', '狪'],\r\n lǜ: [\r\n '勴',\r\n '垏',\r\n '嵂',\r\n '律',\r\n '慮',\r\n '氯',\r\n '滤',\r\n '濾',\r\n '爈',\r\n '箻',\r\n '綠',\r\n '繂',\r\n '膟',\r\n '葎',\r\n '虑',\r\n '鑢',\r\n ],\r\n chè: [\r\n '勶',\r\n '坼',\r\n '彻',\r\n '徹',\r\n '掣',\r\n '撤',\r\n '澈',\r\n '烢',\r\n '爡',\r\n '瞮',\r\n '硩',\r\n '聅',\r\n '迠',\r\n '頙',\r\n '㬚',\r\n ],\r\n sháo: ['勺', '玿', '韶'],\r\n 'gōu gòu': ['勾'],\r\n cōng: [\r\n '匆',\r\n '囪',\r\n '囱',\r\n '忩',\r\n '怱',\r\n '悤',\r\n '暰',\r\n '樬',\r\n '漗',\r\n '瑽',\r\n '璁',\r\n '瞛',\r\n '篵',\r\n '繱',\r\n '聡',\r\n '聦',\r\n '聪',\r\n '聰',\r\n '苁',\r\n '茐',\r\n '葱',\r\n '蓯',\r\n '蔥',\r\n '蟌',\r\n '鍯',\r\n '鏓',\r\n '鏦',\r\n '騘',\r\n '驄',\r\n '骢',\r\n ],\r\n 'táo yáo': ['匋', '陶'],\r\n páo: ['匏', '咆', '垉', '庖', '爮', '狍', '袍', '褜', '軳', '鞄', '麅'],\r\n dá: [\r\n '匒',\r\n '妲',\r\n '怛',\r\n '炟',\r\n '燵',\r\n '畣',\r\n '笪',\r\n '羍',\r\n '荙',\r\n '薘',\r\n '蟽',\r\n '詚',\r\n '达',\r\n '迏',\r\n '迖',\r\n '迚',\r\n '逹',\r\n '達',\r\n '鐽',\r\n '靼',\r\n '鞑',\r\n '韃',\r\n '龖',\r\n '龘',\r\n '𫟼',\r\n ],\r\n 'huà huā': ['化'],\r\n 'běi bèi': ['北'],\r\n nǎo: ['匘', '垴', '堖', '嫐', '恼', '悩', '惱', '瑙', '碯', '脑', '脳', '腦'],\r\n 'chí shi': ['匙'],\r\n fāng: ['匚', '堏', '方', '淓', '牥', '芳', '邡', '鈁', '錺', '钫', '鴋'],\r\n zā: ['匝', '咂', '帀', '沞', '臜', '臢', '迊', '鉔', '魳'],\r\n qiè: [\r\n '匧',\r\n '厒',\r\n '妾',\r\n '怯',\r\n '悏',\r\n '惬',\r\n '愜',\r\n '挈',\r\n '穕',\r\n '窃',\r\n '竊',\r\n '笡',\r\n '箧',\r\n '篋',\r\n '籡',\r\n '踥',\r\n '鍥',\r\n '锲',\r\n '鯜',\r\n ],\r\n 'zāng cáng': ['匨'],\r\n fěi: ['匪', '奜', '悱', '棐', '榧', '篚', '翡', '蕜', '誹', '诽'],\r\n 'kuì guì': ['匮', '匱'],\r\n suǎn: ['匴'],\r\n pǐ: ['匹', '噽', '嚭', '圮', '庀', '痞', '癖', '脴', '苉', '銢', '鴄'],\r\n 'qū ōu': ['区', '區'],\r\n 'kē qià': ['匼'],\r\n 'yǎn yàn': ['匽', '棪'],\r\n biǎn: ['匾', '惼', '揙', '碥', '稨', '窆', '藊', '褊', '貶', '贬', '鴘'],\r\n nì: [\r\n '匿',\r\n '堄',\r\n '嫟',\r\n '嬺',\r\n '惄',\r\n '愵',\r\n '昵',\r\n '暱',\r\n '氼',\r\n '眤',\r\n '睨',\r\n '縌',\r\n '胒',\r\n '腻',\r\n '膩',\r\n '逆',\r\n '𨺙',\r\n ],\r\n niàn: ['卄', '唸', '埝', '廿', '念', '惗', '艌'],\r\n sà: ['卅', '櫒', '脎', '萨', '蕯', '薩', '鈒', '隡', '颯', '飒', '馺'],\r\n zú: ['卆', '哫', '崪', '族', '箤', '足', '踤', '镞'],\r\n shēng: [\r\n '升',\r\n '呏',\r\n '声',\r\n '斘',\r\n '昇',\r\n '曻',\r\n '枡',\r\n '殅',\r\n '泩',\r\n '湦',\r\n '焺',\r\n '牲',\r\n '珄',\r\n '生',\r\n '甥',\r\n '竔',\r\n '笙',\r\n '聲',\r\n '鉎',\r\n '鍟',\r\n '阩',\r\n '陞',\r\n '陹',\r\n '鵿',\r\n '鼪',\r\n ],\r\n wàn: [\r\n '卍',\r\n '卐',\r\n '忨',\r\n '杤',\r\n '瞣',\r\n '脕',\r\n '腕',\r\n '萬',\r\n '蟃',\r\n '贎',\r\n '輐',\r\n '錽',\r\n '𬇕',\r\n ],\r\n 'huá huà huā': ['华', '華'],\r\n bēi: ['卑', '悲', '揹', '杯', '桮', '盃', '碑', '藣', '鵯', '鹎'],\r\n 'zú cù': ['卒'],\r\n 'dān shàn chán': ['单', '單'],\r\n 'nán nā': ['南'],\r\n 'shuài lǜ': ['卛'],\r\n 'bǔ bo pú': ['卜'],\r\n 'kuàng guàn': ['卝'],\r\n biàn: [\r\n '卞',\r\n '变',\r\n '変',\r\n '峅',\r\n '弁',\r\n '徧',\r\n '忭',\r\n '抃',\r\n '昪',\r\n '汳',\r\n '汴',\r\n '玣',\r\n '艑',\r\n '苄',\r\n '覍',\r\n '諚',\r\n '變',\r\n '辡',\r\n '辧',\r\n '辨',\r\n '辩',\r\n '辫',\r\n '辮',\r\n '辯',\r\n '遍',\r\n '釆',\r\n '𨚕',\r\n ],\r\n bǔ: ['卟', '哺', '捕', '补', '補', '鸔', '𬷕'],\r\n 'zhàn zhān': ['占', '覱'],\r\n 'kǎ qiǎ': ['卡'],\r\n lú: [\r\n '卢',\r\n '嚧',\r\n '垆',\r\n '壚',\r\n '庐',\r\n '廬',\r\n '曥',\r\n '枦',\r\n '栌',\r\n '櫨',\r\n '泸',\r\n '瀘',\r\n '炉',\r\n '爐',\r\n '獹',\r\n '玈',\r\n '瓐',\r\n '盧',\r\n '矑',\r\n '籚',\r\n '纑',\r\n '罏',\r\n '胪',\r\n '臚',\r\n '舮',\r\n '舻',\r\n '艫',\r\n '芦',\r\n '蘆',\r\n '蠦',\r\n '轤',\r\n '轳',\r\n '鈩',\r\n '鑪',\r\n '顱',\r\n '颅',\r\n '馿',\r\n '髗',\r\n '魲',\r\n '鱸',\r\n '鲈',\r\n '鸕',\r\n '鸬',\r\n '黸',\r\n '𬬻',\r\n ],\r\n lǔ: [\r\n '卤',\r\n '塷',\r\n '掳',\r\n '擄',\r\n '樐',\r\n '橹',\r\n '櫓',\r\n '氌',\r\n '滷',\r\n '澛',\r\n '瀂',\r\n '硵',\r\n '磠',\r\n '穞',\r\n '艣',\r\n '艪',\r\n '蓾',\r\n '虏',\r\n '虜',\r\n '鏀',\r\n '鐪',\r\n '鑥',\r\n '镥',\r\n '魯',\r\n '鲁',\r\n '鹵',\r\n ],\r\n guà: ['卦', '啩', '挂', '掛', '罣', '褂', '詿', '诖'],\r\n 'áng yǎng': ['卬'],\r\n yìn: [\r\n '印',\r\n '垽',\r\n '堷',\r\n '廕',\r\n '慭',\r\n '憖',\r\n '憗',\r\n '懚',\r\n '洕',\r\n '湚',\r\n '猌',\r\n '癊',\r\n '胤',\r\n '茚',\r\n '酳',\r\n '鮣',\r\n '䲟',\r\n ],\r\n què: [\r\n '却',\r\n '卻',\r\n '塙',\r\n '崅',\r\n '悫',\r\n '愨',\r\n '慤',\r\n '搉',\r\n '榷',\r\n '燩',\r\n '琷',\r\n '皵',\r\n '确',\r\n '確',\r\n '礭',\r\n '闋',\r\n '阕',\r\n '鵲',\r\n '鹊',\r\n '𬒈',\r\n ],\r\n luǎn: ['卵'],\r\n 'juàn juǎn': ['卷', '巻'],\r\n 'chǎng ān hàn': ['厂'],\r\n 'wěi yán': ['厃'],\r\n tīng: [\r\n '厅',\r\n '厛',\r\n '听',\r\n '庁',\r\n '廰',\r\n '廳',\r\n '汀',\r\n '烃',\r\n '烴',\r\n '綎',\r\n '耓',\r\n '聴',\r\n '聼',\r\n '聽',\r\n '鞓',\r\n '𬘩',\r\n ],\r\n 'zhé zhái': ['厇'],\r\n 'hàn àn': ['厈', '屽'],\r\n yǎ: ['厊', '唖', '庌', '痖', '瘂', '蕥'],\r\n shè: [\r\n '厍',\r\n '厙',\r\n '弽',\r\n '慑',\r\n '慴',\r\n '懾',\r\n '摂',\r\n '欇',\r\n '涉',\r\n '涻',\r\n '渉',\r\n '滠',\r\n '灄',\r\n '社',\r\n '舎',\r\n '蔎',\r\n '蠂',\r\n '設',\r\n '设',\r\n '赦',\r\n '騇',\r\n '麝',\r\n ],\r\n dǐ: [\r\n '厎',\r\n '呧',\r\n '坘',\r\n '弤',\r\n '抵',\r\n '拞',\r\n '掋',\r\n '牴',\r\n '砥',\r\n '菧',\r\n '觝',\r\n '詆',\r\n '诋',\r\n '軧',\r\n '邸',\r\n '阺',\r\n '骶',\r\n '鯳',\r\n ],\r\n 'zhǎ zhǎi': ['厏'],\r\n páng: ['厐', '嫎', '庞', '徬', '舽', '螃', '逄', '鰟', '鳑', '龎', '龐'],\r\n 'zhì shī': ['厔'],\r\n máng: [\r\n '厖',\r\n '吂',\r\n '哤',\r\n '娏',\r\n '忙',\r\n '恾',\r\n '杗',\r\n '杧',\r\n '汒',\r\n '浝',\r\n '牻',\r\n '痝',\r\n '盲',\r\n '硭',\r\n '笀',\r\n '芒',\r\n '茫',\r\n '蘉',\r\n '邙',\r\n '釯',\r\n '鋩',\r\n '铓',\r\n '駹',\r\n ],\r\n zuī: ['厜', '樶', '纗', '蟕'],\r\n 'shà xià': ['厦', '廈'],\r\n áo: [\r\n '厫',\r\n '嗷',\r\n '嗸',\r\n '廒',\r\n '敖',\r\n '滶',\r\n '獒',\r\n '獓',\r\n '璈',\r\n '翱',\r\n '翶',\r\n '翺',\r\n '聱',\r\n '蔜',\r\n '螯',\r\n '謷',\r\n '謸',\r\n '遨',\r\n '鏖',\r\n '隞',\r\n '鰲',\r\n '鳌',\r\n '鷔',\r\n '鼇',\r\n ],\r\n 'lán qiān': ['厱'],\r\n 'sī mǒu': ['厶'],\r\n 'gōng hóng': ['厷'],\r\n 'lín miǎo': ['厸'],\r\n 'qiú róu': ['厹'],\r\n dū: ['厾', '嘟', '督', '醏'],\r\n 'xiàn xuán': ['县', '縣'],\r\n 'cān shēn cēn sān': ['参', '參', '叄', '叅'],\r\n 'ài yǐ': ['叆'],\r\n 'chā chà chǎ chá': ['叉'],\r\n shuāng: [\r\n '双',\r\n '孀',\r\n '孇',\r\n '欆',\r\n '礵',\r\n '艭',\r\n '雙',\r\n '霜',\r\n '騻',\r\n '驦',\r\n '骦',\r\n '鷞',\r\n '鸘',\r\n '鹴',\r\n ],\r\n shōu: ['収', '收'],\r\n guái: ['叏'],\r\n bá: [\r\n '叐',\r\n '妭',\r\n '抜',\r\n '拔',\r\n '炦',\r\n '癹',\r\n '胈',\r\n '茇',\r\n '菝',\r\n '詙',\r\n '跋',\r\n '軷',\r\n '魃',\r\n '鼥',\r\n ],\r\n 'fā fà': ['发'],\r\n 'zhuó yǐ lì jué': ['叕'],\r\n qǔ: ['取', '娶', '竬', '蝺', '詓', '齲', '龋'],\r\n 'jiǎ xiá': ['叚', '徦'],\r\n 'wèi yù': ['叞', '尉', '蔚'],\r\n dié: [\r\n '叠',\r\n '垤',\r\n '堞',\r\n '峌',\r\n '幉',\r\n '恎',\r\n '惵',\r\n '戜',\r\n '曡',\r\n '殜',\r\n '氎',\r\n '牃',\r\n '牒',\r\n '瓞',\r\n '畳',\r\n '疂',\r\n '疉',\r\n '疊',\r\n '碟',\r\n '絰',\r\n '绖',\r\n '耊',\r\n '耋',\r\n '胅',\r\n '艓',\r\n '苵',\r\n '蜨',\r\n '蝶',\r\n '褋',\r\n '詄',\r\n '諜',\r\n '谍',\r\n '跮',\r\n '蹀',\r\n '迭',\r\n '镻',\r\n '鰈',\r\n '鲽',\r\n '鴩',\r\n '𫶇',\r\n ],\r\n ruì: ['叡', '枘', '汭', '瑞', '睿', '芮', '蚋', '蜹', '銳', '鋭', '锐'],\r\n 'jù gōu': ['句'],\r\n lìng: ['另', '呤', '炩', '蘦'],\r\n 'dāo dáo tāo': ['叨'],\r\n 'zhī zhǐ': ['只'],\r\n jiào: [\r\n '叫',\r\n '呌',\r\n '嘂',\r\n '嘦',\r\n '噍',\r\n '嬓',\r\n '斍',\r\n '斠',\r\n '滘',\r\n '漖',\r\n '獥',\r\n '珓',\r\n '皭',\r\n '窖',\r\n '藠',\r\n '訆',\r\n '譥',\r\n '趭',\r\n '較',\r\n '轎',\r\n '轿',\r\n '较',\r\n '酵',\r\n '醮',\r\n '釂',\r\n ],\r\n 'zhào shào': ['召'],\r\n 'kě kè': ['可'],\r\n 'tái tāi': ['台', '苔'],\r\n pǒ: ['叵', '尀', '笸', '箥', '鉕', '钷', '駊'],\r\n 'yè xié': ['叶'],\r\n 'hào háo': ['号'],\r\n tàn: ['叹', '嘆', '探', '歎', '湠', '炭', '碳', '舕'],\r\n 'hōng hóng': ['叿'],\r\n miē: ['吀', '咩', '哶', '孭'],\r\n 'xū yū yù': ['吁'],\r\n chī: [\r\n '吃',\r\n '哧',\r\n '喫',\r\n '嗤',\r\n '噄',\r\n '妛',\r\n '媸',\r\n '彨',\r\n '彲',\r\n '摛',\r\n '攡',\r\n '殦',\r\n '瓻',\r\n '痴',\r\n '癡',\r\n '眵',\r\n '瞝',\r\n '笞',\r\n '粚',\r\n '胵',\r\n '蚩',\r\n '螭',\r\n '訵',\r\n '魑',\r\n '鴟',\r\n '鵄',\r\n '鸱',\r\n '黐',\r\n '齝',\r\n '𫄨',\r\n ],\r\n 'xuān sòng': ['吅'],\r\n yāo: [\r\n '吆',\r\n '喓',\r\n '夭',\r\n '妖',\r\n '幺',\r\n '楆',\r\n '殀',\r\n '祅',\r\n '腰',\r\n '葽',\r\n '訞',\r\n '邀',\r\n '鴁',\r\n '鴢',\r\n '㙘',\r\n ],\r\n zǐ: [\r\n '吇',\r\n '姉',\r\n '姊',\r\n '子',\r\n '杍',\r\n '梓',\r\n '榟',\r\n '橴',\r\n '滓',\r\n '矷',\r\n '秭',\r\n '笫',\r\n '籽',\r\n '紫',\r\n '耔',\r\n '虸',\r\n '訿',\r\n '釨',\r\n ],\r\n 'hé gě': ['合', '鲄'],\r\n 'cùn dòu': ['吋'],\r\n 'tóng tòng': ['同'],\r\n 'tǔ tù': ['吐', '唋'],\r\n 'zhà zhā': ['吒', '奓'],\r\n 'xià hè': ['吓'],\r\n 'ā yā': ['吖'],\r\n 'ma má mǎ': ['吗'],\r\n lìn: [\r\n '吝',\r\n '恡',\r\n '悋',\r\n '橉',\r\n '焛',\r\n '甐',\r\n '膦',\r\n '蔺',\r\n '藺',\r\n '賃',\r\n '赁',\r\n '蹸',\r\n '躏',\r\n '躙',\r\n '躪',\r\n '轥',\r\n '閵',\r\n ],\r\n tūn: ['吞', '暾', '朜', '焞'],\r\n 'bǐ pǐ': ['吡'],\r\n qìn: ['吢', '吣', '唚', '抋', '揿', '搇', '撳', '沁', '瀙', '菣', '藽'],\r\n 'jiè gè': ['吤'],\r\n 'fǒu pǐ': ['否'],\r\n 'ba bā': ['吧'],\r\n dūn: [\r\n '吨',\r\n '噸',\r\n '墩',\r\n '墪',\r\n '惇',\r\n '撉',\r\n '撴',\r\n '犜',\r\n '獤',\r\n '礅',\r\n '蜳',\r\n '蹾',\r\n '驐',\r\n ],\r\n fēn: [\r\n '吩',\r\n '帉',\r\n '昐',\r\n '朆',\r\n '梤',\r\n '棻',\r\n '氛',\r\n '竕',\r\n '紛',\r\n '纷',\r\n '翂',\r\n '芬',\r\n '衯',\r\n '訜',\r\n '躮',\r\n '酚',\r\n '鈖',\r\n '雰',\r\n '餴',\r\n '饙',\r\n '馚',\r\n ],\r\n 'é huā': ['吪'],\r\n 'kēng háng': ['吭', '妔'],\r\n shǔn: ['吮'],\r\n 'zhī zī': ['吱'],\r\n 'yǐn shěn': ['吲'],\r\n wú: [\r\n '吳',\r\n '吴',\r\n '呉',\r\n '墲',\r\n '峿',\r\n '梧',\r\n '橆',\r\n '毋',\r\n '洖',\r\n '浯',\r\n '無',\r\n '珸',\r\n '璑',\r\n '祦',\r\n '芜',\r\n '茣',\r\n '莁',\r\n '蕪',\r\n '蜈',\r\n '蟱',\r\n '譕',\r\n '郚',\r\n '鋙',\r\n '铻',\r\n '鯃',\r\n '鵐',\r\n '鷡',\r\n '鹀',\r\n '鼯',\r\n ],\r\n 'chǎo chāo': ['吵'],\r\n 'nà nè': ['吶'],\r\n 'xuè chuò jué': ['吷'],\r\n chuī: ['吹', '炊', '龡'],\r\n 'dōu rú': ['吺'],\r\n hǒu: ['吼', '犼'],\r\n 'hōng hǒu ōu': ['吽'],\r\n 'wú yù': ['吾'],\r\n 'ya yā': ['呀'],\r\n 'è e': ['呃'],\r\n dāi: ['呆', '懛', '獃'],\r\n 'mèn qǐ': ['呇'],\r\n hōng: [\r\n '呍',\r\n '嚝',\r\n '揈',\r\n '灴',\r\n '烘',\r\n '焢',\r\n '硡',\r\n '薨',\r\n '訇',\r\n '谾',\r\n '軣',\r\n '輷',\r\n '轟',\r\n '轰',\r\n '鍧',\r\n ],\r\n nà: [\r\n '呐',\r\n '捺',\r\n '笝',\r\n '納',\r\n '纳',\r\n '肭',\r\n '蒳',\r\n '衲',\r\n '豽',\r\n '貀',\r\n '軜',\r\n '郍',\r\n '鈉',\r\n '钠',\r\n '靹',\r\n '魶',\r\n ],\r\n 'tūn tiān': ['呑'],\r\n 'fǔ ḿ': ['呒', '嘸'],\r\n 'dāi tǎi': ['呔'],\r\n 'ǒu ōu òu': ['呕'],\r\n 'bài bei': ['呗'],\r\n 'yuán yún yùn': ['员', '員'],\r\n guō: [\r\n '呙',\r\n '啯',\r\n '嘓',\r\n '埚',\r\n '堝',\r\n '墎',\r\n '崞',\r\n '彉',\r\n '彍',\r\n '懖',\r\n '猓',\r\n '瘑',\r\n '聒',\r\n '蝈',\r\n '蟈',\r\n '郭',\r\n '鈛',\r\n '鍋',\r\n '锅',\r\n ],\r\n 'huá qì': ['呚'],\r\n 'qiàng qiāng': ['呛', '跄'],\r\n shī: [\r\n '呞',\r\n '失',\r\n '尸',\r\n '屍',\r\n '师',\r\n '師',\r\n '施',\r\n '浉',\r\n '湤',\r\n '湿',\r\n '溮',\r\n '溼',\r\n '濕',\r\n '狮',\r\n '獅',\r\n '瑡',\r\n '絁',\r\n '葹',\r\n '蒒',\r\n '蓍',\r\n '虱',\r\n '蝨',\r\n '褷',\r\n '襹',\r\n '詩',\r\n '诗',\r\n '邿',\r\n '釃',\r\n '鉇',\r\n '鍦',\r\n '鯴',\r\n '鰤',\r\n '鲺',\r\n '鳲',\r\n '鳾',\r\n '鶳',\r\n '鸤',\r\n '䴓',\r\n '𫚕',\r\n ],\r\n juǎn: ['呟', '埍', '臇', '菤', '錈', '锩'],\r\n pěn: ['呠', '翸'],\r\n 'wěn mǐn': ['呡'],\r\n 'ne ní': ['呢'],\r\n 'ḿ m̀ móu': ['呣'],\r\n rán: [\r\n '呥',\r\n '嘫',\r\n '然',\r\n '燃',\r\n '繎',\r\n '肰',\r\n '蚦',\r\n '蚺',\r\n '衻',\r\n '袇',\r\n '袡',\r\n '髥',\r\n '髯',\r\n ],\r\n 'tiè chè': ['呫'],\r\n 'qì zhī': ['呮'],\r\n 'zǐ cī': ['呰'],\r\n 'guā gū guǎ': ['呱'],\r\n 'cī zī': ['呲'],\r\n 'hǒu xǔ gòu': ['呴'],\r\n 'hē ā á ǎ à a': ['呵'],\r\n náo: [\r\n '呶',\r\n '夒',\r\n '峱',\r\n '嶩',\r\n '巎',\r\n '挠',\r\n '撓',\r\n '猱',\r\n '硇',\r\n '蛲',\r\n '蟯',\r\n '詉',\r\n '譊',\r\n '鐃',\r\n '铙',\r\n ],\r\n 'xiā gā': ['呷'],\r\n pēi: ['呸', '怌', '肧', '胚', '衃', '醅'],\r\n 'háo xiāo': ['呺'],\r\n mìng: ['命', '掵'],\r\n 'dá dàn': ['呾'],\r\n 'zuǐ jǔ': ['咀'],\r\n 'xián gān': ['咁'],\r\n pǒu: ['咅', '哣', '犃'],\r\n 'yǎng yāng': ['咉'],\r\n 'zǎ zé zhā': ['咋'],\r\n 'hé hè huó huò hú': ['和'],\r\n hāi: ['咍'],\r\n dā: ['咑', '哒', '噠', '墶', '搭', '撘', '耷', '褡', '鎝', '𨱏'],\r\n 'kǎ kā': ['咔'],\r\n gū: [\r\n '咕',\r\n '唂',\r\n '唃',\r\n '姑',\r\n '嫴',\r\n '孤',\r\n '巬',\r\n '巭',\r\n '柧',\r\n '橭',\r\n '沽',\r\n '泒',\r\n '稒',\r\n '笟',\r\n '箍',\r\n '箛',\r\n '篐',\r\n '罛',\r\n '苽',\r\n '菇',\r\n '菰',\r\n '蓇',\r\n '觚',\r\n '軱',\r\n '軲',\r\n '轱',\r\n '辜',\r\n '酤',\r\n '鈲',\r\n '鮕',\r\n '鴣',\r\n '鸪',\r\n ],\r\n 'kā gā': ['咖'],\r\n zuo: ['咗'],\r\n lóng: [\r\n '咙',\r\n '嚨',\r\n '嶐',\r\n '巃',\r\n '巄',\r\n '昽',\r\n '曨',\r\n '朧',\r\n '栊',\r\n '槞',\r\n '櫳',\r\n '湰',\r\n '滝',\r\n '漋',\r\n '爖',\r\n '珑',\r\n '瓏',\r\n '癃',\r\n '眬',\r\n '矓',\r\n '砻',\r\n '礱',\r\n '礲',\r\n '窿',\r\n '竜',\r\n '聋',\r\n '聾',\r\n '胧',\r\n '茏',\r\n '蘢',\r\n '蠪',\r\n '蠬',\r\n '襱',\r\n '豅',\r\n '鏧',\r\n '鑨',\r\n '霳',\r\n '靇',\r\n '驡',\r\n '鸗',\r\n '龍',\r\n '龒',\r\n '龙',\r\n ],\r\n 'xiàn xián': ['咞'],\r\n qì: [\r\n '咠',\r\n '唭',\r\n '噐',\r\n '器',\r\n '夡',\r\n '弃',\r\n '憇',\r\n '憩',\r\n '暣',\r\n '棄',\r\n '欫',\r\n '气',\r\n '気',\r\n '氣',\r\n '汔',\r\n '汽',\r\n '泣',\r\n '湆',\r\n '湇',\r\n '炁',\r\n '甈',\r\n '盵',\r\n '矵',\r\n '碛',\r\n '碶',\r\n '磜',\r\n '磧',\r\n '罊',\r\n '芞',\r\n '葺',\r\n '藒',\r\n '蟿',\r\n '訖',\r\n '讫',\r\n '迄',\r\n '鐑',\r\n ],\r\n 'xì dié': ['咥'],\r\n 'liē liě lié lie': ['咧'],\r\n zī: [\r\n '咨',\r\n '嗞',\r\n '姕',\r\n '姿',\r\n '孜',\r\n '孳',\r\n '孶',\r\n '崰',\r\n '嵫',\r\n '栥',\r\n '椔',\r\n '淄',\r\n '湽',\r\n '滋',\r\n '澬',\r\n '玆',\r\n '禌',\r\n '秶',\r\n '粢',\r\n '紎',\r\n '緇',\r\n '緕',\r\n '纃',\r\n '缁',\r\n '茊',\r\n '茲',\r\n '葘',\r\n '諮',\r\n '谘',\r\n '貲',\r\n '資',\r\n '赀',\r\n '资',\r\n '赼',\r\n '趑',\r\n '趦',\r\n '輜',\r\n '輺',\r\n '辎',\r\n '鄑',\r\n '鈭',\r\n '錙',\r\n '鍿',\r\n '鎡',\r\n '锱',\r\n '镃',\r\n '頾',\r\n '頿',\r\n '髭',\r\n '鯔',\r\n '鰦',\r\n '鲻',\r\n '鶅',\r\n '鼒',\r\n '齍',\r\n '齜',\r\n '龇',\r\n ],\r\n mī: ['咪'],\r\n 'jī xī qià': ['咭'],\r\n 'gē luò kǎ lo': ['咯'],\r\n 'shù xún': ['咰'],\r\n 'zán zá zǎ zan': ['咱'],\r\n 'hāi ké': ['咳'],\r\n huī: [\r\n '咴',\r\n '噅',\r\n '噕',\r\n '婎',\r\n '媈',\r\n '幑',\r\n '徽',\r\n '恢',\r\n '拻',\r\n '挥',\r\n '揮',\r\n '晖',\r\n '暉',\r\n '楎',\r\n '洃',\r\n '瀈',\r\n '灰',\r\n '灳',\r\n '烣',\r\n '睳',\r\n '禈',\r\n '翚',\r\n '翬',\r\n '蘳',\r\n '袆',\r\n '褘',\r\n '詼',\r\n '诙',\r\n '豗',\r\n '輝',\r\n '辉',\r\n '鰴',\r\n '麾',\r\n '㧑',\r\n ],\r\n 'huài shì': ['咶'],\r\n táo: [\r\n '咷',\r\n '啕',\r\n '桃',\r\n '檮',\r\n '洮',\r\n '淘',\r\n '祹',\r\n '綯',\r\n '绹',\r\n '萄',\r\n '蜪',\r\n '裪',\r\n '迯',\r\n '逃',\r\n '醄',\r\n '鋾',\r\n '鞀',\r\n '鞉',\r\n '饀',\r\n '駣',\r\n '騊',\r\n '鼗',\r\n '𫘦',\r\n ],\r\n xián: [\r\n '咸',\r\n '啣',\r\n '娴',\r\n '娹',\r\n '婱',\r\n '嫌',\r\n '嫺',\r\n '嫻',\r\n '弦',\r\n '挦',\r\n '撏',\r\n '涎',\r\n '湺',\r\n '澖',\r\n '甉',\r\n '痫',\r\n '癇',\r\n '癎',\r\n '絃',\r\n '胘',\r\n '舷',\r\n '藖',\r\n '蚿',\r\n '蛝',\r\n '衔',\r\n '衘',\r\n '誸',\r\n '諴',\r\n '賢',\r\n '贒',\r\n '贤',\r\n '輱',\r\n '醎',\r\n '銜',\r\n '鑦',\r\n '閑',\r\n '闲',\r\n '鷳',\r\n '鷴',\r\n '鷼',\r\n '鹇',\r\n '鹹',\r\n '麙',\r\n '𫍯',\r\n ],\r\n 'è àn': ['咹'],\r\n 'xuān xuǎn': ['咺', '烜'],\r\n 'wāi hé wǒ guǎ guō': ['咼'],\r\n 'yàn yè yān': ['咽'],\r\n āi: ['哀', '哎', '埃', '溾', '銰', '鎄', '锿'],\r\n pǐn: ['品', '榀'],\r\n shěn: [\r\n '哂',\r\n '婶',\r\n '嬸',\r\n '审',\r\n '宷',\r\n '審',\r\n '弞',\r\n '曋',\r\n '渖',\r\n '瀋',\r\n '瞫',\r\n '矤',\r\n '矧',\r\n '覾',\r\n '訠',\r\n '諗',\r\n '讅',\r\n '谂',\r\n '谉',\r\n '邥',\r\n '頣',\r\n '魫',\r\n ],\r\n 'hǒng hōng hòng': ['哄'],\r\n 'wā wa': ['哇'],\r\n 'hā hǎ hà': ['哈'],\r\n zāi: ['哉', '栽', '渽', '溨', '災', '灾', '烖', '睵', '賳'],\r\n 'dì diè': ['哋'],\r\n pài: ['哌', '沠', '派', '渒', '湃', '蒎', '鎃'],\r\n 'gén hěn': ['哏'],\r\n 'yǎ yā': ['哑', '雅'],\r\n 'yuě huì': ['哕', '噦'],\r\n nián: ['哖', '年', '秊', '秥', '鮎', '鯰', '鲇', '鲶', '鵇', '黏'],\r\n 'huá huā': ['哗', '嘩'],\r\n 'jì jiē zhāi': ['哜', '嚌'],\r\n mōu: ['哞'],\r\n 'yō yo': ['哟', '喲'],\r\n lòng: ['哢', '梇', '贚'],\r\n 'ò ó é': ['哦'],\r\n 'lī lǐ li': ['哩'],\r\n 'nǎ na nǎi né něi': ['哪'],\r\n hè: [\r\n '哬',\r\n '垎',\r\n '壑',\r\n '寉',\r\n '惒',\r\n '焃',\r\n '煂',\r\n '燺',\r\n '爀',\r\n '癋',\r\n '碋',\r\n '翯',\r\n '褐',\r\n '謞',\r\n '賀',\r\n '贺',\r\n '赫',\r\n '靍',\r\n '靎',\r\n '靏',\r\n '鶴',\r\n '鸖',\r\n '鹤',\r\n ],\r\n 'bō pò bā': ['哱'],\r\n zhé: [\r\n '哲',\r\n '啠',\r\n '喆',\r\n '嚞',\r\n '埑',\r\n '悊',\r\n '摺',\r\n '晢',\r\n '晣',\r\n '歽',\r\n '矺',\r\n '砓',\r\n '磔',\r\n '籷',\r\n '粍',\r\n '虴',\r\n '蛰',\r\n '蟄',\r\n '袩',\r\n '詟',\r\n '謫',\r\n '謺',\r\n '讁',\r\n '讋',\r\n '谪',\r\n '輒',\r\n '輙',\r\n '轍',\r\n '辄',\r\n '辙',\r\n '鮿',\r\n ],\r\n 'liàng láng': ['哴'],\r\n 'liè lǜ': ['哷'],\r\n hān: ['哻', '憨', '蚶', '谽', '酣', '頇', '顸', '馠', '魽', '鼾'],\r\n 'hēng hng': ['哼'],\r\n gěng: [\r\n '哽',\r\n '埂',\r\n '峺',\r\n '挭',\r\n '梗',\r\n '綆',\r\n '绠',\r\n '耿',\r\n '莄',\r\n '郠',\r\n '骾',\r\n '鯁',\r\n '鲠',\r\n '𬒔',\r\n ],\r\n 'chuò yuè': ['哾'],\r\n 'gě jiā': ['哿'],\r\n 'bei bài': ['唄'],\r\n 'hán hàn': ['唅'],\r\n chún: [\r\n '唇',\r\n '浱',\r\n '湻',\r\n '滣',\r\n '漘',\r\n '犉',\r\n '純',\r\n '纯',\r\n '脣',\r\n '莼',\r\n '蒓',\r\n '蓴',\r\n '醇',\r\n '醕',\r\n '錞',\r\n '陙',\r\n '鯙',\r\n '鶉',\r\n '鹑',\r\n '𬭚',\r\n ],\r\n 'ài āi': ['唉'],\r\n 'jiá qiǎn': ['唊'],\r\n 'yán dàn xián': ['唌'],\r\n chē: ['唓', '砗', '硨', '莗', '蛼'],\r\n 'wú ńg ń': ['唔'],\r\n zào: [\r\n '唕',\r\n '唣',\r\n '噪',\r\n '慥',\r\n '梍',\r\n '灶',\r\n '煰',\r\n '燥',\r\n '皁',\r\n '皂',\r\n '竃',\r\n '竈',\r\n '簉',\r\n '艁',\r\n '譟',\r\n '趮',\r\n '躁',\r\n '造',\r\n '𥖨',\r\n ],\r\n dí: [\r\n '唙',\r\n '啇',\r\n '嘀',\r\n '嚁',\r\n '嫡',\r\n '廸',\r\n '敌',\r\n '敵',\r\n '梑',\r\n '涤',\r\n '滌',\r\n '狄',\r\n '笛',\r\n '籴',\r\n '糴',\r\n '苖',\r\n '荻',\r\n '蔋',\r\n '蔐',\r\n '藡',\r\n '覿',\r\n '觌',\r\n '豴',\r\n '迪',\r\n '靮',\r\n '頔',\r\n '馰',\r\n '髢',\r\n '鸐',\r\n '𬱖',\r\n ],\r\n 'gòng hǒng gǒng': ['唝', '嗊'],\r\n dóu: ['唞'],\r\n 'lào láo': ['唠', '嘮', '憦'],\r\n huàn: [\r\n '唤',\r\n '喚',\r\n '奂',\r\n '奐',\r\n '宦',\r\n '嵈',\r\n '幻',\r\n '患',\r\n '愌',\r\n '换',\r\n '換',\r\n '擐',\r\n '攌',\r\n '梙',\r\n '槵',\r\n '浣',\r\n '涣',\r\n '渙',\r\n '漶',\r\n '澣',\r\n '烉',\r\n '焕',\r\n '煥',\r\n '瑍',\r\n '痪',\r\n '瘓',\r\n '睆',\r\n '肒',\r\n '藧',\r\n '豢',\r\n '轘',\r\n '逭',\r\n '鯇',\r\n '鯶',\r\n '鰀',\r\n '鲩',\r\n ],\r\n léng: ['唥', '塄', '楞', '碐', '薐'],\r\n 'wō wěi': ['唩'],\r\n fěng: ['唪', '覂', '諷', '讽'],\r\n 'yín jìn': ['唫'],\r\n 'hǔ xià': ['唬'],\r\n wéi: [\r\n '唯',\r\n '围',\r\n '圍',\r\n '壝',\r\n '峗',\r\n '峞',\r\n '嵬',\r\n '帏',\r\n '帷',\r\n '幃',\r\n '惟',\r\n '桅',\r\n '沩',\r\n '洈',\r\n '涠',\r\n '湋',\r\n '溈',\r\n '潍',\r\n '潙',\r\n '潿',\r\n '濰',\r\n '犩',\r\n '矀',\r\n '維',\r\n '维',\r\n '蓶',\r\n '覹',\r\n '违',\r\n '違',\r\n '鄬',\r\n '醀',\r\n '鍏',\r\n '闈',\r\n '闱',\r\n '韋',\r\n '韦',\r\n '鮠',\r\n '𣲗',\r\n '𬶏',\r\n ],\r\n shuā: ['唰'],\r\n chàng: ['唱', '怅', '悵', '暢', '焻', '畅', '畼', '誯', '韔', '鬯'],\r\n 'ér wā': ['唲'],\r\n qiàng: ['唴', '炝', '熗', '羻'],\r\n yō: ['唷'],\r\n yū: ['唹', '淤', '瘀', '盓', '箊', '紆', '纡', '込', '迂', '迃', '陓'],\r\n lài: [\r\n '唻',\r\n '濑',\r\n '瀨',\r\n '瀬',\r\n '癞',\r\n '癩',\r\n '睐',\r\n '睞',\r\n '籁',\r\n '籟',\r\n '藾',\r\n '賚',\r\n '賴',\r\n '赉',\r\n '赖',\r\n '頼',\r\n '顂',\r\n '鵣',\r\n ],\r\n tuò: ['唾', '嶞', '柝', '毤', '毻', '箨', '籜', '萚', '蘀', '跅'],\r\n 'zhōu zhāo tiào': ['啁'],\r\n kěn: ['啃', '垦', '墾', '恳', '懇', '肎', '肯', '肻', '豤', '錹'],\r\n 'zhuó zhào': ['啅', '濯'],\r\n 'hēng hèng': ['啈', '悙'],\r\n 'lín lán': ['啉'],\r\n 'a ā á ǎ à': ['啊'],\r\n qiāng: [\r\n '啌',\r\n '嗴',\r\n '嶈',\r\n '戕',\r\n '摤',\r\n '斨',\r\n '枪',\r\n '槍',\r\n '溬',\r\n '牄',\r\n '猐',\r\n '獇',\r\n '羌',\r\n '羗',\r\n '腔',\r\n '蜣',\r\n '謒',\r\n '鏘',\r\n '锖',\r\n '锵',\r\n ],\r\n 'tūn zhūn xiāng duǐ': ['啍'],\r\n wèn: ['問', '妏', '揾', '搵', '璺', '问', '顐'],\r\n 'cuì qi': ['啐'],\r\n 'dié shà jié tì': ['啑'],\r\n 'yuē wā': ['啘'],\r\n 'zǐ cǐ': ['啙'],\r\n 'bǐ tú': ['啚'],\r\n 'chuò chuài': ['啜'],\r\n 'yǎ yā è': ['啞'],\r\n fēi: [\r\n '啡',\r\n '婓',\r\n '婔',\r\n '扉',\r\n '暃',\r\n '渄',\r\n '猆',\r\n '緋',\r\n '绯',\r\n '裶',\r\n '霏',\r\n '非',\r\n '靟',\r\n '飛',\r\n '飝',\r\n '飞',\r\n '餥',\r\n '馡',\r\n '騑',\r\n '騛',\r\n '鯡',\r\n '鲱',\r\n '𬴂',\r\n ],\r\n pí: [\r\n '啤',\r\n '壀',\r\n '枇',\r\n '毗',\r\n '毘',\r\n '焷',\r\n '琵',\r\n '疲',\r\n '皮',\r\n '篺',\r\n '罴',\r\n '羆',\r\n '脾',\r\n '腗',\r\n '膍',\r\n '蚍',\r\n '蚽',\r\n '蜱',\r\n '螷',\r\n '蠯',\r\n '豼',\r\n '貔',\r\n '郫',\r\n '鈹',\r\n '阰',\r\n '陴',\r\n '隦',\r\n '魮',\r\n '鮍',\r\n '鲏',\r\n '鵧',\r\n '鼙',\r\n ],\r\n shá: ['啥'],\r\n 'lā la': ['啦'],\r\n 'yīng qíng': ['啨'],\r\n pā: ['啪', '妑', '舥', '葩', '趴'],\r\n 'zhě shì': ['啫'],\r\n sè: [\r\n '啬',\r\n '嗇',\r\n '懎',\r\n '擌',\r\n '栜',\r\n '歮',\r\n '涩',\r\n '渋',\r\n '澀',\r\n '澁',\r\n '濇',\r\n '濏',\r\n '瀒',\r\n '瑟',\r\n '璱',\r\n '瘷',\r\n '穑',\r\n '穡',\r\n '穯',\r\n '繬',\r\n '譅',\r\n '轖',\r\n '銫',\r\n '鏼',\r\n '铯',\r\n '飋',\r\n ],\r\n niè: [\r\n '啮',\r\n '嗫',\r\n '噛',\r\n '嚙',\r\n '囁',\r\n '囓',\r\n '圼',\r\n '孼',\r\n '孽',\r\n '嵲',\r\n '嶭',\r\n '巕',\r\n '帇',\r\n '敜',\r\n '枿',\r\n '槷',\r\n '櫱',\r\n '涅',\r\n '湼',\r\n '痆',\r\n '篞',\r\n '籋',\r\n '糱',\r\n '糵',\r\n '聂',\r\n '聶',\r\n '臬',\r\n '臲',\r\n '蘖',\r\n '蠥',\r\n '讘',\r\n '踂',\r\n '踗',\r\n '踙',\r\n '蹑',\r\n '躡',\r\n '錜',\r\n '鎳',\r\n '鑈',\r\n '鑷',\r\n '钀',\r\n '镊',\r\n '镍',\r\n '闑',\r\n '陧',\r\n '隉',\r\n '顳',\r\n '颞',\r\n '齧',\r\n '𫔶',\r\n ],\r\n 'luō luó luo': ['啰', '囉'],\r\n 'tān chǎn tuō': ['啴'],\r\n bo: ['啵', '蔔'],\r\n dìng: [\r\n '啶',\r\n '定',\r\n '椗',\r\n '矴',\r\n '碇',\r\n '碠',\r\n '磸',\r\n '聢',\r\n '腚',\r\n '萣',\r\n '蝊',\r\n '訂',\r\n '订',\r\n '錠',\r\n '锭',\r\n '顁',\r\n '飣',\r\n '饤',\r\n ],\r\n lāng: ['啷'],\r\n 'án ān': ['啽'],\r\n kā: ['喀', '擖'],\r\n 'yóng yú': ['喁'],\r\n 'lā lá lǎ': ['喇'],\r\n jiē: [\r\n '喈',\r\n '喼',\r\n '嗟',\r\n '堦',\r\n '媘',\r\n '接',\r\n '掲',\r\n '擑',\r\n '湝',\r\n '煯',\r\n '疖',\r\n '痎',\r\n '癤',\r\n '皆',\r\n '秸',\r\n '稭',\r\n '脻',\r\n '蝔',\r\n '街',\r\n '謯',\r\n '阶',\r\n '階',\r\n '鞂',\r\n '鶛',\r\n ],\r\n hóu: [\r\n '喉',\r\n '帿',\r\n '猴',\r\n '瘊',\r\n '睺',\r\n '篌',\r\n '糇',\r\n '翭',\r\n '葔',\r\n '鄇',\r\n '鍭',\r\n '餱',\r\n '骺',\r\n '鯸',\r\n '𬭤',\r\n ],\r\n 'dié zhá': ['喋'],\r\n wāi: ['喎', '歪', '竵'],\r\n 'nuò rě': ['喏'],\r\n 'xù huò guó': ['喐'],\r\n zán: ['喒'],\r\n 'wō ō': ['喔'],\r\n hú: [\r\n '喖',\r\n '嘝',\r\n '囫',\r\n '壶',\r\n '壷',\r\n '壺',\r\n '媩',\r\n '弧',\r\n '搰',\r\n '斛',\r\n '楜',\r\n '槲',\r\n '湖',\r\n '瀫',\r\n '焀',\r\n '煳',\r\n '狐',\r\n '猢',\r\n '瑚',\r\n '瓳',\r\n '箶',\r\n '絗',\r\n '縠',\r\n '胡',\r\n '葫',\r\n '蔛',\r\n '蝴',\r\n '螜',\r\n '衚',\r\n '觳',\r\n '醐',\r\n '鍸',\r\n '頶',\r\n '餬',\r\n '鬍',\r\n '魱',\r\n '鰗',\r\n '鵠',\r\n '鶘',\r\n '鶦',\r\n '鹕',\r\n ],\r\n 'huàn yuán xuǎn hé': ['喛'],\r\n xǐ: [\r\n '喜',\r\n '囍',\r\n '壐',\r\n '屣',\r\n '徙',\r\n '憙',\r\n '枲',\r\n '橲',\r\n '歖',\r\n '漇',\r\n '玺',\r\n '璽',\r\n '矖',\r\n '禧',\r\n '縰',\r\n '葈',\r\n '葸',\r\n '蓰',\r\n '蟢',\r\n '謑',\r\n '蹝',\r\n '躧',\r\n '鈢',\r\n '鉨',\r\n '鉩',\r\n '鱚',\r\n '𬭳',\r\n '𬶮',\r\n ],\r\n 'hē hè yè': ['喝'],\r\n kuì: [\r\n '喟',\r\n '嘳',\r\n '媿',\r\n '嬇',\r\n '愦',\r\n '愧',\r\n '憒',\r\n '篑',\r\n '簣',\r\n '籄',\r\n '聩',\r\n '聭',\r\n '聵',\r\n '膭',\r\n '蕢',\r\n '謉',\r\n '餽',\r\n '饋',\r\n '馈',\r\n ],\r\n 'zhǒng chuáng': ['喠'],\r\n 'wéi wèi': ['喡', '為', '爲'],\r\n 'duó zhà': ['喥'],\r\n 'sāng sàng': ['喪'],\r\n 'qiáo jiāo': ['喬'],\r\n 'pèn bēn': ['喯'],\r\n 'cān sūn qī': ['喰'],\r\n 'zhā chā': ['喳'],\r\n miāo: ['喵'],\r\n 'pēn pèn': ['喷'],\r\n kuí: [\r\n '喹',\r\n '夔',\r\n '奎',\r\n '巙',\r\n '戣',\r\n '揆',\r\n '晆',\r\n '暌',\r\n '楏',\r\n '楑',\r\n '櫆',\r\n '犪',\r\n '睽',\r\n '葵',\r\n '藈',\r\n '蘷',\r\n '虁',\r\n '蝰',\r\n '躨',\r\n '逵',\r\n '鄈',\r\n '鍨',\r\n '鍷',\r\n '頯',\r\n '馗',\r\n '騤',\r\n '骙',\r\n '魁',\r\n ],\r\n 'lou lóu': ['喽'],\r\n 'zào qiāo': ['喿'],\r\n 'hè xiāo xiào hù': ['嗃'],\r\n 'á shà': ['嗄'],\r\n xiù: [\r\n '嗅',\r\n '岫',\r\n '峀',\r\n '溴',\r\n '珛',\r\n '琇',\r\n '璓',\r\n '秀',\r\n '綉',\r\n '繍',\r\n '繡',\r\n '绣',\r\n '螑',\r\n '袖',\r\n '褎',\r\n '褏',\r\n '銹',\r\n '鏥',\r\n '鏽',\r\n '锈',\r\n '齅',\r\n ],\r\n 'qiāng qiàng': ['嗆', '戗', '戧', '蹌', '蹡'],\r\n 'ài yì': ['嗌', '艾'],\r\n 'má mǎ ma': ['嗎'],\r\n 'kè kē': ['嗑'],\r\n 'dā tà': ['嗒', '鎉'],\r\n sǎng: ['嗓', '搡', '磉', '褬', '鎟', '顙', '颡'],\r\n chēn: ['嗔', '抻', '琛', '瞋', '諃', '謓', '賝', '郴', '𬘭'],\r\n 'wā gǔ': ['嗗'],\r\n 'pǎng bēng': ['嗙'],\r\n 'xián qiǎn qiān': ['嗛'],\r\n lào: ['嗠', '嫪', '橯', '涝', '澇', '耢', '耮', '躼', '軂', '酪'],\r\n wēng: ['嗡', '翁', '聬', '螉', '鎓', '鶲', '鹟', '𬭩'],\r\n wà: ['嗢', '腽', '膃', '袜', '襪', '韤'],\r\n 'hēi hāi': ['嗨'],\r\n hē: ['嗬', '欱', '蠚', '訶', '诃'],\r\n zi: ['嗭'],\r\n sǎi: ['嗮'],\r\n 'ǹg ńg ňg': ['嗯'],\r\n gě: ['嗰', '舸'],\r\n ná: ['嗱', '拏', '拿', '鎿', '镎'],\r\n diǎ: ['嗲'],\r\n 'ài ǎi āi': ['嗳'],\r\n tōng: ['嗵', '樋', '炵', '蓪'],\r\n 'zuī suī': ['嗺'],\r\n 'zhē zhè zhù zhe': ['嗻'],\r\n mò: [\r\n '嗼',\r\n '圽',\r\n '塻',\r\n '墨',\r\n '妺',\r\n '嫼',\r\n '寞',\r\n '帞',\r\n '昩',\r\n '末',\r\n '枺',\r\n '歿',\r\n '殁',\r\n '沫',\r\n '漠',\r\n '爅',\r\n '獏',\r\n '瘼',\r\n '皌',\r\n '眽',\r\n '眿',\r\n '瞐',\r\n '瞙',\r\n '砞',\r\n '礳',\r\n '秣',\r\n '絈',\r\n '纆',\r\n '耱',\r\n '茉',\r\n '莈',\r\n '蓦',\r\n '蛨',\r\n '蟔',\r\n '貃',\r\n '貊',\r\n '貘',\r\n '銆',\r\n '鏌',\r\n '镆',\r\n '陌',\r\n '靺',\r\n '驀',\r\n '魩',\r\n '默',\r\n '黙',\r\n '𬙊',\r\n ],\r\n sòu: ['嗽', '瘶'],\r\n tǎn: [\r\n '嗿',\r\n '坦',\r\n '忐',\r\n '憳',\r\n '憻',\r\n '暺',\r\n '毯',\r\n '璮',\r\n '菼',\r\n '袒',\r\n '襢',\r\n '醓',\r\n '鉭',\r\n '钽',\r\n ],\r\n 'jiào dǎo': ['嘄'],\r\n 'kǎi gě': ['嘅'],\r\n 'shān càn': ['嘇'],\r\n cáo: ['嘈', '嶆', '曹', '曺', '槽', '漕', '艚', '蓸', '螬', '褿', '鏪', '𥕢'],\r\n piào: ['嘌', '徱', '蔈', '驃'],\r\n 'lóu lou': ['嘍'],\r\n gǎ: ['尕', '玍'],\r\n 'gǔ jiǎ': ['嘏'],\r\n 'jiāo xiāo': ['嘐'],\r\n 'xū shī': ['嘘', '噓'],\r\n pó: ['嘙', '嚩', '婆', '櫇', '皤', '鄱'],\r\n 'dē dēi': ['嘚'],\r\n 'ma má': ['嘛'],\r\n 'lē lei': ['嘞'],\r\n 'gā gá gǎ': ['嘠'],\r\n sāi: ['嘥', '噻', '毢', '腮', '顋', '鰓'],\r\n 'zuō chuài': ['嘬'],\r\n 'cháo zhāo': ['嘲', '朝', '鼂'],\r\n zuǐ: ['嘴', '噿', '嶊', '璻'],\r\n 'qiáo qiào': ['嘺', '翹', '谯'],\r\n 'chù xù shòu': ['嘼'],\r\n 'tān chǎn': ['嘽'],\r\n 'dàn tán': ['嘾', '弾', '彈', '惔', '澹'],\r\n 'hēi mò': ['嘿'],\r\n ě: ['噁', '砨', '頋', '騀', '鵈'],\r\n 'fān bo': ['噃'],\r\n chuáng: ['噇', '床', '牀'],\r\n 'cù zā hé': ['噈'],\r\n 'tūn kuò': ['噋'],\r\n 'cēng chēng': ['噌'],\r\n dēng: ['噔', '嬁', '灯', '燈', '璒', '登', '竳', '簦', '艠', '豋'],\r\n pū: ['噗', '扑', '撲', '攴', '攵', '潽', '炇', '陠'],\r\n juē: ['噘', '屩', '屫', '撧'],\r\n lū: ['噜', '嚕', '撸', '擼', '謢'],\r\n zhān: [\r\n '噡',\r\n '岾',\r\n '惉',\r\n '旃',\r\n '旜',\r\n '枬',\r\n '栴',\r\n '毡',\r\n '氈',\r\n '氊',\r\n '沾',\r\n '瞻',\r\n '薝',\r\n '蛅',\r\n '詀',\r\n '詹',\r\n '譫',\r\n '谵',\r\n '趈',\r\n '邅',\r\n '閚',\r\n '霑',\r\n '飦',\r\n '饘',\r\n '驙',\r\n '魙',\r\n '鱣',\r\n '鸇',\r\n '鹯',\r\n '𫗴',\r\n ],\r\n ō: ['噢'],\r\n 'zhòu zhuó': ['噣'],\r\n 'jiào qiào chī': ['噭'],\r\n yuàn: [\r\n '噮',\r\n '妴',\r\n '怨',\r\n '愿',\r\n '掾',\r\n '瑗',\r\n '禐',\r\n '苑',\r\n '衏',\r\n '裫',\r\n '褑',\r\n '院',\r\n '願',\r\n ],\r\n 'ǎi ài āi': ['噯'],\r\n 'yōng yǒng': ['噰', '澭'],\r\n 'jué xué': ['噱'],\r\n 'pēn pèn fèn': ['噴'],\r\n gá: ['噶', '尜', '釓', '錷', '钆'],\r\n 'xīn hěn hèn': ['噷'],\r\n dāng: ['噹', '澢', '珰', '璫', '筜', '簹', '艡', '蟷', '裆', '襠'],\r\n làn: ['嚂', '滥', '濫', '烂', '燗', '爁', '爛', '爤', '瓓', '糷', '钄'],\r\n tà: [\r\n '嚃',\r\n '嚺',\r\n '崉',\r\n '挞',\r\n '搨',\r\n '撻',\r\n '榻',\r\n '橽',\r\n '毾',\r\n '涾',\r\n '澾',\r\n '濌',\r\n '禢',\r\n '粏',\r\n '誻',\r\n '譶',\r\n '蹋',\r\n '蹹',\r\n '躂',\r\n '躢',\r\n '遝',\r\n '錔',\r\n '闒',\r\n '闥',\r\n '闼',\r\n '阘',\r\n '鞜',\r\n '鞳',\r\n ],\r\n 'huō huò ǒ': ['嚄'],\r\n hāo: ['嚆', '茠', '蒿', '薅'],\r\n 'hè xià': ['嚇'],\r\n 'xiù pì': ['嚊'],\r\n 'zhōu chóu': ['嚋', '盩', '诪'],\r\n mē: ['嚒'],\r\n 'chā cā': ['嚓'],\r\n 'bó pào bào': ['嚗'],\r\n 'me mèi mò': ['嚜'],\r\n 'xié hái': ['嚡'],\r\n 'áo xiāo': ['嚣'],\r\n mō: ['嚤', '摸'],\r\n pín: [\r\n '嚬',\r\n '娦',\r\n '嫔',\r\n '嬪',\r\n '玭',\r\n '矉',\r\n '薲',\r\n '蠙',\r\n '貧',\r\n '贫',\r\n '顰',\r\n '颦',\r\n '𬞟',\r\n ],\r\n mè: ['嚰', '濹'],\r\n 'rǎng rāng': ['嚷'],\r\n lá: ['嚹', '旯'],\r\n 'jiáo jué jiào': ['嚼'],\r\n chuò: [\r\n '嚽',\r\n '娖',\r\n '擉',\r\n '歠',\r\n '涰',\r\n '磭',\r\n '踀',\r\n '輟',\r\n '辍',\r\n '辵',\r\n '辶',\r\n '酫',\r\n '鑡',\r\n '餟',\r\n '齪',\r\n '龊',\r\n ],\r\n 'huān huàn': ['嚾'],\r\n 'zá cà': ['囃'],\r\n chài: ['囆', '虿', '蠆', '袃', '訍'],\r\n 'náng nāng': ['囊'],\r\n 'zá zàn cān': ['囋'],\r\n sū: ['囌', '櫯', '甦', '稣', '穌', '窣', '蘇', '蘓', '酥', '鯂'],\r\n zèng: ['囎', '熷', '甑', '贈', '赠', '鋥', '锃'],\r\n 'zá niè yàn': ['囐'],\r\n nāng: ['囔'],\r\n 'luó luō luo': ['囖'],\r\n 'wéi guó': ['囗'],\r\n huí: [\r\n '囘',\r\n '回',\r\n '囬',\r\n '廻',\r\n '廽',\r\n '恛',\r\n '洄',\r\n '痐',\r\n '茴',\r\n '蚘',\r\n '蛔',\r\n '蛕',\r\n '蜖',\r\n '迴',\r\n '逥',\r\n '鮰',\r\n ],\r\n nín: ['囜', '您', '脌'],\r\n 'jiǎn nān': ['囝'],\r\n nān: ['囡'],\r\n tuán: ['团', '団', '團', '慱', '抟', '摶', '檲', '糰', '鏄', '鷒', '鷻'],\r\n 'tún dùn': ['囤', '坉'],\r\n guó: [\r\n '囯',\r\n '囶',\r\n '囻',\r\n '国',\r\n '圀',\r\n '國',\r\n '帼',\r\n '幗',\r\n '慖',\r\n '摑',\r\n '漍',\r\n '聝',\r\n '腘',\r\n '膕',\r\n '蔮',\r\n '虢',\r\n '馘',\r\n '𬇹',\r\n ],\r\n kùn: ['困', '涃', '睏'],\r\n 'wéi tōng': ['囲'],\r\n qūn: ['囷', '夋', '逡'],\r\n rì: ['囸', '日', '衵', '鈤', '馹', '驲'],\r\n tāi: ['囼', '孡', '胎'],\r\n pǔ: [\r\n '圃',\r\n '圑',\r\n '擈',\r\n '普',\r\n '暜',\r\n '樸',\r\n '檏',\r\n '氆',\r\n '浦',\r\n '溥',\r\n '烳',\r\n '諩',\r\n '譜',\r\n '谱',\r\n '蹼',\r\n '鐠',\r\n '镨',\r\n ],\r\n 'quān juàn juān': ['圈', '圏'],\r\n 'chuí chuán': ['圌'],\r\n tuǎn: ['圕', '畽', '疃'],\r\n lüè: ['圙', '掠', '略', '畧', '稤', '鋝', '鋢', '锊', '䂮'],\r\n 'huán yuán': ['圜'],\r\n luán: [\r\n '圝',\r\n '圞',\r\n '奱',\r\n '娈',\r\n '孌',\r\n '孪',\r\n '孿',\r\n '峦',\r\n '巒',\r\n '挛',\r\n '攣',\r\n '曫',\r\n '栾',\r\n '欒',\r\n '滦',\r\n '灤',\r\n '癴',\r\n '癵',\r\n '羉',\r\n '脔',\r\n '臠',\r\n '虊',\r\n '銮',\r\n '鑾',\r\n '鵉',\r\n '鸞',\r\n '鸾',\r\n ],\r\n tǔ: ['土', '圡', '釷', '钍'],\r\n 'xū wéi': ['圩'],\r\n 'dì de': ['地', '嶳'],\r\n 'qiān sú': ['圱'],\r\n zhèn: [\r\n '圳',\r\n '塦',\r\n '挋',\r\n '振',\r\n '朕',\r\n '栚',\r\n '甽',\r\n '眹',\r\n '紖',\r\n '絼',\r\n '纼',\r\n '誫',\r\n '賑',\r\n '赈',\r\n '鋴',\r\n '鎭',\r\n '鎮',\r\n '镇',\r\n '阵',\r\n '陣',\r\n '震',\r\n '鴆',\r\n '鸩',\r\n ],\r\n 'chǎng cháng': ['场', '場', '塲'],\r\n 'qí yín': ['圻'],\r\n jiá: [\r\n '圿',\r\n '忦',\r\n '恝',\r\n '戞',\r\n '扴',\r\n '脥',\r\n '荚',\r\n '莢',\r\n '蛱',\r\n '蛺',\r\n '裌',\r\n '跲',\r\n '郏',\r\n '郟',\r\n '鋏',\r\n '铗',\r\n '頬',\r\n '頰',\r\n '颊',\r\n '鴶',\r\n '鵊',\r\n ],\r\n 'zhǐ zhì': ['坁'],\r\n bǎn: [\r\n '坂',\r\n '岅',\r\n '昄',\r\n '板',\r\n '版',\r\n '瓪',\r\n '粄',\r\n '舨',\r\n '蝂',\r\n '鈑',\r\n '钣',\r\n '阪',\r\n '魬',\r\n ],\r\n qǐn: ['坅', '寑', '寝', '寢', '昑', '梫', '笉', '螼', '赾', '鋟', '锓'],\r\n 'méi fén': ['坆'],\r\n 'rǒng kēng': ['坈'],\r\n 'fāng fáng': ['坊'],\r\n 'fèn bèn': ['坋'],\r\n tān: ['坍', '怹', '摊', '擹', '攤', '滩', '灘', '瘫', '癱', '舑', '貪', '贪'],\r\n 'huài pēi pī péi': ['坏'],\r\n 'dì làn': ['坔'],\r\n tán: [\r\n '坛',\r\n '墰',\r\n '墵',\r\n '壇',\r\n '壜',\r\n '婒',\r\n '憛',\r\n '昙',\r\n '曇',\r\n '榃',\r\n '檀',\r\n '潭',\r\n '燂',\r\n '痰',\r\n '磹',\r\n '罈',\r\n '罎',\r\n '藫',\r\n '談',\r\n '譚',\r\n '譠',\r\n '谈',\r\n '谭',\r\n '貚',\r\n '郯',\r\n '醰',\r\n '錟',\r\n '顃',\r\n ],\r\n bà: ['坝', '垻', '壩', '弝', '欛', '灞', '爸', '矲', '覇', '霸', '鮁', '鲅'],\r\n fén: [\r\n '坟',\r\n '墳',\r\n '妢',\r\n '岎',\r\n '幩',\r\n '枌',\r\n '棼',\r\n '汾',\r\n '焚',\r\n '燌',\r\n '燓',\r\n '羒',\r\n '羵',\r\n '蒶',\r\n '蕡',\r\n '蚠',\r\n '蚡',\r\n '豮',\r\n '豶',\r\n '轒',\r\n '鐼',\r\n '隫',\r\n '馩',\r\n '魵',\r\n '黂',\r\n '鼖',\r\n '鼢',\r\n '𣸣',\r\n ],\r\n zhuì: [\r\n '坠',\r\n '墜',\r\n '惴',\r\n '甀',\r\n '畷',\r\n '礈',\r\n '綴',\r\n '縋',\r\n '缀',\r\n '缒',\r\n '腏',\r\n '膇',\r\n '諈',\r\n '贅',\r\n '赘',\r\n '醊',\r\n '錣',\r\n '鑆',\r\n ],\r\n pō: ['坡', '岥', '泼', '溌', '潑', '釙', '鏺', '钋', '頗', '颇', '䥽'],\r\n 'pǎn bàn': ['坢'],\r\n kūn: [\r\n '坤',\r\n '堃',\r\n '堒',\r\n '崐',\r\n '崑',\r\n '昆',\r\n '晜',\r\n '潉',\r\n '焜',\r\n '熴',\r\n '猑',\r\n '琨',\r\n '瑻',\r\n '菎',\r\n '蜫',\r\n '裈',\r\n '裩',\r\n '褌',\r\n '醌',\r\n '錕',\r\n '锟',\r\n '騉',\r\n '髠',\r\n '髡',\r\n '髨',\r\n '鯤',\r\n '鲲',\r\n '鵾',\r\n '鶤',\r\n '鹍',\r\n ],\r\n diàn: [\r\n '坫',\r\n '垫',\r\n '墊',\r\n '壂',\r\n '奠',\r\n '婝',\r\n '店',\r\n '惦',\r\n '扂',\r\n '橂',\r\n '殿',\r\n '淀',\r\n '澱',\r\n '玷',\r\n '琔',\r\n '电',\r\n '癜',\r\n '簟',\r\n '蜔',\r\n '鈿',\r\n '電',\r\n '靛',\r\n '驔',\r\n ],\r\n 'mù mǔ': ['坶'],\r\n 'kē kě': ['坷', '軻'],\r\n xuè: ['坹', '岤', '桖', '瀥', '狘', '瞲', '謔', '谑', '趐'],\r\n 'dǐ chí': ['坻', '柢'],\r\n lā: ['垃', '柆', '菈', '邋'],\r\n lǒng: ['垄', '垅', '壟', '壠', '拢', '攏', '竉', '陇', '隴', '𬕂'],\r\n mín: [\r\n '垊',\r\n '姄',\r\n '岷',\r\n '崏',\r\n '捪',\r\n '旻',\r\n '旼',\r\n '民',\r\n '珉',\r\n '琘',\r\n '琝',\r\n '瑉',\r\n '痻',\r\n '盿',\r\n '砇',\r\n '緍',\r\n '緡',\r\n '缗',\r\n '罠',\r\n '苠',\r\n '鈱',\r\n '錉',\r\n '鍲',\r\n '鴖',\r\n ],\r\n 'dòng tóng': ['垌', '峒', '洞'],\r\n cí: [\r\n '垐',\r\n '嬨',\r\n '慈',\r\n '柌',\r\n '濨',\r\n '珁',\r\n '瓷',\r\n '甆',\r\n '磁',\r\n '礠',\r\n '祠',\r\n '糍',\r\n '茨',\r\n '詞',\r\n '词',\r\n '辝',\r\n '辞',\r\n '辤',\r\n '辭',\r\n '雌',\r\n '飺',\r\n '餈',\r\n '鴜',\r\n '鶿',\r\n '鷀',\r\n '鹚',\r\n ],\r\n duī: ['垖', '堆', '塠', '痽', '磓', '鐓', '鐜', '鴭'],\r\n 'duò duǒ': ['垛'],\r\n 'duǒ duò': ['垜', '挆'],\r\n chá: ['垞', '察', '嵖', '搽', '槎', '檫', '猹', '茬', '茶', '詧', '靫', '𥻗'],\r\n shǎng: ['垧', '晌', '樉', '賞', '贘', '赏', '鋿', '鏛', '鑜'],\r\n shǒu: ['垨', '守', '手', '扌', '艏', '首'],\r\n da: ['垯', '繨', '跶'],\r\n háng: [\r\n '垳',\r\n '斻',\r\n '杭',\r\n '筕',\r\n '絎',\r\n '绗',\r\n '航',\r\n '苀',\r\n '蚢',\r\n '裄',\r\n '貥',\r\n '迒',\r\n '頏',\r\n '颃',\r\n '魧',\r\n ],\r\n 'ān ǎn': ['垵'],\r\n xīng: [\r\n '垶',\r\n '惺',\r\n '星',\r\n '曐',\r\n '煋',\r\n '猩',\r\n '瑆',\r\n '皨',\r\n '篂',\r\n '腥',\r\n '興',\r\n '觪',\r\n '觲',\r\n '謃',\r\n '騂',\r\n '骍',\r\n '鮏',\r\n '鯹',\r\n ],\r\n 'yuàn huán': ['垸'],\r\n bāng: [\r\n '垹',\r\n '帮',\r\n '幇',\r\n '幚',\r\n '幫',\r\n '捠',\r\n '梆',\r\n '浜',\r\n '邦',\r\n '邫',\r\n '鞤',\r\n '𠳐',\r\n ],\r\n 'póu fú': ['垺'],\r\n cén: ['埁', '岑', '涔'],\r\n 'běng fēng': ['埄'],\r\n 'dì fáng': ['埅'],\r\n 'xiá jiā': ['埉'],\r\n 'mái mán': ['埋'],\r\n làng: ['埌', '崀', '浪', '蒗', '閬', '㫰'],\r\n 'shān yán': ['埏'],\r\n 'qín jīn': ['埐'],\r\n 'pǔ bù': ['埔'],\r\n huā: ['埖', '婲', '椛', '硴', '糀', '花', '蒊', '蘤', '誮', '錵'],\r\n 'suì sù': ['埣'],\r\n 'pí pì': ['埤'],\r\n 'qīng zhēng': ['埥', '鲭'],\r\n 'wǎn wān': ['埦'],\r\n lǔn: ['埨', '稐', '𫭢'],\r\n 'zhēng chéng': ['埩'],\r\n kōng: ['埪', '崆', '箜', '躻', '錓', '鵼'],\r\n 'cǎi cài': ['埰', '寀', '采'],\r\n 'chù tòu': ['埱'],\r\n běng: ['埲', '琫', '菶', '鞛'],\r\n 'kǎn xiàn': ['埳'],\r\n 'yì shì': ['埶', '醳'],\r\n péi: ['培', '毰', '裴', '裵', '賠', '赔', '錇', '锫', '阫', '陪'],\r\n 'sào sǎo': ['埽'],\r\n 'jǐn qīn jìn': ['堇'],\r\n 'péng bèng': ['堋'],\r\n 'qiàn zàn jiàn': ['堑'],\r\n àn: [\r\n '堓',\r\n '屵',\r\n '岸',\r\n '按',\r\n '暗',\r\n '案',\r\n '胺',\r\n '荌',\r\n '豻',\r\n '貋',\r\n '錌',\r\n '闇',\r\n '隌',\r\n '黯',\r\n ],\r\n 'duò huī': ['堕', '墮'],\r\n huán: [\r\n '堚',\r\n '寏',\r\n '寰',\r\n '峘',\r\n '桓',\r\n '洹',\r\n '澴',\r\n '獂',\r\n '环',\r\n '環',\r\n '糫',\r\n '繯',\r\n '缳',\r\n '羦',\r\n '荁',\r\n '萈',\r\n '萑',\r\n '豲',\r\n '鍰',\r\n '鐶',\r\n '锾',\r\n '镮',\r\n '闤',\r\n '阛',\r\n '雈',\r\n '鬟',\r\n '鹮',\r\n '𬘫',\r\n '𤩽',\r\n ],\r\n 'bǎo bǔ pù': ['堡'],\r\n 'máo móu wǔ': ['堥'],\r\n ruán: ['堧', '壖', '撋'],\r\n 'ài è yè': ['堨'],\r\n gèng: ['堩', '暅'],\r\n méi: [\r\n '堳',\r\n '塺',\r\n '媒',\r\n '嵋',\r\n '徾',\r\n '攗',\r\n '枚',\r\n '栂',\r\n '梅',\r\n '楣',\r\n '楳',\r\n '槑',\r\n '湄',\r\n '湈',\r\n '煤',\r\n '猸',\r\n '玫',\r\n '珻',\r\n '瑂',\r\n '眉',\r\n '睂',\r\n '禖',\r\n '脄',\r\n '脢',\r\n '腜',\r\n '苺',\r\n '莓',\r\n '葿',\r\n '郿',\r\n '酶',\r\n '鎇',\r\n '镅',\r\n '霉',\r\n '鶥',\r\n '鹛',\r\n '黴',\r\n ],\r\n dǔ: ['堵', '琽', '睹', '笃', '篤', '覩', '賭', '赌'],\r\n féng: ['堸', '綘', '艂', '逢'],\r\n hèng: ['堼'],\r\n chūn: [\r\n '堾',\r\n '媋',\r\n '旾',\r\n '春',\r\n '暙',\r\n '杶',\r\n '椿',\r\n '槆',\r\n '橁',\r\n '櫄',\r\n '瑃',\r\n '箺',\r\n '萅',\r\n '蝽',\r\n '輴',\r\n '鰆',\r\n '鶞',\r\n '䲠',\r\n ],\r\n jiǎng: [\r\n '塂',\r\n '奖',\r\n '奨',\r\n '奬',\r\n '桨',\r\n '槳',\r\n '獎',\r\n '耩',\r\n '膙',\r\n '蒋',\r\n '蔣',\r\n '講',\r\n '讲',\r\n '顜',\r\n ],\r\n huāng: ['塃', '巟', '慌', '肓', '荒', '衁'],\r\n duàn: [\r\n '塅',\r\n '断',\r\n '斷',\r\n '椴',\r\n '段',\r\n '毈',\r\n '煅',\r\n '瑖',\r\n '碫',\r\n '簖',\r\n '籪',\r\n '緞',\r\n '缎',\r\n '腶',\r\n '葮',\r\n '躖',\r\n '鍛',\r\n '锻',\r\n ],\r\n tǎ: ['塔', '墖', '獭', '獺', '鮙', '鰨', '鳎'],\r\n wěng: ['塕', '奣', '嵡', '攚', '暡', '瞈', '蓊'],\r\n 'sāi sài sè': ['塞'],\r\n zàng: ['塟', '弉', '臓', '臟', '葬', '蔵', '銺'],\r\n tián: [\r\n '塡',\r\n '屇',\r\n '恬',\r\n '沺',\r\n '湉',\r\n '璳',\r\n '甛',\r\n '甜',\r\n '田',\r\n '畋',\r\n '畑',\r\n '碵',\r\n '磌',\r\n '胋',\r\n '闐',\r\n '阗',\r\n '鴫',\r\n '鷆',\r\n '鷏',\r\n ],\r\n zhèng: [\r\n '塣',\r\n '幁',\r\n '政',\r\n '証',\r\n '諍',\r\n '證',\r\n '证',\r\n '诤',\r\n '郑',\r\n '鄭',\r\n '靕',\r\n '鴊',\r\n ],\r\n 'tián zhèn': ['填'],\r\n wēn: [\r\n '塭',\r\n '昷',\r\n '榲',\r\n '殟',\r\n '温',\r\n '溫',\r\n '瑥',\r\n '瘟',\r\n '蕰',\r\n '豱',\r\n '輼',\r\n '轀',\r\n '辒',\r\n '鎾',\r\n '饂',\r\n '鰛',\r\n '鰮',\r\n '鳁',\r\n ],\r\n liù: ['塯', '廇', '磟', '翏', '雡', '霤', '餾', '鬸', '鷚', '鹨'],\r\n hǎi: ['塰', '海', '烸', '酼', '醢'],\r\n lǎng: ['塱', '朖', '朗', '朤', '烺', '蓢', '㮾'],\r\n bèng: ['塴', '揼', '泵', '甏', '綳', '蹦', '迸', '逬', '鏰', '镚'],\r\n chén: [\r\n '塵',\r\n '宸',\r\n '尘',\r\n '忱',\r\n '敐',\r\n '敶',\r\n '晨',\r\n '曟',\r\n '栕',\r\n '樄',\r\n '沉',\r\n '煁',\r\n '瘎',\r\n '臣',\r\n '茞',\r\n '莀',\r\n '莐',\r\n '蔯',\r\n '薼',\r\n '螴',\r\n '訦',\r\n '諶',\r\n '軙',\r\n '辰',\r\n '迧',\r\n '鈂',\r\n '陈',\r\n '陳',\r\n '霃',\r\n '鷐',\r\n '麎',\r\n ],\r\n 'ōu qiū': ['塸'],\r\n 'qiàn jiàn': ['塹'],\r\n 'zhuān tuán': ['塼'],\r\n shuǎng: ['塽', '慡', '漺', '爽', '縔', '鏯'],\r\n shú: ['塾', '婌', '孰', '璹', '秫', '贖', '赎'],\r\n lǒu: ['塿', '嵝', '嶁', '甊', '篓', '簍'],\r\n chí: [\r\n '墀',\r\n '弛',\r\n '持',\r\n '池',\r\n '漦',\r\n '竾',\r\n '筂',\r\n '箎',\r\n '篪',\r\n '茌',\r\n '荎',\r\n '蚳',\r\n '謘',\r\n '貾',\r\n '赿',\r\n '踟',\r\n '迟',\r\n '迡',\r\n '遅',\r\n '遟',\r\n '遲',\r\n '鍉',\r\n '馳',\r\n '驰',\r\n ],\r\n shù: [\r\n '墅',\r\n '庶',\r\n '庻',\r\n '怷',\r\n '恕',\r\n '戍',\r\n '束',\r\n '树',\r\n '樹',\r\n '沭',\r\n '漱',\r\n '潄',\r\n '濖',\r\n '竖',\r\n '竪',\r\n '絉',\r\n '腧',\r\n '荗',\r\n '蒁',\r\n '虪',\r\n '術',\r\n '裋',\r\n '豎',\r\n '述',\r\n '鉥',\r\n '錰',\r\n '鏣',\r\n '霔',\r\n '鶐',\r\n '𬬸',\r\n ],\r\n 'dì zhì': ['墆', '疐'],\r\n kàn: ['墈', '崁', '瞰', '矙', '磡', '衎', '鬫'],\r\n chěn: ['墋', '夦', '硶', '碜', '磣', '贂', '趻', '踸', '鍖'],\r\n 'zhǐ zhuó': ['墌'],\r\n qiǎng: ['墏', '繈', '繦', '羥', '襁'],\r\n zēng: ['増', '增', '憎', '璔', '矰', '磳', '罾', '譄', '鄫', '鱛', '䎖'],\r\n qiáng: [\r\n '墙',\r\n '墻',\r\n '嫱',\r\n '嬙',\r\n '樯',\r\n '檣',\r\n '漒',\r\n '牆',\r\n '艢',\r\n '蔃',\r\n '蔷',\r\n '蘠',\r\n ],\r\n 'kuài tuí': ['墤'],\r\n 'tuǎn dǒng': ['墥'],\r\n 'qiáo què': ['墧'],\r\n 'zūn dūn': ['墫'],\r\n 'qiāo áo': ['墽'],\r\n 'yì tú': ['墿'],\r\n 'xué bó jué': ['壆'],\r\n lǎn: [\r\n '壈',\r\n '嬾',\r\n '孄',\r\n '孏',\r\n '懒',\r\n '懶',\r\n '揽',\r\n '擥',\r\n '攬',\r\n '榄',\r\n '欖',\r\n '浨',\r\n '漤',\r\n '灠',\r\n '纜',\r\n '缆',\r\n '罱',\r\n '覧',\r\n '覽',\r\n '览',\r\n '醂',\r\n '顲',\r\n ],\r\n huài: ['壊', '壞', '蘾'],\r\n rǎng: ['壌', '壤', '攘', '爙'],\r\n 'làn xiàn': ['壏'],\r\n dǎo: [\r\n '壔',\r\n '导',\r\n '導',\r\n '岛',\r\n '島',\r\n '嶋',\r\n '嶌',\r\n '嶹',\r\n '捣',\r\n '搗',\r\n '擣',\r\n '槝',\r\n '祷',\r\n '禂',\r\n '禱',\r\n '蹈',\r\n '陦',\r\n '隝',\r\n '隯',\r\n ],\r\n ruǐ: ['壡', '桵', '橤', '繠', '蕊', '蕋', '蘂', '蘃'],\r\n san: ['壭'],\r\n zhuàng: ['壮', '壯', '壵', '撞', '焋', '状', '狀'],\r\n 'ké qiào': ['壳', '殼'],\r\n kǔn: [\r\n '壸',\r\n '壼',\r\n '悃',\r\n '捆',\r\n '梱',\r\n '硱',\r\n '祵',\r\n '稇',\r\n '稛',\r\n '綑',\r\n '裍',\r\n '閫',\r\n '閸',\r\n '阃',\r\n ],\r\n mǎng: ['壾', '漭', '茻', '莽', '莾', '蠎'],\r\n cún: ['壿', '存'],\r\n 'zhǐ zhōng': ['夂'],\r\n 'gǔ yíng': ['夃'],\r\n 'jiàng xiáng': ['夅', '降'],\r\n 'páng féng fēng': ['夆'],\r\n zhāi: ['夈', '捚', '摘', '斋', '斎', '榸', '粂', '齋'],\r\n 'xuàn xiòng': ['夐'],\r\n wài: ['外', '顡'],\r\n 'wǎn yuàn wān yuān': ['夗'],\r\n 'mǎo wǎn': ['夘'],\r\n mèng: ['夢', '夣', '孟', '梦', '癦', '霥'],\r\n 'dà dài': ['大'],\r\n 'fū fú': ['夫', '姇', '枎', '粰'],\r\n guài: ['夬', '怪', '恠'],\r\n yāng: [\r\n '央',\r\n '姎',\r\n '抰',\r\n '殃',\r\n '泱',\r\n '秧',\r\n '胦',\r\n '鉠',\r\n '鍈',\r\n '雵',\r\n '鴦',\r\n '鸯',\r\n ],\r\n 'hāng bèn': ['夯'],\r\n gǎo: [\r\n '夰',\r\n '搞',\r\n '杲',\r\n '槀',\r\n '槁',\r\n '檺',\r\n '稁',\r\n '稾',\r\n '稿',\r\n '縞',\r\n '缟',\r\n '菒',\r\n '藁',\r\n '藳',\r\n ],\r\n 'tāo běn': ['夲'],\r\n 'tóu tou': ['头'],\r\n 'yǎn tāo': ['夵'],\r\n 'kuā kuà': ['夸', '誇'],\r\n 'jiá jiā gā xiá': ['夹'],\r\n huà: [\r\n '夻',\r\n '婳',\r\n '嫿',\r\n '嬅',\r\n '崋',\r\n '摦',\r\n '杹',\r\n '枠',\r\n '桦',\r\n '槬',\r\n '樺',\r\n '澅',\r\n '画',\r\n '畫',\r\n '畵',\r\n '繣',\r\n '舙',\r\n '話',\r\n '諙',\r\n '譮',\r\n '话',\r\n '黊',\r\n ],\r\n 'jiā jiá gā xiá': ['夾'],\r\n ēn: ['奀', '恩', '蒽'],\r\n 'dī tì': ['奃'],\r\n 'yǎn yān': ['奄', '渰'],\r\n pào: ['奅', '疱', '皰', '砲', '礟', '礮', '靤', '麭'],\r\n nài: ['奈', '柰', '渿', '耐', '萘', '褦', '錼', '鼐'],\r\n 'quān juàn': ['奍', '弮', '棬'],\r\n zòu: ['奏', '揍'],\r\n 'qì qiè xiè': ['契'],\r\n kāi: ['奒', '开', '揩', '鐦', '锎', '開'],\r\n 'bēn bèn': ['奔', '泍'],\r\n tào: ['套'],\r\n 'zàng zhuǎng': ['奘'],\r\n běn: ['奙', '本', '楍', '畚', '翉', '苯'],\r\n 'xùn zhuì': ['奞'],\r\n shē: ['奢', '檨', '猞', '畭', '畲', '賒', '賖', '赊', '輋', '𪨶'],\r\n 'hǎ pò tǎi': ['奤'],\r\n 'ào yù': ['奥', '奧', '澚'],\r\n yūn: ['奫', '氲', '氳', '蒀', '蒕', '蝹', '贇', '赟', '𫖳'],\r\n 'duǒ chě': ['奲'],\r\n 'nǚ rǔ': ['女'],\r\n nú: ['奴', '孥', '笯', '駑', '驽'],\r\n 'dīng dǐng tiǎn': ['奵'],\r\n 'tā jiě': ['她'],\r\n nuán: ['奻'],\r\n 'hǎo hào': ['好'],\r\n fàn: [\r\n '奿',\r\n '嬎',\r\n '梵',\r\n '汎',\r\n '泛',\r\n '滼',\r\n '瀪',\r\n '犯',\r\n '畈',\r\n '盕',\r\n '笵',\r\n '範',\r\n '范',\r\n '訉',\r\n '販',\r\n '贩',\r\n '軬',\r\n '輽',\r\n '飯',\r\n '飰',\r\n '饭',\r\n ],\r\n shuò: ['妁', '搠', '朔', '槊', '烁', '爍', '矟', '蒴', '鎙', '鑠', '铄'],\r\n 'fēi pèi': ['妃'],\r\n wàng: ['妄', '忘', '旺', '望', '朢'],\r\n zhuāng: [\r\n '妆',\r\n '妝',\r\n '娤',\r\n '庄',\r\n '庒',\r\n '桩',\r\n '梉',\r\n '樁',\r\n '粧',\r\n '糚',\r\n '荘',\r\n '莊',\r\n '装',\r\n '裝',\r\n ],\r\n mā: ['妈', '媽'],\r\n 'fū yōu': ['妋'],\r\n 'hài jiè': ['妎'],\r\n dù: [\r\n '妒',\r\n '妬',\r\n '杜',\r\n '殬',\r\n '渡',\r\n '秺',\r\n '芏',\r\n '荰',\r\n '螙',\r\n '蠧',\r\n '蠹',\r\n '鍍',\r\n '镀',\r\n '靯',\r\n '𬭊',\r\n ],\r\n miào: ['妙', '庙', '庿', '廟', '玅', '竗'],\r\n 'fǒu pēi pī': ['妚'],\r\n 'yuè jué': ['妜'],\r\n niū: ['妞'],\r\n 'nà nàn': ['妠'],\r\n tuǒ: ['妥', '嫷', '庹', '椭', '楕', '橢', '鬌', '鰖', '鵎'],\r\n 'wàn yuán': ['妧'],\r\n fáng: ['妨', '房', '肪', '防', '魴', '鲂'],\r\n nī: ['妮'],\r\n zhóu: ['妯', '碡'],\r\n zhāo: ['妱', '巶', '招', '昭', '釗', '鉊', '鍣', '钊', '駋', '𬬿'],\r\n 'nǎi nǐ': ['妳'],\r\n tǒu: ['妵', '敨', '紏', '蘣', '黈'],\r\n 'xián xuán xù': ['妶'],\r\n 'zhí yì': ['妷', '秇'],\r\n ē: ['妸', '妿', '婀', '屙'],\r\n mèi: [\r\n '妹',\r\n '媚',\r\n '寐',\r\n '抺',\r\n '旀',\r\n '昧',\r\n '沬',\r\n '煝',\r\n '痗',\r\n '眛',\r\n '睸',\r\n '祙',\r\n '篃',\r\n '蝞',\r\n '袂',\r\n '跊',\r\n '鬽',\r\n '魅',\r\n ],\r\n 'qī qì': ['妻'],\r\n 'xū xǔ': ['姁', '稰'],\r\n 'shān shàn': ['姍', '姗', '苫', '釤', '钐'],\r\n mán: ['姏', '慲', '樠', '蛮', '蠻', '謾', '饅', '馒', '鬗', '鬘', '鰻', '鳗'],\r\n jiě: ['姐', '媎', '檞', '毑', '飷'],\r\n 'wěi wēi': ['委'],\r\n pīn: ['姘', '拼', '礗', '穦', '馪', '驞'],\r\n 'huá huó': ['姡'],\r\n 'jiāo xiáo': ['姣'],\r\n 'gòu dù': ['姤'],\r\n 'lǎo mǔ': ['姥'],\r\n 'nián niàn': ['姩'],\r\n zhěn: [\r\n '姫',\r\n '屒',\r\n '弫',\r\n '抮',\r\n '昣',\r\n '枕',\r\n '畛',\r\n '疹',\r\n '眕',\r\n '稹',\r\n '縝',\r\n '縥',\r\n '缜',\r\n '聄',\r\n '萙',\r\n '袗',\r\n '裖',\r\n '覙',\r\n '診',\r\n '诊',\r\n '軫',\r\n '轸',\r\n '辴',\r\n '駗',\r\n '鬒',\r\n ],\r\n héng: [\r\n '姮',\r\n '恆',\r\n '恒',\r\n '烆',\r\n '珩',\r\n '胻',\r\n '蘅',\r\n '衡',\r\n '鑅',\r\n '鴴',\r\n '鵆',\r\n '鸻',\r\n ],\r\n 'jūn xún': ['姰'],\r\n 'kuā hù': ['姱'],\r\n 'è yà': ['姶'],\r\n 'xiān shēn': ['姺'],\r\n wá: ['娃'],\r\n 'ráo rǎo': ['娆', '嬈'],\r\n 'shào shāo': ['娋'],\r\n xiē: ['娎', '揳', '楔', '歇', '蝎', '蠍'],\r\n 'wǔ méi mǔ': ['娒'],\r\n 'chuò lài': ['娕'],\r\n niáng: ['娘', '嬢', '孃'],\r\n 'nà nuó': ['娜', '𦰡'],\r\n 'pōu bǐ': ['娝'],\r\n 'něi suī': ['娞'],\r\n tuì: ['娧', '煺', '蛻', '蜕', '退', '駾'],\r\n mǎn: ['娨', '屘', '満', '满', '滿', '螨', '蟎', '襔', '鏋'],\r\n 'wú wù yú': ['娪'],\r\n 'xī āi': ['娭'],\r\n 'zhuì shuì': ['娷'],\r\n 'dōng dòng': ['娻'],\r\n 'ǎi ái è': ['娾'],\r\n 'ē ě': ['娿'],\r\n mián: [\r\n '婂',\r\n '嬵',\r\n '宀',\r\n '杣',\r\n '棉',\r\n '檰',\r\n '櫋',\r\n '眠',\r\n '矈',\r\n '矊',\r\n '矏',\r\n '綿',\r\n '緜',\r\n '绵',\r\n '芇',\r\n '蝒',\r\n ],\r\n 'pǒu péi bù': ['婄'],\r\n biǎo: ['婊', '脿', '表', '裱', '褾', '諘', '錶'],\r\n 'fù fàn': ['婏'],\r\n wǒ: ['婐', '婑', '我'],\r\n 'ní nǐ': ['婗', '棿'],\r\n 'quán juàn': ['婘', '惓'],\r\n hūn: [\r\n '婚',\r\n '昏',\r\n '昬',\r\n '棔',\r\n '涽',\r\n '睧',\r\n '睯',\r\n '碈',\r\n '荤',\r\n '葷',\r\n '蔒',\r\n '轋',\r\n '閽',\r\n '阍',\r\n ],\r\n 'qiān jǐn': ['婜'],\r\n 'wān wà': ['婠'],\r\n 'lái lài': ['婡', '徕', '徠'],\r\n 'zhōu chōu': ['婤'],\r\n 'chuò nào': ['婥'],\r\n 'nüè àn': ['婩'],\r\n 'hùn kūn': ['婫'],\r\n 'dàng yáng': ['婸'],\r\n nàn: ['婻'],\r\n 'ruò chuò': ['婼'],\r\n jiǎ: ['婽', '岬', '斚', '斝', '榎', '槚', '檟', '玾', '甲', '胛', '鉀', '钾'],\r\n 'tōu yú': ['婾', '媮'],\r\n 'yù yú': ['媀'],\r\n 'wéi wěi': ['媁'],\r\n 'dì tí': ['媂', '珶', '苐'],\r\n róu: [\r\n '媃',\r\n '揉',\r\n '柔',\r\n '渘',\r\n '煣',\r\n '瑈',\r\n '瓇',\r\n '禸',\r\n '粈',\r\n '糅',\r\n '脜',\r\n '腬',\r\n '葇',\r\n '蝚',\r\n '蹂',\r\n '輮',\r\n '鍒',\r\n '鞣',\r\n '騥',\r\n '鰇',\r\n '鶔',\r\n '𫐓',\r\n ],\r\n 'ruǎn nèn': ['媆'],\r\n miáo: ['媌', '嫹', '描', '瞄', '苗', '鶓', '鹋'],\r\n 'yí pèi': ['媐'],\r\n 'mián miǎn': ['媔'],\r\n 'tí shì': ['媞', '惿'],\r\n 'duò tuó': ['媠', '沲'],\r\n ǎo: ['媪', '媼', '艹', '芺', '袄', '襖', '镺'],\r\n 'chú zòu': ['媰'],\r\n yìng: ['媵', '映', '暎', '硬', '膡', '鱦'],\r\n 'qín shēn': ['嫀'],\r\n jià: ['嫁', '幏', '架', '榢', '稼', '駕', '驾'],\r\n sǎo: ['嫂'],\r\n 'zhēn zhěn': ['嫃'],\r\n 'jiē suǒ': ['嫅'],\r\n 'míng mǐng': ['嫇'],\r\n niǎo: ['嫋', '嬝', '嬲', '茑', '蔦', '袅', '裊', '褭', '鸟'],\r\n tāo: [\r\n '嫍',\r\n '幍',\r\n '弢',\r\n '慆',\r\n '掏',\r\n '搯',\r\n '槄',\r\n '涛',\r\n '滔',\r\n '濤',\r\n '瑫',\r\n '絛',\r\n '縚',\r\n '縧',\r\n '绦',\r\n '詜',\r\n '謟',\r\n '轁',\r\n '鞱',\r\n '韜',\r\n '韬',\r\n '飸',\r\n '饕',\r\n ],\r\n biáo: ['嫑'],\r\n 'piáo piāo': ['嫖', '薸'],\r\n xuán: [\r\n '嫙',\r\n '悬',\r\n '懸',\r\n '暶',\r\n '檈',\r\n '漩',\r\n '玄',\r\n '璇',\r\n '璿',\r\n '痃',\r\n '蜁',\r\n '𫠊',\r\n ],\r\n 'màn mān': ['嫚'],\r\n kāng: [\r\n '嫝',\r\n '嵻',\r\n '康',\r\n '慷',\r\n '槺',\r\n '漮',\r\n '砊',\r\n '穅',\r\n '糠',\r\n '躿',\r\n '鏮',\r\n '鱇',\r\n '𡐓',\r\n '𩾌',\r\n ],\r\n 'hān nǎn': ['嫨'],\r\n nèn: ['嫩', '嫰'],\r\n zhē: ['嫬', '遮'],\r\n 'mā má': ['嫲'],\r\n piè: ['嫳'],\r\n zhǎn: [\r\n '嫸',\r\n '展',\r\n '搌',\r\n '斩',\r\n '斬',\r\n '琖',\r\n '盏',\r\n '盞',\r\n '輾',\r\n '醆',\r\n '颭',\r\n '飐',\r\n ],\r\n 'xiān yǎn jìn': ['嬐'],\r\n liǎn: [\r\n '嬚',\r\n '敛',\r\n '斂',\r\n '琏',\r\n '璉',\r\n '羷',\r\n '脸',\r\n '臉',\r\n '蔹',\r\n '蘝',\r\n '蘞',\r\n '裣',\r\n '襝',\r\n '鄻',\r\n ],\r\n 'qióng huán xuān': ['嬛'],\r\n dǒng: ['嬞', '懂', '箽', '董', '蕫', '諌'],\r\n cān: ['嬠', '湌', '爘', '飡', '餐', '驂', '骖'],\r\n tiǎo: ['嬥', '宨', '晀', '朓', '窱', '脁'],\r\n bí: ['嬶', '荸', '鼻'],\r\n liǔ: [\r\n '嬼',\r\n '柳',\r\n '栁',\r\n '桞',\r\n '桺',\r\n '橮',\r\n '熮',\r\n '珋',\r\n '綹',\r\n '绺',\r\n '罶',\r\n '羀',\r\n '鋶',\r\n '锍',\r\n ],\r\n 'qiān xiān': ['孅', '欦'],\r\n 'xié huī': ['孈'],\r\n 'huān quán': ['孉'],\r\n 'lí lì': ['孋', '麗'],\r\n 'zhú chuò': ['孎'],\r\n kǒng: ['孔', '恐'],\r\n 'mā zī': ['孖'],\r\n 'sūn xùn': ['孙', '孫'],\r\n 'bèi bó': ['孛', '誖'],\r\n 'yòu niū': ['孧'],\r\n zhuǎn: ['孨', '竱', '轉'],\r\n hái: ['孩', '骸'],\r\n nāo: ['孬'],\r\n 'chán càn': ['孱'],\r\n bò: ['孹', '檗', '蘗', '譒'],\r\n nái: ['孻', '腉'],\r\n 'níng nìng': ['宁', '寍', '寗', '寜', '寧', '甯'],\r\n zhái: ['宅'],\r\n 'tū jiā': ['宊'],\r\n sòng: ['宋', '訟', '誦', '讼', '诵', '送', '鎹', '頌', '颂', '餸'],\r\n ròu: ['宍', '肉', '譳'],\r\n zhūn: ['宒', '窀', '衠', '諄', '谆', '迍'],\r\n 'mì fú': ['宓'],\r\n 'dàng tàn': ['宕'],\r\n 'wǎn yuān': ['宛'],\r\n chǒng: ['宠', '寵'],\r\n qún: ['宭', '峮', '帬', '羣', '群', '裙', '裠'],\r\n zǎi: ['宰', '崽'],\r\n 'bǎo shí': ['宲'],\r\n 'jiā jia jie': ['家'],\r\n 'huāng huǎng': ['宺'],\r\n kuān: ['宽', '寛', '寬', '臗', '鑧', '髋', '髖'],\r\n 'sù xiǔ xiù': ['宿'],\r\n 'jié zǎn': ['寁'],\r\n 'bìng bǐng': ['寎'],\r\n 'jìn qǐn': ['寖'],\r\n 'lóu jù': ['寠'],\r\n 'xiě xiè': ['寫'],\r\n 'qīn qìn': ['寴'],\r\n cùn: ['寸', '籿'],\r\n duì: [\r\n '对',\r\n '対',\r\n '對',\r\n '怼',\r\n '憝',\r\n '懟',\r\n '濧',\r\n '瀩',\r\n '碓',\r\n '祋',\r\n '綐',\r\n '薱',\r\n '譈',\r\n '譵',\r\n '轛',\r\n '队',\r\n '陮',\r\n ],\r\n 'lüè luó': ['寽'],\r\n 'shè yè yì': ['射'],\r\n 'jiāng jiàng qiāng': ['将'],\r\n 'jiāng jiàng': ['將', '浆', '漿', '畺'],\r\n zūn: ['尊', '嶟', '樽', '罇', '遵', '鐏', '鱒', '鳟', '鶎', '鷷', '𨱔'],\r\n 'shù zhù': ['尌', '澍'],\r\n xiǎo: ['小', '晓', '暁', '曉', '皛', '皢', '筱', '筿', '篠', '謏', '𫍲'],\r\n 'jié jí': ['尐', '诘', '鞊'],\r\n 'shǎo shào': ['少'],\r\n ěr: [\r\n '尒',\r\n '尓',\r\n '尔',\r\n '栮',\r\n '毦',\r\n '洱',\r\n '爾',\r\n '珥',\r\n '耳',\r\n '薾',\r\n '衈',\r\n '趰',\r\n '迩',\r\n '邇',\r\n '鉺',\r\n '铒',\r\n '餌',\r\n '饵',\r\n '駬',\r\n ],\r\n 'wāng yóu': ['尢'],\r\n wāng: ['尣', '尩', '尪', '尫', '汪'],\r\n liào: ['尥', '尦', '廖', '撂', '料', '炓', '窷', '鐐', '镣', '𪤗'],\r\n 'méng máng lóng páng': ['尨'],\r\n gà: ['尬', '魀'],\r\n 'kuì kuǐ': ['尯'],\r\n tuí: ['尵', '弚', '穨', '蘈', '蹪', '隤', '頹', '頺', '頽', '颓', '魋', '𬯎'],\r\n yǐn: [\r\n '尹',\r\n '嶾',\r\n '引',\r\n '朄',\r\n '檃',\r\n '檼',\r\n '櫽',\r\n '淾',\r\n '濥',\r\n '瘾',\r\n '癮',\r\n '粌',\r\n '蘟',\r\n '蚓',\r\n '螾',\r\n '讔',\r\n '赺',\r\n '趛',\r\n '輑',\r\n '鈏',\r\n '靷',\r\n ],\r\n 'chǐ chě': ['尺'],\r\n kāo: ['尻', '髛'],\r\n 'jìn jǐn': ['尽'],\r\n 'wěi yǐ': ['尾'],\r\n 'niào suī': ['尿'],\r\n céng: ['层', '層', '嶒', '驓'],\r\n diǎo: ['屌'],\r\n 'píng bǐng bīng': ['屏'],\r\n lòu: ['屚', '漏', '瘘', '瘺', '瘻', '鏤', '镂', '陋'],\r\n 'shǔ zhǔ': ['属', '屬'],\r\n 'xiè tì': ['屟'],\r\n 'chè cǎo': ['屮'],\r\n 'tún zhūn': ['屯'],\r\n 'nì jǐ': ['屰'],\r\n 'hóng lóng': ['屸'],\r\n 'qǐ kǎi': ['岂', '豈'],\r\n áng: ['岇', '昂', '昻'],\r\n 'gǎng gāng': ['岗', '崗'],\r\n kě: ['岢', '敤', '渇', '渴', '炣'],\r\n gǒu: ['岣', '狗', '玽', '笱', '耇', '耈', '耉', '苟', '豿'],\r\n tiáo: [\r\n '岧',\r\n '岹',\r\n '樤',\r\n '祒',\r\n '笤',\r\n '芀',\r\n '萔',\r\n '蓚',\r\n '蓨',\r\n '蜩',\r\n '迢',\r\n '鋚',\r\n '鎥',\r\n '鞗',\r\n '髫',\r\n '鯈',\r\n '鰷',\r\n '鲦',\r\n '齠',\r\n '龆',\r\n ],\r\n 'qū jū': ['岨'],\r\n lǐng: ['岭', '嶺', '領', '领'],\r\n pò: ['岶', '敀', '洦', '湐', '烞', '珀', '破', '砶', '粕', '蒪', '魄'],\r\n 'bā kè': ['峇'],\r\n luò: [\r\n '峈',\r\n '摞',\r\n '洛',\r\n '洜',\r\n '犖',\r\n '珞',\r\n '笿',\r\n '纙',\r\n '荦',\r\n '詻',\r\n '雒',\r\n '駱',\r\n '骆',\r\n '鵅',\r\n ],\r\n 'fù niè': ['峊'],\r\n ěn: ['峎'],\r\n 'zhì shì': ['峙', '崻'],\r\n qiǎ: ['峠', '跒', '酠', '鞐'],\r\n 'qiáo jiào': ['峤', '癄'],\r\n 'xié yé': ['峫'],\r\n bū: ['峬', '庯', '晡', '誧', '逋', '鈽', '錻', '钸', '餔', '鵏'],\r\n chóng: ['崇', '崈', '爞', '虫', '蝩', '蟲', '褈', '隀'],\r\n 'zú cuì': ['崒', '椊'],\r\n 'líng léng': ['崚'],\r\n 'dòng dōng': ['崠'],\r\n xiáo: ['崤', '洨', '淆', '訤', '誵'],\r\n 'pí bǐ': ['崥', '芘'],\r\n 'zhǎn chán': ['崭', '嶃', '嶄'],\r\n 'wǎi wēi': ['崴'],\r\n 'yáng dàng': ['崵'],\r\n 'shì dié': ['崼'],\r\n yào: [\r\n '崾',\r\n '曜',\r\n '熎',\r\n '燿',\r\n '矅',\r\n '穾',\r\n '窔',\r\n '筄',\r\n '耀',\r\n '艞',\r\n '药',\r\n '葯',\r\n '薬',\r\n '藥',\r\n '袎',\r\n '覞',\r\n '詏',\r\n '讑',\r\n '靿',\r\n '鷂',\r\n '鹞',\r\n '鼼',\r\n ],\r\n 'kān zhàn': ['嵁'],\r\n 'hán dǎng': ['嵅'],\r\n 'qiàn kàn': ['嵌'],\r\n 'wù máo': ['嵍'],\r\n 'kě jié': ['嵑', '嶱'],\r\n 'wēi wěi': ['嵔'],\r\n kē: [\r\n '嵙',\r\n '柯',\r\n '棵',\r\n '榼',\r\n '樖',\r\n '牁',\r\n '牱',\r\n '犐',\r\n '珂',\r\n '疴',\r\n '瞌',\r\n '磕',\r\n '礚',\r\n '科',\r\n '稞',\r\n '窠',\r\n '萪',\r\n '薖',\r\n '蚵',\r\n '蝌',\r\n '趷',\r\n '轲',\r\n '醘',\r\n '鈳',\r\n '钶',\r\n '頦',\r\n '顆',\r\n '颗',\r\n '髁',\r\n ],\r\n 'dàng táng': ['嵣'],\r\n 'róng yíng': ['嵤', '爃'],\r\n 'ái kǎi': ['嵦'],\r\n 'kāo qiāo': ['嵪'],\r\n cuó: ['嵯', '嵳', '痤', '矬', '蒫', '蔖', '虘', '鹺', '鹾'],\r\n 'qiǎn qīn': ['嵰'],\r\n 'dì dié': ['嵽'],\r\n cēn: ['嵾'],\r\n dǐng: ['嵿', '艼', '薡', '鐤', '頂', '顶', '鼎', '鼑'],\r\n 'áo ào': ['嶅'],\r\n 'pǐ pèi': ['嶏'],\r\n 'jiào qiáo': ['嶠', '潐'],\r\n 'jué guì': ['嶡', '鳜'],\r\n 'zhān shàn': ['嶦', '鳣'],\r\n 'xiè jiè': ['嶰'],\r\n 'guī xī juàn': ['嶲'],\r\n rū: ['嶿'],\r\n 'lì liè': ['巁', '棙', '爄', '綟'],\r\n 'xī guī juàn': ['巂'],\r\n 'yíng hōng': ['巆'],\r\n yǐng: [\r\n '巊',\r\n '廮',\r\n '影',\r\n '摬',\r\n '梬',\r\n '潁',\r\n '瘿',\r\n '癭',\r\n '矨',\r\n '穎',\r\n '郢',\r\n '鐛',\r\n '頴',\r\n '颍',\r\n '颕',\r\n '颖',\r\n ],\r\n chǎo: ['巐', '炒', '煼', '眧', '麨'],\r\n cuán: ['巑', '櫕', '欑'],\r\n chuān: ['巛', '川', '氚', '瑏', '穿'],\r\n 'jīng xíng': ['巠'],\r\n cháo: [\r\n '巢',\r\n '巣',\r\n '晁',\r\n '漅',\r\n '潮',\r\n '牊',\r\n '窲',\r\n '罺',\r\n '謿',\r\n '轈',\r\n '鄛',\r\n '鼌',\r\n ],\r\n qiǎo: ['巧', '愀', '髜'],\r\n gǒng: ['巩', '廾', '拱', '拲', '栱', '汞', '珙', '輁', '鞏'],\r\n 'chà chā chāi cī': ['差'],\r\n 'xiàng hàng': ['巷'],\r\n shuài: ['帅', '帥', '蟀'],\r\n pà: ['帊', '帕', '怕', '袙'],\r\n 'tǎng nú': ['帑'],\r\n 'mò wà': ['帓'],\r\n 'tiē tiě tiè': ['帖'],\r\n zhǒu: ['帚', '晭', '疛', '睭', '箒', '肘', '菷', '鯞'],\r\n 'juǎn juàn': ['帣'],\r\n shuì: ['帨', '涗', '涚', '睡', '稅', '税', '裞'],\r\n 'chóu dào': ['帱', '幬'],\r\n 'jiǎn jiān sàn': ['帴'],\r\n 'shà qiè': ['帹'],\r\n 'qí jì': ['帺', '荠'],\r\n 'shān qiāo shēn': ['幓'],\r\n 'zhuàng chuáng': ['幢'],\r\n 'chān chàn': ['幨'],\r\n miè: [\r\n '幭',\r\n '懱',\r\n '搣',\r\n '滅',\r\n '灭',\r\n '烕',\r\n '礣',\r\n '篾',\r\n '蔑',\r\n '薎',\r\n '蠛',\r\n '衊',\r\n '鑖',\r\n '鱴',\r\n '鴓',\r\n ],\r\n 'gān gàn': ['干'],\r\n 'bìng bīng': ['并', '幷'],\r\n 'jī jǐ': ['幾'],\r\n 'guǎng ān': ['广'],\r\n guǎng: ['広', '廣', '犷', '獷'],\r\n me: ['庅'],\r\n 'dùn tún': ['庉'],\r\n 'bài tīng': ['庍'],\r\n 'yìng yīng': ['应'],\r\n 'dǐ de': ['底'],\r\n 'dù duó': ['度'],\r\n 'máng méng páng': ['庬'],\r\n 'bìng píng': ['庰'],\r\n chěng: ['庱', '悜', '睈', '逞', '騁', '骋'],\r\n 'jī cuò': ['庴'],\r\n qǐng: ['庼', '廎', '檾', '漀', '苘', '請', '謦', '请', '頃', '顷'],\r\n 'guī wěi huì': ['廆'],\r\n 'jǐn qín': ['廑'],\r\n kuò: [\r\n '廓',\r\n '扩',\r\n '拡',\r\n '擴',\r\n '濶',\r\n '筈',\r\n '萿',\r\n '葀',\r\n '蛞',\r\n '闊',\r\n '阔',\r\n '霩',\r\n '鞟',\r\n '鞹',\r\n '韕',\r\n '頢',\r\n '鬠',\r\n ],\r\n 'qiáng sè': ['廧', '薔'],\r\n 'yǐn yìn': ['廴', '隐', '隠', '隱', '飮', '飲', '饮'],\r\n 'pò pǎi': ['廹', '迫'],\r\n 'nòng lòng': ['弄'],\r\n 'dì tì tuí': ['弟'],\r\n 'jué zhāng': ['弡'],\r\n 'mí mǐ': ['弥', '彌', '靡'],\r\n chāo: ['弨', '怊', '抄', '欩', '訬', '超', '鈔', '钞'],\r\n yi: ['弬'],\r\n shāo: [\r\n '弰',\r\n '旓',\r\n '烧',\r\n '焼',\r\n '燒',\r\n '筲',\r\n '艄',\r\n '萷',\r\n '蕱',\r\n '輎',\r\n '髾',\r\n '鮹',\r\n ],\r\n 'xuān yuān': ['弲'],\r\n 'qiáng qiǎng jiàng': ['強', '强'],\r\n 'tán dàn': ['弹', '醈'],\r\n biè: ['彆'],\r\n 'qiáng jiàng qiǎng': ['彊'],\r\n 'jì xuě': ['彐'],\r\n tuàn: ['彖', '褖'],\r\n yuē: ['彟', '曰', '曱', '矱'],\r\n 'shān xiǎn': ['彡'],\r\n wén: [\r\n '彣',\r\n '文',\r\n '炆',\r\n '珳',\r\n '瘒',\r\n '繧',\r\n '聞',\r\n '芠',\r\n '蚉',\r\n '蚊',\r\n '螡',\r\n '蟁',\r\n '閺',\r\n '閿',\r\n '闅',\r\n '闦',\r\n '闻',\r\n '阌',\r\n '雯',\r\n '馼',\r\n '駇',\r\n '魰',\r\n '鳼',\r\n '鴍',\r\n '鼤',\r\n '𫘜',\r\n ],\r\n 'péng bāng': ['彭'],\r\n 'piāo piào': ['彯'],\r\n 'zhuó bó': ['彴'],\r\n 'tuǒ yí': ['彵'],\r\n 'páng fǎng': ['彷'],\r\n wǎng: [\r\n '彺',\r\n '往',\r\n '徃',\r\n '惘',\r\n '枉',\r\n '棢',\r\n '網',\r\n '网',\r\n '罒',\r\n '罓',\r\n '罔',\r\n '罖',\r\n '菵',\r\n '蛧',\r\n '蝄',\r\n '誷',\r\n '輞',\r\n '辋',\r\n '魍',\r\n ],\r\n cú: ['徂', '殂'],\r\n 'dài dāi': ['待'],\r\n huái: ['徊', '怀', '懐', '懷', '槐', '淮', '耲', '蘹', '褢', '褱', '踝'],\r\n 'wā wàng jiā': ['徍'],\r\n 'chěng zhèng': ['徎'],\r\n 'dé děi de': ['得'],\r\n 'cóng zòng': ['從'],\r\n 'shì tǐ': ['徥'],\r\n 'tí chí': ['徲', '鶗', '鶙'],\r\n dé: ['徳', '德', '恴', '悳', '惪', '淂', '鍀', '锝'],\r\n 'zhǐ zhēng': ['徴', '徵'],\r\n bié: ['徶', '癿', '莂', '蛂', '襒', '蹩'],\r\n 'chōng zhǒng': ['徸'],\r\n 'jiǎo jiào': ['徼', '笅', '筊'],\r\n 'lòng lǒng': ['徿'],\r\n 'qú jù': ['忂', '渠', '瞿', '螶'],\r\n 'dìng tìng': ['忊'],\r\n gǎi: ['忋', '改'],\r\n rěn: ['忍', '栠', '栣', '秹', '稔', '綛', '荏', '荵', '躵'],\r\n chàn: ['忏', '懴', '懺', '硟', '羼', '韂', '顫'],\r\n tè: ['忑', '慝', '特', '蟘', '鋱', '铽'],\r\n 'tè tēi tuī': ['忒'],\r\n 'gān hàn': ['忓', '攼'],\r\n 'yì qì': ['忔'],\r\n 'tài shì': ['忕'],\r\n 'xī liě': ['忚'],\r\n 'yīng yìng': ['応', '應', '譍'],\r\n 'mǐn wěn mín': ['忞', '忟'],\r\n 'sōng zhōng': ['忪'],\r\n 'yù shū': ['忬', '悆'],\r\n 'qí shì': ['忯', '耆'],\r\n 'tún zhūn dùn': ['忳'],\r\n 'qián qín': ['忴', '扲'],\r\n hún: ['忶', '浑', '渾', '餛', '馄', '魂', '鼲'],\r\n niǔ: ['忸', '扭', '炄', '狃', '紐', '纽', '莥', '鈕', '钮', '靵'],\r\n 'kuáng wǎng': ['忹'],\r\n 'kāng hàng': ['忼'],\r\n 'kài xì': ['忾', '愾'],\r\n òu: ['怄', '慪'],\r\n 'bǎo bào': ['怉'],\r\n 'mín mén': ['怋'],\r\n 'zuò zhà': ['怍'],\r\n zěn: ['怎'],\r\n yàng: ['怏', '恙', '样', '様', '樣', '漾', '羕', '詇'],\r\n 'kòu jù': ['怐'],\r\n 'náo niú': ['怓'],\r\n 'zhēng zhèng': ['怔', '掙', '钲', '铮'],\r\n 'tiē zhān': ['怗'],\r\n 'hù gù': ['怘'],\r\n 'cū jù zū': ['怚'],\r\n 'sī sāi': ['思'],\r\n 'yóu chóu': ['怞'],\r\n 'tū dié': ['怢'],\r\n 'yōu yào': ['怮'],\r\n xuàn: [\r\n '怰',\r\n '昡',\r\n '楦',\r\n '泫',\r\n '渲',\r\n '炫',\r\n '琄',\r\n '眩',\r\n '碹',\r\n '絢',\r\n '縼',\r\n '繏',\r\n '绚',\r\n '蔙',\r\n '衒',\r\n '袨',\r\n '贙',\r\n '鉉',\r\n '鏇',\r\n '铉',\r\n '镟',\r\n '颴',\r\n ],\r\n 'xù xuè': ['怴'],\r\n 'bì pī': ['怶'],\r\n 'xī shù': ['怸'],\r\n 'nèn nín': ['恁'],\r\n 'tiāo yáo': ['恌'],\r\n 'xī qī xù': ['恓'],\r\n 'xiào jiǎo': ['恔'],\r\n 'hū kuā': ['恗'],\r\n nǜ: ['恧', '朒', '衂', '衄'],\r\n hèn: ['恨'],\r\n 'dòng tōng': ['恫'],\r\n 'quán zhuān': ['恮'],\r\n 'è wù ě wū': ['恶', '惡'],\r\n tòng: ['恸', '慟', '憅', '痛', '衕'],\r\n 'yuān juàn': ['悁'],\r\n 'qiāo qiǎo': ['悄'],\r\n 'jiè kè': ['悈'],\r\n 'hào jiào': ['悎'],\r\n huǐ: ['悔', '檓', '毀', '毁', '毇', '燬', '譭'],\r\n 'mán mèn': ['悗', '鞔'],\r\n 'yī yì': ['悘', '衣'],\r\n quān: ['悛', '箞', '鐉', '𨟠'],\r\n 'kuī lǐ': ['悝'],\r\n 'yì niàn': ['悥'],\r\n 'mèn mēn': ['悶'],\r\n guàn: [\r\n '悹',\r\n '悺',\r\n '惯',\r\n '慣',\r\n '掼',\r\n '摜',\r\n '樌',\r\n '欟',\r\n '泴',\r\n '涫',\r\n '潅',\r\n '灌',\r\n '爟',\r\n '瓘',\r\n '盥',\r\n '礶',\r\n '祼',\r\n '罆',\r\n '罐',\r\n '貫',\r\n '贯',\r\n '躀',\r\n '遦',\r\n '鏆',\r\n '鑵',\r\n '鱹',\r\n '鸛',\r\n '鹳',\r\n ],\r\n 'kōng kǒng': ['悾'],\r\n 'lǔn lùn': ['惀'],\r\n guǒ: [\r\n '惈',\r\n '果',\r\n '椁',\r\n '槨',\r\n '粿',\r\n '綶',\r\n '菓',\r\n '蜾',\r\n '裹',\r\n '褁',\r\n '輠',\r\n '餜',\r\n '馃',\r\n ],\r\n 'yuān wǎn': ['惌', '箢'],\r\n 'lán lín': ['惏'],\r\n 'yù xù': ['惐', '淢'],\r\n 'chuò chuì': ['惙'],\r\n 'hūn mèn': ['惛'],\r\n 'chǎng tǎng': ['惝'],\r\n 'suǒ ruǐ': ['惢'],\r\n cǎn: ['惨', '慘', '憯', '黪', '黲', '䅟'],\r\n cán: ['惭', '慙', '慚', '残', '殘', '蚕', '蝅', '蠶', '蠺'],\r\n 'dàn dá': ['惮', '憚'],\r\n rě: ['惹'],\r\n 'yú tōu': ['愉'],\r\n 'kài qì': ['愒'],\r\n 'dàng táng shāng yáng': ['愓'],\r\n 'chén xìn dān': ['愖'],\r\n 'kè qià': ['愘'],\r\n nuò: [\r\n '愞',\r\n '懦',\r\n '懧',\r\n '掿',\r\n '搦',\r\n '榒',\r\n '稬',\r\n '穤',\r\n '糑',\r\n '糥',\r\n '糯',\r\n '諾',\r\n '诺',\r\n '蹃',\r\n '逽',\r\n '鍩',\r\n '锘',\r\n ],\r\n gǎn: [\r\n '感',\r\n '擀',\r\n '敢',\r\n '桿',\r\n '橄',\r\n '澉',\r\n '澸',\r\n '皯',\r\n '秆',\r\n '稈',\r\n '笴',\r\n '芉',\r\n '衦',\r\n '赶',\r\n '趕',\r\n '鱤',\r\n '鳡',\r\n ],\r\n 'còng sōng': ['愡'],\r\n 'sāi sī sǐ': ['愢'],\r\n 'gōng gòng hǒng': ['愩', '慐'],\r\n 'shuò sù': ['愬', '洬'],\r\n 'yáo yào': ['愮'],\r\n huàng: ['愰', '曂', '榥', '滉', '皝', '皩', '鎤', '㿠'],\r\n zhěng: ['愸', '抍', '拯', '整', '晸'],\r\n cǎo: ['愺', '艸', '草', '騲'],\r\n 'xì xié': ['慀'],\r\n 'cǎo sāo': ['慅'],\r\n 'xù chù': ['慉'],\r\n 'qiè qiàn': ['慊'],\r\n 'cáo cóng': ['慒'],\r\n 'ào áo': ['慠'],\r\n 'lián liǎn': ['慩', '梿', '槤', '櫣'],\r\n 'jìn qín jǐn': ['慬'],\r\n 'dì chì': ['慸'],\r\n 'zhí zhé': ['慹'],\r\n 'lóu lǚ': ['慺', '鷜'],\r\n còng: ['憁', '謥'],\r\n 'zhī zhì': ['憄', '知', '織', '织'],\r\n chēng: [\r\n '憆',\r\n '摚',\r\n '撐',\r\n '撑',\r\n '晿',\r\n '柽',\r\n '棦',\r\n '橕',\r\n '檉',\r\n '泟',\r\n '浾',\r\n '琤',\r\n '瞠',\r\n '碀',\r\n '緽',\r\n '罉',\r\n '蛏',\r\n '蟶',\r\n '赪',\r\n '赬',\r\n '鏿',\r\n '鐣',\r\n '阷',\r\n '靗',\r\n '頳',\r\n '饓',\r\n ],\r\n biē: ['憋', '虌', '鱉', '鳖', '鼈', '龞'],\r\n 'chéng dèng zhèng': ['憕'],\r\n 'xǐ xī': ['憘'],\r\n 'duì dùn tūn': ['憞'],\r\n 'xiāo jiāo': ['憢'],\r\n 'xián xiàn': ['憪'],\r\n 'liáo liǎo': ['憭', '燎', '爎', '爒'],\r\n shéng: ['憴', '縄', '繉', '繩', '绳', '譝'],\r\n 'náo nǎo náng': ['憹'],\r\n 'jǐng jìng': ['憼'],\r\n 'jǐ jiǎo': ['憿'],\r\n 'xuān huān': ['懁'],\r\n 'cǎo sāo sào': ['懆'],\r\n mèn: ['懑', '懣', '暪', '焖', '燜'],\r\n 'mèng méng měng': ['懜'],\r\n 'ài yì nǐ': ['懝'],\r\n 'méng měng': ['懞', '瞢', '矒'],\r\n 'qí jī jì': ['懠'],\r\n mǒ: ['懡'],\r\n 'lán xiàn': ['懢'],\r\n 'yōu yǒu': ['懮'],\r\n 'liú liǔ': ['懰', '藰'],\r\n ràng: ['懹', '譲', '讓', '让'],\r\n huān: ['懽', '欢', '歓', '歡', '獾', '讙', '貛', '酄', '驩', '鴅', '鵍'],\r\n nǎn: ['戁', '揇', '湳', '煵', '腩', '蝻', '赧'],\r\n 'mí mó': ['戂'],\r\n 'gàng zhuàng': ['戅', '戆'],\r\n 'zhuàng gàng': ['戇'],\r\n 'xū qu': ['戌'],\r\n 'xì hū': ['戏', '戯', '戲'],\r\n 'jiá gā': ['戛'],\r\n zéi: ['戝', '蠈', '賊', '贼', '鰂', '鱡', '鲗'],\r\n děng: ['戥', '等'],\r\n 'hū xì': ['戱'],\r\n chuō: ['戳', '踔', '逴'],\r\n 'biǎn piān': ['扁'],\r\n 'shǎng jiōng': ['扄'],\r\n 'shàn shān': ['扇'],\r\n cái: ['才', '材', '纔', '裁', '財', '财'],\r\n 'zhā zā zhá': ['扎'],\r\n 'lè lì cái': ['扐'],\r\n 'bā pá': ['扒'],\r\n 'dǎ dá': ['打'],\r\n rēng: ['扔'],\r\n 'fǎn fú': ['払'],\r\n 'diǎo dí yuē lì': ['扚'],\r\n 'káng gāng': ['扛'],\r\n 'yū wū': ['扜'],\r\n 'yū wū kū': ['扝'],\r\n 'tuō chǐ yǐ': ['扡'],\r\n 'gǔ jié xì gē': ['扢'],\r\n dèn: ['扥', '扽'],\r\n 'sǎo sào': ['扫', '掃'],\r\n rǎo: ['扰', '擾', '隢'],\r\n 'xī chā qì': ['扱'],\r\n 'bān pān': ['扳'],\r\n 'bā ào': ['扷'],\r\n 'xī zhé': ['扸'],\r\n 'zhì sǔn kǎn': ['扻'],\r\n zhǎo: ['找', '沼', '瑵'],\r\n 'kuáng wǎng zài': ['抂'],\r\n 'hú gǔ': ['抇', '鹄', '鹘'],\r\n 'bǎ bà': ['把'],\r\n 'dǎn shěn': ['抌'],\r\n 'nè nì ruì nà': ['抐'],\r\n zhuā: ['抓', '檛', '簻', '膼', '髽'],\r\n póu: ['抔', '裒'],\r\n 'zhé shé zhē': ['折'],\r\n 'póu pōu fū': ['抙', '捊'],\r\n pāo: ['抛', '拋', '脬', '萢'],\r\n 'ǎo ào niù': ['抝'],\r\n 'lūn lún': ['抡', '掄'],\r\n 'qiǎng qiāng chēng': ['抢'],\r\n 'zhǐ zhǎi': ['抧'],\r\n 'bù pū': ['抪', '柨'],\r\n 'yǎo tāo': ['抭'],\r\n 'hē hè qiā': ['抲'],\r\n 'nǐ ní': ['抳'],\r\n 'pī pēi': ['抷'],\r\n 'mǒ mò mā': ['抹'],\r\n chōu: ['抽', '犨', '犫', '瘳', '篘'],\r\n 'jiā yá': ['拁'],\r\n 'fú bì': ['拂', '畐', '鶝'],\r\n zhǎ: ['拃', '眨', '砟', '鮺', '鲝'],\r\n 'dān dàn dǎn': ['担'],\r\n 'chāi cā': ['拆'],\r\n niān: ['拈', '蔫'],\r\n 'lā lá lǎ là': ['拉'],\r\n 'bàn pàn': ['拌'],\r\n pāi: ['拍'],\r\n līn: ['拎'],\r\n guǎi: ['拐', '枴', '柺'],\r\n 'tuò tà zhí': ['拓'],\r\n 'ào ǎo niù': ['拗'],\r\n 'jū gōu': ['拘'],\r\n 'pīn pàn fān': ['拚'],\r\n 'bài bái': ['拜'],\r\n bài: ['拝', '敗', '稗', '粺', '薭', '贁', '败', '韛'],\r\n qiá: ['拤'],\r\n 'nǐng níng nìng': ['拧'],\r\n 'zé zhái': ['择', '擇'],\r\n hén: ['拫', '痕', '鞎'],\r\n 'kuò guā': ['括'],\r\n 'jié jiá': ['拮'],\r\n nǐn: ['拰'],\r\n shuān: ['拴', '栓', '閂', '闩'],\r\n 'cún zùn': ['拵'],\r\n 'zā zǎn': ['拶', '桚'],\r\n kǎo: ['拷', '攷', '栲', '烤', '考'],\r\n 'yí chǐ hài': ['拸'],\r\n 'cè sè chuò': ['拺'],\r\n 'zhuài zhuāi yè': ['拽'],\r\n 'shí shè': ['拾'],\r\n bāi: ['挀', '掰'],\r\n 'kuò guāng': ['挄'],\r\n nòng: ['挊', '挵', '齈'],\r\n 'jiào jiāo': ['挍', '敎', '教'],\r\n 'kuà kū': ['挎'],\r\n 'ná rú': ['挐'],\r\n 'tiāo tiǎo': ['挑'],\r\n 'dié shè': ['挕'],\r\n liě: ['挘', '毟'],\r\n 'yà yǎ': ['挜', '掗'],\r\n 'wō zhuā': ['挝'],\r\n 'xié jiā': ['挟', '挾'],\r\n 'dǎng dàng': ['挡', '擋'],\r\n 'zhèng zhēng': ['挣', '正', '症'],\r\n 'āi ái': ['挨'],\r\n 'tuō shuì': ['挩', '捝'],\r\n 'tǐ tì': ['挮'],\r\n 'suō shā': ['挱'],\r\n 'sā shā suō': ['挲'],\r\n 'kēng qiān': ['挳', '摼'],\r\n 'bàng péng': ['挷'],\r\n 'ruó ruá': ['挼'],\r\n 'jiǎo kù': ['捁'],\r\n 'wǔ wú': ['捂'],\r\n tǒng: ['捅', '桶', '筒', '筩', '統', '綂', '统', '㛚'],\r\n 'huò chì': ['捇'],\r\n 'tú shū chá': ['捈'],\r\n 'lǚ luō': ['捋'],\r\n 'shāo shào': ['捎', '稍'],\r\n niē: ['捏', '揑'],\r\n 'shù sǒng sōu': ['捒'],\r\n 'yé yú': ['捓'],\r\n 'jué zhuó': ['捔'],\r\n 'bù pú zhì': ['捗'],\r\n zùn: ['捘', '銌'],\r\n lāo: ['捞', '撈', '粩'],\r\n sǔn: ['损', '損', '榫', '笋', '筍', '箰', '鎨', '隼'],\r\n 'wàn wǎn wān yù': ['捥'],\r\n pěng: ['捧', '淎', '皏'],\r\n shě: ['捨'],\r\n 'fǔ fù bǔ': ['捬'],\r\n dáo: ['捯'],\r\n 'luò luǒ wǒ': ['捰'],\r\n 'juǎn quán': ['捲'],\r\n 'chēn tiǎn': ['捵'],\r\n 'niǎn niē': ['捻'],\r\n 'ruó wěi ré': ['捼'],\r\n zuó: ['捽', '昨', '秨', '稓', '筰', '莋', '鈼'],\r\n 'wò xiá': ['捾'],\r\n 'qìng qiàn': ['掅'],\r\n 'póu pǒu': ['掊'],\r\n qiā: ['掐', '葜'],\r\n 'pái pǎi': ['排'],\r\n 'qiān wàn': ['掔'],\r\n 'yè yē': ['掖'],\r\n 'niè nǐ yì': ['掜'],\r\n 'huò xù': ['掝'],\r\n 'yàn shàn yǎn': ['掞'],\r\n 'zhěng dìng': ['掟'],\r\n kòng: ['控', '鞚'],\r\n tuī: ['推', '蓷', '藬'],\r\n 'zōu zhōu chōu': ['掫'],\r\n tiàn: ['掭', '舚'],\r\n kèn: ['掯', '裉', '褃'],\r\n pá: ['掱', '杷', '潖', '爬', '琶', '筢'],\r\n 'guó guāi': ['掴'],\r\n 'dǎn shàn': ['掸', '撣'],\r\n 'chān xiān càn shǎn': ['掺'],\r\n sāo: ['掻', '搔', '溞', '繅', '缫', '螦', '騒', '騷', '鰠', '鱢', '鳋'],\r\n pèng: ['掽', '椪', '槰', '碰', '踫'],\r\n 'zhēng kēng': ['揁'],\r\n 'jiū yóu': ['揂'],\r\n 'jiān jiǎn': ['揃', '籛'],\r\n 'pì chè': ['揊'],\r\n 'sāi zǒng cāi': ['揌'],\r\n 'tí dī dǐ': ['提'],\r\n 'zǒng sōng': ['揔'],\r\n 'huáng yóng': ['揘'],\r\n 'zǎn zuàn': ['揝'],\r\n 'xū jū': ['揟'],\r\n 'ké qiā': ['揢'],\r\n 'chuāi chuǎi chuài tuán zhuī': ['揣'],\r\n 'dì tì': ['揥'],\r\n 'lá là': ['揦'],\r\n là: [\r\n '揧',\r\n '楋',\r\n '溂',\r\n '瓎',\r\n '瘌',\r\n '翋',\r\n '臘',\r\n '蝋',\r\n '蝲',\r\n '蠟',\r\n '辢',\r\n '辣',\r\n '鑞',\r\n '镴',\r\n '鬎',\r\n '鯻',\r\n '𬶟',\r\n ],\r\n 'jiē qì': ['揭'],\r\n 'chòng dǒng': ['揰'],\r\n 'dié shé yè': ['揲'],\r\n 'jiàn qián jiǎn': ['揵'],\r\n yé: ['揶', '爷', '爺', '瑘', '鋣', '鎁', '铘'],\r\n chān: ['搀', '摻', '攙', '裧', '襜', '覘', '觇', '辿', '鋓'],\r\n 'gē gé': ['搁', '擱'],\r\n 'lǒu lōu': ['搂', '摟'],\r\n 'chōu zǒu': ['搊'],\r\n chuāi: ['搋'],\r\n sūn: ['搎', '槂', '狲', '猻', '荪', '蓀', '蕵', '薞', '飧', '飱'],\r\n 'róng náng nǎng': ['搑'],\r\n 'péng bàng': ['搒'],\r\n cuō: ['搓', '瑳', '磋', '蹉', '遳', '醝'],\r\n 'kē è': ['搕'],\r\n 'nù nuò nòu': ['搙'],\r\n 'lā xié xiàn': ['搚'],\r\n qiǔ: ['搝', '糗'],\r\n 'xiǎn xiān': ['搟'],\r\n 'jié zhé': ['搩'],\r\n 'pán bān pó': ['搫'],\r\n bān: [\r\n '搬',\r\n '攽',\r\n '斑',\r\n '斒',\r\n '班',\r\n '瘢',\r\n '癍',\r\n '肦',\r\n '螁',\r\n '螌',\r\n '褩',\r\n '辬',\r\n '頒',\r\n '颁',\r\n '𨭉',\r\n ],\r\n 'zhì nái': ['搱'],\r\n 'wā wǎ wà': ['搲'],\r\n huá: ['搳', '撶', '滑', '猾', '蕐', '螖', '譁', '鏵', '铧', '驊', '骅', '鷨'],\r\n 'qiāng qiǎng chēng': ['搶'],\r\n 'tián shēn': ['搷'],\r\n 'ná nuò': ['搻'],\r\n èn: ['摁'],\r\n 'shè niè': ['摄', '攝'],\r\n bìn: ['摈', '擯', '殡', '殯', '膑', '臏', '髌', '髕', '髩', '鬂', '鬓', '鬢'],\r\n 'shā sà shǎi': ['摋'],\r\n 'chǎn sùn': ['摌'],\r\n 'jiū liú liáo jiǎo náo': ['摎'],\r\n 'féng pěng': ['摓'],\r\n shuāi: ['摔'],\r\n 'dì tú zhí': ['摕'],\r\n 'qì jì chá': ['摖'],\r\n 'sōu sǒng': ['摗'],\r\n 'liǎn liàn': ['摙'],\r\n 'gài xì': ['摡'],\r\n 'hù chū': ['摢'],\r\n tàng: ['摥', '烫', '燙', '鐋'],\r\n 'nái zhì': ['摨'],\r\n 'mó mā': ['摩'],\r\n 'jiāng qiàng': ['摪'],\r\n 'áo qiáo': ['摮'],\r\n 'niè chè': ['摰'],\r\n 'mán màn': ['摱'],\r\n 'chàn cán': ['摲'],\r\n 'sè mí sù': ['摵'],\r\n 'biāo biào': ['摽'],\r\n 'juē jué': ['撅'],\r\n piē: ['撆', '暼', '氕', '瞥'],\r\n 'piě piē': ['撇'],\r\n 'zǎn zān zēn qián': ['撍'],\r\n 'sā sǎ': ['撒'],\r\n hòng: ['撔', '訌', '讧', '闀', '鬨'],\r\n 'héng guàng': ['撗'],\r\n niǎn: [\r\n '撚',\r\n '撵',\r\n '攆',\r\n '涊',\r\n '焾',\r\n '碾',\r\n '簐',\r\n '蹍',\r\n '蹨',\r\n '躎',\r\n '輦',\r\n '辇',\r\n ],\r\n 'chéng zhěng': ['撜'],\r\n 'huī wéi': ['撝'],\r\n cāo: ['撡', '操', '糙'],\r\n 'xiāo sōu': ['撨'],\r\n 'liáo liāo': ['撩'],\r\n 'cuō zuǒ': ['撮'],\r\n 'wěi tuǒ': ['撱'],\r\n cuān: ['撺', '攛', '汆', '蹿', '躥', '鑹', '镩'],\r\n 'qiào yāo jī': ['撽'],\r\n 'zhuā wō': ['撾'],\r\n 'lèi léi': ['擂'],\r\n nǎng: ['擃', '攮', '曩', '灢'],\r\n 'qíng jǐng': ['擏'],\r\n kuǎi: ['擓', '蒯', '㧟'],\r\n 'pǐ bò': ['擗'],\r\n 'bò bāi': ['擘'],\r\n 'jù jǐ': ['據'],\r\n mēng: ['擝'],\r\n 'sǒu sòu': ['擞'],\r\n xǐng: ['擤', '箵', '醒'],\r\n cā: ['擦'],\r\n 'níng nǐng nìng': ['擰'],\r\n 'zhì jié': ['擳'],\r\n 'là liè': ['擸', '爉'],\r\n 'sòu sǒu': ['擻'],\r\n 'lì luò yuè': ['擽'],\r\n 'tī zhāi zhì': ['擿'],\r\n pān: ['攀', '潘', '眅', '萠'],\r\n lèi: [\r\n '攂',\r\n '泪',\r\n '涙',\r\n '淚',\r\n '禷',\r\n '类',\r\n '纇',\r\n '蘱',\r\n '酹',\r\n '銇',\r\n '錑',\r\n '頛',\r\n '頪',\r\n '類',\r\n '颣',\r\n ],\r\n 'cā sǎ': ['攃'],\r\n 'jùn pèi': ['攈'],\r\n 'lì luò': ['攊', '躒'],\r\n 'là lài': ['攋', '櫴'],\r\n 'lú luó': ['攎'],\r\n 'zǎn cuán': ['攒'],\r\n 'xiān jiān': ['攕'],\r\n 'mí mǐ mó': ['攠'],\r\n 'zǎn cuán zàn zuān': ['攢'],\r\n zuàn: ['攥'],\r\n 'lì shài': ['攦'],\r\n 'lì luǒ': ['攭'],\r\n 'guǐ guì': ['攱'],\r\n 'jī qī yǐ': ['攲'],\r\n fàng: ['放'],\r\n 'wù móu': ['敄'],\r\n 'chù shōu': ['敊'],\r\n 'gé guó è': ['敋'],\r\n 'duó duì': ['敓', '敚'],\r\n 'duō què': ['敠', '敪'],\r\n 'sàn sǎn': ['散'],\r\n 'dūn duì': ['敦', '镦'],\r\n 'qī yǐ jī': ['敧'],\r\n 'xiào xué': ['敩'],\r\n 'shù shǔ shuò': ['数', '數'],\r\n 'ái zhú': ['敱', '敳'],\r\n 'xiòng xuàn': ['敻'],\r\n 'zhuó zhú': ['斀'],\r\n 'yì dù': ['斁'],\r\n 'lí tái': ['斄'],\r\n 'fěi fēi': ['斐'],\r\n 'yǔ zhōng': ['斔'],\r\n 'dòu dǒu': ['斗'],\r\n 'wò guǎn': ['斡'],\r\n 'tǒu tiǎo': ['斢'],\r\n dòu: [\r\n '斣',\r\n '梪',\r\n '浢',\r\n '痘',\r\n '窦',\r\n '竇',\r\n '脰',\r\n '荳',\r\n '豆',\r\n '逗',\r\n '郖',\r\n '酘',\r\n '閗',\r\n '闘',\r\n '餖',\r\n '饾',\r\n '鬥',\r\n '鬦',\r\n '鬪',\r\n '鬬',\r\n '鬭',\r\n ],\r\n 'yín zhì': ['斦'],\r\n 'chǎn jiè': ['斺'],\r\n 'wū yū yú': ['於'],\r\n 'yóu liú': ['斿'],\r\n 'páng bàng': ['旁'],\r\n 'máo mào': ['旄'],\r\n 'pī bì': ['旇'],\r\n 'xuán xuàn': ['旋'],\r\n 'wú mó': ['无'],\r\n zǎo: ['早', '枣', '栆', '棗', '澡', '璪', '薻', '藻', '蚤'],\r\n gā: ['旮'],\r\n 'gàn hàn': ['旰'],\r\n 'tái yīng': ['旲'],\r\n 'xū xù': ['旴'],\r\n 'tūn zhùn': ['旽'],\r\n 'wù wǔ': ['旿'],\r\n 'pò pèi': ['昢'],\r\n zòng: ['昮', '猔', '疭', '瘲', '粽', '糉', '糭', '縦'],\r\n ǎi: ['昹', '毐', '矮', '蔼', '藹', '譪', '躷', '霭', '靄'],\r\n 'huàng huǎng': ['晃'],\r\n xuǎn: ['晅', '癣', '癬', '选', '選'],\r\n 'xù kuā': ['晇'],\r\n hǒng: ['晎'],\r\n shài: ['晒', '曬'],\r\n 'yūn yùn': ['晕', '煴'],\r\n 'shèng chéng': ['晟', '椉', '盛'],\r\n 'jǐng yǐng': ['景'],\r\n shǎn: ['晱', '熌', '睒', '覢', '閃', '闪', '陕', '陝'],\r\n 'qǐ dù': ['晵'],\r\n 'ǎn àn yǎn': ['晻'],\r\n 'wǎng wàng': ['暀'],\r\n zàn: [\r\n '暂',\r\n '暫',\r\n '瓉',\r\n '瓒',\r\n '瓚',\r\n '禶',\r\n '襸',\r\n '讃',\r\n '讚',\r\n '賛',\r\n '贊',\r\n '赞',\r\n '蹔',\r\n '鄼',\r\n '錾',\r\n '鏨',\r\n '饡',\r\n ],\r\n 'yùn yūn': ['暈'],\r\n 'mín mǐn': ['暋'],\r\n 'dǔ shǔ': ['暏'],\r\n shǔ: [\r\n '暑',\r\n '曙',\r\n '潻',\r\n '癙',\r\n '糬',\r\n '署',\r\n '薥',\r\n '薯',\r\n '藷',\r\n '蜀',\r\n '蠴',\r\n '襡',\r\n '襩',\r\n '鱪',\r\n '鱰',\r\n '黍',\r\n '鼠',\r\n '鼡',\r\n ],\r\n 'jiǎn lán': ['暕'],\r\n nuǎn: ['暖', '煗', '餪'],\r\n 'bào pù': ['暴'],\r\n 'xī xǐ': ['暿'],\r\n 'pù bào': ['曝', '瀑'],\r\n 'qū qǔ': ['紶'],\r\n 'qǔ qū': ['曲'],\r\n 'gèng gēng': ['更'],\r\n 'hū hù': ['曶', '雽'],\r\n 'zēng céng': ['曽', '橧'],\r\n 'céng zēng': ['曾', '竲'],\r\n 'cǎn qián jiàn': ['朁'],\r\n 'qiè hé': ['朅'],\r\n 'bì pí': ['朇', '禆', '笓', '裨'],\r\n 'yǒu yòu': ['有'],\r\n 'bān fén': ['朌', '鳻'],\r\n 'fú fù': ['服', '洑'],\r\n 'fěi kū': ['朏', '胐'],\r\n 'qú xù chǔn': ['朐'],\r\n 'juān zuī': ['朘'],\r\n 'huāng máng wáng': ['朚'],\r\n 'qī jī': ['期'],\r\n 'tóng chuáng': ['朣', '橦'],\r\n zhá: ['札', '牐', '箚', '蚻', '譗', '鍘', '铡', '閘', '闸'],\r\n 'zhú shù shú': ['朮'],\r\n 'shù shú zhú': ['术'],\r\n 'zhū shú': ['朱'],\r\n 'pǔ pò pō piáo': ['朴'],\r\n 'dāo tiáo mù': ['朷'],\r\n 'guǐ qiú': ['朹'],\r\n xiǔ: ['朽', '滫', '潃', '糔'],\r\n 'chéng chēng': ['朾'],\r\n zá: ['杂', '沯', '砸', '襍', '雑', '雜', '雥', '韴'],\r\n 'yú wū': ['杅'],\r\n 'gān gǎn': ['杆'],\r\n 'chā chà': ['杈'],\r\n 'shān shā': ['杉'],\r\n cūn: ['村', '皴', '竴', '膥', '踆', '邨'],\r\n 'rèn ér': ['杒', '梕'],\r\n 'sháo biāo': ['杓'],\r\n 'dì duò': ['杕', '枤'],\r\n 'gū gài': ['杚'],\r\n 'yí zhì lí duò': ['杝'],\r\n 'gàng gāng': ['杠'],\r\n 'tiáo tiāo': ['条', '條'],\r\n 'mà mǎ': ['杩'],\r\n 'sì zhǐ xǐ': ['杫'],\r\n 'yuán wán': ['杬', '蚖'],\r\n 'bèi fèi': ['杮'],\r\n 'shū duì': ['杸'],\r\n 'niǔ chǒu': ['杻'],\r\n 'wò yuè': ['枂', '臒'],\r\n máo: [\r\n '枆',\r\n '毛',\r\n '氂',\r\n '渵',\r\n '牦',\r\n '矛',\r\n '罞',\r\n '茅',\r\n '茆',\r\n '蝥',\r\n '蟊',\r\n '軞',\r\n '酕',\r\n '鉾',\r\n '錨',\r\n '锚',\r\n '髦',\r\n '鶜',\r\n ],\r\n 'pī mì': ['枈'],\r\n àng: ['枊', '盎', '醠'],\r\n 'fāng bìng': ['枋'],\r\n 'hù dǐ': ['枑'],\r\n xín: ['枔', '襑', '鐔', '鬵'],\r\n 'yāo yǎo': ['枖'],\r\n 'ě è': ['枙'],\r\n 'zhī qí': ['枝'],\r\n 'cōng zōng': ['枞', '樅'],\r\n 'xiān zhēn': ['枮'],\r\n 'tái sì': ['枱'],\r\n 'gǒu jǔ gōu': ['枸'],\r\n 'bāo fú': ['枹'],\r\n 'yì xiè': ['枻', '栧'],\r\n 'tuó duò': ['柁', '馱', '駄', '驮'],\r\n 'yí duò lí': ['柂'],\r\n 'nǐ chì': ['柅'],\r\n 'pán bàn': ['柈', '跘'],\r\n 'yǎng yàng yāng yīng': ['柍'],\r\n 'fù fū fǔ': ['柎'],\r\n 'bǎi bó bò': ['柏'],\r\n mǒu: ['某'],\r\n 'sháo shào': ['柖'],\r\n zhè: ['柘', '樜', '浙', '淛', '蔗', '蟅', '這', '鷓', '鹧', '䗪'],\r\n 'yòu yóu': ['柚', '櫾'],\r\n 'guì jǔ': ['柜'],\r\n 'zhà zuò': ['柞'],\r\n 'dié zhì': ['柣', '眰'],\r\n 'zhā zǔ zū': ['柤'],\r\n 'chá zhā': ['查', '査'],\r\n 'āo ào': ['柪', '軪'],\r\n 'bā fú pèi bó biē': ['柭'],\r\n 'duò zuó wù': ['柮'],\r\n 'bì bié': ['柲'],\r\n 'zhù chù': ['柷'],\r\n 'bēi pēi': ['柸'],\r\n 'shì fèi': ['柹'],\r\n 'shān zhà shi cè': ['栅'],\r\n 'lì yuè': ['栎', '櫟'],\r\n 'qì qiè': ['栔', '砌'],\r\n 'qī xī': ['栖', '蹊'],\r\n 'guā kuò': ['栝'],\r\n 'bīng bēn': ['栟'],\r\n 'xiào jiào': ['校'],\r\n 'jiàn zùn': ['栫', '袸'],\r\n 'yǒu yù': ['栯'],\r\n 'hé hú': ['核'],\r\n gēn: ['根', '跟'],\r\n 'zhī yì': ['栺'],\r\n 'gé gē': ['格'],\r\n 'héng háng': ['桁'],\r\n 'guàng guāng': ['桄'],\r\n 'yí tí': ['桋', '荑'],\r\n sāng: ['桑', '桒', '槡'],\r\n 'jú jié': ['桔'],\r\n 'yú móu': ['桙'],\r\n 'ráo náo': ['桡', '橈'],\r\n 'guì huì': ['桧', '檜'],\r\n 'chén zhèn': ['桭'],\r\n 'tīng yíng': ['桯'],\r\n 'bó po': ['桲'],\r\n 'bèn fàn': ['桳'],\r\n 'fēng fèng': ['桻', '葑'],\r\n 'sù yìn': ['梀'],\r\n 'tǐng tìng': ['梃'],\r\n 'xuān juān xié': ['梋'],\r\n 'tú chá': ['梌'],\r\n 'āo yòu': ['梎'],\r\n kuǎn: ['梡', '欵', '款', '歀'],\r\n 'shāo sào': ['梢'],\r\n 'qín chén cén': ['梣'],\r\n 'lí sì qǐ': ['梩'],\r\n 'chān yán': ['梴'],\r\n 'bīn bīng': ['梹', '槟', '檳'],\r\n 'táo chóu dào': ['梼'],\r\n 'cōng sōng': ['棇'],\r\n 'gùn hùn': ['棍'],\r\n 'dé zhé': ['棏'],\r\n 'pái bèi pèi': ['棑'],\r\n 'bàng pǒu bèi bēi': ['棓'],\r\n 'dì dài tì': ['棣'],\r\n sēn: ['森', '椮', '槮', '襂'],\r\n 'rěn shěn': ['棯'],\r\n 'léng lēng líng': ['棱'],\r\n 'fú sù': ['棴'],\r\n 'zōu sǒu': ['棷'],\r\n zōu: [\r\n '棸',\r\n '箃',\r\n '緅',\r\n '諏',\r\n '诹',\r\n '邹',\r\n '郰',\r\n '鄒',\r\n '鄹',\r\n '陬',\r\n '騶',\r\n '驺',\r\n '鯫',\r\n '鲰',\r\n '黀',\r\n '齱',\r\n '齺',\r\n ],\r\n 'zhào zhuō': ['棹'],\r\n 'chēn shēn': ['棽'],\r\n 'jiē qiè': ['椄'],\r\n 'yǐ yī': ['椅'],\r\n 'chóu zhòu diāo': ['椆'],\r\n 'qiāng kōng': ['椌'],\r\n 'zhuī chuí': ['椎'],\r\n 'bēi pí': ['椑'],\r\n mēn: ['椚'],\r\n 'quān juàn quán': ['椦'],\r\n 'duǒ chuán': ['椯'],\r\n 'wěi huī': ['椲'],\r\n 'jiǎ jiā': ['椵'],\r\n 'hán jiān': ['椷'],\r\n 'shèn zhēn': ['椹'],\r\n 'yàn yà': ['椻'],\r\n 'zhā chá': ['楂'],\r\n 'guō kuǎ': ['楇'],\r\n 'jí zhì': ['楖'],\r\n 'kǔ hù': ['楛'],\r\n 'yóu yǒu': ['楢'],\r\n 'sǒng cōng': ['楤'],\r\n 'yuán xuàn': ['楥'],\r\n 'yǎng yàng yīng': ['楧'],\r\n pián: ['楩', '胼', '腁', '賆', '蹁', '駢', '騈', '骈', '骿', '㛹'],\r\n 'dié yè': ['楪'],\r\n 'dùn shǔn': ['楯'],\r\n 'còu zòu': ['楱'],\r\n 'dì dǐ shì': ['楴'],\r\n 'kǎi jiē': ['楷'],\r\n 'róu ròu': ['楺'],\r\n 'lè yuè': ['楽'],\r\n 'wēn yùn': ['榅', '鞰'],\r\n lǘ: ['榈', '櫚', '氀', '膢', '藘', '閭', '闾', '驢', '驴'],\r\n shén: ['榊', '神', '鉮', '鰰', '𬬹'],\r\n 'bī pi': ['榌'],\r\n 'zhǎn niǎn zhèn': ['榐'],\r\n 'fú fù bó': ['榑'],\r\n 'jiàn jìn': ['榗'],\r\n 'bǎng bàng': ['榜'],\r\n 'shā xiè': ['榝', '樧'],\r\n nòu: ['槈', '耨', '鎒', '鐞'],\r\n 'qiǎn lián xiàn': ['槏'],\r\n gàng: ['槓', '焵', '焹', '筻', '鿍'],\r\n gāo: [\r\n '槔',\r\n '槹',\r\n '橰',\r\n '櫜',\r\n '睾',\r\n '篙',\r\n '糕',\r\n '羔',\r\n '臯',\r\n '韟',\r\n '餻',\r\n '高',\r\n '髙',\r\n '鷎',\r\n '鷱',\r\n '鼛',\r\n ],\r\n 'diān zhěn zhēn': ['槙'],\r\n 'kǎn jiàn': ['槛'],\r\n 'xí dié': ['槢'],\r\n 'jī guī': ['槣'],\r\n 'róng yōng': ['槦'],\r\n 'tuán shuàn quán': ['槫'],\r\n 'qì sè': ['槭'],\r\n 'cuī zhǐ': ['槯'],\r\n 'yǒu chǎo': ['槱'],\r\n 'màn wàn': ['槾'],\r\n 'lí chī': ['樆'],\r\n 'léi lěi': ['樏', '櫑', '礌'],\r\n 'cháo jiǎo chāo': ['樔'],\r\n 'chēng táng': ['樘'],\r\n 'jiū liáo': ['樛'],\r\n 'mó mú': ['模'],\r\n 'niǎo mù': ['樢'],\r\n 'héng hèng': ['横', '橫'],\r\n xuě: ['樰', '膤', '艝', '轌', '雪', '鱈', '鳕'],\r\n 'fá fèi': ['橃'],\r\n rùn: ['橍', '润', '潤', '膶', '閏', '閠', '闰'],\r\n 'zhǎn jiǎn': ['橏'],\r\n shùn: ['橓', '瞚', '瞬', '舜', '蕣', '順', '顺', '鬊'],\r\n 'tuí dūn': ['橔'],\r\n 'táng chēng': ['橖'],\r\n 'sù qiū': ['橚'],\r\n 'tán diàn': ['橝'],\r\n 'fén fèn fèi': ['橨'],\r\n 'rǎn yān': ['橪'],\r\n 'cū chu': ['橻'],\r\n 'shū qiāo': ['橾'],\r\n 'píng bò': ['檘'],\r\n 'zhái shì tú': ['檡'],\r\n 'biǎo biāo': ['檦'],\r\n 'qiān lián': ['檶'],\r\n 'nǐ mí': ['檷'],\r\n 'jiàn kǎn': ['檻'],\r\n 'nòu ruǎn rú': ['檽'],\r\n 'jī jì': ['櫅', '禨'],\r\n 'huǎng guǒ gǔ': ['櫎'],\r\n 'lǜ chū': ['櫖'],\r\n 'miè mèi': ['櫗'],\r\n ōu: [\r\n '櫙',\r\n '欧',\r\n '歐',\r\n '殴',\r\n '毆',\r\n '瓯',\r\n '甌',\r\n '膒',\r\n '藲',\r\n '謳',\r\n '讴',\r\n '鏂',\r\n '鴎',\r\n '鷗',\r\n '鸥',\r\n ],\r\n 'zhù zhuó': ['櫡'],\r\n 'jué jì': ['櫭'],\r\n 'huái guī': ['櫰'],\r\n 'chán zhàn': ['欃'],\r\n 'wéi zuì': ['欈'],\r\n cáng: ['欌', '鑶'],\r\n 'yù yì': ['欥'],\r\n 'chù qù xì': ['欪'],\r\n 'kài ài': ['欬'],\r\n 'yì yīn': ['欭'],\r\n 'xì kài': ['欯'],\r\n 'shuò sòu': ['欶'],\r\n 'ǎi ēi éi ěi èi ê̄ ế ê̌ ề': ['欸'],\r\n 'qī yī': ['欹'],\r\n 'chuā xū': ['欻'],\r\n 'chǐ chuài': ['欼'],\r\n 'kǎn qiàn': ['欿'],\r\n 'kǎn kè': ['歁'],\r\n 'chuǎn chuán': ['歂'],\r\n 'yīn yān': ['歅'],\r\n 'jìn qūn': ['歏'],\r\n pēn: ['歕'],\r\n 'xū chuā': ['歘'],\r\n 'xī shè': ['歙'],\r\n 'liǎn hān': ['歛'],\r\n 'zhì chí': ['歭'],\r\n 'sè shà': ['歰'],\r\n sǐ: ['死'],\r\n 'wěn mò': ['歾'],\r\n piǎo: ['殍', '皫', '瞟', '醥', '顠'],\r\n 'qíng jìng': ['殑'],\r\n 'fǒu bó': ['殕'],\r\n 'zhí shi': ['殖'],\r\n 'yè yān yàn': ['殗'],\r\n 'hūn mèi': ['殙'],\r\n chòu: ['殠', '臰', '遚'],\r\n 'kuì huì': ['殨', '溃', '潰'],\r\n cuàn: ['殩', '熶', '爨', '窜', '竄', '篡', '簒'],\r\n 'yīn yān yǐn': ['殷'],\r\n 'qìng kēng shēng': ['殸'],\r\n 'yáo xiáo xiào': ['殽'],\r\n 'gū gǔ': ['毂', '蛄'],\r\n 'guàn wān': ['毌'],\r\n 'dú dài': ['毒'],\r\n 'xún xùn': ['毥'],\r\n mú: ['毪', '氁'],\r\n 'dòu nuò': ['毭'],\r\n 'sāi suī': ['毸'],\r\n lu: ['氇'],\r\n sào: ['氉', '瘙', '矂', '髞'],\r\n 'shì zhī': ['氏'],\r\n 'dī dǐ': ['氐'],\r\n 'máng méng': ['氓'],\r\n 'yáng rì': ['氜'],\r\n shuǐ: ['水', '氵', '氺', '閖'],\r\n 'zhěng chéng zhèng': ['氶'],\r\n tǔn: ['氽'],\r\n 'fán fàn': ['氾'],\r\n 'guǐ jiǔ': ['氿'],\r\n 'bīn pà pā': ['汃'],\r\n 'zhuó què': ['汋'],\r\n 'dà tài': ['汏'],\r\n pìn: ['汖', '牝', '聘'],\r\n 'hàn hán': ['汗', '馯'],\r\n tu: ['汢'],\r\n 'tāng shāng': ['汤', '湯'],\r\n 'zhī jì': ['汥'],\r\n 'gàn hán cén': ['汵'],\r\n 'wèn mén': ['汶'],\r\n 'fāng pāng': ['汸'],\r\n 'hǔ huǎng': ['汻'],\r\n 'niú yóu': ['汼'],\r\n hàng: ['沆'],\r\n 'shěn chén': ['沈'],\r\n 'dùn zhuàn': ['沌'],\r\n 'nǜ niǔ': ['沑'],\r\n 'méi mò': ['沒', '没'],\r\n 'tà dá': ['沓'],\r\n 'mì wù': ['沕'],\r\n 'hóng pāng': ['沗'],\r\n 'shā shà': ['沙'],\r\n 'zhuǐ zǐ': ['沝'],\r\n 'ōu òu': ['沤', '漚'],\r\n 'jǔ jù': ['沮'],\r\n 'tuō duó': ['沰'],\r\n 'mǐ lì': ['沵'],\r\n 'yí chí': ['沶'],\r\n 'xiè yì': ['泄'],\r\n 'bó pō': ['泊'],\r\n 'mì bì': ['泌', '秘'],\r\n 'chù shè': ['泏'],\r\n 'yōu yòu āo': ['泑'],\r\n 'pēng píng': ['泙', '硑'],\r\n 'pào pāo': ['泡'],\r\n 'ní nì': ['泥', '秜'],\r\n 'yuè sà': ['泧'],\r\n 'jué xuè': ['泬', '疦'],\r\n 'lóng shuāng': ['泷', '瀧'],\r\n 'luò pō': ['泺', '濼'],\r\n 'zé shì': ['泽', '澤'],\r\n 'sǎ xǐ': ['洒'],\r\n 'sè qì zì': ['洓'],\r\n 'xǐ xiǎn': ['洗'],\r\n 'kǎo kào': ['洘'],\r\n 'àn yàn è': ['洝'],\r\n 'lěi lèi': ['洡'],\r\n 'qiè jié': ['洯'],\r\n 'qiǎn jiān': ['浅'],\r\n 'jì jǐ': ['济', '済', '濟', '纪'],\r\n 'hǔ xǔ': ['浒', '滸'],\r\n 'jùn xùn': ['浚', '濬'],\r\n 'yǐng chéng yíng': ['浧'],\r\n 'liàn lì': ['浰'],\r\n 'féng hóng': ['浲', '溄'],\r\n 'jiǒng jiōng': ['浻'],\r\n 'suī něi': ['浽'],\r\n 'yǒng chōng': ['涌'],\r\n 'tūn yūn': ['涒'],\r\n 'wō guō': ['涡', '渦'],\r\n hēng: ['涥', '脝'],\r\n 'zhǎng zhàng': ['涨', '漲'],\r\n 'shòu tāo': ['涭'],\r\n shuàn: ['涮', '腨'],\r\n 'kōng náng': ['涳'],\r\n 'wò wǎn yuān': ['涴'],\r\n 'tuō tuò': ['涶'],\r\n wō: ['涹', '猧', '窝', '窩', '莴', '萵', '蜗', '蝸', '踒'],\r\n 'qiè jí': ['淁'],\r\n 'guǒ guàn': ['淉'],\r\n 'lín lìn': ['淋', '獜', '疄'],\r\n 'tǎng chǎng': ['淌'],\r\n 'nào chuò zhuō': ['淖'],\r\n 'péng píng': ['淜'],\r\n féi: ['淝', '肥', '腓', '蜰'],\r\n 'pì pèi': ['淠'],\r\n 'niǎn shěn': ['淰'],\r\n 'biāo hǔ': ['淲'],\r\n 'chún zhūn': ['淳'],\r\n 'hùn hún': ['混'],\r\n qiǎn: ['淺', '繾', '缱', '肷', '膁', '蜸', '譴', '谴', '遣', '鑓'],\r\n 'wèn mín': ['渂'],\r\n 'rè ruò luò': ['渃'],\r\n 'dú dòu': ['渎', '瀆', '读'],\r\n 'jiàn jiān': ['渐', '溅', '漸', '濺'],\r\n 'miǎn shéng': ['渑', '澠'],\r\n 'nuǎn nuán': ['渜'],\r\n 'qiú wù': ['渞'],\r\n 'tíng tīng': ['渟'],\r\n 'dì tí dī': ['渧'],\r\n 'gǎng jiǎng': ['港'],\r\n 'hōng qìng': ['渹'],\r\n tuān: ['湍', '煓'],\r\n 'huì mǐn xū': ['湏'],\r\n 'xǔ xù': ['湑'],\r\n pén: ['湓', '瓫', '盆', '葐'],\r\n 'mǐn hūn': ['湣'],\r\n 'tuàn nuǎn': ['湪'],\r\n 'qiū jiǎo': ['湫', '湬'],\r\n 'yān yīn': ['湮'],\r\n 'bàn pán': ['湴'],\r\n 'zhuāng hún': ['湷'],\r\n 'yàn guì': ['溎'],\r\n 'lián liǎn nián xián xiàn': ['溓'],\r\n 'dá tǎ': ['溚', '鿎'],\r\n 'liū liù': ['溜', '澑', '蹓'],\r\n lùn: ['溣'],\r\n mǎ: [\r\n '溤',\r\n '犸',\r\n '獁',\r\n '玛',\r\n '瑪',\r\n '码',\r\n '碼',\r\n '遤',\r\n '鎷',\r\n '馬',\r\n '马',\r\n '鰢',\r\n '鷌',\r\n ],\r\n 'zhēn qín': ['溱'],\r\n 'nì niào': ['溺'],\r\n 'chù xù': ['滀', '畜'],\r\n 'wěng wēng': ['滃'],\r\n 'hào xuè': ['滈'],\r\n 'qì xì xiē': ['滊'],\r\n 'xíng yíng': ['滎'],\r\n 'zé hào': ['滜'],\r\n 'piāo piào piǎo': ['漂'],\r\n 'cóng sǒng': ['漎'],\r\n 'féng péng': ['漨'],\r\n 'luò tà': ['漯'],\r\n 'pēng bēn': ['漰'],\r\n 'chóng shuāng': ['漴'],\r\n 'huǒ kuò huò': ['漷'],\r\n 'liáo liú': ['漻'],\r\n 'cuǐ cuī': ['漼'],\r\n 'cóng zǒng': ['潀'],\r\n 'cóng zōng': ['潈'],\r\n 'pì piē': ['潎'],\r\n 'dàng xiàng': ['潒'],\r\n 'huáng guāng': ['潢'],\r\n 'liáo lào lǎo': ['潦'],\r\n 'cōng zòng': ['潨'],\r\n 'zhí zhì': ['潪'],\r\n 'tān shàn': ['潬'],\r\n 'tú zhā': ['潳'],\r\n 'sàn sǎ': ['潵'],\r\n hēi: ['潶', '黑', '黒', '𬭶'],\r\n 'chéng dèng': ['澄', '瀓'],\r\n 'cūn cún': ['澊'],\r\n 'péng pēng': ['澎'],\r\n 'hòng gǒng': ['澒', '銾'],\r\n 'wàn màn': ['澫'],\r\n 'kuài huì': ['澮'],\r\n 'guō wō': ['濄'],\r\n 'pēn fén': ['濆'],\r\n 'jí shà': ['濈'],\r\n 'huì huò': ['濊'],\r\n 'dǐng tìng': ['濎'],\r\n 'mǐ nǐ': ['濔'],\r\n 'bì pì': ['濞'],\r\n 'cuì zuǐ': ['濢'],\r\n 'hù huò': ['濩'],\r\n 'ǎi kài kè': ['濭'],\r\n 'wěi duì': ['濻', '瀢'],\r\n 'zàn cuán': ['濽', '灒'],\r\n 'yǎng yàng': ['瀁'],\r\n 'wǎng wāng': ['瀇'],\r\n 'mò miè': ['瀎', '眜'],\r\n suǐ: ['瀡', '膸', '髓'],\r\n 'huái wāi': ['瀤'],\r\n 'zùn jiàn': ['瀳'],\r\n 'yīng yǐng yìng': ['瀴'],\r\n 'ráng ràng': ['瀼'],\r\n shuàng: ['灀'],\r\n 'zhuó jiào zé': ['灂'],\r\n sǎ: ['灑', '訯', '靸'],\r\n 'luán luàn': ['灓'],\r\n 'dǎng tǎng': ['灙'],\r\n 'xún quán quàn': ['灥'],\r\n 'huǒ biāo': ['灬'],\r\n 'zhà yù': ['灹'],\r\n 'fén bèn': ['炃'],\r\n 'jiǒng guì': ['炅'],\r\n 'pàng fēng': ['炐'],\r\n quē: ['炔', '缺', '缼', '蒛'],\r\n biān: [\r\n '炞',\r\n '煸',\r\n '甂',\r\n '砭',\r\n '笾',\r\n '箯',\r\n '籩',\r\n '編',\r\n '编',\r\n '蝙',\r\n '邉',\r\n '邊',\r\n '鍽',\r\n '鞭',\r\n '鯾',\r\n '鯿',\r\n '鳊',\r\n ],\r\n 'zhāo zhào': ['炤'],\r\n 'zhuō chù': ['炪'],\r\n 'pào páo bāo': ['炮'],\r\n 'páo fǒu': ['炰'],\r\n 'shǎn qián shān': ['炶'],\r\n 'zhà zhá': ['炸'],\r\n 'jiǎo yào': ['烄'],\r\n quǎn: ['烇', '犬', '犭', '畎', '綣', '绻', '虇'],\r\n 'yàng yáng': ['烊'],\r\n 'lào luò': ['烙'],\r\n 'huí huǐ': ['烠'],\r\n rè: ['热', '熱'],\r\n 'fú páo': ['烰'],\r\n 'xiè chè': ['烲', '焎'],\r\n 'yàn shān': ['烻'],\r\n 'hūn xūn': ['焄'],\r\n kào: ['焅', '犒', '銬', '铐', '靠', '鮳', '鯌', '鲓', '㸆'],\r\n 'juān yè': ['焆'],\r\n 'jùn qū': ['焌'],\r\n 'tāo dào': ['焘'],\r\n 'chǎo jù': ['焣'],\r\n 'wò ài': ['焥'],\r\n 'zǒng cōng': ['焧'],\r\n 'xī yì': ['焬'],\r\n 'xìn xīn': ['焮'],\r\n 'chāo zhuō': ['焯'],\r\n 'xiǒng yīng': ['焸', '焽'],\r\n kuǐ: ['煃', '跬', '蹞', '頍', '𫠆'],\r\n 'huī yùn xūn': ['煇'],\r\n 'jiǎo qiāo': ['煍'],\r\n 'qián shǎn shān': ['煔'],\r\n 'xī yí': ['煕'],\r\n 'shà shā': ['煞'],\r\n 'yè zhá': ['煠'],\r\n 'yáng yàng': ['煬'],\r\n 'ēn yūn': ['煾'],\r\n 'yūn yǔn': ['熅'],\r\n 'hè xiāo': ['熇'],\r\n xióng: ['熊', '熋', '雄'],\r\n 'xūn xùn': ['熏', '爋'],\r\n gòng: ['熕', '貢', '贡'],\r\n liū: ['熘'],\r\n 'cōng zǒng': ['熜'],\r\n 'lù āo': ['熝'],\r\n 'shú shóu': ['熟'],\r\n 'fēng péng': ['熢'],\r\n 'cuǐ suī': ['熣'],\r\n tēng: ['熥', '膯', '鼟'],\r\n 'yùn yù': ['熨'],\r\n 'áo āo': ['熬'],\r\n 'hàn rǎn': ['熯'],\r\n 'ōu ǒu': ['熰'],\r\n 'huáng huǎng': ['熿'],\r\n 'chǎn dǎn chàn': ['燀'],\r\n 'jiāo zhuó qiáo jué': ['燋'],\r\n 'yàn yān': ['燕'],\r\n 'tài liè': ['燤'],\r\n āo: ['爊'],\r\n 'yàn xún': ['爓'],\r\n 'jué jiào': ['爝', '覐', '覚', '覺', '觉'],\r\n 'lǎn làn': ['爦'],\r\n 'zhuǎ zhǎo': ['爪'],\r\n 'zhǎo zhuǎ': ['爫'],\r\n 'fù fǔ': ['父'],\r\n diē: ['爹', '褺', '跌'],\r\n zāng: ['牂', '羘', '臧', '賍', '賘', '贓', '贜', '赃', '髒'],\r\n 'piàn piān': ['片'],\r\n 'biān miàn': ['牑'],\r\n bǎng: ['牓', '綁', '绑'],\r\n 'yǒu yōng': ['牗'],\r\n 'chēng chèng': ['牚', '竀'],\r\n niú: ['牛', '牜'],\r\n 'jiū lè': ['牞'],\r\n 'mù móu': ['牟'],\r\n māng: ['牤'],\r\n 'gē qiú': ['牫'],\r\n 'yòu chōu': ['牰'],\r\n 'tè zhí': ['犆'],\r\n bēn: ['犇', '錛', '锛'],\r\n 'jiān qián': ['犍', '玪'],\r\n má: ['犘', '痲', '蔴', '蟇', '麻'],\r\n 'máo lí': ['犛'],\r\n 'bá quǎn': ['犮'],\r\n 'zhuó bào': ['犳'],\r\n 'àn hān': ['犴'],\r\n 'kàng gǎng': ['犺'],\r\n 'pèi fèi': ['犻'],\r\n 'fān huān': ['犿'],\r\n kuáng: ['狂', '狅', '誑', '诳', '軖', '軠', '鵟', '𫛭'],\r\n 'yí quán chí': ['狋'],\r\n 'xīng shēng': ['狌'],\r\n 'tuó yí': ['狏'],\r\n kǔ: ['狜', '苦'],\r\n 'huán huān': ['狟'],\r\n 'hé mò': ['狢'],\r\n 'tà shì': ['狧'],\r\n 'máng dòu': ['狵'],\r\n 'xī shǐ': ['狶'],\r\n suān: ['狻', '痠', '酸'],\r\n 'bài pí': ['猈'],\r\n 'jiān yàn': ['猏', '豣'],\r\n 'yī yǐ': ['猗'],\r\n 'yá wèi': ['猚'],\r\n cāi: ['猜'],\r\n 'māo máo': ['猫', '貓'],\r\n 'chuàn chuān': ['猭'],\r\n 'tuān tuàn': ['猯', '貒'],\r\n 'yà jiá qiè': ['猰'],\r\n 'hè xiē gé hài': ['猲'],\r\n 'biān piàn': ['猵', '獱'],\r\n 'bó pò': ['猼'],\r\n 'háo gāo': ['獋'],\r\n 'fén fèn': ['獖'],\r\n 'yào xiāo': ['獟'],\r\n 'shuò xī': ['獡'],\r\n 'gé liè xiē': ['獦'],\r\n 'nòu rú': ['獳'],\r\n 'náo nǎo yōu': ['獶'],\r\n ráng: ['獽', '瓤', '禳', '穣', '穰', '蘘', '躟', '鬤'],\r\n 'náo yōu': ['獿'],\r\n 'lǜ shuài': ['率'],\r\n 'wáng wàng': ['王'],\r\n 'yáng chàng': ['玚'],\r\n 'mín wén': ['玟'],\r\n 'bīn fēn': ['玢'],\r\n 'mén yǔn': ['玧'],\r\n 'qiāng cāng': ['玱', '瑲', '篬'],\r\n 'án gān': ['玵'],\r\n 'xuán xián': ['玹'],\r\n 'cī cǐ': ['玼', '跐'],\r\n 'yí tāi': ['珆'],\r\n 'zǔ jù': ['珇'],\r\n fà: ['珐', '琺', '蕟', '髪', '髮'],\r\n 'yín kèn': ['珢'],\r\n 'huī hún': ['珲'],\r\n 'xuán qióng': ['琁'],\r\n 'fú fū': ['琈'],\r\n 'bǐng pín': ['琕'],\r\n 'cuì sè': ['琗'],\r\n 'yù wéi': ['琟'],\r\n 'tiǎn tiàn': ['琠'],\r\n 'zhuó zuó': ['琢'],\r\n 'běng pěi': ['琣'],\r\n guǎn: ['琯', '璭', '痯', '筦', '管', '舘', '輨', '錧', '館', '馆', '鳤'],\r\n 'hún huī': ['琿'],\r\n 'xié jiē': ['瑎'],\r\n 'chàng dàng yáng': ['瑒'],\r\n 'tiàn zhèn': ['瑱'],\r\n 'bīn pián': ['瑸', '璸'],\r\n 'tú shū': ['瑹'],\r\n cuǐ: ['璀', '皠', '趡'],\r\n 'zǎo suǒ': ['璅'],\r\n 'jué qióng': ['璚'],\r\n 'lú fū': ['璷'],\r\n 'jì zī': ['璾'],\r\n suí: ['瓍', '綏', '绥', '遀', '随', '隨', '髄'],\r\n 'mí xǐ': ['瓕'],\r\n 'qióng wěi wèi': ['瓗'],\r\n 'huán yè yà': ['瓛'],\r\n 'bó páo': ['瓟'],\r\n 'zhí hú': ['瓡'],\r\n piáo: ['瓢', '闝'],\r\n 'wǎ wà': ['瓦'],\r\n 'xiáng hóng': ['瓨'],\r\n wèng: ['瓮', '甕', '罋', '蕹', '齆'],\r\n 'shèn shén': ['甚'],\r\n ruí: ['甤', '緌', '蕤'],\r\n yòng: ['用', '砽', '苚', '蒏', '醟', '㶲'],\r\n shuǎi: ['甩'],\r\n béng: ['甭', '甮'],\r\n 'yóu zhá': ['甴'],\r\n 'diàn tián shèng': ['甸'],\r\n 'tǐng dīng': ['町', '甼'],\r\n 'zāi zī': ['甾'],\r\n 'bì qí': ['畁'],\r\n 'dá fú': ['畗'],\r\n 'cè jì': ['畟'],\r\n 'zāi zī tián': ['畠'],\r\n 'zhì chóu shì': ['畤'],\r\n 'fān pān': ['畨', '番'],\r\n 'shē yú': ['畬'],\r\n 'dāng dàng dǎng': ['當'],\r\n 'jiāng qiáng': ['疆'],\r\n 'pǐ yǎ shū': ['疋'],\r\n 'jié qiè': ['疌'],\r\n 'yí nǐ': ['疑'],\r\n nè: ['疒', '眲', '訥', '讷'],\r\n 'gē yì': ['疙'],\r\n 'nüè yào': ['疟', '瘧'],\r\n 'lì lài': ['疠', '癘'],\r\n 'yǎ xiā': ['疨'],\r\n xuē: ['疶', '蒆', '薛', '辥', '辪', '靴', '鞾'],\r\n 'dǎn da': ['疸'],\r\n 'fá biǎn': ['疺'],\r\n 'fèi féi': ['疿', '痱'],\r\n 'shān diàn': ['痁'],\r\n 'téng chóng': ['痋'],\r\n 'tōng tóng': ['痌'],\r\n 'wěi yòu yù': ['痏'],\r\n 'tān shǐ': ['痑'],\r\n 'pū pù': ['痡', '鋪'],\r\n 'bēng péng': ['痭'],\r\n 'má lìn': ['痳'],\r\n 'tiǎn diàn': ['痶'],\r\n 'ān yè è': ['痷'],\r\n 'kē ē': ['痾'],\r\n 'zhì chì': ['瘈'],\r\n 'jiǎ xiá xiā': ['瘕'],\r\n 'lěi huì': ['瘣'],\r\n 'chài cuó': ['瘥'],\r\n 'diān chēn': ['瘨'],\r\n 'da dá': ['瘩'],\r\n 'biě biē': ['瘪'],\r\n qué: ['瘸'],\r\n 'dàn dān': ['癉'],\r\n 'guì wēi': ['癐'],\r\n 'nòng nóng': ['癑'],\r\n 'biē biě': ['癟'],\r\n 'bō bǒ': ['癷'],\r\n bái: ['白'],\r\n 'jí bī': ['皀'],\r\n 'de dì dí dī': ['的'],\r\n 'pā bà': ['皅'],\r\n 'gāo háo': ['皋'],\r\n 'gāo yáo': ['皐'],\r\n 'lì luò bō': ['皪'],\r\n 'zhā cǔ': ['皻'],\r\n 'zhāo zhǎn dǎn': ['皽'],\r\n 'jiān jiàn': ['监', '監', '鋻', '间', '鞬'],\r\n 'gài gě hé': ['盖'],\r\n 'máng wàng': ['盳'],\r\n yuǎn: ['盶', '逺', '遠'],\r\n 'tián xián': ['盷'],\r\n 'xiāng xiàng': ['相'],\r\n dǔn: ['盹', '趸', '躉'],\r\n 'xì pǎn': ['盻'],\r\n 'shěng xǐng': ['省'],\r\n 'yún hùn': ['眃'],\r\n 'miǎn miàn': ['眄'],\r\n 'kàn kān': ['看'],\r\n 'yìng yāng yǎng': ['眏'],\r\n 'yǎo āo ǎo': ['眑'],\r\n 'jū xū kōu': ['眗'],\r\n 'yí chì': ['眙'],\r\n 'dié tì': ['眣'],\r\n 'bǐng fǎng': ['眪'],\r\n 'pàng pán': ['眫'],\r\n 'mī mí': ['眯', '瞇'],\r\n 'xuàn shùn xún': ['眴'],\r\n tiào: ['眺', '粜', '糶', '覜', '趒'],\r\n 'zhe zhuó zháo zhāo': ['着'],\r\n 'qiáo shào xiāo': ['睄'],\r\n 'cuó zhuài': ['睉'],\r\n gùn: ['睔', '謴'],\r\n 'suì zuì': ['睟'],\r\n 'pì bì': ['睥', '稫', '辟'],\r\n 'yì zé gāo': ['睪'],\r\n 'xǐng xìng': ['睲'],\r\n 'guì wèi kuì': ['瞆'],\r\n 'kòu jì': ['瞉'],\r\n 'qióng huán': ['瞏'],\r\n 'mán mén': ['瞒', '瞞'],\r\n 'diāo dōu': ['瞗'],\r\n 'lou lóu lǘ': ['瞜'],\r\n 'shùn rún': ['瞤'],\r\n 'liào liǎo': ['瞭', '钌'],\r\n 'jiàn xián': ['瞯'],\r\n 'wǔ mí': ['瞴'],\r\n 'guì kuì': ['瞶'],\r\n 'nǐng chēng': ['矃'],\r\n 'huò yuè': ['矆'],\r\n 'mēng méng': ['矇'],\r\n 'kuàng guō': ['矌'],\r\n 'guàn quán': ['矔'],\r\n 'mǎn mán': ['矕'],\r\n 'jīn guān qín': ['矜'],\r\n 'jīn qín guān': ['矝'],\r\n 'yù xù jué': ['矞'],\r\n 'jiǎo jiáo': ['矫', '矯'],\r\n duǎn: ['短'],\r\n 'shí dàn': ['石'],\r\n 'gāng qiāng kòng': ['矼'],\r\n 'huā xū': ['砉'],\r\n 'pīn bīn fēn': ['砏'],\r\n 'yán yàn': ['研', '硏'],\r\n 'luǒ kē': ['砢'],\r\n 'fú fèi': ['砩', '笰'],\r\n 'zhǔ zhù': ['砫'],\r\n 'lá lì lā': ['砬'],\r\n 'kuāng guāng': ['硄'],\r\n 'gè luò': ['硌'],\r\n 'shuò shí': ['硕', '碩'],\r\n 'wèi wéi ái': ['硙'],\r\n 'què kè kù': ['硞'],\r\n 'mǎng bàng': ['硥'],\r\n 'luò lòng': ['硦'],\r\n 'yǒng tóng': ['硧'],\r\n nüè: ['硸', '虐'],\r\n 'kēng kěng': ['硻'],\r\n 'yān yǎn': ['硽'],\r\n 'zhuì chuí duǒ': ['硾'],\r\n 'kōng kòng': ['硿'],\r\n 'zòng cóng': ['碂'],\r\n 'jiān zhàn': ['碊'],\r\n 'lù liù': ['碌', '陆'],\r\n 'què xī': ['碏'],\r\n 'lún lǔn lùn': ['碖'],\r\n 'náo gāng': ['碙'],\r\n 'jié yà': ['碣'],\r\n 'wèi wěi': ['碨'],\r\n 'tí dī': ['碮'],\r\n 'chá chā': ['碴'],\r\n 'qiāo què': ['碻'],\r\n 'sù xiè': ['碿'],\r\n 'liú liù': ['磂', '遛', '鎦', '馏'],\r\n 'sī tí': ['磃'],\r\n 'bàng páng': ['磅'],\r\n 'huá kě gū': ['磆'],\r\n 'wěi kuǐ': ['磈'],\r\n 'xiá qià yà': ['磍'],\r\n 'lián qiān': ['磏'],\r\n 'wèi ái gài': ['磑'],\r\n 'lá lā': ['磖'],\r\n 'áo qiāo': ['磝'],\r\n 'pēng pèng': ['磞', '閛'],\r\n 'yīn yǐn': ['磤'],\r\n 'lěi léi': ['磥'],\r\n 'mó mò': ['磨'],\r\n 'qì zhú': ['磩'],\r\n 'láo luò': ['磱'],\r\n 'pán bō': ['磻'],\r\n 'jí shé': ['磼'],\r\n 'hé qiāo qiào': ['礉'],\r\n 'kè huò': ['礊'],\r\n 'què hú': ['礐'],\r\n 'è qì': ['礘'],\r\n cǎ: ['礤', '礸'],\r\n 'xián xín': ['礥'],\r\n 'léi lěi lèi': ['礧'],\r\n 'yán yǎn': ['礹'],\r\n 'qí zhǐ': ['祇', '蚔'],\r\n 'bēng fāng': ['祊'],\r\n 'bì mì': ['祕'],\r\n suàn: ['祘', '笇', '筭', '算', '蒜'],\r\n 'piào piāo': ['票'],\r\n 'jì zhài': ['祭'],\r\n 'shuì lèi': ['祱'],\r\n 'jìn jīn': ['禁'],\r\n 'chán shàn': ['禅'],\r\n 'yáng shāng': ['禓'],\r\n 'zhī zhǐ tí': ['禔'],\r\n 'shàn chán': ['禪'],\r\n 'yú yù ǒu': ['禺'],\r\n 'zǐ zì': ['秄'],\r\n 'chá ná': ['秅'],\r\n 'zhǒng zhòng chóng': ['种'],\r\n 'hào mào': ['秏'],\r\n 'kù kū': ['秙'],\r\n zū: ['租', '葅'],\r\n chèng: ['秤', '穪'],\r\n 'huó kuò': ['秮', '秳'],\r\n 'chēng chèn chèng': ['称', '稱'],\r\n 'shì zhì': ['秲', '銴'],\r\n 'fù pū': ['秿'],\r\n 'xùn zè': ['稄'],\r\n 'tú shǔ': ['稌'],\r\n 'zhùn zhǔn': ['稕'],\r\n 'jī qí': ['稘', '綨', '觭'],\r\n 'léng líng': ['稜'],\r\n 'zuì zú sū': ['稡'],\r\n 'xì qiè': ['稧', '郄'],\r\n 'zhǒng zhòng': ['種'],\r\n 'zōng zǒng': ['稯'],\r\n 'xián jiān liàn': ['稴'],\r\n 'zī jiū': ['稵'],\r\n 'jī qǐ': ['稽'],\r\n ròng: ['穃'],\r\n 'shān cǎn cēn': ['穇'],\r\n 'mén méi': ['穈'],\r\n 'jǐ jì': ['穖'],\r\n 'xiāo rào': ['穘'],\r\n 'zhuō bó': ['穛'],\r\n 'tóng zhǒng zhòng': ['穜'],\r\n zuō: ['穝'],\r\n 'biāo pāo': ['穮', '藨'],\r\n 'zhuō jué': ['穱'],\r\n 'cuán zàn': ['穳'],\r\n 'kōng kòng kǒng': ['空'],\r\n 'yū yǔ': ['穻'],\r\n zhǎi: ['窄', '鉙'],\r\n báo: ['窇', '雹'],\r\n 'kū zhú': ['窋'],\r\n 'jiào liáo liù': ['窌'],\r\n 'wā guī': ['窐'],\r\n 'tiǎo yáo': ['窕'],\r\n 'xūn yìn': ['窨'],\r\n 'yà yē': ['窫'],\r\n 'tián diān yǎn': ['窴'],\r\n 'chāo kē': ['窼'],\r\n 'kuǎn cuàn': ['窽', '窾'],\r\n 'chù qì': ['竐'],\r\n 'qǔ kǒu': ['竘'],\r\n 'jìng zhěn': ['竧'],\r\n 'kǎn kàn': ['竷'],\r\n 'zhú dǔ': ['竺'],\r\n 'lè jīn': ['竻'],\r\n 'zhuì ruì': ['笍'],\r\n 'háng hàng': ['笐'],\r\n 'cén jìn hán': ['笒'],\r\n 'dā xiá nà': ['笚'],\r\n 'zé zuó': ['笮'],\r\n 'lóng lǒng': ['笼', '篭', '籠', '躘', '龓'],\r\n 'zhù zhú': ['筑', '築'],\r\n 'dá dā': ['答', '荅'],\r\n shāi: ['筛', '篩', '簁', '籭'],\r\n 'yún jūn': ['筠'],\r\n 'láng làng': ['筤', '郎', '阆'],\r\n 'zhì zhǐ': ['筫'],\r\n o: ['筽'],\r\n 'póu bù fú pú': ['箁'],\r\n 'pái bēi': ['箄'],\r\n gè: ['箇', '虼', '鉻', '铬'],\r\n 'tái chí': ['箈'],\r\n 'guǎi dài': ['箉'],\r\n 'zhào dào': ['箌'],\r\n 'jīng qìng': ['箐'],\r\n 'lín lǐn': ['箖'],\r\n 'jùn qūn': ['箘'],\r\n 'shī yí': ['箷', '釶'],\r\n 'yuē yào chuò': ['箹'],\r\n 'xiāo shuò qiào': ['箾'],\r\n 'gōng gǎn lǒng': ['篢'],\r\n 'páng péng': ['篣'],\r\n 'zhuó huò': ['篧'],\r\n 'jiǎn jiān': ['篯'],\r\n 'dí zhú': ['篴'],\r\n 'zān cēn cǎn': ['篸'],\r\n 'zhuàn suǎn zuàn': ['篹'],\r\n 'piǎo biāo': ['篻'],\r\n 'guó guì': ['簂'],\r\n 'cè jí': ['簎'],\r\n 'mì miè': ['簚'],\r\n 'shāi sī': ['簛'],\r\n 'sǔn zhuàn': ['簨'],\r\n 'gàn gǎn': ['簳'],\r\n 'bò bǒ': ['簸'],\r\n 'bó bù': ['簿'],\r\n shi: ['籂'],\r\n 'zhēn jiān': ['籈'],\r\n 'zhuàn zuǎn': ['籑'],\r\n 'fān pān biān': ['籓'],\r\n 'sǒu shǔ': ['籔'],\r\n zuǎn: ['籫', '繤', '纂', '纉', '纘', '缵'],\r\n nǚ: ['籹', '釹', '钕'],\r\n 'shā chǎo': ['粆'],\r\n 'kāng jīng': ['粇'],\r\n fěn: ['粉', '黺'],\r\n cū: ['粗', '觕', '麁', '麄', '麤'],\r\n 'nián zhān': ['粘'],\r\n 'cè sè': ['粣'],\r\n 'zhōu yù': ['粥'],\r\n 'shēn sǎn': ['糁'],\r\n 'biān biǎn': ['糄', '萹'],\r\n miàn: ['糆', '面', '靣', '麪', '麫', '麵', '麺'],\r\n 'hú hū hù': ['糊'],\r\n 'gǔ gòu': ['糓'],\r\n 'mí méi': ['糜'],\r\n 'sǎn shēn': ['糝', '糣'],\r\n zāo: ['糟', '蹧', '遭', '醩'],\r\n 'mì sī': ['糸'],\r\n 'jiū jiǔ': ['糺'],\r\n 'xì jì': ['系', '繫'],\r\n 'zhēng zhěng': ['糽'],\r\n 'chà chǎ': ['紁', '衩'],\r\n 'yuē yāo': ['約', '约'],\r\n 'hóng gōng': ['紅', '红'],\r\n 'hé gē': ['紇', '纥'],\r\n 'wén wèn': ['紋', '纹'],\r\n fóu: ['紑'],\r\n 'jì jié jiè': ['紒'],\r\n 'pī pí bǐ': ['紕', '纰'],\r\n 'jīn jìn': ['紟'],\r\n 'zhā zā': ['紥', '紮'],\r\n hā: ['紦'],\r\n 'fū fù': ['紨'],\r\n 'chōu chóu': ['紬'],\r\n 'lèi léi lěi': ['累'],\r\n 'bō bì': ['紴'],\r\n 'tiǎn zhěn': ['紾'],\r\n 'jiōng jiǒng': ['絅'],\r\n 'jié jiē': ['結', '结', '节'],\r\n 'guà kuā': ['絓'],\r\n 'bǎi mò': ['絔'],\r\n 'gēng huán': ['絙'],\r\n 'jié xié': ['絜'],\r\n 'quán shuān': ['絟'],\r\n 'gǎi ǎi': ['絠'],\r\n 'luò lào': ['絡', '络'],\r\n 'bīng bēng pēng': ['絣'],\r\n 'gěi jǐ': ['給', '给'],\r\n 'tóng tōng dòng': ['絧'],\r\n 'tiào diào dào': ['絩'],\r\n 'lěi lèi léi': ['絫'],\r\n 'gāi hài': ['絯'],\r\n 'chī zhǐ': ['絺'],\r\n 'wèn miǎn mán wàn': ['絻'],\r\n 'huán huàn wàn': ['綄'],\r\n 'qīn xiān': ['綅'],\r\n 'tì tí': ['綈'],\r\n 'yán xiàn': ['綖'],\r\n 'zōng zèng zòng': ['綜'],\r\n 'chēn lín': ['綝'],\r\n 'zhǔn zhùn': ['綧'],\r\n 'qiàn qīng zhēng': ['綪'],\r\n 'qìng qǐ': ['綮'],\r\n 'lún guān': ['綸', '纶'],\r\n 'chuò chāo': ['綽', '绰'],\r\n 'tián tǎn chān': ['緂'],\r\n 'lǜ lù': ['緑', '绿'],\r\n 'ruǎn ruàn': ['緛'],\r\n 'jí qī': ['緝'],\r\n 'zhòng chóng': ['緟', '重'],\r\n 'miáo máo': ['緢'],\r\n 'xiè yè': ['緤'],\r\n huǎn: ['緩', '缓', '㬊'],\r\n 'gēng gèng': ['緪', '縆'],\r\n 'tōu xū shū': ['緰'],\r\n 'zōng zòng': ['緵', '繌'],\r\n 'yùn gǔn': ['緷'],\r\n 'guā wō': ['緺'],\r\n 'yùn yūn wēn': ['緼', '縕'],\r\n 'bāng bàng': ['縍'],\r\n 'gǔ hú': ['縎', '鶻'],\r\n 'cī cuò suǒ': ['縒'],\r\n 'cuī shuāi': ['縗'],\r\n 'róng rǒng ròng': ['縙'],\r\n 'zài zēng': ['縡'],\r\n cài: ['縩', '菜', '蔡'],\r\n 'féng fèng': ['縫'],\r\n 'suō sù': ['縮', '缩'],\r\n 'yǎn yǐn': ['縯', '酓'],\r\n 'zòng zǒng': ['縱', '纵'],\r\n 'zhuàn juàn': ['縳'],\r\n 'mò mù': ['縸', '莫'],\r\n 'piǎo piāo': ['縹', '缥'],\r\n 'fán pó': ['繁'],\r\n 'bēng bèng': ['繃'],\r\n 'móu miù miào liǎo': ['繆'],\r\n 'yáo yóu zhòu': ['繇'],\r\n 'zēng zèng': ['繒', '缯'],\r\n 'jú jué': ['繘'],\r\n 'chuō chuò': ['繛'],\r\n 'zūn zǔn': ['繜'],\r\n rào: ['繞', '绕', '遶'],\r\n 'chǎn chán': ['繟'],\r\n 'huì huí': ['繢', '缋', '藱'],\r\n 'qiāo sāo zǎo': ['繰'],\r\n 'jiǎo zhuó': ['繳', '缴'],\r\n 'dàn tán chán': ['繵'],\r\n nǒng: ['繷'],\r\n 'pú fú': ['纀'],\r\n 'yào lì': ['纅'],\r\n 'rǎng xiāng': ['纕'],\r\n 'lí sǎ xǐ lǐ': ['纚'],\r\n 'xiān qiàn': ['纤'],\r\n 'jīng jìng': ['经'],\r\n 'tí tì': ['绨'],\r\n 'bēng běng bèng': ['绷'],\r\n 'zōng zèng': ['综'],\r\n 'jī qī': ['缉'],\r\n 'wēn yùn yūn': ['缊'],\r\n 'fèng féng': ['缝'],\r\n 'shuāi cuī suī': ['缞'],\r\n 'miù móu liáo miào mù': ['缪'],\r\n 'qiāo sāo': ['缲'],\r\n fǒu: ['缶', '缹', '缻', '雬', '鴀'],\r\n 'bà ba pí': ['罢', '罷'],\r\n 'guà guǎi': ['罫'],\r\n 'yáng xiáng': ['羊', '羏'],\r\n 'měi gāo': ['羙'],\r\n 'yì xī': ['羛'],\r\n 'qiǎng qiān': ['羟'],\r\n 'qiāng kòng': ['羫'],\r\n 'qián xián yán': ['羬'],\r\n nóu: ['羺'],\r\n 'hóng gòng': ['羾'],\r\n 'pī bì pō': ['翍'],\r\n 'qú yù': ['翑'],\r\n ké: ['翗'],\r\n 'qiào qiáo': ['翘'],\r\n 'zhái dí': ['翟'],\r\n 'dào zhōu': ['翢'],\r\n 'hóu qú': ['翵'],\r\n shuǎ: ['耍'],\r\n 'ruǎn nuò': ['耎'],\r\n 'ér nài': ['耏'],\r\n 'zhuān duān': ['耑'],\r\n 'pá bà': ['耙'],\r\n 'chí sì': ['耛'],\r\n 'qù chú': ['耝'],\r\n 'lún lǔn': ['耣'],\r\n 'jí jiè': ['耤'],\r\n 'tāng tǎng': ['耥'],\r\n pǎng: ['耪', '覫'],\r\n 'zhá zé': ['耫'],\r\n 'yē yé': ['耶'],\r\n 'yún yíng': ['耺'],\r\n 'wà tuǐ zhuó': ['聉'],\r\n 'ér nǜ': ['聏'],\r\n 'tiē zhé': ['聑'],\r\n 'dǐ zhì': ['聜'],\r\n qié: ['聺'],\r\n 'nǐ jiàn': ['聻'],\r\n 'lèi lē': ['肋'],\r\n cào: ['肏', '襙', '鄵', '鼜'],\r\n 'bó dí': ['肑'],\r\n 'xiào xiāo': ['肖'],\r\n 'dù dǔ': ['肚'],\r\n chāi: ['肞', '釵', '钗'],\r\n 'hán qín hàn': ['肣'],\r\n 'pàng pán pàn': ['肨', '胖'],\r\n 'zhūn chún': ['肫'],\r\n āng: ['肮', '骯'],\r\n 'yù yō': ['育'],\r\n 'pí bǐ bì': ['肶'],\r\n 'fèi bì': ['胇'],\r\n 'bèi bēi': ['背'],\r\n 'fèi zǐ': ['胏'],\r\n 'píng pēng': ['胓', '苹'],\r\n 'fū fú zhǒu': ['胕'],\r\n 'shèng shēng': ['胜'],\r\n kuà: ['胯', '跨', '骻'],\r\n 'gǎi hǎi': ['胲'],\r\n 'gē gé gā': ['胳'],\r\n 'néng nài': ['能'],\r\n 'guī kuì': ['胿'],\r\n 'mài mò': ['脉'],\r\n 'zāng zàng': ['脏'],\r\n 'jiǎo jué': ['脚', '角'],\r\n cuǒ: ['脞'],\r\n 'de te': ['脦'],\r\n 'zuī juān': ['脧'],\r\n něi: ['脮', '腇', '餒', '馁', '鮾', '鯘'],\r\n 'pú fǔ': ['脯'],\r\n niào: ['脲'],\r\n shuí: ['脽'],\r\n guò: ['腂', '過', '鐹'],\r\n 'là xī': ['腊'],\r\n 'yān ā': ['腌'],\r\n 'gāo gào': ['膏'],\r\n 'lù biāo': ['膔'],\r\n chuái: ['膗'],\r\n 'zhuān chuán chún zhuǎn': ['膞'],\r\n chuài: ['膪', '踹'],\r\n 'fán pán': ['膰'],\r\n 'wǔ hū': ['膴'],\r\n 'shān dàn': ['膻'],\r\n tún: ['臀', '臋', '蛌', '豘', '豚', '軘', '霕', '飩', '饨', '魨', '鲀', '黗'],\r\n 'bì bei': ['臂'],\r\n 'là gé': ['臈'],\r\n 'sào sāo': ['臊'],\r\n nào: ['臑', '閙', '闹', '鬧'],\r\n 'ní luán': ['臡'],\r\n 'qiān xián': ['臤'],\r\n 'guàng jiǒng': ['臦'],\r\n 'guǎng jiǒng': ['臩'],\r\n 'chòu xiù': ['臭'],\r\n 'mián biān': ['臱'],\r\n 'dié zhí': ['臷'],\r\n 'zhī jìn': ['臸'],\r\n 'shè shě': ['舍'],\r\n pù: ['舖', '舗'],\r\n 'bān bō pán': ['般'],\r\n kuā: ['舿'],\r\n 'gèn gěn': ['艮'],\r\n 'sè shǎi': ['色'],\r\n 'fú bó': ['艴'],\r\n 'jiāo qiú': ['艽'],\r\n 'chāi chā': ['芆'],\r\n 'sháo què': ['芍'],\r\n 'hù xià': ['芐'],\r\n 'zì zǐ': ['芓'],\r\n 'huì hū': ['芔'],\r\n 'tún chūn': ['芚'],\r\n 'jiè gài': ['芥'],\r\n 'xù zhù': ['芧'],\r\n 'yuán yán': ['芫'],\r\n 'xīn xìn': ['芯'],\r\n 'lún huā': ['芲'],\r\n 'wù hū': ['芴'],\r\n 'gōu gǒu': ['芶'],\r\n 'mào máo': ['芼'],\r\n 'fèi fú': ['芾'],\r\n 'chán yín': ['苂'],\r\n qiē: ['苆'],\r\n 'sū sù': ['苏'],\r\n 'tiáo sháo': ['苕'],\r\n 'lì jī': ['苙'],\r\n 'kē hē': ['苛'],\r\n 'jù qǔ': ['苣'],\r\n 'ruò rě': ['若'],\r\n 'zhù níng': ['苧'],\r\n 'pā bó': ['苩'],\r\n xiú: ['苬'],\r\n 'zhǎ zuó': ['苲'],\r\n 'jū chá': ['苴'],\r\n nié: ['苶'],\r\n 'shēng ruí': ['苼'],\r\n 'qié jiā': ['茄'],\r\n 'zǐ cí': ['茈'],\r\n 'qiàn xī': ['茜'],\r\n chǎi: ['茝'],\r\n 'fá pèi': ['茷'],\r\n ráo: ['荛', '蕘', '襓', '饒', '饶'],\r\n 'yíng xíng': ['荥'],\r\n 'qián xún': ['荨', '蕁'],\r\n 'yìn yīn': ['荫'],\r\n 'hé hè': ['荷'],\r\n 'shā suō': ['莎'],\r\n 'péng fēng': ['莑'],\r\n 'shēn xīn': ['莘'],\r\n 'wǎn guān guǎn': ['莞'],\r\n 'yóu sù': ['莤'],\r\n 'shāo xiāo': ['莦', '蛸'],\r\n 'làng liáng': ['莨'],\r\n 'piǎo fú': ['莩'],\r\n 'wèn wǎn miǎn': ['莬'],\r\n 'shì shí': ['莳', '蒔'],\r\n 'tù tú': ['莵'],\r\n 'xiān liǎn': ['莶', '薟'],\r\n 'wǎn yù': ['菀'],\r\n 'zōu chù': ['菆'],\r\n 'lù lǜ': ['菉'],\r\n 'jūn jùn': ['菌'],\r\n 'niè rěn': ['菍'],\r\n 'zī zì zāi': ['菑'],\r\n 'tú tù': ['菟'],\r\n 'jiē shà': ['菨'],\r\n 'qiáo zhǎo': ['菬'],\r\n 'tái zhī chí': ['菭'],\r\n 'fēi fěi': ['菲', '蜚'],\r\n 'qín qīn jīn': ['菳'],\r\n 'zū jù': ['菹', '蒩'],\r\n 'lǐn má': ['菻'],\r\n 'tián tiàn': ['菾'],\r\n tiē: ['萜', '貼', '贴'],\r\n 'luò là lào luō': ['落'],\r\n 'zhù zhuó zhe': ['著'],\r\n 'shèn rèn': ['葚'],\r\n 'gě gé': ['葛'],\r\n 'jùn suǒ': ['葰'],\r\n 'kuì kuài': ['蒉'],\r\n 'rú ná': ['蒘'],\r\n 'méng mēng měng': ['蒙'],\r\n 'yuán huán': ['蒝'],\r\n 'xú shú': ['蒣'],\r\n 'xí xì': ['蒵'],\r\n 'mì míng': ['蓂'],\r\n 'sōu sǒu': ['蓃'],\r\n 'gài gě hé hài': ['蓋'],\r\n 'yǎo zhuó': ['蓔'],\r\n 'diào tiáo dí': ['蓧'],\r\n 'xū qiū fū': ['蓲'],\r\n 'zí jú': ['蓻'],\r\n 'liǎo lù': ['蓼'],\r\n xu: ['蓿'],\r\n 'hàn hǎn': ['蔊'],\r\n 'màn wàn mán': ['蔓'],\r\n 'pó bò': ['蔢'],\r\n 'fān fán bō': ['蕃'],\r\n 'hóng hòng': ['蕻'],\r\n 'yù ào': ['薁', '隩'],\r\n 'xí xiào': ['薂'],\r\n 'báo bó bò': ['薄'],\r\n 'cí zī': ['薋'],\r\n 'wàn luàn': ['薍'],\r\n 'kǎo hāo': ['薧'],\r\n 'yuǎn wěi': ['薳'],\r\n 'zhòu chóu': ['薵'],\r\n 'wō mái': ['薶'],\r\n 'xiāo hào': ['藃'],\r\n 'yù xù xū': ['藇'],\r\n 'jiè jí': ['藉'],\r\n 'diào zhuó': ['藋'],\r\n 'cáng zàng': ['藏'],\r\n lǎ: ['藞'],\r\n 'chú zhū': ['藸'],\r\n 'pín píng': ['蘋'],\r\n 'gān hán': ['虷'],\r\n 'hóng jiàng': ['虹'],\r\n 'huī huǐ': ['虺'],\r\n 'xiā há': ['虾'],\r\n 'mǎ mà mā': ['蚂'],\r\n 'fāng bàng': ['蚄'],\r\n 'bàng bèng': ['蚌'],\r\n 'jué quē': ['蚗'],\r\n 'qín qián': ['蚙'],\r\n 'gōng zhōng': ['蚣'],\r\n 'fǔ fù': ['蚥'],\r\n 'dài dé': ['蚮'],\r\n 'gǒu qú xù': ['蚼'],\r\n 'bǒ pí': ['蚾'],\r\n 'shé yí': ['蛇'],\r\n tiě: ['蛈', '鉄', '銕', '鐡', '鐵', '铁', '驖'],\r\n 'gé luò': ['蛒'],\r\n 'máng bàng': ['蛖'],\r\n 'yì xǔ': ['蛡'],\r\n 'há gé': ['蛤'],\r\n 'qiè ní': ['蛪'],\r\n 'é yǐ': ['蛾'],\r\n 'zhē zhé': ['蜇'],\r\n 'là zhà': ['蜡'],\r\n suò: ['蜶', '逤'],\r\n 'yóu qiú': ['蝤'],\r\n 'xiā hā': ['蝦'],\r\n 'xī qī': ['螇'],\r\n 'bī pí': ['螕'],\r\n 'nài něng': ['螚'],\r\n 'hé xiá': ['螛'],\r\n 'guì huǐ': ['螝'],\r\n 'mǎ mā mà': ['螞'],\r\n 'shì zhē': ['螫'],\r\n 'zhì dié': ['螲'],\r\n 'jiàn chán': ['螹'],\r\n 'ma má mò': ['蟆'],\r\n 'mǎng měng': ['蟒'],\r\n 'biē bié': ['蟞'],\r\n 'bēn fèi': ['蟦'],\r\n 'láo liáo': ['蟧'],\r\n 'yín xún': ['蟫'],\r\n 'lí lǐ': ['蠡'],\r\n 'xuè xiě': ['血'],\r\n 'xíng háng hàng héng': ['行'],\r\n 'shuāi cuī': ['衰'],\r\n 'tuó tuō': ['袉'],\r\n 'lǐng líng': ['袊'],\r\n 'bào páo pào': ['袌'],\r\n 'jù jiē': ['袓'],\r\n 'hè kè': ['袔'],\r\n 'yí yì': ['袘', '貤'],\r\n 'nà jué': ['袦'],\r\n 'bèi pī': ['被'],\r\n 'chǐ nuǒ': ['袲'],\r\n 'chǐ qǐ duǒ nuǒ': ['袳'],\r\n 'jiá qiā jié': ['袷'],\r\n 'bó mò': ['袹'],\r\n 'guī guà': ['袿'],\r\n 'liè liě': ['裂'],\r\n 'chéng chěng': ['裎'],\r\n 'jiē gé': ['裓'],\r\n 'dāo chóu': ['裯'],\r\n 'shang cháng': ['裳'],\r\n 'yuān gǔn': ['裷'],\r\n 'yǎn ān': ['裺'],\r\n 'tì xī': ['裼'],\r\n 'fù fú': ['褔'],\r\n 'chǔ zhǔ': ['褚'],\r\n 'tuì tùn': ['褪'],\r\n lǎi: ['襰'],\r\n 'yào yāo': ['要'],\r\n 'qín tán': ['覃'],\r\n 'jiàn xiàn': ['見', '见'],\r\n piǎn: ['覑', '諞', '谝', '貵', '𡎚'],\r\n 'piē miè': ['覕'],\r\n 'yíng yǐng': ['覮'],\r\n 'qù qū': ['覰', '覷', '觑'],\r\n 'jiàn biǎn': ['覵'],\r\n 'luó luǎn': ['覶'],\r\n 'zī zuǐ': ['觜'],\r\n 'huà xiè': ['觟'],\r\n 'jiě jiè xiè': ['解', '觧'],\r\n 'xué hù': ['觷'],\r\n 'lì lù': ['觻'],\r\n tǎo: ['討', '讨'],\r\n zhùn: ['訰'],\r\n 'zī zǐ': ['訾'],\r\n 'yí dài': ['詒', '诒'],\r\n xiòng: ['詗', '诇'],\r\n 'diào tiǎo': ['誂'],\r\n 'yí chǐ chì': ['誃'],\r\n 'lǎng làng': ['誏'],\r\n 'ēi éi ěi èi xī': ['誒', '诶'],\r\n shuà: ['誜'],\r\n 'yǔ yù': ['語', '语', '雨'],\r\n 'shuō shuì yuè': ['說', '说'],\r\n 'shuí shéi': ['誰', '谁'],\r\n 'qū juè': ['誳'],\r\n 'chī lài': ['誺'],\r\n 'nì ná': ['誽'],\r\n 'diào tiáo': ['調'],\r\n 'pǐ bēi': ['諀'],\r\n 'jì jī': ['諅'],\r\n 'zé zuò zhǎ cuò': ['諎'],\r\n 'chù jí': ['諔'],\r\n 'háo xià': ['諕'],\r\n 'lùn lún': ['論', '论'],\r\n 'shì dì': ['諟'],\r\n 'huà guā': ['諣'],\r\n 'xǐ shāi āi': ['諰'],\r\n 'nán nàn': ['諵', '難'],\r\n miù: ['謬', '谬'],\r\n zèn: ['譖', '谮'],\r\n 'shí zhì': ['識', '识'],\r\n 'juàn xuān': ['讂'],\r\n 'yí tuī': ['讉'],\r\n zhán: ['讝'],\r\n 'xǔ hǔ': ['许'],\r\n 'xiáng yáng': ['详'],\r\n 'tiáo diào zhōu': ['调'],\r\n 'chén shèn': ['谌'],\r\n 'mí mèi': ['谜'],\r\n 'màn mán': ['谩'],\r\n 'gǔ yù': ['谷'],\r\n 'huō huò huá': ['豁'],\r\n 'zhì zhài': ['豸'],\r\n 'huān huán': ['貆'],\r\n 'kěn kūn': ['貇'],\r\n 'mò hé': ['貈'],\r\n 'mò hé háo': ['貉'],\r\n 'jù lóu': ['貗'],\r\n 'zé zhài': ['責', '责'],\r\n 'dài tè': ['貸'],\r\n 'bì bēn': ['賁'],\r\n 'jiǎ gǔ jià': ['賈'],\r\n 'xiōng mín': ['賯'],\r\n càng: ['賶'],\r\n 'zhuàn zuàn': ['賺', '赚'],\r\n 'wàn zhuàn': ['贃'],\r\n 'gàn gòng zhuàng': ['贛'],\r\n 'yuán yùn': ['贠'],\r\n 'bēn bì': ['贲'],\r\n 'jiǎ gǔ': ['贾'],\r\n zǒu: ['走', '赱', '鯐'],\r\n 'dié tú': ['趃'],\r\n 'jū qiè': ['趄'],\r\n 'qū cù': ['趋', '趨'],\r\n 'jí jié': ['趌'],\r\n 'guā huó': ['趏'],\r\n 'què qì jí': ['趞'],\r\n 'tàng tāng': ['趟'],\r\n 'chuō zhuó': ['趠'],\r\n 'qù cù': ['趣'],\r\n 'yuè tì': ['趯'],\r\n 'bō bào': ['趵'],\r\n 'kuà wù': ['趶'],\r\n 'guì jué': ['趹'],\r\n 'fāng fàng páng': ['趽'],\r\n 'páo bà': ['跁'],\r\n 'qí qǐ': ['跂'],\r\n 'jiàn chén': ['跈'],\r\n 'pǎo páo': ['跑'],\r\n 'diǎn diē tiē': ['跕'],\r\n 'jū jù qiè': ['跙'],\r\n bǒ: ['跛'],\r\n 'luò lì': ['跞'],\r\n 'dài duò duō chí': ['跢'],\r\n zhuǎi: ['跩'],\r\n 'bèng pián': ['跰'],\r\n 'tiào táo': ['跳'],\r\n 'shū chōu': ['跾'],\r\n 'liàng liáng': ['踉'],\r\n 'tà tā': ['踏'],\r\n chǎ: ['蹅', '鑔', '镲'],\r\n 'dí zhí': ['蹢'],\r\n 'dēng dèng': ['蹬', '鐙', '镫'],\r\n cèng: ['蹭'],\r\n 'dūn cún': ['蹲'],\r\n 'juě jué': ['蹶'],\r\n liāo: ['蹽'],\r\n 'xiè sǎ': ['躠'],\r\n tǐ: ['躰', '軆', '骵'],\r\n 'yà zhá gá': ['轧', '軋'],\r\n 'xìn xiàn': ['軐'],\r\n 'fàn guǐ': ['軓'],\r\n 'zhuàn zhuǎn': ['転'],\r\n 'zhóu zhòu': ['軸', '轴'],\r\n bú: ['轐', '醭', '鳪'],\r\n 'zhuǎn zhuàn zhuǎi': ['转'],\r\n 'zǎi zài': ['载'],\r\n 'niǎn zhǎn': ['辗'],\r\n 'biān bian': ['边'],\r\n 'dào biān': ['辺'],\r\n 'yǐ yí': ['迆', '迤', '迱'],\r\n 'guò guo guō': ['过'],\r\n 'wàng kuāng': ['迋'],\r\n 'hái huán': ['还'],\r\n 'zhè zhèi': ['这'],\r\n 'yuǎn yuàn': ['远'],\r\n 'zhì lì': ['迣'],\r\n 'zhù wǎng': ['迬'],\r\n 'zhuī duī': ['追'],\r\n 'shì kuò': ['适'],\r\n tòu: ['透'],\r\n 'tōng tòng': ['通'],\r\n guàng: ['逛'],\r\n 'dǎi dài': ['逮'],\r\n 'suì suí': ['遂'],\r\n 'tí dì': ['遆'],\r\n 'yí wèi': ['遗'],\r\n 'shì dí zhé': ['適'],\r\n cà: ['遪'],\r\n 'huán hái': ['還'],\r\n 'lí chí': ['邌'],\r\n 'kàng háng': ['邟'],\r\n 'nà nèi nā': ['那'],\r\n 'xié yá yé yú xú': ['邪'],\r\n 'gāi hái': ['郂'],\r\n 'huán xún': ['郇'],\r\n 'chī xī': ['郗'],\r\n hǎo: ['郝'],\r\n 'lì zhí': ['郦'],\r\n 'xiáo ǎo': ['郩'],\r\n 'dōu dū': ['都'],\r\n liǎo: ['曢', '鄝', '镽'],\r\n 'zàn cuán cuó': ['酂', '酇'],\r\n 'dīng dǐng': ['酊'],\r\n 'cù zuò': ['酢'],\r\n 'fā pō': ['酦'],\r\n 'shāi shī': ['酾'],\r\n niàng: ['酿', '醸'],\r\n 'qiú chōu': ['醔'],\r\n 'pō fā': ['醗', '醱'],\r\n 'chǎn chěn': ['醦'],\r\n 'yàn liǎn xiān': ['醶'],\r\n 'niàng niáng': ['釀'],\r\n 'lǐ li': ['里'],\r\n 'lí xǐ xī': ['釐'],\r\n 'liǎo liào': ['釕'],\r\n 'dīng dìng': ['釘', '钉'],\r\n 'qiǎo jiǎo': ['釥'],\r\n 'yú huá': ['釪'],\r\n 'huá wū': ['釫'],\r\n 'rì rèn jiàn': ['釰', '釼'],\r\n 'dì dài': ['釱'],\r\n 'pī zhāo': ['釽'],\r\n 'yá yé': ['釾'],\r\n 'bǎ pá': ['鈀', '钯'],\r\n 'tā tuó': ['鉈', '铊'],\r\n běi: ['鉳'],\r\n 'bǐng píng': ['鉼'],\r\n 'hā kē': ['鉿', '铪'],\r\n chòng: ['銃', '铳'],\r\n 'xiǎng jiōng': ['銄'],\r\n 'yù sì': ['銉'],\r\n 'xù huì': ['銊'],\r\n 'rén rěn': ['銋'],\r\n 'shàn shuò': ['銏'],\r\n 'chì lì': ['銐'],\r\n 'xiǎn xǐ': ['銑', '铣'],\r\n 'hóu xiàng': ['銗'],\r\n 'diào tiáo yáo': ['銚'],\r\n 'xiān kuò tiǎn guā': ['銛', '銽', '铦'],\r\n 'zhé niè': ['銸'],\r\n 'zhōng yōng': ['銿'],\r\n 'tōu tù dòu': ['鋀'],\r\n 'méi méng': ['鋂'],\r\n 'wàn jiǎn': ['鋄', '鎫'],\r\n 'tǐng dìng': ['鋌', '铤'],\r\n 'juān jiān cuān': ['鋑'],\r\n 'sī tuó': ['鋖'],\r\n 'juān xuān juàn': ['鋗'],\r\n 'wú huá wū': ['鋘'],\r\n 'zhuó chuò': ['鋜'],\r\n 'xíng xìng jīng': ['鋞'],\r\n 'jū jú': ['鋦', '锔'],\r\n 'zuì niè': ['鋷'],\r\n 'yuān yuǎn wǎn wān': ['鋺'],\r\n 'gāng gàng': ['鋼', '钢'],\r\n zhuī: ['錐', '锥', '騅', '骓', '鵻'],\r\n ā: ['錒', '锕'],\r\n 'cuō chā': ['鎈'],\r\n 'suǒ sè': ['鎍'],\r\n 'yáo zú': ['鎐'],\r\n 'yè tà gé': ['鎑'],\r\n 'qiāng chēng': ['鎗'],\r\n 'gé lì': ['鎘', '镉', '鬲'],\r\n 'bī pī bì': ['鎞'],\r\n 'gǎo hào': ['鎬'],\r\n 'zú chuò': ['鏃'],\r\n 'xiū xiù': ['鏅'],\r\n 'shòu sōu': ['鏉'],\r\n 'dí dī': ['鏑', '镝'],\r\n 'qiāo sǎn càn': ['鏒'],\r\n 'lù áo': ['鏕'],\r\n 'tāng táng': ['鏜'],\r\n 'jiàn zàn': ['鏩'],\r\n 'huì suì ruì': ['鏸'],\r\n 'qiǎng qiāng': ['鏹', '镪'],\r\n 'sǎn xiàn sà': ['鏾'],\r\n 'jiǎn jiàn': ['鐧', '锏'],\r\n 'dāng chēng': ['鐺', '铛'],\r\n 'zuān zuàn': ['鑽'],\r\n 'sà xì': ['钑'],\r\n 'yào yuè': ['钥'],\r\n 'tǒu dǒu': ['钭'],\r\n 'zuàn zuān': ['钻'],\r\n 'qiān yán': ['铅'],\r\n 'pí pī': ['铍'],\r\n 'yáo diào tiáo': ['铫'],\r\n 'tāng tàng': ['铴'],\r\n 'pù pū': ['铺'],\r\n 'tán xiān': ['锬'],\r\n 'liù liú': ['镏'],\r\n 'hào gǎo': ['镐'],\r\n 'táng tāng': ['镗'],\r\n 'tán chán xín': ['镡'],\r\n 'huò shǎn': ['閄'],\r\n 'hàn bì': ['閈', '闬'],\r\n 'kāng kàng': ['閌', '闶'],\r\n 'xián jiàn jiān jiǎn': ['閒'],\r\n 'xiā xiǎ': ['閕'],\r\n 'xiǎ kě': ['閜'],\r\n 'biàn guān': ['閞'],\r\n 'hé gé': ['閤', '颌'],\r\n 'hòng xiàng': ['閧'],\r\n 'sē xī': ['閪'],\r\n 'tíng tǐng': ['閮'],\r\n 'è yān': ['閼', '阏'],\r\n 'hòng juǎn xiàng': ['闂'],\r\n 'bǎn pàn': ['闆'],\r\n 'dū shé': ['闍', '阇'],\r\n 'què quē': ['闕'],\r\n 'tāng táng chāng': ['闛'],\r\n 'kàn hǎn': ['闞', '阚'],\r\n 'xì sè tà': ['闟'],\r\n 'mēn mèn': ['闷'],\r\n 'quē què': ['阙'],\r\n 'yán diàn': ['阽'],\r\n 'ā ē': ['阿'],\r\n 'bēi pō pí': ['陂'],\r\n 'yàn yǎn': ['隁'],\r\n 'yú yáo shù': ['隃'],\r\n 'lóng lōng': ['隆'],\r\n 'duì zhuì': ['隊'],\r\n 'suí duò': ['隋'],\r\n 'gāi qí ái': ['隑'],\r\n 'huī duò': ['隓', '隳'],\r\n 'wěi kuí': ['隗'],\r\n 'lì dài': ['隸'],\r\n 'zhuī cuī wéi': ['隹'],\r\n 'hè hú': ['隺', '鶮'],\r\n 'jùn juàn': ['隽', '雋'],\r\n 'nán nàn nuó': ['难'],\r\n 'què qiāo qiǎo': ['雀'],\r\n 'guàn huán': ['雚'],\r\n 'guī xī': ['雟'],\r\n 'sè xí': ['雭'],\r\n án: ['雸'],\r\n 'wù méng': ['雺'],\r\n tèng: ['霯'],\r\n 'lù lòu': ['露'],\r\n mái: ['霾'],\r\n 'jìng liàng': ['靚'],\r\n 'gé jí': ['革'],\r\n bǎ: ['靶'],\r\n 'yāng yàng': ['鞅'],\r\n 'gé tà sǎ': ['鞈'],\r\n 'biān yìng': ['鞕'],\r\n 'qiào shāo': ['鞘'],\r\n 'juān xuān': ['鞙'],\r\n 'shàng zhǎng': ['鞝'],\r\n 'pí bǐng bì bēi': ['鞞'],\r\n la: ['鞡'],\r\n 'xiè dié': ['鞢'],\r\n ēng: ['鞥'],\r\n 'móu mù': ['鞪'],\r\n 'bì bǐng': ['鞸'],\r\n 'mèi wà': ['韎'],\r\n rǒu: ['韖'],\r\n 'shè xiè': ['韘'],\r\n 'yùn wēn': ['韫'],\r\n 'dùn dú': ['頓', '顿'],\r\n duǐ: ['頧'],\r\n luō: ['頱'],\r\n 'bīn pín': ['頻'],\r\n yóng: ['顒', '颙', '鰫'],\r\n mān: ['顢', '颟'],\r\n 'jǐng gěng': ['颈'],\r\n 'jié xié jiá': ['颉'],\r\n 'kē ké': ['颏'],\r\n 'pín bīn': ['频'],\r\n 'chàn zhàn': ['颤'],\r\n 'fēng fěng': ['風', '风'],\r\n 'biāo diū': ['颩'],\r\n 'bá fú': ['颰'],\r\n 'sāo sōu': ['颾'],\r\n 'liù liáo': ['飂'],\r\n 'shí sì yì': ['食'],\r\n 'yǎng juàn': ['飬'],\r\n 'zhù tǒu': ['飳'],\r\n 'yí sì': ['飴'],\r\n 'zuò zé zhā': ['飵'],\r\n tiè: ['飻', '餮'],\r\n 'xiǎng náng': ['饟'],\r\n 'táng xíng': ['饧'],\r\n 'gē le': ['饹'],\r\n 'chā zha': ['馇'],\r\n 'náng nǎng': ['馕'],\r\n 'yūn wò': ['馧'],\r\n 'zhī shì': ['馶'],\r\n 'xìn jìn': ['馸'],\r\n 'kuài jué': ['駃'],\r\n zǎng: ['駔', '驵'],\r\n 'tái dài': ['駘'],\r\n 'xún xuān': ['駨'],\r\n 'liáng láng': ['駺'],\r\n piàn: ['騗', '騙', '骗', '魸'],\r\n 'dài tái': ['骀'],\r\n 'sāo sǎo': ['骚'],\r\n 'gǔ gū': ['骨'],\r\n 'bèi mó': ['骳'],\r\n 'xiāo qiāo': ['骹'],\r\n 'bǎng pǎng': ['髈'],\r\n 'bó jué': ['髉'],\r\n 'bì pǒ': ['髲'],\r\n 'máo méng': ['髳'],\r\n 'kuò yuè': ['髺'],\r\n 'bā bà': ['魞', '鲃'],\r\n 'jì cǐ': ['鮆'],\r\n 'bó bà': ['鮊'],\r\n 'zhǎ zhà': ['鮓', '鲊'],\r\n 'chóu dài': ['鮘'],\r\n 'luò gé': ['鮥'],\r\n 'guī xié wā kuí': ['鮭'],\r\n 'xiān xiǎn': ['鮮', '鲜'],\r\n 'pū bū': ['鯆'],\r\n 'yì sī': ['鯣'],\r\n 'bà bó': ['鲌'],\r\n 'guī xié': ['鲑'],\r\n 'sāi xǐ': ['鳃'],\r\n 'niǎo diǎo': ['鳥'],\r\n 'diāo zhāo': ['鳭'],\r\n 'gān hàn yàn': ['鳱'],\r\n 'fū guī': ['鳺'],\r\n 'jiān qiān zhān': ['鳽'],\r\n 'hé jiè': ['鶡'],\r\n 'piān biǎn': ['鶣'],\r\n 'chuàn zhì': ['鶨'],\r\n 'cāng qiāng': ['鶬'],\r\n 'sǔn xùn': ['鶽'],\r\n 'biāo páo': ['麃'],\r\n 'zhù cū': ['麆'],\r\n 'jūn qún': ['麇', '麕'],\r\n chi: ['麶'],\r\n 'mó me': ['麼'],\r\n 'mó me ma': ['麽'],\r\n 'mí mǒ': ['麿'],\r\n 'dàn shèn': ['黮'],\r\n 'zhěn yān': ['黰'],\r\n 'dǎn zhǎn': ['黵'],\r\n 'miǎn mǐn měng': ['黾'],\r\n hōu: ['齁'],\r\n nàng: ['齉'],\r\n 'qí jì zī zhāi': ['齐'],\r\n 'yín kěn yǎn': ['龂'],\r\n 'yín kěn': ['龈'],\r\n 'gōng wò': ['龏'],\r\n 'guī jūn qiū': ['龜', '龟'],\r\n 'kuí wā': ['䖯'],\r\n lōu: ['䁖'],\r\n 'ōu qū': ['𫭟'],\r\n 'lóu lǘ': ['𦝼'],\r\n 'gǎ gā gá': ['嘎'],\r\n 'wā guà': ['坬'],\r\n 'zhǐ dǐ': ['茋'],\r\n 'gǒng hóng': ['硔'],\r\n 'yáo xiào': ['滧'],\r\n};\r\nconst DICT1 = new FastDictFactory();\r\nObject.keys(map).forEach((key) => {\r\n const chars = map[key];\r\n for (let char of chars) {\r\n DICT1.set(char, key);\r\n }\r\n});\n\nexport { DICT1 as default };\n","import { Priority } from '../common/constant.mjs';\n\nconst DICT2 = {\r\n 这个: 'zhè ge',\r\n 成为: 'chéng wéi',\r\n 认为: 'rèn wéi',\r\n 作为: 'zuò wéi',\r\n 部分: 'bù fen',\r\n 要求: 'yāo qiú',\r\n 应该: 'yīng gāi',\r\n 增长: 'zēng zhǎng',\r\n 提供: 'tí gōng',\r\n 觉得: 'jué de',\r\n 任务: 'rèn wu',\r\n 那个: 'nà ge',\r\n 称为: 'chēng wéi',\r\n 为主: 'wéi zhǔ',\r\n 了解: 'liǎo jiě',\r\n 处理: 'chǔ lǐ',\r\n 皇上: 'huáng shang',\r\n 只要: 'zhǐ yào',\r\n 大量: 'dà liàng',\r\n 力量: 'lì liàng',\r\n 几乎: 'jī hū',\r\n 干部: 'gàn bù',\r\n 目的: 'mù dì',\r\n 行为: 'xíng wéi',\r\n 只见: 'zhǐ jiàn',\r\n 认识: 'rèn shi',\r\n 市长: 'shì zhǎng',\r\n 师父: 'shī fu',\r\n 调查: 'diào chá',\r\n 重新: 'chóng xīn',\r\n 分为: 'fēn wéi',\r\n 知识: 'zhī shi',\r\n 导弹: 'dǎo dàn',\r\n 质量: 'zhì liàng',\r\n 行款: 'háng kuǎn',\r\n 行列: 'háng liè',\r\n 行话: 'háng huà',\r\n 行业: 'háng yè',\r\n 隔行: 'gé háng',\r\n 在行: 'zài háng',\r\n 行家: 'háng jia',\r\n 内行: 'nèi háng',\r\n 外行: 'wài háng',\r\n 同行: 'tóng háng',\r\n 本行: 'běn háng',\r\n 行伍: 'háng wǔ',\r\n 洋行: 'yáng háng',\r\n 银行: 'yín háng',\r\n 商行: 'shāng háng',\r\n 支行: 'zhī háng',\r\n 总行: 'zǒng háng',\r\n 行情: 'háng qíng',\r\n 懂行: 'dǒng háng',\r\n 行规: 'háng guī',\r\n 行当: 'háng dang',\r\n 行货: 'háng huò',\r\n 太行: 'tài háng',\r\n 入行: 'rù háng',\r\n 中行: 'zhōng háng',\r\n 农行: 'nóng háng',\r\n 工行: 'gōng háng',\r\n 建行: 'jiàn háng',\r\n 各行: \"gè háng\",\r\n 行号: 'háng hào',\r\n 行高: 'háng gāo',\r\n 行首: 'háng shǒu',\r\n 行尾: 'háng wěi',\r\n 行末: 'háng mò',\r\n 行长: 'háng zhǎng',\r\n 行距: 'háng jù',\r\n 换行: 'huàn háng',\r\n 行会: 'háng huì',\r\n 行辈: 'háng bèi',\r\n 行道: 'háng dào',\r\n 道行: 'dào heng',\r\n 参与: 'cān yù',\r\n 充分: 'chōng fèn',\r\n 尽管: 'jǐn guǎn',\r\n 生长: 'shēng zhǎng',\r\n 数量: 'shù liàng',\r\n 应当: 'yīng dāng',\r\n 院长: 'yuàn zhǎng',\r\n 强调: 'qiáng diào',\r\n 只能: 'zhǐ néng',\r\n 音乐: 'yīn yuè',\r\n 以为: 'yǐ wéi',\r\n 处于: 'chǔ yú',\r\n 部长: 'bù zhǎng',\r\n 蒙古: 'měng gǔ',\r\n 只有: 'zhǐ yǒu',\r\n 适当: 'shì dàng',\r\n 只好: 'zhǐ hǎo',\r\n 成长: 'chéng zhǎng',\r\n 高兴: 'gāo xìng',\r\n 不了: 'bù liǎo',\r\n 产量: 'chǎn liàng',\r\n 胖子: 'pàng zi',\r\n 显得: 'xiǎn de',\r\n 只是: 'zhǐ shì',\r\n 似的: 'shì de',\r\n 率领: 'shuài lǐng',\r\n 改为: 'gǎi wéi',\r\n 不禁: 'bù jīn',\r\n 成分: 'chéng fèn',\r\n 答应: 'dā ying',\r\n 少年: 'shào nián',\r\n 兴趣: 'xìng qù',\r\n 太监: 'tài jian',\r\n 休息: 'xiū xi',\r\n 校长: 'xiào zhǎng',\r\n 更新: 'gēng xīn',\r\n 合同: 'hé tong',\r\n 喝道: 'hè dào',\r\n 重庆: 'chóng qìng',\r\n 重建: 'chóng jiàn',\r\n 使得: 'shǐ de',\r\n 审查: 'shěn chá',\r\n 累计: 'lěi jì',\r\n 给予: 'jǐ yǔ',\r\n 极为: 'jí wéi',\r\n 冠军: 'guàn jūn',\r\n 仿佛: 'fǎng fú',\r\n 头发: 'tóu fa',\r\n 投降: 'tóu xiáng',\r\n 家长: 'jiā zhǎng',\r\n 仔细: 'zǐ xì',\r\n 要是: 'yào shi',\r\n 将领: 'jiàng lǐng',\r\n 含量: 'hán liàng',\r\n 更为: 'gèng wéi',\r\n 积累: 'jī lěi',\r\n 地处: 'dì chǔ',\r\n 县长: 'xiàn zhǎng',\r\n 少女: 'shào nǚ',\r\n 路上: 'lù shang',\r\n 只怕: 'zhǐ pà',\r\n 能量: 'néng liàng',\r\n 储量: 'chǔ liàng',\r\n 供应: 'gōng yìng',\r\n 挑战: 'tiǎo zhàn',\r\n 西藏: 'xī zàng',\r\n 记得: 'jì de',\r\n 总量: 'zǒng liàng',\r\n 当真: 'dàng zhēn',\r\n 将士: 'jiàng shì',\r\n 差别: 'chā bié',\r\n 较为: 'jiào wéi',\r\n 长老: 'zhǎng lǎo',\r\n 大夫: 'dài fu',\r\n 差异: 'chā yì',\r\n 懂得: 'dǒng de',\r\n 尽量: 'jǐn liàng',\r\n 模样: 'mú yàng',\r\n 的确: 'dí què',\r\n 为首: 'wéi shǒu',\r\n 便宜: 'pián yi',\r\n 更名: 'gēng míng',\r\n 石头: 'shí tou',\r\n 州长: 'zhōu zhǎng',\r\n 为止: 'wéi zhǐ',\r\n 漂亮: 'piào liang',\r\n 炮弹: 'pào dàn',\r\n 藏族: 'zàng zú',\r\n 角色: 'jué sè',\r\n 当作: 'dàng zuò',\r\n 尽快: 'jǐn kuài',\r\n 人为: 'rén wéi',\r\n 重复: 'chóng fù',\r\n 胡同: 'hú tòng',\r\n 差距: 'chā jù',\r\n 弟兄: 'dì xiong',\r\n 大将: 'dà jiàng',\r\n 睡觉: 'shuì jiào',\r\n 一觉: 'yí jiào',\r\n 团长: 'tuán zhǎng',\r\n 队长: 'duì zhǎng',\r\n 区长: 'qū zhǎng',\r\n 难得: 'nán dé',\r\n 丫头: 'yā tou',\r\n 会长: 'huì zhǎng',\r\n 弟弟: 'dì di',\r\n 王爷: 'wáng ye',\r\n 重量: 'zhòng liàng',\r\n 誉为: 'yù wéi',\r\n 家伙: 'jiā huo',\r\n 华山: 'huà shān',\r\n 椅子: 'yǐ zi',\r\n 流量: 'liú liàng',\r\n 长大: 'zhǎng dà',\r\n 勉强: 'miǎn qiǎng',\r\n 会计: 'kuài jì',\r\n 过分: 'guò fèn',\r\n 济南: 'jǐ nán',\r\n 调动: 'diào dòng',\r\n 燕京: 'yān jīng',\r\n 少将: 'shào jiàng',\r\n 中毒: 'zhòng dú',\r\n 晓得: 'xiǎo de',\r\n 变更: 'biàn gēng',\r\n 打更: 'dǎ gēng',\r\n 认得: 'rèn de',\r\n 苹果: 'píng guǒ',\r\n 念头: 'niàn tou',\r\n 挣扎: 'zhēng zhá',\r\n 三藏: 'sān zàng',\r\n 剥削: 'bō xuē',\r\n 丞相: 'chéng xiàng',\r\n 少量: 'shǎo liàng',\r\n 寻思: 'xún si',\r\n 夺得: 'duó dé',\r\n 干线: 'gàn xiàn',\r\n 呼吁: 'hū yù',\r\n 处罚: 'chǔ fá',\r\n 长官: 'zhǎng guān',\r\n 柏林: 'bó lín',\r\n 亲戚: 'qīn qi',\r\n 身分: 'shēn fèn',\r\n 胳膊: 'gē bo',\r\n 着手: 'zhuó shǒu',\r\n 炸弹: 'zhà dàn',\r\n 咳嗽: 'ké sou',\r\n 叶子: 'yè zi',\r\n 外长: 'wài zhǎng',\r\n 供给: 'gōng jǐ',\r\n 师长: 'shī zhǎng',\r\n 变量: 'biàn liàng',\r\n 应有: 'yīng yǒu',\r\n 下载: 'xià zài',\r\n 乐器: 'yuè qì',\r\n 间接: 'jiàn jiē',\r\n 底下: 'dǐ xià',\r\n 打扮: 'dǎ bàn',\r\n 子弹: 'zǐ dàn',\r\n 弹药: 'dàn yào',\r\n 热量: 'rè liàng',\r\n 削弱: 'xuē ruò',\r\n 骨干: 'gǔ gàn',\r\n 容量: 'róng liàng',\r\n 模糊: 'mó hu',\r\n 转动: 'zhuàn dòng',\r\n 称呼: 'chēng hu',\r\n 科长: 'kē zhǎng',\r\n 处置: 'chǔ zhì',\r\n 着重: 'zhuó zhòng',\r\n 着急: 'zháo jí',\r\n 强迫: 'qiǎng pò',\r\n 庭长: 'tíng zhǎng',\r\n 首相: 'shǒu xiàng',\r\n 喇嘛: 'lǎ ma',\r\n 镇长: 'zhèn zhǎng',\r\n 只管: 'zhǐ guǎn',\r\n 重重: 'chóng chóng',\r\n 免得: 'miǎn de',\r\n 着实: 'zhuó shí',\r\n 度假: 'dù jià',\r\n 真相: 'zhēn xiàng',\r\n 相貌: 'xiàng mào',\r\n 处分: 'chǔ fèn',\r\n 委屈: 'wěi qu',\r\n 为期: 'wéi qī',\r\n 伯伯: 'bó bo',\r\n 伯子: 'bǎi zi',\r\n 圈子: 'quān zi',\r\n 见识: 'jiàn shi',\r\n 笼罩: 'lǒng zhào',\r\n 与会: 'yù huì',\r\n 都督: 'dū du',\r\n 都市: 'dū shì',\r\n 成都: 'chéng dū',\r\n 首都: 'shǒu dū',\r\n 帝都: 'dì dū',\r\n 王都: 'wáng dū',\r\n 东都: 'dōng dū',\r\n 都护: 'dū hù',\r\n 都城: 'dū chéng',\r\n 建都: 'jiàn dū',\r\n 迁都: 'qiān dū',\r\n 故都: 'gù dū',\r\n 定都: 'dìng dū',\r\n 中都: 'zhōng dū',\r\n 六安: 'lù ān',\r\n 宰相: 'zǎi xiàng',\r\n 较量: 'jiào liàng',\r\n 对称: 'duì chèn',\r\n 总长: 'zǒng zhǎng',\r\n 相公: 'xiàng gong',\r\n 空白: 'kòng bái',\r\n 打量: 'dǎ liang',\r\n 水分: 'shuǐ fèn',\r\n 舌头: 'shé tou',\r\n 没收: 'mò shōu',\r\n 行李: 'xíng li',\r\n 判处: 'pàn chǔ',\r\n 散文: 'sǎn wén',\r\n 处境: 'chǔ jìng',\r\n 孙子: 'sūn zi',\r\n 拳头: 'quán tou',\r\n 打发: 'dǎ fā',\r\n 组长: 'zǔ zhǎng',\r\n 骨头: 'gǔ tou',\r\n 宁可: 'nìng kě',\r\n 更换: 'gēng huàn',\r\n 薄弱: 'bó ruò',\r\n 还原: 'huán yuán',\r\n 重修: 'chóng xiū',\r\n 重来: 'chóng lái',\r\n 只顾: 'zhǐ gù',\r\n 爱好: 'ài hào',\r\n 馒头: 'mán tou',\r\n 军长: 'jūn zhǎng',\r\n 首长: 'shǒu zhǎng',\r\n 厂长: 'chǎng zhǎng',\r\n 司长: 'sī zhǎng',\r\n 长子: 'zhǎng zǐ',\r\n 强劲: 'qiáng jìng',\r\n 恰当: 'qià dàng',\r\n 头儿: 'tóu er',\r\n 站长: 'zhàn zhǎng',\r\n 折腾: 'zhē teng',\r\n 相处: 'xiāng chǔ',\r\n 统率: 'tǒng shuài',\r\n 中将: 'zhōng jiàng',\r\n 命中: 'mìng zhòng',\r\n 名将: 'míng jiàng',\r\n 木头: 'mù tou',\r\n 动弹: 'dòng tan',\r\n 地壳: 'dì qiào',\r\n 干活: 'gàn huó',\r\n 少爷: 'shào ye',\r\n 水量: 'shuǐ liàng',\r\n 补给: 'bǔ jǐ',\r\n 尾巴: 'wěi ba',\r\n 来得: 'lái de',\r\n 好奇: 'hào qí',\r\n 钥匙: 'yào shi',\r\n 当做: 'dàng zuò',\r\n 沉着: 'chén zhuó',\r\n 哑巴: 'yǎ ba',\r\n 车子: 'chē zi',\r\n 上将: 'shàng jiàng',\r\n 恶心: 'ě xīn',\r\n 担子: 'dàn zi',\r\n 应届: 'yīng jiè',\r\n 主角: 'zhǔ jué',\r\n 运转: 'yùn zhuǎn',\r\n 兄长: 'xiōng zhǎng',\r\n 格式: 'gé shì',\r\n 正月: 'zhēng yuè',\r\n 营长: 'yíng zhǎng',\r\n 当成: 'dàng chéng',\r\n 女婿: 'nǚ xu',\r\n 咽喉: 'yān hóu',\r\n 重阳: 'chóng yáng',\r\n 化为: 'huà wéi',\r\n 吐蕃: 'tǔ bō',\r\n 钻进: 'zuān jìn',\r\n 乐队: 'yuè duì',\r\n 亮相: 'liàng xiàng',\r\n 被子: 'bèi zi',\r\n 舍得: 'shě de',\r\n 杉木: 'shā mù',\r\n 击中: 'jī zhòng',\r\n 排长: 'pái zhǎng',\r\n 假期: 'jià qī',\r\n 分量: 'fèn liàng',\r\n 数次: 'shù cì',\r\n 提防: 'dī fáng',\r\n 吆喝: 'yāo he',\r\n 查处: 'chá chǔ',\r\n 量子: 'liàng zǐ',\r\n 里头: 'lǐ tou',\r\n 调研: 'diào yán',\r\n 伺候: 'cì hou',\r\n 重申: 'chóng shēn',\r\n 枕头: 'zhěn tou',\r\n 拚命: 'pīn mìng',\r\n 社长: 'shè zhǎng',\r\n 归还: 'guī huán',\r\n 批量: 'pī liàng',\r\n 畜牧: 'xù mù',\r\n 点着: 'diǎn zháo',\r\n 甚为: 'shèn wéi',\r\n 小将: 'xiǎo jiàng',\r\n 着眼: 'zhuó yǎn',\r\n 处死: 'chǔ sǐ',\r\n 厌恶: 'yàn wù',\r\n 鼓乐: 'gǔ yuè',\r\n 树干: 'shù gàn',\r\n 秘鲁: 'bì lǔ',\r\n 大方: 'dà fāng',\r\n 外头: 'wài tou',\r\n 班长: 'bān zhǎng',\r\n 星宿: 'xīng xiù',\r\n 宁愿: 'nìng yuàn',\r\n 钦差: 'qīn chāi',\r\n 为数: 'wéi shù',\r\n 勾当: 'gòu dàng',\r\n 削减: 'xuē jiǎn',\r\n 间谍: 'jiàn dié',\r\n 埋怨: 'mán yuàn',\r\n 结实: 'jiē shi',\r\n 计量: 'jì liáng',\r\n 淹没: 'yān mò',\r\n 村长: 'cūn zhǎng',\r\n 连长: 'lián zhǎng',\r\n 自给: 'zì jǐ',\r\n 武将: 'wǔ jiàng',\r\n 温差: 'wēn chā',\r\n 直奔: 'zhí bèn',\r\n 供求: 'gōng qiú',\r\n 剂量: 'jì liàng',\r\n 道长: 'dào zhǎng',\r\n 泄露: 'xiè lòu',\r\n 王八: 'wáng ba',\r\n 切割: 'qiē gē',\r\n 间隔: 'jiàn gé',\r\n 一晃: 'yì huǎng',\r\n 长假: 'cháng jià',\r\n 令狐: 'líng hú',\r\n 为害: 'wéi hài',\r\n 句子: 'jù zi',\r\n 偿还: 'cháng huán',\r\n 疙瘩: 'gē da',\r\n 燕山: 'yān shān',\r\n 堵塞: 'dǔ sè',\r\n 夺冠: 'duó guàn',\r\n 扎实: 'zhā shi',\r\n 电荷: 'diàn hè',\r\n 看守: 'kān shǒu',\r\n 复辟: 'fù bì',\r\n 郁闷: 'yù mèn',\r\n 尽早: 'jǐn zǎo',\r\n 切断: 'qiē duàn',\r\n 指头: 'zhǐ tou',\r\n 为生: 'wéi shēng',\r\n 畜生: 'chù sheng',\r\n 切除: 'qiē chú',\r\n 着力: 'zhuó lì',\r\n 着想: 'zhuó xiǎng',\r\n 级差: 'jí chā',\r\n 投奔: 'tóu bèn',\r\n 棍子: 'gùn zi',\r\n 含糊: 'hán hu',\r\n 少妇: 'shào fù',\r\n 兴致: 'xìng zhì',\r\n 纳闷: 'nà mèn',\r\n 干流: 'gàn liú',\r\n 卷起: 'juǎn qǐ',\r\n 扇子: 'shàn zi',\r\n 更改: 'gēng gǎi',\r\n 笼络: 'lǒng luò',\r\n 喇叭: 'lǎ ba',\r\n 载荷: 'zài hè',\r\n 妥当: 'tuǒ dàng',\r\n 为难: 'wéi nán',\r\n 着陆: 'zhuó lù',\r\n 燕子: 'yàn zi',\r\n 干吗: 'gàn má',\r\n 白发: 'bái fà',\r\n 总得: 'zǒng děi',\r\n 夹击: 'jiā jī',\r\n 曝光: 'bào guāng',\r\n 曲调: 'qǔ diào',\r\n 相机: 'xiàng jī',\r\n 叫化: 'jiào huà',\r\n 角逐: 'jué zhú',\r\n 啊哟: 'ā yō',\r\n 载重: 'zài zhòng',\r\n 长辈: 'zhǎng bèi',\r\n 出差: 'chū chāi',\r\n 垛口: 'duǒ kǒu',\r\n 撇开: 'piē kāi',\r\n 厅长: 'tīng zhǎng',\r\n 组分: 'zǔ fèn',\r\n 误差: 'wù chā',\r\n 家当: 'jiā dàng',\r\n 传记: 'zhuàn jì',\r\n 个子: 'gè zi',\r\n 铺设: 'pū shè',\r\n 干事: 'gàn shì',\r\n 杆菌: 'gǎn jūn',\r\n 定量: 'dìng liàng',\r\n 运载: 'yùn zài',\r\n 会儿: 'huì er',\r\n 酋长: 'qiú zhǎng',\r\n 重返: 'chóng fǎn',\r\n 差额: 'chā é',\r\n 露面: 'lòu miàn',\r\n 钻研: 'zuān yán',\r\n 大城: 'dài chéng',\r\n 上当: 'shàng dàng',\r\n 销量: 'xiāo liàng',\r\n 作坊: 'zuō fang',\r\n 照相: 'zhào xiàng',\r\n 哎呀: 'āi yā',\r\n 调集: 'diào jí',\r\n 看中: 'kàn zhòng',\r\n 议长: 'yì zhǎng',\r\n 风筝: 'fēng zheng',\r\n 辟邪: 'bì xié',\r\n 空隙: 'kòng xì',\r\n 更迭: 'gēng dié',\r\n 偏差: 'piān chā',\r\n 声调: 'shēng diào',\r\n 适量: 'shì liàng',\r\n 屯子: 'tún zi',\r\n 无量: 'wú liàng',\r\n 空地: 'kòng dì',\r\n 调度: 'diào dù',\r\n 散射: 'sǎn shè',\r\n 创伤: 'chuāng shāng',\r\n 海参: 'hǎi shēn',\r\n 满载: 'mǎn zài',\r\n 重叠: 'chóng dié',\r\n 落差: 'luò chā',\r\n 单调: 'dān diào',\r\n 老将: 'lǎo jiàng',\r\n 人参: 'rén shēn',\r\n 间断: 'jiàn duàn',\r\n 重现: 'chóng xiàn',\r\n 夹杂: 'jiā zá',\r\n 调用: 'diào yòng',\r\n 萝卜: 'luó bo',\r\n 附着: 'fù zhuó',\r\n 应声: 'yìng shēng',\r\n 主将: 'zhǔ jiàng',\r\n 罪过: 'zuì guo',\r\n 咀嚼: 'jǔ jué',\r\n 为政: 'wéi zhèng',\r\n 过量: 'guò liàng',\r\n 乐曲: 'yuè qǔ',\r\n 负荷: 'fù hè',\r\n 枪弹: 'qiāng dàn',\r\n 悄然: 'qiǎo rán',\r\n 处方: 'chǔ fāng',\r\n 悄声: 'qiǎo shēng',\r\n 曲子: 'qǔ zi',\r\n 情调: 'qíng diào',\r\n 挑衅: 'tiǎo xìn',\r\n 代为: 'dài wéi',\r\n 了结: 'liǎo jié',\r\n 打中: 'dǎ zhòng',\r\n 酒吧: 'jiǔ bā',\r\n 懒得: 'lǎn de',\r\n 增量: 'zēng liàng',\r\n 衣着: 'yī zhuó',\r\n 部将: 'bù jiàng',\r\n 要塞: 'yào sài',\r\n 茶几: 'chá jī',\r\n 杠杆: 'gàng gǎn',\r\n 出没: 'chū mò',\r\n 鲜有: 'xiǎn yǒu',\r\n 间隙: 'jiàn xì',\r\n 重担: 'zhòng dàn',\r\n 重演: 'chóng yǎn',\r\n 重试: 'chóng shì',\r\n 应酬: 'yìng chou',\r\n 只当: 'zhǐ dāng',\r\n 毋宁: 'wú nìng',\r\n 包扎: 'bāo zā',\r\n 前头: 'qián tou',\r\n 卷烟: 'juǎn yān',\r\n 非得: 'fēi děi',\r\n 弹道: 'dàn dào',\r\n 杆子: 'gān zi',\r\n 门将: 'mén jiàng',\r\n 后头: 'hòu tou',\r\n 喝彩: 'hè cǎi',\r\n 暖和: 'nuǎn huo',\r\n 累积: 'lěi jī',\r\n 调遣: 'diào qiǎn',\r\n 倔强: 'jué jiàng',\r\n 宝藏: 'bǎo zàng',\r\n 丧事: 'sāng shì',\r\n 约莫: 'yuē mo',\r\n 纤夫: 'qiàn fū',\r\n 更替: 'gēng tì',\r\n 装载: 'zhuāng zài',\r\n 背包: 'bēi bāo',\r\n 帖子: 'tiě zi',\r\n 松散: 'sōng sǎn',\r\n 呼喝: 'hū hè',\r\n 可恶: 'kě wù',\r\n 自转: 'zì zhuàn',\r\n 供电: 'gōng diàn',\r\n 反省: 'fǎn xǐng',\r\n 坦率: 'tǎn shuài',\r\n 苏打: 'sū dá',\r\n 本分: 'běn fèn',\r\n 落得: 'luò de',\r\n 鄙薄: 'bǐ bó',\r\n 相间: 'xiāng jiàn',\r\n 单薄: 'dān bó',\r\n 混蛋: 'hún dàn',\r\n 贞观: 'zhēn guān',\r\n 附和: 'fù hè',\r\n 能耐: 'néng nài',\r\n 吓唬: 'xià hu',\r\n 未了: 'wèi liǎo',\r\n 引着: 'yǐn zháo',\r\n 抽调: 'chōu diào',\r\n 沙子: 'shā zi',\r\n 席卷: 'xí juǎn',\r\n 标的: 'biāo dì',\r\n 别扭: 'biè niu',\r\n 思量: 'sī liang',\r\n 喝采: 'hè cǎi',\r\n 论语: 'lún yǔ',\r\n 盖子: 'gài zi',\r\n 分外: 'fèn wài',\r\n 弄堂: 'lòng táng',\r\n 乐舞: 'yuè wǔ',\r\n 雨量: 'yǔ liàng',\r\n 毛发: 'máo fà',\r\n 差遣: 'chāi qiǎn',\r\n 背负: 'bēi fù',\r\n 转速: 'zhuàn sù',\r\n 声乐: 'shēng yuè',\r\n 夹攻: 'jiā gōng',\r\n 供水: 'gōng shuǐ',\r\n 主干: 'zhǔ gàn',\r\n 惩处: 'chéng chǔ',\r\n 长相: 'zhǎng xiàng',\r\n 公差: 'gōng chāi',\r\n 榴弹: 'liú dàn',\r\n 省得: 'shěng de',\r\n 条子: 'tiáo zi',\r\n 重围: 'chóng wéi',\r\n 阻塞: 'zǔ sè',\r\n 劲风: 'jìng fēng',\r\n 纠葛: 'jiū gé',\r\n 颠簸: 'diān bǒ',\r\n 点中: 'diǎn zhòng',\r\n 重创: 'zhòng chuāng',\r\n 姥姥: 'lǎo lao',\r\n 迷糊: 'mí hu',\r\n 公家: 'gōng jia',\r\n 几率: 'jī lǜ',\r\n 苦闷: 'kǔ mèn',\r\n 度量: 'dù liàng',\r\n 差错: 'chā cuò',\r\n 暑假: 'shǔ jià',\r\n 参差: 'cēn cī',\r\n 搭载: 'dā zài',\r\n 助长: 'zhù zhǎng',\r\n 相称: 'xiāng chèn',\r\n 红晕: 'hóng yùn',\r\n 舍命: 'shě mìng',\r\n 喜好: 'xǐ hào',\r\n 列传: 'liè zhuàn',\r\n 劲敌: 'jìng dí',\r\n 蛤蟆: 'há ma',\r\n 请假: 'qǐng jià',\r\n 钉子: 'dīng zi',\r\n 沉没: 'chén mò',\r\n 高丽: 'gāo lí',\r\n 休假: 'xiū jià',\r\n 无为: 'wú wéi',\r\n 巴结: 'bā jie',\r\n 了得: 'liǎo dé',\r\n 变相: 'biàn xiàng',\r\n 核弹: 'hé dàn',\r\n 亲家: 'qìng jia',\r\n 承载: 'chéng zài',\r\n 喝问: 'hè wèn',\r\n 还击: 'huán jī',\r\n 交还: 'jiāo huán',\r\n 将令: 'jiàng lìng',\r\n 单于: 'chán yú',\r\n 空缺: 'kòng quē',\r\n 绿林: 'lù lín',\r\n 胆量: 'dǎn liàng',\r\n 执着: 'zhí zhuó',\r\n 低调: 'dī diào',\r\n 闭塞: 'bì sè',\r\n 轻薄: 'qīng bó',\r\n 得当: 'dé dàng',\r\n 占卜: 'zhān bǔ',\r\n 扫帚: 'sào zhou',\r\n 龟兹: 'qiū cí',\r\n 年长: 'nián zhǎng',\r\n 外传: 'wài zhuàn',\r\n 头子: 'tóu zi',\r\n 裁缝: 'cái feng',\r\n 礼乐: 'lǐ yuè',\r\n 血泊: 'xuè pō',\r\n 散乱: 'sǎn luàn',\r\n 动量: 'dòng liàng',\r\n 倒腾: 'dǎo teng',\r\n 取舍: 'qǔ shě',\r\n 咱家: 'zán jiā',\r\n 长发: 'cháng fà',\r\n 爪哇: 'zhǎo wā',\r\n 弹壳: 'dàn ké',\r\n 省悟: 'xǐng wù',\r\n 嚷嚷: 'rāng rang',\r\n 连累: 'lián lèi',\r\n 应得: 'yīng dé',\r\n 族长: 'zú zhǎng',\r\n 柜子: 'guì zi',\r\n 擂鼓: 'léi gǔ',\r\n 眩晕: 'xuàn yùn',\r\n 调配: 'tiáo pèi',\r\n 躯干: 'qū gàn',\r\n 差役: 'chāi yì',\r\n 坎坷: 'kǎn kě',\r\n 少儿: 'shào ér',\r\n 乐团: 'yuè tuán',\r\n 养分: 'yǎng fèn',\r\n 退还: 'tuì huán',\r\n 格调: 'gé diào',\r\n 语调: 'yǔ diào',\r\n 音调: 'yīn diào',\r\n 乐府: 'yuè fǔ',\r\n 古朴: 'gǔ pǔ',\r\n 打点: 'dǎ diǎn',\r\n 差使: 'chāi shǐ',\r\n 匀称: 'yún chèn',\r\n 瘦削: 'shòu xuē',\r\n 膏药: 'gāo yao',\r\n 吞没: 'tūn mò',\r\n 调任: 'diào rèn',\r\n 散居: 'sǎn jū',\r\n 上头: 'shàng tóu',\r\n 风靡: 'fēng mǐ',\r\n 放假: 'fàng jià',\r\n 估量: 'gū liang',\r\n 失当: 'shī dàng',\r\n 中弹: 'zhòng dàn',\r\n 妄为: 'wàng wéi',\r\n 长者: 'zhǎng zhě',\r\n 起哄: 'qǐ hòng',\r\n 末了: 'mò liǎo',\r\n 相声: 'xiàng sheng',\r\n 校正: 'jiào zhèng',\r\n 劝降: 'quàn xiáng',\r\n 矢量: 'shǐ liàng',\r\n 沉闷: 'chén mèn',\r\n 给与: 'jǐ yǔ',\r\n 解法: 'jiě fǎ',\r\n 塞外: 'sài wài',\r\n 将校: 'jiàng xiào',\r\n 嗜好: 'shì hào',\r\n 没落: 'mò luò',\r\n 朴刀: 'pō dāo',\r\n 片子: 'piān zi',\r\n 切削: 'qiē xiāo',\r\n 弹丸: 'dàn wán',\r\n 稀薄: 'xī bó',\r\n 亏得: 'kuī dé',\r\n 间歇: 'jiàn xiē',\r\n 翘首: 'qiáo shǒu',\r\n 色调: 'sè diào',\r\n 处决: 'chǔ jué',\r\n 表率: 'biǎo shuài',\r\n 尺子: 'chǐ zi',\r\n 招降: 'zhāo xiáng',\r\n 称职: 'chèn zhí',\r\n 斗篷: 'dǒu peng',\r\n 铺子: 'pù zi',\r\n 底子: 'dǐ zi',\r\n 负载: 'fù zài',\r\n 干警: 'gàn jǐng',\r\n 倒数: 'dào shǔ',\r\n 将官: 'jiàng guān',\r\n 锄头: 'chú tou',\r\n 归降: 'guī xiáng',\r\n 疟疾: 'nüè ji',\r\n 唠叨: 'láo dao',\r\n 限量: 'xiàn liàng',\r\n 屏息: 'bǐng xī',\r\n 重逢: 'chóng féng',\r\n 器乐: 'qì yuè',\r\n 氢弹: 'qīng dàn',\r\n 脖颈: 'bó gěng',\r\n 妃子: 'fēi zi',\r\n 处事: 'chǔ shì',\r\n 参量: 'cān liàng',\r\n 轻率: 'qīng shuài',\r\n 缥缈: 'piāo miǎo',\r\n 中奖: 'zhòng jiǎng',\r\n 才干: 'cái gàn',\r\n 施舍: 'shī shě',\r\n 卷子: 'juàn zi',\r\n 游说: 'yóu shuì',\r\n 巷子: 'xiàng zi',\r\n 膀胱: 'páng guāng',\r\n 切勿: 'qiè wù',\r\n 看管: 'kān guǎn',\r\n 风头: 'fēng tou',\r\n 精干: 'jīng gàn',\r\n 高差: 'gāo chā',\r\n 恐吓: 'kǒng hè',\r\n 扁担: 'biǎn dàn',\r\n 给养: 'jǐ yǎng',\r\n 格子: 'gé zi',\r\n 供需: 'gōng xū',\r\n 反差: 'fǎn chā',\r\n 飞弹: 'fēi dàn',\r\n 微薄: 'wēi bó',\r\n 发型: 'fà xíng',\r\n 即兴: 'jí xìng',\r\n 攒动: 'cuán dòng',\r\n 间或: 'jiàn huò',\r\n 浅薄: 'qiǎn bó',\r\n 乐章: 'yuè zhāng',\r\n 顺差: 'shùn chā',\r\n 调子: 'diào zi',\r\n 相位: 'xiàng wèi',\r\n 转子: 'zhuàn zǐ',\r\n 劲旅: 'jìng lǚ',\r\n 咔嚓: 'kā chā',\r\n 了事: 'liǎo shì',\r\n 转悠: 'zhuàn you',\r\n 当铺: 'dàng pù',\r\n 爪子: 'zhuǎ zi',\r\n 单子: 'dān zi',\r\n 好战: 'hào zhàn',\r\n 燕麦: 'yàn mài',\r\n 只许: 'zhǐ xǔ',\r\n 干练: 'gàn liàn',\r\n 女将: 'nǚ jiàng',\r\n 酒量: 'jiǔ liàng',\r\n 划船: 'huá chuán',\r\n 伎俩: 'jì liǎng',\r\n 挑拨: 'tiǎo bō',\r\n 少校: 'shào xiào',\r\n 着落: 'zhuó luò',\r\n 憎恶: 'zēng wù',\r\n 刻薄: 'kè bó',\r\n 要挟: 'yāo xié',\r\n 用处: 'yòng chu',\r\n 还手: 'huán shǒu',\r\n 模具: 'mú jù',\r\n 执著: 'zhí zhuó',\r\n 喝令: 'hè lìng',\r\n 保长: 'bǎo zhǎng',\r\n 吸着: 'xī zhe',\r\n 症结: 'zhēng jié',\r\n 公转: 'gōng zhuàn',\r\n 校勘: 'jiào kān',\r\n 重提: 'chóng tí',\r\n 扫兴: 'sǎo xìng',\r\n 铺盖: 'pū gài',\r\n 长史: 'zhǎng shǐ',\r\n 差价: 'chā jià',\r\n 压根: 'yà gēn',\r\n 怔住: 'zhèng zhù',\r\n 应允: 'yīng yǔn',\r\n 切入: 'qiē rù',\r\n 战将: 'zhàn jiàng',\r\n 年少: 'nián shào',\r\n 舍身: 'shě shēn',\r\n 执拗: 'zhí niù',\r\n 处世: 'chǔ shì',\r\n 中风: 'zhòng fēng',\r\n 等量: 'děng liàng',\r\n 放量: 'fàng liàng',\r\n 腔调: 'qiāng diào',\r\n 老少: 'lǎo shào',\r\n 没入: 'mò rù',\r\n 瓜葛: 'guā gé',\r\n 将帅: 'jiàng shuài',\r\n 车载: 'chē zài',\r\n 窝囊: 'wō nang',\r\n 长进: 'zhǎng jìn',\r\n 可汗: 'kè hán',\r\n 并州: 'bīng zhōu',\r\n 供销: 'gōng xiāo',\r\n 切片: 'qiē piàn',\r\n 差事: 'chāi shì',\r\n 知会: 'zhī hui',\r\n 鹰爪: 'yīng zhǎo',\r\n 处女: 'chǔ nǚ',\r\n 切磋: 'qiē cuō',\r\n 日头: 'rì tou',\r\n 押解: 'yā jiè',\r\n 滋长: 'zī zhǎng',\r\n 道观: 'dào guàn',\r\n 脚色: 'jué sè',\r\n 当量: 'dāng liàng',\r\n 婆家: 'pó jia',\r\n 缘分: 'yuán fèn',\r\n 空闲: 'kòng xián',\r\n 好色: 'hào sè',\r\n 怒喝: 'nù hè',\r\n 笼统: 'lǒng tǒng',\r\n 边塞: 'biān sài',\r\n 何曾: 'hé céng',\r\n 重合: 'chóng hé',\r\n 零散: 'líng sǎn',\r\n 轰隆: 'hōng lōng',\r\n 化子: 'huà zi',\r\n 内蒙: 'nèi měng',\r\n 数落: 'shǔ luò',\r\n 逆差: 'nì chā',\r\n 牟利: 'móu lì',\r\n 栅栏: 'zhà lan',\r\n 中标: 'zhòng biāo',\r\n 调档: 'diào dàng',\r\n 佝偻: 'gōu lóu',\r\n 场子: 'chǎng zi',\r\n 甲壳: 'jiǎ qiào',\r\n 重温: 'chóng wēn',\r\n 炮制: 'páo zhì',\r\n 返还: 'fǎn huán',\r\n 自传: 'zì zhuàn',\r\n 高调: 'gāo diào',\r\n 殷红: 'yān hóng',\r\n 固着: 'gù zhuó',\r\n 强求: 'qiǎng qiú',\r\n 本相: 'běn xiàng',\r\n 骄横: 'jiāo hèng',\r\n 草率: 'cǎo shuài',\r\n 气闷: 'qì mèn',\r\n 着色: 'zhuó sè',\r\n 宁肯: 'nìng kěn',\r\n 兴头: 'xìng tou',\r\n 拘泥: 'jū nì',\r\n 夹角: 'jiā jiǎo',\r\n 发髻: 'fà jì',\r\n 猛将: 'měng jiàng',\r\n 约摸: 'yuē mo',\r\n 拖累: 'tuō lěi',\r\n 呢绒: 'ní róng',\r\n 钻探: 'zuān tàn',\r\n 夹层: 'jiā céng',\r\n 落魄: 'luò pò',\r\n 巷道: 'hàng dào',\r\n 运量: 'yùn liàng',\r\n 解闷: 'jiě mèn',\r\n 空儿: 'kòng er',\r\n 估摸: 'gū mo',\r\n 好客: 'hào kè',\r\n 钻孔: 'zuān kǒng',\r\n 糊弄: 'hù nòng',\r\n 荥阳: 'xíng yáng',\r\n 烦闷: 'fán mèn',\r\n 仓卒: 'cāng cù',\r\n 分叉: 'fēn chà',\r\n 厂子: 'chǎng zi',\r\n 小调: 'xiǎo diào',\r\n 少阳: 'shào yáng',\r\n 受降: 'shòu xiáng',\r\n 染坊: 'rǎn fáng',\r\n 胳臂: 'gē bei',\r\n 将门: 'jiàng mén',\r\n 模板: 'mú bǎn',\r\n 配给: 'pèi jǐ',\r\n 为伍: 'wéi wǔ',\r\n 跟头: 'gēn tou',\r\n 划算: 'huá suàn',\r\n 累赘: 'léi zhui',\r\n 哄笑: 'hōng xiào',\r\n 晕眩: 'yūn xuàn',\r\n 干掉: 'gàn diào',\r\n 缝制: 'féng zhì',\r\n 难处: 'nán chù',\r\n 着意: 'zhuó yì',\r\n 蛮横: 'mán hèng',\r\n 奇数: 'jī shù',\r\n 短发: 'duǎn fà',\r\n 生还: 'shēng huán',\r\n 还清: 'huán qīng',\r\n 看护: 'kān hù',\r\n 直率: 'zhí shuài',\r\n 奏乐: 'zòu yuè',\r\n 载客: 'zài kè',\r\n 专横: 'zhuān hèng',\r\n 湮没: 'yān mò',\r\n 空格: 'kòng gé',\r\n 铺垫: 'pū diàn',\r\n 良将: 'liáng jiàng',\r\n 哗啦: 'huā lā',\r\n 散漫: 'sǎn màn',\r\n 脱发: 'tuō fà',\r\n 送还: 'sòng huán',\r\n 埋没: 'mái mò',\r\n 累及: 'lěi jí',\r\n 薄雾: 'bó wù',\r\n 调离: 'diào lí',\r\n 舌苔: 'shé tāi',\r\n 机长: 'jī zhǎng',\r\n 栓塞: 'shuān sè',\r\n 配角: 'pèi jué',\r\n 切口: 'qiē kǒu',\r\n 创口: 'chuāng kǒu',\r\n 哈欠: 'hā qian',\r\n 实弹: 'shí dàn',\r\n 铺平: 'pū píng',\r\n 哈达: 'hǎ dá',\r\n 懒散: 'lǎn sǎn',\r\n 实干: 'shí gàn',\r\n 填空: 'tián kòng',\r\n 刁钻: 'diāo zuān',\r\n 乐师: 'yuè shī',\r\n 量变: 'liàng biàn',\r\n 诱降: 'yòu xiáng',\r\n 搪塞: 'táng sè',\r\n 征调: 'zhēng diào',\r\n 夹道: 'jiā dào',\r\n 干咳: 'gān ké',\r\n 止咳: 'zhǐ ké',\r\n 乐工: 'yuè gōng',\r\n 划过: 'huá guò',\r\n 着火: 'zháo huǒ',\r\n 更正: 'gēng zhèng',\r\n 给付: 'jǐ fù',\r\n 空子: 'kòng zi',\r\n 哪吒: 'né zhā',\r\n 正着: 'zhèng zháo',\r\n 刷子: 'shuā zi',\r\n 丧葬: 'sāng zàng',\r\n 夹带: 'jiā dài',\r\n 安分: 'ān fèn',\r\n 中意: 'zhòng yì',\r\n 长孙: 'zhǎng sūn',\r\n 校订: 'jiào dìng',\r\n 卷曲: 'juǎn qū',\r\n 载运: 'zài yùn',\r\n 投弹: 'tóu dàn',\r\n 柞蚕: 'zuò cán',\r\n 份量: 'fèn liàng',\r\n 调换: 'diào huàn',\r\n 了然: 'liǎo rán',\r\n 咧嘴: 'liě zuǐ',\r\n 典当: 'diǎn dàng',\r\n 寒假: 'hán jià',\r\n 长兄: 'zhǎng xiōng',\r\n 给水: 'jǐ shuǐ',\r\n 须发: 'xū fà',\r\n 枝干: 'zhī gàn',\r\n 属相: 'shǔ xiàng',\r\n 哄抢: 'hōng qiǎng',\r\n 刻划: 'kè huà',\r\n 塞子: 'sāi zi',\r\n 单干: 'dān gàn',\r\n 还乡: 'huán xiāng',\r\n 兆头: 'zhào tou',\r\n 寺观: 'sì guàn',\r\n 督率: 'dū shuài',\r\n 啊哈: 'ā ha',\r\n 割舍: 'gē shě',\r\n 抹布: 'mā bù',\r\n 好恶: 'hào wù',\r\n 下处: 'xià chǔ',\r\n 消长: 'xiāo zhǎng',\r\n 离间: 'lí jiàn',\r\n 准头: 'zhǔn tou',\r\n 校对: 'jiào duì',\r\n 什物: 'shí wù',\r\n 番禺: 'pān yú',\r\n 佛爷: 'fó ye',\r\n 吗啡: 'mǎ fēi',\r\n 盐分: 'yán fèn',\r\n 虎将: 'hǔ jiàng',\r\n 薄荷: 'bò he',\r\n 独处: 'dú chǔ',\r\n 空位: 'kòng wèi',\r\n 铺路: 'pū lù',\r\n 乌拉: 'wū lā',\r\n 调回: 'diào huí',\r\n 来头: 'lái tou',\r\n 闲散: 'xián sǎn',\r\n 胶卷: 'jiāo juǎn',\r\n 冒失: 'mào shi',\r\n 干劲: 'gàn jìn',\r\n 弦乐: 'xián yuè',\r\n 相国: 'xiàng guó',\r\n 丹参: 'dān shēn',\r\n 助兴: 'zhù xìng',\r\n 铺开: 'pū kāi',\r\n 次长: 'cì zhǎng',\r\n 发卡: 'fà qiǎ',\r\n 拮据: 'jié jū',\r\n 刹车: 'shā chē',\r\n 生发: 'shēng fà',\r\n 重播: 'chóng bō',\r\n 缝合: 'féng hé',\r\n 音量: 'yīn liàng',\r\n 少尉: 'shào wèi',\r\n 冲压: 'chòng yā',\r\n 苍劲: 'cāng jìng',\r\n 厚薄: 'hòu báo',\r\n 威吓: 'wēi hè',\r\n 外相: 'wài xiàng',\r\n 呼号: 'hū háo',\r\n 着迷: 'zháo mí',\r\n 挑担: 'tiāo dàn',\r\n 纹路: 'wén lù',\r\n 还俗: 'huán sú',\r\n 强横: 'qiáng hèng',\r\n 着数: 'zhāo shù',\r\n 降顺: 'xiáng shùn',\r\n 挑明: 'tiǎo míng',\r\n 眯缝: 'mī feng',\r\n 分内: 'fèn nèi',\r\n 更衣: 'gēng yī',\r\n 软和: 'ruǎn huo',\r\n 尽兴: 'jìn xìng',\r\n 号子: 'hào zi',\r\n 爪牙: 'zhǎo yá',\r\n 败将: 'bài jiàng',\r\n 猜中: 'cāi zhòng',\r\n 结扎: 'jié zā',\r\n 没空: 'méi kòng',\r\n 夹缝: 'jiā fèng',\r\n 拾掇: 'shí duo',\r\n 掺和: 'chān huo',\r\n 簸箕: 'bò ji',\r\n 电量: 'diàn liàng',\r\n 荷载: 'hè zǎi',\r\n 调式: 'diào shì',\r\n 处身: 'chǔ shēn',\r\n 打手: 'dǎ shǒu',\r\n 弹弓: 'dàn gōng',\r\n 横蛮: 'hèng mán',\r\n 能干: 'néng gàn',\r\n 校点: 'jiào diǎn',\r\n 加载: 'jiā zài',\r\n 干校: 'gàn xiào',\r\n 哄传: 'hōng chuán',\r\n 校注: 'jiào zhù',\r\n 淤塞: 'yū sè',\r\n 马扎: 'mǎ zhá',\r\n 月氏: 'yuè zhī',\r\n 高干: 'gāo gàn',\r\n 经传: 'jīng zhuàn',\r\n 曾孙: 'zēng sūn',\r\n 好斗: 'hào dòu',\r\n 关卡: 'guān qiǎ',\r\n 逃奔: 'táo bèn',\r\n 磨蹭: 'mó ceng',\r\n 牟取: 'móu qǔ',\r\n 颤栗: 'zhàn lì',\r\n 蚂蚱: 'mà zha',\r\n 撮合: 'cuō he',\r\n 趔趄: 'liè qie',\r\n 摔打: 'shuāi dǎ',\r\n 台子: 'tái zi',\r\n 分得: 'fēn de',\r\n 粘着: 'nián zhuó',\r\n 采邑: 'cài yì',\r\n 散装: 'sǎn zhuāng',\r\n 婀娜: 'ē nuó',\r\n 兴味: 'xìng wèi',\r\n 行头: 'xíng tou',\r\n 气量: 'qì liàng',\r\n 调运: 'diào yùn',\r\n 处治: 'chǔ zhì',\r\n 乐音: 'yuè yīn',\r\n 充塞: 'chōng sè',\r\n 恫吓: 'dòng hè',\r\n 论调: 'lùn diào',\r\n 相中: 'xiāng zhòng',\r\n 民乐: 'mín yuè',\r\n 炮仗: 'pào zhang',\r\n 丧服: 'sāng fú',\r\n 骁将: 'xiāo jiàng',\r\n 量刑: 'liàng xíng',\r\n 缝补: 'féng bǔ',\r\n 财会: 'cái kuài',\r\n 大干: 'dà gàn',\r\n 历数: 'lì shǔ',\r\n 校场: 'jiào chǎng',\r\n 塞北: 'sài běi',\r\n 识相: 'shí xiàng',\r\n 辱没: 'rǔ mò',\r\n 鲜亮: 'xiān liàng',\r\n 语塞: 'yǔ sè',\r\n 露脸: 'lòu liǎn',\r\n 凉快: 'liáng kuai',\r\n 腰杆: 'yāo gǎn',\r\n 溜达: 'liū da',\r\n 嘎嘎: 'gā gā',\r\n 公干: 'gōng gàn',\r\n 桔梗: 'jié gěng',\r\n 挑逗: 'tiǎo dòu',\r\n 看门: 'kān mén',\r\n 乐歌: 'yuè gē',\r\n 拓片: 'tà piàn',\r\n 挑动: 'tiǎo dòng',\r\n 准将: 'zhǔn jiàng',\r\n 遒劲: 'qiú jìng',\r\n 磨坊: 'mò fáng',\r\n 逶迤: 'wēi yí',\r\n 搅和: 'jiǎo huo',\r\n 摩挲: 'mó suō',\r\n 作弄: 'zuò nòng',\r\n 苗头: 'miáo tou',\r\n 打颤: 'dǎ zhàn',\r\n 大藏: 'dà zàng',\r\n 畜牲: 'chù shēng',\r\n 勾搭: 'gōu da',\r\n 树荫: 'shù yīn',\r\n 树杈: 'shù chà',\r\n 铁杆: 'tiě gǎn',\r\n 将相: 'jiàng xiàng',\r\n 份子: 'fèn zi',\r\n 视差: 'shì chā',\r\n 绿荫: 'lǜ yīn',\r\n 枪杆: 'qiāng gǎn',\r\n 缝纫: 'féng rèn',\r\n 愁闷: 'chóu mèn',\r\n 点将: 'diǎn jiàng',\r\n 华佗: 'huà tuó',\r\n 劲射: 'jìng shè',\r\n 箱笼: 'xiāng lǒng',\r\n 终了: 'zhōng liǎo',\r\n 鬓发: 'bìn fà',\r\n 结巴: 'jiē ba',\r\n 苦干: 'kǔ gàn',\r\n 看家: 'kān jiā',\r\n 正旦: 'zhēng dàn',\r\n 中肯: 'zhòng kěn',\r\n 厦门: 'xià mén',\r\n 东莞: 'dōng guǎn',\r\n 食量: 'shí liàng',\r\n 宫调: 'gōng diào',\r\n 间作: 'jiàn zuò',\r\n 弹片: 'dàn piàn',\r\n 差池: 'chā chí',\r\n 漂白: 'piǎo bái',\r\n 杠子: 'gàng zi',\r\n 调处: 'tiáo chǔ',\r\n 好动: 'hào dòng',\r\n 转炉: 'zhuàn lú',\r\n 屏气: 'bǐng qì',\r\n 夹板: 'jiā bǎn',\r\n 哀乐: 'āi yuè',\r\n 干道: 'gàn dào',\r\n 苦处: 'kǔ chù',\r\n 劈柴: 'pǐ chái',\r\n 长势: 'zhǎng shì',\r\n 天华: 'tiān huá',\r\n 共处: 'gòng chǔ',\r\n 校验: 'jiào yàn',\r\n 出塞: 'chū sài',\r\n 磨盘: 'mò pán',\r\n 萎靡: 'wěi mǐ',\r\n 奔丧: 'bēn sāng',\r\n 唱和: 'chàng hè',\r\n 大调: 'dà diào',\r\n 非分: 'fēi fèn',\r\n 钻营: 'zuān yíng',\r\n 夹子: 'jiā zi',\r\n 超载: 'chāo zài',\r\n 更始: 'gēng shǐ',\r\n 铃铛: 'líng dang',\r\n 披散: 'pī sàn',\r\n 发还: 'fā huán',\r\n 转轮: 'zhuàn lún',\r\n 横财: 'hèng cái',\r\n 泡桐: 'pāo tóng',\r\n 抛撒: 'pāo sǎ',\r\n 天呀: 'tiān yā',\r\n 糊糊: 'hū hu',\r\n 躯壳: 'qū qiào',\r\n 通量: 'tōng liàng',\r\n 奉还: 'fèng huán',\r\n 午觉: 'wǔ jiào',\r\n 闷棍: 'mèn gùn',\r\n 浪头: 'làng tou',\r\n 砚台: 'yàn tái',\r\n 油坊: 'yóu fáng',\r\n 学长: 'xué zhǎng',\r\n 过载: 'guò zài',\r\n 笔调: 'bǐ diào',\r\n 衣被: 'yī bèi',\r\n 畜产: 'xù chǎn',\r\n 调阅: 'diào yuè',\r\n 蛮干: 'mán gàn',\r\n 曾祖: 'zēng zǔ',\r\n 提干: 'tí gàn',\r\n 变调: 'biàn diào',\r\n 覆没: 'fù mò',\r\n 模子: 'mú zi',\r\n 乐律: 'yuè lǜ',\r\n 称心: 'chèn xīn',\r\n 木杆: 'mù gān',\r\n 重印: 'chóng yìn',\r\n 自省: 'zì xǐng',\r\n 提调: 'tí diào',\r\n 看相: 'kàn xiàng',\r\n 芋头: 'yù tou',\r\n 下切: 'xià qiē',\r\n 塞上: 'sài shàng',\r\n 铺张: 'pū zhāng',\r\n 藤蔓: 'téng wàn',\r\n 薄幸: 'bó xìng',\r\n 解数: 'xiè shù',\r\n 褪去: 'tuì qù',\r\n 霰弹: 'xiàn dàn',\r\n 柚木: 'yóu mù',\r\n 痕量: 'hén liàng',\r\n 雅乐: 'yǎ yuè',\r\n 号哭: 'háo kū',\r\n 诈降: 'zhà xiáng',\r\n 猪圈: 'zhū juàn',\r\n 咋舌: 'zé shé',\r\n 铣床: 'xǐ chuáng',\r\n 防弹: 'fáng dàn',\r\n 健将: 'jiàn jiàng',\r\n 丽水: 'lí shuǐ',\r\n 削发: 'xuē fà',\r\n 空当: 'kòng dāng',\r\n 多相: 'duō xiàng',\r\n 鲜见: 'xiǎn jiàn',\r\n 划桨: 'huá jiǎng',\r\n 载波: 'zài bō',\r\n 跳蚤: 'tiào zao',\r\n 俏皮: 'qiào pí',\r\n 吧嗒: 'bā dā',\r\n 结发: 'jié fà',\r\n 了断: 'liǎo duàn',\r\n 同调: 'tóng diào',\r\n 石磨: 'shí mò',\r\n 时差: 'shí chā',\r\n 鼻塞: 'bí sè',\r\n 挑子: 'tiāo zi',\r\n 推磨: 'tuī mò',\r\n 武侯: 'wǔ hóu',\r\n 抹煞: 'mǒ shā',\r\n 调转: 'diào zhuǎn',\r\n 籍没: 'jí mò',\r\n 还债: 'huán zhài',\r\n 调演: 'diào yǎn',\r\n 分划: 'fēn huá',\r\n 奇偶: 'jī ǒu',\r\n 断喝: 'duàn hè',\r\n 闷雷: 'mèn léi',\r\n 狼藉: 'láng jí',\r\n 饭量: 'fàn liàng',\r\n 还礼: 'huán lǐ',\r\n 转调: 'zhuǎn diào',\r\n 星相: 'xīng xiàng',\r\n 手相: 'shǒu xiàng',\r\n 配乐: 'pèi yuè',\r\n 盖头: 'gài tou',\r\n 连杆: 'lián gǎn',\r\n 簿记: 'bù jì',\r\n 刀把: 'dāo bà',\r\n 量词: 'liàng cí',\r\n 名角: 'míng jué',\r\n 步调: 'bù diào',\r\n 校本: 'jiào běn',\r\n 账簿: 'zhàng bù',\r\n 隽永: 'juàn yǒng',\r\n 稍为: 'shāo wéi',\r\n 易传: 'yì zhuàn',\r\n 乐谱: 'yuè pǔ',\r\n 牵累: 'qiān lěi',\r\n 答理: 'dā li',\r\n 喝斥: 'hè chì',\r\n 吟哦: 'yín é',\r\n 干渠: 'gàn qú',\r\n 海量: 'hǎi liàng',\r\n 精当: 'jīng dàng',\r\n 着床: 'zhuó chuáng',\r\n 月相: 'yuè xiàng',\r\n 庶几: 'shù jī',\r\n 宫观: 'gōng guàn',\r\n 论处: 'lùn chǔ',\r\n 征辟: 'zhēng bì',\r\n 厚朴: 'hòu pò',\r\n 介壳: 'jiè qiào',\r\n 吭哧: 'kēng chī',\r\n 咯血: 'kǎ xiě',\r\n 铺陈: 'pū chén',\r\n 重生: 'chóng shēng',\r\n 乐理: 'yuè lǐ',\r\n 哀号: 'āi háo',\r\n 藏历: 'zàng lì',\r\n 刚劲: 'gāng jìng',\r\n 削平: 'xuē píng',\r\n 浓荫: 'nóng yīn',\r\n 城垛: 'chéng duǒ',\r\n 当差: 'dāng chāi',\r\n 正传: 'zhèng zhuàn',\r\n 并处: 'bìng chǔ',\r\n 创面: 'chuāng miàn',\r\n 旦角: 'dàn jué',\r\n 薄礼: 'bó lǐ',\r\n 晃荡: 'huàng dang',\r\n 臊子: 'sào zi',\r\n 家什: 'jiā shí',\r\n 闷头: 'mēn tóu',\r\n 美发: 'měi fà',\r\n 度数: 'dù shu',\r\n 着凉: 'zháo liáng',\r\n 闯将: 'chuǎng jiàng',\r\n 几案: 'jī àn',\r\n 姘头: 'pīn tou',\r\n 差数: 'chā shù',\r\n 散碎: 'sǎn suì',\r\n 壅塞: 'yōng sè',\r\n 寒颤: 'hán zhàn',\r\n 牵强: 'qiān qiǎng',\r\n 无间: 'wú jiàn',\r\n 轮转: 'lún zhuàn',\r\n 号叫: 'háo jiào',\r\n 铺排: 'pū pái',\r\n 降伏: 'xiáng fú',\r\n 轧钢: 'zhá gāng',\r\n 东阿: 'dōng ē',\r\n 病假: 'bìng jià',\r\n 累加: 'lěi jiā',\r\n 梗塞: 'gěng sè',\r\n 弹夹: 'dàn jiā',\r\n 钻心: 'zuān xīn',\r\n 晃眼: 'huǎng yǎn',\r\n 魔爪: 'mó zhǎo',\r\n 标量: 'biāo liàng',\r\n 憋闷: 'biē mèn',\r\n 猜度: 'cāi duó',\r\n 处士: 'chǔ shì',\r\n 官差: 'guān chāi',\r\n 讨还: 'tǎo huán',\r\n 长门: 'cháng mén',\r\n 馏分: 'liú fēn',\r\n 里弄: 'lǐ lòng',\r\n 色相: 'sè xiàng',\r\n 雅兴: 'yǎ xìng',\r\n 角力: 'jué lì',\r\n 弹坑: 'dàn kēng',\r\n 枝杈: 'zhī chà',\r\n 夹具: 'jiā jù',\r\n 处刑: 'chǔ xíng',\r\n 悍将: 'hàn jiàng',\r\n 好学: 'hào xué',\r\n 好好: 'hǎo hǎo',\r\n 银发: 'yín fà',\r\n 扫把: 'sào bǎ',\r\n 法相: 'fǎ xiàng',\r\n 贵干: 'guì gàn',\r\n 供气: 'gōng qì',\r\n 空余: 'kòng yú',\r\n 捆扎: 'kǔn zā',\r\n 瘠薄: 'jí bó',\r\n 浆糊: 'jiàng hu',\r\n 嘎吱: 'gā zhī',\r\n 调令: 'diào lìng',\r\n 法帖: 'fǎ tiè',\r\n 淋病: 'lìn bìng',\r\n 调派: 'diào pài',\r\n 转盘: 'zhuàn pán',\r\n 供稿: 'gōng gǎo',\r\n 差官: 'chāi guān',\r\n 忧闷: 'yōu mèn',\r\n 教长: 'jiào zhǎng',\r\n 重唱: 'chóng chàng',\r\n 酒兴: 'jiǔ xìng',\r\n 乐坛: 'yuè tán',\r\n 花呢: 'huā ní',\r\n 叱喝: 'chì hè',\r\n 膀臂: 'bǎng bì',\r\n 得空: 'dé kòng',\r\n 转圈: 'zhuàn quān',\r\n 横暴: 'hèng bào',\r\n 哄抬: 'hōng tái',\r\n 引吭: 'yǐn háng',\r\n 载货: 'zài huò',\r\n 中计: 'zhòng jì',\r\n 官长: 'guān zhǎng',\r\n 相面: 'xiàng miàn',\r\n 看头: 'kàn tou',\r\n 盼头: 'pàn tou',\r\n 意兴: 'yì xìng',\r\n 军乐: 'jūn yuè',\r\n 累次: 'lěi cì',\r\n 骨嘟: 'gǔ dū',\r\n 燕赵: 'yān zhào',\r\n 报丧: 'bào sāng',\r\n 弥撒: 'mí sa',\r\n 挨斗: 'ái dòu',\r\n 扁舟: 'piān zhōu',\r\n 丑角: 'chǒu jué',\r\n 吊丧: 'diào sāng',\r\n 强将: 'qiáng jiàng',\r\n 重奏: 'chóng zòu',\r\n 发辫: 'fà biàn',\r\n 着魔: 'zháo mó',\r\n 着法: 'zhāo fǎ',\r\n 盛放: 'shèng fàng',\r\n 填塞: 'tián sè',\r\n 凶横: 'xiōng hèng',\r\n 稽首: 'qǐ shǒu',\r\n 碑帖: 'bēi tiè',\r\n 冲量: 'chōng liàng',\r\n 发菜: 'fà cài',\r\n 假发: 'jiǎ fà',\r\n 翻卷: 'fān juǎn',\r\n 小量: 'xiǎo liàng',\r\n 胶着: 'jiāo zhuó',\r\n 里子: 'lǐ zi',\r\n 调调: 'diào diao',\r\n 散兵: 'sǎn bīng',\r\n 高挑: 'gāo tiǎo',\r\n 播撒: 'bō sǎ',\r\n 夹心: 'jiā xīn',\r\n 扇动: 'shān dòng',\r\n 叨扰: 'tāo rǎo',\r\n 霓裳: 'ní cháng',\r\n 捻子: 'niǎn zi',\r\n 弥缝: 'mí féng',\r\n 撒布: 'sǎ bù',\r\n 场院: 'cháng yuàn',\r\n 省亲: 'xǐng qīn',\r\n 提拉: 'tí lā',\r\n 惯量: 'guàn liàng',\r\n 强逼: 'qiáng bī',\r\n 强征: 'qiáng zhēng',\r\n 晕车: 'yùn chē',\r\n 数道: 'shù dào',\r\n 带累: 'dài lèi',\r\n 拓本: 'tà běn',\r\n 嫌恶: 'xián wù',\r\n 宿将: 'sù jiàng',\r\n 龟裂: 'jūn liè',\r\n 缠夹: 'chán jiā',\r\n 发式: 'fà shì',\r\n 隔扇: 'gé shàn',\r\n 天分: 'tiān fèn',\r\n 癖好: 'pǐ hào',\r\n 四通: 'sì tōng',\r\n 白术: 'bái zhú',\r\n 划伤: 'huá shāng',\r\n 角斗: 'jué dòu',\r\n 听差: 'tīng chāi',\r\n 岁差: 'suì chā',\r\n 丧礼: 'sāng lǐ',\r\n 脉脉: 'mò mò',\r\n 削瘦: 'xuē shòu',\r\n 撒播: 'sǎ bō',\r\n 莎草: 'suō cǎo',\r\n 犍为: 'qián wéi',\r\n 调头: 'diào tóu',\r\n 龙卷: 'lóng juǎn',\r\n 外调: 'wài diào',\r\n 字帖: 'zì tiè',\r\n 卷发: 'juǎn fà',\r\n 揣度: 'chuǎi duó',\r\n 洋相: 'yáng xiàng',\r\n 散光: 'sǎn guāng',\r\n 骨碌: 'gū lu',\r\n 薄命: 'bó mìng',\r\n 笼头: 'lóng tóu',\r\n 咽炎: 'yān yán',\r\n 碌碡: 'liù zhou',\r\n 片儿: 'piàn er',\r\n 纤手: 'qiàn shǒu',\r\n 散体: 'sǎn tǐ',\r\n 内省: 'nèi xǐng',\r\n 强留: 'qiáng liú',\r\n 解送: 'jiè sòng',\r\n 反间: 'fǎn jiàn',\r\n 少壮: 'shào zhuàng',\r\n 留空: 'liú kōng',\r\n 告假: 'gào jià',\r\n 咳血: 'ké xuè',\r\n 薄暮: 'bó mù',\r\n 铺轨: 'pū guǐ',\r\n 磨削: 'mó xuē',\r\n 治丧: 'zhì sāng',\r\n 叉子: 'chā zi',\r\n 哄动: 'hōng dòng',\r\n 蛾子: 'é zi',\r\n 出落: 'chū luò',\r\n 股长: 'gǔ zhǎng',\r\n 贵处: 'guì chù',\r\n 还魂: 'huán hún',\r\n 例假: 'lì jià',\r\n 刹住: 'shā zhù',\r\n 身量: 'shēn liàng',\r\n 同好: 'tóng hào',\r\n 模量: 'mó liàng',\r\n 更生: 'gēng shēng',\r\n 服丧: 'fú sāng',\r\n 率直: 'shuài zhí',\r\n 字模: 'zì mú',\r\n 散架: 'sǎn jià',\r\n 答腔: 'dā qiāng',\r\n 交恶: 'jiāo wù',\r\n 薄情: 'bó qíng',\r\n 眼泡: 'yǎn pāo',\r\n 袅娜: 'niǎo nuó',\r\n 草垛: 'cǎo duò',\r\n 冲劲: 'chòng jìn',\r\n 呢喃: 'ní nán',\r\n 切中: 'qiè zhòng',\r\n 挑灯: 'tiǎo dēng',\r\n 还愿: 'huán yuàn',\r\n 激将: 'jī jiàng',\r\n 更鼓: 'gēng gǔ',\r\n 没药: 'mò yào',\r\n 败兴: 'bài xìng',\r\n 切面: 'qiē miàn',\r\n 散户: 'sǎn hù',\r\n 累进: 'lěi jìn',\r\n 背带: 'bēi dài',\r\n 秤杆: 'chèng gǎn',\r\n 碾坊: 'niǎn fáng',\r\n 簿子: 'bù zi',\r\n 扳手: 'bān shǒu',\r\n 铅山: 'yán shān',\r\n 儒将: 'rú jiàng',\r\n 重光: 'chóng guāng',\r\n 剪发: 'jiǎn fà',\r\n 长上: 'zhǎng shàng',\r\n 小传: 'xiǎo zhuàn',\r\n 压轴: 'yā zhòu',\r\n 弱冠: 'ruò guàn',\r\n 花卷: 'huā juǎn',\r\n 横祸: 'hèng huò',\r\n 夹克: 'jiā kè',\r\n 光晕: 'guāng yùn',\r\n 披靡: 'pī mǐ',\r\n 对调: 'duì diào',\r\n 夹持: 'jiā chí',\r\n 空额: 'kòng é',\r\n 平调: 'píng diào',\r\n 铺床: 'pū chuáng',\r\n 丧钟: 'sāng zhōng',\r\n 作乐: 'zuò lè',\r\n 少府: 'shào fǔ',\r\n 数数: 'shuò shuò',\r\n 奔头: 'bèn tou',\r\n 进给: 'jìn jǐ',\r\n 率性: 'shuài xìng',\r\n 乐子: 'lè zi',\r\n 绑扎: 'bǎng zā',\r\n 挑唆: 'tiǎo suō',\r\n 漂洗: 'piǎo xǐ',\r\n 夹墙: 'jiā qiáng',\r\n 咳喘: 'ké chuǎn',\r\n 乜斜: 'miē xie',\r\n 错处: 'cuò chù',\r\n 闷酒: 'mèn jiǔ',\r\n 时调: 'shí diào',\r\n 重孙: 'chóng sūn',\r\n 经幢: 'jīng chuáng',\r\n 圩场: 'xū chǎng',\r\n 调门: 'diào mén',\r\n 花头: 'huā tóu',\r\n 划拉: 'huá la',\r\n 套色: 'tào shǎi',\r\n 粗率: 'cū shuài',\r\n 相率: 'xiāng shuài',\r\n 款识: 'kuǎn zhì',\r\n 吁请: 'yù qǐng',\r\n 荫蔽: 'yīn bì',\r\n 文蛤: 'wén gé',\r\n 嘀嗒: 'dī dā',\r\n 调取: 'diào qǔ',\r\n 交差: 'jiāo chāi',\r\n 落子: 'luò zǐ',\r\n 相册: 'xiàng cè',\r\n 絮叨: 'xù dao',\r\n 落发: 'luò fà',\r\n 异相: 'yì xiàng',\r\n 浸没: 'jìn mò',\r\n 角抵: 'jué dǐ',\r\n 卸载: 'xiè zài',\r\n 春卷: 'chūn juǎn',\r\n 扎挣: 'zhá zheng',\r\n 畜养: 'xù yǎng',\r\n 吡咯: 'bǐ luò',\r\n 垛子: 'duò zi',\r\n 恶少: 'è shào',\r\n 发际: 'fà jì',\r\n 红苕: 'hóng sháo',\r\n 糨糊: 'jiàng hu',\r\n 哭丧: 'kū sāng',\r\n 稍息: 'shào xī',\r\n 晕船: 'yùn chuán',\r\n 校样: 'jiào yàng',\r\n 外差: 'wài chā',\r\n 脚爪: 'jiǎo zhǎo',\r\n 铺展: 'pū zhǎn',\r\n 芫荽: 'yán sui',\r\n 夹紧: 'jiā jǐn',\r\n 尿泡: 'suī pào',\r\n 丧乱: 'sāng luàn',\r\n 凶相: 'xiōng xiàng',\r\n 华发: 'huá fà',\r\n 打场: 'dǎ cháng',\r\n 云量: 'yún liàng',\r\n 正切: 'zhèng qiē',\r\n 划拳: 'huá quán',\r\n 划艇: 'huá tǐng',\r\n 评传: 'píng zhuàn',\r\n 拉纤: 'lā qiàn',\r\n 句读: 'jù dòu',\r\n 散剂: 'sǎn jì',\r\n 骨殖: 'gǔ shi',\r\n 塞音: 'sè yīn',\r\n 铺叙: 'pū xù',\r\n 阏氏: 'yān zhī',\r\n 冷颤: 'lěng zhàn',\r\n 煞住: 'shā zhù',\r\n 少男: 'shào nán',\r\n 管乐: 'guǎn yuè',\r\n 号啕: 'háo táo',\r\n 纳降: 'nà xiáng',\r\n 拥塞: 'yōng sè',\r\n 万乘: 'wàn shèng',\r\n 杆儿: 'gǎn ér',\r\n 葛藤: 'gé téng',\r\n 簿籍: 'bù jí',\r\n 皮夹: 'pí jiā',\r\n 校准: 'jiào zhǔn',\r\n 允当: 'yǔn dàng',\r\n 器量: 'qì liàng',\r\n 选调: 'xuǎn diào',\r\n 扮相: 'bàn xiàng',\r\n 干才: 'gàn cái',\r\n 基干: 'jī gàn',\r\n 割切: 'gē qiē',\r\n 国乐: 'guó yuè',\r\n 卡壳: 'qiǎ ké',\r\n 辟谷: 'bì gǔ',\r\n 磨房: 'mò fáng',\r\n 咿呀: 'yī yā',\r\n 芥末: 'jiè mo',\r\n 薄技: 'bó jì',\r\n 产假: 'chǎn jià',\r\n 诗兴: 'shī xìng',\r\n 重出: 'chóng chū',\r\n 转椅: 'zhuàn yǐ',\r\n 酌量: 'zhuó liang',\r\n 簿册: 'bù cè',\r\n 藏青: 'zàng qīng',\r\n 的士: 'dī shì',\r\n 调人: 'diào rén',\r\n 解元: 'jiè yuán',\r\n 茎干: 'jīng gàn',\r\n 巨量: 'jù liàng',\r\n 榔头: 'láng tou',\r\n 率真: 'shuài zhēn',\r\n 喷香: 'pèn xiāng',\r\n 锁钥: 'suǒ yuè',\r\n 虾蟆: 'há má',\r\n 相图: 'xiàng tú',\r\n 兴会: 'xìng huì',\r\n 灶头: 'zào tóu',\r\n 重婚: 'chóng hūn',\r\n 钻洞: 'zuān dòng',\r\n 忖度: 'cǔn duó',\r\n 党参: 'dǎng shēn',\r\n 调温: 'diào wēn',\r\n 杆塔: 'gān tǎ',\r\n 葛布: 'gé bù',\r\n 拱券: 'gǒng xuàn',\r\n 夹生: 'jiā shēng',\r\n 露馅: 'lòu xiàn',\r\n 恰切: 'qià qiè',\r\n 散见: 'sǎn jiàn',\r\n 哨卡: 'shào qiǎ',\r\n 烫发: 'tàng fà',\r\n 体量: 'tǐ liàng',\r\n 挺括: 'tǐng kuò',\r\n 系带: 'jì dài',\r\n 相士: 'xiàng shì',\r\n 羊圈: 'yáng juàn',\r\n 转矩: 'zhuàn jǔ',\r\n 吧台: 'bā tái',\r\n 苍术: 'cāng zhú',\r\n 菲薄: 'fěi bó',\r\n 蛤蚧: 'gé jiè',\r\n 蛤蜊: 'gé lí',\r\n 瓜蔓: 'guā wàn',\r\n 怪相: 'guài xiàng',\r\n 临帖: 'lín tiè',\r\n 女红: 'nǚ gōng',\r\n 刨床: 'bào chuáng',\r\n 翘楚: 'qiáo chǔ',\r\n 数九: 'shǔ jiǔ',\r\n 谈兴: 'tán xìng',\r\n 雄劲: 'xióng jìng',\r\n 扎染: 'zā rǎn',\r\n 遮荫: 'zhē yīn',\r\n 周正: 'zhōu zhèng',\r\n 赚头: 'zhuàn tou',\r\n 扒手: 'pá shǒu',\r\n 搀和: 'chān huo',\r\n 诚朴: 'chéng pǔ',\r\n 肚量: 'dù liàng',\r\n 干结: 'gān jié',\r\n 工尺: 'gōng chě',\r\n 家累: 'jiā lěi',\r\n 曲水: 'qū shuǐ',\r\n 沙参: 'shā shēn',\r\n 挑花: 'tiǎo huā',\r\n 阿门: 'ā mén',\r\n 背篓: 'bēi lǒu',\r\n 瘪三: 'biē sān',\r\n 裁处: 'cái chǔ',\r\n 创痛: 'chuāng tòng',\r\n 福相: 'fú xiàng',\r\n 更动: 'gēng dòng',\r\n 豪兴: 'háo xìng',\r\n 还阳: 'huán yáng',\r\n 还嘴: 'huán zuǐ',\r\n 借调: 'jiè diào',\r\n 卷云: 'juǎn yún',\r\n 流弹: 'liú dàn',\r\n 想头: 'xiǎng tou',\r\n 削价: 'xuē jià',\r\n 校阅: 'jiào yuè',\r\n 雅量: 'yǎ liàng',\r\n 别传: 'bié zhuàn',\r\n 薄酒: 'bó jiǔ',\r\n 春假: 'chūn jià',\r\n 发妻: 'fà qī',\r\n 哗哗: 'huā huā',\r\n 宽绰: 'kuān chuo',\r\n 了悟: 'liǎo wù',\r\n 切花: 'qiē huā',\r\n 审度: 'shěn duó',\r\n 应许: 'yīng xǔ',\r\n 转台: 'zhuàn tái',\r\n 仔猪: 'zǐ zhū',\r\n 裁量: 'cái liáng',\r\n 藏戏: 'zàng xì',\r\n 乘兴: 'chéng xìng',\r\n 绸缪: 'chóu móu',\r\n 摧折: 'cuī zhé',\r\n 调经: 'tiáo jīng',\r\n 调职: 'diào zhí',\r\n 缝缀: 'féng zhuì',\r\n 骨朵: 'gū duǒ',\r\n 核儿: 'hú er',\r\n 恒量: 'héng liàng',\r\n 还价: 'huán jià',\r\n 浑朴: 'hún pǔ',\r\n 苦差: 'kǔ chāi',\r\n 面糊: 'miàn hù',\r\n 煞车: 'shā chē',\r\n 省视: 'xǐng shì',\r\n 什锦: 'shí jǐn',\r\n 信差: 'xìn chāi',\r\n 余切: 'yú qiē',\r\n 攒眉: 'cuán méi',\r\n 炸糕: 'zhá gāo',\r\n 钻杆: 'zuàn gǎn',\r\n 扒灰: 'pá huī',\r\n 拌和: 'bàn huò',\r\n 长调: 'cháng diào',\r\n 大溜: 'dà liù',\r\n 抖搂: 'dǒu lōu',\r\n 飞转: 'fēi zhuàn',\r\n 干仗: 'gàn zhàng',\r\n 好胜: 'hào shèng',\r\n 画片: 'huà piàn',\r\n 搅混: 'jiǎo hún',\r\n 螺杆: 'luó gǎn',\r\n 木模: 'mù mú',\r\n 怒号: 'nù háo',\r\n 频数: 'pín shù',\r\n 无宁: 'wú níng',\r\n 遗少: 'yí shào',\r\n 邮差: 'yóu chāi',\r\n 占卦: 'zhān guà',\r\n 占星: 'zhān xīng',\r\n 重审: 'chóng shěn',\r\n 自量: 'zì liàng',\r\n 调防: 'diào fáng',\r\n 发廊: 'fà láng',\r\n 反调: 'fǎn diào',\r\n 缝子: 'fèng zi',\r\n 更夫: 'gēng fū',\r\n 骨子: 'gǔ zi',\r\n 光杆: 'guāng gǎn',\r\n 夹棍: 'jiā gùn',\r\n 居丧: 'jū sāng',\r\n 巨贾: 'jù gǔ',\r\n 看押: 'kān yā',\r\n 空转: 'kōng zhuàn',\r\n 量力: 'liàng lì',\r\n 炮烙: 'páo luò',\r\n 赔还: 'péi huán',\r\n 扑扇: 'pū shān',\r\n 散记: 'sǎn jì',\r\n 散件: 'sǎn jiàn',\r\n 删削: 'shān xuē',\r\n 射干: 'shè gàn',\r\n 条几: 'tiáo jī',\r\n 偷空: 'tōu kòng',\r\n 削壁: 'xuē bì',\r\n 校核: 'jiào hé',\r\n 阴干: 'yīn gān',\r\n 择菜: 'zhái cài',\r\n 重九: 'chóng jiǔ',\r\n 主调: 'zhǔ diào',\r\n 自禁: 'zì jīn',\r\n 吧唧: 'bā jī',\r\n 便溺: 'biàn niào',\r\n 词调: 'cí diào',\r\n 叨咕: 'dáo gu',\r\n 落枕: 'lào zhěn',\r\n 铺砌: 'pū qì',\r\n 刷白: 'shuà bái',\r\n 委靡: 'wěi mǐ',\r\n 系泊: 'xì bó',\r\n 相马: 'xiàng mǎ',\r\n 熨帖: 'yù tiē',\r\n 转筋: 'zhuàn jīn',\r\n 棒喝: 'bàng hè',\r\n 傧相: 'bīn xiàng',\r\n 镐头: 'gǎo tóu',\r\n 间苗: 'jiàn miáo',\r\n 乐池: 'yuè chí',\r\n 卖相: 'mài xiàng',\r\n 屏弃: 'bǐng qì',\r\n 铅弹: 'qiān dàn',\r\n 切变: 'qiē biàn',\r\n 请调: 'qǐng diào',\r\n 群氓: 'qún méng',\r\n 散板: 'sǎn bǎn',\r\n 省察: 'xǐng chá',\r\n 事假: 'shì jià',\r\n 纤绳: 'qiàn shéng',\r\n 重影: 'chóng yǐng',\r\n 耕种: 'gēng zhòng',\r\n 种地: 'zhòng dì',\r\n 种菜: 'zhòng cài',\r\n 栽种: 'zāi zhòng',\r\n 接种: 'jiē zhòng',\r\n 垦种: 'kěn zhòng',\r\n 种殖: 'zhòng zhí',\r\n 种瓜: 'zhòng guā',\r\n 种豆: 'zhòng dòu',\r\n 种树: 'zhòng shù',\r\n 睡着: 'shuì zháo',\r\n 笼子: 'lóng zi',\r\n 重启: 'chóng qǐ',\r\n 重整: 'chóng zhěng',\r\n 重弹: 'chóng tán',\r\n 重足: 'chóng zú',\r\n 重山: 'chóng shān',\r\n 重游: 'chóng yóu',\r\n 重峦: 'chóng luán',\r\n 爷爷: 'yé ye',\r\n 奶奶: 'nǎi nai',\r\n 姥爷: 'lǎo ye',\r\n 爸爸: 'bà ba',\r\n 妈妈: 'mā ma',\r\n 婶婶: 'shěn shen',\r\n 舅舅: 'jiù jiu',\r\n 姑姑: 'gū gu',\r\n 叔叔: 'shū shu',\r\n 姨夫: 'yí fu',\r\n 舅母: 'jiù mu',\r\n 姑父: 'gū fu',\r\n 姐夫: 'jiě fu',\r\n 婆婆: 'pó po',\r\n 公公: 'gōng gong',\r\n 舅子: 'jiù zi',\r\n 姐姐: 'jiě jie',\r\n 哥哥: 'gē ge',\r\n 妹妹: 'mèi mei',\r\n 妹夫: 'mèi fu',\r\n 姨子: 'yí zi',\r\n 宝宝: 'bǎo bao',\r\n 娃娃: 'wá wa',\r\n 孩子: 'hái zi',\r\n 日子: 'rì zi',\r\n 样子: 'yàng zi',\r\n 狮子: 'shī zi',\r\n 身子: 'shēn zi',\r\n 架子: 'jià zi',\r\n 嫂子: 'sǎo zi',\r\n 鼻子: 'bí zi',\r\n 亭子: 'tíng zi',\r\n 折子: 'zhé zi',\r\n 面子: 'miàn zi',\r\n 脖子: 'bó zi',\r\n 辈子: 'bèi zi',\r\n 帽子: 'mào zi',\r\n 拍子: 'pāi zi',\r\n 柱子: 'zhù zi',\r\n 辫子: 'biàn zi',\r\n 鸽子: 'gē zi',\r\n 房子: 'fáng zi',\r\n 丸子: 'wán zi',\r\n 摊子: 'tān zi',\r\n 牌子: 'pái zi',\r\n 胡子: 'hú zi',\r\n 鬼子: 'guǐ zi',\r\n 矮子: 'ǎi zi',\r\n 鸭子: 'yā zi',\r\n 小子: 'xiǎo zi',\r\n 影子: 'yǐng zi',\r\n 屋子: 'wū zi',\r\n 对子: 'duì zi',\r\n 点子: 'diǎn zi',\r\n 本子: 'běn zi',\r\n 种子: 'zhǒng zi',\r\n 儿子: 'ér zi',\r\n 兔子: 'tù zi',\r\n 骗子: 'piàn zi',\r\n 院子: 'yuàn zi',\r\n 猴子: 'hóu zi',\r\n 嗓子: 'sǎng zi',\r\n 侄子: 'zhí zi',\r\n 柿子: 'shì zi',\r\n 钳子: 'qián zi',\r\n 虱子: 'shī zi',\r\n 瓶子: 'píng zi',\r\n 豹子: 'bào zi',\r\n 筷子: 'kuài zi',\r\n 篮子: 'lán zi',\r\n 绳子: 'shéng zi',\r\n 嘴巴: 'zuǐ ba',\r\n 耳朵: 'ěr duo',\r\n 茄子: 'qié zi',\r\n 蚌埠: 'bèng bù',\r\n 崆峒: 'kōng tóng',\r\n 琵琶: 'pí pa',\r\n 蘑菇: 'mó gu',\r\n 葫芦: 'hú lu',\r\n 狐狸: 'hú li',\r\n 桔子: 'jú zi',\r\n 盒子: 'hé zi',\r\n 桌子: 'zhuō zi',\r\n 竹子: 'zhú zi',\r\n 师傅: 'shī fu',\r\n 衣服: 'yī fu',\r\n 袜子: 'wà zi',\r\n 杯子: 'bēi zi',\r\n 刺猬: 'cì wei',\r\n 麦子: 'mài zi',\r\n 队伍: 'duì wu',\r\n 知了: 'zhī liǎo',\r\n 鱼儿: 'yú er',\r\n 馄饨: 'hún tun',\r\n 灯笼: 'dēng long',\r\n 庄稼: 'zhuāng jia',\r\n 聪明: 'cōng ming',\r\n 镜子: 'jìng zi',\r\n 银子: 'yín zi',\r\n 盘子: 'pán zi',\r\n 了却: 'liǎo què',\r\n 力气: 'lì qi',\r\n 席子: 'xí zi',\r\n 林子: 'lín zi',\r\n 朝霞: 'zhāo xiá',\r\n 朝夕: 'zhāo xī',\r\n 朝气: 'zhāo qì',\r\n 翅膀: 'chì bǎng',\r\n 省长: 'shěng zhǎng',\r\n 臧否: 'zāng pǐ',\r\n 否泰: 'pǐ tài',\r\n 变得: 'biàn de',\r\n 丈夫: 'zhàng fu',\r\n 豆腐: 'dòu fu',\r\n 笔杆: 'bǐ gǎn',\r\n 枞阳: 'zōng yáng',\r\n 行人: 'xíng rén',\r\n 打着: 'dǎ zhe',\r\n // 一字不变调的词语(需要增补更多)\r\n // 有歧义的词:一楼、一栋、一层、一排、一连\r\n // “一楼”这个词,上下文语意是“一整栋楼”时,需要变调成四声;我住一楼时,则是一声\r\n 第一: 'dì yī',\r\n 万一: 'wàn yī',\r\n 之一: 'zhī yī',\r\n 得之: 'dé zhī',\r\n 统一: 'tǒng yī',\r\n 唯一: 'wéi yī',\r\n 专一: 'zhuān yī',\r\n 单一: 'dān yī',\r\n 如一: 'rú yī',\r\n 其一: 'qí yī',\r\n 合一: 'hé yī',\r\n 逐一: 'zhú yī',\r\n 周一: 'zhōu yī',\r\n 初一: 'chū yī',\r\n 研一: 'yán yī',\r\n 归一: 'guī yī',\r\n 假一: 'jiǎ yī',\r\n 闻一: 'wén yī',\r\n 了了: 'liǎo liǎo',\r\n 公了: 'gōng liǎo',\r\n 私了: 'sī liǎo',\r\n // 一 发音\r\n 一月: 'yī yuè',\r\n 一号: 'yī hào',\r\n 一级: 'yī jí',\r\n 一等: 'yī děng',\r\n 一哥: 'yī gē',\r\n 月一: 'yuè yī',\r\n 一一: 'yī yī',\r\n 二一: 'èr yī',\r\n 三一: 'sān yī',\r\n 四一: 'sì yī',\r\n 五一: 'wǔ yī',\r\n 六一: 'liù yī',\r\n 七一: 'qī yī',\r\n 八一: 'bā yī',\r\n 九一: 'jiǔ yī',\r\n 一〇: 'yī líng',\r\n 一零: 'yī líng',\r\n 一二: 'yī èr',\r\n 一三: 'yī sān',\r\n 一四: 'yī sì',\r\n 一五: 'yī wǔ',\r\n 一六: 'yī liù',\r\n 一七: 'yī qī',\r\n 一八: 'yī bā',\r\n 一九: 'yī jiǔ',\r\n 一又: 'yī yòu',\r\n 一饼: 'yī bǐng',\r\n 一楼: 'yī lóu',\r\n 为例: 'wéi lì',\r\n 为准: 'wéi zhǔn',\r\n 沧海: 'cāng hǎi',\r\n 难为: 'nán wéi',\r\n 责难: 'zé nàn',\r\n 患难: 'huàn nàn',\r\n 磨难: 'mó nàn',\r\n 大难: 'dà nàn',\r\n 刁难: 'diāo nàn',\r\n 殉难: 'xùn nàn',\r\n 落难: 'luò nàn',\r\n 罹难: 'lí nàn',\r\n 灾难: 'zāi nàn',\r\n 难民: 'nàn mín',\r\n 苦难: 'kǔ nàn',\r\n 危难: 'wēi nàn',\r\n 发难: 'fā nàn',\r\n 逃难: 'táo nàn',\r\n 避难: 'bì nàn',\r\n 遇难: 'yù nàn',\r\n 阻难: 'zǔ nàn',\r\n 厄难: 'è nàn',\r\n 徇难: 'xùn nàn',\r\n 空难: 'kōng nàn',\r\n 喜欢: 'xǐ huan',\r\n 朝朝: 'zhāo zhāo',\r\n 不行: 'bù xíng',\r\n 轧轧: 'yà yà',\r\n 弯曲: 'wān qū',\r\n 扭曲: 'niǔ qū',\r\n 曲直: 'qū zhí',\r\n 委曲: 'wěi qū',\r\n 酒曲: 'jiǔ qū',\r\n 曲径: 'qū jìng',\r\n 曲解: 'qū jiě',\r\n 歪曲: 'wāi qū',\r\n 曲线: 'qū xiàn',\r\n 曲阜: 'qū fù',\r\n 九曲: 'jiǔ qū',\r\n 曲折: 'qū zhé',\r\n 曲肱: 'qū gōng',\r\n 曲意: 'qū yì',\r\n 仡佬: 'gē lǎo',\r\n};\r\nconst Pattern2 = Object.keys(DICT2).map((key) => ({\r\n zh: key,\r\n pinyin: DICT2[key],\r\n probability: 2e-8 /* Probability.DICT */,\r\n length: 2,\r\n priority: Priority.Normal,\r\n dict: Symbol('dict2'),\r\n}));\n\nexport { Pattern2, DICT2 as default };\n","import { Priority } from '../common/constant.mjs';\n\nconst DICT3 = {\r\n 为什么: 'wèi shén me',\r\n 实际上: 'shí jì shang',\r\n 检察长: 'jiǎn chá zhǎng',\r\n 干什么: 'gàn shén me',\r\n 这会儿: 'zhè huì er',\r\n 尽可能: 'jǐn kě néng',\r\n 董事长: 'dǒng shì zhǎng',\r\n 了不起: 'liǎo bù qǐ',\r\n 参谋长: 'cān móu zhǎng',\r\n 朝鲜族: 'cháo xiǎn zú',\r\n 海内外: 'hǎi nèi wài',\r\n 禁不住: 'jīn bú zhù',\r\n 柏拉图: 'bó lā tú',\r\n 不在乎: 'bú zài hu',\r\n 洛杉矶: 'luò shān jī',\r\n 有点儿: 'yǒu diǎn er',\r\n 迫击炮: 'pǎi jī pào',\r\n 不得了: 'bù dé liǎo',\r\n 马尾松: 'mǎ wěi sōng',\r\n 运输量: 'yùn shū liàng',\r\n 发脾气: 'fā pí qi',\r\n 士大夫: 'shì dà fū',\r\n 鸭绿江: 'yā lù jiāng',\r\n 压根儿: 'yà gēn er',\r\n 对得起: 'duì de qǐ',\r\n 那会儿: 'nà huì er',\r\n 自个儿: 'zì gě er',\r\n 物理量: 'wù lǐ liàng',\r\n 怎么着: 'zěn me zhāo',\r\n 明晃晃: 'míng huǎng huǎng',\r\n 节假日: 'jié jià rì',\r\n 心里话: 'xīn lǐ huà',\r\n 发行量: 'fā xíng liàng',\r\n 兴冲冲: 'xìng chōng chōng',\r\n 分子量: 'fēn zǐ liàng',\r\n 国子监: 'guó zǐ jiàn',\r\n 老大难: 'lǎo dà nán',\r\n 党内外: 'dǎng nèi wài',\r\n 这么着: 'zhè me zhāo',\r\n 少奶奶: 'shào nǎi nai',\r\n 暗地里: 'àn dì lǐ',\r\n 更年期: 'gēng nián qī',\r\n 工作量: 'gōng zuò liàng',\r\n 背地里: 'bèi dì lǐ',\r\n 山里红: 'shān li hóng',\r\n 好好儿: 'hǎo hāo er',\r\n 交响乐: 'jiāo xiǎng yuè',\r\n 好意思: 'hǎo yì si',\r\n 吐谷浑: 'tǔ yù hún',\r\n 没意思: 'méi yì si',\r\n 理发师: 'lǐ fà shī',\r\n 塔什干: 'tǎ shí gān',\r\n 充其量: 'chōng qí liàng',\r\n 靠得住: 'kào de zhù',\r\n 车行道: 'chē xíng dào',\r\n 人行道: 'rén xíng dào',\r\n 中郎将: 'zhōng láng jiàng',\r\n 照明弹: 'zhào míng dàn',\r\n 烟幕弹: 'yān mù dàn',\r\n 没奈何: 'mò nài hé',\r\n 乱哄哄: 'luàn hōng hōng',\r\n 惠更斯: 'huì gēng sī',\r\n 载重量: 'zài zhòng liàng',\r\n 瞧得起: 'qiáo de qǐ',\r\n 纪传体: 'jì zhuàn tǐ',\r\n 阿房宫: 'ē páng gōng',\r\n 卷心菜: 'juǎn xīn cài',\r\n 戏班子: 'xì bān zi',\r\n 过得去: 'guò de qù',\r\n 花岗石: 'huā gāng shí',\r\n 外甥女: 'wài sheng nǚ',\r\n 团团转: 'tuán tuán zhuàn',\r\n 大堡礁: 'dà bǎo jiāo',\r\n 燃烧弹: 'rán shāo dàn',\r\n 劳什子: 'láo shí zi',\r\n 摇滚乐: 'yáo gǔn yuè',\r\n 夹竹桃: 'jiā zhú táo',\r\n 闹哄哄: 'nào hōng hōng',\r\n 三连冠: 'sān lián guàn',\r\n 重头戏: 'zhòng tóu xì',\r\n 二人转: 'èr rén zhuàn',\r\n 节骨眼: 'jiē gǔ yǎn',\r\n 知识面: 'zhī shi miàn',\r\n 护士长: 'hù shi zhǎng',\r\n 信号弹: 'xìn hào dàn',\r\n 干电池: 'gān diàn chí',\r\n 枪杆子: 'qiāng gǎn zi',\r\n 哭丧棒: 'kū sāng bàng',\r\n 鼻咽癌: 'bí yān ái',\r\n 瓦岗军: 'wǎ gāng jūn',\r\n 买得起: 'mǎi de qǐ',\r\n 癞蛤蟆: 'lài há ma',\r\n 脊梁骨: 'jǐ liang gǔ',\r\n 子母弹: 'zǐ mǔ dàn',\r\n 开小差: 'kāi xiǎo chāi',\r\n 女强人: 'nǚ qiáng rén',\r\n 英雄传: 'yīng xióng zhuàn',\r\n 爵士乐: 'jué shì yuè',\r\n 说笑话: 'shuō xiào hua',\r\n 碰头会: 'pèng tóu huì',\r\n 玻璃钢: 'bō li gāng',\r\n 曳光弹: 'yè guāng dàn',\r\n 少林拳: 'shào lín quán',\r\n 咏叹调: 'yǒng tàn diào',\r\n 少先队: 'shào xiān duì',\r\n 灵长目: 'líng zhǎng mù',\r\n 对着干: 'duì zhe gàn',\r\n 蒙蒙亮: 'méng méng liàng',\r\n 软骨头: 'ruǎn gǔ tou',\r\n 铺盖卷: 'pū gài juǎn',\r\n 和稀泥: 'huò xī ní',\r\n 背黑锅: 'bēi hēi guō',\r\n 红彤彤: 'hóng tōng tōng',\r\n 武侯祠: 'wǔ hóu cí',\r\n 打哆嗦: 'dǎ duō suo',\r\n 户口簿: 'hù kǒu bù',\r\n 马尾藻: 'mǎ wěi zǎo',\r\n 夜猫子: 'yè māo zi',\r\n 打手势: 'dǎ shǒu shì',\r\n 龙王爷: 'lóng wáng yé',\r\n 气头上: 'qì tóu shang',\r\n 糊涂虫: 'hú tu chóng',\r\n 笔杆子: 'bǐ gǎn zi',\r\n 占便宜: 'zhàn pián yi',\r\n 打主意: 'dǎ zhǔ yì',\r\n 多弹头: 'duō dàn tóu',\r\n 露一手: 'lòu yì shǒu',\r\n 堰塞湖: 'yàn sè hú',\r\n 保得住: 'bǎo de zhù',\r\n 趵突泉: 'bào tū quán',\r\n 奥得河: 'ào de hé',\r\n 司务长: 'sī wù zhǎng',\r\n 禁不起: 'jīn bù qǐ',\r\n 什刹海: 'shí chà hǎi',\r\n 莲花落: 'lián huā lào',\r\n 见世面: 'jiàn shì miàn',\r\n 豁出去: 'huō chū qù',\r\n 电位差: 'diàn wèi chā',\r\n 挨个儿: 'āi gè er',\r\n 那阵儿: 'nà zhèn er',\r\n 肺活量: 'fèi huó liàng',\r\n 大师傅: 'dà shī fu',\r\n 掷弹筒: 'zhì dàn tǒng',\r\n 打呼噜: 'dǎ hū lu',\r\n 广渠门: 'ān qú mén',\r\n 未见得: 'wèi jiàn dé',\r\n 大婶儿: 'dà shěn er',\r\n 谈得来: 'tán de lái',\r\n 脚丫子: 'jiǎo yā zi',\r\n 空包弹: 'kōng bāo dàn',\r\n 窝里斗: 'wō li dòu',\r\n 弹着点: 'dàn zhuó diǎn',\r\n 个头儿: 'gè tóu er',\r\n 看得起: 'kàn de qǐ',\r\n 糊涂账: 'hú tu zhàng',\r\n 大猩猩: 'dà xīng xing',\r\n 禁得起: 'jīn de qǐ',\r\n 法相宗: 'fǎ xiàng zōng',\r\n 可怜相: 'kě lián xiàng',\r\n 吃得下: 'chī de xià',\r\n 汉堡包: 'hàn bǎo bāo',\r\n 闹嚷嚷: 'nào rāng rāng',\r\n 数来宝: 'shǔ lái bǎo',\r\n 合得来: 'hé de lái',\r\n 干性油: 'gān xìng yóu',\r\n 闷葫芦: 'mèn hú lu',\r\n 呱呱叫: 'guā guā jiào',\r\n 西洋参: 'xī yáng shēn',\r\n 林荫道: 'lín yīn dào',\r\n 拉家常: 'lā jiā cháng',\r\n 卷铺盖: 'juǎn pū gài',\r\n 过得硬: 'guò de yìng',\r\n 飞将军: 'fēi jiāng jūn',\r\n 挑大梁: 'tiǎo dà liáng',\r\n 哈巴狗: 'hǎ ba gǒu',\r\n 过家家: 'guò jiā jiā',\r\n 催泪弹: 'cuī lèi dàn',\r\n 雨夹雪: 'yǔ jiā xuě',\r\n 敲竹杠: 'qiāo zhú gàng',\r\n 列车长: 'liè chē zhǎng',\r\n 华达呢: 'huá dá ní',\r\n 犯得着: 'fàn de zháo',\r\n 土疙瘩: 'tǔ gē da',\r\n 煞风景: 'shā fēng jǐng',\r\n 轻量级: 'qīng liàng jí',\r\n 羞答答: 'xiū dā dā',\r\n 石子儿: 'shí zǐ er',\r\n 达姆弹: 'dá mǔ dàn',\r\n 科教片: 'kē jiào piān',\r\n 侃大山: 'kǎn dà shān',\r\n 丁点儿: 'dīng diǎn er',\r\n 吃得消: 'chī de xiāo',\r\n 捋虎须: 'luō hǔ xū',\r\n 高丽参: 'gāo lí shēn',\r\n 众生相: 'zhòng shēng xiàng',\r\n 咽峡炎: 'yān xiá yán',\r\n 禁得住: 'jīn de zhù',\r\n 吃得开: 'chī de kāi',\r\n 柞丝绸: 'zuò sī chóu',\r\n 应声虫: 'yìng shēng chóng',\r\n 数得着: 'shǔ de zháo',\r\n 傻劲儿: 'shǎ jìn er',\r\n 铅玻璃: 'qiān bō li',\r\n 可的松: 'kě dì sōng',\r\n 划得来: 'huá de lái',\r\n 晕乎乎: 'yūn hū hū',\r\n 屎壳郎: 'shǐ ke làng',\r\n 尥蹶子: 'liào juě zi',\r\n 藏红花: 'zàng hóng huā',\r\n 闷罐车: 'mèn guàn chē',\r\n 卡脖子: 'qiǎ bó zi',\r\n 红澄澄: 'hóng deng deng',\r\n 赶得及: 'gǎn de jí',\r\n 当间儿: 'dāng jiàn er',\r\n 露马脚: 'lòu mǎ jiǎo',\r\n 鸡内金: 'jī nèi jīn',\r\n 犯得上: 'fàn de shàng',\r\n 钉齿耙: 'dīng chǐ bà',\r\n 饱和点: 'bǎo hé diǎn',\r\n 龙爪槐: 'lóng zhǎo huái',\r\n 喝倒彩: 'hè dào cǎi',\r\n 定冠词: 'dìng guàn cí',\r\n 担担面: 'dàn dan miàn',\r\n 吃得住: 'chī de zhù',\r\n 爪尖儿: 'zhuǎ jiān er',\r\n 支着儿: 'zhī zhāo er',\r\n 折跟头: 'zhē gēn tou',\r\n 阴着儿: 'yīn zhāo er',\r\n 烟卷儿: 'yān juǎn er',\r\n 宣传弹: 'xuān chuán dàn',\r\n 信皮儿: 'xìn pí er',\r\n 弦切角: 'xián qiē jiǎo',\r\n 缩砂密: 'sù shā mì',\r\n 说得来: 'shuō de lái',\r\n 水漂儿: 'shuǐ piāo er',\r\n 耍笔杆: 'shuǎ bǐ gǎn',\r\n 数得上: 'shǔ de shàng',\r\n 数不着: 'shǔ bù zháo',\r\n 数不清: 'shǔ bù qīng',\r\n 什件儿: 'shí jiàn er',\r\n 生死簿: 'shēng sǐ bù',\r\n 扇风机: 'shān fēng jī',\r\n 撒呓挣: 'sā yì zheng',\r\n 日记簿: 'rì jì bù',\r\n 热得快: 'rè de kuài',\r\n 亲家公: 'qìng jia gōng',\r\n 奇函数: 'jī hán shù',\r\n 拍纸簿: 'pāi zhǐ bù',\r\n 努劲儿: 'nǔ jìn er',\r\n 泥娃娃: 'ní wá wa',\r\n 内切圆: 'nèi qiē yuán',\r\n 哪会儿: 'nǎ huì er',\r\n 闷头儿: 'mēn tóu er',\r\n 没谱儿: 'méi pǔ er',\r\n 铆劲儿: 'mǎo jìn er',\r\n 溜肩膀: 'liū jiān bǎng',\r\n 了望台: 'liào wàng tái',\r\n 老来少: 'lǎo lái shào',\r\n 坤角儿: 'kūn jué er',\r\n 考勤簿: 'kǎo qín bù',\r\n 卷笔刀: 'juǎn bǐ dāo',\r\n 进给量: 'jìn jǐ liàng',\r\n 划不来: 'huá bù lái',\r\n 汗褂儿: 'hàn guà er',\r\n 鼓囊囊: 'gǔ nāng nāng',\r\n 够劲儿: 'gòu jìn er',\r\n 公切线: 'gōng qiē xiàn',\r\n 搁得住: 'gé de zhù',\r\n 赶浪头: 'gǎn làng tóu',\r\n 赶得上: 'gǎn de shàng',\r\n 干酵母: 'gān jiào mǔ',\r\n 嘎渣儿: 'gā zhā er',\r\n 嘎嘣脆: 'gā bēng cuì',\r\n 对得住: 'duì de zhù',\r\n 逗闷子: 'dòu mèn zi',\r\n 顶呱呱: 'dǐng guā guā',\r\n 滴溜儿: 'dī liù er',\r\n 大轴子: 'dà zhòu zi',\r\n 打板子: 'dǎ bǎn zi',\r\n 寸劲儿: 'cùn jìn er',\r\n 醋劲儿: 'cù jìn er',\r\n 揣手儿: 'chuāi shǒu er',\r\n 冲劲儿: 'chòng jìn er',\r\n 吃得来: 'chī de lái',\r\n 不更事: 'bù gēng shì',\r\n 奔头儿: 'bèn tou er',\r\n 百夫长: 'bǎi fū zhǎng',\r\n 娃娃亲: 'wá wa qīn',\r\n 死劲儿: 'sǐ jìn er',\r\n 骨朵儿: 'gū duǒ er',\r\n 功劳簿: 'gōng láo bù',\r\n 都江堰: 'dū jiāng yàn',\r\n 一担水: 'yí dàn shuǐ',\r\n 否极泰: 'pǐ jí tài',\r\n 泰来否: 'tài lái pǐ',\r\n 咳特灵: 'ké tè líng',\r\n 开户行: 'kāi hù háng',\r\n 郦食其: 'lì yì jī',\r\n 花事了: 'huā shì liǎo',\r\n // 一字变调的词语(与两个字的字典冲突,故需要重新定义)\r\n 一更更: 'yì gēng gēng',\r\n 一重山: 'yì chóng shān',\r\n 风一更: 'fēng yì gēng',\r\n 雪一更: 'xuě yì gēng',\r\n 归一码: 'guī yì mǎ',\r\n // 一字不变调的词语(需要增补更多)\r\n 星期一: 'xīng qī yī',\r\n 礼拜一: 'lǐ bài yī',\r\n 一季度: 'yī jì dù',\r\n 一月一: 'yī yuè yī',\r\n 一字马: 'yī zì mǎ',\r\n 一是一: 'yī shì yī',\r\n 一次方: 'yī cì fāng',\r\n 一阳指: 'yī yáng zhǐ',\r\n 一字决: 'yī zì jué',\r\n 一年级: 'yī nián jí',\r\n 一不做: 'yī bú zuò',\r\n 屈戌儿: 'qū qu ér',\r\n 难为水: 'nán wéi shuǐ',\r\n 难为情: 'nán wéi qíng',\r\n 行一行: 'xíng yì háng',\r\n 别别的: 'biè bié de',\r\n 干哪行: 'gàn nǎ háng',\r\n 干一行: 'gàn yì háng',\r\n 曲别针: 'qū bié zhēn',\r\n};\r\nconst Pattern3 = Object.keys(DICT3).map((key) => ({\r\n zh: key,\r\n pinyin: DICT3[key],\r\n probability: 2e-8 /* Probability.DICT */,\r\n length: 3,\r\n priority: Priority.Normal,\r\n dict: Symbol('dict3'),\r\n}));\n\nexport { Pattern3, DICT3 as default };\n","import { Priority } from '../common/constant.mjs';\n\nconst DICT4 = {\r\n 成吉思汗: \"chéng jí sī hán\",\r\n 四通八达: \"sì tōng bā dá\",\r\n 一模一样: \"yì mú yí yàng\",\r\n 青藏高原: \"qīng zàng gāo yuán\",\r\n 阿弥陀佛: \"ē mí tuó fó\",\r\n 解放思想: \"jiè fàng sī xiǎng\",\r\n 所作所为: \"suǒ zuò suǒ wéi\",\r\n 迷迷糊糊: \"mí mí hu hū\",\r\n 荷枪实弹: \"hè qiāng shí dàn\",\r\n 兴高采烈: \"xìng gāo cǎi liè\",\r\n 无能为力: \"wú néng wéi lì\",\r\n 布鲁塞尔: \"bù lǔ sài ěr\",\r\n 为所欲为: \"wéi suǒ yù wéi\",\r\n 克什米尔: \"kè shí mǐ ěr\",\r\n 没完没了: \"méi wán méi liǎo\",\r\n 不为人知: \"bù wéi rén zhī\",\r\n 结结巴巴: \"jiē jiē bā bā\",\r\n 前仆后继: \"qián pū hòu jì\",\r\n 铺天盖地: \"pū tiān gài dì\",\r\n 直截了当: \"zhí jié liǎo dàng\",\r\n 供不应求: \"gōng bú yìng qiú\",\r\n 御史大夫: \"yù shǐ dà fū\",\r\n 不为瓦全: \"bù wéi wǎ quán\",\r\n 不可收拾: \"bù kě shōu shi\",\r\n 胡作非为: \"hú zuò fēi wéi\",\r\n 分毫不差: \"fēn háo bú chà\",\r\n 模模糊糊: \"mó mó hu hū\",\r\n 不足为奇: \"bù zú wéi qí\",\r\n 悄无声息: \"qiǎo wú shēng xī\",\r\n 了如指掌: \"liǎo rú zhǐ zhǎng\",\r\n 深恶痛绝: \"shēn wù tòng jué\",\r\n 高高兴兴: \"gāo gāo xìng xìng\",\r\n 唉声叹气: \"āi shēng tàn qì\",\r\n 汉藏语系: \"hàn zàng yǔ xì\",\r\n 处心积虑: \"chǔ xīn jī lǜ\",\r\n 泣不成声: \"qì bù chéng shēng\",\r\n 半夜三更: \"bàn yè sān gēng\",\r\n 失魂落魄: \"shī hún luò pò\",\r\n 二十八宿: \"èr shí bā xiù\",\r\n 转来转去: \"zhuàn lái zhuàn qù\",\r\n 数以万计: \"shǔ yǐ wàn jì\",\r\n 相依为命: \"xiāng yī wéi mìng\",\r\n 恋恋不舍: \"liàn liàn bù shě\",\r\n 屈指可数: \"qū zhǐ kě shǔ\",\r\n 神出鬼没: \"shén chū guǐ mò\",\r\n 结结实实: \"jiē jiē shí shí\",\r\n 有的放矢: \"yǒu dì fàng shǐ\",\r\n 叽哩咕噜: \"jī lǐ gū lū\",\r\n 调兵遣将: \"diào bīng qiǎn jiàng\",\r\n 载歌载舞: \"zài gē zài wǔ\",\r\n 转危为安: \"zhuǎn wēi wéi ān\",\r\n 踏踏实实: \"tā tā shi shí\",\r\n 桑给巴尔: \"sāng jǐ bā ěr\",\r\n 装模作样: \"zhuāng mú zuò yàng\",\r\n 见义勇为: \"jiàn yì yǒng wéi\",\r\n 相差无几: \"xiāng chā wú jǐ\",\r\n 叹为观止: \"tàn wéi guān zhǐ\",\r\n 闷闷不乐: \"mèn mèn bú lè\",\r\n 喜怒哀乐: \"xǐ nù āi lè\",\r\n 鲜为人知: \"xiǎn wéi rén zhī\",\r\n 张牙舞爪: \"zhāng yá wǔ zhǎo\",\r\n 为非作歹: \"wéi fēi zuò dǎi\",\r\n 含糊其辞: \"hán hú qí cí\",\r\n 疲于奔命: \"pí yú bēn mìng\",\r\n 勉为其难: \"miǎn wéi qí nán\",\r\n 依依不舍: \"yī yī bù shě\",\r\n 顶头上司: \"dǐng tóu shàng si\",\r\n 不着边际: \"bù zhuó biān jì\",\r\n 大模大样: \"dà mú dà yàng\",\r\n 寻欢作乐: \"xún huān zuò lè\",\r\n 一走了之: \"yì zǒu liǎo zhī\",\r\n 字里行间: \"zì lǐ háng jiān\",\r\n 含含糊糊: \"hán hán hu hū\",\r\n 恰如其分: \"qià rú qí fèn\",\r\n 破涕为笑: \"pò tì wéi xiào\",\r\n 深更半夜: \"shēn gēng bàn yè\",\r\n 千差万别: \"qiān chā wàn bié\",\r\n 数不胜数: \"shǔ bú shèng shǔ\",\r\n 据为己有: \"jù wéi jǐ yǒu\",\r\n 天旋地转: \"tiān xuán dì zhuàn\",\r\n 养尊处优: \"yǎng zūn chǔ yōu\",\r\n 玻璃纤维: \"bō li xiān wéi\",\r\n 吵吵闹闹: \"chāo chao nào nào\",\r\n 晕头转向: \"yūn tóu zhuàn xiàng\",\r\n 土生土长: \"tǔ shēng tǔ zhǎng\",\r\n 宁死不屈: \"nìng sǐ bù qū\",\r\n 不省人事: \"bù xǐng rén shì\",\r\n 尽力而为: \"jìn lì ér wéi\",\r\n 精明强干: \"jīng míng qiáng gàn\",\r\n 唠唠叨叨: \"láo lao dāo dāo\",\r\n 叽叽喳喳: \"jī ji zhā zhā\",\r\n 功不可没: \"gōng bù kě mò\",\r\n 锲而不舍: \"qiè ér bù shě\",\r\n 排忧解难: \"pái yōu jiě nàn\",\r\n 稀里糊涂: \"xī li hú tú\",\r\n 各有所长: \"gè yǒu suǒ cháng\",\r\n 的的确确: \"dí dí què què\",\r\n 哄堂大笑: \"hōng táng dà xiào\",\r\n 听而不闻: \"tīng ér bù wén\",\r\n 刀耕火种: \"dāo gēng huǒ zhòng\",\r\n 内分泌腺: \"nèi fèn mì xiàn\",\r\n 化险为夷: \"huà xiǎn wéi yí\",\r\n 百发百中: \"bǎi fā bǎi zhòng\",\r\n 重见天日: \"chóng jiàn tiān rì\",\r\n 反败为胜: \"fǎn bài wéi shèng\",\r\n 一了百了: \"yì liǎo bǎi liǎo\",\r\n 大大咧咧: \"dà da liē liē\",\r\n 心急火燎: \"xīn jí huǒ liǎo\",\r\n 粗心大意: \"cū xīn dà yi\",\r\n 鸡皮疙瘩: \"jī pí gē da\",\r\n 夷为平地: \"yí wéi píng dì\",\r\n 日积月累: \"rì jī yuè lěi\",\r\n 设身处地: \"shè shēn chǔ dì\",\r\n 投其所好: \"tóu qí suǒ hào\",\r\n 间不容发: \"jiān bù róng fà\",\r\n 人满为患: \"rén mǎn wéi huàn\",\r\n 穷追不舍: \"qióng zhuī bù shě\",\r\n 为时已晚: \"wéi shí yǐ wǎn\",\r\n 如数家珍: \"rú shǔ jiā zhēn\",\r\n 心里有数: \"xīn lǐ yǒu shù\",\r\n 以牙还牙: \"yǐ yá huán yá\",\r\n 神不守舍: \"shén bù shǒu shě\",\r\n 孟什维克: \"mèng shí wéi kè\",\r\n 各自为战: \"gè zì wéi zhàn\",\r\n 怨声载道: \"yuàn shēng zài dào\",\r\n 救苦救难: \"jiù kǔ jiù nàn\",\r\n 好好先生: \"hǎo hǎo xiān sheng\",\r\n 怪模怪样: \"guài mú guài yàng\",\r\n 抛头露面: \"pāo tóu lù miàn\",\r\n 游手好闲: \"yóu shǒu hào xián\",\r\n 无所不为: \"wú suǒ bù wéi\",\r\n 调虎离山: \"diào hǔ lí shān\",\r\n 步步为营: \"bù bù wéi yíng\",\r\n 好大喜功: \"hào dà xǐ gōng\",\r\n 众矢之的: \"zhòng shǐ zhī dì\",\r\n 长生不死: \"cháng shēng bù sǐ\",\r\n 蔚为壮观: \"wèi wéi zhuàng guān\",\r\n 不可胜数: \"bù kě shèng shǔ\",\r\n 鬼使神差: \"guǐ shǐ shén chāi\",\r\n 洁身自好: \"jié shēn zì hào\",\r\n 敢作敢为: \"gǎn zuò gǎn wéi\",\r\n 茅塞顿开: \"máo sè dùn kāi\",\r\n 走马换将: \"zǒu mǎ huàn jiàng\",\r\n 为时过早: \"wéi shí guò zǎo\",\r\n 为人师表: \"wéi rén shī biǎo\",\r\n 阴差阳错: \"yīn chā yáng cuò\",\r\n 油腔滑调: \"yóu qiāng huá diào\",\r\n 重蹈覆辙: \"chóng dǎo fù zhé\",\r\n 骂骂咧咧: \"mà ma liē liē\",\r\n 絮絮叨叨: \"xù xù dāo dāo\",\r\n 如履薄冰: \"rú lǚ bó bīng\",\r\n 损兵折将: \"sǔn bīng zhé jiàng\",\r\n 拐弯抹角: \"guǎi wān mò jiǎo\",\r\n 像模像样: \"xiàng mú xiàng yàng\",\r\n 供过于求: \"gōng guò yú qiú\",\r\n 开花结果: \"kāi huā jiē guǒ\",\r\n 仔仔细细: \"zǐ zǐ xì xì\",\r\n 川藏公路: \"chuān zàng gōng lù\",\r\n 河北梆子: \"hé běi bāng zi\",\r\n 长年累月: \"cháng nián lěi yuè\",\r\n 正儿八经: \"zhèng er bā jīng\",\r\n 不识抬举: \"bù shí tái ju\",\r\n 重振旗鼓: \"chóng zhèn qí gǔ\",\r\n 气息奄奄: \"qì xī yān yān\",\r\n 紧追不舍: \"jǐn zhuī bù shě\",\r\n 服服帖帖: \"fú fu tiē tiē\",\r\n 强词夺理: \"qiǎng cí duó lǐ\",\r\n 噼里啪啦: \"pī li pā lā\",\r\n 人才济济: \"rén cái jǐ jǐ\",\r\n 发人深省: \"fā rén shēn xǐng\",\r\n 不足为凭: \"bù zú wéi píng\",\r\n 为富不仁: \"wéi fù bù rén\",\r\n 连篇累牍: \"lián piān lěi dú\",\r\n 呼天抢地: \"hū tiān qiāng dì\",\r\n 落落大方: \"luò luò dà fāng\",\r\n 自吹自擂: \"zì chuī zì léi\",\r\n 乐善好施: \"lè shàn hào shī\",\r\n 以攻为守: \"yǐ gōng wéi shǒu\",\r\n 磨磨蹭蹭: \"mó mó cèng cèng\",\r\n 削铁如泥: \"xuē tiě rú ní\",\r\n 助纣为虐: \"zhù zhòu wéi nüè\",\r\n 以退为进: \"yǐ tuì wéi jìn\",\r\n 嘁嘁喳喳: \"qī qī chā chā\",\r\n 枪林弹雨: \"qiāng lín dàn yǔ\",\r\n 令人发指: \"lìng rén fà zhǐ\",\r\n 转败为胜: \"zhuǎn bài wéi shèng\",\r\n 转弯抹角: \"zhuǎn wān mò jiǎo\",\r\n 在劫难逃: \"zài jié nán táo\",\r\n 正当防卫: \"zhèng dàng fáng wèi\",\r\n 不足为怪: \"bù zú wéi guài\",\r\n 难兄难弟: \"nàn xiōng nàn dì\",\r\n 咿咿呀呀: \"yī yī yā yā\",\r\n 弹尽粮绝: \"dàn jìn liáng jué\",\r\n 阿谀奉承: \"ē yú fèng chéng\",\r\n 稀里哗啦: \"xī li huā lā\",\r\n 返老还童: \"fǎn lǎo huán tóng\",\r\n 好高骛远: \"hào gāo wù yuǎn\",\r\n 鹿死谁手: \"lù sǐ shéi shǒu\",\r\n 差强人意: \"chā qiáng rén yì\",\r\n 大吹大擂: \"dà chuī dà léi\",\r\n 成家立业: \"chéng jiā lì yè\",\r\n 自怨自艾: \"zì yuàn zì yì\",\r\n 负债累累: \"fù zhài lěi lěi\",\r\n 古为今用: \"gǔ wéi jīn yòng\",\r\n 入土为安: \"rù tǔ wéi ān\",\r\n 下不为例: \"xià bù wéi lì\",\r\n 一哄而上: \"yì hōng ér shàng\",\r\n 没头苍蝇: \"méi tóu cāng ying\",\r\n 天差地远: \"tiān chā dì yuǎn\",\r\n 风卷残云: \"fēng juǎn cán yún\",\r\n 多灾多难: \"duō zāi duō nàn\",\r\n 乳臭未干: \"rǔ xiù wèi gān\",\r\n 行家里手: \"háng jiā lǐ shǒu\",\r\n 狼狈为奸: \"láng bèi wéi jiān\",\r\n 处变不惊: \"chǔ biàn bù jīng\",\r\n 一唱一和: \"yí chàng yí hè\",\r\n 一念之差: \"yí niàn zhī chā\",\r\n 金蝉脱壳: \"jīn chán tuō qiào\",\r\n 滴滴答答: \"dī dī dā dā\",\r\n 硕果累累: \"shuò guǒ léi léi\",\r\n 好整以暇: \"hào zhěng yǐ xiá\",\r\n 红得发紫: \"hóng de fā zǐ\",\r\n 传为美谈: \"chuán wéi měi tán\",\r\n 富商大贾: \"fù shāng dà gǔ\",\r\n 四海为家: \"sì hǎi wéi jiā\",\r\n 了若指掌: \"liǎo ruò zhǐ zhǎng\",\r\n 大有可为: \"dà yǒu kě wéi\",\r\n 出头露面: \"chū tóu lù miàn\",\r\n 鼓鼓囊囊: \"gǔ gu nāng nāng\",\r\n 窗明几净: \"chuāng míng jī jìng\",\r\n 泰然处之: \"tài rán chǔ zhī\",\r\n 怒发冲冠: \"nù fà chōng guān\",\r\n 有机玻璃: \"yǒu jī bō li\",\r\n 骨头架子: \"gǔ tou jià zi\",\r\n 义薄云天: \"yì bó yún tiān\",\r\n 一丁点儿: \"yī dīng diǎn er\",\r\n 时来运转: \"shí lái yùn zhuǎn\",\r\n 陈词滥调: \"chén cí làn diào\",\r\n 化整为零: \"huà zhěng wéi líng\",\r\n 火烧火燎: \"huǒ shāo huǒ liǎo\",\r\n 干脆利索: \"gàn cuì lì suǒ\",\r\n 吊儿郎当: \"diào er láng dāng\",\r\n 广种薄收: \"guǎng zhòng bó shōu\",\r\n 种瓜得瓜: \"zhòng guā dé guā\",\r\n 种豆得豆: \"zhòng dòu dé dòu\",\r\n 难舍难分: \"nán shě nán fēn\",\r\n 歃血为盟: \"shà xuè wéi méng\",\r\n 奋发有为: \"fèn fā yǒu wéi\",\r\n 阴错阳差: \"yīn cuò yáng chā\",\r\n 东躲西藏: \"dōng duǒ xī cáng\",\r\n 烟熏火燎: \"yān xūn huǒ liǎo\",\r\n 钻牛角尖: \"zuān niú jiǎo jiān\",\r\n 乔装打扮: \"qiáo zhuāng dǎ bàn\",\r\n 改弦更张: \"gǎi xián gēng zhāng\",\r\n 河南梆子: \"hé nán bāng zi\",\r\n 好吃懒做: \"hào chī lǎn zuò\",\r\n 何乐不为: \"hé lè bù wéi\",\r\n 大出风头: \"dà chū fēng tóu\",\r\n 攻城掠地: \"gōng chéng lüè dì\",\r\n 漂漂亮亮: \"piào piào liang liang\",\r\n 折衷主义: \"zhé zhōng zhǔ yì\",\r\n 大马哈鱼: \"dà mǎ hǎ yú\",\r\n 绿树成荫: \"lǜ shù chéng yīn\",\r\n 率先垂范: \"shuài xiān chuí fàn\",\r\n 家长里短: \"jiā cháng lǐ duǎn\",\r\n 宽大为怀: \"kuān dà wéi huái\",\r\n 左膀右臂: \"zuǒ bǎng yòu bì\",\r\n 一笑了之: \"yí xiào liǎo zhī\",\r\n 天下为公: \"tiān xià wéi gōng\",\r\n 还我河山: \"huán wǒ hé shān\",\r\n 何足为奇: \"hé zú wéi qí\",\r\n 好自为之: \"hǎo zì wéi zhī\",\r\n 风姿绰约: \"fēng zī chuò yuē\",\r\n 大雨滂沱: \"dà yǔ pāng tuó\",\r\n 传为佳话: \"chuán wéi jiā huà\",\r\n 吃里扒外: \"chī lǐ pá wài\",\r\n 重操旧业: \"chóng cāo jiù yè\",\r\n 小家子气: \"xiǎo jiā zi qì\",\r\n 少不更事: \"shào bù gēng shì\",\r\n 难分难舍: \"nán fēn nán shě\",\r\n 添砖加瓦: \"tiān zhuān jiā wǎ\",\r\n 是非分明: \"shì fēi fēn míng\",\r\n 舍我其谁: \"shě wǒ qí shuí\",\r\n 偏听偏信: \"piān tīng piān xìn\",\r\n 量入为出: \"liàng rù wéi chū\",\r\n 降龙伏虎: \"xiáng lóng fú hǔ\",\r\n 钢化玻璃: \"gāng huà bō li\",\r\n 正中下怀: \"zhèng zhòng xià huái\",\r\n 以身许国: \"yǐ shēn xǔ guó\",\r\n 一语中的: \"yì yǔ zhòng dì\",\r\n 丧魂落魄: \"sàng hún luò pò\",\r\n 三座大山: \"sān zuò dà shān\",\r\n 济济一堂: \"jǐ jǐ yì táng\",\r\n 好事之徒: \"hào shì zhī tú\",\r\n 干净利索: \"gàn jìng lì suǒ\",\r\n 出将入相: \"chū jiàng rù xiàng\",\r\n 袅袅娜娜: \"niǎo niǎo nuó nuó\",\r\n 狐狸尾巴: \"hú li wěi ba\",\r\n 好逸恶劳: \"hào yì wù láo\",\r\n 大而无当: \"dà ér wú dàng\",\r\n 打马虎眼: \"dǎ mǎ hu yǎn\",\r\n 板上钉钉: \"bǎn shàng dìng dīng\",\r\n 吆五喝六: \"yāo wǔ hè liù\",\r\n 虾兵蟹将: \"xiā bīng xiè jiàng\",\r\n 水调歌头: \"shuǐ diào gē tóu\",\r\n 数典忘祖: \"shǔ diǎn wàng zǔ\",\r\n 人事不省: \"rén shì bù xǐng\",\r\n 曲高和寡: \"qǔ gāo hè guǎ\",\r\n 屡教不改: \"lǚ jiào bù gǎi\",\r\n 互为因果: \"hù wéi yīn guǒ\",\r\n 互为表里: \"hù wéi biǎo lǐ\",\r\n 厚此薄彼: \"hòu cǐ bó bǐ\",\r\n 过关斩将: \"guò guān zhǎn jiàng\",\r\n 疙疙瘩瘩: \"gē ge dā dā\",\r\n 大腹便便: \"dà fù pián pián\",\r\n 走为上策: \"zǒu wéi shàng cè\",\r\n 冤家对头: \"yuān jia duì tóu\",\r\n 有隙可乘: \"yǒu xì kě chèng\",\r\n 一鳞半爪: \"yì lín bàn zhǎo\",\r\n 片言只语: \"piàn yán zhǐ yǔ\",\r\n 开花结实: \"kāi huā jié shí\",\r\n 经年累月: \"jīng nián lěi yuè\",\r\n 含糊其词: \"hán hú qí cí\",\r\n 寡廉鲜耻: \"guǎ lián xiǎn chǐ\",\r\n 成年累月: \"chéng nián lěi yuè\",\r\n 不徇私情: \"bú xùn sī qíng\",\r\n 不当人子: \"bù dāng rén zǐ\",\r\n 膀大腰圆: \"bǎng dà yāo yuán\",\r\n 指腹为婚: \"zhǐ fù wéi hūn\",\r\n 这么点儿: \"zhè me diǎn er\",\r\n 意兴索然: \"yì xīng suǒ rán\",\r\n 绣花枕头: \"xiù huā zhěn tou\",\r\n 无的放矢: \"wú dì fàng shǐ\",\r\n 望闻问切: \"wàng wén wèn qiè\",\r\n 舍己为人: \"shě jǐ wèi rén\",\r\n 穷年累月: \"qióng nián lěi yuè\",\r\n 排难解纷: \"pái nàn jiě fēn\",\r\n 处之泰然: \"chǔ zhī tài rán\",\r\n 指鹿为马: \"zhǐ lù wéi mǎ\",\r\n 危如累卵: \"wēi rú lěi luǎn\",\r\n 天兵天将: \"tiān bīng tiān jiàng\",\r\n 舍近求远: \"shě jìn qiú yuǎn\",\r\n 南腔北调: \"nán qiāng běi diào\",\r\n 苦中作乐: \"kǔ zhōng zuò lè\",\r\n 厚积薄发: \"hòu jī bó fā\",\r\n 臭味相投: \"xiù wèi xiāng tóu\",\r\n 长幼有序: \"zhǎng yòu yǒu xù\",\r\n 逼良为娼: \"bī liáng wéi chāng\",\r\n 悲悲切切: \"bēi bēi qiè qiē\",\r\n 败军之将: \"bài jūn zhī jiàng\",\r\n 欺行霸市: \"qī háng bà shì\",\r\n 削足适履: \"xuē zú shì lǚ\",\r\n 先睹为快: \"xiān dǔ wéi kuài\",\r\n 啼饥号寒: \"tí jī háo hán\",\r\n 疏不间亲: \"shū bú jiàn qīn\",\r\n 神差鬼使: \"shén chāi guǐ shǐ\",\r\n 敲敲打打: \"qiāo qiāo dǎ dǎ\",\r\n 平铺直叙: \"píng pū zhí xù\",\r\n 没头没尾: \"méi tóu mò wěi\",\r\n 寥寥可数: \"liáo liáo kě shǔ\",\r\n 哼哈二将: \"hēng hā èr jiàng\",\r\n 鹤发童颜: \"hè fà tóng yán\",\r\n 各奔前程: \"gè bèn qián chéng\",\r\n 弹无虚发: \"dàn wú xū fā\",\r\n 大人先生: \"dà rén xiān sheng\",\r\n 与民更始: \"yǔ mín gēng shǐ\",\r\n 树碑立传: \"shù bēi lì zhuàn\",\r\n 是非得失: \"shì fēi dé shī\",\r\n 实逼处此: \"shí bī chǔ cǐ\",\r\n 塞翁失马: \"sài wēng shī mǎ\",\r\n 日薄西山: \"rì bó xī shān\",\r\n 切身体会: \"qiè shēn tǐ huì\",\r\n 片言只字: \"piàn yán zhǐ zì\",\r\n 跑马卖解: \"pǎo mǎ mài xiè\",\r\n 宁折不弯: \"nìng zhé bù wān\",\r\n 零零散散: \"líng líng sǎn sǎn\",\r\n 量体裁衣: \"liàng tǐ cái yī\",\r\n 连中三元: \"lián zhòng sān yuán\",\r\n 礼崩乐坏: \"lǐ bēng yuè huài\",\r\n 不为已甚: \"bù wéi yǐ shèn\",\r\n 转悲为喜: \"zhuǎn bēi wéi xǐ\",\r\n 以眼还眼: \"yǐ yǎn huán yǎn\",\r\n 蔚为大观: \"wèi wéi dà guān\",\r\n 未为不可: \"wèi wéi bù kě\",\r\n 童颜鹤发: \"tóng yán hè fà\",\r\n 朋比为奸: \"péng bǐ wéi jiān\",\r\n 莫此为甚: \"mò cǐ wéi shèn\",\r\n 夹枪带棒: \"jiā qiāng dài bàng\",\r\n 富商巨贾: \"fù shāng jù jiǎ\",\r\n 淡然处之: \"dàn rán chǔ zhī\",\r\n 箪食壶浆: \"dān shí hú jiāng\",\r\n 创巨痛深: \"chuāng jù tòng shēn\",\r\n 草长莺飞: \"cǎo zhǎng yīng fēi\",\r\n 坐视不救: \"zuò shī bú jiù\",\r\n 以己度人: \"yǐ jǐ duó rén\",\r\n 随行就市: \"suí háng jiù shì\",\r\n 文以载道: \"wén yǐ zài dào\",\r\n 文不对题: \"wén bú duì tí\",\r\n 铁板钉钉: \"tiě bǎn dìng dīng\",\r\n 身体发肤: \"shēn tǐ fà fū\",\r\n 缺吃少穿: \"quē chī shǎo chuān\",\r\n 目无尊长: \"mù wú zūn zhǎng\",\r\n 吉人天相: \"jí rén tiān xiàng\",\r\n 毁家纾难: \"huǐ jiā shū nàn\",\r\n 钢筋铁骨: \"gāng jīn tiě gǔ\",\r\n 丢卒保车: \"diū zú bǎo jū\",\r\n 丢三落四: \"diū sān là sì\",\r\n 闭目塞听: \"bì mù sè tīng\",\r\n 削尖脑袋: \"xuē jiān nǎo dài\",\r\n 为非作恶: \"wéi fēi zuò è\",\r\n 人才难得: \"rén cái nán dé\",\r\n 情非得已: \"qíng fēi dé yǐ\",\r\n 切中要害: \"qiè zhòng yào hài\",\r\n 火急火燎: \"huǒ jí huǒ liǎo\",\r\n 画地为牢: \"huà dì wéi láo\",\r\n 好酒贪杯: \"hào jiǔ tān bēi\",\r\n 长歌当哭: \"cháng gē dàng kū\",\r\n 载沉载浮: \"zài chén zài fú\",\r\n 遇难呈祥: \"yù nàn chéng xiáng\",\r\n 榆木疙瘩: \"yú mù gē da\",\r\n 以邻为壑: \"yǐ lín wéi hè\",\r\n 洋为中用: \"yáng wéi zhōng yòng\",\r\n 言为心声: \"yán wéi xīn shēng\",\r\n 言必有中: \"yán bì yǒu zhòng\",\r\n 图穷匕见: \"tú qióng bǐ xiàn\",\r\n 滂沱大雨: \"páng tuó dà yǔ\",\r\n 目不暇给: \"mù bù xiá jǐ\",\r\n 量才录用: \"liàng cái lù yòng\",\r\n 教学相长: \"jiào xué xiāng zhǎng\",\r\n 悔不当初: \"huǐ bù dāng chū\",\r\n 呼幺喝六: \"hū yāo hè liù\",\r\n 不足为训: \"bù zú wéi xùn\",\r\n 不拘形迹: \"bù jū xíng jī\",\r\n 傍若无人: \"páng ruò wú rén\",\r\n 罪责难逃: \"zuì zé nán táo\",\r\n 自我吹嘘: \"zì wǒ chuī xū\",\r\n 转祸为福: \"zhuǎn huò wéi fú\",\r\n 勇冠三军: \"yǒng guàn sān jūn\",\r\n 易地而处: \"yì dì ér chǔ\",\r\n 卸磨杀驴: \"xiè mò shā lǘ\",\r\n 玩儿不转: \"wán ér bú zhuàn\",\r\n 天道好还: \"tiān dào hǎo huán\",\r\n 身单力薄: \"shēn dān lì bó\",\r\n 撒豆成兵: \"sǎ dòu chéng bīng\",\r\n 片纸只字: \"piàn zhǐ zhī zì\",\r\n 宁缺毋滥: \"nìng quē wú làn\",\r\n 没没无闻: \"mò mò wú wén\",\r\n 量力而为: \"liàng lì ér wéi\",\r\n 历历可数: \"lì lì kě shǔ\",\r\n 口碑载道: \"kǒu bēi zài dào\",\r\n 君子好逑: \"jūn zǐ hǎo qiú\",\r\n 好为人师: \"hào wéi rén shī\",\r\n 豪商巨贾: \"háo shāng jù jiǎ\",\r\n 各有所好: \"gè yǒu suǒ hào\",\r\n 度德量力: \"duó dé liàng lì\",\r\n 指天为誓: \"zhǐ tiān wéi shì\",\r\n 逸兴遄飞: \"yì xìng chuán fēi\",\r\n 心宽体胖: \"xīn kuān tǐ pán\",\r\n 为德不卒: \"wéi dé bù zú\",\r\n 天下为家: \"tiān xià wéi jiā\",\r\n 视为畏途: \"shì wéi wèi tú\",\r\n 三灾八难: \"sān zāi bā nàn\",\r\n 沐猴而冠: \"mù hóu ér guàn\",\r\n 哩哩啦啦: \"lī li lā lā\",\r\n 见缝就钻: \"jiàn fèng jiù zuān\",\r\n 夹层玻璃: \"jiā céng bō li\",\r\n 急公好义: \"jí gōng hào yì\",\r\n 积年累月: \"jī nián lěi yuè\",\r\n 划地为牢: \"huá dì wéi láo\",\r\n 更名改姓: \"gēng míng gǎi xìng\",\r\n 奉为圭臬: \"fèng wéi guī niè\",\r\n 多难兴邦: \"duō nàn xīng bāng\",\r\n 不破不立: \"bú pò bú lì\",\r\n 坐地自划: \"zuò dì zì huá\",\r\n 坐不重席: \"zuò bù chóng xí\",\r\n 坐不窥堂: \"zuò bù kuī táng\",\r\n 作嫁衣裳: \"zuò jià yī shang\",\r\n 左枝右梧: \"zuǒ zhī yòu wú\",\r\n 左宜右有: \"zuǒ yí yòu yǒu\",\r\n 钻头觅缝: \"zuān tóu mì fèng\",\r\n 钻天打洞: \"zuān tiān dǎ dòng\",\r\n 钻皮出羽: \"zuān pí chū yǔ\",\r\n 钻火得冰: \"zuān huǒ dé bīng\",\r\n 钻洞觅缝: \"zuàn dòng mì féng\",\r\n 钻冰求火: \"zuān bīng qiú huǒ\",\r\n 子为父隐: \"zǐ wéi fù yǐn\",\r\n 擢发难数: \"zhuó fà nán shǔ\",\r\n 着人先鞭: \"zhuó rén xiān biān\",\r\n 斫雕为朴: \"zhuó diāo wéi pǔ\",\r\n 锥处囊中: \"zhuī chǔ náng zhōng\",\r\n 椎心饮泣: \"chuí xīn yǐn qì\",\r\n 椎心泣血: \"chuí xīn qì xuè\",\r\n 椎牛飨士: \"chuí niú xiǎng shì\",\r\n 椎牛歃血: \"chuí niú shà xuè\",\r\n 椎牛发冢: \"chuí niú fà zhǒng\",\r\n 椎埋屠狗: \"chuí mái tú gǒu\",\r\n 椎埋狗窃: \"chuí mái gǒu qiè\",\r\n 壮发冲冠: \"zhuàng fā chōng guàn\",\r\n 庄严宝相: \"zhuāng yán bǎo xiàng\",\r\n 转愁为喜: \"zhuǎn chóu wéi xǐ\",\r\n 转嗔为喜: \"zhuǎn chēn wéi xǐ\",\r\n 拽巷啰街: \"zhuài xiàng luó jiē\",\r\n 拽耙扶犁: \"zhuāi pá fú lí\",\r\n 拽布拖麻: \"zhuài bù tuō má\",\r\n 箸长碗短: \"zhù cháng wǎn duǎn\",\r\n 铸剑为犁: \"zhù jiàn wéi lí\",\r\n 杼柚其空: \"zhù yòu qí kōng\",\r\n 杼柚空虚: \"zhù yòu kōng xū\",\r\n 助天为虐: \"zhù tiān wéi nüè\",\r\n 属垣有耳: \"zhǔ yuán yǒu ěr\",\r\n 属毛离里: \"zhǔ máo lí lǐ\",\r\n 属辞比事: \"zhǔ cí bǐ shì\",\r\n 逐物不还: \"zhú wù bù huán\",\r\n 铢量寸度: \"zhū liáng cùn duó\",\r\n 铢两悉称: \"zhū liǎng xī chèn\",\r\n 侏儒观戏: \"zhū rú guān xì\",\r\n 朱轓皁盖: \"zhū fān zào gài\",\r\n 昼度夜思: \"zhòu duó yè sī\",\r\n 诪张为幻: \"zhōu zhāng wéi huàn\",\r\n 重明继焰: \"chóng míng jì yàn\",\r\n 众啄同音: \"zhòng zhuó tóng yīn\",\r\n 众毛攒裘: \"zhòng máo cuán qiú\",\r\n 众好众恶: \"zhòng hào zhòng wù\",\r\n 擿埴索涂: \"zhāi zhí suǒ tú\",\r\n 稚齿婑媠: \"zhì chǐ wǒ tuó\",\r\n 至当不易: \"zhì dàng bú yì\",\r\n 指皂为白: \"zhǐ zào wéi bái\",\r\n 指雁为羹: \"zhǐ yàn wéi gēng\",\r\n 指树为姓: \"zhǐ shù wéi xìng\",\r\n 指山说磨: \"zhǐ shān shuō mò\",\r\n 止戈为武: \"zhǐ gē wéi wǔ\",\r\n 枝干相持: \"zhī gàn xiāng chí\",\r\n 枝大于本: \"zh dà yú běn\",\r\n 支吾其词: \"zhī wú qí cí\",\r\n 正身率下: \"zhèng shēn shuài xià\",\r\n 正冠李下: \"zhèng guàn lǐ xià\",\r\n 整冠纳履: \"zhěng guān nà lǚ\",\r\n 整躬率物: \"zhěng gōng shuài wù\",\r\n 整顿干坤: \"zhěng dùn gàn kūn\",\r\n 针头削铁: \"zhēn tóu xuē tiě\",\r\n 贞松劲柏: \"zhēn sōng jìng bǎi\",\r\n 赭衣塞路: \"zhě yī sè lù\",\r\n 折箭为誓: \"shé jiàn wéi shì\",\r\n 折而族之: \"zhé ér zú zhī\",\r\n 昭德塞违: \"zhāo dé sè wéi\",\r\n 章句小儒: \"zhāng jù xiǎo rú\",\r\n 湛恩汪濊: \"zhàn ēn wāng huì\",\r\n 占风望气: \"zhān fēng wàng qì\",\r\n 斩将搴旗: \"zhǎn jiàng qiān qí\",\r\n 曾母投杼: \"zēng mǔ tóu zhù\",\r\n 曾参杀人: \"zēng shēn shā rén\",\r\n 造谣中伤: \"zào yáo zhòng shāng\",\r\n 早占勿药: \"zǎo zhān wù yào\",\r\n 凿龟数策: \"záo guī shǔ cè\",\r\n 攒三聚五: \"cuán sān jù wǔ\",\r\n 攒眉蹙额: \"cuán mei cù é\",\r\n 攒零合整: \"cuán líng hé zhěng\",\r\n 攒锋聚镝: \"cuán fēng jù dí\",\r\n 载笑载言: \"zài xiào zài yán\",\r\n 载酒问字: \"zài jiǔ wèn zì\",\r\n 殒身不恤: \"yǔn shēn bú xù\",\r\n 云舒霞卷: \"yún shū xiá juǎn\",\r\n 月中折桂: \"yuè zhōng shé guì\",\r\n 月落参横: \"yuè luò shēn héng\",\r\n 鬻驽窃价: \"yù nú qiè jià\",\r\n 鬻鸡为凤: \"yù jī wéi fèng\",\r\n 遇难成祥: \"yù nàn chéng xiáng\",\r\n 郁郁累累: \"yù yù lěi lěi\",\r\n 玉卮无当: \"yù zhī wú dàng\",\r\n 语笑喧阗: \"yǔ xiào xuān tián\",\r\n 与世沉浮: \"yǔ shì chén fú\",\r\n 与时消息: \"yǔ shí xiāo xi\",\r\n 逾墙钻隙: \"yú qiáng zuān xì\",\r\n 渔夺侵牟: \"yú duó qīn móu\",\r\n 杅穿皮蠹: \"yú chuān pí dù\",\r\n 余勇可贾: \"yú yǒng kě gǔ\",\r\n 予智予雄: \"yú zhì yú xióng\",\r\n 予取予求: \"yú qǔ yú qiú\",\r\n 于家为国: \"yú jiā wéi guó\",\r\n 有借无还: \"yǒu jiè wú huán\",\r\n 有加无已: \"yǒu jiā wú yǐ\",\r\n 有国难投: \"yǒu guó nán tóu\",\r\n 游必有方: \"yóu bì yǒu fāng\",\r\n 油干灯尽: \"yóu gàn dēng jìn\",\r\n 尤云殢雨: \"yóu yún tì yǔ\",\r\n 庸中皦皦: \"yōng zhōng jiǎo jiǎo\",\r\n 郢书燕说: \"yǐng shū yān shuō\",\r\n 营蝇斐锦: \"yíng yíng fēi jǐn\",\r\n 鹰心雁爪: \"yīng xīn yàn zhǎo\",\r\n 莺吟燕儛: \"yīng yín yàn wǔ\",\r\n 应天顺时: \"yīng tiān shùn shí\",\r\n 印累绶若: \"yìn léi shòu ruò\",\r\n 隐占身体: \"yǐn zhàn shēn tǐ\",\r\n 饮犊上流: \"yìn dú shàng liú\",\r\n 引绳切墨: \"yǐn shéng qiē mò\",\r\n 龈齿弹舌: \"yín chǐ dàn shé\",\r\n 因缘为市: \"yīn yuán wéi shì\",\r\n 因树为屋: \"yīn shù wéi wū\",\r\n 溢美溢恶: \"yì měi yì wù\",\r\n 抑塞磊落: \"yì sè lěi luò\",\r\n 倚闾望切: \"yǐ lǘ wàng qiē\",\r\n 以意为之: \"yǐ yì wéi zhī\",\r\n 以言为讳: \"yǐ yán wéi huì\",\r\n 以疏间亲: \"yǐ shū jiàn qīn\",\r\n 以水济水: \"yǐ shuǐ jǐ shuǐ\",\r\n 以书为御: \"yǐ shū wéi yù\",\r\n 以守为攻: \"yǐ shǒu wéi gōng\",\r\n 以升量石: \"yǐ shēng liáng dàn\",\r\n 以慎为键: \"yǐ shèn wéi jiàn\",\r\n 以筌为鱼: \"yǐ quán wéi yú\",\r\n 以利累形: \"yǐ lì lěi xíng\",\r\n 以毁为罚: \"yǐ huǐ wéi fá\",\r\n 以黑为白: \"yǐ hēi wéi bái\",\r\n 以规为瑱: \"yǐ guī wéi tiàn\",\r\n 以古为鉴: \"yǐ gǔ wéi jiàn\",\r\n 以宫笑角: \"yǐ gōng xiào jué\",\r\n 以法为教: \"yǐ fǎ wéi jiào\",\r\n 以大恶细: \"yǐ dà wù xì\",\r\n 遗世忘累: \"yí shì wàng lěi\",\r\n 遗寝载怀: \"yí qǐn zài huái\",\r\n 移的就箭: \"yí dì jiù jiàn\",\r\n 依头缕当: \"yī tóu lǚ dàng\",\r\n 衣租食税: \"yì zū shí shuì\",\r\n 衣轻乘肥: \"yì qīng chéng féi\",\r\n 衣裳之会: \"yī shang zhī huì\",\r\n 衣单食薄: \"yī dān shí bó\",\r\n 一还一报: \"yì huán yí bào\",\r\n 叶公好龙: \"yè gōng hào lóng\",\r\n 野调无腔: \"yě diào wú qiāng\",\r\n 瑶池女使: \"yáo chí nǚ shǐ\",\r\n 幺麽小丑: \"yāo mó xiǎo chǒu\",\r\n 养精畜锐: \"yǎng jīng xù ruì\",\r\n 卬首信眉: \"áng shǒu shēn méi\",\r\n 洋洋纚纚: \"yáng yáng sǎ sǎ\",\r\n 羊羔美酒: \"yáng gāo měi jiǔ\",\r\n 扬风扢雅: \"yáng fēng jié yǎ\",\r\n 燕昭市骏: \"yān zhāo shì jùn\",\r\n 燕昭好马: \"yān zhāo hǎo mǎ\",\r\n 燕石妄珍: \"yān shí wàng zhēn\",\r\n 燕骏千金: \"yān jùn qiān jīn\",\r\n 燕金募秀: \"yān jīn mù xiù\",\r\n 燕驾越毂: \"yān jià yuè gǔ\",\r\n 燕歌赵舞: \"yān gē zhào wǔ\",\r\n 燕岱之石: \"yān dài zhī shí\",\r\n 燕处危巢: \"yàn chǔ wēi cháo\",\r\n 掞藻飞声: \"shàn zǎo fēi shēng\",\r\n 偃革为轩: \"yǎn gé wéi xuān\",\r\n 妍蚩好恶: \"yán chī hǎo è\",\r\n 压良为贱: \"yā liáng wéi jiàn\",\r\n 搀行夺市: \"chān háng duó shì\",\r\n 泣数行下: \"qì shù háng xià\",\r\n 当行出色: \"dāng háng chū sè\",\r\n 秀出班行: \"xiù chū bān háng\",\r\n 儿女成行: \"ér nǚ chéng háng\",\r\n 大行大市: \"dà háng dà shì\",\r\n 寻行数墨: \"xún háng shǔ mò\",\r\n 埙篪相和: \"xūn chí xiāng hè\",\r\n 血债累累: \"xuè zhài lěi lěi\",\r\n 炫玉贾石: \"xuàn yù gǔ shí\",\r\n 炫石为玉: \"xuàn shí wéi yù\",\r\n 悬石程书: \"xuán dàn chéng shū\",\r\n 悬狟素飡: \"xuán huán sù cān\",\r\n 悬龟系鱼: \"xuán guī xì yú\",\r\n 揎拳捋袖: \"xuān quán luō xiù\",\r\n 轩鹤冠猴: \"xuān hè guàn hóu\",\r\n 畜妻养子: \"xù qī yǎng zǐ\",\r\n 羞人答答: \"xiū rén dā dā\",\r\n 修鳞养爪: \"xiū lín yǎng zhǎo\",\r\n 熊据虎跱: \"xióng jù hǔ zhì\",\r\n 兄死弟及: \"xiōng sǐ dì jí\",\r\n 腥闻在上: \"xīng wén zài shàng\",\r\n 兴文匽武: \"xīng wén yǎn wǔ\",\r\n 兴观群怨: \"xìng guān qún yuàn\",\r\n 兴高彩烈: \"xìng gāo cǎi liè\",\r\n 心手相应: \"xīn shǒu xiāng yìng\",\r\n 心口相应: \"xīn kǒu xiāng yīng\",\r\n 挟势弄权: \"xié shì nòng quán\",\r\n 胁肩累足: \"xié jiān lěi zú\",\r\n 校短量长: \"jiào duǎn liáng cháng\",\r\n 小眼薄皮: \"xiǎo yǎn bó pí\",\r\n 硝云弹雨: \"xiāo yún dàn yǔ\",\r\n 鸮鸣鼠暴: \"xiāo míng shǔ bào\",\r\n 削株掘根: \"xuē zhū jué gēn\",\r\n 削铁无声: \"xuē tiě wú shēng\",\r\n 削职为民: \"xuē zhí wéi mín\",\r\n 削木为吏: \"xuē mù wéi lì\",\r\n 想望风褱: \"xiǎng wàng fēng huái\",\r\n 香培玉琢: \"xiang pei yu zhuó\",\r\n 相鼠有皮: \"xiàng shǔ yǒu pí\",\r\n 相时而动: \"xiàng shí ér dòng\",\r\n 相切相磋: \"xiāng qiē xiāng cuō\",\r\n 相女配夫: \"xiàng nǚ pèi fū\",\r\n 相门有相: \"xiàng mén yǒu xiàng\",\r\n 挦章撦句: \"xián zhāng chě jù\",\r\n 先我着鞭: \"xiān wǒ zhuó biān\",\r\n 习焉不察: \"xí yān bù chá\",\r\n 歙漆阿胶: \"shè qī ē jiāo\",\r\n 晰毛辨发: \"xī máo biàn fà\",\r\n 悉索薄赋: \"xī suǒ bó fù\",\r\n 雾鳞云爪: \"wù lín yún zhǎo\",\r\n 物稀为贵: \"wù xī wéi guì\",\r\n 碔砆混玉: \"wǔ fū hùn yù\",\r\n 武断专横: \"wǔ duàn zhuān héng\",\r\n 五石六鹢: \"wǔ shí liù yì\",\r\n 五色相宣: \"wǔ sè xiāng xuān\",\r\n 五侯七贵: \"wǔ hóu qī guì\",\r\n 五侯蜡烛: \"wǔ hòu là zhú\",\r\n 五羖大夫: \"wǔ gǔ dà fū\",\r\n 吾自有处: \"wú zì yǒu chǔ\",\r\n 无下箸处: \"wú xià zhù chǔ\",\r\n 无伤无臭: \"wú shāng wú xiù\",\r\n 无能为役: \"wú néng wéi yì\",\r\n 无寇暴死: \"wú kòu bào sǐ\",\r\n 无孔不钻: \"wú kǒng bú zuàn\",\r\n 无间可乘: \"wú jiān kě chéng\",\r\n 无间冬夏: \"wú jiān dōng xià\",\r\n 无恶不为: \"wú è bù wéi\",\r\n 无动为大: \"wú dòng wéi dà\",\r\n 诬良为盗: \"wū liáng wéi dào\",\r\n 握拳透爪: \"wò quán tòu zhǎo\",\r\n 文武差事: \"wén wǔ chāi shì\",\r\n 委委佗佗: \"wēi wēi tuó tuó\",\r\n 惟日为岁: \"wéi rì wéi suì\",\r\n 帷薄不修: \"wéi bó bù xiū\",\r\n 为善最乐: \"wéi shàn zuì lè\",\r\n 为山止篑: \"wéi shān zhǐ kuì\",\r\n 为仁不富: \"wéi rén bú fù\",\r\n 为裘为箕: \"wéi qiú wéi jī\",\r\n 为民父母: \"wéi mín fù mǔ\",\r\n 为虺弗摧: \"wéi huǐ fú cuī\",\r\n 为好成歉: \"wéi hǎo chéng qiàn\",\r\n 为鬼为蜮: \"wéi guǐ wéi yù\",\r\n 望风响应: \"wàng fēng xiǎng yīng\",\r\n 望尘僄声: \"wàng chén piào shēng\",\r\n 往渚还汀: \"wǎng zhǔ huán tīng\",\r\n 王贡弹冠: \"wáng gòng dàn guàn\",\r\n 亡国大夫: \"wáng guó dà fū\",\r\n 万贯家私: \"wàn guàn jiā sī\",\r\n 晚食当肉: \"wǎn shí dàng ròu\",\r\n 晚节不保: \"wǎn jié bù bǎo\",\r\n 玩岁愒时: \"wán suì kài shí\",\r\n 蛙蟆胜负: \"wā má shèng fù\",\r\n 吞言咽理: \"tūn yán yàn lǐ\",\r\n 颓垣断堑: \"tuí yuán duàn qiàn\",\r\n 推干就湿: \"tuī gàn jiù shī\",\r\n 剸繁决剧: \"tuán fán jué jù\",\r\n 团头聚面: \"tuán tóu jù miàn\",\r\n 兔丝燕麦: \"tù sī yàn mài\",\r\n 兔头麞脑: \"tù tóu zhāng nǎo\",\r\n 兔葵燕麦: \"tù kuí yàn mài\",\r\n 吐哺握发: \"tǔ bǔ wò fà\",\r\n 投传而去: \"tóu zhuàn ér qù\",\r\n 头没杯案: \"tóu mò bēi àn\",\r\n 头昏脑闷: \"tóu hūn nǎo mèn\",\r\n 头会箕敛: \"tóu kuài jī liǎn\",\r\n 头出头没: \"tóu chū tóu mò\",\r\n 痛自创艾: \"tòng zì chuāng yì\",\r\n 同恶相助: \"tóng wù xiāng zhù\",\r\n 同恶相恤: \"tóng wù xiāng xù\",\r\n 痌瘝在抱: \"tōng guān zài bào\",\r\n 通文调武: \"tōng wén diào wǔ\",\r\n 停留长智: \"tíng liú zhǎng zhì\",\r\n 铁树开华: \"tiě shù kāi huā\",\r\n 条贯部分: \"tiáo guàn bù fēn\",\r\n 挑牙料唇: \"tiǎo yá liào chún\",\r\n 挑么挑六: \"tiāo yāo tiāo liù\",\r\n 挑唇料嘴: \"tiǎo chún liào zuǐ\",\r\n 恬不为意: \"tián bù wéi yì\",\r\n 恬不为怪: \"tián bù wéi guài\",\r\n 天下为笼: \"tiān xià wéi lóng\",\r\n 天台路迷: \"tiān tái lù mí\",\r\n 天年不遂: \"tiān nián bú suì\",\r\n 探囊胠箧: \"tàn náng qū qiè\",\r\n 谭言微中: \"tán yán wēi zhòng\",\r\n 谈言微中: \"tán yán wēi zhòng\",\r\n 狧穅及米: \"shì kāng jí mǐ\",\r\n 随物应机: \"suí wù yīng jī\",\r\n 搜岩采干: \"sōu yán cǎi gàn\",\r\n 宋斤鲁削: \"sòng jīn lǔ xuē\",\r\n 松筠之节: \"sōng yún zhī jié\",\r\n 四亭八当: \"sì tíng bā dàng\",\r\n 四马攒蹄: \"sì mǎ cuán tí\",\r\n 四不拗六: \"sì bú niù liù\",\r\n 思所逐之: \"sī suǒ zhú zhī\",\r\n 丝恩发怨: \"sī ēn fà yuàn\",\r\n 硕望宿德: \"shuò wàng xiǔ dé\",\r\n 铄古切今: \"shuò gǔ qiē jīn\",\r\n 顺风而呼: \"shùn fēng ér hū\",\r\n 顺风吹火: \"shùn fēng chuī huǒ\",\r\n 水中著盐: \"shuǐ zhōng zhuó yán\",\r\n 双柑斗酒: \"shuāng gān dǒu jiǔ\",\r\n 数米而炊: \"shǔ mǐ ér chuī\",\r\n 数米量柴: \"shǔ mǐ liáng chái\",\r\n 数理逻辑: \"shù lǐ luó ji\",\r\n 数黑论黄: \"shǔ hēi lùn huáng\",\r\n 数白论黄: \"shǔ bái lùn huáng\",\r\n 束缊还妇: \"shù yūn huán fù\",\r\n 束蒲为脯: \"shù pú wéi pú\",\r\n 束椽为柱: \"shù chuán wéi zhù\",\r\n 书缺有间: \"shū quē yǒu jiàn\",\r\n 手足重茧: \"shǒu zú chóng jiǎn\",\r\n 手足异处: \"shǒu zú yì chǔ\",\r\n 手脚干净: \"shǒu jiǎo gàn jìng\",\r\n 手不应心: \"shǒu bù yīng xīn\",\r\n 螫手解腕: \"shì shǒu jiě wàn\",\r\n 释知遗形: \"shì zhī yí xíng\",\r\n 适时应务: \"shì shí yīng wù\",\r\n 适情率意: \"shì qíng shuài yì\",\r\n 适当其冲: \"shì dāng qí chōng\",\r\n 视为知己: \"shì wéi zhī jǐ\",\r\n 使羊将狼: \"shǐ yáng jiàng láng\",\r\n 食为民天: \"shí wéi mín tiān\",\r\n 拾掇无遗: \"shí duō wú yí\",\r\n 实与有力: \"shí yù yǒu lì\",\r\n 石英玻璃: \"shí yīng bō li\",\r\n 石室金匮: \"shí shì jīn guì\",\r\n 什袭珍藏: \"shí xí zhēn cáng\",\r\n 什伍东西: \"shí wǔ dōng xī\",\r\n 什围伍攻: \"shí wéi wǔ gōng\",\r\n 十魔九难: \"shí mó jiǔ nàn\",\r\n 诗书发冢: \"shī shū fà zhǒng\",\r\n 虱处裈中: \"shī chǔ kūn zhōng\",\r\n 师直为壮: \"shī zhí wéi zhuàng\",\r\n 尸居龙见: \"shī jū lóng xiàn\",\r\n 圣经贤传: \"shèng jīng xián zhuàn\",\r\n 圣君贤相: \"shèng jūn xián xiàng\",\r\n 生拖死拽: \"shēng tuō sǐ zhuài\",\r\n 审己度人: \"shěn jǐ duó rén\",\r\n 神武挂冠: \"shén wǔ guà guàn\",\r\n 神龙失埶: \"shén lóng shī shì\",\r\n 深文曲折: \"shēn wén qǔ shé\",\r\n 深厉浅揭: \"shēn lì qiǎn qì\",\r\n 深谷为陵: \"shēn gǔ wéi líng\",\r\n 深恶痛疾: \"shēn wù tòng jí\",\r\n 深仇宿怨: \"shēn chóu xiǔ yuàn\",\r\n 舍己为公: \"shě jǐ wèi gōng\",\r\n 舍短取长: \"shě duǎn qǔ cháng\",\r\n 舍策追羊: \"shě cè zhuī yáng\",\r\n 蛇蝎为心: \"shé xiē wéi xīn\",\r\n 少成若性: \"shào chéng ruò xìng\",\r\n 上当学乖: \"shàng dàng xué guāi\",\r\n 赏不当功: \"shǎng bù dāng gōng\",\r\n 善自为谋: \"shàn zì wéi móu\",\r\n 善为说辞: \"shàn wéi shuō cí\",\r\n 善善恶恶: \"shàn shàn wù è\",\r\n 善财难舍: \"shàn cái nán shě\",\r\n 苫眼铺眉: \"shān yǎn pū méi\",\r\n 讪牙闲嗑: \"shàn yá xián kē\",\r\n 山阴乘兴: \"shān yīn chéng xīng\",\r\n 山殽野湋: \"shān yáo yě wéi\",\r\n 山溜穿石: \"shān liù chuān shí\",\r\n 山节藻棁: \"shān jié zǎo zhuō\",\r\n 杀鸡为黍: \"shā jī wéi shǔ\",\r\n 色厉胆薄: \"sè lì dǎn bó\",\r\n 桑荫未移: \"sāng yīn wèi yí\",\r\n 桑荫不徙: \"sāng yīn bù xǐ\",\r\n 桑土绸缪: \"sāng tǔ chóu miù\",\r\n 桑户棬枢: \"sāng hù juàn shū\",\r\n 三战三北: \"sān zhàn sān běi\",\r\n 三瓦两舍: \"sān wǎ liǎng shě\",\r\n 三人为众: \"sān rén wèi zhòng\",\r\n 三差两错: \"sān chā liǎng cuò\",\r\n 塞井焚舍: \"sāi jǐng fén shě\",\r\n 洒心更始: \"sǎ xīn gèng shǐ\",\r\n 洒扫应对: \"sǎ sǎo yìng duì\",\r\n 软红香土: \"ruǎn hóng xiāng tǔ\",\r\n 入吾彀中: \"rù wú gòu zhōng\",\r\n 入铁主簿: \"rù tiě zhǔ bù\",\r\n 入理切情: \"rù lǐ qiē qíng\",\r\n 汝成人耶: \"rǔ chéng rén yé\",\r\n 如水投石: \"rú shuǐ tóu shí\",\r\n 如切如磋: \"rú qiē rú cuō\",\r\n 如登春台: \"rú dēng chūn tái\",\r\n 肉薄骨并: \"ròu bó gǔ bìng\",\r\n 柔情绰态: \"róu qíng chuò tài\",\r\n 戎马劻勷: \"róng mǎ kuāng ráng\",\r\n 日中为市: \"rì zhōng wéi shì\",\r\n 日月参辰: \"rì yuè shēn chén\",\r\n 日省月修: \"rì xǐng yuè xiū\",\r\n 日削月割: \"rì xuē yuè gē\",\r\n 日省月试: \"rì xǐng yuè shì\",\r\n 任达不拘: \"rèn dá bù jū\",\r\n 人言藉藉: \"rén yán jí jí\",\r\n 人模狗样: \"rén mú gǒu yàng\",\r\n 人莫予毒: \"rén mò yú dú\",\r\n 热熬翻饼: \"rè áo fān bǐng\",\r\n 圈牢养物: \"juàn láo yǎng wù\",\r\n 取予有节: \"qǔ yǔ yǒu jié\",\r\n 诎要桡腘: \"qū yāo ráo guó\",\r\n 穷形尽相: \"qióng xíng jìn xiàng\",\r\n 情凄意切: \"qíng qī yì qiè\",\r\n 情见势屈: \"qíng xiàn shì qū\",\r\n 情见乎辞: \"qíng xiàn hū cí\",\r\n 清都绛阙: \"qīng dōu jiàng què\",\r\n 倾肠倒肚: \"qīng cháng dào dǔ\",\r\n 青紫被体: \"qīng zǐ pī tǐ\",\r\n 青林黑塞: \"qīng lín hēi sài\",\r\n 螓首蛾眉: \"qín shǒu é méi\",\r\n 琴瑟之好: \"qín sè zhī hào\",\r\n 且住为佳: \"qiě zhù wéi jiā\",\r\n 切树倒根: \"qiē shù dǎo gēn\",\r\n 切理餍心: \"qiē lǐ yàn xīn\",\r\n 切近的当: \"qiē jìn de dāng\",\r\n 翘足引领: \"qiáo zú yǐn lǐng\",\r\n 巧发奇中: \"qiǎo fā qí zhòng\",\r\n 强嘴拗舌: \"jiàng zuǐ niù shé\",\r\n 强直自遂: \"qiáng zhí zì suí\",\r\n 强死强活: \"qiǎng sǐ qiǎng huó\",\r\n 强食自爱: \"qiǎng shí zì ài\",\r\n 强食靡角: \"qiǎng shí mí jiǎo\",\r\n 强弓劲弩: \"qiáng gōng jìng nǔ\",\r\n 强聒不舍: \"qiǎng guō bù shě\",\r\n 强凫变鹤: \"qiáng fú biàn hè\",\r\n 强而后可: \"qiǎng ér hòu kě\",\r\n 强得易贫: \"qiǎng dé yì pín\",\r\n 遣兴陶情: \"qiǎn xìng táo qíng\",\r\n 牵羊担酒: \"qiān yáng dān jiǔ\",\r\n 千了百当: \"qiān liǎo bǎi dàng\",\r\n 泣下如雨: \"qì xià rú yǔ\",\r\n 起偃为竖: \"qǐ yǎn wéi shù\",\r\n 岂弟君子: \"kǎi tì jūn zǐ\",\r\n 綦溪利跂: \"qí xī lì qí\",\r\n 棋输先著: \"qí shū xiān zhuó\",\r\n 齐王舍牛: \"qí wáng shě niú\",\r\n 欺天诳地: \"qī tiān kuáng dì\",\r\n 普天率土: \"pǔ tiān shuài tǔ\",\r\n 铺胸纳地: \"pū xiōng nà dì\",\r\n 铺锦列绣: \"pū jǐn liè xiù\",\r\n 破家为国: \"pò jiā wèi guó\",\r\n 破觚为圜: \"pò gū wéi yuán\",\r\n 萍飘蓬转: \"píng piāo péng zhuàn\",\r\n 帡天极地: \"píng tiān jí dì\",\r\n 屏声息气: \"bǐng shēng xī qì\",\r\n 凭几据杖: \"píng jī jù zhàng\",\r\n 贫嘴薄舌: \"pín zuǐ bó shé\",\r\n 片语只辞: \"piàn yǔ zhī cí\",\r\n 披发文身: \"pī fà wén shēn\",\r\n 烹龙炮凤: \"pēng lóng páo fèng\",\r\n 炰鳖脍鲤: \"fǒu biē kuài lǐ\",\r\n 庞眉皓发: \"páng méi hào fà\",\r\n 攀花折柳: \"pān huā zhé liǔ\",\r\n 攀蟾折桂: \"pān chán shé guì\",\r\n 女大难留: \"nǚ dà nán liú\",\r\n 弄玉吹箫: \"nòng yù chuī xiāo\",\r\n 弄管调弦: \"nòng guǎn tiáo xián\",\r\n 弄粉调朱: \"nòng fěn diào zhū\",\r\n 浓抹淡妆: \"nóng mò dàn zhuāng\",\r\n 捻土为香: \"niǎn tǔ wéi xiāng\",\r\n 年谊世好: \"nián yì shì hǎo\",\r\n 年华垂暮: \"nián huá chuí mù\",\r\n 儗不于伦: \"nǐ bù yú lún\",\r\n 泥而不滓: \"ní ér bù zǐ\",\r\n 能者为师: \"néng zhě wéi shī\",\r\n 能不称官: \"néng bú chèn guān\",\r\n 挠直为曲: \"náo zhí wéi qū\",\r\n 难进易退: \"nán jìn yì tuì\",\r\n 难得糊涂: \"nán dé hú tú\",\r\n 南蛮鴂舌: \"nán mán jué shé\",\r\n 南贩北贾: \"nán fàn běi gǔ\",\r\n 牧猪奴戏: \"mù zhū nú xì\",\r\n 目眢心忳: \"mù yuān xīn tún\",\r\n 目挑心招: \"mù tiǎo xīn zhāo\",\r\n 目量意营: \"mù liàng yì yíng\",\r\n 木头木脑: \"mù tóu mù nǎo\",\r\n 木干鸟栖: \"mù gàn niǎo qī\",\r\n 侔色揣称: \"móu sè chuǎi chèn\",\r\n 莫予毒也: \"mò yú dú yě\",\r\n 抹粉施脂: \"mò fěn shī zhī\",\r\n 磨砻镌切: \"mó lóng juān qiē\",\r\n 磨棱刓角: \"mó léng wán jiǎo\",\r\n 摸门不着: \"mō mén bù zháo\",\r\n 摸不着边: \"mō bù zhuó biān\",\r\n 命中注定: \"mìng zhōng zhù dìng\",\r\n 鸣鹤之应: \"míng hè zhī yìng\",\r\n 明效大验: \"míng xiào dà yàn\",\r\n 名我固当: \"míng wǒ gù dāng\",\r\n 邈处欿视: \"miǎo chǔ kǎn shì\",\r\n 黾穴鸲巢: \"měng xué qú cháo\",\r\n 绵里薄材: \"mián lǐ bó cái\",\r\n 靡有孑遗: \"mǐ yǒu jié yí\",\r\n 靡衣偷食: \"mǐ yī tōu shí\",\r\n 迷恋骸骨: \"mí liàn hái gǔ\",\r\n 扪参历井: \"mén shēn lì jǐng\",\r\n 门单户薄: \"mén dān hù bó\",\r\n 昧旦晨兴: \"mèi dàn chén xīng\",\r\n 冒名接脚: \"mào míng jiē jiǎo\",\r\n 毛遂堕井: \"máo suí duò jǐng\",\r\n 毛发倒竖: \"máo fā dǎo shù\",\r\n 卖文为生: \"mài wén wéi shēng\",\r\n 卖李钻核: \"mài lǐ zuān hé\",\r\n 买椟还珠: \"mǎi dú huán zhū\",\r\n 埋三怨四: \"mán sān yuàn sì\",\r\n 马入华山: \"mǎ rù huá shān\",\r\n 落魄江湖: \"luò pò jiāng hú\",\r\n 落落难合: \"luò luò nán hé\",\r\n 落草为寇: \"luò cǎo wéi kòu\",\r\n 罗织构陷: \"luó zhī gòu xiàn\",\r\n 鸾凤和鸣: \"luán fèng hè míng\",\r\n 率由旧章: \"shuài yóu jiù zhāng\",\r\n 率土同庆: \"shuài tǔ tóng qìng\",\r\n 率兽食人: \"shuài shòu shí rén\",\r\n 率土归心: \"shuài tǔ guī xīn\",\r\n 率马以骥: \"shuài mǎ yǐ jì\",\r\n 率尔成章: \"shuài ěr chéng zhāng\",\r\n 鲁斤燕削: \"lǔ jīn yàn xuē\",\r\n 漏尽更阑: \"lòu jìn gēng lán\",\r\n 笼鸟槛猿: \"lóng niǎo jiàn yuán\",\r\n 笼鸟池鱼: \"lóng niǎo chí yú\",\r\n 龙游曲沼: \"lóng yóu qū zhǎo\",\r\n 龙血玄黄: \"lóng xuè xuán huáng\",\r\n 龙雕凤咀: \"lóng diāo fèng jǔ\",\r\n 六尺之讬: \"liù chǐ zhī tuō\",\r\n 令原之戚: \"líng yuán zhī qī\",\r\n 令人捧腹: \"lìng rén pěng fù\",\r\n 陵劲淬砺: \"líng jìng cuì lì\",\r\n 临敌易将: \"lín dí yì jiàng\",\r\n 裂裳衣疮: \"liè shang yī chuāng\",\r\n 裂冠毁冕: \"liè guàn huǐ miǎn\",\r\n 了无惧色: \"liǎo wú jù sè\",\r\n 了身达命: \"liǎo shēn dá mìng\",\r\n 了然无闻: \"liǎo rán wú wén\",\r\n 了不可见: \"liǎo bù kě jiàn\",\r\n 了不长进: \"liǎo bù zhǎng jìn\",\r\n 燎发摧枯: \"liǎo fà cuī kū\",\r\n 审时度势: \"shěn shí duó shì\",\r\n 量小力微: \"liàng xiǎo lì wēi\",\r\n 相时度力: \"xiāng shí duó lì\",\r\n 量枘制凿: \"liàng ruì zhì záo\",\r\n 量如江海: \"liàng rú jiāng hǎi\",\r\n 量金买赋: \"liàng jīn mǎi fù\",\r\n 量己审分: \"liàng jǐ shěn fēn\",\r\n 敛骨吹魂: \"liǎn gǔ chuī hún\",\r\n 詈夷为跖: \"lì yí wéi zhí\",\r\n 利令志惛: \"lì lìng zhì hūn\",\r\n 李广不侯: \"lǐ guǎng bú hòu\",\r\n 礼为情貌: \"lǐ wéi qíng mào\",\r\n 礼让为国: \"lǐ ràng wéi guó\",\r\n 犁生骍角: \"lí shēng xīng jiǎo\",\r\n 离本徼末: \"lí běn jiǎo mò\",\r\n 楞眉横眼: \"léng méi hèng yǎn\",\r\n 擂天倒地: \"léi tiān dǎo dì\",\r\n 累足成步: \"lěi zú chéng bù\",\r\n 累瓦结绳: \"lěi wǎ jié shéng\",\r\n 累土至山: \"lěi tǔ zhì shān\",\r\n 累土聚沙: \"lěi tǔ jù shā\",\r\n 累卵之危: \"lěi luǎn zhī wēi\",\r\n 累累如珠: \"lěi lěi rú zhū\",\r\n 累块积苏: \"lěi kuài jī sū\",\r\n 乐山乐水: \"lè shān lè shuǐ\",\r\n 潦原浸天: \"lǎo yuán jìn tiān\",\r\n 老师宿儒: \"lǎo shī xiǔ rú\",\r\n 牢什古子: \"láo shí gǔ zi\",\r\n 琅嬛福地: \"láng huán fú dì\",\r\n 揆情度理: \"kuí qíng duó lǐ\",\r\n 旷日累时: \"kuàng rì lěi shí\",\r\n 匡救弥缝: \"kuāng jiù mí fèng\",\r\n 枯树生华: \"kū shù shēng huā\",\r\n 口轻舌薄: \"kǒu qīng shé bó\",\r\n 口角生风: \"kǒu jiǎo shēng fēng\",\r\n 口角春风: \"kǒu jiǎo chūn fēng\",\r\n 口角风情: \"kǒu jiǎo fēng qíng\",\r\n 口干舌焦: \"kǒu gān shé jiāo\",\r\n 口腹之累: \"kǒu fù zhī lěi\",\r\n 空腹便便: \"kōng fù pián pián\",\r\n 嗑牙料嘴: \"kē yá liào zuǐ\",\r\n 刻木为鹄: \"kè mù wéi hú\",\r\n 咳珠唾玉: \"ké zhū tuò yù\",\r\n 咳唾成珠: \"ké tuò chéng zhū\",\r\n 抗颜为师: \"kàng yán wéi shī\",\r\n 开华结果: \"kāi huā jié guǒ\",\r\n 峻阪盐车: \"jùn bǎn yán chē\",\r\n 嚼铁咀金: \"jiáo tiě jǔ jīn\",\r\n 嚼墨喷纸: \"jué mò pēn zhǐ\",\r\n 倔头强脑: \"juè tóu jiàng nǎo\",\r\n 倔头倔脑: \"juè tóu juè nǎo\",\r\n 倦鸟知还: \"juàn niǎo zhī huán\",\r\n 卷席而葬: \"juǎn xí ér zàng\",\r\n 卷甲倍道: \"juǎn jiǎ bèi dào\",\r\n 聚米为山: \"jù mǐ wéi shān\",\r\n 举手相庆: \"jǔ shǒu xiāng qìng\",\r\n 举世混浊: \"jǔ shì hún zhuó\",\r\n 鞠为茂草: \"jū wéi mào cǎo\",\r\n 拘神遣将: \"jū shén qiǎn jiàng\",\r\n 居下讪上: \"jū xià shàn shàng\",\r\n 久要不忘: \"jiǔ yāo bú wàng\",\r\n 九转功成: \"jiǔ zhuǎn gōng chéng\",\r\n 九蒸三熯: \"jiǔ zhēng sān hàn\",\r\n 敬业乐群: \"jìng yè lè qún\",\r\n 井底虾蟆: \"jǐng dǐ xiā má\",\r\n 旌旗卷舒: \"jīng qí juǎn shū\",\r\n 荆棘载途: \"jīng jí zài tú\",\r\n 禁舍开塞: \"jìn shě kāi sāi\",\r\n 祲威盛容: \"jìn wēi shèng róng\",\r\n 进退消长: \"jìn tuì xiāo cháng\",\r\n 进退应矩: \"jìn tuì yīng jǔ\",\r\n 进退触籓: \"jìn tuì chù fān\",\r\n 进退跋疐: \"jìn tuì bá zhì\",\r\n 尽多尽少: \"jǐn duō jǐn shǎo\",\r\n 锦囊还矢: \"jǐn náng huán shǐ\",\r\n 矜己自饰: \"jīn jǐ zì shì\",\r\n 矜功负气: \"jīn gōng fù qì\",\r\n 津关险塞: \"jīn guān xiǎn sài\",\r\n 金吾不禁: \"jīn wú bú jìn\",\r\n 金翅擘海: \"jīn chì bāi hǎi\",\r\n 解衣衣人: \"jiě yī yī rén\",\r\n 解人难得: \"jiě rén nán dé\",\r\n 解铃系铃: \"jiě líng xì líng\",\r\n 解发佯狂: \"jiě fà yáng kuáng\",\r\n 诘屈磝碻: \"jié qū áo qiāo\",\r\n 教猱升木: \"jiāo náo shēng mù\",\r\n 较瘦量肥: \"jiào shòu liàng féi\",\r\n 角立杰出: \"jiǎo lì jié chū\",\r\n 焦沙烂石: \"jiāo shā làn shí\",\r\n 骄儿騃女: \"jiāo ér sì nǚ\",\r\n 浇风薄俗: \"jiāo fēng bó sú\",\r\n 降妖捉怪: \"xiáng yāo zhuō guài\",\r\n 将取固予: \"jiāng qǔ gù yǔ\",\r\n 将门有将: \"jiàng mén yǒu jiàng\",\r\n 将夺固与: \"jiāng duó gù yǔ\",\r\n 槛花笼鹤: \"jiàn huā lóng hè\",\r\n 鉴影度形: \"jiàn yǐng duó xíng\",\r\n 渐不可长: \"jiàn bù kě zhǎng\",\r\n 见素抱朴: \"xiàn sù bào pǔ\",\r\n 见弃于人: \"jiàn qì yú rén\",\r\n 简丝数米: \"jiǎn sī shǔ mǐ\",\r\n 俭不中礼: \"jiǎn bú zhòng lǐ\",\r\n 间见层出: \"jiàn xiàn céng chū\",\r\n 尖嘴薄舌: \"jiān zuǐ bó shé\",\r\n 甲冠天下: \"jiǎ guàn tiān xià\",\r\n 葭莩之亲: \"jiā fú zhī qīn\",\r\n 家累千金: \"jiā lèi qiān jīn\",\r\n 家给人足: \"jiā jǐ rén zú\",\r\n 家道从容: \"jiā dào cóng róng\",\r\n 夹袋人物: \"jiā dài rén wù\",\r\n 霁风朗月: \"jì fēng lǎng yuè\",\r\n 寄兴寓情: \"jì xìng yù qíng\",\r\n 计深虑远: \"jì shēn lǜ yuǎn\",\r\n 计功量罪: \"jì gōng liàng zuì\",\r\n 掎裳连襼: \"jǐ shang lián yì\",\r\n 虮虱相吊: \"jǐ shī xiāng diào\",\r\n 疾不可为: \"jí bù kě wéi\",\r\n 极深研几: \"jí shēn yán jī\",\r\n 及宾有鱼: \"jí bīn yǒu yú\",\r\n 激薄停浇: \"jī bó tíng jiāo\",\r\n 积素累旧: \"jī sù lěi jiù\",\r\n 积时累日: \"jī shí lěi rì\",\r\n 积露为波: \"jī lù wéi bō\",\r\n 积德累功: \"jī dé lěi gōng\",\r\n 积谗糜骨: \"jī chán méi gǔ\",\r\n 击排冒没: \"jī pái mào mò\",\r\n 祸为福先: \"huò wéi fú xiān\",\r\n 祸福相依: \"huò fú xiāng yī\",\r\n 获隽公车: \"huò jùn gōng chē\",\r\n 混应滥应: \"hùn yīng làn yīng\",\r\n 毁舟为杕: \"huǐ zhōu wéi duò\",\r\n 毁钟为铎: \"huǐ zhōng wéi duó\",\r\n 毁冠裂裳: \"huǐ guān liè cháng\",\r\n 晦盲否塞: \"huì máng pǐ sè\",\r\n 回船转舵: \"huí chuán zhuàn duò\",\r\n 潢池盗弄: \"huáng chí dào nòng\",\r\n 黄冠草履: \"huáng guàn cǎo lǚ\",\r\n 黄发儿齿: \"huáng fà ér chǐ\",\r\n 黄发垂髫: \"huáng fà chuí tiáo\",\r\n 还珠返璧: \"huán zhū fǎn bì\",\r\n 还年驻色: \"huán nián zhù sè\",\r\n 还年却老: \"huán nián què lǎo\",\r\n 坏裳为裤: \"huài shang wéi kù\",\r\n 画荻和丸: \"huà dí huò wán\",\r\n 化枭为鸠: \"huà xiāo wéi jiū\",\r\n 化腐为奇: \"huà fǔ wéi qí\",\r\n 化鸱为凤: \"huà chī wéi fèng\",\r\n 花不棱登: \"huā bu lēng dēng\",\r\n 户限为穿: \"hù xiàn wéi chuān\",\r\n 呼卢喝雉: \"hū lú hè zhì\",\r\n 呼来喝去: \"hū lái hè qù\",\r\n 呼不给吸: \"hū bù jǐ xī\",\r\n 厚味腊毒: \"hòu wèi xī dú\",\r\n 厚德载物: \"hòu dé zài wù\",\r\n 鸿渐于干: \"hóng jiàn yú gàn\",\r\n 洪炉燎发: \"hóng lú liáo fà\",\r\n 红绳系足: \"hóng shéng jì zú\",\r\n 红不棱登: \"hóng bu lēng dēng\",\r\n 横抢硬夺: \"hèng qiǎng yìng duó\",\r\n 横恩滥赏: \"hèng ēn làn shǎng\",\r\n 恨海难填: \"hèn hǎi nán tián\",\r\n 鹤发鸡皮: \"hè fà jī pí\",\r\n 涸思干虑: \"hé sī gān lǜ\",\r\n 河涸海干: \"hé hé hǎi gān\",\r\n 和颜说色: \"hé yán yuè sè\",\r\n 合从连衡: \"hé zòng lián héng\",\r\n 浩浩汤汤: \"hào hào shāng shāng\",\r\n 好勇斗狠: \"hào yǒng dòu hěn\",\r\n 好问则裕: \"hào wèn zé yù\",\r\n 好为事端: \"hào wéi shì duān\",\r\n 好问决疑: \"hào wèn jué yí\",\r\n 好生之德: \"hào shēng zhī dé\",\r\n 好奇尚异: \"hǎo qí shàng yì\",\r\n 好恶不同: \"hǎo è bù tóng\",\r\n 好丹非素: \"hào dān fēi sù\",\r\n 豪干暴取: \"háo gàn bào qǔ\",\r\n 毫发不爽: \"háo fà bù shuǎng\",\r\n 寒酸落魄: \"hán suān luò pò\",\r\n 含英咀华: \"hán yīng jǔ huá\",\r\n 含糊不明: \"hán hú bù míng\",\r\n 过为已甚: \"guò wéi yǐ shèn\",\r\n 桂折兰摧: \"guì shé lán cuī\",\r\n 规旋矩折: \"guī xuán jǔ shé\",\r\n 广文先生: \"guǎng wén xiān sheng\",\r\n 广陵散绝: \"guǎng líng sǎn jué\",\r\n 冠山戴粒: \"guàn shān dài lì\",\r\n 冠屦倒施: \"guàn jù dǎo shī\",\r\n 挂席为门: \"guà xí wéi mén\",\r\n 寡见鲜闻: \"guǎ jiàn xiǎn wén\",\r\n 瓜葛相连: \"guā gé xiāng lián\",\r\n 鼓吻奋爪: \"gǔ wěn fèn zhǎo\",\r\n 古调单弹: \"gǔ diào dān tán\",\r\n 古调不弹: \"gǔ diào bù tán\",\r\n 姑射神人: \"gū yè shén rén\",\r\n 苟合取容: \"gǒu hé qǔ róng\",\r\n 狗续侯冠: \"gǒu xù hòu guàn\",\r\n 钩爪锯牙: \"gōu zhǎo jù yá\",\r\n 共枝别干: \"gòng zhī bié gàn\",\r\n 共为唇齿: \"gòng wéi chún chǐ\",\r\n 拱手而降: \"gǒng shǒu ér xiáng\",\r\n 拱肩缩背: \"gǒng jiān suō bèi\",\r\n 功薄蝉翼: \"gōng bó chán yì\",\r\n 弓调马服: \"gōng diào mǎ fú\",\r\n 更姓改物: \"gēng xìng gǎi wù\",\r\n 更仆难数: \"gēng pú nán shǔ\",\r\n 更令明号: \"gēng lìng míng hào\",\r\n 更待干罢: \"gèng dài gàn bà\",\r\n 更唱迭和: \"gēng chàng dié hé\",\r\n 更长梦短: \"gēng cháng mèng duǎn\",\r\n 各色名样: \"gè sè míng yàng\",\r\n 格格不纳: \"gé gé bú nà\",\r\n 格格不吐: \"gé gé bù tǔ\",\r\n 告朔饩羊: \"gù shuò xì yáng\",\r\n 膏车秣马: \"gào chē mò mǎ\",\r\n 高义薄云: \"gāo yì bó yún\",\r\n 岗头泽底: \"gāng tóu zé dǐ\",\r\n 敢为敢做: \"gǎn wéi gǎn zuò\",\r\n 甘分随时: \"gān fèn suí shí\",\r\n 甘处下流: \"gān chǔ xià liú\",\r\n 干啼湿哭: \"gàn tí shī kū\",\r\n 干名犯义: \"gàn míng fàn yì\",\r\n 干将莫邪: \"gān jiāng mò yé\",\r\n 干城之将: \"gān chéng zhī jiàng\",\r\n 腹载五车: \"fù zài wǔ chē\",\r\n 父债子还: \"fù zhài zǐ huán\",\r\n 父为子隐: \"fù wéi zǐ yǐn\",\r\n 辅世长民: \"fǔ shì zhǎng mín\",\r\n 福为祸始: \"fú wéi huò shǐ\",\r\n 符号逻辑: \"fú hào luó jí\",\r\n 浮收勒折: \"fú shōu lè shé\",\r\n 肤受之愬: \"fū shòu zhī sù\",\r\n 否终则泰: \"pǐ zhōng zé tài\",\r\n 佛头著粪: \"fó tóu zhuó fèn\",\r\n 奉为楷模: \"fèng wéi kǎi mó\",\r\n 凤靡鸾吪: \"fèng mǐ luán é\",\r\n 封豨修蛇: \"fēng xī xiū shé\",\r\n 风影敷衍: \"fēng yǐng fū yǎn\",\r\n 丰屋蔀家: \"fēng wū bù jiā\",\r\n 粪土不如: \"fèn tǔ bù rú\",\r\n 分风劈流: \"fēn fēng pǐ liú\",\r\n 沸沸汤汤: \"fèi fèi shāng shāng\",\r\n 菲食薄衣: \"fěi shí bó yī\",\r\n 飞将数奇: \"fēi jiàng shù qí\",\r\n 放辟邪侈: \"fàng pì xié chǐ\",\r\n 方领圆冠: \"fāng lǐng yuán guàn\",\r\n 犯而不校: \"fàn ér bú jiào\",\r\n 返本还源: \"fǎn běn huán yuán\",\r\n 反劳为逸: \"fǎn láo wéi yì\",\r\n 法轮常转: \"fǎ lún cháng zhuàn\",\r\n 罚不当罪: \"fá bù dāng zuì\",\r\n 发引千钧: \"fà yǐn qiān jūn\",\r\n 发奸擿伏: \"fā jiān tī fú\",\r\n 发短心长: \"fà duǎn xīn cháng\",\r\n 二竖为虐: \"èr shù wéi nüè\",\r\n 儿女心肠: \"ér nǚ xīn cháng\",\r\n 儿女亲家: \"ér nǚ qìng jiā\",\r\n 遏恶扬善: \"è wù yáng shàn\",\r\n 饿殍枕藉: \"è piǎo zhěn jí\",\r\n 饿殍载道: \"è piǎo zài dào\",\r\n 恶醉强酒: \"wù zuì qiǎng jiǔ\",\r\n 恶意中伤: \"è yì zhòng shāng\",\r\n 恶湿居下: \"wù shī jū xià\",\r\n 恶居下流: \"wù jū xià liú\",\r\n 恶不去善: \"wù bú qù shàn\",\r\n 扼吭夺食: \"è háng duó shí\",\r\n 扼襟控咽: \"è jīn kòng yān\",\r\n 峨峨汤汤: \"é é shāng shāng\",\r\n 屙金溺银: \"ē jīn niào yín\",\r\n 朵颐大嚼: \"duǒ yí dà jiáo\",\r\n 夺人所好: \"duó rén suǒ hào\",\r\n 多言数穷: \"duō yán shuò qióng\",\r\n 多文为富: \"duō wén wéi fù\",\r\n 多端寡要: \"duō duān guǎ yào\",\r\n 多财善贾: \"duō cái shàn gǔ\",\r\n 遁世无闷: \"dùn shì wú mèn\",\r\n 遁迹黄冠: \"dùn jì huáng guàn\",\r\n 堆案盈几: \"duī àn yíng jī\",\r\n 断还归宗: \"duàn huán guī zōng\",\r\n 短见薄识: \"duǎn jiàn bó shí\",\r\n 蠹居棊处: \"dù jū qí chǔ\",\r\n 度己以绳: \"duó jǐ yǐ shéng\",\r\n 杜默为诗: \"dù mò wéi shī\",\r\n 杜鹃啼血: \"dù juān tí xuè\",\r\n 笃近举远: \"dǔ jìn jǔ yuǎn\",\r\n 独有千秋: \"dú yǒu qiān qiū\",\r\n 读书得间: \"dú shū dé jiàn\",\r\n 斗转参横: \"dǒu zhuǎn shēn héng\",\r\n 兜肚连肠: \"dōu dǔ lián cháng\",\r\n 洞见症结: \"dòng jiàn zhèng jié\",\r\n 恫疑虚喝: \"dòng yí xū hè\",\r\n 动中窾要: \"dòng zhōng kuǎn yào\",\r\n 东鸣西应: \"dōng míng xī yīng\",\r\n 东鳞西爪: \"dōng lín xī zhǎo\",\r\n 东量西折: \"dōng liàng xī shé\",\r\n 东家西舍: \"dōng jiā xī shè\",\r\n 东扯西拽: \"dōng chě xī zhuāi\",\r\n 鼎铛有耳: \"dǐng chēng yǒu ěr\",\r\n 鼎铛玉石: \"dǐng chēng yù shí\",\r\n 钉头磷磷: \"dīng tóu lín lín\",\r\n 跌宕不羁: \"diē dàng bù jī\",\r\n 跌弹斑鸠: \"diē dàn bān jiū\",\r\n 雕心雁爪: \"diāo xīn yàn zhǎo\",\r\n 颠倒衣裳: \"diān dǎo yī cháng\",\r\n 德薄能鲜: \"dé bó néng xiǎn\",\r\n 得马折足: \"dé mǎ shé zú\",\r\n 蹈其覆辙: \"dǎo qí fù zhé\",\r\n 捣虚撇抗: \"dǎo xū piē kàng\",\r\n 倒载干戈: \"dào zài gān gē\",\r\n 倒裳索领: \"dào cháng suǒ lǐng\",\r\n 倒果为因: \"dào guǒ wéi yīn\",\r\n 叨在知己: \"tāo zài zhī jǐ\",\r\n 叨陪末座: \"tāo péi mò zuò\",\r\n 党豺为虐: \"dǎng chái wéi nüè\",\r\n 当轴处中: \"dāng zhóu chǔ zhōng\",\r\n 当着不着: \"dāng zhuó bù zhuó\",\r\n 当务始终: \"dāng wù shǐ zhōng\",\r\n 淡汝浓抹: \"dàn rǔ nóng mǒ\",\r\n 弹丸脱手: \"tán wán tuō shǒu\",\r\n 弹铗无鱼: \"dàn jiá wú yú\",\r\n 箪食瓢饮: \"dān sì piáo yǐn\",\r\n 大璞不完: \"dà pú bù wán\",\r\n 大明法度: \"dà míng fǎ dù\",\r\n 大车以载: \"dà chē yǐ zài\",\r\n 打闷葫芦: \"dǎ mèn hú lu\",\r\n 沓来踵至: \"tà lái zhǒng zhì\",\r\n 厝火燎原: \"cuò huǒ liǎo yuán\",\r\n 撮科打哄: \"cuō kē dǎ hòng\",\r\n 寸积铢累: \"cùn jī zhū lěi\",\r\n 啛啛喳喳: \"cuì cuì chā chā\",\r\n 摧折豪强: \"cuī zhé háo qiáng\",\r\n 摧刚为柔: \"cuī gāng wéi róu\",\r\n 从俗就简: \"cóng sú jiù jiǎn\",\r\n 此发彼应: \"cǐ fā bǐ yīng\",\r\n 此唱彼和: \"cǐ chàng bǐ hè\",\r\n 慈悲为本: \"cí bēi wéi běn\",\r\n 纯属骗局: \"chún shǔ piàn jú\",\r\n 春笋怒发: \"chūn sǔn nù fā\",\r\n 垂头搨翼: \"chuí tóu tà yì\",\r\n 传为笑谈: \"chuán wéi xiào tán\",\r\n 传风扇火: \"chuán fēng shān huǒ\",\r\n 穿红着绿: \"chuān hóng zhuó lǜ\",\r\n 触处机来: \"chù chǔ jī lái\",\r\n 处尊居显: \"chǔ zūn jū xiǎn\",\r\n 处堂燕雀: \"chǔ táng yàn què\",\r\n 处实效功: \"chǔ shí xiào gōng\",\r\n 处高临深: \"chǔ gāo lín shēn\",\r\n 出入无间: \"chū rù wú jiān\",\r\n 出门应辙: \"chū mén yīng zhé\",\r\n 出处语默: \"chū chǔ yǔ mò\",\r\n 出处殊途: \"chū chǔ shū tú\",\r\n 出处进退: \"chū chǔ jìn tuì\",\r\n 愁山闷海: \"chóu shān mèn hǎi\",\r\n 冲冠眦裂: \"chōng guàn zì liè\",\r\n 齿牙为祸: \"chǐ yá wéi huò\",\r\n 尺二冤家: \"chǐ èr yuān jia\",\r\n 尺短寸长: \"chǐ duǎn cùn cháng\",\r\n 尺寸之功: \"chǐ cùn zhī gōng\",\r\n 城北徐公: \"chéng běi xú gōng\",\r\n 成败兴废: \"chéng bài xīng fèi\",\r\n 趁水和泥: \"chèn shuǐ huò ní\",\r\n 称雨道晴: \"chēng yǔ dào qíng\",\r\n 称体载衣: \"chēng tǐ zài yī\",\r\n 称体裁衣: \"chèn tǐ cái yī\",\r\n 称家有无: \"chèn jiā yǒu wú\",\r\n 称德度功: \"chēng dé duó gōng\",\r\n 沉吟章句: \"chén yín zhāng jù\",\r\n 沉吟不决: \"chén yín bù jué\",\r\n 沉疴宿疾: \"chén kē sù jí\",\r\n 扯纤拉烟: \"chě qiàn lā yān\",\r\n 扯顺风旗: \"chě shùn fēng qí\",\r\n 车载船装: \"chē zǎi chuán zhuāng\",\r\n 朝升暮合: \"zhāo shēng mù gě\",\r\n 朝攀暮折: \"zhāo pān mù shé\",\r\n 超今冠古: \"chāo jīn guàn gǔ\",\r\n 倡而不和: \"chàng ér bú hè\",\r\n 畅所欲为: \"chàng suǒ yù wéi\",\r\n 苌弘碧血: \"cháng hóng bì xiě\",\r\n 长幼尊卑: \"zhǎng yòu zūn bēi\",\r\n 长绳系日: \"cháng shéng jì rì\",\r\n 长年三老: \"zhǎng nián sān lǎo\",\r\n 长春不老: \"cháng chūn bù lǎo\",\r\n 长傲饰非: \"zhǎng ào shì fēi\",\r\n 昌亭旅食: \"chāng tíng lǚ shí\",\r\n 禅絮沾泥: \"chán xù zhān ní\",\r\n 差三错四: \"chā sān cuò sì\",\r\n 层台累榭: \"céng tái lěi xiè\",\r\n 层见迭出: \"céng xiàn dié chū\",\r\n 藏踪蹑迹: \"cáng zōng niè jì\",\r\n 苍蝇见血: \"cāng yíng jiàn xiě\",\r\n 餐松啖柏: \"cān sōng dàn bó\",\r\n 骖风驷霞: \"cān fēng sì xiá\",\r\n 参伍错综: \"cēn wǔ cuò zōng\",\r\n 参辰卯酉: \"shēn chén mǎo yǒu\",\r\n 材优干济: \"cái yōu gān jǐ\",\r\n 材薄质衰: \"cái bó zhì shuāi\",\r\n 才大难用: \"cái dà nán yòng\",\r\n 才薄智浅: \"cái bó zhì qiǎn\",\r\n 不足为意: \"bù zú wéi yì\",\r\n 不足为据: \"bù zú wéi jù\",\r\n 不足为法: \"bù zú wéi fǎ\",\r\n 不足齿数: \"bù zú chǐ shǔ\",\r\n 不着疼热: \"bù zhuó téng rè\",\r\n 不知薡蕫: \"bù zhī dǐng dǒng\",\r\n 不越雷池: \"bú yuè léi chí\",\r\n 不相为谋: \"bù xiāng wéi móu\",\r\n 不贪为宝: \"bù tān wéi bǎo\",\r\n 不了而了: \"bù liǎo ér liǎo\",\r\n 不可揆度: \"bù kě kuí duó\",\r\n 不遑启处: \"bù huáng qǐ chǔ\",\r\n 不当不正: \"bù dāng bú zhèng\",\r\n 不差什么: \"bú chà shén me\",\r\n 不差累黍: \"bù chā lěi shǔ\",\r\n 擘两分星: \"bò liǎng fēn xīng\",\r\n 簸土扬沙: \"bǒ tǔ yáng shā\",\r\n 薄物细故: \"bó wù xì gù\",\r\n 薄寒中人: \"bó hán zhòng rén\",\r\n 博文约礼: \"bó wén yuē lǐ\",\r\n 播糠眯目: \"bō kāng mí mù\",\r\n 剥皮抽筋: \"bō pí chōu jīn\",\r\n 剥肤椎髓: \"bō fū chuí suǐ\",\r\n 波属云委: \"bō zhǔ yún wěi\",\r\n 波骇云属: \"bō hài yún zhǔ\",\r\n 兵微将寡: \"bīng wēi jiàng guǎ\",\r\n 兵强将勇: \"bīng qiáng jiàng yǒng\",\r\n 兵多将广: \"bīng duō jiàng guǎng\",\r\n 兵不由将: \"bīng bù yóu jiàng\",\r\n 冰解的破: \"bīng jiě dì pò\",\r\n 彬彬济济: \"bīn bīn jǐ jǐ\",\r\n 摽梅之年: \"biào méi zhī nián\",\r\n 表里为奸: \"biǎo lǐ wéi jiān\",\r\n 飙发电举: \"biāo fā diàn jǔ\",\r\n 变贪厉薄: \"biàn tān lì bó\",\r\n 敝盖不弃: \"bì gài bú qì\",\r\n 秕言谬说: \"bǐ yán miù shuō\",\r\n 比物属事: \"bǐ wù zhǔ shì\",\r\n 被山带河: \"pī shān dài hé\",\r\n 被甲枕戈: \"pī jiǎ zhěn gē\",\r\n 被甲据鞍: \"pī jiǎ jù ān\",\r\n 被褐怀玉: \"pī hè huái yù\",\r\n 被发缨冠: \"pī fà yīng guàn\",\r\n 背曲腰躬: \"bèi qǔ yāo gōng\",\r\n 北窗高卧: \"běi chuāng gāo wò\",\r\n 北辰星拱: \"běi chén xīng gǒng\",\r\n 北鄙之音: \"běi bǐ zhī yīn\",\r\n 卑宫菲食: \"bēi gōng fěi shí\",\r\n 暴衣露冠: \"pù yī lù guàn\",\r\n 暴腮龙门: \"pù sāi lóng mén\",\r\n 暴露文学: \"bào lù wén xué\",\r\n 暴虎冯河: \"bào hǔ píng hé\",\r\n 抱蔓摘瓜: \"bào wàn zhāi guā\",\r\n 抱法处势: \"bào fǎ chǔ shì\",\r\n 褒贬与夺: \"bāo biǎn yǔ duó\",\r\n 帮闲钻懒: \"bāng xián zuān lǎn\",\r\n 拜将封侯: \"bài jiàng fēng hóu\",\r\n 百兽率舞: \"bǎi shòu shuài wǔ\",\r\n 百孔千创: \"bǎi kǒng qiān chuāng\",\r\n 白衣卿相: \"bái yī qīng xiàng\",\r\n 白首为郎: \"bái shǒu wéi láng\",\r\n 白首相知: \"bái shǒu xiāng zhī\",\r\n 把玩无厌: \"bǎ wán wú yàn\",\r\n 拔锅卷席: \"bá guō juǎn xí\",\r\n 拔本塞源: \"bá běn sè yuán\",\r\n 傲不可长: \"ào bù kě zhǎng\",\r\n 熬更守夜: \"áo gēng shǒu yè\",\r\n 安时处顺: \"ān shí chǔ shùn\",\r\n 安身为乐: \"ān shēn wéi lè\",\r\n 安老怀少: \"ān lǎo huái shào\",\r\n 安步当车: \"ān bù dàng chē\",\r\n 爱人好士: \"ài rén hào shì\",\r\n 矮人观场: \"ǎi rén guān chǎng\",\r\n 捱风缉缝: \"ái fēng jī fèng\",\r\n 挨山塞海: \"āi shān sè hǎi\",\r\n 阿家阿翁: \"ā jiā ā wēng\",\r\n 阿党相为: \"ē dǎng xiāng wéi\",\r\n 追亡逐北: \"zhuī wáng zhú běi\",\r\n 竹篮打水: \"zhú lán dá shuǐ\",\r\n 知疼着热: \"zhī téng zháo rè\",\r\n 语不惊人: \"yǔ bù jīng rén\",\r\n 于今为烈: \"yú jīn wéi liè\",\r\n 一日三省: \"yí rì sān xǐng\",\r\n 穴居野处: \"xué jū yě chǔ\",\r\n 五脊六兽: \"wǔ jǐ liù shòu\",\r\n 无声无臭: \"wú shēng wú xiù\",\r\n 谓予不信: \"wèi yú bú xìn\",\r\n 舍身为国: \"shě shēn wéi guó\",\r\n 杀妻求将: \"shā qī qiú jiàng\",\r\n 强作解人: \"qiǎng zuò jiě rén\",\r\n 气冲斗牛: \"qì chōng dǒu niú\",\r\n 临深履薄: \"lín shēn lǚ bó\",\r\n 钧天广乐: \"jūn tiān guǎng yuè\",\r\n 艰难竭蹶: \"jiān nán jié jué\",\r\n 夹七夹八: \"jiā qī jiā bā\",\r\n 混混噩噩: \"hún hún è è\",\r\n 厚古薄今: \"hòu gǔ bó jīn\",\r\n 鬼怕恶人: \"guǐ pà è rén\",\r\n 伽马射线: \"gā mǎ shè xiàn\",\r\n 佛头着粪: \"fó tóu zhuó fèn\",\r\n 奉为至宝: \"fèng wéi zhì bǎo\",\r\n 登坛拜将: \"dēng tán bài jiàng\",\r\n 晨昏定省: \"chén hūn dìng xǐng\",\r\n 察察为明: \"chá chá wéi míng\",\r\n 博闻强识: \"bó wén qiáng zhì\",\r\n 避难就易: \"bì nán jiù yì\",\r\n 了无生机: 'liǎo wú shēng jī',\r\n // 一字不变调的词语,如果词语仅有单个一且一字在结尾的无需添加(需要增补更多)\r\n 有一说一: 'yǒu yī shuō yī',\r\n 独一无二: 'dú yī wú èr',\r\n 说一不二: 'shuō yī bù èr',\r\n 举一反三: 'jǔ yī fǎn sān',\r\n 数一数二: 'shǔ yī shǔ èr',\r\n 杀一儆百: 'shā yī jǐng bǎi',\r\n 丁一卯二: 'dīng yī mǎo èr',\r\n 丁一确二: 'dīng yī què èr',\r\n 不一而止: 'bù yī ér zhǐ',\r\n 无一幸免: 'wú yī xìng miǎn',\r\n // 来源:https://m.gushici.com/cyxy_4e00_4\r\n 表里不一: 'biǎo lǐ bù yī',\r\n 良莠不一: 'liáng yǒu bù yī',\r\n 心口不一: 'xīn kǒu bù yī',\r\n 言行不一: 'yán xíng bù yī',\r\n 政令不一: 'zhèng lìng bù yī',\r\n 参差不一: 'cēn cī bù yī',\r\n 纷纷不一: 'fēn fēn bù yī',\r\n 毁誉不一: 'huǐ yù bù yī',\r\n 不一而三: 'bù yī ér sān',\r\n 百不一遇: 'bǎi bù yī yù',\r\n 言行抱一: 'yán xíng bào yī',\r\n 瑜百瑕一: 'yú bǎi xiá yī',\r\n 背城借一: 'bèi chéng jiè yī',\r\n 凭城借一: 'píng chéng jiè yī',\r\n 劝百讽一: 'quàn bǎi fěng yī',\r\n 群居和一: 'qún jū hé yī',\r\n 百不获一: 'bǎi bù huò yī',\r\n 百不失一: 'bǎi bù shī yī',\r\n 百无失一: 'bǎi wú shī yī',\r\n 万不失一: 'wàn bù shī yī',\r\n 万无失一: 'wàn wú shī yī',\r\n 合而为一: 'hé ér wéi yī',\r\n 合两为一: 'hé liǎng wéi yī',\r\n 合二为一: 'hé èr wéi yī',\r\n 天下为一: 'tiān xià wéi yī',\r\n 相与为一: 'xiāng yǔ wéi yī',\r\n 较若画一: 'jiào ruò huà yī',\r\n 较如画一: 'jiào rú huà yī',\r\n 斠若画一: 'jiào ruò huà yī',\r\n 言行若一: 'yán xíng ruò yī',\r\n 始终若一: 'shǐ zhōng ruò yī',\r\n 终始若一: 'zhōng shǐ ruò yī',\r\n 惟精惟一: 'wéi jīng wéi yī',\r\n 众多非一: 'zhòng duō fēi yī',\r\n 不能赞一: 'bù néng zàn yī',\r\n 问一答十: 'wèn yī dá shí',\r\n 一不扭众: 'yī bù niǔ zhòng',\r\n 一以贯之: 'yī yǐ guàn zhī',\r\n 一以当百: 'yī yǐ dāng bǎi',\r\n 百不当一: 'bǎi bù dāng yī',\r\n 十不当一: 'shí bù dāng yī',\r\n 以一警百: 'yǐ yī jǐng bǎi',\r\n 以一奉百: 'yǐ yī fèng bǎi',\r\n 以一持万: 'yǐ yī chí wàn',\r\n 以一知万: 'yǐ yī zhī wàn',\r\n 百里挑一: 'bǎi lǐ tiāo yī',\r\n 整齐划一: 'zhěng qí huà yī',\r\n 一来二去: 'yī lái èr qù',\r\n 一路公交: 'yī lù gōng jiāo',\r\n 一路汽车: 'yī lù qì chē',\r\n 一路巴士: 'yī lù bā shì',\r\n 朝朝朝落: 'zhāo cháo zhāo luò',\r\n 曲意逢迎: 'qū yì féng yíng',\r\n 一行不行: 'yì háng bù xíng',\r\n 行行不行: 'háng háng bù xíng'\r\n};\r\nconst Pattern4 = Object.keys(DICT4).map((key) => ({\r\n zh: key,\r\n pinyin: DICT4[key],\r\n probability: 2e-8 /* Probability.DICT */,\r\n length: 4,\r\n priority: Priority.Normal,\r\n dict: Symbol('dict4'),\r\n}));\n\nexport { Pattern4, DICT4 as default };\n","import { Priority } from '../common/constant.mjs';\n\nconst DICT5 = {\r\n 巴尔干半岛: 'bā ěr gàn bàn dǎo',\r\n 巴尔喀什湖: 'bā ěr kā shí hú',\r\n 不幸而言中: 'bú xìng ér yán zhòng',\r\n 布尔什维克: 'bù ěr shí wéi kè',\r\n 何乐而不为: 'hé lè ér bù wéi',\r\n 苛政猛于虎: 'kē zhèng měng yú hǔ',\r\n 蒙得维的亚: 'méng dé wéi dì yà',\r\n 民以食为天: 'mín yǐ shí wéi tiān',\r\n 事后诸葛亮: 'shì hòu zhū gě liàng',\r\n 物以稀为贵: 'wù yǐ xī wéi guì',\r\n 先下手为强: 'xiān xià shǒu wéi qiáng',\r\n 行行出状元: 'háng háng chū zhuàng yuan',\r\n 亚得里亚海: 'yà dé lǐ yà hǎi',\r\n 眼不见为净: 'yǎn bú jiàn wéi jìng',\r\n 竹筒倒豆子: 'zhú tǒng dào dòu zi',\r\n};\r\nconst Pattern5 = Object.keys(DICT5).map((key) => ({\r\n zh: key,\r\n pinyin: DICT5[key],\r\n probability: 2e-8 /* Probability.DICT */,\r\n length: 5,\r\n priority: Priority.Normal,\r\n dict: Symbol('dict5'),\r\n}));\n\nexport { Pattern5, DICT5 as default };\n","import { PatternNumberDict } from './special.mjs';\nimport { Pattern2 } from './dict2.mjs';\nimport { Pattern3 } from './dict3.mjs';\nimport { Pattern4 } from './dict4.mjs';\nimport { Pattern5 } from './dict5.mjs';\nimport { PatternSurname } from './surname.mjs';\n\nconst PatternsNormal = [\r\n ...Pattern5,\r\n ...Pattern4,\r\n ...Pattern3,\r\n ...Pattern2,\r\n ...PatternNumberDict,\r\n ...PatternSurname,\r\n];\n\nexport { PatternsNormal };\n","import { Priority } from '../common/constant.mjs';\nimport { stringLength } from '../common/utils.mjs';\n\nconst InitialList = [\r\n \"zh\",\r\n \"ch\",\r\n \"sh\",\r\n \"z\",\r\n \"c\",\r\n \"s\",\r\n \"b\",\r\n \"p\",\r\n \"m\",\r\n \"f\",\r\n \"d\",\r\n \"t\",\r\n \"n\",\r\n \"l\",\r\n \"g\",\r\n \"k\",\r\n \"h\",\r\n \"j\",\r\n \"q\",\r\n \"x\",\r\n \"r\",\r\n \"y\",\r\n \"w\",\r\n \"\",\r\n];\r\nconst SpecialInitialList = [\"j\", \"q\", \"x\"];\r\nconst SpecialFinalList = [\r\n \"uān\",\r\n \"uán\",\r\n \"uǎn\",\r\n \"uàn\",\r\n \"uan\",\r\n \"uē\",\r\n \"ué\",\r\n \"uě\",\r\n \"uè\",\r\n \"ue\",\r\n \"ūn\",\r\n \"ún\",\r\n \"ǔn\",\r\n \"ùn\",\r\n \"un\",\r\n \"ū\",\r\n \"ú\",\r\n \"ǔ\",\r\n \"ù\",\r\n \"u\",\r\n];\r\nconst SpecialFinalMap = {\r\n uān: \"üān\",\r\n uán: \"üán\",\r\n uǎn: \"üǎn\",\r\n uàn: \"üàn\",\r\n uan: \"üan\",\r\n uē: \"üē\",\r\n ué: \"üé\",\r\n uě: \"üě\",\r\n uè: \"üè\",\r\n ue: \"üe\",\r\n ūn: \"ǖn\",\r\n ún: \"ǘn\",\r\n ǔn: \"ǚn\",\r\n ùn: \"ǜn\",\r\n un: \"ün\",\r\n ū: \"ǖ\",\r\n ú: \"ǘ\",\r\n ǔ: \"ǚ\",\r\n ù: \"ǜ\",\r\n u: \"ü\",\r\n};\r\nconst doubleFinalList = [\r\n \"ia\",\r\n \"ian\",\r\n \"iang\",\r\n \"iao\",\r\n \"ie\",\r\n \"iu\",\r\n \"iong\",\r\n \"ua\",\r\n \"uai\",\r\n \"uan\",\r\n \"uang\",\r\n \"ue\",\r\n \"ui\",\r\n \"uo\",\r\n \"üan\",\r\n \"üe\",\r\n \"van\",\r\n \"ve\",\r\n];\r\n/**\r\n * @description: 数量词 + 特殊词 音调处理\r\n */\r\nconst Numbers = {\r\n 一: \"yì\",\r\n 二: \"èr\",\r\n 三: \"sān\",\r\n 四: \"sì\",\r\n 五: \"wǔ\",\r\n 六: \"liù\",\r\n 七: \"qī\",\r\n 八: \"bā\",\r\n 九: \"jiǔ\",\r\n 十: \"shí\",\r\n 百: \"bǎi\",\r\n 千: \"qiān\",\r\n 万: \"wàn\",\r\n 亿: \"yì\",\r\n 单: \"dān\",\r\n 两: \"liǎng\",\r\n 双: \"shuāng\",\r\n 多: \"duō\",\r\n 几: \"jǐ\",\r\n 十一: \"shí yī\",\r\n 零一: \"líng yī\",\r\n 第一: \"dì yī\",\r\n 一十: \"yī shí\",\r\n 一十一: \"yī shí yī\",\r\n};\r\nconst NumberWordMap = {\r\n 重: \"chóng\",\r\n 行: \"háng\",\r\n 斗: \"dǒu\",\r\n 更: \"gēng\",\r\n};\r\n// 与以下词组合时,不变调\r\nfunction genNumberDict() {\r\n const dict = {\r\n 零一: \"líng yī\",\r\n 〇一: \"líng yī\",\r\n 十一: \"shí yī\",\r\n 一十: \"yī shí\",\r\n 第一: \"dì yī\",\r\n 一十一: \"yī shí yī\",\r\n };\r\n for (let number in Numbers) {\r\n for (let key in NumberWordMap) {\r\n const word = `${number}${key}`;\r\n const pinyin = `${Numbers[number]} ${NumberWordMap[key]}`;\r\n dict[word] = pinyin;\r\n }\r\n }\r\n return dict;\r\n}\r\nconst NumberDict = genNumberDict();\r\nconst PatternNumberDict = Object.keys(NumberDict).map((key) => ({\r\n zh: key,\r\n pinyin: NumberDict[key],\r\n probability: 1e-12 /* Probability.Rule */,\r\n length: stringLength(key),\r\n priority: Priority.Normal,\r\n dict: Symbol(\"rule\"),\r\n}));\r\n/**\r\n * @description: 连续变调处理:https://zh.wiktionary.org/wiki/Appendix:%E2%80%9C%E4%B8%80%E2%80%9D%E5%8F%8A%E2%80%9C%E4%B8%8D%E2%80%9D%E7%9A%84%E5%8F%98%E8%B0%83\r\n */\r\nconst toneSandhiMap = {\r\n // 说不说,说一说,叠词之间发音为轻声\r\n 不: {\r\n bú: [4], // \"不\" 后面跟 4 声时,变调为 2 声\r\n },\r\n 一: {\r\n yí: [4],\r\n yì: [1, 2, 3],\r\n },\r\n};\r\nconst toneSandhiIgnoreSuffix = {\r\n 不: [\"的\", \"而\", \"之\", \"后\", \"也\", \"还\", \"地\"],\r\n 一: [\"的\", \"而\", \"之\", \"后\", \"也\", \"还\", \"是\"],\r\n};\r\nconst toneSandhiList = Object.keys(toneSandhiMap);\n\nexport { InitialList, PatternNumberDict, SpecialFinalList, SpecialFinalMap, SpecialInitialList, doubleFinalList, toneSandhiIgnoreSuffix, toneSandhiList, toneSandhiMap };\n","import { Priority } from '../common/constant.mjs';\nimport { stringLength } from '../common/utils.mjs';\n\nconst Surnames = {\r\n 南宫: 'nán gōng',\r\n 第五: 'dì wǔ',\r\n 万俟: 'mò qí',\r\n 司马: 'sī mǎ',\r\n 上官: 'shàng guān',\r\n 欧阳: 'ōu yáng',\r\n 夏侯: 'xià hóu',\r\n 诸葛: 'zhū gě',\r\n 闻人: 'wén rén',\r\n 东方: 'dōng fāng',\r\n 赫连: 'hè lián',\r\n 皇甫: 'huáng fǔ',\r\n 尉迟: 'yù chí',\r\n 公羊: 'gōng yáng',\r\n 澹台: 'tán tái',\r\n 公冶: 'gōng yě',\r\n 宗政: 'zōng zhèng',\r\n 濮阳: 'pú yáng',\r\n 淳于: 'chún yú',\r\n 太叔: 'tài shū',\r\n 申屠: 'shēn tú',\r\n 公孙: 'gōng sūn',\r\n 仲孙: 'zhòng sūn',\r\n 轩辕: 'xuān yuán',\r\n 令狐: 'líng hú',\r\n 钟离: 'zhōng lí',\r\n 宇文: 'yǔ wén',\r\n 长孙: 'zhǎng sūn',\r\n 慕容: 'mù róng',\r\n 鲜于: 'xiān yú',\r\n 闾丘: 'lǘ qiū',\r\n 司徒: 'sī tú',\r\n 司空: 'sī kōng',\r\n 亓官: 'qí guān',\r\n 司寇: 'sī kòu',\r\n 仉督: 'zhǎng dū',\r\n 子车: 'zǐ jū',\r\n 颛孙: 'zhuān sūn',\r\n 端木: 'duān mù',\r\n 巫马: 'wū mǎ',\r\n 公西: 'gōng xī',\r\n 漆雕: 'qī diāo',\r\n 乐正: 'yuè zhèng',\r\n 壤驷: 'rǎng sì',\r\n 公良: 'gōng liáng',\r\n 拓跋: 'tuò bá',\r\n 夹谷: 'jiá gǔ',\r\n 宰父: 'zǎi fǔ',\r\n 榖梁: 'gǔ liáng',\r\n 段干: 'duàn gān',\r\n 百里: 'bǎi lǐ',\r\n 东郭: 'dōng guō',\r\n 南门: 'nán mén',\r\n 呼延: 'hū yán',\r\n 羊舌: 'yáng shé',\r\n 梁丘: 'liáng qiū',\r\n 左丘: 'zuǒ qiū',\r\n 东门: 'dōng mén',\r\n 西门: 'xī mén',\r\n 句龙: 'gōu lóng',\r\n 毌丘: 'guàn qiū',\r\n 赵: 'zhào',\r\n 钱: 'qián',\r\n 孙: 'sūn',\r\n 李: 'lǐ',\r\n 周: 'zhōu',\r\n 吴: 'wú',\r\n 郑: 'zhèng',\r\n 王: 'wáng',\r\n 冯: 'féng',\r\n 陈: 'chén',\r\n 褚: 'chǔ',\r\n 卫: 'wèi',\r\n 蒋: 'jiǎng',\r\n 沈: 'shěn',\r\n 韩: 'hán',\r\n 杨: 'yáng',\r\n 朱: 'zhū',\r\n 秦: 'qín',\r\n 尤: 'yóu',\r\n 许: 'xǔ',\r\n 何: 'hé',\r\n 吕: 'lǚ',\r\n 施: 'shī',\r\n 张: 'zhāng',\r\n 孔: 'kǒng',\r\n 曹: 'cáo',\r\n 严: 'yán',\r\n 华: 'huà',\r\n 金: 'jīn',\r\n 魏: 'wèi',\r\n 陶: 'táo',\r\n 姜: 'jiāng',\r\n 戚: 'qī',\r\n 谢: 'xiè',\r\n 邹: 'zōu',\r\n 喻: 'yù',\r\n 柏: 'bǎi',\r\n 水: 'shuǐ',\r\n 窦: 'dòu',\r\n 章: 'zhāng',\r\n 云: 'yún',\r\n 苏: 'sū',\r\n 潘: 'pān',\r\n 葛: 'gě',\r\n 奚: 'xī',\r\n 范: 'fàn',\r\n 彭: 'péng',\r\n 郎: 'láng',\r\n 鲁: 'lǔ',\r\n 韦: 'wéi',\r\n 昌: 'chāng',\r\n 马: 'mǎ',\r\n 苗: 'miáo',\r\n 凤: 'fèng',\r\n 花: 'huā',\r\n 方: 'fāng',\r\n 俞: 'yú',\r\n 任: 'rén',\r\n 袁: 'yuán',\r\n 柳: 'liǔ',\r\n 酆: 'fēng',\r\n 鲍: 'bào',\r\n 史: 'shǐ',\r\n 唐: 'táng',\r\n 费: 'fèi',\r\n 廉: 'lián',\r\n 岑: 'cén',\r\n 薛: 'xuē',\r\n 雷: 'léi',\r\n 贺: 'hè',\r\n 倪: 'ní',\r\n 汤: 'tāng',\r\n 滕: 'téng',\r\n 殷: 'yīn',\r\n 罗: 'luó',\r\n 毕: 'bì',\r\n 郝: 'hǎo',\r\n 邬: 'wū',\r\n 安: 'ān',\r\n 常: 'cháng',\r\n 乐: 'yuè',\r\n 于: 'yú',\r\n 时: 'shí',\r\n 傅: 'fù',\r\n 皮: 'pí',\r\n 卞: 'biàn',\r\n 齐: 'qí',\r\n 康: 'kāng',\r\n 伍: 'wǔ',\r\n 余: 'yú',\r\n 元: 'yuán',\r\n 卜: 'bǔ',\r\n 顾: 'gù',\r\n 孟: 'mèng',\r\n 平: 'píng',\r\n 黄: 'huáng',\r\n 和: 'hé',\r\n 穆: 'mù',\r\n 萧: 'xiāo',\r\n 尹: 'yǐn',\r\n 姚: 'yáo',\r\n 邵: 'shào',\r\n 湛: 'zhàn',\r\n 汪: 'wāng',\r\n 祁: 'qí',\r\n 毛: 'máo',\r\n 禹: 'yǔ',\r\n 狄: 'dí',\r\n 米: 'mǐ',\r\n 贝: 'bèi',\r\n 明: 'míng',\r\n 臧: 'zāng',\r\n 计: 'jì',\r\n 伏: 'fú',\r\n 成: 'chéng',\r\n 戴: 'dài',\r\n 谈: 'tán',\r\n 宋: 'sòng',\r\n 茅: 'máo',\r\n 庞: 'páng',\r\n 熊: 'xióng',\r\n 纪: 'jǐ',\r\n 舒: 'shū',\r\n 屈: 'qū',\r\n 项: 'xiàng',\r\n 祝: 'zhù',\r\n 董: 'dǒng',\r\n 梁: 'liáng',\r\n 杜: 'dù',\r\n 阮: 'ruǎn',\r\n 蓝: 'lán',\r\n 闵: 'mǐn',\r\n 席: 'xí',\r\n 季: 'jì',\r\n 麻: 'má',\r\n 强: 'qiáng',\r\n 贾: 'jiǎ',\r\n 路: 'lù',\r\n 娄: 'lóu',\r\n 危: 'wēi',\r\n 江: 'jiāng',\r\n 童: 'tóng',\r\n 颜: 'yán',\r\n 郭: 'guō',\r\n 梅: 'méi',\r\n 盛: 'shèng',\r\n 林: 'lín',\r\n 刁: 'diāo',\r\n 钟: 'zhōng',\r\n 徐: 'xú',\r\n 邱: 'qiū',\r\n 骆: 'luò',\r\n 高: 'gāo',\r\n 夏: 'xià',\r\n 蔡: 'cài',\r\n 田: 'tián',\r\n 樊: 'fán',\r\n 胡: 'hú',\r\n 凌: 'líng',\r\n 霍: 'huò',\r\n 虞: 'yú',\r\n 万: 'wàn',\r\n 支: 'zhī',\r\n 柯: 'kē',\r\n 昝: 'zǎn',\r\n 管: 'guǎn',\r\n 卢: 'lú',\r\n 莫: 'mò',\r\n 经: 'jīng',\r\n 房: 'fáng',\r\n 裘: 'qiú',\r\n 缪: 'miào',\r\n 干: 'gān',\r\n 解: 'xiè',\r\n 应: 'yīng',\r\n 宗: 'zōng',\r\n 丁: 'dīng',\r\n 宣: 'xuān',\r\n 贲: 'bēn',\r\n 邓: 'dèng',\r\n 郁: 'yù',\r\n 单: 'shàn',\r\n 杭: 'háng',\r\n 洪: 'hóng',\r\n 包: 'bāo',\r\n 诸: 'zhū',\r\n 左: 'zuǒ',\r\n 石: 'shí',\r\n 崔: 'cuī',\r\n 吉: 'jí',\r\n 钮: 'niǔ',\r\n 龚: 'gōng',\r\n 程: 'chéng',\r\n 嵇: 'jī',\r\n 邢: 'xíng',\r\n 滑: 'huá',\r\n 裴: 'péi',\r\n 陆: 'lù',\r\n 荣: 'róng',\r\n 翁: 'wēng',\r\n 荀: 'xún',\r\n 羊: 'yáng',\r\n 於: 'yū',\r\n 惠: 'huì',\r\n 甄: 'zhēn',\r\n 曲: 'qū',\r\n 家: 'jiā',\r\n 封: 'fēng',\r\n 芮: 'ruì',\r\n 羿: 'yì',\r\n 储: 'chǔ',\r\n 靳: 'jìn',\r\n 汲: 'jí',\r\n 邴: 'bǐng',\r\n 糜: 'mí',\r\n 松: 'sōng',\r\n 井: 'jǐng',\r\n 段: 'duàn',\r\n 富: 'fù',\r\n 巫: 'wū',\r\n 乌: 'wū',\r\n 焦: 'jiāo',\r\n 巴: 'bā',\r\n 弓: 'gōng',\r\n 牧: 'mù',\r\n 隗: 'wěi',\r\n 山: 'shān',\r\n 谷: 'gǔ',\r\n 车: 'chē',\r\n 侯: 'hóu',\r\n 宓: 'mì',\r\n 蓬: 'péng',\r\n 全: 'quán',\r\n 郗: 'xī',\r\n 班: 'bān',\r\n 仰: 'yǎng',\r\n 秋: 'qiū',\r\n 仲: 'zhòng',\r\n 伊: 'yī',\r\n 宫: 'gōng',\r\n 宁: 'nìng',\r\n 仇: 'qiú',\r\n 栾: 'luán',\r\n 暴: 'bào',\r\n 甘: 'gān',\r\n 钭: 'tǒu',\r\n 厉: 'lì',\r\n 戎: 'róng',\r\n 祖: 'zǔ',\r\n 武: 'wǔ',\r\n 符: 'fú',\r\n 刘: 'liú',\r\n 景: 'jǐng',\r\n 詹: 'zhān',\r\n 束: 'shù',\r\n 龙: 'lóng',\r\n 叶: 'yè',\r\n 幸: 'xìng',\r\n 司: 'sī',\r\n 韶: 'sháo',\r\n 郜: 'gào',\r\n 黎: 'lí',\r\n 蓟: 'jì',\r\n 薄: 'bó',\r\n 印: 'yìn',\r\n 宿: 'sù',\r\n 白: 'bái',\r\n 怀: 'huái',\r\n 蒲: 'pú',\r\n 邰: 'tái',\r\n 从: 'cóng',\r\n 鄂: 'è',\r\n 索: 'suǒ',\r\n 咸: 'xián',\r\n 籍: 'jí',\r\n 赖: 'lài',\r\n 卓: 'zhuó',\r\n 蔺: 'lìn',\r\n 屠: 'tú',\r\n 蒙: 'méng',\r\n 池: 'chí',\r\n 乔: 'qiáo',\r\n 阴: 'yīn',\r\n 鬱: 'yù',\r\n 胥: 'xū',\r\n 能: 'nài',\r\n 苍: 'cāng',\r\n 双: 'shuāng',\r\n 闻: 'wén',\r\n 莘: 'shēn',\r\n 党: 'dǎng',\r\n 翟: 'zhái',\r\n 谭: 'tán',\r\n 贡: 'gòng',\r\n 劳: 'láo',\r\n 逄: 'páng',\r\n 姬: 'jī',\r\n 申: 'shēn',\r\n 扶: 'fú',\r\n 堵: 'dǔ',\r\n 冉: 'rǎn',\r\n 宰: 'zǎi',\r\n 郦: 'lì',\r\n 雍: 'yōng',\r\n 郤: 'xì',\r\n 璩: 'qú',\r\n 桑: 'sāng',\r\n 桂: 'guì',\r\n 濮: 'pú',\r\n 牛: 'niú',\r\n 寿: 'shòu',\r\n 通: 'tōng',\r\n 边: 'biān',\r\n 扈: 'hù',\r\n 燕: 'yān',\r\n 冀: 'jì',\r\n 郏: 'jiá',\r\n 浦: 'pǔ',\r\n 尚: 'shàng',\r\n 农: 'nóng',\r\n 温: 'wēn',\r\n 别: 'bié',\r\n 庄: 'zhuāng',\r\n 晏: 'yàn',\r\n 柴: 'chái',\r\n 瞿: 'qú',\r\n 阎: 'yán',\r\n 充: 'chōng',\r\n 慕: 'mù',\r\n 连: 'lián',\r\n 茹: 'rú',\r\n 习: 'xí',\r\n 宦: 'huàn',\r\n 艾: 'ài',\r\n 鱼: 'yú',\r\n 容: 'róng',\r\n 向: 'xiàng',\r\n 古: 'gǔ',\r\n 易: 'yì',\r\n 慎: 'shèn',\r\n 戈: 'gē',\r\n 廖: 'liào',\r\n 庾: 'yǔ',\r\n 终: 'zhōng',\r\n 暨: 'jì',\r\n 居: 'jū',\r\n 衡: 'héng',\r\n 步: 'bù',\r\n 都: 'dū',\r\n 耿: 'gěng',\r\n 满: 'mǎn',\r\n 弘: 'hóng',\r\n 匡: 'kuāng',\r\n 国: 'guó',\r\n 文: 'wén',\r\n 寇: 'kòu',\r\n 广: 'guǎng',\r\n 禄: 'lù',\r\n 阙: 'quē',\r\n 东: 'dōng',\r\n 欧: 'ōu',\r\n 殳: 'shū',\r\n 沃: 'wò',\r\n 利: 'lì',\r\n 蔚: 'wèi',\r\n 越: 'yuè',\r\n 夔: 'kuí',\r\n 隆: 'lóng',\r\n 师: 'shī',\r\n 巩: 'gǒng',\r\n 厍: 'shè',\r\n 聂: 'niè',\r\n 晁: 'cháo',\r\n 勾: 'gōu',\r\n 敖: 'áo',\r\n 融: 'róng',\r\n 冷: 'lěng',\r\n 訾: 'zī',\r\n 辛: 'xīn',\r\n 阚: 'kàn',\r\n 那: 'nā',\r\n 简: 'jiǎn',\r\n 饶: 'ráo',\r\n 空: 'kōng',\r\n 曾: 'zēng',\r\n 母: 'mǔ',\r\n 沙: 'shā',\r\n 乜: 'niè',\r\n 养: 'yǎng',\r\n 鞠: 'jū',\r\n 须: 'xū',\r\n 丰: 'fēng',\r\n 巢: 'cháo',\r\n 关: 'guān',\r\n 蒯: 'kuǎi',\r\n 相: 'xiàng',\r\n 查: 'zhā',\r\n 后: 'hòu',\r\n 荆: 'jīng',\r\n 红: 'hóng',\r\n 游: 'yóu',\r\n 竺: 'zhú',\r\n 权: 'quán',\r\n 逯: 'lù',\r\n 盖: 'gě',\r\n 益: 'yì',\r\n 桓: 'huán',\r\n 公: 'gōng',\r\n 牟: 'móu',\r\n 哈: 'hǎ',\r\n 言: 'yán',\r\n 福: 'fú',\r\n 肖: 'xiāo',\r\n 区: 'ōu',\r\n 覃: 'qín',\r\n 朴: 'piáo',\r\n 繁: 'pó',\r\n 员: 'yùn',\r\n 句: 'gōu',\r\n 要: 'yāo',\r\n 过: 'guō',\r\n 钻: 'zuān',\r\n 谌: 'chén',\r\n 折: 'shé',\r\n 召: 'shào',\r\n 郄: 'qiè',\r\n 撒: 'sǎ',\r\n 甯: 'nìng',\r\n 六: 'lù',\r\n 啜: 'chuài',\r\n 行: 'xíng',\r\n};\r\nconst PatternSurname = Object.keys(Surnames).map((key) => ({\r\n zh: key,\r\n pinyin: Surnames[key],\r\n probability: 1 /* Probability.Surname */ + stringLength(key),\r\n length: stringLength(key),\r\n priority: Priority.Surname,\r\n dict: Symbol('surname'),\r\n}));\n\nexport { PatternSurname, Surnames as default };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tif (!(moduleId in __webpack_modules__)) {\n\t\tdelete __webpack_module_cache__[moduleId];\n\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter/value functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tif(Array.isArray(definition)) {\n\t\tvar i = 0;\n\t\twhile(i < definition.length) {\n\t\t\tvar key = definition[i++];\n\t\t\tvar binding = definition[i++];\n\t\t\tif(!__webpack_require__.o(exports, key)) {\n\t\t\t\tif(binding === 0) {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, value: definition[i++] });\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: binding });\n\t\t\t\t}\n\t\t\t} else if(binding === 0) { i++; }\n\t\t}\n\t} else {\n\t\tfor(var key in definition) {\n\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t\t}\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".dev.js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"tinode-webapp:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// set .name for anonymous default exports per ES spec\n__webpack_require__.dn = function(x) {\n\t(Object.getOwnPropertyDescriptor(x, \"name\") || {}).writable || Object.defineProperty(x, \"name\", { value: \"default\", configurable: true });\n};","__webpack_require__.p = \"/umd/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"index\": 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunktinode_webapp\"] = self[\"webpackChunktinode_webapp\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// Put all packages together.\n// Used to generate umd/index.prod.js\n\nimport React from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport { IntlProvider } from 'react-intl';\n\nimport TinodeWeb from './views/tinode-web.jsx';\nimport HashNavigation from './lib/navigation.js';\n\n// Insert google analytics script and tag if configured.\nif (typeof FIREBASE_INIT != 'undefined' && FIREBASE_INIT && FIREBASE_INIT.measurementId) {\n const head = document.getElementsByTagName('head')[0];\n let script = document.createElement('script');\n script.src = 'https://www.googletagmanager.com/gtag/js?id=' + FIREBASE_INIT.measurementId;\n script.async = true;\n head.prepend(script);\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', FIREBASE_INIT.measurementId);\n}\n\n// Allow loading translation strings for just one language.\nconst messageLoader = {\n 'ar': _ => import('./i18n.min/ar.json'),\n 'de': _ => import('./i18n.min/de.json'),\n 'en': _ => import('./i18n.min/en.json'),\n 'es': _ => import('./i18n.min/es.json'),\n 'fr': _ => import('./i18n.min/fr.json'),\n 'it': _ => import('./i18n.min/it.json'),\n 'ko': _ => import('./i18n.min/ko.json'),\n 'ro': _ => import('./i18n.min/ro.json'),\n 'ru': _ => import('./i18n.min/ru.json'),\n 'th': _ => import('./i18n.min/th.json'),\n 'uk': _ => import('./i18n.min/uk.json'),\n 'vi': _ => import('./i18n.min/vi.json'),\n 'zh': _ => import('./i18n.min/zh.json'),\n 'zh-TW': _ => import('./i18n.min/zh-TW.json')\n};\n\n// List of languages that are written right-to-left.\nconst rtl = ['ar', 'fa', 'he', 'ur'];\n\n// Detect human language to use in the UI:\n// Check parameters from URL hash #?hl=ru, then browser, then use 'en' as a fallback.\nconst { params } = HashNavigation.parseUrlHash(window.location.hash);\nconst language = (params && params.hl) ||\n (navigator.languages && navigator.languages[0]) ||\n navigator.language ||\n navigator.userLanguage ||\n 'en';\n\n// Make sure names like 'en_GB' and 'en-GB' consistently use '-'.\nconst normalized = language.replace('_', '-');\n// Get the base language 'en' from a more specific 'en-US' as a partial fallback.\nconst baseLanguage = normalized.split('-')[0].toLowerCase();\n\n// Try the full locale first, then the locale without the region code, fallback to 'en'.\nconst htmlLang = messageLoader[normalized] ? language : messageLoader[baseLanguage] ? baseLanguage : 'en';\n\nconst html = document.getElementsByTagName('html')[0];\n// Set lang attribute of the HTML element: \nhtml.setAttribute('lang', htmlLang);\nif (rtl.includes(baseLanguage)) {\n // Set right-to-left dir attribute of the HTML element: \n html.setAttribute('dir', 'rtl');\n}\n// Render the app.\nconst root = createRoot(document.getElementById('mountPoint'));\nmessageLoader[htmlLang]().then(messages =>\n root.render(\n React.createElement(IntlProvider,\n { locale: language, messages: messages, textComponent: React.Fragment },\n React.createElement(TinodeWeb, null)\n )\n));\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"index.dev.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAA+D;;AAE/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA,gBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD;AACtD;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,iBAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,8BAA8B;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qBAAM;AACrB,eAAe,qBAAM;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,4EAA0B;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,EAAE;AACtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA,wCAAwC,MAAM;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,KAAK;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,QAAQ;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,qBAAM;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,MAAM;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,iBAAiB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,aAAa,GAAG,KAAK;AACjD;AACA;AACA;AACA,+BAA+B,iBAAiB,IAAI,SAAS,GAAG,SAAS;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,IAAI;AACvD,KAAK;AACL;AACA,mBAAmB,MAAM,IAAI;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,GAAG;AACf;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,aAAa,WAAW;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yBAAyB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,yBAAyB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,QAAQ;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,QAAQ;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,QAAQ;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,wBAAwB,OAAO;AAC/B,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,2BAA2B;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,QAAQ,UAAU,SAAS;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA,qCAAqC;AACrC;AACA;AACA,oDAAoD;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD;AACjD,WAAW,QAAQ;AACnB,YAAY;AACZ;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,EAAE;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2jC;AAC3jC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5pE+C;AAIxC,MAAM,aAAa,GAAG,WAAW;AAEjC,MAAM,QAAQ,GAAG,aAAa,GAAG,GAAG,IAAI,wDAAe,IAAI,MAAM,CAAC;AAMlE,MAAM,OAAO,GAAG,kCAA0B,IAAI,CAAkC;AAGhF,MAAM,WAAW,GAAG;EAAC,MAAM,EAAE,eAAe;EAAE,KAAK,EAAE;AAAgB,CAAC;AAGtE,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM;AAGvC,MAAM,eAAe,GAAG,IAAI;AAG5B,MAAM,cAAc,GAAG,KAAK;AAE5B,MAAM,UAAU,GAAG,KAAK;AAGxB,MAAM,cAAc,GAAG,CAAC;AAExB,MAAM,cAAc,GAAG,EAAE;AAEzB,MAAM,aAAa,GAAG,EAAE;AAGxB,MAAM,uBAAuB,GAAG,OAAO;AAEvC,MAAM,mBAAmB,GAAG,SAAS;AAErC,MAAM,mBAAmB,GAAG,IAAI;AAGhC,MAAM,cAAc,GAAG,GAAG;AAI1B,MAAM,gBAAgB,GAAG,GAAG;AAE5B,MAAM,QAAQ,GAAG,EAAE;AAInB,MAAM,WAAW,GAAG,GAAG;AAGvB,MAAM,gBAAgB,GAAG,IAAI;AAG7B,MAAM,iBAAiB,GAAG,EAAE;AAG5B,MAAM,mBAAmB,GAAG,GAAG;AAG/B,MAAM,aAAa,GAAG,EAAE;AAQxB,MAAM,0BAA0B,GAAG,OAAO;AAI1C,MAAM,0BAA0B,GAAG,CAAC,IAAI,EAAE;AAK1C,MAAM,aAAa,GAAG,IAAI;AAG1B,MAAM,iBAAiB,GAAG,EAAE;AAG5B,MAAM,iBAAiB,GAAG,EAAE;AAG5B,MAAM,mBAAmB,GAAG,EAAE;AAE9B,MAAM,qBAAqB,GAAG,EAAE;AAIhC,MAAM,mBAAmB,GAAG,CAAC;AAG7B,MAAM,gBAAgB,GAAG,EAAE;AAE3B,MAAM,4BAA4B,GAAG,GAAG;AAExC,MAAM,qBAAqB,GAAG,EAAE;AAGhC,MAAM,sBAAsB,GAAG,EAAE;AAGjC,MAAM,mBAAmB,GAAG,EAAE;AAE9B,MAAM,wBAAwB,GAAG,EAAE;AAEnC,MAAM,mBAAmB,GAAG,EAAE;AAG9B,MAAM,YAAY,GAAG,KAAK;AAE1B,MAAM,YAAY,GAAG,OAAO;AAG5B,MAAM,eAAe,GAAG,0BAA0B;AAGlD,MAAM,mBAAmB,GAAG,gCAAgC;AAG5D,MAAM,qBAAqB,GAAG,8BAA8B;AAK5D,MAAM,0BAA0B,GAAG,KAAK;AAGxC,MAAM,qBAAqB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC;AAG9D,MAAM,WAAW,GAAG,GAAG;AAKvB,MAAM,eAAe,GAAG,KAAK;AAE7B,MAAM,YAAY,GAAG,IAAI;AAGzB,MAAM,kBAAkB,GAAG,QAAQ,GAAG,CAAC;AAGvC,MAAM,eAAe,GAAG,gWAAgW;AAGxX,MAAM,cAAc,GAAG,KAAK;AAG5B,MAAM,oBAAoB,GAAG,MAAM;AAGnC,MAAM,iBAAiB,GAAG,EAAE;AAG5B,MAAM,0BAA0B,GAAG,kBAAkB;AAGrD,MAAM,kBAAkB,GAAG;EAAC,IAAI,EAAE,MAAM;EAAE,KAAK,EAAE,CAAC;EAAE,IAAI,EAAC;AAAU,CAAC,C;;;;;;;;;;;;;;;;;;;ACtKpE,MAAM,eAAe,GAAG,CAAC;AACzB,MAAM,4BAA4B,GAAG,CAAC;AACtC,MAAM,4BAA4B,GAAG,CAAC;AACtC,MAAM,sBAAsB,GAAG,CAAC;AAGhC,MAAM,iBAAiB,GAAG,SAAS,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNL;AAG9B,MAAM,uBAAuB,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,CAAC;AACtG,MAAM,eAAe,GAAW,CAAC,KAAK,EAAS,KAAK,EAAQ,KAAK,EAAQ,KAAK,EAAQ,KAAK,CAAC;AAG5F,SAAS,YAAY,CAAC,KAAK,EAAE;EAClC,IAAI,KAAK,IAAI,OAAO,KAAK,IAAI,QAAQ,EAAE;IACrC,IAAI,KAAK,CAAC,GAAG,EAAE;MACb,OAAO,KAAK,CAAC,GAAG;IAClB;IACA,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE;MAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,GAAI,QAAQ,GAAG,KAAK,CAAC,IAAK;MACnF,OAAO,OAAO,GAAG,IAAI,GAAG,UAAU,GAAG,KAAK,CAAC,IAAI;IACjD;EACF;EACA,OAAO,IAAI;AACb;AAKO,SAAS,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE;EAE5E,KAAK,GAAG,KAAK,GAAG,CAAC;EACjB,MAAM,GAAG,MAAM,GAAG,CAAC;EACnB,QAAQ,GAAG,QAAQ,GAAG,CAAC;EACvB,SAAS,GAAG,SAAS,GAAG,CAAC;EAEzB,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE;IAChE,OAAO,IAAI;EACb;EAEA,IAAI,WAAW,EAAE;IACf,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC;EACtD;EAEA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,EACjC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,MAChC,CAAC;EAED,MAAM,IAAI,GAAG;IACX,QAAQ,EAAG,KAAK,GAAG,KAAK,GAAI,CAAC;IAC7B,SAAS,EAAG,MAAM,GAAG,KAAK,GAAI;EAChC,CAAC;EAED,IAAI,WAAW,EAAE;IAEf,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;IACxE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;IACxD,IAAI,CAAC,OAAO,GAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAI,CAAC;IAChD,IAAI,CAAC,OAAO,GAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAI,CAAC;EACnD,CAAC,MAAM;IACL,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC;IAC/B,IAAI,CAAC,QAAQ,GAAG,KAAK;IACrB,IAAI,CAAC,SAAS,GAAG,MAAM;EACzB;EACA,OAAO,IAAI;AACb;AAGO,SAAS,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE;EAC3C,MAAM,GAAG,GAAG,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC;EACjD,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE;IAErB,OAAO,KAAK;EACd;EACA,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC;EAEhC,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;EACjC,IAAI,EAAE,IAAI,CAAC,EAAE;IACX,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;EAChC;EACA,OAAO,KAAK,GAAG,GAAG,GAAG,GAAG;AAC1B;AAIO,SAAS,WAAW,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE;EACjF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;IACtC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC;IACvB,GAAG,CAAC,WAAW,GAAG,WAAW;IAC7B,GAAG,CAAC,OAAO,GAAG,UAAS,GAAG,EAAE;MAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAChD,CAAC;IACD,GAAG,CAAC,MAAM,GAAG,kBAAiB;MAE5B,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;MAG5B,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC;MACjF,IAAI,CAAC,GAAG,EAAE;QACR,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAClC;MACF;MACA,IAAI,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;MAC7C,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,QAAQ;MAC3B,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,SAAS;MAC7B,IAAI,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;MACjC,GAAG,CAAC,qBAAqB,GAAG,IAAI;MAChC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EACtE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC;MAEpC,MAAM,IAAI,GAAG,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,GAAG,YAAY;MAE/F,IAAI,IAAI,GAAG,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;MACrE,IAAI,CAAC,IAAI,EAAE;QACT,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC7C;MACF;MAGA,OAAO,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE;QAC3C,GAAG,CAAC,QAAQ,GAAI,GAAG,CAAC,QAAQ,GAAG,aAAa,GAAI,CAAC;QACjD,GAAG,CAAC,SAAS,GAAI,GAAG,CAAC,SAAS,GAAG,aAAa,GAAI,CAAC;QACnD,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,QAAQ;QAC3B,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,SAAS;QAC7B,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;QAC7B,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QAChD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EACtE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC;QACpC,IAAI,GAAG,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;MACnE;MAEA,MAAM,GAAG,IAAI;MACb,OAAO,CAAC;QAAC,IAAI,EAAE,IAAI;QAAE,IAAI,EAAE,IAAI;QAAE,KAAK,EAAE,GAAG,CAAC,QAAQ;QAAE,MAAM,EAAE,GAAG,CAAC,SAAS;QAAE,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI;MAAC,CAAC,CAAC;IAC7H,CAAC;IACD,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC;EAC3C,CAAC,CAAC;AACJ;AAKO,SAAS,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;EACvE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;IACtC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC;IACvB,GAAG,CAAC,WAAW,GAAG,WAAW;IAC7B,GAAG,CAAC,OAAO,GAAG,CAAC,IAAI;MACjB,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAChD,CAAC;IACD,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI;MAEhB,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;MAE5B,IAAI,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;MAC7C,MAAM,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK;MAC5B,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,KAAK;MAC9B,IAAI,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;MACjC,GAAG,CAAC,qBAAqB,GAAG,IAAI;MAChC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;MAE/E,IAAI,GAAG,uBAAuB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,YAAY;MAEnE,MAAM,CAAC,MAAM,CAAE,IAAI,IAAK;QAEtB,MAAM,GAAG,IAAI;QACb,IAAI,IAAI,EAAE;UACR,OAAO,CAAC;YAAC,IAAI,EAAE,IAAI;YAAE,IAAI,EAAE,IAAI;YAAE,KAAK,EAAE,KAAK;YAAE,MAAM,EAAE;UAAM,CAAC,CAAC;QACjE,CAAC,MAAM;UACL,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC/C;MACF,CAAC,EAAE,IAAI,CAAC;IACV,CAAC;IACD,GAAG,CAAC,GAAG,GAAG,MAAM;EAClB,CAAC,CAAC;AACJ;AAGO,SAAS,YAAY,CAAC,IAAI,EAAE;EACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;IACtC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,GAAG,CAAC,IAAI;MACpB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI;MACnB,OAAO,CAAC;QAAC,IAAI,EAAE,IAAI,CAAC,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;MAAI,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;EAC5B,CAAC,CAAC;AACJ;AAGO,SAAS,YAAY,CAAC,IAAI,EAAE;EACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;IACtC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,GAAG,CAAC,IAAI;MACpB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI;MACnB,OAAO,CAAC;QAAC,IAAI,EAAE,IAAI,CAAC,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;MAAC,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;EAC5B,CAAC,CAAC;AACJ;AAGO,SAAS,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,OAAO,EAAE;EAC9E,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,CAAC,aAAa,IAAI,CAAC,CAAC,EAAE,KAAK;EACpF,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;IAC3B,OAAO,KAAK;EACd;EAEA,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE;IACnB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;IACrB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;MACxB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;MAC7B,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,CAAC,KAAK,CAAC,iDAAiD,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;QACtF,OAAO,CAAC,iDAAiD,CAAC;QAC1D;MACF;MACA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE;QACnD,cAAc,CAAC,IAAI,CAAC;MACtB,CAAC,MAAM;QACL,mBAAmB,CAAC,IAAI,CAAC;MAC3B;MAEA,OAAO,IAAI;IACb;EACF;EAEA,OAAO,KAAK;AACd;AAGO,SAAS,WAAW,CAAC,MAAM,EAAE;EAClC,MAAM,IAAI,GAAG,oCAAoC,CAAC,IAAI,CAAC,MAAM,CAAC;EAC9D,OAAQ,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,GAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI;AACnD;AAIO,SAAS,gBAAgB,CAAC,CAAC,EAAE;EAClC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AACpC;AAIO,SAAS,gBAAgB,CAAC,CAAC,EAAE;EAClC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;AAC9B;AAIO,SAAS,cAAc,CAAC,GAAG,EAAE;EAClC,IAAI,GAAG,EAAE;IACP,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;IAC/C,IAAI;MACF,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,OAAM,GAAG,EAAE;MACX,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC;MACxD,GAAG,GAAG,IAAI;IACZ;EACF;EACA,OAAO,GAAG;AACZ;AAGO,SAAS,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE;EACtC,IAAI,CAAC,GAAG,EAAE;IACR,OAAO,IAAI;EACb;EAEA,IAAI;IAEF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACrB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM;IACzB,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;MAC/B,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5B;IAEA,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE;MAAE,IAAI,EAAE;IAAK,CAAC,CAAC;EACxC,CAAC,CAAC,OAAM,GAAG,EAAE;IACX,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC;EAC1D;EAEA,OAAO,IAAI;AACb;AAEO,SAAS,gBAAgB,CAAC,GAAG,EAAE;EACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;IACvB,OAAO,IAAI;EACb;EACA,IAAI;IACF,IAAI,GAAG,GAAG,EAAE;IACZ,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;EACzB,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC;EACf,OAAO,IAAI;AACb;AAEO,SAAS,gBAAgB,CAAC,GAAG,EAAE;EACpC,MAAM,GAAG,GAAG,EAAE;EACd,IAAI;IACF,MAAM,GAAG,GAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAC7B,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI;MACpB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC;IACF,OAAO,GAAG;EACZ,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC;EACf,OAAO,IAAI;AACb;AAEO,SAAS,WAAW,CAAC,UAAU,EAAE;EACtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;IACtC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,GAAG,CAAC,IAAI;MACpB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI;MACnB,MAAM,IAAI,GAAG,+CAAO,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;MAC/C,IAAI,CAAC,IAAI,EAAE;QACT,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC1C;MACF;MACA,OAAO,CAAC,IAAI,CAAC;IACf,CAAC;IACD,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC;EAC/B,CAAC,CAAC;AACJ,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrU0B;AACkB;AAEC;AAEQ;AACA;AACD;AACE;AACJ;AACK;AACI;AAGH;AACkC;AACV;AACA;AAEhF,MAAM,QAAQ,GAAG,0DAAc,CAAC;EAC9B,WAAW,EAAE;IACX,EAAE,EAAE,aAAa;IACjB,cAAc,EAAE,QAAQ;IACxB,WAAW,EAAE;EACf,CAAC;EACD,iBAAiB,EAAE;IACjB,EAAE,EAAE,mBAAmB;IACvB,cAAc,EAAE,YAAY;IAC5B,WAAW,EAAE;EACf,CAAC;EACD,YAAY,EAAE;IACZ,EAAE,EAAE,cAAc;IAClB,cAAc,EAAE,SAAS;IACzB,WAAW,EAAE;EACf,CAAC;EACD,YAAY,EAAE;IACZ,EAAE,EAAE,cAAc;IAClB,cAAc,EAAE,iBAAiB;IACjC,WAAW,EAAE;EACf,CAAC;EACD,cAAc,EAAE;IACd,EAAE,EAAE,gBAAgB;IACpB,cAAc,EAAE,aAAa;IAC7B,WAAW,EAAE;EACf;AACF,CAAC,CAAC;AAOK,SAAS,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE;EAC7D,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;IACxB,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC;EAC5D;EAEA,IAAI,CAAC,KAAK,EAAE;IAEV,OAAO,MAAM;EACf;EAEA,IAAI,EAAE,GAAG,8CAAM,CAAC,OAAO,CAAC,KAAK,CAAC;EAC9B,IAAI,IAAI,GAAG,8CAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;EAC9C,IAAI,CAAC,GAAG,GAAG,GAAG;EACd,QAAQ,KAAK;IACX,KAAK,IAAI;MAEP,IAAI,IAAI,CAAC,GAAG,EAAE;QACZ,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,8DAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAI,SAAS;QACnE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;QAC3B,IAAI,CAAC,OAAO,GAAG,MAAM;QAKrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa;MAClC;MACA,EAAE,GAAG,iEAAW;MAEhB,MAAM,GAAG,IAAI;MACb;IACF,KAAK,IAAI;MACP,MAAM,GAAG,IAAI;MACb;IACF,KAAK,IAAI;MAEP;IACF,KAAK,IAAI;MAEP,IAAI,CAAC,SAAS,GAAG,WAAW;MAC5B;IACF,KAAK,IAAI;MACP,EAAE,GAAG,IAAI;MACT,MAAM,GAAG,IAAI;MACb;IACF,KAAK,IAAI;MAEP,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC;MAE/C,MAAM,GAAG,IAAI;MACb;IACF,KAAK,IAAI;MAEP,IAAI,CAAC,OAAO,GAAI,CAAC,IAAK,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,aAAa,CAAC;MAC1D,IAAI,KAAK,GAAG,qDAAc,CAAC,GAAG,CAAC,MAAM,EAAG,KAAK,IAAK;QAChD,OAAO,OAAO,KAAK,IAAI,QAAQ,GAAG,KAAK,GAAG,SAAS;MACrD,CAAC,CAAC;MACF,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;QAC/B,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;MACrB;MAEA,IAAI,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;MACnC;IACF,KAAK,IAAI;MACP,IAAI,IAAI,EAAE;QAER,IAAI,CAAC,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,IAAI,QAAQ,GAAG,uDAAW,CAAC,IAAI,CAAC,IAAI,EAAE,8DAAqB,CAAC,GAAG,EAAE;MAC/F;MACA;IACF,KAAK,IAAI;MAEP,IAAI,CAAC,SAAS,GAAG,SAAS;MAC1B,IAAI,IAAI,EAAE;QACR,IAAI,CAAC,SAAS,IAAI,GAAG,GAAG,8DAAc,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC;MAC/D;MACA;IACF,KAAK,IAAI;MAEP,IAAI,CAAC,SAAS,GAAG,UAAU;MAC3B;IACF,KAAK,IAAI;MAEP;IACF,KAAK,IAAI;MAEP,IAAI,CAAC,SAAS,GAAG,aAAa;MAC9B,IAAI,CAAC,OAAO,GAAI,CAAC,IAAK,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC;MACpD;IACF,KAAK,IAAI;MAEP,EAAE,GAAG,kEAAW;MAChB,IAAI,CAAC,OAAO,GAAG,IAAI;MACnB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;MACrC,IAAI,CAAC,WAAW,GAAI,CAAC,IAAK,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,cAAc,CAAC;MAC/D,IAAI,CAAC,WAAW,GAAI,CAAC,IAAK,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,cAAc,CAAC;MAC/D,MAAM,GAAG,IAAI;MACb;IACF,KAAK,IAAI;MACP,EAAE,GAAG,iEAAW;MAEhB,MAAM,GAAG,IAAI;MACb,IAAI,IAAI,EAAE;QACR,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK;QAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ;MAC/B;MACA;IACF,KAAK,IAAI;MAEP,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC;MAE/C,MAAM,GAAG,IAAI;MACb;IACF;MACE,IAAI,CAAC,EAAE,EAAE;QAEP,EAAE,GAAG,uDAAc;QACnB,IAAI,GAAG;UAAC,GAAG,EAAE;QAAG,CAAC;QAEjB,IAAI,IAAI,GAAG,MAAM;QACjB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE;UACrD,IAAI,GAAG,CAAC,0DAAmB,CAAC,MAAM,EAChC;YAAC,GAAG,EAAE,IAAI;YAAE,SAAS,EAAE;UAAM,CAAC,EAC9B,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAC5C,CAAC,CAAC;QACJ;QACA,MAAM,GAAG,CAAC,0DAAmB,CAAC,GAAG,EAC/B;UAAC,GAAG,EAAE,IAAI;UAAE,SAAS,EAAE;QAAqB,CAAC,EAC7C,WACF,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;MACtB;MACA;EACJ;EACA,IAAI,CAAC,EAAE,EAAE;IACP,OAAO,MAAM;EACf;EACA,OAAO,0DAAmB,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC;AAC9C;AAGA,SAAS,eAAe,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;EACvC,IAAI,CAAC,IAAI,EAAE;IACT,IAAI,CAAC,GAAG,GAAG,sBAAsB;IACjC,IAAI,CAAC,KAAK,GAAG;MACX,KAAK,EAAE,4DAAmB,GAAG,IAAI;MACjC,MAAM,EAAE,4DAAmB,GAAG;IAChC,CAAC;IACD,OAAO,EAAE;EACX;EAEA,IAAI,CAAC,SAAS,GAAG,cAAc;EAC/B,MAAM,GAAG,GAAG,+DAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAC9C,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,iDAAQ,GAAG,GAAG,EAAE,iDAAQ,GAAG,IAAI,CAAC,GACrF,iDAAQ,GAAG,IAAI,EAAE,iDAAQ,GAAG,EAAE,EAAE,KAAK,CAAC,IACtC;IAAC,QAAQ,EAAE,0DAAiB;IAAE,SAAS,EAAE,0DAAiB;EAAA,CAAC;EAC/D,IAAI,CAAC,KAAK,GAAG;IACX,KAAK,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI;IAC1B,MAAM,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI;IAE5B,QAAQ,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI;IAC7B,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG;EAC7B,CAAC;EACD,IAAI,CAAC,8CAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;IAC9B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,8DAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACnE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI;IACpB,IAAI,IAAI,CAAC,GAAG,EAAE;MACZ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,4DAAmB,EAAE;QAErE,IAAI,CAAC,OAAO,GAAI,CAAC,IAAK,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC;QACpD,IAAI,CAAC,SAAS,IAAI,kBAAkB;MACtC;MACA,IAAI,CAAC,OAAO,GAAG,MAAM;IACvB,CAAC,MAAM;MACL,IAAI,CAAC,GAAG,GAAG,IAAI;IACjB;EACF,CAAC,MAAM;IAEL,EAAE,GAAG,oEAAc;EACrB;EAEA,OAAO,EAAE;AACX;AAGA,SAAS,eAAe,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;EACvC,IAAI,CAAC,IAAI,EAAE;IACT,IAAI,CAAC,GAAG,GAAG,sBAAsB;IACjC,IAAI,CAAC,KAAK,GAAG;MACX,KAAK,EAAE,4DAAmB,GAAG,IAAI;MACjC,MAAM,EAAE,4DAAmB,GAAG;IAChC,CAAC;IACD,OAAO,EAAE;EACX;EACA,IAAI,CAAC,SAAS,GAAG,cAAc;EAC/B,MAAM,GAAG,GAAG,+DAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAC9C,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,iDAAQ,GAAG,GAAG,EAAE,iDAAQ,GAAG,IAAI,CAAC,GACrF,iDAAQ,GAAG,IAAI,EAAE,iDAAQ,GAAG,EAAE,EAAE,KAAK,CAAC,IACtC;IAAC,QAAQ,EAAE,4DAAmB;IAAE,SAAS,EAAE,4DAAmB;EAAA,CAAC;EACnE,IAAI,CAAC,KAAK,GAAG;IACX,KAAK,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI;IAC1B,MAAM,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI;IAE5B,QAAQ,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI;IAC7B,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG;EAC7B,CAAC;EACD,IAAI,CAAC,8CAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;IAC9B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,8DAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACnE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI;IACpB,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE;MACxB,IAAI,CAAC,OAAO,GAAI,CAAC,IAAK,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC;MACpD,IAAI,CAAC,OAAO,GAAG,MAAM;IACvB;IACA,EAAE,GAAG,iEAAW;EAClB,CAAC,MAAM;IAEL,EAAE,GAAG,oEAAc;EACrB;EAEA,OAAO,EAAE;AACX;AAMO,SAAS,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;EACzD,IAAI,CAAC,KAAK,EAAE;IAEV,OAAO,MAAM;EACf;EAEA,IAAI,EAAE,GAAG,8CAAM,CAAC,OAAO,CAAC,KAAK,CAAC;EAC9B,MAAM,IAAI,GAAG;IAAE,GAAG,EAAE;EAAI,CAAC;EACzB,QAAQ,KAAK;IACX,KAAK,IAAI;MAEP,EAAE,GAAG,uDAAc;MACnB,MAAM,GAAG,CAAC,0DAAmB,CAAC,GAAG,EAAE;QAAC,GAAG,EAAE,IAAI;QAAE,SAAS,EAAE;MAAgB,CAAC,EAAE,KAAK,CAAC,EACjF,GAAG,EAAE,6DAAa,CAAC,IAAI,CAAC,QAAQ,GAAC,IAAI,CAAC,CAAC;MACzC;IACF,KAAK,IAAI;MAEP,EAAE,GAAG,uDAAc;MACnB,MAAM,GAAG,CAAC,GAAG,CAAC;MACd;IACF,KAAK,IAAI;MAEP,IAAI,CAAC,SAAS,GAAG,mBAAmB;MACpC;IACF,KAAK,IAAI;IACT,KAAK,IAAI;MAEP,EAAE,GAAG,MAAM;MACX;IACF,KAAK,IAAI;MAEP,EAAE,GAAG,uDAAc;MACnB,MAAM,GAAG,CAAC,0DAAmB,CAAC,GAAG,EAAE;QAAC,GAAG,EAAE,IAAI;QAAE,SAAS,EAAE;MAAgB,CAAC,EAAE,OAAO,CAAC,EACnF,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;MACjD;IACF,KAAK,IAAI;MACP,EAAE,GAAG,MAAM;MACX,IAAI,CAAC,SAAS,GAAG,kBAAkB;MACnC;IACF,KAAK,IAAI;MACP,EAAE,GAAG,uDAAc;MACnB,MAAM,GAAG,CAAC,0DAAmB,CAAC,GAAG,EAAE;QAAC,GAAG,EAAE,IAAI;QAAE,SAAS,EAAE;MAAgB,CAAC,EAAE,WAAW,CAAC,EACvF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC;MACrE;IACF,KAAK,IAAI;MACP,EAAE,GAAG,uDAAc;MACnB;IACF,KAAK,IAAI;MACP,IAAI,IAAI,EAAE;QACR,IAAI,8CAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;UAExC,OAAO,IAAI;QACb;QAEA,OAAO,IAAI,CAAC,GAAG;QACf,OAAO,IAAI,CAAC,GAAG;MACjB;MACA,EAAE,GAAG,uDAAc;MACnB,MAAM,GAAG,CAAC,0DAAmB,CAAC,GAAG,EAAE;QAAC,GAAG,EAAE,IAAI;QAAE,SAAS,EAAE;MAAgB,CAAC,EAAE,YAAY,CAAC,EACxF,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;MACtD;IACF,KAAK,IAAI;MACP,EAAE,GAAG,gEAAU;MACf,IAAI,IAAI,EAAE;QACR,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK;QAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ;MAC/B;MACA,MAAM,GAAG,IAAI;MACb;IACF,KAAK,IAAI;IACT,KAAK,IAAI;MACP,EAAE,GAAG,IAAI;MACT,MAAM,GAAG,IAAI;MACb;IACF,KAAK,IAAI;MAEP,EAAE,GAAG,uDAAc;MACnB,MAAM,GAAG,CAAC,0DAAmB,CAAC,GAAG,EAAE;QAAC,GAAG,EAAE,IAAI;QAAE,SAAS,EAAE;MAAgB,CAAC,EAAE,cAAc,CAAC,EAAE,GAAG,EAC/F,+CAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;MACrE;IACF,KAAK,IAAI;MAEP,EAAE,GAAG,uDAAc;MACnB,MAAM,GAAG,CAAC,0DAAmB,CAAC,GAAG,EAAE;QAAC,GAAG,EAAE,IAAI;QAAE,SAAS,EAAE;MAAgB,CAAC,EAAE,qBAAqB,CAAC,EACjG,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;MACjD;IACF;MACE,IAAI,CAAC,EAAE,EAAE;QAEP,EAAE,GAAG,uDAAc;QACnB,MAAM,GAAG,CAAC,0DAAmB,CAAC,GAAG,EAAE;UAAC,GAAG,EAAE,IAAI;UAAE,SAAS,EAAE;QAAqB,CAAC,EAAE,WAAW,CAAC,EAC5F,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;MACrD;MACA;EACJ;EACA,IAAI,CAAC,EAAE,EAAE;IACP,OAAO,MAAM;EACf;EACA,OAAO,0DAAmB,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC;AAC9C;AAAC;AAGD,SAAS,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE;EACnC,IAAI,CAAC,KAAK,GAAG;IACX,KAAK,EAAE,4DAAmB,GAAG,IAAI;IACjC,MAAM,EAAE,4DAAmB,GAAG,IAAI;IAClC,QAAQ,EAAE,4DAAmB,GAAG,IAAI;IACpC,SAAS,EAAE,4DAAmB,GAAG;EACnC,CAAC;EACD,IAAI,CAAC,SAAS,GAAG,cAAc;EAC/B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC;EACpD,IAAI,CAAC,IAAI,EAAE;IACT,IAAI,CAAC,GAAG,GAAG,sBAAsB;EACnC,CAAC,MAAM;IACL,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,sBAAsB;EAC/C;EACA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG;EACrB,OAAO,IAAI;AACb;AAGA,SAAS,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE;EACnC,MAAM,GAAG,GAAG,+DAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,8DAAqB,EAAE,4DAAmB,CAAC;EAC7F,IAAI,CAAC,KAAK,GAAG;IACX,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI;IACvB,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI;IACzB,QAAQ,EAAE,8DAAqB,GAAG,IAAI;IACtC,SAAS,EAAE,4DAAmB,GAAG;EACnC,CAAC;EACD,IAAI,CAAC,SAAS,GAAG,cAAc;EAC/B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC;EACpD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG;EACrB,IAAI,CAAC,IAAI,EAAE;IACT,IAAI,CAAC,GAAG,GAAG,sBAAsB;EACnC,CAAC,MAAM;IACL,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,sBAAsB;EAC/C;EACA,OAAO,IAAI;AACb;AAQA,SAAS,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;EAChD,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;IAClD,IAAI,EAAE,GAAG,8CAAM,CAAC,OAAO,CAAC,KAAK,CAAC;IAC9B,IAAI,IAAI,GAAG,8CAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,GAAG,GAAG,GAAG;IACd,QAAO,KAAK;MACV,KAAK,IAAI;QACP,MAAM,GAAG,IAAI;QACb;MACF,KAAK,IAAI;QACP,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QAC7C,MAAM,GAAG,CAAC,0DAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;QAChE,EAAE,GAAG,uDAAc;QAEnB,IAAI,GAAG;UAAC,GAAG,EAAE;QAAG,CAAC;QACjB;MACF,KAAK,IAAI;QACP,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QAC7C,MAAM,GAAG,CAAC,0DAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;QAChE,EAAE,GAAG,uDAAc;QAEnB,IAAI,GAAG;UAAC,GAAG,EAAE;QAAG,CAAC;QACjB;MACF,KAAK,IAAI;QACP,EAAE,GAAG,MAAM;QACX,IAAI,CAAC,SAAS,GAAG,SAAS;QAC1B,IAAI,IAAI,EAAE;UACR,IAAI,CAAC,SAAS,IAAI,GAAG,GAAG,8DAAc,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC;QAC/D;QACA;MACF,KAAK,IAAI;QACP,IAAI,KAAK;QACT,IAAI,IAAI,EAAE;UACR,IAAI,8CAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAExC,OAAO,IAAI;UACb;UACA,KAAK,GAAG,IAAI,CAAC,IAAI;UAEjB,OAAO,IAAI,CAAC,GAAG;UACf,OAAO,IAAI,CAAC,GAAG;QACjB;QACA,EAAE,GAAG,uDAAc;QACnB,MAAM,GAAG,CAAC,0DAAmB,CAAC,GAAG,EAAE;UAAC,GAAG,EAAE,IAAI;UAAE,SAAS,EAAE;QAAgB,CAAC,EAAE,YAAY,CAAC,EACxF,+DAAe,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QAC/E;IACJ;IACA,OAAO,0DAAmB,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC;EAC9C;EACA,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC;AAC9D;AAGA,SAAS,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE;EACxC,IAAI,OAAO;EACX,IAAI,IAAI,EAAE,GAAG,EAAE,IAAI;EACnB,IAAI,OAAO,EAAE;IACX,IAAI,GAAG,IAAI,CAAC,OAAO;IACnB,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,YAAY;IACnC,GAAG,GAAG,IAAI,CAAC,MAAM;EACnB,CAAC,MAAM;IACL,IAAI,GAAG,IAAI,CAAC,GAAG;IACf,IAAI,GAAG,IAAI,CAAC,IAAI;IAChB,GAAG,GAAG,IAAI,CAAC,GAAG;EAChB;EAEA,IAAI,IAAI,EAAE;IACR,MAAM,IAAI,GAAG,+DAAY,CAAC,IAAI,EAAE,IAAI,CAAC;IACrC,IAAI,CAAC,IAAI,EAAE;MACT,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC;IAClC;IACA,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;EACjC,CAAC,MAAM,IAAI,GAAG,EAAE;IACd,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,8DAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CACjE,IAAI,CAAC,GAAG,IAAI;MACX,IAAI,GAAG,CAAC,EAAE,EAAE;QACV,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;MACnB,CAAC,MAAM;QACL,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;MAC9E;IACF,CAAC,CAAC;EACN,CAAC,MAAM;IACL,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC;EACvC;EAGA,OAAO,OAAO,CACX,IAAI,CAAC,IAAI,IAAI;IAGZ,OAAO,8DAAW,CAAC,IAAI,EAAE,OAAO,GAAG,8DAAqB,GAAG,4DAAmB,EAAE,4DAAmB,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;EACpH,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI;IAChB,IAAI,OAAO,EAAE;MACX,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI;IAC5B,CAAC,MAAM;MACL,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;IACzB;IACA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI;IAC5B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;IACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;IAC3B,OAAO,IAAI,CAAC,GAAG;IACf,OAAO,IAAI,CAAC,MAAM;IAGlB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;IAC3C,OAAO,+DAAY,CAAC,MAAM,CAAC,IAAI,CAAC;EAClC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;IACb,IAAI,OAAO,EAAE;MACX,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI;IACzB,CAAC,MAAM;MACL,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI;IACrB;IACA,OAAO,IAAI;EACb,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;IACd,OAAO,IAAI,CAAC,GAAG;IACf,OAAO,IAAI,CAAC,OAAO;IACnB,OAAO,IAAI,CAAC,GAAG;IACf,IAAI,CAAC,KAAK,GAAG,4DAAmB;IAChC,IAAI,CAAC,MAAM,GAAG,4DAAmB;IAEjC,MAAM,GAAG;EACX,CAAC,CAAC;AACN;AAGO,SAAS,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE;EAC9D,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;IAClC,MAAM,OAAO,GAAG,KAAK,IAAI,IAAI;IAC7B,MAAM,IAAI,GAAG,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE;MAAC,GAAG,EAAE;IAAG,CAAC,EAAE,IAAI,CAAC,GACjE,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE;MAAC,GAAG,EAAE;IAAG,CAAC,EAAE,IAAI,CAAC;IAE9C,IAAI,aAAa;IACjB,IAAI;MACF,aAAa,GAAG,6DAAiB,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC;IACtF,CAAC,CAAC,OAAO,KAAK,EAAE;MACd,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,KAAK,CAAC,OAAO,CAAC;MACrD,aAAa,GAAG,6DAAiB,CAAC,KAAK,CAAC;IAC1C;IACA,IAAI,CAAC,QAAQ,GAAG,aAAa;IAC7B,MAAM,GAAG,CAAC,0DAAmB,CAAC,+DAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;IACpE,OAAO,0DAAmB,CAAC,uDAAc,EAAE;MAAC,GAAG,EAAE;IAAG,CAAC,EAAE,MAAM,CAAC;EAChE,CAAC,MAAM,IAAI,KAAK,IAAI,IAAI,EAAE;IACxB,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;MAExB,OAAO,0DAAmB,CAAC,MAAM,EAAE;QAAC,GAAG,EAAE;MAAG,CAAC,EAC3C,CAAC,0DAAmB,CAAC,GAAG,EAAE;QAAC,GAAG,EAAE,IAAI;QAAE,SAAS,EAAE;MAAgB,CAAC,EAAE,cAAc,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9F;IAEA,MAAM,IAAI,GAAG,8CAAM,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG,GAAG,GAAG;IACd,IAAI,CAAC,SAAS,GAAG,aAAa;IAC9B,OAAO,0DAAmB,CAAC,8CAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC;EAChE;EACA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC;AAC5D,C;;;;;;;;;;;;;;;;;;AClkByD;AAGlD,SAAS,mBAAmB,GAAG;EACpC,IAAI,IAAI,GAAG,oDAAY;EACvB,IAAI,OAAO,MAAM,CAAC,QAAQ,IAAI,QAAQ,EAAE;IACtC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,WAAW,EAAE;MAClF,IAAI,GAAG,mDAAW,CAAC,KAAK;IAC1B,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE;MACnC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC;IAC5F;EACF;EACA,OAAO,IAAI;AACb;AAGO,SAAS,kBAAkB,GAAG;EACnC,IAAI,OAAO,MAAM,CAAC,QAAQ,IAAI,QAAQ,EAAE;IACtC,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,QAAQ;EAC7C;EACA,OAAO,KAAK;AACd;AAEO,SAAS,WAAW,GAAG;EAC5B,IAAI,OAAO,MAAM,CAAC,QAAQ,IAAI,QAAQ,EAAE;IACtC,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,WAAW;EAChD;EACA,OAAO,KAAK;AACd,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1BuC;AACS;AACE;AAElD,MAAM,gBAAgB,GAAG,QAAQ;AACjC,MAAM,iBAAiB,GAAG,UAAU;AAE7B,MAAM,UAAU,SAAS,KAAK,CAAC;EACpC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAC5C,KAAK,CAAC,OAAO,CAAC;IACd,IAAI,CAAC,MAAM,GAAG,MAAM;IACpB,IAAI,CAAC,MAAM,GAAG,MAAM;IACpB,IAAI,CAAC,OAAO,GAAG,OAAO;EACxB;AACF;AAMA,MAAM,eAAe,GAAG;EAKtB,gBAAgB,EAAE,gBAAgB;EAClC,kBAAkB,EAAE,gBAAgB;EACpC,kBAAkB,EAAE,YAAY;EAChC,eAAe,EAAE,iBAAiB;EAClC,WAAW,EAAE,SAAS;EACtB,aAAa,EAAE,aAAa;EAC5B,gBAAgB,EAAE,QAAQ;EAC1B,YAAY,EAAE,cAAc;EAC5B,iBAAiB,EAAE,YAAY;EAC/B,oBAAoB,EAAE,gBAAgB;EACtC,kBAAkB,EAAE,YAAY;EAGhC,iBAAiB,EAAE,WAAW;EAC9B,SAAS,EAAE,YAAY;EACvB,gBAAgB,EAAE,eAAe;EACjC,iBAAiB,EAAE,cAAc;EACjC,aAAa,EAAE,MAAM;EACrB,oBAAoB,EAAE,eAAe;EACrC,kBAAkB,EAAE,iBAAiB;EACrC,uBAAuB,EAAE,kBAAkB;EAC3C,cAAc,EAAE,aAAa;EAC7B,sBAAsB,EAAE,UAAU;EAClC,iBAAiB,EAAE,cAAc;EACjC,mBAAmB,EAAE,cAAc;EACnC,yBAAyB,EAAE,WAAW;EACtC,yBAAyB,EAAE,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC,mBAAmB,GACxE,YAAY,OAAO,CAAC,mBAAmB,OAAO,GAC9C,cAAc;EAClB,oBAAoB,EAAE,UAAU;EAChC,oBAAoB,EAAE,SAAS;EAC/B,oBAAoB,EAAE,QAAQ;EAC9B,0BAA0B,EAAE,YAAY;EACxC,mBAAmB,EAAE,eAAe;EACpC,aAAa,EAAE,SAAS;EACxB,mBAAmB,EAAE,WAAW;EAChC,cAAc,EAAE,UAAU;EAC1B,wBAAwB,EAAE,YAAY;EACtC,mBAAmB,EAAE,YAAY;EACjC,WAAW,EAAE,YAAY;EACzB,2BAA2B,EAAE,WAAW;EACxC,0BAA0B,EAAE,WAAW;EACvC,2BAA2B,EAAE,WAAW;EACxC,cAAc,EAAE,UAAU;EAC1B,cAAc,EAAE,WAAW;EAC3B,gBAAgB,EAAE,QAAQ;EAC1B,sBAAsB,EAAE,UAAU;EAClC,iBAAiB,EAAE,WAAW;EAC9B,qBAAqB,EAAE,eAAe;EACtC,0BAA0B,EAAE,WAAW;EACvC,mBAAmB,EAAE,aAAa;EAIlC,YAAY,EAAE,SAAS;EACvB,iBAAiB,EAAE,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC,mBAAmB,GAChE,cAAc,OAAO,CAAC,mBAAmB,OAAO,GAChD;AACN,CAAC;AAED,SAAS,SAAS,GAAG;EACnB,OAAQ,OAAO,MAAM,IAAI,WAAW,IAAI,MAAM,CAAC,UAAU,GAAI,MAAM,CAAC,UAAU,CAAC,CAAC,GAC9E,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAChF;AAIO,SAAS,gBAAgB,GAAG;EACjC,OAAO,yDAAgB,CAAC,SAAS,CAAC,WAAW,CAAC;AAChD;AAEO,SAAS,iBAAiB,GAAG;EAClC,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC;EACjC,OAAQ,MAAM,IAAI,MAAM,CAAC,IAAI,IAAK,SAAS;AAC7C;AAEA,SAAS,OAAO,GAAG;EACjB,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC;EACjC,OAAO,CAAE,MAAM,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,IAAK,gBAAgB,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AACtG;AAEA,SAAS,QAAQ,GAAG;EAClB,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC;EACjC,OAAO,CAAE,MAAM,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,IAAK,iBAAiB,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AACxG;AAKA,SAAS,SAAS,GAAG;EACnB,OAAO,cAAc,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE;AACzD;AAEA,SAAS,iBAAiB,CAAC,OAAO,EAAE;EAClC,OAAQ,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,GAAI,OAAO,CAAC,IAAI,GAAG,OAAO;AAC/F;AAGO,eAAe,SAAS,CAAC,IAAI,EAAE;EAAC,MAAM,GAAG,KAAK;EAAE,IAAI;EAAE,OAAO;EAAE,IAAI,GAAG,IAAI;EAAE;AAAkB,CAAC,GAAG,CAAC,CAAC,EAAE;EAC3G,MAAM,YAAY,GAAG;IACnB,cAAc,EAAE,kBAAkB;IAClC,oBAAoB,EAAE,+CAAO;IAC7B,aAAa,EAAE,GAAG;IAClB,eAAe,EAAE,kBAAkB,IAAI,iBAAiB,CAAC,CAAC;IAC1D,cAAc,EAAE,SAAS,CAAC,CAAC;IAC3B,GAAG;EACL,CAAC;EACD,IAAI,IAAI,EAAE;IACR,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC;IACzB,IAAI,KAAK,EAAE;MACT,YAAY,CAAC,aAAa,GAAG,SAAS,GAAG,KAAK;IAChD;EACF;EACA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE;IAC7C,MAAM;IACN,OAAO,EAAE,YAAY;IACrB,IAAI,EAAE,IAAI,KAAK,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG;EACpD,CAAC,CAAC;EACF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;EAClC,IAAI,OAAO,GAAG,CAAC,CAAC;EAChB,IAAI,IAAI,EAAE;IACR,IAAI;MACF,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IAC5B,CAAC,CAAC,OAAO,CAAC,EAAE;MACV,MAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,GAAG,eAAe,GAAI,QAAQ,CAAC,UAAU,IAAI,QAAS,EACpF,mBAAmB,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7D;EACF;EACA,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAK,OAAO,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,CAAE,EAAE;IAQnE,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC;IAC9D,MAAM,IAAI,UAAU,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,IAAI,MAAM,EAC9F,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC;EACrD;EACA,OAAO,iBAAiB,CAAC,OAAO,CAAC;AACnC;AAQO,SAAS,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE;EAC/C,MAAM,KAAK,GAAG,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC;EAC/C,OAAO,CAAC,OAAO,KAAK,KAAK,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,KAAK,IAAI;AACvE;AAEA,MAAM,IAAI,GAAG,OAAO;EAAC,iBAAiB,EAAE,SAAS,CAAC;AAAC,CAAC,CAAC;AAQ9C,eAAe,aAAa,CAAC,SAAS,EAAE,WAAW,GAAG,EAAE,EAAE;EAC/D,IAAI,MAAM,GAAG,WAAW;EACxB,IAAI,KAAK,GAAG,EAAE;EACd,SAAS;IACP,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC;IACpC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAE,IAAI,IAAI,IAAI,CAAC,KAAK,IAAK,EAAE,CAAC;IAChD,MAAM,UAAU,GAAI,IAAI,IAAI,IAAI,CAAC,WAAW,IAAK,EAAE;IACnD,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,MAAM,EAAE;MACxC;IACF;IACA,MAAM,GAAG,UAAU;EACrB;EACA,OAAO,KAAK;AACd;AAEO,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC;AACnD,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,EAAE;EAAC,MAAM,EAAE,MAAM;EAAE,IAAI;EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;EAAE,GAAG;AAAI,CAAC,CAAC;AAC3G,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,EAAE;EAAC,MAAM,EAAE,OAAO;EAAE,IAAI;EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;EAAE,GAAG;AAAI,CAAC,CAAC;AAC7G,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,EAAE;EAAC,MAAM,EAAE,KAAK;EAAE,IAAI;EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;EAAE,GAAG;AAAI,CAAC,CAAC;AACzG,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,EAAE;EAAC,MAAM,EAAE,QAAQ;EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;EAAE,GAAG;AAAI,CAAC,CAAC;AAE1G,SAAS,EAAE,CAAC,MAAM,EAAE;EAClB,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,CAAC;EACjC,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK;IAC/C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;MAC7C,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACf;EACF,CAAC,CAAC;EACF,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;EACxB,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE;AACzB;AAGO,eAAe,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE;EAChE,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,CAAC;EAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC;EAC/B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;EAEzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;IACtC,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC,CAAC;IAChC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,iBAAiB,CAAC;IAC/C,GAAG,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,+CAAO,CAAC;IACnD,GAAG,CAAC,gBAAgB,CAAC,aAAa,EAAE,GAAG,CAAC;IACxC,GAAG,CAAC,gBAAgB,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC1D,GAAG,CAAC,gBAAgB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;IACjD,IAAI,UAAU,EAAE;MACd,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;IACtF;IACA,GAAG,CAAC,MAAM,GAAG,MAAM;MACjB,IAAI,OAAO,GAAG,CAAC,CAAC;MAChB,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;MAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAsB;MAChF,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE;QAC/D,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;MACrC,CAAC,MAAM;QACL,MAAM,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;MAClH;IACF,CAAC;IACD,GAAG,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,UAAU,CAAC,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;IAC3E,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;EAChB,CAAC,CAAC;AACJ;AAiBA,MAAM,mBAAmB,GAAG;EAC1B,WAAW,EAAE,UAAU;EACvB,WAAW,EAAE,cAAc;EAC3B,mBAAmB,EAAE,WAAW;EAChC,MAAM,EAAE;AACV,CAAC;AACM,SAAS,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;EACxD,MAAM,SAAS,GAAG,MAAM,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;EACxE,IAAI,CAAC,SAAS,EAAE;IACd,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,aAAa,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;EAC5E;EACA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,CAAC;EAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;EACzB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;EACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;IACtC,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC,CAAC;IAChC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC;IACpC,GAAG,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,+CAAO,CAAC;IACnD,GAAG,CAAC,gBAAgB,CAAC,eAAe,EAAE,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC;IACjE,IAAI,UAAU,EAAE;MACd,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;IACtF;IACA,GAAG,CAAC,MAAM,GAAG,MAAM;MACjB,IAAI,OAAO,GAAG,CAAC,CAAC;MAChB,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;MAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAsB;MAChF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;MAC/B,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;QAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG;QAC3B,OAAO,CAAC;UAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;UAAE,GAAG;UAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;QAAO,CAAC,CAAC;MAC3F,CAAC,MAAM;QACL,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,IAAI,UAAU,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;MACnF;IACF,CAAC;IACD,GAAG,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,UAAU,CAAC,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;IAC3E,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;EAChB,CAAC,CAAC;AACJ;AAaO,SAAS,kBAAkB,CAAC,MAAM,EAAE;EACzC,MAAM,IAAI,GAAG,EAAE;EACf,OAAO;IACL,UAAU,EAAE,IAAI;IAChB,MAAM,CAAC,IAAI,EAAE;MACX,MAAM,IAAI,GAAG,IAAI;MACjB,MAAM,SAAS,GAAG,MAAM,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;MACxE,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,aAAa,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;MAC5E;MACA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;QACtC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC;QACpC,GAAG,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,+CAAO,CAAC;QACnD,GAAG,CAAC,gBAAgB,CAAC,eAAe,EAAE,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC;QACjE,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,IAAI;UAC3B,IAAI,CAAC,CAAC,gBAAgB,IAAI,IAAI,CAAC,UAAU,EAAE;YACzC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC;UACrC;QACF,CAAC;QACD,GAAG,CAAC,MAAM,GAAG,MAAM;UACjB,IAAI,OAAO,GAAG,CAAC,CAAC;UAChB,IAAI;YAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;UAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAsB;UAChF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;UAC/B,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YAC3E,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;UAC1B,CAAC,MAAM;YAIL,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YAC9E,MAAM,CAAC,IAAI,UAAU,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;UACnF;QACF,CAAC;QACD,GAAG,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,UAAU,CAAC,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;QAC3E,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;MAChB,CAAC,CAAC;IACJ,CAAC;IACD,MAAM,GAAG;MACP,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI;QAAE,IAAI,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE;UAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAAE;MAAE,CAAC,CAAC;IACnE;EACF,CAAC;AACH;AAQO,SAAS,oBAAoB,CAAC,MAAM,EAAE;EAC3C,MAAM,IAAI,GAAG,EAAE;EACf,OAAO;IACL,QAAQ,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE;MAC7D,MAAM,SAAS,GAAG,MAAM,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;MACxE,IAAI,CAAC,SAAS,EAAE;QACd,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,aAAa,EAAE,eAAe,EAAE,GAAG,CAAC;QAC/D,IAAI,OAAO,EAAE;UAAE,OAAO,CAAC,GAAG,CAAC;QAAE;QAC7B,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;MAC5B;MACA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;QACtC,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC;QAClC,GAAG,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,+CAAO,CAAC;QACnD,GAAG,CAAC,gBAAgB,CAAC,eAAe,EAAE,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC;QACjE,GAAG,CAAC,YAAY,GAAG,MAAM;QACzB,GAAG,CAAC,UAAU,GAAG,CAAC,IAAI;UAAE,IAAI,UAAU,EAAE;YAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;UAAE;QAAE,CAAC;QACnE,GAAG,CAAC,MAAM,GAAG,MAAM;UACjB,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;YACtB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;YACxC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;cAAC,IAAI,EAAE;YAAQ,CAAC,CAAC,CAAC;YAClF,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;YAC3B,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC;YACvC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;YACrC,OAAO,CAAC,CAAC;UACX,CAAC,MAAM;YACL,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,GAAG,YAAW;cACzB,IAAI,GAAG;cACP,IAAI;gBACF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;gBACnC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI;gBACtC,MAAM,KAAK,GAAG,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;gBACpE,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,IAAI,IAAI,IAAI,MAAM,EAAE,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC;cAC9E,CAAC,CAAC,OAAO,CAAC,EAAE;gBACV,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC;cAC7D;cACA,IAAI,OAAO,EAAE;gBAAE,OAAO,CAAC,GAAG,CAAC;cAAE;cAC7B,MAAM,CAAC,GAAG,CAAC;YACb,CAAC;YACD,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;UACjC;QACF,CAAC;QACD,GAAG,CAAC,OAAO,GAAG,MAAM;UAClB,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC;UAC3D,IAAI,OAAO,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC;UAAE;UAC7B,MAAM,CAAC,GAAG,CAAC;QACb,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,CAAC;MACZ,CAAC,CAAC;IACJ,CAAC;IACD,MAAM,GAAG;MACP,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI;QAAE,IAAI,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE;UAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAAE;MAAE,CAAC,CAAC;IACnE;EACF,CAAC;AACH;AAGO,SAAS,aAAa,CAAC,UAAU,EAAE;EACxC,OAAO,SAAS,CAAC,kBAAkB,EAAE;IACnC,MAAM,EAAE,MAAM;IAAE,IAAI,EAAE,KAAK;IAAE,kBAAkB,EAAE,UAAU;IAC3D,IAAI,EAAE;MAAC,WAAW,EAAE,UAAU;MAAE,QAAQ,EAAE,KAAK;MAAE,WAAW,EAAE,wDAAe,IAAI;IAAQ;EAC3F,CAAC,CAAC;AACJ;AAMA,SAAS,aAAa,GAAG;EACvB,OAAO;IACL,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,wDAAe,IAAI,EAAE;IAClC,UAAU,EAAG,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,SAAS,IAAK,EAAE;IAC3E,QAAQ,EAAG,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,QAAQ,IAAK,EAAE;IAExE,OAAO,EAAG,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAC,aAAa,IAAK;EAC/G,CAAC;AACH;AAEO,SAAS,uBAAuB,CAAC,IAAI,EAAE;EAC5C,OAAO,SAAS,CAAC,sBAAsB,EAAE;IAAC,MAAM,EAAE,MAAM;IAAE,IAAI,EAAE,KAAK;IAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACpF,IAAI,EAAE;MAAC,cAAc,EAAE,aAAa,CAAC,CAAC;MAAE,GAAG;IAAI;EAAC,CAAC,CAAC;AACtD;AAEO,SAAS,yBAAyB,CAAC,IAAI,EAAE;EAC9C,OAAO,SAAS,CAAC,wBAAwB,EAAE;IAAC,MAAM,EAAE,MAAM;IAAE,IAAI,EAAE,KAAK;IAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACtF,IAAI,EAAE;MAAC,cAAc,EAAE,aAAa,CAAC,CAAC;MAAE,GAAG;IAAI;EAAC,CAAC,CAAC;AACtD;AAGO,SAAS,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE;EACpD,OAAO,SAAS,CAAC,0BAA0B,EAAE;IAAC,MAAM,EAAE,MAAM;IAAE,IAAI,EAAE,KAAK;IAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAAE,IAAI,EAAE;MAAC,KAAK;MAAE;IAAK;EAAC,CAAC,CAAC;AACpH;AAEO,SAAS,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE;EACpD,OAAO,SAAS,CAAC,2BAA2B,GAAG,kBAAkB,CAAC,WAAW,CAAC,GAAG,SAAS,EACxF;IAAC,MAAM,EAAE,MAAM;IAAE,IAAI,EAAE,KAAK;IAAE,IAAI,EAAE;MAAC;IAAI;EAAC,CAAC,CAAC;AAChD;AAEO,SAAS,uBAAuB,CAAC,WAAW,EAAE,IAAI,EAAE;EACzD,OAAO,SAAS,CAAC,kCAAkC,GAAG,kBAAkB,CAAC,WAAW,CAAC,GAAG,SAAS,EAC/F;IAAC,MAAM,EAAE,MAAM;IAAE,IAAI,EAAE,KAAK;IAAE,IAAI,EAAE;MAAC;IAAI;EAAC,CAAC,CAAC;AAChD;AAEO,SAAS,oBAAoB,CAAC,UAAU,EAAE,WAAW,EAAE;EAC5D,OAAO,SAAS,CAAC,8BAA8B,EAC7C;IAAC,MAAM,EAAE,MAAM;IAAE,IAAI,EAAE,KAAK;IAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAAE,IAAI,EAAE;MAAC,WAAW,EAAE,UAAU;MAAE,YAAY,EAAE;IAAW;EAAC,CAAC,CAAC;AAC/G;AAGO,SAAS,YAAY,GAAG;EAC7B,OAAO,SAAS,CAAC,YAAY,CAAC;AAChC;AAEO,SAAS,KAAK,GAAG;EACtB,OAAO,SAAS,CAAC,KAAK,CAAC;AACzB;AAGO,SAAS,iBAAiB,GAAG;EAClC,OAAO,SAAS,CAAC,oBAAoB,CAAC;AACxC;AAEO,SAAS,cAAc,CAAC,IAAI,EAAE;EACnC,OAAO,MAAM,CAAC,gCAAgC,EAAE,IAAI,CAAC;AACvD;AAGO,SAAS,uBAAuB,CAAC,KAAK,EAAE;EAC7C,OAAO,MAAM,CAAC,sBAAsB,EAAE;IAAC,KAAK;IAAE,OAAO,EAAE;EAAK,CAAC,CAAC;AAChE;AAEO,SAAS,uBAAuB,CAAC,WAAW,EAAE,IAAI,EAAE;EACzD,OAAO,MAAM,CAAC,uBAAuB,GAAG,kBAAkB,CAAC,WAAW,CAAC,GAAG,SAAS,EAAE;IAAC;EAAI,CAAC,CAAC;AAC9F;AAEO,SAAS,sBAAsB,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE;EACrE,OAAO,MAAM,CAAC,gCAAgC,EAAE;IAAC,QAAQ;IAAE,OAAO;IAAE,YAAY,EAAE;EAAW,CAAC,CAAC;AACjG;AAMO,SAAS,yBAAyB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE;EACnE,OAAO,MAAM,CAAC,uCAAuC,EAAE;IAAC,QAAQ;IAAE,OAAO;IAAE;EAAM,CAAC,CAAC;AACrF;AAGO,MAAM,UAAU,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,KAAK,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC;EAAC,KAAK;EAAE,MAAM;EAAE;AAAO,CAAC,CAAC,CAAC;AAC9G,MAAM,iBAAiB,GAAG,CAAC,SAAS,GAAG,SAAS,EAAE,MAAM,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,KAClF,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC;EAAC,SAAS;EAAE,MAAM;EAAE;AAAM,CAAC,CAAC,CAAC;AACtD,MAAM,mBAAmB,GAAG,CAAC,YAAY,EAAE,OAAO,GAAG,EAAE,EAAE,MAAM,GAAG,QAAQ,EAAE,WAAW,GAAG,EAAE,KACjG,MAAM,CAAC,kBAAkB,EAAE;EAAC,cAAc,EAAE,YAAY;EAAE,OAAO;EAAE,MAAM;EAAE,YAAY,EAAE;AAAW,CAAC,CAAC;AACjG,MAAM,mBAAmB,GAAG,CAAC,UAAU,EAAE,OAAO,KAAK,MAAM,CAAC,mBAAmB,GAAG,kBAAkB,CAAC,UAAU,CAAC,GAAG,SAAS,EAAE,OAAO,GAAG;EAAC;AAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AACvJ,MAAM,mBAAmB,GAAG,CAAC,UAAU,EAAE,OAAO,KAAK,MAAM,CAAC,mBAAmB,GAAG,kBAAkB,CAAC,UAAU,CAAC,GAAG,SAAS,EAAE,OAAO,GAAG;EAAC;AAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AACvJ,MAAM,YAAY,GAAG,MAAM,IAAI,QAAQ,CAAC,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACjF,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,EAAE;EAAC;AAAM,CAAC,CAAC;AAC1G,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,SAAS,EAAE,MAAM,GAAG,EAAE,KAAK,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC;EAAC,CAAC,EAAE,KAAK;EAAE,IAAI;EAAE;AAAM,CAAC,CAAC,CAAC;AACnH,MAAM,cAAc,GAAG,UAAU,IAAI,KAAK,CAAC,SAAS,GAAG,kBAAkB,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;AACnG,MAAM,cAAc,GAAG,CAAC,gBAAgB,GAAG,KAAK,KAAK,MAAM,CAAC,aAAa,EAAE;EAAC,OAAO,EAAE,YAAY;EAAE,kBAAkB,EAAE;AAAgB,CAAC,CAAC;AACzI,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,gBAAgB,GAAG,KAAK,KACnE,MAAM,CAAC,SAAS,GAAG,kBAAkB,CAAC,UAAU,CAAC,GAAG,UAAU,EAAE;EAAC,OAAO,EAAE,YAAY;EAAE,kBAAkB,EAAE;AAAgB,CAAC,CAAC;AACzH,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,KAAK,MAAM,CAAC,kBAAkB,EAAE;EAAC,KAAK;EAAE;AAAO,CAAC,CAAC;AACrG,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,KAAK,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;EAAC;AAAM,CAAC,CAAC,CAAC;AAClE,MAAM,SAAS,GAAG,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9E,MAAM,WAAW,GAAG,MAAM,IAAI,QAAQ,CAAC,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC/E,MAAM,iBAAiB,GAAG,OAAO,IAAI,MAAM,CAAC,sBAAsB,EAAE;EAAC,QAAQ,EAAE;AAAO,CAAC,CAAC;AAGxF,MAAM,mBAAmB,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,KAAK,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC;EAAC,CAAC,EAAE,KAAK;EAAE;AAAM,CAAC,CAAC,CAAC;AAChH,MAAM,sBAAsB,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,KAAK,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC;EAAC,MAAM;EAAE;AAAK,CAAC,CAAC,CAAC;AAChH,MAAM,0BAA0B,GAAG,EAAE,IAAI,MAAM,CAAC,wBAAwB,GAAG,kBAAkB,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE;EAAC,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;AAAC,CAAC,CAAC;AACjJ,MAAM,sBAAsB,GAAG,KAAK,IAAI,KAAK,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;AACzG,MAAM,qBAAqB,GAAG,UAAU,IAAI,MAAM,CAAC,oBAAoB,EAAE;EAAC,YAAY,EAAE;AAAU,CAAC,CAAC;AACpG,MAAM,uBAAuB,GAAG,KAAK,IAAI,KAAK,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;AAC3G,MAAM,0BAA0B,GAAG,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,WAAW,EAAE,IAAI,CAAC;AAQ9H,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,KACvE,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE;EAAC,OAAO;EAAE;AAAM,CAAC,CAAC;AACjH,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,KAC5D,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,YAAY,EAAE;EAAC,OAAO;EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;EAAE;AAAO,CAAC,CAAC;AAC9I,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,KACxD,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,WAAW,GAAG,EAAE,CAAC;EAAC;AAAM,CAAC,CAAC,CAAC;AAI9G,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE;EAAC,KAAK,GAAG,EAAE;EAAE,IAAI,GAAG,KAAK;EAAE,MAAM,GAAG;AAAE,CAAC,GAAG,CAAC,CAAC,KACrF,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,kBAAkB,GAAG,EAAE,CAAC;EAAC,CAAC,EAAE,KAAK;EAAE,IAAI;EAAE;AAAM,CAAC,CAAC,CAAC;AAC5F,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,KACnE,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,EAAE,CAAC;EAAC,MAAM;EAAE;AAAK,CAAC,CAAC,CAAC;AACpH,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,OAAO,EAAE,MAAM,GAAG,EAAE,KAC9D,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,QAAQ,GAAG,EAAE,CAAC;EAAC,IAAI;EAAE;AAAM,CAAC,CAAC,CAAC;AACxE,MAAM,iBAAiB,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,KAAK,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC;EAAC,KAAK;EAAE;AAAM,CAAC,CAAC,CAAC;AACtG,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,GAAG,EAAE,KACvE,MAAM,CAAC,mBAAmB,EAAE;EAAC,IAAI;EAAE,OAAO;EAAE,aAAa,EAAE,YAAY;EAAE;AAAO,CAAC,CAAC;AAC7E,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,EAAE,KAAK,KAAK,CAAC,mBAAmB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;EAAC;AAAM,CAAC,CAAC,CAAC;AAC5H,MAAM,gBAAgB,GAAG,QAAQ,IAAI,MAAM,CAAC,kBAAkB,EAAE;EAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK;IAAC,GAAG,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG;EAAC,CAAC,CAAC;AAAC,CAAC,CAAC;AAC5H,MAAM,YAAY,GAAG,CAAC;EAAC,IAAI,GAAG,KAAK;EAAE,KAAK,GAAG,EAAE;EAAE,MAAM,GAAG,EAAE;EAAE;AAAK,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC;EAAC,IAAI;EAAE,CAAC,EAAE,KAAK;EAAE,MAAM;EAAE;AAAK,CAAC,CAAC,CAAC;AACvI,MAAM,WAAW,GAAG,UAAU,IAAI,KAAK,CAAC,aAAa,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;AACvF,MAAM,cAAc,GAAG,UAAU,IAAI,QAAQ,CAAC,aAAa,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;AAC7F,MAAM,oBAAoB,GAAG,WAAW,IAAI,MAAM,CAAC,yBAAyB,EAAE;EAAC,YAAY,EAAE;AAAW,CAAC,CAAC;AAC1G,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,OAAO,GAAG,EAAE,KACtE,MAAM,CAAC,oBAAoB,EAAE;EAAC,YAAY,EAAE,WAAW;EAAE,aAAa,EAAE,YAAY;EAAE;AAAO,CAAC,CAAC;AAC1F,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,KAAK,MAAM,CAAC,sBAAsB,EAAE;EAAC,GAAG;EAAE;AAAM,CAAC,CAAC;AAC5F,MAAM,oBAAoB,GAAG,CAAC,eAAe,EAAE,QAAQ,GAAG,UAAU,KACzE,MAAM,CAAC,4BAA4B,GAAG,kBAAkB,CAAC,eAAe,CAAC,GAAG,UAAU,EAAE;EAAC;AAAQ,CAAC,CAAC;AAC9F,MAAM,0BAA0B,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,KACvE,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,UAAU,GAAG,EAAE,CAAC;EAAC,WAAW,EAAE,IAAI;EAAE,KAAK;EAAE;AAAM,CAAC,CAAC,CAAC;AAK9F,MAAM,aAAa,GAAG,KAAK,IAAI,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC;AACvF,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAChE,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,QAAQ,EAAE;EAAC,OAAO;EAAE,QAAQ;EAAE;AAAO,CAAC,CAAC;AAEjF,eAAe,cAAc,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE;EACvD,MAAM,OAAO,GAAG;IACd,oBAAoB,EAAE,+CAAO;IAAE,aAAa,EAAE,GAAG;IACjD,eAAe,EAAE,iBAAiB,CAAC,CAAC;IAAE,cAAc,EAAE,SAAS,CAAC;EAClE,CAAC;EACD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC;EASzB,IAAI,KAAK,EAAE;IACT,OAAO,CAAC,aAAa,GAAG,QAAQ,GAAG,KAAK;EAC1C;EACA,IAAI,KAAK,EAAE;IACT,OAAO,CAAC,KAAK,GAAG,KAAK;EACvB;EACA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,EAAE;IAAC;EAAO,CAAC,CAAC;EACxF,OAAO;IACL,EAAE,EAAE,QAAQ,CAAC,EAAE;IAAE,MAAM,EAAE,QAAQ,CAAC,MAAM;IACxC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE;IACvD,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE;IAC3D,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE;IACzD,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI;EACxC,CAAC;AACH;AAEO,SAAS,cAAc,GAAG;EAC/B,OAAO,QAAQ,CAAC,CAAC;AACnB;AASO,SAAS,cAAc,CAAC,MAAM,EAAE;EACrC,OAAO,MAAM,GAAG,QAAQ,CAAC,CAAC,GAAG,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,GAAG,IAAI;AACxE;AAOA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC;AACvB,SAAS,UAAU,CAAC,MAAM,EAAE;EACjC,IAAI,CAAC,MAAM,EAAE;IACX,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;EAC9B;EACA,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;IAC5B,OAAO,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;EACjC;EACA,MAAM,OAAO,GAAG;IACd,oBAAoB,EAAE,+CAAO;IAAE,aAAa,EAAE,GAAG;IACjD,eAAe,EAAE,iBAAiB,CAAC,CAAC;IAAE,cAAc,EAAE,SAAS,CAAC;EAClE,CAAC;EACD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC;EAEzB,IAAI,KAAK,EAAE;IACT,OAAO,CAAC,aAAa,GAAG,QAAQ,GAAG,KAAK;EAC1C;EACA,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;IAAC;EAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;IACnE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;MACX,MAAM,IAAI,UAAU,CAAC,QAAQ,EAAE,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC;IACjE;IACA,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;EACnB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;IACtD,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;IAC3B,MAAM,GAAG;EACX,CAAC,CAAC;EACF,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;EACjC,OAAO,OAAO;AAChB;AAGO,MAAM,SAAS,GAAG,CAAC;EAAC,QAAQ,GAAG,QAAQ;EAAE,KAAK,GAAG,EAAE;EAAE,MAAM,GAAG;AAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;EAAC,QAAQ;EAAE,KAAK;EAAE;AAAM,CAAC,CAAC,CAAC;AAC3H,MAAM,WAAW,GAAG,CAAC;EAAC,IAAI;EAAE,WAAW,GAAG,EAAE;EAAE,aAAa,GAAG,EAAE;EAAE,YAAY,GAAG;AAAE,CAAC,KACzF,MAAM,CAAC,SAAS,EAAE;EAAC,IAAI;EAAE,WAAW;EAAE,eAAe,EAAE,aAAa;EAAE,cAAc,EAAE;AAAY,CAAC,CAAC;AAC/F,MAAM,QAAQ,GAAG,KAAK,IAAI,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACvE,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;AAC1F,MAAM,gBAAgB,GAAG,KAAK,IAAI,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;AAC7F,MAAM,yBAAyB,GAAG,CAAC,KAAK,EAAE;EAAC,MAAM;EAAE;AAAkB,CAAC,KAC3E,OAAO,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,kBAAkB,EAAE;EAAC,MAAM;EAAE;AAAkB,CAAC,CAAC;AAC7F,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,KAC3D,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,qBAAqB,EAAE;EAAC,QAAQ;EAAE;AAAO,CAAC,CAAC;AAKrF,MAAM,iBAAiB,GAAG,KAAK,IAAI,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,qBAAqB,CAAC;AACxG,MAAM,UAAU,GAAG,KAAK,IAAI,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;AACzF,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE;EAAC,KAAK,GAAG,EAAE;EAAE,MAAM,GAAG,EAAE;EAAE,IAAI,GAAG,EAAE;EAAE,YAAY,GAAG,EAAE;EAAE,WAAW;EAAE;AAAY,CAAC,GAAG,CAAC,CAAC,KAC5H,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,UAAU,GACvD,EAAE,CAAC;EAAC,KAAK;EAAE,MAAM;EAAE,IAAI;EAAE,aAAa,EAAE,YAAY;EAAE,WAAW,EAAE,WAAW,GAAG,MAAM,GAAG,EAAE;EAAE,aAAa,EAAE,YAAY,GAAG,MAAM,GAAG;AAAE,CAAC,CAAC,CAAC;AACvI,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,gBAAgB,GAAG,KAAK,KAC/D,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,UAAU,EAAE;EAAC,kBAAkB,EAAE;AAAgB,CAAC,CAAC;AAC9F,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,KAC7D,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,cAAc,EAAE;EAAC,QAAQ,EAAE,OAAO;EAAE;AAAO,CAAC,CAAC;AACxF,MAAM,qBAAqB,GAAG,YAAY,IAAI,MAAM,CAAC,qBAAqB,GAAG,kBAAkB,CAAC,YAAY,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC;AAC9H,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE;EAAC,OAAO,GAAG,EAAE;EAAE,MAAM,GAAG,IAAI;EAAE,OAAO,GAAG;AAAE,CAAC,GAAG,CAAC,CAAC,KAC5F,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,gBAAgB,EAAE;EAAC,OAAO;EAAE,MAAM;EAAE,QAAQ,EAAE;AAAO,CAAC,CAAC;AAClG,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,GAAG,EAAE,KACzE,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,gBAAgB,GAAG,EAAE,CAAC;EAAC,MAAM;EAAE;AAAM,CAAC,CAAC,CAAC;AAClF,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,KAC/D,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,iBAAiB,GAAG,kBAAkB,CAAC,UAAU,CAAC,GAAG,SAAS,EAAE,OAAO,GAAG;EAAC;AAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAKpI,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,KAC/D,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,iBAAiB,GAAG,kBAAkB,CAAC,UAAU,CAAC,GAAG,SAAS,EAAE,OAAO,GAAG;EAAC;AAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AACpI,MAAM,eAAe,GAAG,KAAK,IAAI,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;AAC3F,MAAM,0BAA0B,GAAG,KAAK,IAAI,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,uBAAuB,CAAC;AACnH,MAAM,8BAA8B,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,KACpE,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,wBAAwB,EAAE;EAAC,OAAO;EAAE;AAAO,CAAC,CAAC;AACvF,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,cAAc,KACxD,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,iBAAiB,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;AACjG,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,cAAc,KACzD,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,iBAAiB,GAAG,kBAAkB,CAAC,cAAc,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;AAChH,MAAM,kBAAkB,GAAG,KAAK,IAAI,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC;AACjG,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,aAAa,EAAE,IAAI,CAAC;AACpH,MAAM,kBAAkB,GAAG,KAAK,IAAI,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,cAAc,CAAC;AAClG,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,eAAe,EAAE;EAAC,QAAQ,EAAE,OAAO;EAAE;AAAO,CAAC,CAAC;AAIlJ,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,KACrD,QAAQ,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG;EAAC,OAAO,EAAE;IAAC,GAAG,IAAI,CAAC,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC,OAAO;EAAC;AAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACzJ,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,KAAK,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,QAAQ,EAAE;EAAC,OAAO;EAAE;AAAM,CAAC,CAAC;AACtI,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,QAAQ,GAAG,EAAE,CAAC;EAAC;AAAM,CAAC,CAAC,CAAC;AACrH,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,QAAQ,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACtI,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,GAAG,EAAE,KAC/E,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,iBAAiB,EAAE;EAAC,cAAc,EAAE,YAAY;EAAE;AAAO,CAAC,EACxG,WAAW,GAAG;EAAC,OAAO,EAAE;IAAC,GAAG,IAAI,CAAC,CAAC;IAAE,gBAAgB,EAAE;EAAW;AAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAItE,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE;EAAC,KAAK,GAAG,EAAE;EAAE,IAAI,GAAG,EAAE;EAAE,MAAM,GAAG;AAAE,CAAC,GAAG,CAAC,CAAC,KAC5E,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,QAAQ,GAAG,EAAE,CAAC;EAAC,CAAC,EAAE,KAAK;EAAE,IAAI;EAAE;AAAM,CAAC,CAAC,CAAC;AAGlF,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE;EAAC,MAAM;EAAE,QAAQ,GAAG,EAAE;EAAE,QAAQ,GAAG,EAAE;EAAE,QAAQ,GAAG,EAAE;EAAE,QAAQ,GAAG,CAAC;EAAE,WAAW,GAAG,EAAE;EAAE;AAAS,CAAC,GAAG,CAAC,CAAC,KACvI,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,QAAQ,EAAE;EACxD,OAAO,EAAE,MAAM;EAAE,SAAS,EAAE,QAAQ;EAAE,SAAS,EAAE,QAAQ;EAAE,SAAS,EAAE,QAAQ;EAAE,SAAS,EAAE,QAAQ;EACnG,YAAY,EAAE,WAAW;EAAE,UAAU,EAAE;AACzC,CAAC,CAAC;AACG,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,QAAQ,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,SAAS,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;AAC9I,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;AAGtJ,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC;AAC9C,MAAM,0BAA0B,GAAG,CAAC,QAAQ,GAAG,MAAM,EAAE,MAAM,GAAG,EAAE,KAAK,KAAK,CAAC,2BAA2B,GAAG,EAAE,CAAC;EAAC,SAAS,EAAE,QAAQ;EAAE;AAAM,CAAC,CAAC,CAAC;AAC7I,MAAM,gCAAgC,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,EAAE,KACxE,KAAK,CAAC,4BAA4B,GAAG,kBAAkB,CAAC,YAAY,CAAC,GAAG,UAAU,GAAG,EAAE,CAAC;EAAC;AAAM,CAAC,CAAC,CAAC;AAK7F,MAAM,sBAAsB,GAAG,CAAC;EAAC,KAAK,GAAG,EAAE;EAAE,YAAY,GAAG,EAAE;EAAE,MAAM,GAAG;AAAE,CAAC,GAAG,CAAC,CAAC,KACtF,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC;EAAC,CAAC,EAAE,KAAK;EAAE,aAAa,EAAE,YAAY;EAAE;AAAM,CAAC,CAAC,CAAC;AAC/E,MAAM,kBAAkB,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE,KAAK,GAAG,iBAAiB,EAAE,MAAM,GAAG,EAAE,KACnF,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC;EAAC,CAAC,EAAE,KAAK;EAAE,KAAK;EAAE;AAAM,CAAC,CAAC,CAAC;AACxD,MAAM,WAAW,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,KAAK,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC;EAAC,KAAK;EAAE;AAAM,CAAC,CAAC,CAAC;AACzF,MAAM,aAAa,GAAG,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC;AACvD,MAAM,UAAU,GAAG,SAAS,IAAI,KAAK,CAAC,YAAY,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACnF,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,IAAI,KAAK,OAAO,CAAC,YAAY,GAAG,kBAAkB,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;AACtG,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC,YAAY,GAAG,kBAAkB,CAAC,SAAS,CAAC,GAAG,SAAS,EAAE;EAAC,OAAO;EAAE;AAAM,CAAC,CAAC;AAClJ,MAAM,oBAAoB,GAAG,SAAS,IAAI,MAAM,CAAC,YAAY,GAAG,kBAAkB,CAAC,SAAS,CAAC,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC;AACjH,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,KAAK,KAAK,CAAC,YAAY,GAAG,kBAAkB,CAAC,SAAS,CAAC,GAAG,cAAc,EAAE;EAAC,QAAQ;EAAE;AAAO,CAAC,CAAC;AAIlJ,MAAM,eAAe,GAAG,CAAC;EAAC,KAAK,GAAG,MAAM;EAAE,IAAI,GAAG,EAAE;EAAE,EAAE,GAAG,EAAE;EAAE,MAAM,GAAG,EAAE;EAAE,MAAM,GAAG;AAAE,CAAC,GAAG,CAAC,CAAC,KACjG,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC;EAAC,KAAK;EAAE,IAAI;EAAE,EAAE;EAAE,MAAM;EAAE;AAAM,CAAC,CAAC,CAAC;AAC1D,MAAM,iBAAiB,GAAG,UAAU,IAAI,MAAM,CAAC,gBAAgB,EAAE;EAAC,WAAW,EAAE;AAAU,CAAC,CAAC;AAC3F,MAAM,cAAc,GAAG,QAAQ,IAAI,KAAK,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAC1F,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,EAAE,KAC3E,KAAK,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,GAAG,QAAQ,EAAE;EAAC,OAAO;EAAE,WAAW;EAAE;AAAO,CAAC,CAAC;AAC9F,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,GAAG,SAAS,EAAE;EAAC;AAAO,CAAC,CAAC;AAIhI,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,EAAE,KAAK,KAAK,CAAC,2BAA2B,GAAG,EAAE,CAAC;EAAC,IAAI;EAAE,aAAa,EAAE;AAAY,CAAC,CAAC,CAAC;AACpI,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,EAAE,KAAK,MAAM,CAAC,0BAA0B,EAAE;EAAC,IAAI;EAAE,QAAQ,EAAE;AAAO,CAAC,CAAC;AAChH,MAAM,iBAAiB,GAAG,CAAC;EAAC,KAAK,GAAG,MAAM;EAAE,SAAS,GAAG,EAAE;EAAE,OAAO,GAAG,EAAE;EAAE,MAAM,GAAG,EAAE;EAAE,MAAM,GAAG;AAAE,CAAC,GAAG,CAAC,CAAC,KAC7G,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC;EAAC,KAAK;EAAE,UAAU,EAAE,SAAS;EAAE,QAAQ,EAAE,OAAO;EAAE,MAAM;EAAE;AAAM,CAAC,CAAC,CAAC;AAC5F,MAAM,mBAAmB,GAAG,KAAK,IAAI,MAAM,CAAC,kBAAkB,EAAE;EAAC;AAAK,CAAC,CAAC;AACxE,MAAM,gBAAgB,GAAG,QAAQ,IAAI,KAAK,CAAC,mBAAmB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAC9F,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,GAAG,EAAE,KAC3F,KAAK,CAAC,mBAAmB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,GAAG,QAAQ,EAAE;EAAC,YAAY,EAAE,WAAW;EAAE,SAAS,EAAE,QAAQ;EAAE,WAAW;EAAE;AAAO,CAAC,CAAC;AACvI,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC,mBAAmB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,GAAG,SAAS,EAAE;EAAC;AAAO,CAAC,CAAC;AAOpI,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,OAAO,KACnD,MAAM,CAAC,mBAAmB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,GAAG,SAAS,EAAE;EAAC;AAAO,CAAC,CAAC;AAE5E,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,YAAY,GAAG,EAAE,KAAK,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC;EAAC,KAAK;EAAE,aAAa,EAAE;AAAY,CAAC,CAAC,CAAC;AAC1I,MAAM,yBAAyB,GAAG,MAAM,KAAK,CAAC,2BAA2B,CAAC;AAC1E,MAAM,6BAA6B,GAAG,IAAI,IAAI,MAAM,CAAC,gCAAgC,EAAE,IAAI,CAAC;AAG5F,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC;AAC/C,MAAM,eAAe,GAAG,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC;AAC5D,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC;AAC/C,MAAM,eAAe,GAAG,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC;AAC5D,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,sBAAsB,CAAC;AACxD,MAAM,eAAe,GAAG,CAAC,aAAa,EAAE,WAAW,KAAK,MAAM,CAAC,6BAA6B,EAAE;EAAC,cAAc,EAAE,aAAa;EAAE,YAAY,EAAE;AAAW,CAAC,CAAC;AAKzJ,MAAM,gBAAgB,GAAG,WAAW,IAAI,MAAM,CAAC,8BAA8B,EAAE,CAAC,CAAC,EAAE;EAAC,OAAO,EAAE;IAAC,GAAG,IAAI,CAAC,CAAC;IAAE,gBAAgB,EAAE;EAAW;AAAC,CAAC,CAAC;AACzI,MAAM,mBAAmB,GAAG,CAAC;EAAC,QAAQ,GAAG,SAAS;EAAE,cAAc,GAAG,OAAO;EAAE,OAAO,GAAG;AAAQ,CAAC,GAAG,CAAC,CAAC,KAC3G,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC;EAAC,QAAQ;EAAE,eAAe,EAAE,cAAc;EAAE;AAAO,CAAC,CAAC,CAAC;AACnF,MAAM,qBAAqB,GAAG,CAAC,QAAQ,EAAE,IAAI,KAAK,KAAK,CAAC,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,GAAG,aAAa,EAAE,IAAI,CAAC;AAGzH,MAAM,eAAe,GAAG,CAAC,UAAU,GAAG,MAAM,KAAK,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC;EAAC,WAAW,EAAE;AAAU,CAAC,CAAC,CAAC;AAChH,MAAM,iBAAiB,GAAG,IAAI,IAAI,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC;AAChE,MAAM,iBAAiB,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC;AACzD,MAAM,cAAc,GAAG,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE;EAAC,cAAc,EAAE,aAAa,CAAC,CAAC;EAAE,GAAG;AAAI,CAAC,CAAC,C;;;;;;;;;;;;;;;ACzzBtF,MAAM,gBAAgB,CAAC;EAEpC,OAAO,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE;IAC3B,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;EAClD;EAGA,OAAO,SAAS,CAAC,GAAG,EAAE;IACpB,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;IACvC,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;EACnC;EAGA,OAAO,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;IAClC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;EACzD;EAGA,OAAO,UAAU,CAAC,GAAG,EAAE;IACrB,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;EAC9B;AACF,C;;;;;;;;;;;;;;;ACbA,IAAI,eAAe,GAAG,CAAC;AAER,MAAM,cAAc,CAAC;EAGlC,OAAO,YAAY,CAAC,IAAI,EAAE;IAExB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,CAAC,CAAC;IACjB,IAAI,IAAI,GAAG,EAAE;IACb,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;MACZ,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;IAC7C;IACA,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;MACZ,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAE,GAAG,IAAK;QAEnC,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;QAC3B,IAAI,EAAE,GAAG,CAAC,EAAE;UACV,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAClE;MACF,CAAC,CAAC;IACJ;IACA,OAAO;MAAC,IAAI,EAAE,IAAI;MAAE,MAAM,EAAE;IAAM,CAAC;EACrC;EAEA,OAAO,UAAU,CAAC,GAAG,EAAE;IACrB,eAAe,EAAE;IACjB,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG;EAC5B;EASA,OAAO,MAAM,GAAG;IACd,IAAI,eAAe,GAAG,CAAC,EAAE;MACvB,eAAe,EAAE;MACjB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;MACrB,OAAO,IAAI;IACb;IACA,OAAO,KAAK;EACd;EAEA,OAAO,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE;IAClC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACxB,MAAM,IAAI,GAAG,EAAE;IACf,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;MACxB,IAAI,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;QAC9B,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;UAC7B,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD;MACF;IACF;IACA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;MACnB,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC7B;IACA,OAAO,GAAG;EACZ;EAEA,OAAO,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE;IACnC,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC;IAChD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK;IAC1B,OAAO,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;EAClE;EAEA,OAAO,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE;IAC/B,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;IACzB,OAAO,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;EAClE;EAEA,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE;IACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;MACxB,IAAI,GAAG,CAAC,IAAI,CAAC;IACf;IACA,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC;IAChD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;MACtB,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;IAC3B;IACA,OAAO,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;EAClE;EAEA,OAAO,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE;IACtC,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS;IAC1B,OAAO,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;EAClE;EAEA,OAAO,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE;IACtC,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC;IAChD,IAAI,SAAS,EAAE;MACb,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,SAAS;IAChC,CAAC,MAAM;MACL,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI;IAC3B;IACA,OAAO,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;EAClE;EAEA,OAAO,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE;IAC9B,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK;IAEtB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI;IACzB,OAAO,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;EAClE;AACF,C;;;;;;;;;;;;;;;;;;;;;;;ACvHO,SAAS,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE;EAC5C,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,YAAY,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ;EAC7E,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC;EACtB,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE;IAE3C,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE;MAExE,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;QAAC,MAAM,EAAE,KAAK;QAAE,IAAI,EAAE,SAAS;QAAE,MAAM,EAAE;MAAS,CAAC,CAAC;IAC7F;IAEA,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EACnC;MAAC,MAAM,EAAE,KAAK;MAAE,KAAK,EAAE,OAAO;MAAE,GAAG,EAAE,SAAS;MAAE,IAAI,EAAE,SAAS;MAAE,MAAM,EAAE;IAAS,CAAC,CAAC;EACxF;EAEA,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAAC,IAAI,EAAE,SAAS;IAAE,KAAK,EAAE,OAAO;IAAE,GAAG,EAAE;EAAS,CAAC,CAAC;AAC3F;AAGO,SAAS,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE;EAC/C,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,YAAY,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ;EAC7E,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC;EACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,MAAM,IAAI,UAAU,CAAC;EAC9F,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,iBAAiB,CAAC,CAAC,GAAG,MAAM,IAAI,UAAU,CAAC;EAC3F,MAAM,IAAI,GAAG,QAAQ,GAAG,OAAO;EAC/B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;IAEtB,OAAO,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;MAAE,OAAO,EAAE;IAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;EACrF;EAEA,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;AACrD;AAIO,SAAS,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE;EAC/C,IAAI,OAAO,OAAO,IAAI,QAAQ,EAAE;IAC9B,OAAO,EAAE;EACX;EAEA,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE;EAC7C,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC;EAE1C,IAAI,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE;IACzB,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,GAAG;EAClC;EACA,IAAI,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,IAAI,EAAE;EAC5B,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,GAAG;EAChC,IAAI,KAAK,IAAI,CAAC,EAAE;IACd,OAAO,GAAG,GAAG,IAAI,GAAG,EAAE;EACxB;EACA,OAAO,GAAG,KAAK,IAAI,GAAG,IAAI,GAAG,EAAE;AACjC;AAGO,SAAS,gBAAgB,CAAC,KAAK,EAAE;EACtC,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC,EAAE;IACxB,OAAO,SAAS;EAClB;EAEA,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;EACrD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,GAAC,CAAC,CAAC;EAC9E,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC;EAC5C,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,GAAI,KAAK,GAAG,CAAC,GAAG,CAAC,GAAI,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAE,GAAI,CAAC;EACrE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;AACnD;AAGO,SAAS,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE;EACnD,IAAI,OAAO,QAAQ,IAAI,QAAQ,EAAE;IAC/B,OAAO,QAAQ;EACjB;EACA,OAAO,QAAQ,CAAC,MAAM,GAAG,SAAS,GAChC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,GAAC,CAAC,CAAC,GAAG,QAAQ;AACzF;AAIA,SAAS,iBAAiB,CAAC,KAAK,EAAE;EAChC,IAAI,IAAI,GAAG,CAAC;EACZ,KAAK,GAAG,EAAE,GAAG,KAAK;EAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;IACrC,IAAI,GAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,GAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IACjD,IAAI,GAAG,IAAI,GAAG,IAAI;EACpB;EACA,OAAO,IAAI;AACb;AAGO,SAAS,iBAAiB,CAAC,MAAM,EAAE;EACxC,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE;AACjD;AAOO,SAAS,cAAc,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;EAC5C,OAAO,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,KAAK,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,iBAAiB,CAAC,EAAE,CAAC;AAC/E;AAGO,SAAS,SAAS,CAAC,WAAW,EAAE;EACrC,MAAM,UAAU,GAAG,WAAW,CAC3B,WAAW,CAAC,CAAC,CACb,KAAK,CAAC,EAAE,CAAC,CACT,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;EAC3C,OAAO,MAAM,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC;AAC5C;AAIO,SAAS,cAAc,CAAC,GAAG,EAAE,SAAS,EAAE;EAC7C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;IAC3B,OAAO,GAAG;EACZ;EACA,IAAI,GAAG,CAAC,MAAM,IAAI,SAAS,EAAE;IAC3B,OAAO,GAAG;EACZ;EAGA,MAAM,KAAK,GAAG,kFAAkF,CAAC,IAAI,CAAC,GAAG,CAAC;EAC1G,OAAO,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,GAAG;AACtF,C;;;;;;;;;;;;;;;;;;;;AC5H0B;AAY1B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;AAMhB,SAAS,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE;EAChD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,MAAO,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAU,CAAC;EAChF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;EAE5E,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,GAAG,EAAE;IACV,IAAI,IAAI,GAAG,IAAI;IACf,IAAI,OAAO,GAAG,KAAK;IAGnB,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI;MAC7C,IAAI,CAAC,IAAI,EAAE;MACX,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;MACtB,OAAO,CAAC,MAAM,CAAC;MACf,UAAU,CAAC,KAAK,CAAC;IACnB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;MACb,IAAI,CAAC,IAAI,EAAE;MAQX,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAC/B,OAAO,GAAG,IAAI;QACd,MAAM,CAAC,UAAU,CAAC,MAAM;UAAE,IAAI,IAAI,EAAE,OAAO,CAAC,CAAC;QAAE,CAAC,EAAE,IAAI,CAAC;QACvD;MACF;MAGA,UAAU,CAAC,KAAK,CAAC;IACnB,CAAC,CAAC;IACF,OAAO,CAAC,CAAC;IACT,OAAO,MAAM;MAAE,IAAI,GAAG,KAAK;IAAE,CAAC;EAEhC,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;EAE1B,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;AACxB;AAKO,SAAS,cAAc,CAAC,GAAG,EAAE;EAClC,OAAO,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS;AACzC;AAEO,SAAS,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE;EAC1C,IAAI,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;AAChC;AAMO,SAAS,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,EAAE;EACpD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,sDAAe,CAAC,MAAM;IACpB,IAAI,KAAK,KAAK,SAAS,EAAE,OAAO,SAAS;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACjE,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EACzC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;EAC7B,OAAO,SAAS;AAClB,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjFoC;AACc;AAU3C,SAAS,gBAAgB,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE;EAChE,MAAM,EAAE,GAAG,UAAU,IAAI,UAAU,CAAC,EAAE;EACtC,IAAI,EAAE,EAAE,OAAO,EAAE;EACjB,IAAI,UAAU,IAAI,8CAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,UAAU,CAAC,IAAI;EAI/F,IAAI,8CAAM,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,OAAO,QAAQ;EACtD,OAAO,QAAQ;AACjB;AAGO,SAAS,aAAa,CAAC,KAAK,EAAE;EACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC;EACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;EACtE,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;EAC9C,OAAO,CAAC,IAAI,GAAG,WAAW;EAC1B,OAAO,CAAC,EAAE,GAAG,eAAe;EAC5B,OAAO,CAAC,GAAG,GAAG,eAAe;EAC7B,OAAO,CAAC,IAAI,GAAG,eAAe,IAAI,KAAK,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,MAAM;EAChE,IAAI,OAAO,EAAE;IACX,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;EAC3B;EACA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;EAEzB,QAAQ,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,GAAG,GAAC,KAAK,GAAC,IAAI,GAAG,EAAE,IAAI,QAAQ;AAC/D;AAGO,SAAS,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE;EACzD,IAAI,IAAI,GAAG,IAAI;EACf,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;EACpB,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;EAE1B,IAAI,EAAE,EAAE;IACN,IAAI,GAAG;MACL,EAAE,EAAE;IACN,CAAC;EACH;EAEA,IAAI,OAAO,IAAI,IAAI,QAAQ,EAAE;IAC3B,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;IACjB,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,8CAAM,CAAC,QAAQ;EAC3C;EAEA,IAAI,QAAQ,EAAE;IACZ,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;IACjB,IAAI,QAAQ,GAAG,aAAa;IAE5B,MAAM,OAAO,GAAG,0CAA0C,CAAC,IAAI,CAAC,QAAQ,CAAC;IACzE,IAAI,OAAO,EAAE;MACX,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;MACrB,IAAI,CAAC,KAAK,GAAG;QACX,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnD,GAAG,EAAE,8CAAM,CAAC;MACd,CAAC;IACH,CAAC,MAAM;MACL,IAAI,CAAC,KAAK,GAAG;QACX,IAAI,EAAE,8CAAM,CAAC,QAAQ;QACrB,GAAG,EAAE;MACP,CAAC;IACH;IACA,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;EACzE;EAEA,OAAO,IAAI;AACb;AAGO,SAAS,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE;EAC/B,IAAI,CAAC,KAAK,CAAC,EAAE;IACX,OAAO,IAAI;EACb;EAEA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;IAC1C,OAAO,KAAK;EACd;EAGA,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE;IACxB,OAAO,KAAK;EACd;EAEA,CAAC,CAAC,IAAI,CAAC,CAAC;EACR,CAAC,CAAC,IAAI,CAAC,CAAC;EACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;IACxC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;MACjB,OAAO,KAAK;IACd;EACF;EACA,OAAO,IAAI;AACb;AAIO,SAAS,OAAO,CAAC,GAAG,EAAE;EAC3B,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;EAChB,IAAI,4EAA4E,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;IAC1F,OAAO,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;EACxC;EACA,OAAO,IAAI;AACb;AAGO,SAAS,OAAO,CAAC,GAAG,EAAE;EAC3B,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;EAChB,IAAI,4CAA4C,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;IAC1D,OAAO,GAAG;EACZ;EACA,OAAO,IAAI;AACb;AASO,SAAS,aAAa,CAAC,GAAG,EAAE;EAGjC,OAAO,GAAG,IAAI,CAAC,iCAAiC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAChF;AAIO,SAAS,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE;EAC/C,IAAI,OAAO,GAAG,IAAI,QAAQ,EAAE;IAC1B,OAAO,GAAG;EACZ;EAGA,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;EAG/C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;EAI7B,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;IAC5C,OAAO,GAAG;EACZ;EAGA,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;IAC1B,OAAO,GAAG;EACZ;EAGA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY;EACvF,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,KAAK,GAAG,OAAO,GAAG,QAAQ,EAAE,GAAG,CAAC;EACtD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;IACjB,OAAO,IAAI;EACb;EAEA,OAAO,GAAG;AACZ;AAKO,SAAS,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE;EACjD,IAAI,CAAC,GAAG,EAAE;IACR,OAAO,IAAI;EACb;EAEA,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC;EACrC,IAAI,YAAY,EAAE;IAChB,OAAO,YAAY;EACrB;EAGA,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,QAAQ,SAAS,wBAAwB,EAAE,GAAG,CAAC;EACrE,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;IACvB,OAAO,GAAG;EACZ;EAEA,OAAO,IAAI;AACb;AAKO,SAAS,eAAe,CAAC,GAAG,EAAE;EAUnC,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;IACtD,OAAO,GAAG;EACZ;EAGA,IAAI,KAAK,GAAG,EAAE;IAAE,QAAQ,GAAG,EAAE;EAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;EAC7B,IAAI,IAAI,GAAG,CAAC,EAAE;IACZ,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,GAAC,CAAC,CAAC;IAChC,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;EAC9B;EACA,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;EAC7B,IAAI,IAAI,GAAG,CAAC,EAAE;IACZ,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,GAAC,CAAC,CAAC;IAC7B,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;EAC9B;EAEA,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC;EACzC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;EAC3B,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,QAAQ,GAAG,IAAI,QAAQ,EAAE,GAAG,EAAE,CAAC;AACzE;AAGO,SAAS,cAAc,CAAC,QAAQ,EAAE;EACvC,QAAQ,QAAQ;IACd,KAAK,8CAAM,CAAC,sBAAsB;MAChC,OAAO;QAAE,IAAI,EAAE;MAAc,CAAC;IAChC,KAAK,8CAAM,CAAC,qBAAqB;IACjC,KAAK,8CAAM,CAAC,oBAAoB;MAC9B,OAAO;QAAE,IAAI,EAAE,SAAS;QAAE,KAAK,EAAE;MAAM,CAAC;IAC1C,KAAK,8CAAM,CAAC,mBAAmB;MAC7B,OAAO;QAAE,IAAI,EAAE;MAAO,CAAC;IACzB,KAAK,8CAAM,CAAC,uBAAuB;MACjC,OAAO;QAAE,IAAI,EAAE;MAAW,CAAC;IAC7B,KAAK,8CAAM,CAAC,mBAAmB;MAC7B,OAAO;QAAE,IAAI,EAAE,UAAU;QAAE,KAAK,EAAE;MAAO,CAAC;EAC9C;EACA,OAAO,IAAI;AACb;AAKO,SAAS,iBAAiB,CAAC,OAAO,EAAE;EACzC,IAAI,WAAW,GAAG,KAAK;EAEvB,MAAM,cAAc,GAAG,OAAO,YAAY,KAAK,GAC7C,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,GACvB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;IAC/B,OAAO,CAAC,IAAI,CACV,MAAM,IAAI,WAAW,GAAG,MAAM,CAAC;MAAC,UAAU,EAAE;IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EACpE,KAAK,IAAI,WAAW,GAAG,MAAM,CAAC;MAAC,UAAU,EAAE;IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAClE,CAAC;EACH,CAAC,CAAC;EAEJ,OAAO;IACL,OAAO,EAAE,cAAc;IACvB,MAAM,GAAG;MACP,WAAW,GAAG,IAAI;IACpB;EACF,CAAC;AACH;AAAC;AAEM,SAAS,gBAAgB,GAAG;EACjC,MAAM,cAAc,GAAG,mBAAO,CAAC,sDAA0B,CAAC;EAC1D,MAAM,EAAE,GAAG,cAAc,CAAC,0DAAkB,CAAC,IAAI,CAAC,CAAC,0DAAkB,CAAC,KAAK,CAAC;EAC5E,OAAO;IAAC,IAAI,EAAE,MAAM,0DAAkB,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,EAAE,CAAC;EAAI,CAAC;AACzE;AAEO,SAAS,oBAAoB,CAAC,YAAY,EAAE;EAEjD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC;EACrC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAChC;AAEO,SAAS,oBAAoB,CAAC,YAAY,EAAE;EAEjD,MAAM,KAAK,GAAG,oBAAoB,CAAC,YAAY,CAAC;EAChD,MAAM,cAAc,GAAG,mBAAO,CAAC,sDAA0B,CAAC;EAC1D,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;MACpD,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,EAAE;QACzC,OAAO,IAAI;MACb;IACF;EACF;EACA,OAAO,IAAI;AACb,C;;;;;;;;;;;;;;;ACpSO,MAAM,eAAe,GAAG,QAAQ,C;;;;;;;;;;;;;;;;;;;;ACDb;AACoB;AAAA;AAE/B,MAAM,cAAc,SAAS,4DAAmB,CAAC;EAC9D,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG;MACX,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,MAAM;MACxC,QAAQ,EAAG,KAAK,CAAC,QAAQ,GAAG,EAAE,IAAK,KAAK;MACxC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI;IACpC,CAAC;IAED,IAAI,CAAC,KAAK,GAAG,CAAE,SAAS,CAAC,aAAa,IAAI,SAAS,CAAC,aAAa,CAAC,QAAQ,IACrE,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;IACxD,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1E,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;EAC5E;EAEA,yBAAyB,CAAC,CAAC,EAAE;IAC3B,IAAI,CAAC,QAAQ,CAAC;MAAC,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC;IAAK,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC;EACvD;EAEA,qBAAqB,CAAC,CAAC,EAAE;IAEvB,IAAI,CAAC,QAAQ,CAAC;MAAC,QAAQ,EAAE,CAAC,CAAC,aAAa,CAAC;IAAK,CAAC,CAAC;IAEhD,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAE,CAAC,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE,GAAI,CAAC,CAAC;EAChE;EAEA,yBAAyB,CAAC,CAAC,EAAE;IAC3B,IAAI,CAAC,QAAQ,CAAC;MAAC,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC;IAAK,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC;EACxD;EAEA,MAAM,GAAG;IACP,OACI;MAAK,EAAE,EAAC,eAAe;MAAC,SAAS,EAAC,kBAAkB;MAAA,WAClD;QAAK,SAAS,EAAC,mBAAmB;QAAA,WAChC;UAAK,SAAS,EAAC,gBAAgB;UAAA,UAC7B;YAAO,SAAS,EAAC,OAAO;YAAA,UACtB,8DAAC,wDAAgB;cAAC,EAAE,EAAC,oBAAoB;cAAC,cAAc,EAAC,QAAQ;cAC/D,WAAW,EAAC;YAA4D,gBAAE;UAAC,gBACxE;QAAC,gBACL,CAAC,EACN;UAAK,SAAS,EAAC,gBAAgB;UAAA,UAC7B;YAAI,SAAS,EAAC,QAAQ;YAAA,WACpB;cAAA,WACE;gBAAO,IAAI,EAAC,OAAO;gBAAC,EAAE,EAAC,QAAQ;gBAAC,IAAI,EAAC,qBAAqB;gBAAC,KAAK,EAAC,MAAM;gBACrE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,MAAO;gBAC1C,QAAQ,EAAE,IAAI,CAAC;cAA0B,gBAAE,CAAC,QAC9C;gBAAO,OAAO,EAAC,QAAQ;gBAAA,WACrB,8DAAC,wDAAgB;kBAAC,EAAE,EAAC,qBAAqB;kBAAC,cAAc,EAAC,gBAAgB;kBAAC,WAAW,EAAC;gBAA0B,gBAAC,CAAC,QACnH;kBAAK,GAAG,EAAC,iBAAiB;kBAAC,KAAK,EAAE;oBAAC,aAAa,EAAE,KAAK;oBAAE,KAAK,EAAE,QAAQ;oBAAE,MAAM,EAAE;kBAAQ;gBAAE,gBAAC,CAAC;cAAA,eACzF,CAAC;YAAA,GAPF,QAAQ,MAQZ,CAAC,EACL;cAAA,WACE;gBAAO,IAAI,EAAC,OAAO;gBAAC,EAAE,EAAC,OAAO;gBAAC,IAAI,EAAC,qBAAqB;gBAAC,KAAK,EAAC,OAAO;gBACrE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,OAAQ;gBAC3C,QAAQ,EAAE,IAAI,CAAC;cAA0B,gBAAE,CAAC,QAC9C;gBAAO,OAAO,EAAC,OAAO;gBAAA,WACpB,8DAAC,wDAAgB;kBAAC,EAAE,EAAC,oBAAoB;kBAAC,cAAc,EAAC,OAAO;kBAAC,WAAW,EAAC;gBAA0B,gBAAC,CAAC,QACzG;kBAAG,SAAS,EAAC,6BAA6B;kBAAA,UAAC;gBAAU,gBAAG,CAAC;cAAA,eACpD,CAAC;YAAA,GAPF,OAAO,MAQX,CAAC,EACL;cAAA,WACE;gBAAO,IAAI,EAAC,OAAO;gBAAC,EAAE,EAAC,MAAM;gBAAC,IAAI,EAAC,qBAAqB;gBAAC,KAAK,EAAC,MAAM;gBACnE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,MAAO;gBAC1C,QAAQ,EAAE,IAAI,CAAC;cAA0B,gBAAE,CAAC,QAC9C;gBAAO,OAAO,EAAC,MAAM;gBAAA,WACnB,8DAAC,wDAAgB;kBAAC,EAAE,EAAC,mBAAmB;kBAAC,cAAc,EAAC,MAAM;kBAAC,WAAW,EAAC;gBAA0B,gBAAC,CAAC,QACvG;kBAAG,SAAS,EAAC,2BAA2B;kBAAA,UAAC;gBAAS,gBAAG,CAAC;cAAA,eACjD,CAAC;YAAA,GAPF,MAAM,MAQV,CAAC;UAAA,eACH;QAAC,gBACF,CAAC;MAAA,eACH,CAAC,EACN;QAAK,SAAS,EAAC;MAAI,gBAAE,CAAC,EACtB;QAAK,SAAS,EAAC,gCAAgC;QAAA,UAC7C;UAAG,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAmB;UAAC,SAAS,EAAC,aAAa;UAAA,WAChE;YAAG,SAAS,EAAC,gBAAgB;YAAA,UAAC;UAAS,gBAAG,CAAC,QAC3C,gEAAC,wDAAgB;YAAC,EAAE,EAAC,YAAY;YAAC,cAAc,EAAC,YAAY;YACzD,WAAW,EAAC;UAA4C,gBAAE,CAAC;QAAA,eAC9D;MAAC,gBACD,CAAC,EACN;QAAK,SAAS,EAAC;MAAI,gBAAE,CAAC,EACtB;QAAK,SAAS,EAAC,mBAAmB;QAAA,WAChC;UAAK,SAAS,EAAC,gBAAgB;UAAA,UAC7B;YAAO,SAAS,EAAC,OAAO;YAAA,UACtB,8DAAC,wDAAgB;cAAC,EAAE,EAAC,iBAAiB;cAAC,cAAc,EAAC,YAAY;cAChE,WAAW,EAAC;YAA2B,gBAAE;UAAC,gBACvC;QAAC,gBACL,CAAC,EACN;UAAK,SAAS,EAAC,gBAAgB;UAAA,UAC7B;YAAO,IAAI,EAAC,OAAO;YAAC,EAAE,EAAC,WAAW;YAAC,IAAI,EAAC,WAAW;YAAC,GAAG,EAAC,IAAI;YAAC,GAAG,EAAC,KAAK;YAAC,IAAI,EAAC,IAAI;YAC9E,IAAI,EAAC,mBAAmB;YAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;YAAC,QAAQ,EAAE,IAAI,CAAC;UAAsB,gBAAE;QAAC,gBAC5F,CAAC,EACN;UAAK,SAAS,EAAC,gBAAgB;UAAA,UAC7B;YAAU,EAAE,EAAC,mBAAmB;YAAA,WAC9B;cAAQ,KAAK,EAAC,IAAI;cAAC,KAAK,EAAC;YAAK,gBAAE,CAAC,EACjC;cAAQ,KAAK,EAAC,IAAI;cAAC,KAAK,EAAC;YAAK,gBAAE,CAAC,EACjC;cAAQ,KAAK,EAAC,KAAK;cAAC,KAAK,EAAC;YAAM,gBAAE,CAAC,EACnC;cAAQ,KAAK,EAAC,KAAK;cAAC,KAAK,EAAC;YAAM,gBAAE,CAAC,EACnC;cAAQ,KAAK,EAAC,KAAK;cAAC,KAAK,EAAC;YAAM,gBAAE,CAAC;UAAA,eAC3B;QAAC,gBACR,CAAC;MAAA,eACH,CAAC,EACN;QAAK,SAAS,EAAC;MAAI,gBAAE,CAAC,EACtB;QAAK,SAAS,EAAC,gBAAgB;QAAA,UAC7B;UAAO,SAAS,EAAC,OAAO;UAAA,UACtB,8DAAC,wDAAgB;YAAC,EAAE,EAAC,gBAAgB;YAAC,cAAc,EAAC,WAAW;YAC9D,WAAW,EAAC;UAAkC,gBAAE;QAAC,gBAC9C;MAAC,gBACL,CAAC,EACN;QAAK,SAAS,EAAC,gBAAgB;QAAA,UAC7B;UAAI,SAAS,EAAC,QAAQ;UAAA,WACpB;YAAA,WACE;cAAO,IAAI,EAAC,OAAO;cAAC,EAAE,EAAC,OAAO;cAAC,IAAI,EAAC,aAAa;cAAC,KAAK,EAAC,OAAO;cAC7D,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,OAAQ;cAC3C,QAAQ,EAAE,IAAI,CAAC;YAA0B,gBAAE,CAAC,QAC9C;cAAO,OAAO,EAAC,YAAY;cAAA,WACzB,8DAAC,wDAAgB;gBAAC,EAAE,EAAC,YAAY;gBAAC,cAAc,EAAC,eAAe;gBAC9D,WAAW,EAAC;cAAgD,gBAAC,CAAC,QAClE;YAAA,eAAO,CAAC,EACR;cAAK,SAAS,EAAC,gBAAgB;cAAA,UAC7B;gBAAM,SAAS,EAAC,YAAY;gBAAA,UAC1B,8DAAC,wDAAgB;kBAAC,EAAE,EAAC,sBAAsB;kBAAC,cAAc,EAAC,kCAAkC;kBAC3F,WAAW,EAAC;gBAAkE,gBAAE;cAAC,gBAC/E;YAAC,gBACJ,CAAC;UAAA,GAbA,OAAO,MAcX,CAAC,EACL;YAAA,WACE;cAAO,IAAI,EAAC,OAAO;cAAC,EAAE,EAAC,SAAS;cAAC,IAAI,EAAC,aAAa;cAAC,KAAK,EAAC,SAAS;cACjE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,SAAU;cAC7C,QAAQ,EAAE,IAAI,CAAC;YAA0B,gBAAE,CAAC,QAC9C;cAAO,OAAO,EAAC,cAAc;cAAA,WAC3B,8DAAC,wDAAgB;gBAAC,EAAE,EAAC,cAAc;gBAAC,cAAc,EAAC,eAAe;gBAChE,MAAM,EAAE;kBAAC,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,WAAW,GAAG;gBAAc,CAAE;gBACzD,WAAW,EAAC;cAA6D,gBAAC,CAAC,QAC/E;YAAA,eAAO,CAAC,EACR;cAAK,SAAS,EAAC,gBAAgB;cAAA,UAC7B;gBAAM,SAAS,EAAC,YAAY;gBAAA,UAC1B,8DAAC,wDAAgB;kBAAC,EAAE,EAAC,wBAAwB;kBAAC,cAAc,EAAC,0BAA0B;kBACrF,WAAW,EAAC;gBAAuE,gBAAE;cAAC,gBACpF;YAAC,gBACJ,CAAC;UAAA,GAdA,SAAS,MAeb,CAAC;QAAA,eACH;MAAC,gBACF,CAAC;IAAA,eACH,CAAC;EAEZ;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;;AC1JyB;AACoB;AAEC;AAAA;AAEhC,MAAM,oBAAoB,SAAS,4DAAmB,CAAC;EACpE,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;EAChE;EAEA,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE;IACjC,IAAI,IAAI,IAAI,OAAO,EAAE;MACnB,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,OAAO,CAAC;IAC3C,CAAC,MAAM,IAAI,IAAI,IAAI,OAAO,EAAE;MAC1B,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,OAAO,CAAC;IAC/C;EACF;EAEA,MAAM,GAAG;IACP,OACI;MAAK,SAAS,EAAC,kBAAkB;MAAA,WAC/B;QAAK,SAAS,EAAC,gBAAgB;QAAA,WAC7B;UAAO,OAAO,EAAC,eAAe;UAAA,UAC5B,8DAAC,wDAAgB;YAAC,EAAE,EAAC,qBAAqB;YAAC,cAAc,EAAC,gBAAgB;YACxE,WAAW,EAAC;UAAiC,gBAAE;QAAC,gBAC7C,CAAC,EACR,8DAAC,6DAAQ;UAAC,IAAI,EAAC,OAAO;UAAC,EAAE,EAAC,eAAe;UACvC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UAAC,QAAQ,EAAE,IAAI,CAAC;QAAoB,gBAAE,CAAC;MAAA,eACxE,CAAC,EACN;QAAK,SAAS,EAAC,gBAAgB;QAAA,WAC7B;UAAO,OAAO,EAAC,gBAAgB;UAAA,UAC9B,IAAI,CAAC,KAAK,CAAC,oBAAoB,GAC9B,8DAAC,wDAAgB;YAAC,EAAE,EAAC,0BAA0B;YAAC,cAAc,EAAC,sBAAsB;YACnF,WAAW,EAAC;UAAqC,gBAAE,CAAC,GAEtD,8DAAC,wDAAgB;YAAC,EAAE,EAAC,mCAAmC;YACtD,cAAc,EAAC,uCAAuC;YACtD,WAAW,EAAC;UAAqC,gBAAE;QAAC,gBAEjD,CAAC,EACR,8DAAC,6DAAQ;UAAC,IAAI,EAAC,OAAO;UAAC,EAAE,EAAC,gBAAgB;UACxC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UAClC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,oBAAoB,GAAG,IAAI,CAAC,mBAAmB,GAAG;QAAK,gBAAE,CAAC;MAAA,eAC9E,CAAC;IAAA,eACH,CAAC;EAEZ;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;;;;ACjDyB;AACoB;AAEV;AAEiE;AAAA;AAEtF,MAAM,cAAc,SAAS,4DAAmB,CAAC;EAC9D,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC,kBAAkB;MAAA,WAC/B;QAAK,SAAS,EAAC,mBAAmB;QAAA,WAChC;UAAG,IAAI,EAAE,uDAAgB;UAAC,SAAS,EAAC,aAAa;UAAC,MAAM,EAAC,QAAQ;UAAA,WAC/D;YAAG,SAAS,EAAC,gBAAgB;YAAA,UAAC;UAAK,gBAAG,CAAC,SAAO,gEAAC,wDAAgB;YAAC,EAAE,EAAC,iBAAiB;YAClF,cAAc,EAAC,YAAY;YAAC,WAAW,EAAC;UAAuC,gBAAE,CAAC;QAAA,eACnF,CAAC,EACJ;UAAG,IAAI,EAAE,6DAAsB;UAAC,SAAS,EAAC,aAAa;UAAC,MAAM,EAAC,QAAQ;UAAA,WACrE;YAAG,SAAS,EAAC,gBAAgB;YAAA,UAAC;UAAW,gBAAG,CAAC,SAAO,gEAAC,wDAAgB;YAAC,EAAE,EAAC,uBAAuB;YAC9F,cAAc,EAAC,kBAAkB;YAAC,WAAW,EAAC;UAAsC,gBAAE,CAAC;QAAA,eACxF,CAAC,EACJ;UAAG,IAAI,EAAE,2DAAoB;UAAC,SAAS,EAAC,aAAa;UAAC,MAAM,EAAC,QAAQ;UAAA,WACnE;YAAG,SAAS,EAAC,gBAAgB;YAAA,UAAC;UAAM,gBAAG,CAAC,SAAO,gEAAC,wDAAgB;YAAC,EAAE,EAAC,qBAAqB;YACvF,cAAc,EAAC,gBAAgB;YAAC,WAAW,EAAC;UAAoC,gBAAE,CAAC;QAAA,eACpF,CAAC;MAAA,eACD,CAAC,EACN;QAAK,SAAS,EAAC;MAAI,gBAAE,CAAC,EACtB;QAAK,SAAS,EAAC,mBAAmB;QAAA,WAChC;UAAK,SAAS,EAAC,gBAAgB;UAAA,WAC7B;YAAO,SAAS,EAAC,OAAO;YAAA,UAAC,8DAAC,wDAAgB;cAAC,EAAE,EAAC,cAAc;cAAC,cAAc,EAAC,SAAS;cACnF,WAAW,EAAC;YAA4B,gBAAE;UAAC,gBAAO,CAAC,EACpD,gDAAQ;QAAA,eACN,CAAC,EACN;UAAK,SAAS,EAAC,gBAAgB;UAAA,WAC7B;YAAO,SAAS,EAAC,OAAO;YAAA,UAAC,8DAAC,wDAAgB;cAAC,EAAE,EAAC,WAAW;cAAC,cAAc,EAAC;YAAM,gBAAE;UAAC,gBAAO,CAAC,EACzF,8CAAM,CAAC,UAAU,CAAC,CAAC;QAAA,eACjB,CAAC,EACN;UAAK,SAAS,EAAC,gBAAgB;UAAA,WAC7B;YAAO,SAAS,EAAC,OAAO;YAAA,UAAC,8DAAC,wDAAgB;cAAC,EAAE,EAAC,cAAc;cAAC,cAAc,EAAC,SAAS;cACnF,WAAW,EAAC;YAA4B,gBAAE;UAAC,gBAAO,CAAC,EACpD,IAAI,CAAC,KAAK,CAAC,aAAa;QAAA,eACtB,CAAC,EACN;UAAK,SAAS,EAAC,gBAAgB;UAAA,WAC7B;YAAO,SAAS,EAAC,OAAO;YAAA,UAAC,8DAAC,wDAAgB;cAAC,EAAE,EAAC,sBAAsB;cAAC,cAAc,EAAC;YAAiB,gBAAE;UAAC,gBAAO,CAAC,EAC/G,IAAI,CAAC,KAAK,CAAC,aAAa;QAAA,eACtB,CAAC;MAAA,eACH,CAAC;IAAA,eACH,CAAC;EAEV;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;AClDyB;AAEwB;AAMxB;AAAA;AAE1B,MAAM,WAAW,GAAG,kBAAkB;AACtC,MAAM,QAAQ,GAAG,UAAU;AAC3B,MAAM,SAAS,GAAG,eAAe;AACjC,MAAM,cAAc,GAAG,gBAAgB;AACvC,MAAM,QAAQ,GAAG,4BAA4B;AAI7C,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,0DAAc,CAAC,UAAU,CAAC,0DAAc,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;AAEjH,SAAS,IAAI,CAAC;EAAC,QAAQ;EAAE,SAAS,GAAG;AAAE,CAAC,EAAE;EACxC,OAAO;IAAG,SAAS,EAAE,iBAAiB,GAAG,SAAU;IAAC,eAAY,MAAM;IAAA,UAAE;EAAQ,gBAAI,CAAC;AACvF;AAEA,SAAS,OAAO,CAAC;EAAC;AAAU,CAAC,EAAE;EAC7B,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC;MAAK,SAAS,EAAC,WAAW;MAAA,UAAC;QAAA,UAAM;MAAC,gBAAM;IAAC,gBAAK,CAAC,EAC/C;MAAA,UAAK,UAAU,IAAI;IAAM,gBAAK,CAAC;EAAA,eAC5B,CAAC;AACR;AAEA,SAAS,MAAM,CAAC;EAAC,KAAK;EAAE,IAAI,GAAG;AAAQ,CAAC,EAAE;EACxC,OAAO;IAAQ,SAAS,EAAC,aAAa;IAAA,WACpC;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,kBAAkB;MAAC,OAAO,EAAE,MAAM;QAAE,IAAI,CAAC,0DAAc,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC;MAAE,CAAE;MAAC,cAAW,IAAI;MAAA,UAClI,8DAAC,IAAI;QAAA,UAAC;MAAkB,gBAAM;IAAC,gBACzB,CAAC,EACT;MAAA,UAAK;IAAK,gBAAK,CAAC,EAChB;MAAM,SAAS,EAAC;IAAoB,gBAAE,CAAC;EAAA,eACjC,CAAC;AACX;AAEA,SAAS,KAAK,CAAC;EAAC,IAAI;EAAE,WAAW;EAAE,MAAM;EAAE,KAAK;EAAE,SAAS,GAAG,EAAE;EAAE,GAAG;AAAK,CAAC,EAAE;EAC3E,OAAO;IAAK,SAAS,EAAE,kBAAkB,GAAG,SAAU;IAAA,WACpD;MAAK,SAAS,EAAE,YAAY,IAAI,KAAK,GAAG,UAAU,GAAG,EAAE,CAAE;MAAA,WACtD,IAAI,GAAI,WAAW,GAClB;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,wBAAwB;QAAC,OAAO,EAAE,WAAY;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAE;QAAI,gBAAO;MAAC,gBAAQ,CAAC,GAC3G,8DAAC,IAAI;QAAC,SAAS,EAAC,iBAAiB;QAAA,UAAE;MAAI,gBAAO,CAAC,GAAI,IAAI,EACzD;QAAA,GAAW;MAAK,gBAAG,CAAC,EACnB,MAAM;IAAA,eACJ,CAAC,EACL,KAAK,GAAG;MAAK,SAAS,EAAC,kBAAkB;MAAA,UAAE;IAAK,gBAAM,CAAC,GAAG,IAAI;EAAA,eAC5D,CAAC;AACR;AAEA,SAAS,aAAa,CAAC,KAAK,EAAE;EAC5B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACnD,OAAO,8DAAC,KAAK;IAAA,GAAK,KAAK;IAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,UAAW;IAC3D,MAAM,EAAE;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,kBAAkB;MAAC,OAAO,EAAE,MAAM,UAAU,CAAC,CAAC,OAAO,CAAE;MAC7F,cAAY,OAAO,GAAG,MAAM,GAAG,MAAO;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAE,OAAO,GAAG,YAAY,GAAG;MAAgB,gBAAO;IAAC,gBAAQ;EAAE,gBAAE,CAAC;AAClH;AAEA,SAAS,SAAS,CAAC;EAAC,OAAO;EAAE,QAAQ;EAAE,MAAM,GAAG;AAAQ,CAAC,EAAE;EACzD,OAAO;IAAO,SAAS,EAAC,gBAAgB;IAAA,WACtC;MAAO,IAAI,EAAC,UAAU;MAAC,OAAO,EAAE,OAAQ;MAAC,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;IAAE,gBAAE,CAAC,EACtF;MAAA,WAAO,MAAM,EAAC,GAAC;QAAG,IAAI,EAAC,YAAY;QAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,CAAE;QAAA,UAAC;MAAM,gBAAG,CAAC,OAAG;QAAG,IAAI,EAAC,UAAU;QAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,CAAE;QAAA,UAAC;MAAM,gBAAG,CAAC;IAAA,eAAM,CAAC;EAAA,eACpJ,CAAC;AACV;AAEA,SAAS,KAAK,CAAC;EAAC,OAAO;EAAE;AAAM,CAAC,EAAE;EAChC,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,OAAO,EAAE,OAAO,SAAS;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;IAC7C,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EACzC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACrB,OAAO,OAAO,GAAG;IAAK,SAAS,EAAC,YAAY;IAAC,IAAI,EAAC,QAAQ;IAAA,WAAC,8DAAC,IAAI;MAAA,UAAC;IAAY,gBAAM,CAAC,EAAC,OAAO;EAAA,eAAM,CAAC,GAAG,IAAI;AAC5G;AAIA,SAAS,SAAS,CAAC;EAAC;AAAI,CAAC,EAAE;EACzB,OAAO,IAAI,GAAG;IAAK,SAAS,EAAC,iBAAiB;IAAA,WAAC,8DAAC,IAAI;MAAA,UAAC;IAAa,gBAAM,CAAC,EAAC,IAAI;EAAA,eAAM,CAAC,GAAG,IAAI;AAC9F;AAEA,SAAS,WAAW,CAAC;EAAC;AAAgB,CAAC,EAAE;EACvC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;EACtF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAE7C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI;IACxB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE;MAC/B,QAAQ,CAAC,KAAK,GAAG,gBAAgB,GAAG,QAAQ,CAAC;MAC7C;IACF;IACA,OAAO,CAAC,IAAI,CAAC;IACb,QAAQ,CAAC,EAAE,CAAC;IACZ,IAAI;MACF,MAAM,IAAI,GAAG,MAAM,6DAAa,CAAC,KAAK,CAAC;MAIvC,cAAc,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC;MACnE,cAAc,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC;MACvF,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC;MAC7B,QAAQ,CAAC,OAAO,CAAC;IACnB,CAAC,CAAC,OAAO,GAAG,EAAE;MAGZ,QAAQ,CAAC,mBAAmB,CAAC;IAC/B,CAAC,SAAS;MACR,OAAO,CAAC,KAAK,CAAC;IAChB;EACF,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,cAAc;IAAA,WAClC;MAAQ,SAAS,EAAC,eAAe;MAAC,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,qBAAqB,CAAE;MAAA,UAAC;IAAI,gBAAQ,CAAC,EAC7G;MAAM,SAAS,EAAC,mBAAmB;MAAC,QAAQ,EAAE,MAAO;MAAA,WACnD,8DAAC,OAAO,mBAAE,CAAC,EACX,8DAAC,KAAK;QAAC,KAAK,EAAE,IAAK;QAAC,QAAQ,EAAE,CAAC,IAAI;UAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;UAAE,QAAQ,CAAC,EAAE,CAAC;QAAE,CAAE;QAC5E,WAAW,EAAC,QAAQ;QAAC,YAAY,EAAC,cAAc;QAAC,SAAS,EAAC,IAAI;QAAC,KAAK,EAAE,KAAM;QAAC,SAAS;MAAA,gBAAE,CAAC,EAC5F;QAAQ,SAAS,EAAC,cAAc;QAAC,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAK;QAAA,UAAE,IAAI,GAAG,MAAM,GAAG;MAAM,gBAAS,CAAC;IAAA,eAC5G,CAAC,EACP;MAAQ,SAAS,EAAC,kBAAkB;MAAC,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,qBAAqB,CAAE;MAAA,UAAC;IAAK,gBAAQ,CAAC;EAAA,eAC9G,CAAC;AACR;AAEA,SAAS,KAAK,CAAC;EAAC,UAAU;EAAE,KAAK;EAAE,aAAa;EAAE,OAAO;EAAE,SAAS;EAAE,UAAU;EAAE,cAAc;EAAE,mBAAmB;EAAE;AAAO,CAAC,EAAE;EAC/H,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,KAAK,IAAI,EAAE,CAAC;EACzD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAClD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAIjD,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,OAAO,EAAE;MACZ,mBAAmB,CAAC,IAAI,CAAC;IAC3B;EAEF,CAAC,EAAE,EAAE,CAAC;EAIN,sDAAe,CAAC,MAAM;IACpB,IAAI,UAAU,KAAK,KAAK,IAAI,SAAS,EAAE;MACrC,WAAW,CAAC,EAAE,CAAC;IACjB;EACF,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;EAE3B,MAAM,MAAM,GAAG,CAAC,IAAI;IAClB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,IAAI,aAAa,EAAE;IAC9D,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC;EAC1C,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,8BAA8B;IAAA,WAClD;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,gBAAgB;MAC9C,OAAO,EAAE,MAAM;QAAE,OAAO,IAAI,OAAO,CAAC,CAAC;QAAE,QAAQ,CAAC,QAAQ,CAAC;MAAE,CAAE;MAAA,WAAC,8DAAC,IAAI;QAAA,UAAC;MAAkB,gBAAM,CAAC,QAAI;IAAA,eAAQ,CAAC,EAC5G;MAAM,SAAS,EAAC,mBAAmB;MAAC,QAAQ,EAAE,MAAO;MAAA,WACnD,8DAAC,OAAO;QAAC,UAAU,EAAE;MAAW,gBAAE,CAAC,EACnC,8DAAC,SAAS;QAAC,IAAI,EAAE,UAAU,KAAK,KAAK,GAAG,SAAS,GAAG;MAAG,gBAAE,CAAC,EAC1D,8DAAC,KAAK;QAAC,KAAK,EAAE,OAAQ;QAAC,QAAQ,EAAE,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;QAC/D,WAAW,EAAC,YAAY;QAAC,YAAY,EAAC;MAAU,gBAAE,CAAC,EACrD,8DAAC,aAAa;QAAC,KAAK,EAAE,QAAS;QAAC,QAAQ,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;QACzE,WAAW,EAAC,OAAO;QAAC,YAAY,EAAC;MAAkB,gBAAE,CAAC,EACxD;QAAK,SAAS,EAAC,uBAAuB;QAAA,UAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,kBAAkB;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAE;UAAA,UAAC;QAAI,gBAAQ;MAAC,gBAAK,CAAC,EAC/I;QAAQ,SAAS,EAAC,cAAc;QAAC,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,IAAI,aAAc;QAAA,UAC/G,aAAa,GAAG,MAAM,GAAG;MAAI,gBACxB,CAAC,EACT;QAAG,SAAS,EAAC,aAAa;QAAA,WAAC,QAAM;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,UAAU,CAAE;UAAA,UAAC;QAAI,gBAAQ,CAAC;MAAA,eAAG,CAAC;IAAA,eACzG,CAAC,EACP,8DAAC,SAAS;MAAC,OAAO,EAAE,MAAO;MAAC,QAAQ,EAAE;IAAU,gBAAE,CAAC;EAAA,eAChD,CAAC;AACR;AAEA,SAAS,kBAAkB,GAAG;EAC5B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACtD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAC5C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC,CAAC;EAC9C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACzD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC;EACrD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAE5C,sDAAe,CAAC,MAAM,MAAM,IAAI,IAAI,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;EAE1E,MAAM,UAAU,GAAG,CAAC,IAAI;IACtB,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,EAAE;IACf,IAAI,QAAQ,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;MAC7H,SAAS,CAAC;QAAC,GAAG,MAAM;QAAE,IAAI,EAAE;MAAgC,CAAC,CAAC;MAC9D;IACF;IACA,IAAI,IAAI,EAAE,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;IACvC,OAAO,CAAC;MAAC,IAAI,EAAE,QAAQ,CAAC,IAAI;MAAE,IAAI,EAAE,QAAQ,CAAC,IAAI;MAAE,GAAG,EAAE,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC;MAAE,IAAI,EAAE;IAAQ,CAAC,CAAC;IACvG,SAAS,CAAC;MAAC,GAAG,MAAM;MAAE,IAAI,EAAE;IAAE,CAAC,CAAC;EAClC,CAAC;EAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI;IACxB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,MAAM,IAAI,GAAG,CAAC,CAAC;IACf,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,kBAAkB;IAC1E,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,YAAY;IAC7D,SAAS,CAAC,IAAI,CAAC;IACf,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;IAE9B,aAAa,CAAC,IAAI,CAAC;IACnB,IAAI;MACF,IAAI,aAAa,GAAG,EAAE;MACtB,IAAI,IAAI,EAAE;QACR,MAAM,QAAQ,GAAG,MAAM,gEAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC;QACxE,aAAa,GAAG,QAAQ,CAAC,OAAO;MAClC;MACA,MAAM,IAAI,GAAG,MAAM,uEAAuB,CAAC;QACzC,WAAW,EAAE,UAAU;QACvB,gBAAgB,EAAE,KAAK;QACvB,eAAe,EAAE,aAAa;QAC9B,gBAAgB,EAAE,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI;MAChE,CAAC,CAAC;MAEF,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,sBAAsB,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;MAChF,YAAY,CAAC,IAAI,CAAC;MAClB,QAAQ,CAAC,eAAe,CAAC;IAC3B,CAAC,CAAC,OAAO,GAAG,EAAE;MACZ,SAAS,CAAC;QAAC,GAAG,IAAI;QAAE,IAAI,EAAE,GAAG,CAAC,OAAO,IAAI;MAAY,CAAC,CAAC;IACzD,CAAC,SAAS;MACR,aAAa,CAAC,KAAK,CAAC;IACtB;EACF,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,WAAW;IAAA,WAC/B,8DAAC,MAAM;MAAC,KAAK,EAAC;IAAM,gBAAE,CAAC,EACvB;MAAM,SAAS,EAAC,kCAAkC;MAAA,WAChD;QAAI,SAAS,EAAC,YAAY;QAAA,WACxB;UAAI,SAAS,EAAE,SAAS,GAAG,EAAE,GAAG,QAAS;UAAA,WAAC;YAAA,UAAM;UAAC,gBAAM,CAAC;YAAA,UAAG;UAAM,gBAAG,CAAC;QAAA,eAAI,CAAC,EAC1E;UAAA,WAAI;YAAA,UAAM;UAAC,gBAAM,CAAC;YAAA,UAAG;UAAI,gBAAG,CAAC;QAAA,eAAI,CAAC,EAClC;UAAI,SAAS,EAAE,SAAS,GAAG,QAAQ,GAAG,EAAG;UAAA,WAAC;YAAA,UAAM;UAAC,gBAAM,CAAC;YAAA,UAAG;UAAI,gBAAG,CAAC;QAAA,eAAI,CAAC;MAAA,eACtE,CAAC,EACL;QAAM,SAAS,EAAC,WAAW;QAAC,QAAQ,EAAE,MAAO;QAAA,WAC3C,8DAAC,SAAS;UAAC,IAAI,EAAE,MAAM,CAAC;QAAK,gBAAE,CAAC,EAChC;UAAO,SAAS,EAAC,YAAY;UAAA,UAAC;QAAQ,gBAAO,CAAC,EAC9C,8DAAC,KAAK;UAAC,KAAK,EAAE,UAAW;UAAC,QAAQ,EAAE,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAE;UACpH,WAAW,EAAC,gBAAgB;UAAC,SAAS,EAAC,IAAI;UAAC,IAAI,EAAC,iBAAiB;UAAC,KAAK,EAAE,MAAM,CAAC,UAAW;UAC5F,WAAW,EAAE,MAAM,QAAQ,CAAC,gBAAgB;QAAE,gBAAE,CAAC,EACnD;UAAG,SAAS,EAAC,WAAW;UAAA,UAAC;QAAiB,gBAAG,CAAC,EAE9C;UAAO,SAAS,EAAC,YAAY;UAAA,WAAC,SAAO;YAAA,UAAM;UAAE,gBAAM,CAAC;QAAA,eAAO,CAAC,EAC5D;UAAO,SAAS,EAAE,aAAa,IAAI,MAAM,CAAC,IAAI,GAAG,UAAU,GAAG,EAAE,CAAE;UAAA,WAChE;YAAO,IAAI,EAAC,MAAM;YAAC,MAAM,EAAC,iDAAiD;YAAC,QAAQ,EAAE;UAAW,gBAAE,CAAC,EACnG,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,GAAG;YAAK,GAAG,EAAE,IAAI,CAAC,GAAI;YAAC,GAAG,EAAC;UAAQ,gBAAE,CAAC,GAAG,8DAAC,IAAI;YAAA,UAAC;UAAmB,gBAAM,CAAC,EACjH;YAAA,UAAS,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG;UAAU,gBAAS,CAAC,EAChD;YAAA,UAAO;UAA4B,gBAAO,CAAC;QAAA,eACtC,CAAC,EACP,IAAI,GAAG;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,kBAAkB;UAAC,OAAO,EAAE,MAAM;YAAE,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC;UAAE,CAAE;UAAA,UAAC;QAAI,gBAAQ,CAAC,GAAG,IAAI,EAChJ,MAAM,CAAC,IAAI,GAAG;UAAK,SAAS,EAAC,kBAAkB;UAAA,UAAE,MAAM,CAAC;QAAI,gBAAM,CAAC,GAAG,IAAI,EAE3E;UAAO,SAAS,EAAC,YAAY;UAAA,WAAC,OAAK;YAAA,UAAM;UAAE,gBAAM,CAAC;QAAA,eAAO,CAAC,EAC1D,8DAAC,KAAK;UAAC,IAAI,EAAC,cAAc;UAAC,KAAK,EAAE,KAAM;UAAC,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;UAC/E,WAAW,EAAC,SAAS;UAAC,IAAI,EAAC,OAAO;UAAC,KAAK,EAAE,MAAM,CAAC;QAAM,gBAAE,CAAC,EAC5D;UAAG,SAAS,EAAC,WAAW;UAAA,UAAC;QAAa,gBAAG,CAAC,EAC1C;UAAQ,SAAS,EAAC,cAAc;UAAC,IAAI,EAAC,QAAQ;UAAC,QAAQ,EAAE,SAAS,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,EAAG;UAAA,UAC1G,SAAS,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG;QAAM,gBAC3C,CAAC,EACT;UAAG,SAAS,EAAC,kBAAkB;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAQ,gBAAM,CAAC,aAAS,EAAC,UAAU,EAAC,WAAS;QAAA,eAAG,CAAC;MAAA,eACnF,CAAC;IAAA,eACH,CAAC,EACP,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAClD,CAAC;AACR;AAIA,SAAS,kBAAkB,GAAG;EAC5B,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACxD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACzD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAE5C,MAAM,QAAQ,GAAG,CAAC,IAAI;IACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5E,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK;MAAC,IAAI,EAAE,IAAI,CAAC,IAAI;MAAE,GAAG,EAAE,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;MAAE,IAAI,EAAE;IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;EAC5G,CAAC;EACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI;IACxB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;IACxC,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM,GAAG,GAAG,EAAE;MAC/B,QAAQ,CAAC,qBAAqB,CAAC;MAC/B;IACF;IACA,aAAa,CAAC,IAAI,CAAC;IACnB,IAAI;MACF,MAAM,iBAAiB,GAAG,EAAE;MAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,MAAM,QAAQ,GAAG,MAAM,gEAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,uBAAuB,CAAC;QAC3E,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;MAC1C;MACA,MAAM,yEAAyB,CAAC;QAC9B,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/B,gBAAgB,EAAE,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE;QAChE,mBAAmB,EAAE;MACvB,CAAC,CAAC;MACF,QAAQ,CAAC,eAAe,CAAC;MACzB,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;MACpD,cAAc,CAAC,EAAE,CAAC;MAAE,QAAQ,CAAC,EAAE,CAAC;MAAE,QAAQ,CAAC,EAAE,CAAC;IAChD,CAAC,CAAC,OAAO,GAAG,EAAE;MACZ,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,YAAY,CAAC;IACvC,CAAC,SAAS;MACR,aAAa,CAAC,KAAK,CAAC;IACtB;EACF,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,wBAAwB;IAAA,WAC5C,8DAAC,MAAM;MAAC,KAAK,EAAC;IAAM,gBAAE,CAAC,EACvB;MAAM,SAAS,EAAC,kCAAkC;MAAA,UAChD;QAAM,SAAS,EAAC,WAAW;QAAC,QAAQ,EAAE,MAAO;QAAA,WAC3C;UAAO,SAAS,EAAC,YAAY;UAAA,UAAC;QAAI,gBAAO,CAAC,EAC1C;UAAU,KAAK,EAAE,WAAY;UAAC,SAAS,EAAC,KAAK;UAAC,QAAQ,EAAE,CAAC,IAAI;YAAE,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,QAAQ,CAAC,EAAE,CAAC;UAAE,CAAE;UAC7G,WAAW,EAAC,4CAA4C;UAAC,SAAS,EAAE,KAAK,GAAG,SAAS,GAAG;QAAG,gBAAE,CAAC,EAChG;UAAK,SAAS,EAAC,cAAc;UAAA,WAAE,WAAW,CAAC,MAAM,EAAC,MAAI;QAAA,eAAK,CAAC,EAC3D,KAAK,GAAG;UAAK,SAAS,EAAC,kBAAkB;UAAA,UAAE;QAAK,gBAAM,CAAC,GAAG,IAAI,EAC/D;UAAO,SAAS,EAAC,YAAY;UAAA,WAAC,KAAG,EAAC,KAAK,CAAC,MAAM,EAAC,KAAG;QAAA,eAAO,CAAC,EAC1D;UAAK,SAAS,EAAC,sBAAsB;UAAA,WAClC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK;YAAK,SAAS,EAAC,iBAAiB;YAAA,WAC1D;cAAK,GAAG,EAAE,IAAI,CAAC,GAAI;cAAC,GAAG,EAAE,IAAI,CAAC;YAAK,gBAAE,CAAC,EACtC;cAAQ,IAAI,EAAC,QAAQ;cAAC,OAAO,EAAE,MAAM;gBAAE,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;cAAE,CAAE;cAAC,cAAW,MAAM;cAAA,UAAC,8DAAC,IAAI;gBAAA,UAAC;cAAK,gBAAM;YAAC,gBAAQ,CAAC;UAAA,GAFrG,IAAI,CAAC,GAAG,MAGrE,CAAC,CAAC,EACN,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG;YAAO,SAAS,EAAC,qBAAqB;YAAA,WAAC;cAAO,IAAI,EAAC,MAAM;cAAC,QAAQ;cAAC,MAAM,EAAC,iCAAiC;cAAC,QAAQ,EAAE;YAAS,gBAAE,CAAC,gEAAC,IAAI;cAAA,UAAC;YAAY,gBAAM,CAAC;cAAA,UAAM;YAAI,gBAAM,CAAC;UAAA,eAAO,CAAC,GAAG,IAAI;QAAA,eAC5M,CAAC,EACN;UAAQ,SAAS,EAAC,cAAc;UAAC,IAAI,EAAC,QAAQ;UAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,IAAI,UAAW;UAAA,UAAE,UAAU,GAAG,MAAM,GAAG;QAAI,gBAAS,CAAC;MAAA,eACxI;IAAC,gBACH,CAAC,EACP,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAClD,CAAC;AACR;AAIA,SAAS,kBAAkB,CAAC;EAAC,KAAK;EAAE,KAAK,GAAG,UAAU;EAAE,WAAW;EAAE;AAAO,CAAC,EAAE;EAC7E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC;EAC/C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC7C,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,OAAO,EAAE,OAAO,SAAS;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;IACnE,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EACzC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;EAEb,MAAM,KAAK,GAAG,YAAY;IACxB,IAAI,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;IAClD,OAAO,CAAC,IAAI,CAAC;IACb,IAAI;MACF,MAAM,IAAI,GAAG,MAAM,uEAAuB,CAAC,KAAK,EAAE,KAAK,CAAC;MACxD,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;MAC9B,UAAU,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC;IAC7C,CAAC,CAAC,OAAO,GAAG,EAAE;MACZ,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;MAC5C,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE;QAClD,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC;MAC7C;MACA,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE;QAE3C,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;MACvC;IACF,CAAC,SAAS;MACR,OAAO,CAAC,KAAK,CAAC;IAChB;EACF,CAAC;EAED,OAAO;IAAQ,IAAI,EAAC,QAAQ;IAAC,SAAS,EAAC,kBAAkB;IAAC,QAAQ,EAAE,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAE;IAAC,OAAO,EAAE,KAAM;IAAA,UAC9H,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG,IAAI,GAAG,MAAM,GAAG;EAAO,gBAChD,CAAC;AACX;AAMA,SAAS,QAAQ,CAAC;EAAC,SAAS;EAAE,UAAU;EAAE;AAAmB,CAAC,EAAE;EAC9D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC;IAAC,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,EAAE;IAAE,IAAI,EAAE,EAAE;IAAE,QAAQ,EAAE,EAAE;IAAE,MAAM,EAAE;EAAE,CAAC,CAAC;EACrG,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACxD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACjD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC,CAAC;EAC9C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACzD,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC;IAAC,GAAG,IAAI;IAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;EAAK,CAAC,CAAC;EACpE,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK;EAS/B,sDAAe,CAAC,MAAM;IACpB,IAAI,UAAU,KAAK,KAAK,IAAI,SAAS,EAAE,aAAa,CAAC,KAAK,CAAC;EAC7D,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;EAE3B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI;IACxB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,MAAM,IAAI,GAAG,CAAC,CAAC;IACf,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,GAAG,eAAe;IAClE,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,sBAAsB;IAC7F,IAAI,UAAU,EAAE;MACd,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,aAAa;MAC1D,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,KACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,YAAY;IAC/D,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;MACvC,IAAI,CAAC,MAAM,GAAG,mBAAmB;IACnC;IACA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,UAAU;IACxD,SAAS,CAAC,IAAI,CAAC;IACf,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;IAE9B,aAAa,CAAC,IAAI,CAAC;IACnB,IAAI;MACF,IAAI,UAAU,EAAE;QACd,MAAM,QAAQ,GAAG,MAAM,kEAAkB,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC;QASjE,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,IAAK,KAAK,GAAG,IAAI,CAAC,KAAM;QAC3D,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,EAKnE;UAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;UAAE,KAAK,EAAE,IAAI,CAAC,KAAK;UAAE,WAAW,EAAE,IAAI,CAAC,MAAM,IAAI;QAAE,CAAC,EAClF;UAAC,IAAI,EAAE,KAAK;UAAE,GAAG,EAAE,IAAI,CAAC,KAAK;UAAE,IAAI,EAAE,QAAQ,CAAC,kBAAkB;UAAE,MAAM,EAAE;YAAC,YAAY,EAAE;UAAW;QAAC,CAAC,CAAC;MAC3G,CAAC,MAAM;QACL,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAC7D;UAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ;UAAE,KAAK,EAAE,EAAE;UAAE,WAAW,EAAE,IAAI,CAAC;QAAM,CAAC,EAAE,IAAI,CAAC;MACzE;IAOF,CAAC,CAAC,OAAO,GAAG,EAAE;MACZ,SAAS,CAAC;QAAC,GAAG,IAAI;QAAE,IAAI,EAAE,GAAG,CAAC,OAAO,IAAI;MAAW,CAAC,CAAC;MACtD,aAAa,CAAC,KAAK,CAAC;IACtB;EACF,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,iCAAiC;IAAA,WACrD;MAAM,SAAS,EAAC,sCAAsC;MAAC,QAAQ,EAAE,MAAO;MAAA,WACtE,8DAAC,OAAO;QAAC,UAAU,EAAE,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI;MAAO,gBAAE,CAAC,EAC3E,8DAAC,SAAS;QAAC,IAAI,EAAE,UAAU,KAAK,KAAK,GAAG,SAAS,GAAG;MAAG,gBAAE,CAAC,EAC1D,8DAAC,KAAK;QAAC,KAAK,EAAE,IAAI,CAAC,QAAS;QAAC,QAAQ,EAAE,CAAC,IAAI,OAAO,CAAC;UAAC,GAAG,IAAI;UAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE;QAAC,CAAC,CAAE;QAC9H,WAAW,EAAC,QAAQ;QAAC,KAAK,EAAE,MAAM,CAAC,QAAS;QAAC,YAAY,EAAC;MAAU,gBAAE,CAAC,EACzE,8DAAC,KAAK;QAAC,KAAK,EAAE,IAAI,CAAC,KAAM;QAAC,QAAQ,EAAE,CAAC,IAAI,OAAO,CAAC;UAAC,GAAG,IAAI;UAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE;QAAC,CAAC,CAAE;QACjH,WAAW,EAAC,QAAQ;QAAC,KAAK,EAAE,MAAM,CAAC,KAAM;QAAC,SAAS,EAAC;MAAS,gBAAE,CAAC,EAClE,8DAAC,KAAK;QAAC,KAAK,EAAE,IAAI,CAAC,IAAK;QAAC,QAAQ,EAAE,CAAC,IAAI,OAAO,CAAC;UAAC,GAAG,IAAI;UAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAAC,CAAC,CAAE;QAC9G,WAAW,EAAC,UAAU;QAAC,SAAS,EAAC,SAAS;QAAC,KAAK,EAAE,MAAM,CAAC,IAAK;QAC9D,MAAM,EAAE,8DAAC,kBAAkB;UAAC,KAAK,EAAE,IAAI,CAAC,KAAM;UAAC,KAAK,EAAC,UAAU;UAAC,WAAW,EAAE,cAAe;UAC1F,OAAO,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC,KAAK;YAAC,GAAG,CAAC;YAAE,IAAI,EAAE;UAAG,CAAC,CAAC;QAAE,gBAAE;MAAE,gBAAE,CAAC,EAC/D,8DAAC,aAAa;QAAC,KAAK,EAAE,IAAI,CAAC,QAAS;QAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAE;QAAC,WAAW,EAAC,OAAO;QAAC,YAAY,EAAC,cAAc;QAAC,KAAK,EAAE,MAAM,CAAC;MAAS,gBAAE,CAAC,EAC7I,8DAAC,KAAK;QAAC,KAAK,EAAE,IAAI,CAAC,MAAO;QAAC,QAAQ,EAAE,CAAC,IAAI,OAAO,CAAC;UAAC,GAAG,IAAI;UAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAAC,CAAC,CAAE;QACzH,WAAW,EAAC,aAAa;QAAC,KAAK,EAAE,MAAM,CAAC;MAAO,gBAAE,CAAC,EACpD;QAAQ,SAAS,EAAC,cAAc;QAAC,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,IAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,IAAI,UAAW;QAAA,UACjI,UAAU,GAAG,MAAM,GAAG;MAAI,gBACrB,CAAC,EACT;QAAG,SAAS,EAAC,aAAa;QAAA,WAAC,YAAU;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAE;UAAA,UAAC;QAAE,gBAAQ,CAAC;MAAA,eAAG,CAAC;IAAA,eACxG,CAAC,EACP,8DAAC,SAAS;MAAC,OAAO,EAAE,MAAO;MAAC,QAAQ,EAAE,SAAU;MAAC,MAAM,EAAC;IAAS,gBAAE,CAAC;EAAA,eACjE,CAAC;AACR;AAEA,SAAS,aAAa,GAAG;EACvB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC;IAAC,KAAK,EAAE,EAAE;IAAE,IAAI,EAAE,EAAE;IAAE,QAAQ,EAAE,EAAE;IAAE,OAAO,EAAE;EAAE,CAAC,CAAC;EACxF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACxD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACzD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC;IAAC,GAAG,IAAI;IAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;EAAK,CAAC,CAAC;EAEpE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI;IACxB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,QAAQ,CAAC,aAAa,CAAC;IAC9D,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,QAAQ,CAAC,gBAAgB,CAAC;IAMjF,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,QAAQ,CAAC,UAAU,CAAC;IACzD,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,EAAE,OAAO,QAAQ,CAAC,YAAY,CAAC;IAEjE,aAAa,CAAC,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC;IACZ,IAAI;MACF,MAAM,QAAQ,GAAG,MAAM,uEAAuB,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC;MACtE,MAAM,oEAAoB,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC;MAC/D,QAAQ,CAAC,cAAc,CAAC;MACxB,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC;IAClD,CAAC,CAAC,OAAO,GAAG,EAAE;MACZ,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,WAAW,CAAC;MACpC,aAAa,CAAC,KAAK,CAAC;IACtB;EACF,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,wBAAwB;IAAA,WAC5C,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC;IAAO,gBAAE,CAAC,EACpC;MAAM,SAAS,EAAC,qDAAqD;MAAA,UACnE;QAAM,SAAS,EAAC,gBAAgB;QAAC,QAAQ,EAAE,MAAO;QAAA,WAChD;UAAA,WAAO;YAAA,UAAM;UAAG,gBAAM,CAAC;YAAO,KAAK,EAAE,IAAI,CAAC,KAAM;YAAC,QAAQ,EAAE,CAAC,IAAI,OAAO,CAAC;cAAC,GAAG,IAAI;cAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE;YAAC,CAAC,CAAE;YAAC,WAAW,EAAC,QAAQ;YAAC,SAAS,EAAC;UAAS,gBAAE,CAAC;QAAA,eAAO,CAAC,EAC9L;UAAA,WAAO;YAAA,UAAM;UAAG,gBAAM,CAAC;YAAO,KAAK,EAAE,IAAI,CAAC,IAAK;YAAC,QAAQ,EAAE,CAAC,IAAI,OAAO,CAAC;cAAC,GAAG,IAAI;cAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAAC,CAAC,CAAE;YAAC,WAAW,EAAC,QAAQ;YAAC,SAAS,EAAC;UAAS,gBAAE,CAAC,EACjL,8DAAC,kBAAkB;YAAC,KAAK,EAAE,IAAI,CAAC,KAAM;YAAC,KAAK,EAAC,gBAAgB;YAAC,WAAW,EAAE,cAAe;YAAC,OAAO,EAAE;UAAS,gBAAE,CAAC;QAAA,eAAO,CAAC,EAC1H;UAAK,SAAS,EAAC;QAAe,gBAAE,CAAC,EACjC;UAAA,WAAO;YAAA,UAAM;UAAI,gBAAM,CAAC;YAAO,IAAI,EAAC,UAAU;YAAC,KAAK,EAAE,IAAI,CAAC,QAAS;YAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAE;YAAC,WAAW,EAAC;UAAQ,gBAAE,CAAC;QAAA,eAAO,CAAC,EAClI;UAAA,WAAO;YAAA,UAAM;UAAI,gBAAM,CAAC;YAAO,IAAI,EAAC,UAAU;YAAC,KAAK,EAAE,IAAI,CAAC,OAAQ;YAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAE;YAAC,WAAW,EAAC;UAAS,gBAAE,CAAC;QAAA,eAAO,CAAC,EAChI,KAAK,GAAG;UAAK,SAAS,EAAC,iBAAiB;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC,EAAC,KAAK;QAAA,eAAM,CAAC,GAAG,IAAI,EACxF;UAAQ,SAAS,EAAC,iCAAiC;UAAC,IAAI,EAAC,QAAQ;UAC/D,QAAQ,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,UAAW;UAAA,UACpF,UAAU,GAAG,MAAM,GAAG;QAAM,gBACvB,CAAC;MAAA,eACL;IAAC,gBACH,CAAC,EACP,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAClD,CAAC;AACR;AAKA,MAAM,oBAAoB,GAAG,0BAA0B;AAEvD,SAAS,aAAa,CAAC;EAAC,aAAa;EAAE;AAAU,CAAC,EAAE;EAMlD,MAAM,IAAI,GAAG,UAAU,IAAI,UAAU,CAAC,EAAE;EACxC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACpD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACxD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC1C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC;EAC/C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAE5C,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,OAAO,EAAE,OAAO,SAAS;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;IACnE,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EACzC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;EAEb,MAAM,WAAW,GAAG,wDAAiB,CAAC,YAAY;IAChD,OAAO,CAAC,IAAI,CAAC;IACb,QAAQ,CAAC,EAAE,CAAC;IACZ,IAAI;MACF,MAAM,IAAI,GAAG,MAAM,uEAAuB,CAAC,oBAAoB,CAAC;MAChE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;MACjC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;MAC7B,UAAU,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC;IAC7C,CAAC,CAAC,OAAO,GAAG,EAAE;MACZ,QAAQ,CAAC,GAAG,CAAC,MAAM,KAAK,mBAAmB,GAAG,iBAAiB,GAAI,GAAG,CAAC,OAAO,IAAI,SAAU,CAAC;MAM7F,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE;QAClD,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC;MAC7C;MACA,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE;QAC3C,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;MAC1C;MACA,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE;QACzC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;MACtC;IACF,CAAC,SAAS;MACR,OAAO,CAAC,KAAK,CAAC;IAChB;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,sDAAe,CAAC,MAAM;IAAE,WAAW,CAAC,CAAC;EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;EAExD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI;IACxB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,EAAE;IAC/C,OAAO,CAAC,IAAI,CAAC;IACb,IAAI;MACF,MAAM,IAAI,GAAG,MAAM,uEAAuB,CAAC,WAAW,EAAE,IAAI,CAAC;MAC7D,cAAc,CAAC,OAAO,CAAC,kBAAkB,GAAG,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;MACvF,QAAQ,CAAC,sBAAsB,EAAE,IAAI,GAAG;QAAC,EAAE,EAAE;MAAI,CAAC,GAAG,SAAS,CAAC;IACjE,CAAC,CAAC,OAAO,GAAG,EAAE;MACZ,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAClC,CAAC,SAAS;MACR,OAAO,CAAC,KAAK,CAAC;IAChB;EACF,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,iDAAiD;IAAA,WACrE,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAE,aAAa,GAAG,UAAU,GAAG;IAAQ,gBAAE,CAAC,EACnE;MAAM,SAAS,EAAC,qDAAqD;MAAA,UACnE;QAAM,SAAS,EAAC,gBAAgB;QAAC,QAAQ,EAAE,MAAO;QAAA,WAChD;UAAA,WAAO;YAAA,UAAM;UAAG,gBAAM,CAAC;YAAO,KAAK,EAAE,SAAU;YAAC,QAAQ;YAAC,WAAW,EAAC;UAAM,gBAAE,CAAC;QAAA,eAAO,CAAC,EACtF;UAAA,WAAO;YAAA,UAAM;UAAG,gBAAM,CAAC,EACrB;YAAO,KAAK,EAAE,IAAK;YAAC,QAAQ,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE;YAAC,WAAW,EAAC,QAAQ;YAAC,SAAS,EAAC;UAAS,gBAAE,CAAC,EACtI;YAAQ,IAAI,EAAC,QAAQ;YAAC,SAAS,EAAC,kBAAkB;YAAC,QAAQ,EAAE,IAAI,IAAI,OAAO,GAAG,CAAE;YAAC,OAAO,EAAE,WAAY;YAAA,UACpG,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG;UAAO,gBAChC,CAAC;QAAA,eACJ,CAAC,EACP,KAAK,GAAG;UAAK,SAAS,EAAC,kBAAkB;UAAA,UAAE;QAAK,gBAAM,CAAC,GAAG,IAAI,EAC/D;UAAQ,SAAS,EAAC,iCAAiC;UAAC,IAAI,EAAC,QAAQ;UAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAK;UAAA,UAAC;QAAE,gBAAQ,CAAC;MAAA,eAC9G;IAAC,gBACH,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,QAAQ,CAAC;EAAC,aAAa,GAAG;AAAK,CAAC,EAAE;EAIzC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,SAAS,CAAC;EACrD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACtD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC9D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC1C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAE7C,sDAAe,CAAC,MAAM;IACpB,iEAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MAC/B,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;MACtB,aAAa,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;MACrC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,UAAU,CAAC;MAAE,SAAS,CAAC,YAAY,CAAC;IAAE,CAAC,CAAC;EACpF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAM,QAAQ,GAAG,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,UAAU;EAEjE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI;IACxB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;MAC9D,QAAQ,CAAC,oBAAoB,CAAC;MAAE;IAClC;IACA,OAAO,CAAC,IAAI,CAAC;IACb,IAAI;MAGF,MAAM,IAAI,GAAG,MAAM,8DAAc,CAAC;QAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,OAAO;QAAE,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC;MAAC,CAAC,CAAC;MAC3G,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;MACnC,QAAQ,CAAC,EAAE,CAAC;IACd,CAAC,CAAC,OAAO,GAAG,EAAE;MACZ,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,YAAY,CAAC;IACvC,CAAC,SAAS;MACR,OAAO,CAAC,KAAK,CAAC;IAChB;EACF,CAAC;EAED,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,YAAY,EAAE;IACnD,OAAO;MAAK,SAAS,EAAC,8BAA8B;MAAA,WAAC,8DAAC,MAAM;QAAC,KAAK,EAAC,MAAM;QAAC,IAAI,EAAE,aAAa,GAAG,UAAU,GAAG;MAAQ,gBAAE,CAAC,EACtH;QAAG,SAAS,EAAC,mBAAmB;QAAC,KAAK,EAAE;UAAC,MAAM,EAAE;QAAW,CAAE;QAAA,UAAE,MAAM,KAAK,YAAY,GAAI,KAAK,IAAI,UAAU,GAAI;MAAM,gBAAI,CAAC;IAAA,eAC1H,CAAC;EACR;EAEA,OAAO;IAAK,SAAS,EAAC,8BAA8B;IAAA,WAClD,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAE,aAAa,GAAG,UAAU,GAAG;IAAQ,gBAAE,CAAC,EACnE;MAAK,SAAS,EAAC,oBAAoB;MAAA,WAAC;QAAA,WAAK;UAAA,UAAQ;QAAI,gBAAQ,CAAC;UAAA,UAAM;QAAS,gBAAM,CAAC;MAAA,eAAK,CAAC,gEAAC,IAAI;QAAA,UAAC;MAAa,gBAAM,CAAC;IAAA,eAAK,CAAC,EAC1H;MAAM,SAAS,EAAC,uBAAuB;MAAA,WACrC;QAAA,UAAK,MAAM,KAAK,UAAU,GAAG,MAAM,GAAG;MAAe,gBAAK,CAAC,EAC3D;QAAM,QAAQ,EAAE,MAAO;QAAA,WACrB;UAAA,WAAO;YAAA,UAAM;UAAE,gBAAM,CAAC;YAAO,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,UAAW;YAAC,QAAQ,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;YAAC,QAAQ,EAAE,CAAC,QAAS;YAAC,WAAW,EAAC;UAAS,gBAAE,CAAC;QAAA,eAAO,CAAC,EAC/J;UAAA,WAAO;YAAA,UAAM;UAAI,gBAAM,CAAC;YAAO,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,cAAe;YAAC,QAAQ,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;YAAC,QAAQ,EAAE,CAAC,QAAS;YAAC,WAAW,EAAC;UAAS,gBAAE,CAAC;QAAA,eAAO,CAAC,EAC5K,KAAK,GAAG;UAAK,SAAS,EAAC,kBAAkB;UAAA,UAAE;QAAK,gBAAM,CAAC,GAAG,IAAI,EAC/D;UAAQ,SAAS,EAAC,cAAc;UAAC,IAAI,EAAC,QAAQ;UAAC,QAAQ,EAAE,CAAC,QAAQ,IAAI,IAAK;UAAA,UACxE,MAAM,KAAK,UAAU,GAAG,KAAK,GAAG,MAAM,KAAK,SAAS,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG;QAAI,gBAC9E,CAAC;MAAA,eACL,CAAC,EACP;QAAG,SAAS,EAAC,mBAAmB;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAI,gBAAM,CAAC,8BAA0B;MAAA,eAAG,CAAC;IAAA,eAC5E,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,gBAAgB,GAAG;EAC1B,OAAO;IAAK,SAAS,EAAC,8BAA8B;IAAA,WAClD;MAAK,SAAS,EAAC,gBAAgB;MAAA,WAAC;QAAA,UAAI;MAAE,gBAAI,CAAC;QAAK,SAAS,EAAC,kBAAkB;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAM,gBAAM,CAAC,MAAE;MAAA,eAAK,CAAC,EAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK;QAAK,SAAS,EAAC,eAAe;QAAA,WAAY;UAAA,UAAO,IAAI,CAAC,CAAC;QAAC,gBAAO,CAAC;UAAA,WAAK;YAAA,UAAI;UAAI,gBAAI,CAAC;YAAA,UAAQ,CAAC,GAAG,UAAU,GAAG;UAAW,gBAAQ,CAAC;QAAA,eAAK,CAAC;MAAA,GAAjG,IAAI,MAAkG,CAAC,CAAC;IAAA,eAAM,CAAC,EAC9S;MAAK,SAAS,EAAC,qBAAqB;MAAA,UAClC;QAAK,SAAS,EAAC,YAAY;QAAA,WAAC;UAAA,UAAI;QAAM,gBAAI,CAAC;UAAA,UAAG;QAA8B,gBAAG,CAAC;UAAQ,SAAS,EAAC,cAAc;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,UAAU,CAAE;UAAA,UAAC;QAAK,gBAAQ,CAAC;MAAA,eAAK;IAAC,gBACvK,CAAC;EAAA,eACH,CAAC;AACR;AAEA,SAAS,mBAAmB,CAAC;EAAC,aAAa;EAAE;AAAU,CAAC,EAAE;EAKxD,MAAM,IAAI,GAAG,UAAU,IAAI,UAAU,CAAC,EAAE;EACxC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACxC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAE7C,MAAM,OAAO,GAAG,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC;EACzL,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI;IACxB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;MAAE,QAAQ,CAAC,aAAa,CAAC;MAAE;IAAQ;IAC9D,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,kBAAkB,GAAG,oBAAoB,CAAC;IAChF,MAAM,WAAW,GAAG,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,YAAY;IAC7D,IAAI,CAAC,WAAW,EAAE;MAAE,QAAQ,CAAC,iBAAiB,CAAC;MAAE;IAAQ;IACzD,OAAO,CAAC,IAAI,CAAC;IACb,IAAI;MACF,MAAM,MAAM,GAAG,MAAM,sEAAsB,CAAC,GAAG,EAAE,YAAY,EAAE,WAAW,CAAC;MAC3E,cAAc,CAAC,UAAU,CAAC,kBAAkB,GAAG,oBAAoB,CAAC;MACpE,MAAM,CAAC,EAAE,CAAC;MAWV,MAAM,WAAW,GAAG,MAAM,IAAI,MAAM,CAAC,mBAAmB;MACxD,IAAI,WAAW,IAAI,IAAI,KAAK,QAAQ,EAAE;QACpC,IAAI;UACF,MAAM,OAAO,GAAG,MAAM,4DAAY,CAAC,CAAC;UACpC,MAAM,+DAAe,CAAC,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC;UAC1D,QAAQ,CAAC,EAAE,CAAC;UAAE,QAAQ,CAAC,UAAU,CAAC;UAClC,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,eAAe,CAAC,EAAE,GAAG,CAAC;UACvD;QACF,CAAC,CAAC,OAAO,SAAS,EAAE;UAElB,QAAQ,CAAC,mBAAmB,IAAI,SAAS,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC;UAC9D,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC;UACzD;QACF;MACF;MACA,IAAI,IAAI,KAAK,SAAS,EAAE;QAKtB,QAAQ,CAAC,EAAE,CAAC;QAAE,QAAQ,CAAC,uBAAuB,CAAC;QAC/C,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,mBAAmB,EAAE;UAAC,EAAE,EAAE;QAAS,CAAC,CAAC,EAAE,GAAG,CAAC;QAC5E;MACF;MACA,QAAQ,CAAC,EAAE,CAAC;MAAE,QAAQ,CAAC,UAAU,CAAC;IACpC,CAAC,CAAC,OAAO,GAAG,EAAE;MACZ,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,gBAAgB,CAAC;IAC3C,CAAC,SAAS;MACR,OAAO,CAAC,KAAK,CAAC;IAChB;EACF,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,WAAW;IAAA,WAC/B,8DAAC,MAAM;MAAC,KAAK,EAAC,EAAE;MAAC,IAAI,EAAE,aAAa,GAAG,UAAU,GAAG;IAAQ,gBAAE,CAAC,EAC/D;MAAM,SAAS,EAAC,kBAAkB;MAAA,WAChC;QAAA,UAAI;MAAM,gBAAI,CAAC,EACf;QAAK,SAAS,EAAC,gBAAgB;QAAC,eAAY,MAAM;QAAA,UAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI;UAAA,UAAe,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG;QAAE,GAArB,CAAC,OAA2B,CAAC;MAAC,gBAAM,CAAC,EACvH;QAAO,SAAS,EAAC,gBAAgB;QAAC,IAAI,EAAC,MAAM;QAAC,KAAK,EAAE,GAAI;QAAC,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE;QAAC,SAAS,EAAC,SAAS;QAAC,YAAY,EAAC,KAAK;QAAC,cAAW,QAAQ;QAAC,SAAS;MAAA,gBAAE,CAAC,EACtM,KAAK,GAAG;QAAK,SAAS,EAAC,kBAAkB;QAAA,UAAE;MAAK,gBAAM,CAAC,GAAG,IAAI,EAC/D;QAAQ,SAAS,EAAC,cAAc;QAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,IAAK;QAAC,OAAO,EAAE,MAAO;QAAA,UAAE,IAAI,GAAG,MAAM,GAAG;MAAI,gBAAS,CAAC;IAAA,eACjH,CAAC,EACP,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAClD,CAAC;AACR;AAEe,SAAS,kBAAkB,CAAC;EACzC,IAAI;EAAE,UAAU;EAAE,gBAAgB;EAAE,aAAa,GAAG,KAAK;EACzD,KAAK;EAAE,aAAa;EAAE,OAAO;EAAE,SAAS;EAAE,UAAU;EACpD,cAAc;EAAE,mBAAmB;EAAE,mBAAmB;EAAE;AAC5D,CAAC,EAAE;EACD,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE;EACjE,QAAQ,IAAI;IACV,KAAK,QAAQ;MAAE,OAAO,8DAAC,WAAW;QAAC,gBAAgB,EAAE,gBAAgB,KAAK,MAAM,CAAC,CAAC;MAAE,gBAAE,CAAC;IACvF,KAAK,OAAO;MAAE,OAAO,8DAAC,KAAK;QAAC,UAAU,EAAE,UAAW;QAAC,KAAK,EAAE,KAAM;QAAC,aAAa,EAAE,aAAc;QAAC,OAAO,EAAE,OAAQ;QAC/G,SAAS,EAAE,SAAU;QAAC,UAAU,EAAE,UAAW;QAAC,cAAc,EAAE,cAAe;QAAC,mBAAmB,EAAE,mBAAoB;QAAC,OAAO,EAAE;MAAQ,gBAAE,CAAC;IAC9I,KAAK,qBAAqB;MAAE,OAAO,8DAAC,kBAAkB,mBAAE,CAAC;IACzD,KAAK,qBAAqB;MAAE,OAAO,8DAAC,kBAAkB,mBAAE,CAAC;IACzD,KAAK,UAAU;MAAE,OAAO,8DAAC,QAAQ;QAAC,SAAS,EAAE,SAAU;QAAC,UAAU,EAAE,UAAW;QAAC,mBAAmB,EAAE;MAAoB,gBAAE,CAAC;IAC5H,KAAK,OAAO;MAAE,OAAO,8DAAC,aAAa,mBAAE,CAAC;IACtC,KAAK,gBAAgB;MAAE,OAAO,8DAAC,aAAa;QAAC,aAAa,EAAE,aAAc;QAAC,UAAU,EAAE;MAAW,gBAAE,CAAC;IACrG,KAAK,UAAU;MAAE,OAAO,8DAAC,QAAQ;QAAC,aAAa,EAAE;MAAc,gBAAE,CAAC;IAClE,KAAK,mBAAmB;MAAE,OAAO,8DAAC,QAAQ;QAAC,aAAa,EAAE;MAAc,gBAAE,CAAC;IAC3E,KAAK,mBAAmB;MAAE,OAAO,8DAAC,gBAAgB,mBAAE,CAAC;IACrD,KAAK,sBAAsB;MAAE,OAAO,8DAAC,mBAAmB;QAAC,aAAa,EAAE,aAAc;QAAC,UAAU,EAAE;MAAW,gBAAE,CAAC;IACjH;MAAS,OAAO,8DAAC,WAAW;QAAC,gBAAgB,EAAE,gBAAgB,KAAK,MAAM,CAAC,CAAC;MAAE,gBAAE,CAAC;EACnF;AACF,C;;;;;;;;;;;;;;;;;;;;ACrxB0B;AAEwB;AAAA;AAElD,MAAM,QAAQ,GAAG,IAAI,IAAI,0DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;AAEjD,MAAM,qBAAqB,GAAG,CACnC,cAAc,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAC1E,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAC9D,uBAAuB,EAAE,mBAAmB,EAAE,4BAA4B,EAC1E,gBAAgB,CACjB;AAED,MAAM,IAAI,GAAG;EAAC,IAAI,EAAE,IAAI;EAAE,MAAM,EAAE;AAAiB,CAAC;AAEpD,MAAM,YAAY,GAAG,CACnB;EAAC,EAAE,EAAE,CAAC;EAAE,IAAI,EAAE,OAAO;EAAE,SAAS,EAAE,UAAU;EAAE,KAAK,EAAE,WAAW;EAAE,KAAK,EAAE,KAAK;EAAE,IAAI,EAAE;AAAU,CAAC,EACjG;EAAC,EAAE,EAAE,CAAC;EAAE,IAAI,EAAE,OAAO;EAAE,SAAS,EAAE,UAAU;EAAE,KAAK,EAAE,UAAU;EAAE,KAAK,EAAE,KAAK;EAAE,IAAI,EAAE;AAAU,CAAC,EAChG;EAAC,EAAE,EAAE,CAAC;EAAE,IAAI,EAAE,OAAO;EAAE,SAAS,EAAE,UAAU;EAAE,KAAK,EAAE,QAAQ;EAAE,KAAK,EAAE,KAAK;EAAE,IAAI,EAAE;AAAU,CAAC,EAC9F;EAAC,EAAE,EAAE,CAAC;EAAE,IAAI,EAAE,OAAO;EAAE,SAAS,EAAE,UAAU;EAAE,KAAK,EAAE,MAAM;EAAE,KAAK,EAAE,MAAM;EAAE,IAAI,EAAE;AAAW,CAAC,EAC9F;EAAC,EAAE,EAAE,CAAC;EAAE,IAAI,EAAE,OAAO;EAAE,SAAS,EAAE,UAAU;EAAE,KAAK,EAAE,UAAU;EAAE,KAAK,EAAE,YAAY;EAAE,IAAI,EAAE;AAAO,CAAC,CACrG;AAED,SAAS,IAAI,CAAC;EAAC;AAAQ,CAAC,EAAE;EAAE,OAAO;IAAG,SAAS,EAAC,gBAAgB;IAAC,eAAY,MAAM;IAAA,UAAE;EAAQ,gBAAI,CAAC;AAAE;AAEpG,SAAS,KAAK,CAAC;EAAC,OAAO;EAAE;AAAM,CAAC,EAAE;EAChC,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,OAAO,EAAE,OAAO,SAAS;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;IAC7C,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EACzC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACrB,OAAO,OAAO,GAAG;IAAK,SAAS,EAAC,YAAY;IAAC,IAAI,EAAC,QAAQ;IAAA,UAAE;EAAO,gBAAM,CAAC,GAAG,IAAI;AACnF;AAEA,SAAS,UAAU,CAAC;EAAC,KAAK,GAAG;AAAK,CAAC,EAAE;EACnC,OAAO;IAAM,SAAS,EAAE,qBAAqB,IAAI,KAAK,GAAG,QAAQ,GAAG,EAAE,CAAE;IAAA,UAAC;MAAK,GAAG,EAAE,IAAI,CAAC,MAAO;MAAC,GAAG,EAAC;IAAE,gBAAE;EAAC,gBAAM,CAAC;AAClH;AAEA,SAAS,UAAU,CAAC;EAAC,UAAU;EAAE,KAAK,GAAG;AAAK,CAAC,EAAE;EAC/C,OAAO;IAAQ,SAAS,EAAE,qBAAqB,IAAI,KAAK,GAAG,QAAQ,GAAG,EAAE,CAAE;IAAA,WACxE;MAAQ,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,UAAW;MAAC,cAAW,OAAO;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAmB,gBAAM;IAAC,gBAAQ,CAAC,EACvG;MAAA,UAAM;IAAO,gBAAM,CAAC,EACpB;MAAQ,IAAI,EAAC,QAAQ;MAAC,cAAW,QAAQ;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAS,gBAAM;IAAC,gBAAQ,CAAC;EAAA,eACnE,CAAC;AACX;AAEA,SAAS,OAAO,CAAC;EAAC,IAAI;EAAE,KAAK;EAAE,MAAM;EAAE,MAAM;EAAE;AAAO,CAAC,EAAE;EACvD,OAAO;IAAQ,IAAI,EAAC,QAAQ;IAAC,SAAS,EAAE,cAAc,IAAI,MAAM,GAAG,SAAS,GAAG,EAAE,CAAC,IAAI,MAAM,GAAG,SAAS,GAAG,EAAE,CAAE;IAAC,OAAO,EAAE,OAAQ;IAAA,WAAC;MAAA,UAAM,8DAAC,IAAI;QAAA,UAAE;MAAI,gBAAO;IAAC,gBAAM,CAAC;MAAA,UAAQ;IAAK,gBAAQ,CAAC;EAAA,eAAQ,CAAC;AACnM;AAEA,SAAS,WAAW,GAAG;EACrB,OAAO;IAAK,SAAS,EAAC,mBAAmB;IAAA,WACvC;MAAA,WAAQ;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,eAAe,CAAE;QAAC,cAAW,MAAM;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAkB,gBAAM;MAAC,gBAAQ,CAAC;QAAA,UAAI;MAAE,gBAAI,CAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,gBAAgB,CAAE;QAAC,cAAW,MAAM;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAc,gBAAM;MAAC,gBAAQ,CAAC;IAAA,eAAQ,CAAC,EAC7Q;MAAA,WAAM;QAAG,SAAS,EAAC,WAAW;QAAA,UAAC;MAAI,gBAAG,CAAC,EAAC,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC,KAAM;QAAe,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,oBAAoB,GAAG,oBAAoB,CAAE;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAE,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,MAAM,GAAG;QAAU,gBAAO,CAAC;UAAA,WAAM;YAAA,UAAS,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,MAAM,GAAG;UAAM,gBAAS,CAAC;YAAA,UAAQ,IAAI,CAAC;UAAK,gBAAQ,CAAC;QAAA,eAAM,CAAC;UAAA,UAAO,IAAI,CAAC;QAAI,gBAAO,CAAC,gEAAC,IAAI;UAAA,UAAE,IAAI,CAAC,SAAS,KAAK,UAAU,GAAG,eAAe,GAAG;QAAW,gBAAO,CAAC;MAAA,GAAvW,IAAI,CAAC,EAAE,MAAwW,CAAC,CAAC;IAAA,eAAO,CAAC,EAC7f;MAAA,WAAQ;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,oBAAoB,CAAE;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAI,gBAAM,CAAC;UAAA,UAAM;QAAI,gBAAM,CAAC;MAAA,eAAQ,CAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,oBAAoB,CAAE;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAQ,gBAAM,CAAC;UAAA,UAAM;QAAI,gBAAM,CAAC;MAAA,eAAQ,CAAC;IAAA,eAAQ,CAAC;EAAA,eAClP,CAAC;AACR;AAEA,SAAS,YAAY,CAAC;EAAC;AAAO,CAAC,EAAE;EAC/B,OAAO;IAAK,SAAS,EAAC,6CAA6C;IAAA,WACjE;MAAK,SAAS,EAAC;IAAc,gBAAE,CAAC,EAChC,8DAAC,UAAU;MAAC,UAAU,EAAE,MAAM,QAAQ,CAAC,gBAAgB;IAAE,gBAAE,CAAC,EAC5D;MAAM,SAAS,EAAC,gBAAgB;MAAA,WAAC,8DAAC,UAAU,mBAAE,CAAC;QAAA,UAAK,IAAI,CAAC;MAAI,gBAAK,CAAC;QAAA,UAAG;MAAS,gBAAG,CAAC;QAAM,SAAS,EAAC,mBAAmB;QAAA,WAAC,oFAAI,CAAC,sFAAI,CAAC,sFAAI,CAAC;MAAA,eAAM,CAAC;IAAA,eAAM,CAAC,EACpJ;MAAQ,SAAS,EAAC,uBAAuB;MAAA,WAAC,8DAAC,OAAO;QAAC,IAAI,EAAC,UAAU;QAAC,KAAK,EAAC,IAAI;QAAC,MAAM;QAAC,OAAO,EAAE,MAAM;UAAC,OAAO,CAAC,SAAS,CAAC;UAAE,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,cAAc,CAAC,EAAE,GAAG,CAAC;QAAC;MAAE,gBAAE,CAAC,gEAAC,OAAO;QAAC,IAAI,EAAC,UAAU;QAAC,KAAK,EAAC,IAAI;QAAC,MAAM;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,mBAAmB;MAAE,gBAAE,CAAC;IAAA,eAAQ,CAAC;EAAA,eACtR,CAAC;AACR;AAEA,SAAS,cAAc,CAAC,OAAO,EAAE;EAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;EACjE,OAAO,GAAG,IAAI,IAAI,CAAC,OAAO,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;AAChE;AAEA,SAAS,SAAS,CAAC;EAAC,IAAI;EAAE;AAAO,CAAC,EAAE;EAClC,MAAM,OAAO,GAAG,IAAI,KAAK,oBAAoB;EAC7C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC;EAC9D,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,qDAAc,CAAC,IAAI,KAAK,kBAAkB,CAAC;EACjE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,KAAK,oBAAoB,CAAC;EAC3E,sDAAe,CAAC,MAAM;IACpB,IAAI,OAAO,EAAE,OAAO,SAAS;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,UAAU,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;IAC5E,OAAO,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;EAC1C,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;EACb,MAAM,MAAM,GAAG,MAAM;IAAC,OAAO,CAAC,OAAO,GAAG,OAAO,GAAG,QAAQ,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;IAAE,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,cAAc,CAAC,EAAE,GAAG,CAAC;EAAC,CAAC;EAC9I,OAAO;IAAK,SAAS,EAAC,oCAAoC;IAAA,WACxD;MAAK,SAAS,EAAC;IAAc,gBAAE,CAAC,EAChC,8DAAC,UAAU;MAAC,UAAU,EAAE,MAAM,QAAQ,CAAC,gBAAgB;IAAE,gBAAE,CAAC,EAC5D;MAAM,SAAS,EAAC,gBAAgB;MAAA,WAAC,8DAAC,UAAU,mBAAE,CAAC;QAAA,UAAK,IAAI,CAAC;MAAI,gBAAK,CAAC;QAAA,UAAI,OAAO,GAAG,WAAW,GAAG,cAAc,CAAC,OAAO;MAAC,gBAAI,CAAC,EAAC,CAAC,OAAO,GAAG;QAAO,SAAS,EAAC,cAAc;QAAA,WAAC,oFAAI,CAAC,QAAI;MAAA,eAAO,CAAC,GAAG;QAAM,SAAS,EAAC,mBAAmB;QAAA,WAAC,oFAAI,CAAC,sFAAI,CAAC,sFAAI,CAAC;MAAA,eAAM,CAAC;IAAA,eAAO,CAAC,EAC5P,OAAO,GAAG;MAAQ,SAAS,EAAC,oBAAoB;MAAA,UAAC,8DAAC,OAAO;QAAC,IAAI,EAAC,UAAU;QAAC,KAAK,EAAC,IAAI;QAAC,MAAM;QAAC,OAAO,EAAE;MAAO,gBAAE;IAAC,gBAAQ,CAAC,GAAG;MAAQ,SAAS,EAAC,sBAAsB;MAAA,WAAC,8DAAC,OAAO;QAAC,IAAI,EAAE,GAAG,GAAG,KAAK,GAAG,SAAU;QAAC,KAAK,EAAE,GAAG,GAAG,KAAK,GAAG,OAAQ;QAAC,MAAM,EAAE,GAAI;QAAC,OAAO,EAAE,MAAM;UAAC,MAAM,CAAC,CAAC,GAAG,CAAC;UAAE,OAAO,CAAC,GAAG,GAAG,QAAQ,GAAG,QAAQ,CAAC;QAAC;MAAE,gBAAE,CAAC,gEAAC,OAAO;QAAC,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,SAAU;QAAC,KAAK,EAAE,OAAO,GAAG,KAAK,GAAG,IAAK;QAAC,MAAM,EAAE,OAAQ;QAAC,OAAO,EAAE,MAAM;UAAC,UAAU,CAAC,CAAC,OAAO,CAAC;UAAE,OAAO,CAAC,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;QAAC;MAAE,gBAAE,CAAC,gEAAC,OAAO;QAAC,IAAI,EAAC,UAAU;QAAC,KAAK,EAAC,IAAI;QAAC,MAAM;QAAC,OAAO,EAAE;MAAO,gBAAE,CAAC;IAAA,eAAQ,CAAC;EAAA,eACtjB,CAAC;AACR;AAEA,SAAS,aAAa,CAAC;EAAC,SAAS;EAAE;AAAO,CAAC,EAAE;EAC3C,IAAI,OAAO,EAAE,OAAO;IAAK,SAAS,EAAC,gBAAgB;IAAA,WAAC,8DAAC,UAAU,mBAAE,CAAC;MAAA,UAAQ;IAAQ,gBAAQ,CAAC;MAAA,UAAO;IAAQ,gBAAO,CAAC;EAAA,eAAK,CAAC;EACxH,IAAI,SAAS,EAAE,OAAO;IAAK,SAAS,EAAC,sBAAsB;IAAA,WAAC,8DAAC,UAAU,mBAAE,CAAC;MAAA,UAAQ;IAAM,gBAAQ,CAAC;EAAA,eAAK,CAAC;EACvG,OAAO;IAAK,SAAS,EAAC,qBAAqB;IAAC,GAAG,EAAC,iBAAiB;IAAC,GAAG,EAAC;EAAQ,gBAAE,CAAC;AACnF;AAEA,SAAS,SAAS,CAAC;EAAC,IAAI;EAAE;AAAO,CAAC,EAAE;EAClC,MAAM,OAAO,GAAG,IAAI,KAAK,oBAAoB,IAAI,IAAI,KAAK,uBAAuB;EACjF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,IAAI,KAAK,uBAAuB,CAAC;EAC5E,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAC1C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC;EAC/D,MAAM,OAAO,GAAG,IAAI,KAAK,4BAA4B;EACrD,sDAAe,CAAC,MAAM;IACpB,IAAI,OAAO,EAAE,OAAO,SAAS;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,UAAU,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;IAC5E,OAAO,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;EAC1C,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;EACb,MAAM,MAAM,GAAG,MAAM;IAAC,OAAO,CAAC,OAAO,GAAG,SAAS,GAAG,UAAU,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;IAAE,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,cAAc,CAAC,EAAE,GAAG,CAAC;EAAC,CAAC;EAClJ,OAAO;IAAK,SAAS,EAAC,oCAAoC;IAAA,WACxD,8DAAC,aAAa;MAAC,SAAS,EAAE,OAAO,IAAI,CAAC,MAAO;MAAC,OAAO,EAAE;IAAQ,gBAAE,CAAC,EAClE;MAAK,SAAS,EAAC;IAAkB,gBAAE,CAAC,EACpC,8DAAC,UAAU;MAAC,KAAK;MAAC,UAAU,EAAE,MAAM,QAAQ,CAAC,gBAAgB;IAAE,gBAAE,CAAC,EAClE;MAAK,SAAS,EAAC,mBAAmB;MAAA,WAAC;QAAA,UAAK,IAAI,CAAC;MAAI,gBAAK,CAAC;QAAA,UAAI,OAAO,GAAG,WAAW,GAAG,cAAc,CAAC,OAAO;MAAC,gBAAI,CAAC;IAAA,eAAK,CAAC,EACpH,CAAC,OAAO,GAAG;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,oBAAoB;MAAC,cAAW,QAAQ;MAAA,WAAC;QAAK,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAAC,MAAO;QAAC,GAAG,EAAC;MAAE,gBAAE,CAAC,EAAC,CAAC,MAAM,GAAG,8DAAC,IAAI;QAAA,UAAC;MAAY,gBAAM,CAAC,GAAG,IAAI;IAAA,eAAS,CAAC,GAAG,IAAI,EAC9M;MAAQ,SAAS,EAAC,qBAAqB;MAAA,WAAC,8DAAC,OAAO;QAAC,IAAI,EAAC,qBAAqB;QAAC,KAAK,EAAC,IAAI;QAAC,OAAO,EAAE,MAAM,OAAO,CAAC,QAAQ;MAAE,gBAAE,CAAC,gEAAC,OAAO;QAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,cAAe;QAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,OAAQ;QAAC,MAAM,EAAE,MAAO;QAAC,OAAO,EAAE,MAAM;UAAC,SAAS,CAAC,CAAC,MAAM,CAAC;UAAE,OAAO,CAAC,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;QAAC;MAAE,gBAAE,CAAC,gEAAC,OAAO;QAAC,IAAI,EAAC,UAAU;QAAC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,IAAK;QAAC,MAAM;QAAC,OAAO,EAAE;MAAO,gBAAE,CAAC,EAAC,CAAC,OAAO,GAAG,8DAAC,OAAO;QAAC,IAAI,EAAE,GAAG,GAAG,KAAK,GAAG,SAAU;QAAC,KAAK,EAAE,GAAG,GAAG,KAAK,GAAG,OAAQ;QAAC,MAAM,EAAE,GAAI;QAAC,OAAO,EAAE,MAAM,MAAM,CAAC,CAAC,GAAG;MAAE,gBAAE,CAAC,GAAG,IAAI;IAAA,eAAS,CAAC;EAAA,eAC7gB,CAAC;AACR;AAEA,SAAS,aAAa,CAAC;EAAC;AAAO,CAAC,EAAE;EAChC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,OAAO;IAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;IAAE,CAAC,EAAE;EAAG,CAAC,CAAC,CAAC;EAC1G,MAAM,IAAI,GAAG,mDAAY,CAAC,IAAI,CAAC;EAC/B,MAAM,aAAa,GAAG,KAAK,IAAI;IAAC,IAAI,CAAC,OAAO,GAAG;MAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC;MAAE,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAC;IAAC,CAAC;IAAE,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;EAAC,CAAC;EACvK,MAAM,aAAa,GAAG,KAAK,IAAI;IAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;IAAQ,WAAW,CAAC;MAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;MAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,GAAG,GAAG,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAAC,CAAC,CAAC;EAAC,CAAC;EAClP,OAAO;IAAK,SAAS,EAAC,qBAAqB;IAAA,WAAC;MAAQ,SAAS,EAAC,0BAA0B;MAAA,WAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,eAAe,CAAE;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAkB,gBAAM;MAAC,gBAAQ,CAAC;QAAA,WAAK;UAAA,UAAQ;QAAE,gBAAQ,CAAC;UAAA,UAAO;QAAE,gBAAO,CAAC;MAAA,eAAK,CAAC;QAAQ,IAAI,EAAC,QAAQ;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAS,gBAAM;MAAC,gBAAQ,CAAC;IAAA,eAAQ,CAAC;MAAA,WAAM;QAAG,SAAS,EAAC,WAAW;QAAA,UAAC;MAAQ,gBAAG,CAAC;QAAK,SAAS,EAAC,2BAA2B;QAAA,UAAC;MAAgB,gBAAK,CAAC;IAAA,eAAM,CAAC;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,sBAAsB;MAAC,KAAK,EAAE;QAAC,SAAS,EAAE,aAAa,QAAQ,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC;MAAK,CAAE;MAAC,aAAa,EAAE,aAAc;MAAC,aAAa,EAAE,aAAc;MAAC,WAAW,EAAE,MAAM;QAAC,IAAI,CAAC,OAAO,GAAG,IAAI;MAAC,CAAE;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,mBAAmB,CAAE;MAAC,cAAW,QAAQ;MAAA,WAAC;QAAK,GAAG,EAAC,iBAAiB;QAAC,GAAG,EAAC;MAAU,gBAAE,CAAC;QAAA,WAAM,oFAAI,CAAC,SAAK;MAAA,eAAM,CAAC;IAAA,eAAQ,CAAC;MAAQ,SAAS,EAAC,oBAAoB;MAAA,WAAC;QAAO,WAAW,EAAC;MAAM,gBAAE,CAAC;QAAQ,IAAI,EAAC,QAAQ;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAkB,gBAAM;MAAC,gBAAQ,CAAC;IAAA,eAAQ,CAAC;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,kBAAkB;MAAC,OAAO,EAAE,MAAM;QAAC,OAAO,CAAC,OAAO,CAAC;QAAE,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,cAAc,CAAC,EAAE,GAAG,CAAC;MAAC,CAAE;MAAC,cAAW,MAAM;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAQ,gBAAM;IAAC,gBAAQ,CAAC;EAAA,eAAK,CAAC;AACjmC;AAEe,SAAS,kBAAkB,CAAC;EAAC;AAAI,CAAC,EAAE;EACjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,IAAI,OAAO;EACX,IAAI,IAAI,KAAK,cAAc,EAAE,OAAO,GAAG,8DAAC,WAAW,mBAAE,CAAC,CAAC,KAClD,IAAI,IAAI,KAAK,eAAe,EAAE,OAAO,GAAG,8DAAC,YAAY;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC5E,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,OAAO,GAAG,8DAAC,SAAS;IAAC,IAAI,EAAE,IAAK;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC1F,IAAI,IAAI,KAAK,gBAAgB,EAAE,OAAO,GAAG,8DAAC,aAAa;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC9E,OAAO,GAAG,8DAAC,SAAS;IAAC,IAAI,EAAE,IAAK;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC;EAC3D,OAAO;IAAA,WAAG,OAAO,EAAC,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAAE,CAAC;AAC5E,C;;;;;;;;;;;;;;;;;;;;;;;;;ACxI0B;AACI;AACM;AAEc;AAMxB;AACiE;AAAA;AAI3F,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK;EAC9B,IAAI,IAAI,GAAG,0DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;EACrE,IAAI,GAAG,GAAG,GAAG,0DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,0DAAc,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC;EACtG,0DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;AACjC,CAAC;AAEM,MAAM,wBAAwB,GAAG,CACtC,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,sBAAsB,EACpG,qBAAqB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,iBAAiB,EAClF,yBAAyB,EAAE,uBAAuB,EAAE,YAAY,EAAE,eAAe,EACjF,oBAAoB,CACrB;AAKD,SAAS,YAAY,CAAC,IAAI,EAAE;EAC1B,MAAM,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG;EACxC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;IACvB,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC;EACzB;EACA,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;IACpB,MAAM,MAAM,GAAG,kDAAM,CAAC,EAAE,EAAE;MAAC,OAAO,EAAE,OAAO;MAAE,QAAQ,EAAE;IAAM,CAAC,CAAC;IAC/D,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,GAAG;EAC3D;EACA,OAAO,GAAG;AACZ;AAEA,SAAS,IAAI,CAAC;EAAC;AAAQ,CAAC,EAAE;EAAE,OAAO;IAAG,SAAS,EAAC,gBAAgB;IAAC,eAAY,MAAM;IAAA,UAAE;EAAQ,gBAAI,CAAC;AAAE;AAEpG,SAAS,MAAM,CAAC;EAAC,KAAK;EAAE,IAAI,GAAG,eAAe;EAAE,OAAO;EAAE,KAAK;EAAE;AAAO,CAAC,EAAE;EACxE,OAAO;IAAQ,SAAS,EAAC,eAAe;IAAA,WAAC;MAAQ,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,MAAM;QAAE,IAAI,CAAC,0DAAc,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;MAAE,CAAE;MAAC,cAAW,IAAI;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAkB,gBAAM;IAAC,gBAAQ,CAAC;MAAA,UAAK;IAAK,gBAAK,CAAC,EAAC,KAAK,GAAG;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,MAAM;MAAC,OAAO,EAAE,OAAQ;MAAA,UAAE;IAAK,gBAAS,CAAC,GAAG,uFAAO,CAAC;EAAA,eAAS,CAAC;AAC3T;AAIA,SAAS,MAAM,CAAC;EAAC,MAAM;EAAE;AAAI,CAAC,EAAE;EAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,cAAc;EAC9C,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAC1C,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,MAAM,EAAE;MAAE,MAAM,CAAC,IAAI,CAAC;MAAE,OAAO,SAAS;IAAE;IAC/C,IAAI,IAAI,GAAG,IAAI;IACf,0DAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,OAAO,MAAM;MAAE,IAAI,GAAG,KAAK;IAAE,CAAC;EAChC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;EACZ,OAAO;IAAM,SAAS,EAAC,eAAe;IAAA,UAAE,GAAG,GAAG;MAAK,GAAG,EAAE,GAAI;MAAC,GAAG,EAAC;IAAE,gBAAE,CAAC,GAAG,8DAAC,IAAI;MAAA,UAAE,IAAI,IAAI;IAAQ,gBAAO;EAAC,gBAAO,CAAC;AAClH;AAEA,SAAS,KAAK,CAAC;EAAC,OAAO;EAAE;AAAM,CAAC,EAAE;EAChC,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,OAAO,EAAE,OAAO,SAAS;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;IAC7C,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EACzC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACrB,OAAO,OAAO,GAAG;IAAK,SAAS,EAAC,YAAY;IAAC,IAAI,EAAC,QAAQ;IAAA,UAAE;EAAO,gBAAM,CAAC,GAAG,IAAI;AACnF;AAEA,SAAS,MAAM,CAAC;EAAC,KAAK;EAAE,QAAQ;EAAE,WAAW;EAAE;AAAQ,CAAC,EAAE;EACxD,OAAO;IAAO,SAAS,EAAC,eAAe;IAAA,WAAC,8DAAC,IAAI;MAAA,UAAC;IAAM,gBAAM,CAAC;MAAO,KAAK,EAAE,KAAM;MAAC,QAAQ,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAE;MAC9H,SAAS,EAAE,KAAK,IAAI;QAAE,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,QAAQ,EAAE,QAAQ,CAAC,CAAC;MAAE,CAAE;MAAC,WAAW,EAAE;IAAY,gBAAE,CAAC;EAAA,eAAO,CAAC;AACpH;AAIA,SAAS,MAAM,CAAC;EAAC,OAAO;EAAE,OAAO;EAAE;AAAO,CAAC,EAAE;EAC3C,MAAM,GAAG,GAAG,mDAAY,CAAC,IAAI,CAAC;EAC9B,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE;IAC9B,GAAG,CAAC,OAAO,CAAC,SAAS,GAAG,EAAE;IAC1B,IAAI,iDAAM,CAAC,GAAG,CAAC,OAAO,EAAE;MAAC,IAAI,EAAE,OAAO;MAAE,KAAK,EAAE,GAAG;MAAE,MAAM,EAAE,GAAG;MAAE,YAAY,EAAE,8DAAmB,CAAC;IAAC,CAAC,CAAC;EACxG,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;EACb,OAAO;IAAS,SAAS,EAAC,gBAAgB;IAAA,WACxC;MAAK,SAAS,EAAC,mBAAmB;MAAA,WAAC,8DAAC,MAAM;QAAC,MAAM,EAAE;MAAQ,gBAAE,CAAC;QAAA,WAAM;UAAA,UAAU,OAAO,IAAI,OAAO,CAAC,YAAY,IAAK;QAAE,gBAAS,CAAC,EAC5H;UAAA,UAAQ,OAAO,IAAI,OAAO,CAAC,cAAc,GAAG,KAAK,GAAG,OAAO,CAAC,cAAc,GAAG;QAAE,gBAAQ,CAAC;MAAA,eAAM,CAAC;IAAA,eAAK,CAAC,EACvG;MAAK,SAAS,EAAC,eAAe;MAAC,GAAG,EAAE;IAAI,gBAAE,CAAC,EAC1C,OAAO,GAAG;MAAA,UAAG;IAAQ,gBAAG,CAAC,GAAG;MAAA,UAAG;IAAe,gBAAG,CAAC,EACnD;MAAA,UAAO;IAAY,gBAAO,CAAC;EAAA,eACpB,CAAC;AACZ;AAEA,SAAS,WAAW,CAAC;EAAC,QAAQ;EAAE;AAAe,CAAC,EAAE;EAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAQ5C,MAAM,eAAe,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,IAAI;EAC/D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAO,eAAe,IAAI,uEAAc,CAAC,eAAe,CAAC,IAAK,EAAE,CAAC;EAC9G,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC;EACzD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAM,EAAE,eAAe,IAAI,uEAAc,CAAC,eAAe,CAAC,CAAC,CAAC;EAGzG,MAAM,CAAC,SAAS,CAAC,GAAG,sEAAa,CAAC,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,IAAI,EAAE,wDAAY,EAAE,CAAC,QAAQ,CAAC,CAAC;EACtG,MAAM,kBAAkB,GAAG,SAAS,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,cAAc,IACxF,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK;EAC3C,sDAAe,CAAC,MAAM;IAGpB,6DAAa,CAAC,MAAM,IAAI,0DAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MAC3D,IAAI,eAAe,EAAE;QAAE,wEAAe,CAAC,eAAe,EAAE,IAAI,CAAC;MAAE;MAC/D,UAAU,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACnD,6DAAa,CAAC,MAAM,IAAI,iEAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CACrE,IAAI,CAAC,IAAI,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EAC/D,CAAC,EAAE,EAAE,CAAC;EACN,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;EAClG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,KAAK;IAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC;IAC1D,OAAO;MAAC,GAAG,MAAM;MAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI;IAAC,CAAC;EAC7D,CAAC,EAAE,CAAC,CAAC,CAAC;EACN,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;EAC7C,MAAM,OAAO,GAAG,CACd;IAAC,IAAI,EAAE,gBAAgB;IAAE,KAAK,EAAE,KAAK;IAAE,KAAK,EAAE,iBAAiB;IAAE,KAAK,EAAE,YAAY,IAAI,IAAI;IAAE,IAAI,EAAE;EAAM,CAAC,EAC3G;IAAC,IAAI,EAAE,OAAO;IAAE,KAAK,EAAE,IAAI;IAAE,KAAK,EAAE,YAAY;IAAE,IAAI,EAAE;EAAO,CAAC,EAChE;IAAC,IAAI,EAAE,gBAAgB;IAAE,KAAK,EAAE,MAAM;IAAE,KAAK,EAAE,eAAe;IAAE,IAAI,EAAE,QAAQ;IAAE,aAAa,EAAE;EAAI,CAAC,EACpG;IAAC,IAAI,EAAE,eAAe;IAAE,KAAK,EAAE,MAAM;IAAE,KAAK,EAAE,iBAAiB;IAAE,IAAI,EAAE;EAAK,CAAC,CAC9E;EACD,MAAM,QAAQ,GAAG,GAAG,IAAI;IACtB,MAAM,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,GAAG,GAAG,CAAC;IACzD,IAAI,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC;MAAC,QAAQ,EAAE,QAAQ;MAAE,KAAK,EAAE;IAAO,CAAC,CAAC;EACjE,CAAC;EAID,MAAM,SAAS,GAAG,IAAI,IAAI;IACxB,IAAI,IAAI,CAAC,aAAa,IAAI,kBAAkB,IAAI,eAAe,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC,KAChG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;EAC3B,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,aAAa;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,KAAK;MAAC,KAAK,EAAC,IAAI;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,YAAY;IAAE,gBAAE,CAAC,gEAAC,MAAM;MAAC,KAAK,EAAE,KAAM;MAAC,QAAQ,EAAE,QAAS;MAAC,WAAW,EAAC;IAAO,gBAAE,CAAC,EAC1K;MAAM,SAAS,EAAC,eAAe;MAAA,WAC7B;QAAS,SAAS,EAAC,mBAAmB;QAAA,UAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI;UAAQ,IAAI,EAAC,QAAQ;UAAkB,OAAO,EAAE,MAAM,SAAS,CAAC,IAAI,CAAE;UAAA,WAAC,8DAAC,MAAM;YAAC,IAAI,EAAE,IAAI,CAAC;UAAK,gBAAE,CAAC;YAAA,UAAS,IAAI,CAAC;UAAK,gBAAS,CAAC,EAAC,IAAI,CAAC,KAAK,GAAG;YAAA,UAAK,IAAI,CAAC;UAAK,gBAAK,CAAC,GAAG,IAAI,EAAC,8DAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,GAAzK,IAAI,CAAC,KAAK,MAAuK,CAAC;MAAC,gBAAU,CAAC,EACrR;QAAI,SAAS,EAAC,sBAAsB;QAAA,UAAC;MAAK,gBAAI,CAAC,EAC9C,OAAO,GAAG;QAAG,SAAS,EAAC,mBAAmB;QAAA,UAAC;MAAI,gBAAG,CAAC,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,GAAG;QAAG,SAAS,EAAC,mBAAmB;QAAA,UAAC;MAAI,gBAAG,CAAC,GAAG,IAAI,EAChI,UAAU,CAAC,GAAG,CAAC,OAAO,IAAI;QAAS,SAAS,EAAC,cAAc;QAAC,EAAE,EAAE,eAAe,GAAG,OAAQ;QAAA,WAAe;UAAA,UAAK;QAAO,gBAAK,CAAC,EACzH,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI;UAAQ,IAAI,EAAC,QAAQ;UAAsB,OAAO,EAAE,MAAM;YAAE,WAAW,CAAC,MAAM,CAAC;YAAE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC;UAAE,CAAE;UAAA,WAK5J,8DAAC,MAAM;YAAC,MAAM,EAAE;UAAO,gBAAE,CAAC;YAAA,WAAM;cAAA,UAAS,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;YAAY,gBAAS,CAAC,EAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,YAAY,GAAG;cAAA,UAAQ,MAAM,CAAC;YAAY,gBAAQ,CAAC,GAAG,IAAI;UAAA,eAAO,CAAC;QAAA,GAL5I,MAAM,CAAC,OAAO,MAMhE,CAAC,CAAC;MAAA,GAPqF,OAAO,MAQ/F,CAAC,CAAC;IAAA,eACP,CAAC,EACP;MAAK,SAAS,EAAC,cAAc;MAAA,UAAE,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI;QAAG,IAAI,EAAC,GAAG;QAAa,OAAO,EAAE,CAAC,IAAI;UAAE,CAAC,CAAC,cAAc,CAAC,CAAC;UAAE,QAAQ,CAAC,KAAK,CAAC;QAAE,CAAE;QAAA,UAAE;MAAK,GAArE,KAAK,OAAoE,CAAC;IAAC,gBAAM,CAAC;EAAA,eACvJ,CAAC;AACR;AAEA,SAAS,kBAAkB,CAAC,IAAI,EAAE;EAChC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,OAAO,IAAI,CAAC,SAAS,KAAK,UAAU,GAAG,KAAK,GAAG,IAAI;EAClF,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,OAAO,KAAK;EAC5C,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,OAAO,KAAK;EAC5C,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,OAAO,KAAK;EAC3C,OAAO,IAAI;AACb;AAEA,SAAS,cAAc,CAAC;EAAC;AAAO,CAAC,EAAE;EACjC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,sDAAe,CAAC,MAAM;IACpB,6DAAa,CAAC,MAAM,IAAI,iEAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAC7D,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;EACpE,CAAC,EAAE,EAAE,CAAC;EACN,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK;IAC/B,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU;IACnD,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,GAAG;MAAC,GAAG,CAAC;MAAE,MAAM,EAAE;IAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACtG,MAAM,IAAI,GAAG,MAAM,GAAG,mEAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,mEAAmB,CAAC,IAAI,CAAC,UAAU,CAAC;IACjG,IAAI,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MACpE,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,GAAG;QAAC,GAAG,CAAC;QAAE,MAAM,EAAE,IAAI,CAAC;MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;MACvG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;IAChC,CAAC,CAAC;EACJ,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,aAAa;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,KAAK;MAAC,IAAI,EAAC;IAAc,gBAAE,CAAC;MAAM,SAAS,EAAC,qBAAqB;MAAA,WAChH,OAAO,GAAG;QAAG,SAAS,EAAC,mBAAmB;QAAA,UAAC;MAAI,gBAAG,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG;QAAG,SAAS,EAAC,mBAAmB;QAAA,UAAC;MAAO,gBAAG,CAAC,GAAG,IAAI,EAC9H,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI;QAAA,WACjB,8DAAC,MAAM;UAAC,MAAM,EAAE,IAAI,CAAC;QAAK,gBAAE,CAAC,EAC7B;UAAA,WAAK;YAAA,UAAU,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,IAAK,IAAI,CAAC;UAAY,gBAAS,CAAC;YAAA,UAAI,IAAI,CAAC,OAAO,IAAI;UAAU,gBAAI,CAAC;YAAA,UAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC;UAAC,gBAAQ,CAAC;QAAA,eAAK,CAAC,EACrL,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,GACxD;UAAA,WAAM;YAAQ,IAAI,EAAC,QAAQ;YAAC,OAAO,EAAE,MAAM,MAAM,CAAC,IAAI,EAAE,KAAK,CAAE;YAAA,UAAC;UAAE,gBAAQ,CAAC;YAAQ,IAAI,EAAC,QAAQ;YAAC,SAAS,EAAC,SAAS;YAAC,OAAO,EAAE,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,CAAE;YAAA,UAAC;UAAI,gBAAQ,CAAC;QAAA,eAAM,CAAC,GAC5K;UAAA,UAAK,kBAAkB,CAAC,IAAI;QAAC,gBAAK,CAAC;MAAA,GALN,IAAI,CAAC,UAAU,MAMvC,CAAC,CAAC;IAAA,eACP,CAAC;EAAA,eAAK,CAAC;AACf;AAGA,MAAM,SAAS,GAAG,eAAe;AAEjC,SAAS,mBAAmB,CAAC,IAAI,EAAE;EACjC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;IAExB,OAAO;MAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;MAAE,IAAI,EAAE;IAAO,CAAC;EAC3D;EACA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;EACzC,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;IAC1B,OAAO;MAAC,KAAK,EAAE,KAAK,GAAG,MAAM;MAAE,IAAI,EAAE;IAAO,CAAC;EAC/C;EACA,OAAO;IAAC,KAAK,EAAE,IAAI;IAAE,IAAI,EAAE;EAAe,CAAC;AAC7C;AAGA,MAAM,aAAa,GAAG;EAAC,IAAI,EAAE,GAAG;EAAE,MAAM,EAAE,GAAG;EAAE,KAAK,EAAE;AAAI,CAAC;AAY3D,SAAS,WAAW,CAAC,IAAI,EAAE;EACzB,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;EAC5B,wEAAe,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE;IAC9C,GAAG,IAAI;IACP,YAAY,EAAE;MAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC;IAAO;EAC/C,CAAC,CAAC;AACJ;AAEA,SAAS,SAAS,CAAC;EAAC,MAAM,GAAG,KAAK;EAAE,OAAO;EAAE;AAAa,CAAC,EAAE;EAC3D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,MAAM,CAAC;EACtD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAChD,MAAM,SAAS,GAAG,CAAC,IAAI;IACrB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,EAAE;MAAE,WAAW,CAAC,KAAK,CAAC;MAAE,UAAU,CAAC,EAAE,CAAC;MAAE;IAAQ;IACzD,YAAY,CAAC,IAAI,CAAC;IAAE,WAAW,CAAC,IAAI,CAAC;IAMrC,MAAM;MAAC,KAAK;MAAE;IAAI,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC;IAC/C,2DAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;EACpI,CAAC;EAGD,MAAM,SAAS,GAAG,MAAM;IACtB,8DAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MAC5B,MAAM,IAAI,GAAG,SAAS,IAAI,CAAC,UAAU,EAAE;MACvC,IAAI,SAAS,CAAC,KAAK,EAAE;QACnB,OAAO,SAAS,CAAC,KAAK,CAAC;UAAC,KAAK,EAAE,MAAM;UAAE;QAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;MAC/D;MACA,IAAI,SAAS,CAAC,SAAS,EAAE;QACvB,OAAO,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC,CACtE,KAAK,CAAC,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;MAC1C;MACA,OAAO,CAAC,mBAAmB,CAAC;MAC5B,OAAO,SAAS;IAClB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC;EACrD,CAAC;EAMD,MAAM,WAAW,GAAG,IAAI,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,GAAG,MAAM,GACjE,IAAI,CAAC,YAAY,KAAK,kBAAkB,GAAG,KAAK,GAAG,IAAI,CAAC,YAAY,KAAK,iBAAiB,GAAG,KAAK,GAClG,IAAI,CAAC,YAAY,KAAK,eAAe,GAAG,KAAK,GAAG,IAAI,CAAC,YAAY,KAAK,iBAAiB,GAAG,MAAM,GAAG,IAAI;EACzG,OAAO;IAAK,SAAS,EAAC,aAAa;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC;IAAc,gBAAE,CAAC,EAC7E,8DAAC,MAAM;MAAC,KAAK,EAAE,KAAM;MAAC,QAAQ,EAAE,CAAC,IAAI;QAAE,QAAQ,CAAC,CAAC,CAAC;QAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE;UAAE,WAAW,CAAC,KAAK,CAAC;UAAE,UAAU,CAAC,EAAE,CAAC;QAAE;MAAE,CAAE;MAAC,WAAW,EAAC,MAAM;MAAC,QAAQ,EAAE,MAAM,SAAS,CAAC,KAAK;IAAE,gBAAE,CAAC,EACrK;MAAA,UACG,QAAQ,GAAG;QAAS,SAAS,EAAC,sBAAsB;QAAA,WAAC;UAAA,UAAI;QAAG,gBAAI,CAAC,EAC/D,SAAS,GAAG;UAAG,SAAS,EAAC,mBAAmB;UAAA,UAAC;QAAI,gBAAG,CAAC,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG;UAAG,SAAS,EAAC,mBAAmB;UAAA,UAAC;QAAO,gBAAG,CAAC,GAC1H,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI;UAAQ,IAAI,EAAC,QAAQ;UACvC,OAAO,EAAE,MAAM;YAAE,WAAW,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,YAAY,KAAK,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,sBAAsB,EAAE,IAAI,CAAC,OAAO,CAAC;UAAE,CAAE;UAAA,WAClK,8DAAC,MAAM;YAAC,MAAM,EAAE;UAAK,gBAAE,CAAC;YAAA,UAAM;cAAA,UAAS,IAAI,CAAC;YAAY,gBAAS;UAAC,gBAAM,CAAC,EACzE;YAAI,SAAS,EAAE,IAAI,CAAC,YAAY,KAAK,MAAM,GAAG,gBAAgB,GAAG,EAAG;YAAA,UAAE,WAAW,CAAC,IAAI;UAAC,gBAAK,CAAC;QAAA,GAHhD,IAAI,CAAC,OAAO,MAInD,CAAC,CAAC;MAAA,eACL,CAAC,GAAG;QAAS,SAAS,EAAC,oBAAoB;QAAA,WAClD;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,cAAc,CAAE;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAO,gBAAM,CAAC;YAAA,WAAM;cAAA,UAAQ;YAAK,gBAAQ,CAAC;cAAA,UAAO;YAAS,gBAAO,CAAC;UAAA,eAAM,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,eAAQ,CAAC,EACjL;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAE;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAe,gBAAM,CAAC;YAAA,WAAM;cAAA,UAAQ;YAAG,gBAAQ,CAAC;cAAA,UAAO;YAAS,gBAAO,CAAC;UAAA,eAAM,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,eAAQ,CAAC,EAC9N;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,SAAU;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAK,gBAAM,CAAC;YAAA,WAAM;cAAA,UAAQ;YAAK,gBAAQ,CAAC;cAAA,UAAO;YAAa,gBAAO,CAAC;UAAA,eAAM,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,eAAQ,CAAC;MAAA,eACvJ;IAAC,gBACN,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,MAAM,CAAC;EAAC;AAAO,CAAC,EAAE;EACzB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,sDAAe,CAAC,MAAM;IACpB,8DAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MAAE,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;MAAE,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;EACnI,CAAC,EAAE,EAAE,CAAC;EACN,MAAM,KAAK,GAAG,MAAM;IAClB,IAAI,SAAS,CAAC,KAAK,IAAI,OAAO,EAAE;MAC9B,SAAS,CAAC,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM;QAAE,IAAI,EAAE;MAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACjG,CAAC,MAAM,IAAI,SAAS,CAAC,SAAS,IAAI,OAAO,EAAE;MACzC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC;MACtC,OAAO,CAAC,OAAO,CAAC;IAClB;EACF,CAAC;EACD,MAAM,IAAI,GAAG,MAAM;IACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC;IAC9D,IAAI,CAAC,MAAM,EAAE;MAAE,OAAO,CAAC,SAAS,CAAC;MAAE;IAAQ;IAC3C,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;IACrC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC;IACtC,CAAC,CAAC,QAAQ,GAAG,WAAW;IACxB,CAAC,CAAC,KAAK,CAAC,CAAC;IACT,OAAO,CAAC,WAAW,CAAC;EACtB,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,4BAA4B;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,OAAO;MAAC,IAAI,EAAC;IAAY,gBAAE,CAAC;MAAA,WAAM,8DAAC,MAAM;QAAC,OAAO,EAAE,OAAQ;QAAC,OAAO,EAAE,OAAQ;QAAC,OAAO,EAAE,CAAC;MAAQ,gBAAE,CAAC,EAClK;QAAK,SAAS,EAAC,mBAAmB;QAAA,WAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,KAAM;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAK,gBAAM,CAAC;YAAA,UAAM;UAAI,gBAAM,CAAC;QAAA,eAAQ,CAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,IAAK;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAQ,gBAAM,CAAC;YAAA,UAAM;UAAK,gBAAM,CAAC;QAAA,eAAQ,CAAC;MAAA,eAAK,CAAC;IAAA,eAC5M,CAAC;EAAA,eAAK,CAAC;AACf;AAEA,SAAS,QAAQ,CAAC;EAAC,GAAG;EAAE;AAAO,CAAC,EAAE;EAChC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,GAAG,EAAE;IACV,gEAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MAAE,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;MAAE,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;EACxI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;EACT,MAAM,IAAI,GAAG,MAAM;IACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC;IAC9D,IAAI,CAAC,MAAM,EAAE;MAAE,OAAO,CAAC,SAAS,CAAC;MAAE;IAAQ;IAC3C,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;IACrC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC;IACtC,CAAC,CAAC,QAAQ,GAAG,WAAW;IACxB,CAAC,CAAC,KAAK,CAAC,CAAC;IACT,OAAO,CAAC,WAAW,CAAC;EACtB,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,4BAA4B;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,KAAK;MAAC,IAAI,EAAC,gBAAgB;MAAC,OAAO,EAAE;IAAI,gBAAE,CAAC;MAAA,WAAM,8DAAC,MAAM;QAAC,OAAO,EAAE,OAAQ;QAAC,OAAO,EAAE,OAAQ;QAAC,OAAO,EAAE,CAAC;MAAQ,gBAAE,CAAC,EAClL;QAAK,SAAS,EAAC,mBAAmB;QAAA,UAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,IAAK;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAQ,gBAAM,CAAC;YAAA,UAAM;UAAK,gBAAM,CAAC;QAAA,eAAQ;MAAC,gBAAK,CAAC;IAAA,eAC1H,CAAC;EAAA,eAAK,CAAC;AACf;AAEA,SAAS,YAAY,CAAC;EAAC,GAAG;EAAE;AAAO,CAAC,EAAE;EAGpC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAO,GAAG,GAAG,uEAAc,CAAC,eAAe,GAAG,GAAG,CAAC,GAAG,IAAK,CAAC;EACxG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAChD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACnD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC7C,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,GAAG,EAAE;IACV,8DAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MAAE,wEAAe,CAAC,eAAe,GAAG,GAAG,EAAE,IAAI,CAAC;MAAE,UAAU,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EACvH,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;EACT,MAAM,cAAc,GAAG,OAAO,KAAK,OAAO,CAAC,YAAY,KAAK,kBAAkB,IAAI,OAAO,CAAC,YAAY,KAAK,iBAAiB,CAAC;EAC7H,MAAM,aAAa,GAAG,OAAO,IAAI,OAAO,CAAC,YAAY,KAAK,QAAQ;EAClE,MAAM,IAAI,GAAG,MAAM;IACjB,UAAU,CAAC,IAAI,CAAC;IAChB,mEAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM;MAC5D,OAAO,CAAC,SAAS,CAAC;MAAE,OAAO,CAAC,IAAI,CAAC;MAIjC,wEAAe,CAAC,eAAe,GAAG,GAAG,EAAE;QAAC,IAAI,uEAAc,CAAC,eAAe,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,YAAY,EAAE;MAAkB,CAAC,CAAC;MAC5H,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,sBAAsB,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC;IACrE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;EAClF,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,aAAa;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC,sBAAsB;MAAC,OAAO,EAAE;IAAI,gBAAE,CAAC;MAAM,SAAS,EAAC,eAAe;MAAA,WAClI,8DAAC,MAAM;QAAC,MAAM,EAAE;MAAQ,gBAAE,CAAC;QAAA,UAAM,OAAO,IAAI,OAAO,CAAC,YAAY,IAAK;MAAE,gBAAK,CAAC,EAC5E,aAAa,GAAG;QAAG,SAAS,EAAC,mBAAmB;QAAA,UAAC;MAAQ,gBAAG,CAAC,GAC5D,cAAc,IAAI,IAAI,GAAG;QAAG,SAAS,EAAC,mBAAmB;QAAA,UAAC;MAAU,gBAAG,CAAC,GACxE;QAAA,WAAO;UAAA,UAAM;QAAI,gBAAM,CAAC;UAAU,KAAK,EAAE,OAAQ;UAAC,SAAS,EAAC,IAAI;UAAC,WAAW,EAAC,SAAS;UAAC,QAAQ,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;QAAE,gBAAE,CAAC;UAAA,WAAQ,OAAO,CAAC,MAAM,EAAC,KAAG;QAAA,eAAO,CAAC;MAAA,eAAO,CAAC,EACvL,aAAa,IAAI,cAAc,IAAI,IAAI,GAAG,IAAI,GAAG;QAAK,SAAS,EAAC,uBAAuB;QAAA,WACtF;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,sBAAsB,EAAE,GAAG,CAAE;UAAA,UAAC;QAAE,gBAAQ,CAAC,EACvF;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,gBAAgB;UAAC,QAAQ,EAAE,OAAQ;UAAC,OAAO,EAAE,IAAK;UAAA,UAAE,OAAO,GAAG,MAAM,GAAG;QAAI,gBAAS,CAAC;MAAA,eAClH,CAAC;IAAA,eACF,CAAC;EAAA,eAAK,CAAC;AACf;AAEA,SAAS,OAAO,CAAC;EAAC,GAAG;EAAE,MAAM;EAAE,eAAe;EAAE;AAAO,CAAC,EAAE;EACxD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAO,GAAG,GAAG,uEAAc,CAAC,eAAe,GAAG,GAAG,CAAC,GAAG,IAAK,CAAC;EAIxG,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,GAAG,EAAE;IACV,8DAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MAC/B,wEAAe,CAAC,eAAe,GAAG,GAAG,EAAE,IAAI,CAAC;MAC5C,UAAU,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;MAKb,UAAU,CAAC,OAAO,IAAI;QACpB,IAAI,CAAC,OAAO,EAAE;UAAE,OAAO,CAAC,QAAQ,CAAC;UAAE,YAAY,CAAC,IAAI,CAAC;QAAE;QACvD,OAAO,OAAO;MAChB,CAAC,CAAC;IACJ,CAAC,CAAC;IAQF,sEAAsB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;MACtC,IAAI,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE;QAC3B,UAAU,CAAC,OAAO,IAAI,OAAO,GAAG;UAAC,GAAG,OAAO;UAAE,YAAY,EAAE,GAAG,CAAC;QAAY,CAAC,GAAG,OAAO,CAAC;MACzF;IACF,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EACpB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;EAIT,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,GAAG,EAAE,OAAO,SAAS;IAC1B,MAAM,aAAa,GAAG,CAAC,IAAI;MACzB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,EAAE;QACpC,MAAM,OAAO,GAAG,uEAAc,CAAC,eAAe,GAAG,GAAG,CAAC;QACrD,IAAI,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;MAClC;IACF,CAAC;IACD,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,aAAa,CAAC;IAC9D,OAAO,MAAM,MAAM,CAAC,mBAAmB,CAAC,sBAAsB,EAAE,aAAa,CAAC;EAChF,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;EACT,IAAI,CAAC,OAAO,EAAE,OAAO;IAAK,SAAS,EAAC,aAAa;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG;IAAgB,gBAAE,CAAC;MAAM,SAAS,EAAC,gBAAgB;MAAA,UAAC;QAAG,SAAS,EAAC,mBAAmB;QAAA,UAAE,SAAS,GAAG,YAAY,GAAG;MAAM,gBAAI;IAAC,gBAAM,CAAC;EAAA,eAAK,CAAC;EAChP,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,cAAc;EAC1E,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,KAAK,QAAQ;EAKlD,MAAM,eAAe,GAAG,OAAO,CAAC,YAAY,KAAK,iBAAiB,GAAG,iBAAiB,GACpF,OAAO,CAAC,YAAY,KAAK,eAAe,GAAG,sBAAsB,GACjE,OAAO,CAAC,YAAY,KAAK,iBAAiB,GAAG,wBAAwB,GACrE,YAAY;EAId,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC;EAC3C,OAAO;IAAK,SAAS,EAAC,aAAa;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,eAAgB;MACvG,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAK;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,iBAAiB,EAAE,GAAG;IAAE,gBAAE,CAAC,EAClF;MAAM,SAAS,EAAC,gBAAgB;MAAA,WAC9B;QAAA,WAAS,8DAAC,MAAM;UAAC,MAAM,EAAE;QAAQ,gBAAE,CAAC;UAAA,WAAK;YAAA,UAAK,OAAO,CAAC;UAAY,gBAAK,CAAC,EACrE,OAAO,CAAC,cAAc,GAAG;YAAA,WAAG,MAAI,EAAC,OAAO,CAAC,cAAc;UAAA,eAAI,CAAC,GAAG,IAAI,EACnE,OAAO,CAAC,MAAM,GAAG;YAAA,WAAG,KAAG,EAAC,OAAO,CAAC,MAAM;UAAA,eAAI,CAAC,GAAG,IAAI;QAAA,eAAM,CAAC;MAAA,eAAS,CAAC,EAItE;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,uBAAuB;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAE;QAAA,WAChG;UAAA,UAAM;QAAG,gBAAM,CAAC,gEAAC,IAAI;UAAA,UAAC;QAAO,gBAAM,CAAC;MAAA,eAC9B,CAAC,EAGT;QAAA,WAAK,OAAO,CAAC,MAAM,GAAG;UAAA,WAAK;YAAA,UAAI;UAAE,gBAAI,CAAC;YAAA,UAAK,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC;UAAM,gBAAK,CAAC;QAAA,eAAK,CAAC,GAAG,IAAI,EAC3G;UAAA,WAAK;YAAA,UAAI;UAAI,gBAAI,CAAC;YAAI,SAAS,EAAE,OAAO,CAAC,SAAS,GAAG,EAAE,GAAG,OAAQ;YAAA,UAAE,OAAO,CAAC,SAAS,IAAI;UAAa,gBAAK,CAAC;QAAA,eAAK,CAAC;MAAA,eAChH,CAAC,EACJ,QAAQ,GAAG;QAAK,SAAS,EAAC,wBAAwB;QAAA,WAC/C;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,gBAAgB;UAAC,OAAO,EAAE,QAAS;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAmB,gBAAM,CAAC,OAAG;QAAA,eAAQ,CAAC,EAChH;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,QAAS;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAI,gBAAM,CAAC,SAAK;QAAA,eAAQ,CAAC;MAAA,eACrE,CAAC,GACN,MAAM,GAAG;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,gBAAgB;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,qBAAqB,EAAE,GAAG,CAAE;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAc,gBAAM,CAAC,QAAI;MAAA,eAAQ,CAAC,GACvJ;QAAG,SAAS,EAAC,mBAAmB;QAAA,UAAE;MAAe,gBAAI,CAAC;IAAA,eACpD,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,MAAM,CAAC;EAAC,OAAO;EAAE,QAAQ;EAAE;AAAQ,CAAC,EAAE;EAAE,OAAO;IAAQ,IAAI,EAAC,QAAQ;IAAC,IAAI,EAAC,QAAQ;IAAC,gBAAc,OAAQ;IAAC,QAAQ,EAAE,QAAS;IAAC,SAAS,EAAE,eAAe,IAAI,OAAO,GAAG,UAAU,GAAG,EAAE,CAAE;IAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,CAAC,OAAO,CAAE;IAAA,UAAC,oFAAI;EAAC,gBAAQ,CAAC;AAAE;AAEpP,SAAS,QAAQ,CAAC;EAAC,GAAG;EAAE,cAAc;EAAE,UAAU;EAAE;AAAO,CAAC,EAAE;EAI5D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAO,GAAG,GAAG,uEAAc,CAAC,eAAe,GAAG,GAAG,CAAC,GAAG,IAAK,CAAC;EACxG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,cAAc,CAAC;EAM5D,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC/C,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC/D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC9C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACxD,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,GAAG,EAAE;IACV,uEAAuB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MACrC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;MAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;MAAE,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC;IACxF,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAKlB,8DAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,CAAC;MAAE,UAAU,CAAC,CAAC,CAAC;MAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,KAAK,eAAe,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;MAKxK,IAAI,CAAC,UAAU,EAAE;QACf,sEAAsB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;UACtC,IAAI,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE;YAAE,UAAU,CAAC,GAAG,CAAC,YAAY,KAAK,eAAe,CAAC;UAAE;QACnF,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;MACpB;IACF,CAAC,CAAC;IAKF,6DAAa,CAAC,MAAM,IAAI,0DAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG,CAAC;MACrD,IAAI,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EACpB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;EACT,MAAM,UAAU,GAAG,MAAM;IACvB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,kEAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM;MACxC,SAAS,CAAC,KAAK,CAAC;MAChB,gBAAgB,CAAC,KAAK,CAAC;MAAE,OAAO,CAAC,OAAO,CAAC;IAC3C,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC;EACnD,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,aAAa;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC,gBAAgB;MAAC,OAAO,EAAE;IAAI,gBAAE,CAAC;MAAM,SAAS,EAAC,iBAAiB;MAAA,WAC9H;QAAS,SAAS,EAAC,yBAAyB;QAAA,WAAC,8DAAC,MAAM;UAAC,MAAM,EAAE;QAAQ,gBAAE,CAAC;UAAA,UAAU,OAAO,IAAI,OAAO,CAAC,YAAY,IAAK;QAAE,gBAAS,CAAC;MAAA,eAAS,CAAC,EAC5I;QAAA,WAAS;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,0DAAc,CAAC,UAAU,CACnE,0DAAc,CAAC,WAAW,CAAC,0DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,CAAE;UAAA,WAClH;YAAA,UAAM;UAAM,gBAAM,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,eACvC,CAAC,EACT;UAAA,WAAK;YAAA,UAAM;UAAM,gBAAM,CAAC;YAAA,UAAO;UAAO,gBAAO,CAAC;QAAA,eAAK,CAAC;MAAA,eAAS,CAAC,EAChE;QAAA,WAAS;UAAA,WAAK;YAAA,UAAM;UAAI,gBAAM,CAAC,gEAAC,MAAM;YAAC,OAAO,EAAE,MAAO;YAAC,QAAQ,EAAE,eAAe,KAAK,IAAK;YAAC,QAAQ,EAAE,KAAK,IAAI;cAK3G,MAAM,IAAI,GAAG,MAAM;cAAE,SAAS,CAAC,KAAK,CAAC;cACrC,0EAA0B,CAAC,GAAG,EAAE;gBAAC,MAAM,EAAE,KAAK;gBAAE,OAAO,EAAE;cAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAChH,KAAK,CAAC,GAAG,IAAI;gBAAE,SAAS,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;cAAE,CAAC,CAAC;YACvE;UAAE,gBAAE,CAAC;QAAA,eAAK,CAAC,EACX;UAAA,WAAK;YAAA,UAAM;UAAK,gBAAM,CAAC,gEAAC,MAAM;YAAC,OAAO,EAAE,KAAM;YAAC,QAAQ,EAAE,eAAe,KAAK,IAAK;YAAC,QAAQ,EAAE,KAAK,IAAI;cACpG,MAAM,IAAI,GAAG,KAAK;cAAE,QAAQ,CAAC,KAAK,CAAC;cACnC,0EAA0B,CAAC,GAAG,EAAE;gBAAC,kBAAkB,EAAE,KAAK;gBAAE,OAAO,EAAE;cAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAC5H,KAAK,CAAC,GAAG,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;cAAE,CAAC,CAAC;YACtE;UAAE,gBAAE,CAAC;QAAA,eAAK,CAAC,EACX;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,oBAAoB,EAAE,GAAG,CAAE;UAAA,WAAC;YAAA,UAAM;UAAM,gBAAM,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,eAAQ,CAAC,EAC/H,aAAa,GACZ;UAAK,SAAS,EAAC,oBAAoB;UAAA,WAAC;YAAO,KAAK,EAAE,WAAY;YAAC,SAAS,EAAC,IAAI;YAAC,QAAQ,EAAE,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;YAAC,SAAS;UAAA,gBAAE,CAAC;YAAQ,IAAI,EAAC,QAAQ;YAAC,OAAO,EAAE,UAAW;YAAA,UAAC;UAAE,gBAAQ,CAAC;QAAA,eAAK,CAAC,GACrM;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM;YAAE,cAAc,CAAC,MAAM,CAAC;YAAE,gBAAgB,CAAC,IAAI,CAAC;UAAE,CAAE;UAAA,WAAC;YAAA,UAAM;UAAE,gBAAM,CAAC,EAAC,MAAM,GAAG;YAAA,UAAQ;UAAM,gBAAQ,CAAC,GAAG,IAAI,EAAC,8DAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,eAAQ,CAAC,EACvL;UAAA,WAAK;YAAA,UAAO,OAAO,GAAG,MAAM,GAAG;UAAI,gBAAO,CAAC,gEAAC,MAAM;YAAC,OAAO,EAAE,CAAC,CAAC,OAAQ;YAAC,QAAQ,EAAE,KAAK,IAAI;cACxF,IAAI,KAAK,EAAE;gBAAE,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC;gBAAE;cAAQ;cACrD,2DAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM;gBAAE,UAAU,CAAC,KAAK,CAAC;gBAAE,OAAO,CAAC,QAAQ,CAAC;cAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;YACrH;UAAE,gBAAE,CAAC;QAAA,eAAK,CAAC,EACX;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM;YAIjC,IAAI,IAAI,GAAG,0DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;YACvF,IAAI,GAAG,0DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC;YAC9D,IAAI,GAAG,0DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC;YACzD,IAAI,GAAG,0DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,EAAG,OAAO,IAAI,OAAO,CAAC,YAAY,IAAK,GAAG,CAAC;YAChG,0DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;UACjC,CAAE;UAAA,WAAC;YAAA,UAAM;UAAK,gBAAM,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,eAAQ,CAAC;MAAA,eACnD,CAAC,EACT,OAAO,GAAG,IAAI,GAAG;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,eAAe;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,uBAAuB,EAAE,GAAG,CAAE;QAAA,UAAC;MAAI,gBAAQ,CAAC;IAAA,eAClI,CAAC;EAAA,eAAK,CAAC;AACf;AAEA,SAAS,SAAS,CAAC;EAAC;AAAO,CAAC,EAAE;EAC5B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC9C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,sDAAe,CAAC,MAAM;IACpB,6DAAa,CAAC,MAAM,IAAI,yDAAS,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;EAC7G,CAAC,EAAE,EAAE,CAAC;EACN,MAAM,MAAM,GAAG,MAAM,IAAI;IACvB,2DAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM;MAAE,SAAS,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;MAAE,OAAO,CAAC,QAAQ,CAAC;IAAE,CAAC,CAAC,CACtH,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACjD,CAAC;EAGD,OAAO;IAAK,SAAS,EAAC,aAAa;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,KAAK;MAAC,IAAI,EAAC;IAAkB,gBAAE,CAAC;MAAM,SAAS,EAAC,mBAAmB;MAAA,UAClH,OAAO,GAAG;QAAG,SAAS,EAAC,mBAAmB;QAAA,UAAC;MAAI,gBAAG,CAAC,GAAG,MAAM,CAAC,MAAM,GAClE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI;QAAA,WAA4B,8DAAC,MAAM;UAAC,MAAM,EAAE,IAAI,CAAC;QAAK,gBAAE,CAAC;UAAA,WAAM;YAAA,UAAU,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,IAAK,IAAI,CAAC;UAAO,gBAAS,CAAC;YAAA,UAAO;UAAQ,gBAAO,CAAC;QAAA,eAAM,CAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAE;UAAA,UAAC;QAAE,gBAAQ,CAAC;MAAA,GAA7N,IAAI,CAAC,OAAO,MAA0N,CAAC,CAAC,GACzQ;QAAK,SAAS,EAAC,cAAc;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAU,gBAAM,CAAC;UAAA,UAAQ;QAAK,gBAAQ,CAAC;MAAA,eAAK;IAAC,gBAC/E,CAAC;EAAA,eAAK,CAAC;AACf;AAEA,SAAS,YAAY,CAAC;EAAC,IAAI;EAAE,GAAG;EAAE,MAAM;EAAE;AAAO,CAAC,EAAE;EAClD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC7C,MAAM,MAAM,GAAG;IACb,MAAM,EAAE;MAAC,KAAK,EAAE,MAAM;MAAE,IAAI,EAAE,oCAAoC;MAAE,MAAM,EAAE,MAAM;MAAE,KAAK,EAAE,cAAc;MAAE,KAAK,EAAE,OAAO;MAAE,OAAO,EAAE;IAAK,CAAC;IAC1I,KAAK,EAAE;MAAC,KAAK,EAAE,KAAK;MAAE,IAAI,EAAE,kCAAkC;MAAE,MAAM,EAAE,IAAI;MAAE,KAAK,EAAE,yBAAyB;MAAE,KAAK,EAAE,QAAQ;MAAE,OAAO,EAAE;IAAI,CAAC;IAC/I,KAAK,EAAE;MAAC,KAAK,EAAE,QAAQ;MAAE,IAAI,EAAE,0BAA0B;MAAE,MAAM,EAAE,IAAI;MAAE,KAAK,EAAE,iBAAiB;MAAE,KAAK,EAAE,SAAS;MAAE,OAAO,EAAE;IAAI;EACpI,CAAC,CAAC,IAAI,CAAC;EACP,MAAM,OAAO,GAAG,MAAM;IACpB,OAAO,CAAC,IAAI,CAAC;IACb,IAAI,IAAI;IACR,IAAI,IAAI,KAAK,QAAQ,EAAE,IAAI,GAAG,4DAAY,CAAC,GAAG,CAAC,CAAC,KAC3C,IAAI,IAAI,KAAK,OAAO,EAAE,IAAI,GAAG,yDAAS,CAAC,GAAG,CAAC,CAAC,KAC5C;MAMH,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI;MAClD,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE;IACA,IAAI,CAAC,IAAI,CAAC,MAAM;MAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;MAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,GAAG,GAAG,GAAG,SAAS,CAAC;IAAE,CAAC,CAAC,CAClG,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;EAC/E,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,aAAa;IAAA,WAAC,8DAAC,QAAQ;MAAC,GAAG,EAAE,GAAI;MAAC,cAAc,EAAE,IAAI,KAAK,OAAQ;MAAC,UAAU,EAAE,IAAK;MAAC,OAAO,EAAE;IAAQ,gBAAE,CAAC,EAC9H;MAAK,SAAS,EAAC,uBAAuB;MAAA,UAAC;QAAS,SAAS,EAAC,sBAAsB;QAAC,IAAI,EAAC,QAAQ;QAAC,cAAW,MAAM;QAAA,WAAC,oFAAI,CAAC;UAAA,UAAK,MAAM,CAAC;QAAK,gBAAK,CAAC;UAAA,UAAI,MAAM,CAAC;QAAI,gBAAI,CAAC,EAC/J;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,QAAQ;UAAC,QAAQ,EAAE,IAAK;UAAC,OAAO,EAAE,OAAQ;UAAA,UAAE,MAAM,CAAC;QAAM,gBAAS,CAAC,EACnG;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,iBAAiB,EAAE,GAAG,CAAE;UAAA,UAAC;QAAE,gBAAQ,CAAC;MAAA,eAC3E;IAAC,gBAAK,CAAC;EAAA,eACb,CAAC;AACR;AAEe,SAAS,qBAAqB,CAAC;EAAC,IAAI;EAAE,UAAU;EAAE,QAAQ;EAAE,MAAM;EAAE,eAAe;EAAE;AAAa,CAAC,EAAE;EAClH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,GAAG,GAAG,UAAU,IAAI,UAAU,CAAC,GAAG;EACxC,IAAI,OAAO;EACX,IAAI,IAAI,KAAK,cAAc,EAAE,OAAO,GAAG,8DAAC,WAAW;IAAC,QAAQ,EAAE,QAAS;IAAC,eAAe,EAAE;EAAgB,gBAAE,CAAC,CAAC,KACxG,IAAI,IAAI,KAAK,iBAAiB,EAAE,OAAO,GAAG,8DAAC,cAAc;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAChF,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,sBAAsB,EAAE,OAAO,GAAG,8DAAC,SAAS;IAAC,MAAM,EAAE,IAAI,KAAK,sBAAuB;IAAC,OAAO,EAAE,QAAS;IAAC,aAAa,EAAE;EAAc,gBAAE,CAAC,CAAC,KAChL,IAAI,IAAI,KAAK,cAAc,EAAE,OAAO,GAAG,8DAAC,MAAM;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACrE,IAAI,IAAI,KAAK,WAAW,EAAE,OAAO,GAAG,8DAAC,QAAQ;IAAC,GAAG,EAAE,GAAI;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC9E,IAAI,IAAI,KAAK,qBAAqB,EAAE,OAAO,GAAG,8DAAC,YAAY;IAAC,GAAG,EAAE,GAAI;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC5F,IAAI,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,sBAAsB,EAAE,OAAO,GAAG,8DAAC,OAAO;IAAC,GAAG,EAAE,GAAI;IAAC,MAAM,EAAE,IAAI,KAAK,gBAAiB;IAAC,eAAe,EAAE,eAAgB;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC1L,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,yBAAyB,EAAE,OAAO,GAAG,8DAAC,QAAQ;IAAC,GAAG,EAAE,GAAI;IAAC,cAAc,EAAE,IAAI,KAAK,yBAA0B;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC9K,IAAI,IAAI,KAAK,YAAY,EAAE,OAAO,GAAG,8DAAC,SAAS;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACtE,IAAI,IAAI,KAAK,uBAAuB,EAAE,OAAO,GAAG,8DAAC,YAAY;IAAC,IAAI,EAAC,QAAQ;IAAC,GAAG,EAAE,GAAI;IAAC,MAAM,EAAE,MAAO;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC5H,IAAI,IAAI,KAAK,eAAe,EAAE,OAAO,GAAG,8DAAC,YAAY;IAAC,IAAI,EAAC,OAAO;IAAC,GAAG,EAAE,GAAI;IAAC,MAAM,EAAE,MAAO;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACnH,OAAO,GAAG,8DAAC,YAAY;IAAC,IAAI,EAAC,OAAO;IAAC,GAAG,EAAE,GAAI;IAAC,MAAM,EAAE,MAAO;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC;EACzF,OAAO;IAAA,WAAG,OAAO,EAAC,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAAE,CAAC;AAC5E,C;;;;;;;;;;;;;;;;;;;;;;AC9nB0B;AACoC;AAER;AAEN;AAAA;AAEhD,MAAM,QAAQ,GAAG,0DAAc,CAAC;EAC9B,uBAAuB,EAAE;IACvB,EAAE,EAAE,mBAAmB;IACvB,cAAc,EAAE,6BAA6B;IAC7C,WAAW,EAAE;EACf;AACF,CAAC,CAAC;AAEa,MAAM,YAAY,SAAS,wDAAe,CAAC;EACxD,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAEhD,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,oBAAoB,CAAC,KAAK,CAAC;EACvD;EAEA,OAAO,oBAAoB,CAAC,KAAK,EAAE;IACjC,MAAM,QAAQ,GAAG,EAAE;IACnB,IAAI,aAAa,GAAG,CAAC;IACrB,IAAI,aAAa,GAAG,CAAC;IAErB,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACpC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI;MAC1B,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;MAC1C,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC;MAGtC,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE;QAC5B,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;MAClB;MACA,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE;QAC5B;MACF;MAEA,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE;QAC/B,IAAI,KAAK,CAAC,OAAO,EAAE;UACjB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAClB,CAAC,MAAM;UACL,aAAa,EAAG;QAClB;MACF,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;QACzB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAChB,aAAa,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;MACvC;IACF,CAAC,CAAC;IAEF,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK;MACtB,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;MAC/B,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,IAAI,aAAa,GAAG,CAAC,EAAE;MACrB,QAAQ,CAAC,IAAI,CAAC;QACZ,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,QAAQ,CAAC,uBAAuB;QACvC,MAAM,EAAE;UAAC,KAAK,EAAE;QAAa;MAC/B,CAAC,CAAC;IACJ;IAEA,OAAO;MACL,WAAW,EAAE,QAAQ;MACrB,aAAa,EAAE;IACjB,CAAC;EACH;EAEA,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE;IACvC,IAAI,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IACzC,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,IACvC,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;MAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;MAC9D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;MACvB,IAAI,QAAQ,CAAC,aAAa,IAAI,SAAS,CAAC,aAAa,EAAE;QACrD,4DAAa,CAAC,QAAQ,CAAC,aAAa,CAAC;MACvC;IACF;EACF;EAEA,YAAY,CAAC,cAAc,EAAE;IAC3B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;EAC5B;EAEA,MAAM,GAAG;IACP,OACE,8DAAC,wDAAgB;MAAC,EAAE,EAAC,oBAAoB;MACvC,cAAc,EAAC,+BAA8B;MAC7C,WAAW,EAAC,8DAA8D;MAAA,UACzE,WAAW,IAAK,8DAAC,iEAAW;QAC3B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;QAC1B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;QAChC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;QACjC,gBAAgB,EAAE,WAAY;QAC9B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,UAAU,EAAE,IAAK;QACjB,UAAU,EAAE,IAAK;QACjB,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;QAC5C,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;QAC5C,QAAQ,EAAE,IAAI,CAAC;MAAa,gBAAE;IAAC,gBAChB,CAAC;EAExB;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9GyB;AAEkB;AAEU;AAEJ;AACqC;AAI7D;AACqE;AAC5C;AAAA;AAKnD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC;AACjC,SAAS,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE;EACxC,IAAI,CAAC,KAAK,EAAE;EACZ,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;IAAE,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAAE;EAAQ;EAC9E,IAAI,8CAAM,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;IAAE,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC;IAAE,MAAM,CAAC,QAAQ,CAAC;IAAE;EAAQ;EACrG,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,wDAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,8DAAc,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC;EAC1H,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI;IAAE,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;IAAE,MAAM,CAAC,IAAI,CAAC;EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACxF;AAMA,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK;EACjC,IAAI,IAAI,GAAG,0DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;EACrE,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;IACrD,IAAI,GAAG,KAAK,GAAG,0DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,0DAAc,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC;EACxG,CAAC,CAAC;EACF,0DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;AACjC,CAAC;AAEM,MAAM,qBAAqB,GAAG,CACnC,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EACtF,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAC9G,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EACxE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,CACpD;AAED,SAAS,IAAI,CAAC;EAAC;AAAQ,CAAC,EAAE;EAAE,OAAO;IAAG,SAAS,EAAC,gBAAgB;IAAC,eAAY,MAAM;IAAA,UAAE;EAAQ,gBAAI,CAAC;AAAE;AACpG,SAAS,MAAM,CAAC;EAAC,KAAK;EAAE,IAAI,GAAG,eAAe;EAAE,UAAU;EAAE,KAAK;EAAE;AAAO,CAAC,EAAE;EAC3E,OAAO;IAAQ,SAAS,EAAC,gBAAgB;IAAA,WACvC;MAAQ,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,MAAM;QAAE,IAAI,CAAC,0DAAc,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;MAAE,CAAE;MAAC,cAAW,IAAI;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAkB,gBAAM;IAAC,gBAAQ,CAAC,EAC5J;MAAA,UAAK;IAAK,gBAAK,CAAC,EACf,KAAK,GAAG;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,MAAM;MAAC,OAAO,EAAE,OAAQ;MAAA,UAAE;IAAK,gBAAS,CAAC,GAAG,uFAAO,CAAC;EAAA,eACvF,CAAC;AACX;AACA,SAAS,MAAM,CAAC;EAAC;AAAI,CAAC,EAAE;EAAE,OAAO;IAAM,SAAS,EAAC,gBAAgB;IAAA,UAAE,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG;MAAK,GAAG,EAAE,IAAI,CAAC,KAAM;MAAC,GAAG,EAAC;IAAE,gBAAE,CAAC,GAAG,8DAAC,IAAI;MAAA,UAAG,IAAI,IAAI,IAAI,CAAC,IAAI,IAAK;IAAQ,gBAAO;EAAC,gBAAO,CAAC;AAAE;AAClL,SAAS,KAAK,CAAC;EAAC,OAAO;EAAE;AAAM,CAAC,EAAE;EAAE,sDAAe,CAAC,MAAM;IAAE,IAAI,CAAC,OAAO,EAAE,OAAO,SAAS;IAAE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;IAAE,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EAAE,OAAO,OAAO,GAAG;IAAK,SAAS,EAAC,YAAY;IAAC,IAAI,EAAC,QAAQ;IAAA,UAAE;EAAO,gBAAM,CAAC,GAAG,IAAI;AAAE;AAC9R,SAAS,MAAM,CAAC;EAAC,KAAK;EAAE,QAAQ;EAAE,WAAW,GAAG;AAAI,CAAC,EAAE;EAAE,OAAO;IAAO,SAAS,EAAC,gBAAgB;IAAA,WAAC,8DAAC,IAAI;MAAA,UAAC;IAAM,gBAAM,CAAC;MAAO,KAAK,EAAE,KAAM;MAAC,QAAQ,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAE;MAAC,WAAW,EAAE;IAAY,gBAAE,CAAC;EAAA,eAAO,CAAC;AAAE;AAKjO,SAAS,eAAe,CAAC,OAAO,EAAE;EAChC,OAAO,8CAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,IAAI;AACjD;AAMA,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;AACnD,SAAS,eAAe,CAAC,OAAO,EAAE;EAChC,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC;EACvC,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI;EACxB,IAAI,KAAK,GAAG,IAAI;EAChB,8CAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK;IAC5C,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;MACrD,KAAK,GAAG,IAAI;MACZ,OAAO,IAAI;IACb;IACA,OAAO,KAAK;EACd,CAAC,CAAC;EACF,OAAO,KAAK;AACd;AAIA,SAAS,oBAAoB,CAAC,GAAG,EAAE;EACjC,IAAI,CAAC,GAAG,EAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;EACtC,MAAM,MAAM,GAAG,8CAAM,CAAC,cAAc,CAAC,GAAG,CAAC;EACzC,IAAI,CAAC,MAAM,EAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;EACzC,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;EAC5F,OAAO,0DAAU,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC;AAChF;AAKA,SAAS,kBAAkB,CAAC,IAAI,EAAE;EAChC,IAAI,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,EAAE;IAC5D,OAAO,eAAe,CAAC;MAAC,GAAG,EAAE,IAAI,CAAC,GAAG;MAAE,GAAG,EAAE,IAAI,CAAC,GAAG;MAAE,GAAG,EAAE,IAAI,CAAC;IAAG,CAAC,CAAC;EACvE;EACA,OAAO,IAAI;AACb;AACA,SAAS,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE;EAC1C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,OAAO,OAAO;EAC/C,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC;EACvC,IAAI,MAAM,EAAE,OAAO,8CAAM,CAAC,WAAW,CAAC,MAAM,CAAC;EAC7C,OAAO,YAAY,IAAI,EAAE;AAC3B;AAEA,MAAM,cAAc,GAAG;EAAC,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;EAAE,KAAK,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;EAAE,KAAK,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC;EAAE,QAAQ,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC;EAAE,IAAI,EAAE,CAAC,mBAAmB,EAAE,SAAS;AAAC,CAAC;AACpM,SAAS,WAAW,CAAC,IAAI,EAAE;EACzB,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;EAC9C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE;AACpC;AAEA,SAAS,QAAQ,CAAC;EAAC,IAAI;EAAE,IAAI;EAAE,IAAI;EAAE,MAAM;EAAE,OAAO;EAAE;AAAM,CAAC,EAAE;EAC7D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC;EAC7B,OAAO;IAAQ,IAAI,EAAC,QAAQ;IAAC,SAAS,EAAE,mBAAmB,IAAI,OAAO,GAAG,UAAU,GAAG,EAAE,CAAE;IAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,MAAO;IAAA,WAC/H;MAAA,UAAO,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI;IAAG,gBAAO,CAAC,EACrE;MAAA,WAAK;QAAA,UAAS,IAAI,IAAI;MAAO,gBAAS,CAAC;QAAA,WAAQ,OAAO,IAAI,KAAK,QAAQ,GAAG,mEAAgB,CAAC,IAAI,CAAC,GAAI,IAAI,IAAI,MAAO,EAAE,MAAM,GAAG,MAAM,MAAM,EAAE,GAAG,EAAE;MAAA,eAAQ,CAAC;IAAA,eAAK,CAAC,EAC/J,OAAO,GAAG;MAAA,UAAI;IAAK,gBAAI,CAAC,GAAG,8DAAC,IAAI;MAAA,UAAC;IAAa,gBAAM,CAAC;EAAA,eAChD,CAAC;AACX;AASA,SAAS,SAAS,CAAC;EAAC,GAAG;EAAE,IAAI;EAAE;AAAO,CAAC,EAAE;EACvC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAC1C,sDAAe,CAAC,MAAM;IAAE,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;EAChG,MAAM,QAAQ,GAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,IAAM,IAAI,IAAI,IAAI,CAAC,QAAS,IAAI,CAAC;EACtE,IAAI,OAAO,EAAE;IACX,OAAO;MAAK,SAAS,EAAC,4BAA4B;MAAA,WAAC,8DAAC,IAAI;QAAA,UAAC;MAAK,gBAAM,CAAC;QAAA,UAAI;MAAK,gBAAI,CAAC;IAAA,eAAK,CAAC;EAC3F;EACA,OAAO;IAAK,SAAS,EAAC,oBAAoB;IAAA,UACvC,GAAG,GAAG,8DAAC,iEAAW;MAAC,KAAK;MAAC,GAAG,EAAE,GAAI;MAAC,QAAQ,EAAE,QAAS;MAAC,OAAO,EAAE,GAAG,IAAI,GAAG,CAAC;IAAQ,gBAAE,CAAC,GAAG,8DAAC,IAAI;MAAA,UAAC;IAAe,gBAAM;EAAC,gBACnH,CAAC;AACR;AAMA,SAAS,QAAQ,CAAC;EAAC,GAAG;EAAE,MAAM;EAAE;AAAO,CAAC,EAAE;EACxC,IAAI,OAAO,EAAE;IACX,OAAO;MAAK,SAAS,EAAC,2BAA2B;MAAA,WAAC,8DAAC,IAAI;QAAA,UAAC;MAAQ,gBAAM,CAAC;QAAA,UAAI;MAAK,gBAAI,CAAC;IAAA,eAAK,CAAC;EAC7F;EACA,OAAO;IAAQ,IAAI,EAAC,QAAQ;IAAC,SAAS,EAAC,mBAAmB;IAAC,OAAO,EAAE,MAAM,MAAM,IAAI,MAAM,CAAC,GAAG,CAAE;IAAA,WAAC,8DAAC,IAAI;MAAA,UAAC;IAAI,gBAAM,CAAC;MAAA,UAAO;IAAG,gBAAO,CAAC;EAAA,eAAQ,CAAC;AAC/I;AAEA,SAAS,UAAU,CAAC;EAAC,GAAG;EAAE,KAAK;EAAE,QAAQ;EAAE,MAAM;EAAE;AAAO,CAAC,EAAE;EAC3D,IAAI,OAAO,EAAE;IACX,OAAO;MAAK,SAAS,EAAC,6BAA6B;MAAA,WAAC,8DAAC,IAAI;QAAA,UAAE,KAAK,GAAG,cAAc,GAAG;MAAc,gBAAO,CAAC;QAAA,UAAK,KAAK,GAAG,OAAO,GAAG;MAAO,gBAAK,CAAC;IAAA,eAAK,CAAC;EACtJ;EACA,OAAO;IAAQ,IAAI,EAAC,QAAQ;IAAC,SAAS,EAAC,qBAAqB;IAAC,OAAO,EAAE,MAAO;IAAA,WAC1E,GAAG,GAAG;MAAK,GAAG,EAAE,GAAI;MAAC,GAAG,EAAE,KAAK,GAAG,OAAO,GAAG;IAAQ,gBAAE,CAAC,GAAG,8DAAC,IAAI;MAAA,UAAE,KAAK,GAAG,UAAU,GAAG;IAAO,gBAAO,CAAC,EACrG,KAAK,GAAG;MAAA,WAAE,8DAAC,IAAI;QAAA,UAAC;MAAW,gBAAM,CAAC,EAAC,QAAQ,GAAG;QAAA,UAAQ,gEAAa,CAAC,QAAQ;MAAC,gBAAQ,CAAC,GAAG,IAAI;IAAA,eAAG,CAAC,GAAG,IAAI;EAAA,eACnG,CAAC;AACX;AAEA,SAAS,YAAY,CAAC;EAAC,IAAI;EAAE,MAAM;EAAE,SAAS;EAAE,QAAQ;EAAE;AAAQ,CAAC,EAAE;EACnE,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;EACnE,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,IAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAM,IAAI,EAAE;EAC9E,OAAO;IAAS,SAAS,EAAE,uBAAuB,IAAI,SAAS,GAAG,YAAY,GAAG,EAAE,CAAE;IAAA,WAClF,SAAS,GAAG;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAE,eAAe,IAAI,QAAQ,GAAG,UAAU,GAAG,EAAE,CAAE;MAAC,OAAO,EAAE,QAAS;MAAC,cAAW,MAAM;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAE,QAAQ,GAAG,OAAO,GAAG;MAAE,gBAAO;IAAC,gBAAQ,CAAC,GAAG,IAAI,EACzL;MAAK,SAAS,EAAC,0BAA0B;MAAA,WACtC,IAAI,CAAC,IAAI,KAAK,MAAM,GAAG;QAAG,SAAS,EAAC,sBAAsB;QAAA,UAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI;MAAC,gBAAI,CAAC,GAAG,IAAI,EAMhK,IAAI,CAAC,IAAI,KAAK,MAAM,GAAG,8DAAC,QAAQ;QAAC,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,IAAK;QAAC,IAAI,EAAE,GAAG,IAAI,8CAAM,CAAC,aAAa,CAAC,GAAG,CAAE;QAAC,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,IAAK;QACrH,OAAO,EAAE,IAAI,CAAC,YAAY,KAAK,SAAU;QAAC,MAAM,EAAE;MAAO,gBAAE,CAAC,GAAG,IAAI,EACpE,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,8DAAC,SAAS;QAAC,GAAG,EAAE,GAAI;QAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAK;QAAC,OAAO,EAAE,IAAI,CAAC,YAAY,KAAK;MAAU,gBAAE,CAAC,GAAG,IAAI,EAC3I,IAAI,CAAC,IAAI,KAAK,MAAM,GAAG,8DAAC,QAAQ;QAAC,GAAG,EAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAK,WAAW,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAE;QACvM,MAAM,EAAE,MAAO;QAAC,OAAO,EAAE,IAAI,CAAC,YAAY,KAAK;MAAU,gBAAE,CAAC,GAAG,IAAI,EACpE,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,8DAAC,UAAU;QAAC,GAAG,EAAE,IAAI,CAAC,SAAU;QAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,OAAQ;QAAC,MAAM,EAAE,MAAO;QAAC,OAAO,EAAE,IAAI,CAAC,YAAY,KAAK;MAAU,gBAAE,CAAC,GAAG,IAAI,EACpL;QAAA,WAAQ;UAAA,WAAM,KAAG,EAAC,MAAM;QAAA,eAAO,CAAC;UAAA,UAAO,kEAAe,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QAAC,gBAAO,CAAC;MAAA,eAAQ,CAAC;IAAA,eACjG,CAAC;EAAA,eACC,CAAC;AACZ;AAEA,MAAM,UAAU,GAAG;EAAC,GAAG,EAAE,iBAAiB;EAAE,IAAI,EAAE,iBAAiB;EAAE,IAAI,EAAE,gBAAgB;EAAE,KAAK,EAAE,iBAAiB;EAAE,IAAI,EAAE,iBAAiB;EAAE,KAAK,EAAE,iBAAiB;EAAE,KAAK,EAAE;AAAiB,CAAC;AACnM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAEtI,SAAS,SAAS,CAAC;EAAC,IAAI;EAAE,MAAM;EAAE;AAAO,CAAC,EAAE;EAC1C,MAAM,WAAW,GAAG,IAAI,KAAK,iBAAiB,GAAG,MAAM,GAAG,IAAI,KAAK,gBAAgB,GAAG,MAAM,GAAG,IAAI,KAAK,iBAAiB,GAAG,OAAO,GAAG,IAAI,KAAK,iBAAiB,GAAG,MAAM,GAAG,IAAI,KAAK,iBAAiB,GAAG,OAAO,GAAG,IAAI,KAAK,iBAAiB,GAAG,OAAO,GAAG,KAAK;EAC/P,MAAM,SAAS,GAAG,IAAI,KAAK,kBAAkB;EAC7C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;EAGxE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACtD,MAAM,KAAK,GAAG,0EAAiB,CAAC,UAAU,EAAE,GAAG,CAAC;EAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAMlD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,MAAM,uEAAc,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;EAC3F,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC9C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACnD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC,CAAC;EAClD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC,CAAC;EACxD,MAAM,IAAI,GAAG,wDAAiB,CAAE,MAAM,IAAK;IACzC,4DAAY,CAAC;MAAC,IAAI;MAAE,KAAK;MAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG;IAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MACrE,QAAQ,CAAC,IAAI,IAAI;QACf,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,GAAI,IAAI,CAAC,KAAK,IAAI,EAAG;QAChF,IAAI,CAAC,KAAK,EAAE,wEAAe,CAAC,YAAY,GAAG,IAAI,EAAE,IAAI,CAAC;QACtD,OAAO,IAAI;MACb,CAAC,CAAC;MACF,SAAS,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;MACjC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;IAChC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACjD,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;EACzB,sDAAe,CAAC,MAAM;IACpB,QAAQ,CAAE,CAAC,KAAK,IAAI,uEAAc,CAAC,YAAY,GAAG,IAAI,CAAC,IAAK,IAAI,CAAC;IACjE,IAAI,CAAC,KAAK,CAAC;EACb,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;EAEjB,sDAAe,CAAC,MAAM;IACpB,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI;MAC5B,IAAK,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAK,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;MACpF,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;MACnE,oBAAoB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;QAAE,IAAI,GAAG,EAAE,WAAW,CAAC,CAAC,KAAK;UAAC,GAAG,CAAC;UAAE,CAAC,IAAI,CAAC,WAAW,GAAG;QAAG,CAAC,CAAC,CAAC;MAAE,CAAC,CAAC;IAC1G,CAAC,CAAC;EACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,sDAAe,CAAC,MAAM;IACpB,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI;MAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK;MAC9C,IAAI,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE;MAClC,iBAAiB,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,IAAI,cAAc,CAAC,CAAC,KAAK;QAAC,GAAG,CAAC;QAAE,CAAC,KAAK,GAAG;MAAI,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC,CAAC;EACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,MAAM,MAAM,GAAG,EAAE,IAAI,WAAW,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;EAClH,MAAM,cAAc,GAAG,MAAM;IAC3B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,QAAQ,CAAC,MAAM,QAAQ,CAAC,EAAE;IAC1D,oEAAoB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI;MAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAE,MAAM,IAAI,MAAM,CAAC,KAAK,IAAK,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC;MACjG,QAAQ,CAAC,MAAM,IAAI;QACjB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK,EAAE,wEAAe,CAAC,YAAY,GAAG,IAAI,EAAE,IAAI,CAAC;QACtD,OAAO,IAAI;MACb,CAAC,CAAC;MACF,WAAW,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;MAC1D,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,GAAG,SAAS,GAAG,OAAO,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,WAAW,CAAC;IACvG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACjD,CAAC;EACD,MAAM,QAAQ,GAAG,IAAI,IAAI;IACvB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;MAAE,QAAQ,CAAC,eAAe,EAAE;QAAC,UAAU,EAAE,IAAI,CAAC,WAAW;QAAE,QAAQ,EAAE;MAAI,CAAC,CAAC;MAAE;IAAQ;IAC/G,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;MACxB,MAAM,GAAG,GAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAK,WAAW,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;MAC7K,wDAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;QACpC,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC,KAC3E,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,GAAG,cAAc,GAAG,iBAAiB,CAAC;MAC7E,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;MACnC;IACF;IACA,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;MAIlD,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC,KAC5E,OAAO,CAAC,YAAY,CAAC;MAC1B;IACF;IACA,OAAO,CAAC,YAAY,CAAC;EACvB,CAAC;EACD,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;EACxB,OAAO;IAAK,SAAS,EAAC,cAAc;IAAA,WAClC,8DAAC,MAAM;MAAC,KAAK,EAAE,SAAS,GAAG,OAAO,QAAQ,CAAC,MAAM,IAAI,GAAG,MAAO;MAAC,IAAI,EAAE,SAAS,GAAG,iBAAiB,GAAG,eAAgB;MACpH,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,IAAK;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,SAAS,GAAG,iBAAiB,GAAG,kBAAkB;IAAE,gBAAE,CAAC,EACjH,8DAAC,MAAM;MAAC,KAAK,EAAE,UAAW;MAAC,QAAQ,EAAE,aAAc;MAAC,WAAW,EAAC;IAAQ,gBAAE,CAAC,EAC3E;MAAK,SAAS,EAAC,mBAAmB;MAAA,UAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK;QAAQ,IAAI,EAAC,QAAQ;QAAU,SAAS,EAAE,IAAI,KAAK,EAAE,GAAG,QAAQ,GAAG,EAAG;QACzI,OAAO,EAAE,MAAM;UAAE,OAAO,CAAC,EAAE,CAAC;UAAE,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAAE,CAAE;QAAA,UAAE;MAAK,GADL,EAAE,OACY,CAAC;IAAC,gBAAM,CAAC,EACvH;MAAM,SAAS,EAAC,uBAAuB;MAAA,UACpC,KAAK,KAAK,IAAI,GAAG;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAC;MAAI,gBAAG,CAAC,GAC1D,IAAI,CAAC,MAAM,GAAG;QAAA,WAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,8DAAC,YAAY;UAAwB,IAAI,EAAE;YAAC,GAAG,IAAI;YAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;YACxH,cAAc,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK;UAAC,CAAE;UAC/D,SAAS,EAAE,SAAU;UAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAE;UAAC,QAAQ,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAE;UAC9G,MAAM,EAAE,MAAM,QAAQ,CAAC,IAAI;QAAE,GAHoB,IAAI,CAAC,WAAW,OAGlC,CAAC,CAAC,EAClC,OAAO,GAAG;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,mBAAmB;UAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAE;UAAA,UAAC;QAAI,gBAAQ,CAAC,GAAG,IAAI;MAAA,eAAG,CAAC,GACpH;QAAK,SAAS,EAAC,eAAe;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAe,gBAAM,CAAC;UAAA,UAAQ;QAAM,gBAAQ,CAAC;MAAA,eAAK;IAAC,gBACtF,CAAC,EACN,SAAS,GAAG;MAAK,SAAS,EAAC,mBAAmB;MAAA,WAC7C;QAAQ,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAO;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,gBAAgB,EAAE;UAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG;QAAC,CAAC,CAAE;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAK,gBAAM,CAAC;UAAA,UAAM;QAAE,gBAAM,CAAC;MAAA,eAAQ,CAAC,EAClK;QAAQ,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAO;QAAC,OAAO,EAAE,cAAe;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAc,gBAAM,CAAC;UAAA,UAAM;QAAE,gBAAM,CAAC;MAAA,eAAQ,CAAC;IAAA,eAC3H,CAAC,GAAG,IAAI;EAAA,eACV,CAAC;AACR;AAMA,SAAS,aAAa,CAAC;EAAC,UAAU;EAAE,QAAQ;EAAE,QAAQ;EAAE;AAAO,CAAC,EAAE;EAChE,MAAM,GAAG,GAAG,CAAC,UAAU,IAAI,UAAU,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC;EAC3F,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAClD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACzD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAChD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACnD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,sDAAe,CAAC,MAAM;IAAE,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,2DAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EAAE,CAAC,EAAE,EAAE,CAAC;EAChG,MAAM,MAAM,GAAG,EAAE,IAAI,WAAW,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;EAC9H,MAAM,IAAI,GAAG,MAAM;IACjB,IAAI,OAAO,EAAE;IACb,UAAU,CAAC,IAAI,CAAC;IAChB,gEAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI;MAO7D,MAAM,KAAK,GAAI,MAAM,IAAI,MAAM,CAAC,KAAK,IAAK,EAAE;MAC5C,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI;QAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,MAAM,CAAC;QAC9D,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;MAC1E,CAAC,CAAC,CAAC,MAAM;MACT,OAAO,CAAC,cAAc,KAAK,QAAQ,CAAC,MAAM,GAAG,QAAQ,QAAQ,CAAC,MAAM,MAAM,GAAG,GAAG,cAAc,IAAI,QAAQ,CAAC,MAAM,UAAU,CAAC;MAC5H,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,iBAAiB,CAAC,EAAE,GAAG,CAAC;IAC3D,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;EAClF,CAAC;EACD,MAAM,UAAU,GAAG,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;EAC3F,MAAM,QAAQ,GAAG,CAAC,QAAQ,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,KACxF,CAAC,KAAK,IAAI,+DAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;EAC3G,MAAM,MAAM,GAAG,GAAG,IAAI;IAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC;IAAE,OAAQ,CAAC,IAAI,+DAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,IAAK,GAAG;EAAE,CAAC;EACrI,OAAO;IAAK,SAAS,EAAC,cAAc;IAAA,WAClC,8DAAC,MAAM;MAAC,KAAK,EAAC,IAAI;MAAC,IAAI,EAAC;IAAkB,gBAAE,CAAC,EAC5C,CAAC,UAAU,GAAG;MAAA,WACb,8DAAC,MAAM;QAAC,KAAK,EAAE,KAAM;QAAC,QAAQ,EAAE,QAAS;QAAC,WAAW,EAAC;MAAU,gBAAE,CAAC,EACnE;QAAG,SAAS,EAAC,uBAAuB;QAAA,UAAC;MAAI,gBAAG,CAAC,EAC7C;QAAM,SAAS,EAAC,qBAAqB;QAAA,UAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI;UAAQ,IAAI,EAAC,QAAQ;UAAiB,OAAO,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAE;UAAA,WACjI,8DAAC,MAAM;YAAC,IAAI,EAAE,CAAC;UAAE,gBAAE,CAAC;YAAA,UAAM;cAAA,UAAS,+DAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI;YAAC,gBAAS;UAAC,gBAAM,CAAC,EACvG;YAAG,SAAS,EAAE,eAAe,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,GAAG,EAAE,CAAE;YAAA,UAAC,8DAAC,IAAI;cAAA,UAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG;YAAE,gBAAO;UAAC,gBAAG,CAAC;QAAA,GAF3D,IAAI,CAAC,IAAI,MAGxF,CAAC;MAAC,gBAAO,CAAC,EAClB;QAAQ,SAAS,EAAC,kBAAkB;QAAA,WAAC;UAAA,WAAM,MAAI,EAAC,QAAQ,CAAC,MAAM,EAAC,IAAE;QAAA,eAAM,CAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAO;UAAC,OAAO,EAAE,MAAM,aAAa,CAAC,IAAI,CAAE;UAAA,UAAC;QAAE,gBAAQ,CAAC;MAAA,eAAQ,CAAC;IAAA,eACnL,CAAC,GAAG;MAAM,SAAS,EAAC,uBAAuB;MAAA,WAC3C;QAAA,UAAI;MAAG,gBAAI,CAAC,EACZ;QAAK,SAAS,EAAC,wBAAwB;QAAA,UAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI;UAAA,WAAgB,8DAAC,MAAM;YAAC,IAAI,EAAE,CAAC;UAAE,gBAAE,CAAC;YAAA,UAAQ,MAAM,CAAC,GAAG;UAAC,gBAAQ,CAAC;QAAA,GAArD,GAAG,MAAwD,CAAC;MAAC,gBAAM,CAAC,EAC3I,OAAO,GAAG;QAAA,WAAU,UAAU,GAAG,8DAAC,QAAQ;UAAC,IAAI,EAAE,UAAU,CAAC,IAAK;UAAC,IAAI,EAAE,8CAAM,CAAC,aAAa,CAAC,UAAU,CAAE;UAAC,MAAM,EAAE,MAAM,CAAC;QAAE,gBAAE,CAAC,GAC7H;UAAG,SAAS,EAAC,sBAAsB;UAAA,UAAE,WAAW,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI;QAAC,gBAAI,CAAC,EAC9I;UAAA,UAAG;QAAyB,gBAAG,CAAC;MAAA,eAAS,CAAC,GAAG,IAAI,EACnD;QAAU,KAAK,EAAE,OAAQ;QAAC,QAAQ,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAE;QAAC,WAAW,EAAC;MAAO,gBAAE,CAAC,EACnG;QAAQ,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAE,OAAQ;QAAC,OAAO,EAAE,IAAK;QAAA,UAAC;MAAE,gBAAQ,CAAC;IAAA,eAC/D,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,YAAY,CAAC;EAAC,UAAU;EAAE,MAAM;EAAE;AAAO,CAAC,EAAE;EACnD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAI5C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,OAAO,CAAC;EACjD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC;EACjD,MAAM,aAAa,GAAG,mDAAY,CAAC,IAAI,CAAC;EACxC,MAAM;IAAC,UAAU;IAAE,KAAK;IAAE,GAAG;IAAE;EAAQ,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC;EAO3D,MAAM,QAAQ,GAAG,UAAU,GAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,iBAAiB,GAAI,eAAe;EAC3F,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG;IAAC;EAAK,CAAC;EACnD,sDAAe,CAAC,MAAM;IACpB,MAAM,KAAK,GAAG,OAAO,IAAI;MACvB,MAAM,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC;MACpC,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,CAAC,UAAU,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC;QAAE;MAAQ;MAa7D,MAAM,MAAM,GAAG,8CAAM,CAAC,cAAc,CAAC,GAAG,CAAC;MACzC,MAAM,GAAG,GAAI,MAAM,KAAK,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GAC/E,MAAM,GAAG,8DAAc,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;MAC9E,OAAO,CAAC;QAAC,IAAI,EAAE,GAAG,CAAC,IAAI;QAAE,IAAI,EAAE,GAAG,CAAC,IAAI;QAAE,IAAI,EAAE,8CAAM,CAAC,aAAa,CAAC,GAAG,CAAC;QAAE;MAAG,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,UAAU,EAAE;MACd,2DAAW,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC;MAAE,CAAC,CAAC;IACxJ,CAAC,MAAM,IAAI,KAAK,IAAI,GAAG,EAAE;MACvB,iEAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;QAC/C,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACzF,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC;MAC7B,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;QAAE,YAAY,CAAC,IAAI,CAAC;MAAE,CAAC,CAAC;IAC1E;EACF,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;EAChB,MAAM,KAAK,GAAG,MAAM;IAClB,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;IAOtB,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE;MAC9E,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;MACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG;MAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM;MACzD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;MAAE,IAAI,CAAC,KAAK,CAAC,CAAC;MAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;MAC9E,QAAQ,CAAC,MAAM,CAAC;MAChB;IACF;IAKA,MAAM,UAAU,GAAG,oEAAoB,CAAC,MAAM,CAAC;IAC/C,IAAI,CAAC,UAAU,EAAE;MAAE,OAAO,CAAC,WAAW,CAAC;MAAE;IAAQ;IACjD,aAAa,CAAC,OAAO,GAAG,UAAU;IAClC,QAAQ,CAAC,SAAS,CAAC;IAAE,WAAW,CAAC,CAAC,CAAC;IAInC,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAC/D,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAC1F,GAAG,IAAI;MAAE,QAAQ,CAAC,OAAO,CAAC;MAAE,OAAO,CAAE,GAAG,IAAI,GAAG,CAAC,OAAO,IAAK,MAAM,CAAC;IAAE,CAAC,CAAC;IACzE,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE;MACzB,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD;EACF,CAAC;EACD,MAAM,MAAM,GAAG,MAAM;IAAE,IAAI,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAAE,QAAQ,CAAC,OAAO,CAAC;IAAE,WAAW,CAAC,CAAC,CAAC;EAAE,CAAC;EACtH,IAAI,CAAC,IAAI,EAAE,OAAO;IAAK,SAAS,EAAC,cAAc;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,IAAI;MAAC,IAAI,EAAE,QAAS;MAAC,UAAU,EAAE;IAAW,gBAAE,CAAC;MAAM,SAAS,EAAC,kBAAkB;MAAA,UAC7I;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAE,SAAS,GAAG,YAAY,GAAG;MAAM,gBAAI;IAAC,gBACrE,CAAC;EAAA,eAAK,CAAC;EACb,OAAO;IAAK,SAAS,EAAC,cAAc;IAAA,WAClC,8DAAC,MAAM;MAAC,KAAK,EAAC,IAAI;MAAC,IAAI,EAAE,QAAS;MAAC,UAAU,EAAE;IAAW,gBAAE,CAAC,EAC7D;MAAM,SAAS,EAAC,kBAAkB;MAAA,WAChC;QAAM,SAAS,EAAC,uBAAuB;QAAA,UAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;MAAG,gBAAO,CAAC,EAC9E;QAAA,UAAK,IAAI,CAAC;MAAI,gBAAK,CAAC,EACpB;QAAA,UAAG;MAAU,gBAAG,CAAC,EAChB,KAAK,KAAK,SAAS,GAAG;QAAS,SAAS,EAAC,2BAA2B;QAAA,WACjE;UAAA,WAAK;YAAA,UAAM;UAAM,gBAAM,CAAC;YAAA,WAAS,QAAQ,EAAC,GAAC;UAAA,eAAQ,CAAC;QAAA,eAAK,CAAC,EAC1D;UAAU,KAAK,EAAE,QAAS;UAAC,GAAG,EAAC;QAAK,gBAAE,CAAC,EACvC;UAAA,WAAQ,mEAAgB,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,GAAG,GAAG,CAAC,EAAC,KAAG,EAAC,mEAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAA,eAAQ,CAAC;MAAA,eACtF,CAAC,GAAG,IAAI,EAClB,KAAK,KAAK,OAAO,GAAG;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,iBAAiB;QAAC,OAAO,EAAE,KAAM;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAQ,gBAAM,CAAC,SAAK,EAAC,mEAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAC,GAAC;MAAA,eAAQ,CAAC,GACtJ,KAAK,KAAK,SAAS,GAAG;QAAK,SAAS,EAAC,0BAA0B;QAAA,UAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAO;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAK,gBAAM,CAAC,MAAE;QAAA,eAAQ;MAAC,gBAAK,CAAC,GAC1I;QAAK,SAAS,EAAC,0BAA0B;QAAA,UAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,SAAS;UAAC,OAAO,EAAE,MAAM,OAAO,CAAC,kBAAkB,CAAE;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAW,gBAAM,CAAC,WAAO;QAAA,eAAQ;MAAC,gBAAK,CAAC;IAAA,eAC5K,CAAC;EAAA,eACJ,CAAC;AACR;AAWA,SAAS,SAAS,CAAC;EAAC,IAAI;EAAE;AAAK,CAAC,EAAE;EAChC,MAAM,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;EACnC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI;EACjC,MAAM,KAAK,GAAG,EAAE;EAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;EACnC,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;EACpC,IAAI,IAAI,GAAG,CAAC;EACZ,KAAK,IAAI,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE;IACvG,IAAI,EAAE,GAAG,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC;MAAA,UAAgB,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,MAAM;IAAC,GAAvC,EAAE,OAA4C,CAAC,CAAC;IACtE,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM;EAC3B;EACA,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI;EAC9B,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;EACpD,OAAO,KAAK;AACd;AAEA,SAAS,UAAU,CAAC;EAAC;AAAM,CAAC,EAAE;EAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;EAC/I,OAAO;IAAK,SAAS,EAAC,sBAAsB;IAAA,UAAE,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI;MAAQ,IAAI,EAAC,QAAQ;MAAe,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,EAAG;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE;MAAA,UAAE,IAAI,CAAC,CAAC;IAAC,GAAlG,IAAI,CAAC,CAAC,CAAC,OAAoG,CAAC;EAAC,gBAAM,CAAC;AAChN;AAEA,MAAM,cAAc,GAAG;EAAC,gBAAgB,EAAE,QAAQ;EAAE,eAAe,EAAE,IAAI;EAAE,eAAe,EAAE,IAAI;EAAE,gBAAgB,EAAE,IAAI;EAAE,gBAAgB,EAAE;AAAI,CAAC;AACjJ,MAAM,YAAY,GAAG;EAAC,gBAAgB,EAAE,KAAK;EAAE,eAAe,EAAE,MAAM;EAAE,eAAe,EAAE,MAAM;EAAE,gBAAgB,EAAE,OAAO;EAAE,gBAAgB,EAAE;AAAO,CAAC;AAItJ,MAAM,UAAU,GAAG;EAAC,KAAK,EAAE,MAAM;EAAE,KAAK,EAAE,MAAM;EAAE,KAAK,EAAE,MAAM;EAAE,IAAI,EAAE,MAAM;EAAE,IAAI,EAAE;AAAM,CAAC;AAE5F,SAAS,OAAO,CAAC;EAAC,IAAI;EAAE,UAAU;EAAE,QAAQ;EAAE;AAAO,CAAC,EAAE;EACtD,MAAM,KAAK,GAAG,UAAU,IAAI,UAAU,CAAC,KAAK;EAK5C,MAAM,QAAQ,GAAG,KAAK,GAAG,WAAW,KAAK,IAAI,IAAI,EAAE,GAAG,IAAI;EAG1D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACtD,MAAM,KAAK,GAAG,0EAAiB,CAAC,UAAU,EAAE,GAAG,CAAC;EAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,MAAO,QAAQ,IAAI,uEAAc,CAAC,QAAQ,CAAC,IAAK,IAAI,CAAC;EAC9F,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC9C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACnD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC,CAAC;EACpD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC,CAAC;EACxD,MAAM,IAAI,GAAG,wDAAiB,CAAE,MAAM,IAAK;IACzC,IAAI,CAAC,KAAK,EAAE;IACZ,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,KAAK,gBAAgB,GAAG,mEAAmB,CAAC,KAAK,EAAE;MAAC,KAAK;MAAE,IAAI;MAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG;IAAE,CAAC,CAAC,GAC9G,6DAAa,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC;IAClD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI;MAChB,QAAQ,CAAC,IAAI,IAAI;QACf,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,GAAI,IAAI,CAAC,KAAK,IAAI,EAAG;QAChF,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAE,wEAAe,CAAC,QAAQ,EAAE,IAAI,CAAC;QACvD,OAAO,IAAI;MACb,CAAC,CAAC;MACF,SAAS,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;MAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;IACnE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACjD,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;EAChC,sDAAe,CAAC,MAAM;IACpB,QAAQ,CAAE,CAAC,KAAK,IAAI,QAAQ,IAAI,uEAAc,CAAC,QAAQ,CAAC,IAAK,IAAI,CAAC;IAClE,IAAI,CAAC,KAAK,CAAC;EACb,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;EACxB,sDAAe,CAAC,MAAM;IACpB,IAAI,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,gBAAgB,EAAE;IAC5D,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI;MAC5B,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;MACzB,oBAAoB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;QAAE,IAAI,GAAG,EAAE,YAAY,CAAC,CAAC,KAAK;UAAC,GAAG,CAAC;UAAE,CAAC,IAAI,CAAC,GAAG,GAAG;QAAG,CAAC,CAAC,CAAC;MAAE,CAAC,CAAC;IACxH,CAAC,CAAC;EACJ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;EAIjB,sDAAe,CAAC,MAAM;IACpB,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI;MAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;MACtB,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,QAAQ,IAAK,KAAK,GAAG,IAAI,KAAM,QAAQ,EAAE;MACpF,8DAAc,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;QACrE,cAAc,CAAC,CAAC,KAAK;UAAC,GAAG,CAAC;UAAE,CAAC,IAAI,GAAG,CAAC,CAAC;QAAY,CAAC,CAAC,CAAC;MACvD,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC;EACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EAKX,MAAM,IAAI,GAAG,GAAG,IAAI,0DAAc,CAAC,UAAU,CAAC,0DAAc,CAAC,WAAW,CAAC,0DAAc,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;EAChI,MAAM,MAAM,GAAG,IAAI,IAAI;IACrB,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE;IACpB,IAAI,IAAI,KAAK,QAAQ,IAAK,KAAK,GAAG,IAAI,KAAM,QAAQ,EAAE,OAAO,GAAG;IAChE,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI;EAClC,CAAC;EACD,MAAM,QAAQ,GAAG,GAAG,IAAI;IACtB,wDAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;MACnC,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC,KAC3E,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,GAAG,cAAc,GAAG,iBAAiB,CAAC;IAC7E,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;EACrC,CAAC;EACD,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;EACxB,OAAO;IAAK,SAAS,EAAC,cAAc;IAAA,WAKlC,8DAAC,MAAM;MAAC,KAAK,EAAE,cAAc,CAAC,IAAI,CAAE;MAClC,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,gBAAgB,GAAG,iBAAkB;MAC9E,UAAU,EAAE,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG;QAAC;MAAK,CAAC,GAAG;QAAC,GAAG,EAAE;MAAK;IAAE,gBAAE,CAAC,EAC1E,IAAI,KAAK,gBAAgB,GAAG,8DAAC,MAAM;MAAC,KAAK,EAAE,UAAW;MAAC,QAAQ,EAAE,aAAc;MAAC,WAAW,EAAC;IAAQ,gBAAE,CAAC,GAAG,IAAI,EAC/G,8DAAC,UAAU;MAAC,MAAM,EAAE;IAAK,gBAAE,CAAC,EAC5B;MAAM,SAAS,EAAC,yBAAyB;MAAA,WACtC,KAAK,KAAK,IAAI,GAAG;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAC;MAAI,gBAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GACzE;QAAK,SAAS,EAAC,eAAe;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAE,IAAI,KAAK,gBAAgB,GAAG,YAAY,GAAG;QAAO,gBAAO,CAAC;UAAA,UAAQ;QAAI,gBAAQ,CAAC;MAAA,eAAK,CAAC,GAC7H,IAAI,KAAK,gBAAgB,GAAG;QAAS,SAAS,EAAC,yBAAyB;QAAA,UACrE,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI;UAAQ,IAAI,EAAC,QAAQ;UAAgB,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAE;UAAA,WACnF,8DAAC,MAAM;YAAC,IAAI,EAAE,CAAC;UAAE,gBAAE,CAAC;YAAA,WAAM;cAAA,UAAS,MAAM,CAAC,IAAI,CAAC,IAAI;YAAC,gBAAS,CAAC;cAAA,UAAI,IAAI,CAAC,IAAI,KAAK,MAAM,GACpF,8DAAC,SAAS;gBAAC,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,EAAG;gBAAC,KAAK,EAAE;cAAM,gBAAE,CAAC,GAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI;YAAG,gBAAI,CAAC,EAC1G;cAAA,UAAQ,kEAAe,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,gBAAQ,CAAC;UAAA,eAAM,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,GAH3C,IAAI,CAAC,GAAG,MAI7C,CAAC;MAAC,gBACH,CAAC,GACV,IAAI,KAAK,eAAe,GAAG;QAAS,SAAS,EAAC,sBAAsB;QAAA,UAAE,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI;UACrF,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC;UACpC,OAAO,8DAAC,uDAAc;YAAA,WACpB;cAAK,SAAS,EAAC,uBAAuB;cAAA,WAAC;gBAAA,UAAS,MAAM,CAAC,IAAI,CAAC,IAAI;cAAC,gBAAS,CAAC;gBAAA,UAAQ,kEAAe,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;cAAC,gBAAQ,CAAC;YAAA,eAAK,CAAC,EACpI,8DAAC,QAAQ;cAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAK;cAAC,IAAI,EAAE,GAAG,GAAG,8CAAM,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAK;cAAC,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,IAAK;cACnH,OAAO,EAAE,IAAI,CAAC,YAAY,KAAK,SAAU;cAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,eAAe,EAAE;gBAAC,KAAK;gBAAE,GAAG,EAAE,IAAI,CAAC;cAAG,CAAC;YAAE,gBAAE,CAAC;UAAA,GAHrF,IAAI,CAAC,GAAG,MAIpB,CAAC;QACnB,CAAC;MAAC,gBAAU,CAAC,GACb,IAAI,KAAK,eAAe,GAAG;QAAS,SAAS,EAAC,sBAAsB;QAAA,UAAE,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,8DAAC,uDAAc;UAAA,WAIpG;YAAQ,IAAI,EAAC,QAAQ;YAAC,SAAS,EAAC,uBAAuB;YAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAE;YAAA,WACpF;cAAA,UAAS,MAAM,CAAC,IAAI,CAAC,IAAI;YAAC,gBAAS,CAAC;cAAA,UAAQ,kEAAe,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,gBAAQ,CAAC;UAAA,eACjF,CAAC,EACT,8DAAC,QAAQ;YAAC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,GAAG;cAAC,GAAG,EAAE,IAAI,CAAC,GAAG;cAAE,GAAG,EAAE,IAAI,CAAC,GAAG;cAAE,GAAG,EAAE,IAAI,CAAC;YAAG,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC,IAAI,CAAE;YACpI,MAAM,EAAE,QAAS;YAAC,OAAO,EAAE,IAAI,CAAC,YAAY,KAAK;UAAU,gBAAE,CAAC;QAAA,GAR0C,IAAI,CAAC,GAAG,MASpG,CAAC;MAAC,gBAAU,CAAC,GAC7B;QAAS,SAAS,EAAC,oBAAoB;QAAA,UAAE,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,8DAAC,UAAU;UAAgB,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAE;UAAC,KAAK,EAAE,IAAI,KAAK,gBAAiB;UAC9I,QAAQ,EAAE,IAAI,CAAC,QAAS;UAAC,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAE;UAAC,OAAO,EAAE,IAAI,CAAC,YAAY,KAAK;QAAU,GADvB,IAAI,CAAC,GAAG,OACiB,CAAC;MAAC,gBAAU,CAAC,EAChH,OAAO,GAAG;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,mBAAmB;QAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAE;QAAA,UAAC;MAAI,gBAAQ,CAAC,GAAG,IAAI;IAAA,eAC1G,CAAC;EAAA,eACJ,CAAC;AACR;AAEe,SAAS,kBAAkB,CAAC;EAAC,IAAI;EAAE,UAAU;EAAE,MAAM;EAAE,QAAQ;EAAE,eAAe;EAAE;AAAQ,CAAC,EAAE;EAC1G,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAAE,IAAI,OAAO;EACzD,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,8DAAC,SAAS;IAAC,IAAI,EAAE,IAAK;IAAC,MAAM,EAAE,MAAO;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACpG,IAAI,IAAI,KAAK,gBAAgB,EAAE,OAAO,GAAG,8DAAC,aAAa;IAAC,UAAU,EAAE,UAAW;IAAC,QAAQ,EAAE,QAAS;IAAC,QAAQ,EAAE,QAAS;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC9I,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,OAAO,GAAG,8DAAC,YAAY;IAAC,UAAU,EAAE,UAAW;IAAC,MAAM,EAAE,MAAO;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC5H,OAAO,GAAG,8DAAC,OAAO;IAAC,IAAI,EAAE,IAAK;IAAC,UAAU,EAAE,UAAW;IAAC,QAAQ,EAAE,QAAS;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC;EACrG,OAAO;IAAA,WAAG,OAAO,EAAC,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAAE,CAAC;AAC5E,C;;;;;;;;;;;;;;;;;;;AC3mB0B;AAEwB;AAAA;AAElD,MAAM,QAAQ,GAAG,IAAI,IAAI,0DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;AAExD,MAAM,WAAW,GAAG;EAClB,sBAAsB,EAAE;IAAC,YAAY,EAAE,iBAAiB;IAAE,OAAO,EAAE;EAAiB,CAAC;EACrF,sBAAsB,EAAE;IAAC,YAAY,EAAE,iBAAiB;IAAE,OAAO,EAAE;EAAiB,CAAC;EACrF,uBAAuB,EAAE;IAAC,YAAY,EAAE,kBAAkB;IAAE,OAAO,EAAE;EAAkB,CAAC;EACxF,aAAa,EAAE;IAAC,YAAY,EAAE,QAAQ;IAAE,OAAO,EAAE;EAAQ,CAAC;EAC1D,aAAa,EAAE;IAAC,YAAY,EAAE,QAAQ;IAAE,OAAO,EAAE;EAAQ,CAAC;EAC1D,YAAY,EAAE;IAAC,YAAY,EAAE,QAAQ;IAAE,OAAO,EAAE;EAAO,CAAC;EACxD,cAAc,EAAE;IAAC,YAAY,EAAE,iBAAiB;IAAE,OAAO,EAAE;EAAS,CAAC;EACrE,cAAc,EAAE;IAAC,YAAY,EAAE,MAAM;IAAE,OAAO,EAAE;EAAS,CAAC;EAC1D,eAAe,EAAE;IAAC,YAAY,EAAE,QAAQ;IAAE,OAAO,EAAE;EAAU,CAAC;EAC9D,kBAAkB,EAAE;IAAC,YAAY,EAAE,QAAQ;IAAE,OAAO,EAAE;EAAa,CAAC;EACpE,YAAY,EAAE;IAAC,YAAY,EAAE,QAAQ;IAAE,OAAO,EAAE;EAAO,CAAC;EACxD,mBAAmB,EAAE;IAAC,YAAY,EAAE,QAAQ;IAAE,OAAO,EAAE;EAAc;AACvE,CAAC;AAED,MAAM,WAAW,GAAG,CAClB;EAAC,EAAE,EAAE,OAAO;EAAE,IAAI,EAAE,OAAO;EAAE,KAAK,EAAE;AAAI,CAAC,EACzC;EAAC,EAAE,EAAE,QAAQ;EAAE,IAAI,EAAE,cAAc;EAAE,KAAK,EAAE;AAAI,CAAC,EACjD;EAAC,EAAE,EAAE,MAAM;EAAE,IAAI,EAAE,MAAM;EAAE,KAAK,EAAE;AAAM,CAAC,EACzC;EAAC,EAAE,EAAE,MAAM;EAAE,IAAI,EAAE,cAAc;EAAE,KAAK,EAAE;AAAI,CAAC,EAC/C;EAAC,EAAE,EAAE,MAAM;EAAE,IAAI,EAAE,QAAQ;EAAE,KAAK,EAAE;AAAI,CAAC,EACzC;EAAC,EAAE,EAAE,UAAU;EAAE,IAAI,EAAE,UAAU;EAAE,KAAK,EAAE;AAAI,CAAC,EAC/C;EAAC,EAAE,EAAE,OAAO;EAAE,IAAI,EAAE,UAAU;EAAE,KAAK,EAAE;AAAM,CAAC,CAC/C;AAED,SAAS,IAAI,CAAC;EAAC;AAAQ,CAAC,EAAE;EACxB,OAAO;IAAG,SAAS,EAAC,gBAAgB;IAAC,eAAY,MAAM;IAAA,UAAE;EAAQ,gBAAI,CAAC;AACxE;AAEA,SAAS,KAAK,CAAC;EAAC,OAAO;EAAE;AAAM,CAAC,EAAE;EAChC,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,OAAO,EAAE,OAAO,SAAS;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;IAC7C,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EACzC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACrB,OAAO,OAAO,GAAG;IAAK,SAAS,EAAC,YAAY;IAAC,IAAI,EAAC,QAAQ;IAAA,UAAE;EAAO,gBAAM,CAAC,GAAG,IAAI;AACnF;AAEA,SAAS,UAAU,CAAC;EAAC,IAAI,GAAG,KAAK;EAAE,IAAI,GAAG;AAAK,CAAC,EAAE;EAChD,OAAO;IAAK,SAAS,EAAC,aAAa;IAAA,UAAC;MAAK,GAAG,EAAE,IAAI,GAAG,iBAAiB,GAAG,IAAI,GAAG,iBAAiB,GAAG,iBAAkB;MAAC,GAAG,EAAC;IAAE,gBAAE;EAAC,gBAAK,CAAC;AACxI;AAEA,SAAS,MAAM,CAAC;EAAC,KAAK;EAAE;AAAY,CAAC,EAAE;EACrC,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,EAAE,OAAO,IAAI;EACxC,OAAO;IAAK,SAAS,EAAE,qBAAqB,IAAI,YAAY,GAAG,SAAS,GAAG,EAAE,CAAE;IAAA,WAC5E,YAAY,GAAG,8DAAC,IAAI;MAAA,UAAC;IAAK,gBAAM,CAAC,GAAG,IAAI,EAAC;MAAA,UAAO,YAAY,IAAI;IAAK,gBAAO,CAAC;EAAA,eAC3E,CAAC;AACR;AAEA,SAAS,QAAQ,GAAG;EAClB,OAAO;IAAK,SAAS,EAAC,gBAAgB;IAAA,WACpC;MAAA,WAAK;QAAA,UAAQ;MAAoB,gBAAQ,CAAC;QAAA,UAAO;MAAK,gBAAO,CAAC;IAAA,eAAK,CAAC,EACpE;MAAM,SAAS,EAAC,gBAAgB;MAAA,UAAC;IAAC,gBAAM,CAAC;EAAA,eACtC,CAAC;AACR;AAEA,SAAS,WAAW,CAAC;EAAC;AAAM,CAAC,EAAE;EAC7B,OAAO;IAAQ,IAAI,EAAC,QAAQ;IAAC,SAAS,EAAC,mBAAmB;IAAC,OAAO,EAAE,MAAO;IAAA,WACzE;MAAA,WAAM;QAAK,GAAG,EAAC,iBAAiB;QAAC,GAAG,EAAC;MAAE,gBAAE,CAAC;QAAA,UAAQ;MAAI,gBAAQ,CAAC;IAAA,eAAM,CAAC,EACtE;MAAA,UAAO;IAAgB,gBAAO,CAAC;EAAA,eACzB,CAAC;AACX;AAEA,SAAS,YAAY,CAAC;EAAC,QAAQ,GAAG,CAAC;EAAE,OAAO,GAAG;AAAK,CAAC,EAAE;EACrD,OAAO;IAAK,SAAS,EAAC,oBAAoB;IAAA,WAAC,8DAAC,IAAI;MAAA,UAAE,OAAO,GAAG,YAAY,GAAG;IAAW,gBAAO,CAAC;MAAA,WAAS,QAAQ,EAAC,GAAC;IAAA,eAAQ,CAAC,yFAAO,CAAC;EAAA,eAAK,CAAC;AAC1I;AAEA,SAAS,YAAY,CAAC;EAAC;AAAQ,CAAC,EAAE;EAChC,OAAO;IAAK,SAAS,EAAC,oBAAoB;IAAA,WACxC;MAAK,GAAG,EAAC,iBAAiB;MAAC,GAAG,EAAC;IAAM,gBAAE,CAAC,EACvC,QAAQ,GAAG,GAAG,GAAG;MAAK,SAAS,EAAC,sBAAsB;MAAA,WAAC;QAAU,KAAK,EAAE,QAAS;QAAC,GAAG,EAAC;MAAK,gBAAE,CAAC;QAAA,WAAS,QAAQ,EAAC,GAAC;MAAA,eAAQ,CAAC;IAAA,eAAK,CAAC,GAAG,IAAI;EAAA,eACrI,CAAC;AACR;AAEA,SAAS,MAAM,CAAC;EAAC,IAAI,GAAG,KAAK;EAAE,QAAQ;EAAE,MAAM;EAAE,YAAY;EAAE,IAAI,GAAG,MAAM;EAAE;AAAU,CAAC,EAAE;EACzF,OAAO;IAAK,SAAS,EAAE,kBAAkB,IAAI,IAAI,GAAG,OAAO,GAAG,EAAE,CAAE;IAAA,WAC/D,CAAC,IAAI,GAAG,8DAAC,UAAU;MAAC,IAAI;IAAA,gBAAE,CAAC,GAAG,IAAI,EACnC;MAAK,SAAS,EAAC,oBAAoB;MAAA,WAChC,IAAI,KAAK,MAAM,GAAG,8DAAC,QAAQ,mBAAE,CAAC,GAAG,IAAI,KAAK,MAAM,GAAG,8DAAC,WAAW;QAAC,MAAM,EAAE;MAAW,gBAAE,CAAC,GACrF;QAAK,SAAS,EAAE,cAAc,GAAG,IAAI,IAAI,IAAI,GAAG,OAAO,GAAG,EAAE,CAAE;QAAA,UAAE;MAAQ,gBAAM,CAAC,EACjF,8DAAC,MAAM;QAAC,KAAK,EAAE,MAAO;QAAC,YAAY,EAAE;MAAa,gBAAE,CAAC;IAAA,eAClD,CAAC,EACL,IAAI,GAAG,8DAAC,UAAU;MAAC,IAAI;IAAA,gBAAE,CAAC,GAAG,IAAI;EAAA,eAC/B,CAAC;AACR;AAEA,SAAS,cAAc,CAAC;EAAC,QAAQ;EAAE,MAAM;EAAE;AAAQ,CAAC,EAAE;EACpD,OAAO;IAAK,SAAS,EAAC,sBAAsB;IAAA,WAAC;MAAA,UAAO;IAAQ,gBAAO,CAAC,EAAC,MAAM,GAAG;MAAQ,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,QAAS;MAAA,UAAE;IAAM,gBAAS,CAAC,GAAG,IAAI;EAAA,eAAM,CAAC;AACxJ;AAEA,SAAS,YAAY,CAAC;EAAC,OAAO;EAAE,cAAc;EAAE,UAAU;EAAE,OAAO;EAAE,UAAU;EAAE;AAAc,CAAC,EAAE;EAChG,IAAI,OAAO,KAAK,iBAAiB,IAAI,OAAO,KAAK,iBAAiB,EAAE;IAClE,OAAO;MAAA,WACL;QAAG,SAAS,EAAC,WAAW;QAAA,UAAC;MAAW,gBAAG,CAAC,EACxC,8DAAC,MAAM;QAAA,UAAE,OAAO,KAAK,iBAAiB,GAAG,UAAU,GAAG;MAAS,gBAAS,CAAC,EACzE,8DAAC,cAAc;QAAA,UAAC;MAAS,gBAAgB,CAAC,EAC1C;QAAK,SAAS,EAAC,sBAAsB;QAAA,WAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,cAAc,CAAC,UAAU,CAAE;UAAA,UAAC;QAAE,gBAAQ,CAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,SAAS;UAAC,OAAO,EAAE,MAAM,cAAc,CAAC,UAAU,CAAE;UAAA,UAAC;QAAI,gBAAQ,CAAC;MAAA,eAAK,CAAC;IAAA,eAC1N,CAAC;EACL;EAEA,IAAI,OAAO,KAAK,kBAAkB,EAAE;IAClC,OAAO;MAAA,WACL;QAAG,SAAS,EAAC,WAAW;QAAA,UAAC;MAAW,gBAAG,CAAC,EACxC,8DAAC,MAAM;QAAC,IAAI;QAAC,MAAM,EAAC,KAAK;QAAA,UAAC;MAAQ,gBAAQ,CAAC,EAC3C,8DAAC,cAAc;QAAA,UAAC;MAAc,gBAAgB,CAAC;IAAA,eAC/C,CAAC;EACL;EAEA,IAAI,OAAO,KAAK,QAAQ,EAAE;IACxB,OAAO;MAAA,WACL;QAAG,SAAS,EAAC,WAAW;QAAA,UAAC;MAAW,gBAAG,CAAC,EACxC,8DAAC,MAAM;QAAC,IAAI;QAAC,MAAM,EAAE,UAAW;QAAA,UAAC;MAAO,gBAAQ,CAAC,EACjD,8DAAC,cAAc;QAAA,UAAC;MAAgB,gBAAgB,CAAC;IAAA,eACjD,CAAC;EACL;EAEA,IAAI,OAAO,KAAK,QAAQ,EAAE;IACxB,OAAO;MAAA,WACL;QAAG,SAAS,EAAC,WAAW;QAAA,UAAC;MAAW,gBAAG,CAAC,EACxC,8DAAC,cAAc;QAAA,UAAC;MAAgB,gBAAgB,CAAC,EACjD,8DAAC,MAAM;QAAA,UAAC;MAAkB,gBAAQ,CAAC,EACnC,8DAAC,MAAM;QAAC,IAAI;QAAC,MAAM,EAAC,IAAI;QAAA,UAAC;MAAK,gBAAQ,CAAC;IAAA,eACvC,CAAC;EACL;EAEA,IAAI,OAAO,KAAK,OAAO,EAAE;IACvB,OAAO;MAAA,WACL;QAAG,SAAS,EAAC,WAAW;QAAA,UAAC;MAAW,gBAAG,CAAC,EACxC,8DAAC,cAAc;QAAA,UAAC;MAAO,gBAAgB,CAAC,EACxC,8DAAC,MAAM;QAAC,IAAI;QAAC,MAAM,EAAC,IAAI;QAAA,UAAC;MAAK,gBAAQ,CAAC,EACvC,8DAAC,MAAM;QAAC,IAAI;QAAC,IAAI,EAAC,OAAO;QAAA,UAAC,8DAAC,YAAY;UAAC,QAAQ,EAAE;QAAe,gBAAE;MAAC,gBAAQ,CAAC,EAC7E,8DAAC,MAAM;QAAC,IAAI;QAAC,IAAI,EAAC,OAAO;QAAA,UAAC,8DAAC,YAAY;UAAC,QAAQ,EAAE,CAAE;UAAC,OAAO;QAAA,gBAAE;MAAC,gBAAQ,CAAC,EACxE,8DAAC,MAAM;QAAC,IAAI,EAAC,OAAO;QAAA,UAAC,8DAAC,YAAY;UAAC,QAAQ,EAAE;QAAE,gBAAE;MAAC,gBAAQ,CAAC;IAAA,eAC3D,CAAC;EACL;EAEA,IAAI,OAAO,KAAK,SAAS,EAAE;IACzB,OAAO;MAAA,WACL;QAAG,SAAS,EAAC,WAAW;QAAA,UAAC;MAAW,gBAAG,CAAC,EACxC,8DAAC,MAAM;QAAC,IAAI;QAAC,MAAM,EAAC,IAAI;QAAA,UAAC;MAAQ,gBAAQ,CAAC,EAC1C,8DAAC,cAAc;QAAA,UAAC;MAAiB,gBAAgB,CAAC,EAClD;QAAG,SAAS,EAAC,WAAW;QAAA,UAAC;MAAW,gBAAG,CAAC,EACxC,8DAAC,MAAM;QAAC,IAAI;QAAC,MAAM,EAAC,IAAI;QAAA,UAAC;MAAqB,gBAAQ,CAAC,EACvD,8DAAC,MAAM;QAAA,UAAC;MAAgB,gBAAQ,CAAC,EACjC,8DAAC,MAAM;QAAC,IAAI;QAAC,YAAY,EAAC,eAAe;QAAA,UAAC;MAAmB,gBAAQ,CAAC,EACtE,8DAAC,MAAM;QAAC,IAAI;QAAC,YAAY,EAAC,eAAe;QAAA,UAAC;MAAW,gBAAQ,CAAC;IAAA,eAC9D,CAAC;EACL;EAEA,IAAI,OAAO,KAAK,SAAS,EAAE;IACzB,OAAO;MAAA,WACL;QAAG,SAAS,EAAC,WAAW;QAAA,UAAC;MAAW,gBAAG,CAAC,EACxC,8DAAC,MAAM;QAAC,IAAI;QAAC,MAAM,EAAC,IAAI;QAAA,UAAC;MAAsB,gBAAQ,CAAC,EACxD,8DAAC,MAAM;QAAA,UAAC;MAAqB,gBAAQ,CAAC,EACtC,8DAAC,MAAM;QAAC,IAAI;QAAC,MAAM,EAAC,IAAI;QAAA,UAAC;MAAsB,gBAAQ,CAAC,EACxD,8DAAC,cAAc;QAAC,MAAM,EAAC,QAAQ;QAAC,QAAQ,EAAE,MAAM,cAAc,CAAC,QAAQ,CAAE;QAAA,UAAC;MAAW,gBAAgB,CAAC,EACtG,8DAAC,MAAM;QAAC,IAAI;QAAC,YAAY,EAAC,cAAc;QAAA,UAAC;MAAa,gBAAQ,CAAC,EAC/D,8DAAC,cAAc;QAAC,MAAM,EAAC,QAAQ;QAAC,QAAQ,EAAE,MAAM,cAAc,CAAC,QAAQ,CAAE;QAAA,UAAC;MAAW,gBAAgB,CAAC;IAAA,eACtG,CAAC;EACL;EAEA,MAAM,IAAI,GAAG;IAAA,WACX;MAAG,SAAS,EAAC,WAAW;MAAA,UAAC;IAAW,gBAAG,CAAC,EACxC,8DAAC,MAAM;MAAC,IAAI;MAAC,MAAM,EAAC,IAAI;MAAA,UAAC;IAAQ,gBAAQ,CAAC,EAC1C,8DAAC,cAAc;MAAA,UAAC;IAAiB,gBAAgB,CAAC,EAClD;MAAG,SAAS,EAAC,WAAW;MAAA,UAAC;IAAW,gBAAG,CAAC,EACxC,8DAAC,MAAM;MAAC,IAAI;MAAC,MAAM,EAAC,IAAI;MAAA,UAAC;IAAqB,gBAAQ,CAAC,EACvD,8DAAC,MAAM;MAAA,UAAC;IAAuB,gBAAQ,CAAC;EAAA,eACxC,CAAC;EAEH,IAAI,OAAO,KAAK,UAAU,EAAE;IAC1B,OAAO;MAAA,WAAG,IAAI,EAAC,8DAAC,MAAM;QAAC,IAAI;QAAC,MAAM,EAAC,IAAI;QAAA,UAAC;MAAwB,gBAAQ,CAAC,gEAAC,MAAM;QAAC,IAAI;QAAC,IAAI,EAAC,MAAM;QAAC,MAAM,EAAC;MAAI,gBAAE,CAAC;IAAA,eAAE,CAAC;EACrH;EACA,IAAI,OAAO,KAAK,OAAO,EAAE;IACvB,OAAO;MAAA,WAAG,IAAI,EAAC,8DAAC,MAAM;QAAC,IAAI;QAAC,IAAI,EAAC,MAAM;QAAC,MAAM,EAAC;MAAK,gBAAE,CAAC,gEAAC,MAAM;QAAC,IAAI,EAAC,MAAM;QAAC,UAAU,EAAE;MAAW,gBAAE,CAAC;IAAA,eAAE,CAAC;EAC1G;EACA,IAAI,OAAO,KAAK,cAAc,EAAE;IAC9B,OAAO;MAAA,WAAG,IAAI,EAAC,8DAAC,MAAM;QAAC,IAAI;QAAC,MAAM,EAAC,IAAI;QAAA,UAAC;MAAwB,gBAAQ,CAAC,gEAAC,MAAM;QAAC,IAAI;QAAC,IAAI,EAAC,MAAM;QAAC,MAAM,EAAC,KAAK;QAAC,UAAU,EAAE;MAAW,gBAAE,CAAC,gEAAC,MAAM;QAAA,UAAC;MAAmB,gBAAQ,CAAC,gEAAC,MAAM;QAAC,IAAI;QAAC,MAAM,EAAC,IAAI;QAAA,UAAC;MAAY,gBAAQ,CAAC;IAAA,eAAE,CAAC;EAChO;EACA,OAAO,IAAI;AACb;AAEA,SAAS,eAAe,CAAC;EAAC;AAAQ,CAAC,EAAE;EACnC,OAAO;IAAK,SAAS,EAAC,uBAAuB;IAAA,UAC1C,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI;MAAQ,IAAI,EAAC,QAAQ;MAAe,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAE;MAAA,WAAC;QAAA,UAAM,8DAAC,IAAI;UAAA,UAAE,IAAI,CAAC;QAAI,gBAAO;MAAC,gBAAM,CAAC;QAAA,UAAQ,IAAI,CAAC;MAAK,gBAAQ,CAAC;IAAA,GAAxG,IAAI,CAAC,EAAE,MAAyG,CAAC;EAAC,gBACnK,CAAC;AACR;AAEA,SAAS,QAAQ,CAAC;EAAC,YAAY;EAAE,cAAc;EAAE,iBAAiB;EAAE;AAAM,CAAC,EAAE;EAC3E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,cAAc,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;EACvF,MAAM,OAAO,GAAG,YAAY,KAAK,QAAQ;EACzC,MAAM,WAAW,GAAG,KAAK,IAAI;IAC3B,QAAQ,CAAC,KAAK,CAAC;IACf,cAAc,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC;EAChD,CAAC;EACD,MAAM,MAAM,GAAG,CAAC,IAAI;IAClB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE;IAC/B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACpB,WAAW,CAAC,EAAE,CAAC;EACjB,CAAC;EACD,OAAO;IAAM,SAAS,EAAE,eAAe,IAAI,CAAC,OAAO,GAAG,SAAS,GAAG,EAAE,CAAE;IAAC,QAAQ,EAAE,MAAO;IAAA,WACtF;MAAQ,IAAI,EAAC,QAAQ;MAAC,cAAW,IAAI;MAAC,QAAQ,EAAE,CAAC,OAAQ;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,aAAa,CAAE;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAiB,gBAAM;IAAC,gBAAQ,CAAC,EACzI;MAAO,KAAK,EAAE,KAAM;MAAC,QAAQ,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;MAAC,WAAW,EAAE,OAAO,GAAG,MAAM,GAAG,YAAY,KAAK,iBAAiB,GAAG,UAAU,GAAG,YAAY,KAAK,kBAAkB,GAAG,YAAY,GAAG,UAAW;MAAC,QAAQ,EAAE,CAAC;IAAQ,gBAAE,CAAC,EAC1O;MAAQ,IAAI,EAAC,QAAQ;MAAC,cAAW,IAAI;MAAC,QAAQ,EAAE,CAAC,OAAQ;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,aAAa,CAAE;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAuB,gBAAM;IAAC,gBAAQ,CAAC,EAC9I,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,kBAAkB;MAAA,UAAC;IAAE,gBAAQ,CAAC,GAAG;MAAQ,IAAI,EAAC,QAAQ;MAAC,cAAW,IAAI;MAAC,QAAQ,EAAE,CAAC,OAAQ;MAAC,OAAO,EAAE,MAAM,iBAAiB,CAAC,CAAC,cAAc,CAAE;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAE,cAAc,GAAG,UAAU,GAAG;MAAoB,gBAAO;IAAC,gBAAQ,CAAC;EAAA,eACpQ,CAAC;AACT;AAEe,SAAS,iBAAiB,CAAC;EAAC;AAAI,CAAC,EAAE;EAChD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,eAAe,CAAC;EAChE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,qDAAc,CAAC,MAAM,CAAC,YAAY,CAAC;EAC3E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAM,CAAC,OAAO,CAAC;EAC5D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,qDAAc,CAAC,MAAM,CAAC,OAAO,KAAK,aAAa,CAAC;EAC5F,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,qDAAc,CAAC,MAAM,CAAC,OAAO,KAAK,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC;EACjG,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACzD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAE5C,sDAAe,CAAC,MAAM;IACpB,IAAI,OAAO,KAAK,QAAQ,EAAE,OAAO,SAAS;IAC1C,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,KAAK,MAAM,CAAC,UAAU,CAAC,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/G,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;EAClE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;EAEb,sDAAe,CAAC,MAAM;IACpB,IAAI,OAAO,KAAK,OAAO,IAAI,cAAc,IAAI,GAAG,EAAE,OAAO,SAAS;IAClE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,iBAAiB,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;IAChG,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EACzC,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;EAE7B,MAAM,YAAY,GAAG,MAAM,IAAI;IAC7B,IAAI,MAAM,KAAK,UAAU,EAAE;MACzB,eAAe,CAAC,MAAM,CAAC;MACvB,QAAQ,CAAC,SAAS,CAAC;IACrB,CAAC,MAAM;MACL,eAAe,CAAC,MAAM,KAAK,UAAU,GAAG,QAAQ,GAAG,kBAAkB,CAAC;MACtE,IAAI,MAAM,KAAK,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC;MAC/C,QAAQ,CAAC,MAAM,KAAK,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;IACzD;EACF,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,mBAAmB;IAAA,WACvC;MAAQ,SAAS,EAAC,qBAAqB;MAAA,WACrC;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,eAAe,CAAE;QAAC,cAAW,MAAM;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAkB,gBAAM;MAAC,gBAAQ,CAAC,EAC1H;QAAA,WAAK;UAAA,UAAI;QAAG,gBAAI,CAAC;UAAA,WAAM,oFAAI,CAAC,MAAE;QAAA,eAAM,CAAC;MAAA,eAAK,CAAC,EAC3C;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,iBAAiB,CAAE;QAAC,cAAW,MAAM;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAS,gBAAM;MAAC,gBAAQ,CAAC;IAAA,eAC7G,CAAC,EACT;MAAM,SAAS,EAAC,uBAAuB;MAAA,WACrC,8DAAC,YAAY;QAAC,OAAO,EAAE,OAAQ;QAAC,cAAc,EAAE,cAAe;QAAC,UAAU,EAAE,UAAW;QACrF,OAAO,EAAE,MAAM,QAAQ,CAAC,QAAQ,CAAE;QAAC,UAAU,EAAE,MAAM,QAAQ,CAAC,gBAAgB,CAAE;QAAC,cAAc,EAAE;MAAa,gBAAE,CAAC,EAClH,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,8DAAC,MAAM;QAAC,IAAI;QAAC,MAAM,EAAE,IAAI,CAAC,MAAO;QAAA,UAAgB,IAAI,CAAC;MAAI,GAAnB,IAAI,CAAC,EAAE,OAAqB,CAAC,CAAC;IAAA,eAC5F,CAAC,EACN,YAAY,KAAK,QAAQ,GAAG,IAAI,GAAG;MAAK,SAAS,EAAC,wBAAwB;MAAA,WAAC,8DAAC,IAAI;QAAA,UAAC;MAAY,gBAAM,CAAC,EAAC,YAAY,KAAK,iBAAiB,GAAG,eAAe,GAAG,YAAY,KAAK,kBAAkB,GAAG,YAAY,GAAG,YAAY,KAAK,MAAM,GAAG,sBAAsB,GAAG,eAAe;IAAA,eAAM,CAAC,EAC3R,8DAAC,QAAQ;MAAC,YAAY,EAAE,YAAa;MAAC,cAAc,EAAE,cAAe;MAAC,iBAAiB,EAAE,iBAAkB;MACzG,MAAM,EAAE,IAAI,IAAI;QACd,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,gBAAgB,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;UAAC,EAAE;UAAE,IAAI;UAAE,MAAM,EAAE;QAAK,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,UAAU,CAAC,MAAM,gBAAgB,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG;UAAC,GAAG,IAAI;UAAE,MAAM,EAAE;QAAK,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC;MAC9H;IAAE,gBAAE,CAAC,EACN,cAAc,IAAI,YAAY,KAAK,QAAQ,GAAG,8DAAC,eAAe;MAAC,QAAQ,EAAE,IAAI,IAAI;QAChF,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,eAAe,CAAC;QACzC,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,EAAE,QAAQ,CAAC,mBAAmB,CAAC;QACrD,IAAI,IAAI,CAAC,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,EAAE,KAAK,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC;QAC5E,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE,KAAK,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC;QACvE,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC;QAC/C,IAAI,IAAI,CAAC,EAAE,KAAK,UAAU,EAAE,QAAQ,CAAC,WAAW,CAAC;MACnD;IAAE,gBAAE,CAAC,GAAG,IAAI,EACZ,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAClD,CAAC;AACR,C;;;;;;;;;;;;;;;;;;;;;;;;;ACrR0B;AACI;AACM;AAEc;AASxB;AACqE;AAAA;AAI/F,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,KAAK,KAAK;EAChC,IAAI,IAAI,GAAG,0DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;EACrE,IAAI,GAAG,KAAK,GAAG,0DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,0DAAc,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC;EAC9G,0DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;AACjC,CAAC;AASD,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK;EAMnD,IAAI,MAAM,IAAI,MAAM,EAAE;IACpB,wEAAe,CAAC,eAAe,GAAG,MAAM,EAAE;MACxC,OAAO,EAAE,MAAM;MACf,YAAY,EAAE,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM;MACpE,cAAc,EAAE,MAAM,CAAC,cAAc;MACrC,IAAI,MAAM,CAAC,SAAS,GAAG;QAAC,SAAS,EAAE,MAAM,CAAC;MAAS,CAAC,GAAG,CAAC,CAAC,CAAC;MAC1D,IAAI,MAAM,CAAC,MAAM,GAAG;QAAC,MAAM,EAAE,MAAM,CAAC;MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;MACjD,IAAI,MAAM,CAAC,MAAM,GAAG;QAAC,MAAM,EAAE,MAAM,CAAC;MAAM,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC,CAAC;EACJ;EACA,0DAAc,CAAC,UAAU,CACvB,0DAAc,CAAC,WAAW,CAAC,0DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;EAK1H,IAAI,KAAK,IAAI,MAAM,EAAE;IACnB,qEAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MAChD,MAAM,OAAO,GAAG,uEAAc,CAAC,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;MAC9D,wEAAe,CAAC,eAAe,GAAG,MAAM,EAAE;QAAC,GAAG,OAAO;QAAE,GAAG;MAAI,CAAC,CAAC;MAChE,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,sBAAsB,EAAE;QAAC,MAAM,EAAE;UAAC,GAAG,EAAE;QAAM;MAAC,CAAC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EACpB;AACF,CAAC;AAEM,MAAM,sBAAsB,GAAG,CACpC,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,qBAAqB,EAClF,mBAAmB,EAAE,oBAAoB,EAAE,eAAe,EAAE,2BAA2B,EACvF,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EACxF,mBAAmB,EAAE,eAAe,EAAE,oBAAoB,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAC1G,iBAAiB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,qBAAqB,EACtF,gBAAgB,EAAE,aAAa,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,aAAa,EAC3F,mBAAmB,CACpB;AAID,SAAS,YAAY,CAAC,IAAI,EAAE;EAC1B,MAAM,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG;EACxC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;IACvB,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC;EACzB;EACA,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;IACpB,MAAM,MAAM,GAAG,kDAAM,CAAC,EAAE,EAAE;MAAC,OAAO,EAAE,OAAO;MAAE,QAAQ,EAAE;IAAM,CAAC,CAAC;IAC/D,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,GAAG;EAC3D;EACA,OAAO,GAAG;AACZ;AAEA,SAAS,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE;EAC5B,MAAM,MAAM,GAAG,CAAC,CAAC;EACjB,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI;IACnB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC;IACvB,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC;EAChD,CAAC,CAAC;EACF,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAClE;AAOA,SAAS,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE;EACvC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,IAAI;EAC/D,MAAM,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI;EACzE,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM;EAGzB,MAAM,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,EAAE,CAAC;EAC7D,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK;AAC3C;AAEA,SAAS,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE;EACvC,IAAI,KAAK,CAAC,YAAY,EAAE,OAAO,KAAK,CAAC,YAAY;EACjD,MAAM,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI;EACzE,OAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,IAAK,CAAC;AAC7B;AAEA,SAAS,SAAS,CAAC,GAAG,EAAE;EACtB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE;EACnB,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;EACvB,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;AACtE;AAMA,MAAM,OAAO,GAAG,CACd;EAAC,EAAE,EAAE,OAAO;EAAE,IAAI,EAAE,IAAI;EAAE,IAAI,EAAE,KAAK;EAAE,MAAM,EAAE;AAAiB,CAAC,EACjE;EAAC,EAAE,EAAE,MAAM;EAAE,IAAI,EAAE,MAAM;EAAE,IAAI,EAAE,IAAI;EAAE,MAAM,EAAE;AAAiB,CAAC,EACjE;EAAC,EAAE,EAAE,MAAM;EAAE,IAAI,EAAE,KAAK;EAAE,IAAI,EAAE,IAAI;EAAE,MAAM,EAAE;AAAiB,CAAC,EAChE;EAAC,EAAE,EAAE,KAAK;EAAE,IAAI,EAAE,KAAK;EAAE,IAAI,EAAE,IAAI;EAAE,MAAM,EAAE;AAAiB,CAAC,EAC/D;EAAC,EAAE,EAAE,KAAK;EAAE,IAAI,EAAE,KAAK;EAAE,IAAI,EAAE,IAAI;EAAE,MAAM,EAAE;AAAiB,CAAC,CAChE;AACD,MAAM,WAAW,GAAG;EAClB,KAAK,EAAE,CAAC;IAAC,EAAE,EAAE,SAAS;IAAE,IAAI,EAAE,OAAO;IAAE,KAAK,EAAE,EAAE;IAAE,MAAM,EAAE;EAAiB,CAAC;AAC9E,CAAC;AAED,SAAS,IAAI,CAAC;EAAC;AAAQ,CAAC,EAAE;EAAE,OAAO;IAAG,SAAS,EAAC,gBAAgB;IAAC,eAAY,MAAM;IAAA,UAAE;EAAQ,gBAAI,CAAC;AAAE;AAGpG,SAAS,MAAM,CAAC;EAAC,KAAK;EAAE,IAAI,GAAG,YAAY;EAAE,SAAS;EAAE,MAAM;EAAE,KAAK;EAAE;AAAO,CAAC,EAAE;EAC/E,OAAO;IAAQ,SAAS,EAAC,cAAc;IAAA,WACrC;MAAQ,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,MAAM;QAAE,IAAI,CAAC,0DAAc,CAAC,MAAM,CAAC,CAAC,EAAE;UAAE,IAAI,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAM,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;QAAE;MAAE,CAAE;MAAC,cAAW,IAAI;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAkB,gBAAM;IAAC,gBAAQ,CAAC,EAC1L;MAAA,UAAK;IAAK,gBAAK,CAAC,EACf,KAAK,GAAG;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,MAAM;MAAC,OAAO,EAAE,OAAQ;MAAA,UAAE;IAAK,gBAAS,CAAC,GAAG,uFAAO,CAAC;EAAA,eACvF,CAAC;AACX;AACA,SAAS,MAAM,CAAC;EAAC,IAAI;EAAE;AAAI,CAAC,EAAE;EAC5B,MAAM,MAAM,GAAG,IAAI,IAAI,IAAI,CAAC,cAAc;EAC1C,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAC1C,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,MAAM,EAAE;MAAE,MAAM,CAAC,IAAI,CAAC;MAAE,OAAO,SAAS;IAAE;IAC/C,IAAI,IAAI,GAAG,IAAI;IACf,0DAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,OAAO,MAAM;MAAE,IAAI,GAAG,KAAK;IAAE,CAAC;EAChC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;EACZ,OAAO;IAAM,SAAS,EAAC,cAAc;IAAA,UAAE,GAAG,GAAG;MAAK,GAAG,EAAE,GAAI;MAAC,GAAG,EAAC;IAAE,gBAAE,CAAC,GAAG,8DAAC,IAAI;MAAA,UAAE,IAAI,IAAI;IAAO,gBAAO;EAAC,gBAAO,CAAC;AAChH;AACA,SAAS,KAAK,CAAC;EAAC,OAAO;EAAE;AAAM,CAAC,EAAE;EAChC,sDAAe,CAAC,MAAM;IAAE,IAAI,CAAC,OAAO,EAAE,OAAO,SAAS;IAAE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;IAAE,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACrK,OAAO,OAAO,GAAG;IAAK,SAAS,EAAC,YAAY;IAAC,IAAI,EAAC,QAAQ;IAAA,UAAE;EAAO,gBAAM,CAAC,GAAG,IAAI;AACnF;AAGA,SAAS,WAAW,CAAC;EAAC,OAAO;EAAE;AAAM,CAAC,EAAE;EACtC,sDAAe,CAAC,MAAM;IAAE,IAAI,CAAC,OAAO,EAAE,OAAO,SAAS;IAAE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;IAAE,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACrK,OAAO,OAAO,GAAG;IAAK,SAAS,EAAC,oBAAoB;IAAC,IAAI,EAAC,QAAQ;IAAA,WAAC,8DAAC,IAAI;MAAA,UAAC;IAAY,gBAAM,CAAC;MAAA,UAAO;IAAO,gBAAO,CAAC;EAAA,eAAK,CAAC,GAAG,IAAI;AACjI;AACA,SAAS,MAAM,CAAC;EAAC,KAAK;EAAE,QAAQ;EAAE,WAAW,GAAG;AAAI,CAAC,EAAE;EACrD,OAAO;IAAO,SAAS,EAAC,cAAc;IAAA,WAAC,8DAAC,IAAI;MAAA,UAAC;IAAM,gBAAM,CAAC;MAAO,KAAK,EAAE,KAAM;MAAC,QAAQ,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAE;MAAC,WAAW,EAAE;IAAY,gBAAE,CAAC;EAAA,eAAO,CAAC;AACtK;AACA,SAAS,MAAM,CAAC;EAAC,OAAO;EAAE,QAAQ;EAAE;AAAQ,CAAC,EAAE;EAC7C,OAAO;IAAQ,IAAI,EAAC,QAAQ;IAAC,IAAI,EAAC,QAAQ;IAAC,gBAAc,OAAQ;IAAC,QAAQ,EAAE,QAAS;IACnF,SAAS,EAAE,cAAc,IAAI,OAAO,GAAG,UAAU,GAAG,EAAE,CAAE;IAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,OAAO,CAAE;IAAA,UAAC,oFAAI;EAAC,gBAAQ,CAAC;AAC3H;AAEA,SAAS,SAAS,CAAC;EAAC,MAAM;EAAE;AAAO,CAAC,EAAE;EAGpC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,MAAM,uEAAc,CAAC,QAAQ,CAAC,IAAI;IAAC,KAAK,EAAE,IAAI;IAAE,OAAO,EAAE,IAAI;IAAE,MAAM,EAAE;EAAI,CAAC,CAAC;EACtH,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC;IAAC,KAAK,EAAE,KAAK;IAAE,OAAO,EAAE,KAAK;IAAE,MAAM,EAAE;EAAK,CAAC,CAAC;EACjG,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,OAAO,CAAC;EAGvD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACtD,MAAM,KAAK,GAAG,0EAAiB,CAAC,UAAU,EAAE,GAAG,CAAC;EAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACrD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC1C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACzD,MAAM,MAAM,GAAG,wDAAiB,CAAC,MAAM;IACrC,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI;MAC5C,yDAAS,CAAC;QAAC,QAAQ,EAAE,GAAG;QAAE;MAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE;QAC9B,QAAQ,CAAC,CAAC,IAAI;UACZ,MAAM,IAAI,GAAG;YAAC,GAAG,CAAC;YAAE,CAAC,GAAG,GAAG;UAAK,CAAC;UACjC,IAAI,CAAC,KAAK,EAAE,wEAAe,CAAC,QAAQ,EAAE,IAAI,CAAC;UAC3C,OAAO,IAAI;QACb,CAAC,CAAC;MACJ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,CAAC,MAAM,CAAC;QAAE,aAAa,CAAC,CAAC,KAAK;UAAC,GAAG,CAAC;UAAE,CAAC,GAAG,GAAG;QAAI,CAAC,CAAC,CAAC;MAAE,CAAC,CAAC;IACjF,CAAC,CAAC;EACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,sDAAe,CAAC,MAAM;IAAE,MAAM,CAAC,CAAC;EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;EAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC;EAC/B,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,UAAU,EAAE;IAChC,aAAa,CAAC,IAAI,CAAC;IACnB,2DAAW,CAAC;MAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;IAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;MAC1C,WAAW,CAAC,KAAK,CAAC;MAAE,OAAO,CAAC,EAAE,CAAC;MAAE,OAAO,CAAC,QAAQ,CAAC;MAAE,MAAM,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;EACrF,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,MAAM;MAAC,KAAK,EAAC,IAAI;MAAC,IAAI,EAAC,cAAc;MAAC,KAAK,EAAC,IAAI;MAAC,OAAO,EAAE,MAAM,WAAW,CAAC,IAAI;IAAE,gBAAE,CAAC,EACtF,8DAAC,MAAM;MAAC,KAAK,EAAE,UAAW;MAAC,QAAQ,EAAE,aAAc;MAAC,WAAW,EAAC;IAAM,gBAAE,CAAC,EACzE;MAAK,SAAS,EAAC,YAAY;MAAA,UACxB,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAC7E;QAAQ,IAAI,EAAC,QAAQ;QAAW,SAAS,EAAE,QAAQ,KAAK,GAAG,GAAG,QAAQ,GAAG,EAAG;QAAC,OAAO,EAAE,MAAM,WAAW,CAAC,GAAG,CAAE;QAAA,WAC1G,KAAK,EAAC,GAAC,EAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAC,GACrC;MAAA,GAF2B,GAAG,MAEtB,CAAC;IAAC,gBACT,CAAC,EACN;MAAM,SAAS,EAAC,YAAY;MAAA,UACzB,OAAO,KAAK,IAAI,GAAG;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,SAAS,GAAG;MAAM,gBAAI,CAAC,GACnG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAChC;QAAQ,IAAI,EAAC,QAAQ;QAAmB,OAAO,EAAE,MAAM,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAE;QAAA,WAC7F,8DAAC,MAAM;UAAC,IAAI,EAAE;QAAM,gBAAE,CAAC,EACvB;UAAA,WAAM;YAAA,UAAS,gBAAgB,CAAC,MAAM,EAAE,KAAK;UAAC,gBAAS,CAAC;YAAA,WAAQ,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAC,MAAI;UAAA,eAAO,CAAC;QAAA,eAAM,CAAC,EACnH,8DAAC,IAAI;UAAA,UAAC;QAAa,gBAAM,CAAC;MAAA,GAHD,KAAK,CAAC,KAAK,MAI9B,CAAC,CAAC,GACV;QAAK,SAAS,EAAC,aAAa;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAM,gBAAM,CAAC;UAAA,UAAQ;QAAO,gBAAQ,CAAC,EACtE;UAAA,UAAI,QAAQ,KAAK,OAAO,GAAG,iBAAiB,GAAG;QAAmB,gBAAI,CAAC,EACvE;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,WAAW,CAAC,IAAI,CAAE;UAAA,UAAC;QAAI,gBAAQ,CAAC;MAAA,eAClE;IAAC,gBACN,CAAC,EACN,QAAQ,GAAG;MAAK,SAAS,EAAC,sBAAsB;MAAA,UAAC;QAAS,SAAS,EAAC,aAAa;QAAA,WAChF;UAAA,UAAI;QAAI,gBAAI,CAAC,EAMb;UAAA,WAAO,KAAG;YAAO,SAAS;YAAC,KAAK,EAAE,IAAK;YAAC,SAAS,EAAC,IAAI;YAAC,QAAQ,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAE;YAAC,WAAW,EAAC;UAAO,gBAAE,CAAC;QAAA,eAAO,CAAC,EACrI;UAAA,UAAG;QAAiB,gBAAG,CAAC,EACxB;UAAA,WACE;YAAQ,IAAI,EAAC,QAAQ;YAAC,OAAO,EAAE,MAAM,WAAW,CAAC,KAAK,CAAE;YAAA,UAAC;UAAE,gBAAQ,CAAC,EACpE;YAAQ,IAAI,EAAC,QAAQ;YAAC,SAAS,EAAC,SAAS;YAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,UAAW;YAAC,OAAO,EAAE,MAAO;YAAA,UAAC;UAAE,gBAAQ,CAAC;QAAA,eACtG,CAAC;MAAA,eACF;IAAC,gBAAK,CAAC,GAAG,IAAI;EAAA,eACpB,CAAC;AACR;AAKA,SAAS,UAAU,GAAG;EAAE,OAAO;IAAQ,SAAS,EAAC,mBAAmB;IAAA,WAAC;MAAQ,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,YAAY,CAAE;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAkB,gBAAM;IAAC,gBAAQ,CAAC;MAAA,WAAK;QAAA,UAAI;MAAK,gBAAI,CAAC;QAAA,UAAO;MAAG,gBAAO,CAAC;IAAA,eAAK,CAAC;MAAQ,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,gBAAgB,CAAE;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAS,gBAAM;IAAC,gBAAQ,CAAC;EAAA,eAAQ,CAAC;AAAE;AAChU,SAAS,WAAW,CAAC;EAAC;AAAQ,CAAC,EAAE;EAAE,OAAO;IAAG,SAAS,EAAC,oBAAoB;IAAA,UAAE;EAAQ,gBAAI,CAAC;AAAE;AAC5F,SAAS,SAAS,CAAC;EAAC,IAAI;EAAE;AAAO,CAAC,EAAE;EAClC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACjD,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAAC,8DAAC,UAAU,mBAAE,CAAC,EAAC,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,kBAAkB;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,qBAAqB,CAAE;MAAA,WAAC,8DAAC,IAAI;QAAA,UAAC;MAAc,gBAAM,CAAC;QAAA,WAAM;UAAA,UAAQ;QAAM,gBAAQ,CAAC;UAAA,UAAO;QAAS,gBAAO,CAAC;MAAA,eAAM,CAAC,gEAAC,IAAI;QAAA,UAAC;MAAa,gBAAM,CAAC;IAAA,eAAQ,CAAC,GAAG,IAAI,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,+BAA+B;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,2BAA2B,CAAE;MAAA,WAAC,8DAAC,IAAI;QAAA,UAAC;MAAQ,gBAAM,CAAC;QAAA,WAAM;UAAA,UAAQ;QAAG,gBAAQ,CAAC;UAAA,UAAO;QAAgB,gBAAO,CAAC;MAAA,eAAM,CAAC,gEAAC,IAAI;QAAA,UAAC;MAAa,gBAAM,CAAC;IAAA,eAAQ,CAAC,GAAG,IAAI,EAAC;MAAM,SAAS,EAAC,qBAAqB;MAAA,WAAC;QAAG,SAAS,EAAC,WAAW;QAAA,UAAC;MAAQ,gBAAG,CAAC,EAAC,IAAI,KAAK,cAAc,GAAG;QAAS,SAAS,EAAC,mBAAmB;QAAA,WAAC;UAAA,WAAK,8DAAC,MAAM;YAAC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;UAAE,gBAAE,CAAC;YAAA,WAAM;cAAA,UAAQ;YAAK,gBAAQ,CAAC;cAAA,UAAO;YAAS,gBAAO,CAAC;UAAA,eAAM,CAAC;QAAA,eAAK,CAAC;UAAA,UAAG;QAAgB,gBAAG,CAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,QAAQ,EAAE,MAAO;UAAC,OAAO,EAAE,MAAM;YAAC,SAAS,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,UAAU,CAAC;UAAC,CAAE;UAAA,UAAE,MAAM,GAAG,KAAK,GAAG;QAAM,gBAAS,CAAC;MAAA,eAAS,CAAC,GAAG;QAAA,WAAE,8DAAC,WAAW;UAAA,UAAC;QAAY,gBAAa,CAAC,gEAAC,WAAW;UAAA,UAAC;QAAc,gBAAa,CAAC;UAAK,SAAS,EAAC,oBAAoB;UAAA,WAAC,8DAAC,MAAM;YAAC,IAAI,EAAE,OAAO,CAAC,CAAC;UAAE,gBAAE,CAAC;YAAA,WAAK;cAAA,WAAM,KAAG;gBAAA,UAAI;cAAG,gBAAI,CAAC;YAAA,eAAM,CAAC;cAAA,UAAG;YAAkB,gBAAG,CAAC;UAAA,eAAK,CAAC;QAAA,eAAK,CAAC;UAAK,SAAS,EAAC,0BAA0B;UAAA,WAAC,8DAAC,MAAM;YAAC,IAAI,EAAE;cAAC,GAAG,OAAO,CAAC,CAAC,CAAC;cAAE,MAAM,EAAE;YAAiB;UAAE,gBAAE,CAAC;YAAA,WAAK;cAAA,WAAM,KAAG;gBAAA,UAAI;cAAE,gBAAI,CAAC;YAAA,eAAM,CAAC;cAAA,UAAG;YAAc,gBAAG,CAAC;UAAA,eAAK,CAAC;QAAA,eAAK,CAAC;MAAA,eAAE,CAAC;IAAA,eAAO,CAAC;MAAK,SAAS,EAAC,qBAAqB;MAAA,WAAC;QAAQ,IAAI,EAAC,QAAQ;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAiB,gBAAM;MAAC,gBAAQ,CAAC;QAAO,WAAW,EAAC;MAAM,gBAAE,CAAC;QAAQ,IAAI,EAAC,QAAQ;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAuB,gBAAM;MAAC,gBAAQ,CAAC;QAAQ,IAAI,EAAC,QAAQ;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAkB,gBAAM;MAAC,gBAAQ,CAAC;IAAA,eAAK,CAAC;EAAA,eAAK,CAAC;AACrrD;AAEA,SAAS,YAAY,CAAC;EAAC,KAAK;EAAE,QAAQ;EAAE;AAAO,CAAC,EAAE;EAQhD,MAAM,UAAU,GAAG,wDAAiB,CAAC,MAAM;IACzC,0DAAc,CAAC,UAAU,CAAC,0DAAc,CAAC,WAAW,CAAC,0DAAc,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;EACtG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,MAAO,KAAK,IAAI,uEAAc,CAAC,sBAAsB,GAAG,KAAK,CAAC,IAAK,IAAI,CAAC;EACjH,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC,CAAC;EAClD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAKvD,MAAM,UAAU,GAAG,mDAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;EAC1C,MAAM,IAAI,GAAG,wDAAiB,CAAC,MAAM;IACnC,IAAI,CAAC,KAAK,EAAE;IACZ,oEAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE;MAC7B,wEAAe,CAAC,sBAAsB,GAAG,KAAK,EAAE,IAAI,CAAC;MACrD,QAAQ,CAAC,IAAI,CAAC;MACd,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC;MACrB,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI;QAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QAAE,IAAI,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;MAAE,CAAC,CAAC;MACnF,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI;QAChB,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAChC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,8DAAc,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,KAAK;UAAC,GAAG,CAAC;UAAE,CAAC,EAAE,GAAG;QAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;UAAE,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAAE,CAAC,CAAC;MACnH,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;MAAE,OAAO,CAAC,MAAM,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC;EAC1D,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,sDAAe,CAAC,MAAM;IAAE,QAAQ,CAAE,KAAK,IAAI,uEAAc,CAAC,sBAAsB,GAAG,KAAK,CAAC,IAAK,IAAI,CAAC;IAAE,IAAI,CAAC,CAAC;EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;EAC9H,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK;IAC9B,MAAM,IAAI,GAAG,MAAM,GAAG,sEAAsB,CAAC,KAAK,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,sEAAsB,CAAC,KAAK,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC;IAC7I,IAAI,CAAC,IAAI,CAAC,MAAM;MAAE,OAAO,CAAC,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;MAAE,IAAI,CAAC,CAAC;IAAE,CAAC,CAAC,CAClE,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACjD,CAAC;EACD,MAAM,MAAM,GAAG,EAAE,IAAK,QAAQ,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC,YAAY,IAAK,EAAE;EACtE,MAAM,QAAQ,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,GAC7E,GAAG,CAAC,UAAU,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ;EAGzG,MAAM,WAAW,GAAG;IAAC,QAAQ,EAAE,KAAK;IAAE,QAAQ,EAAE,KAAK;IAAE,QAAQ,EAAE,KAAK;IAAE,OAAO,EAAE;EAAK,CAAC;EACvF,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,MAAM;MAAC,KAAK,EAAC,QAAQ;MAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,kBAAmB;MAAC,SAAS,EAAE,KAAM;MACvF,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG;IAAU,gBAAE,CAAC,EAC/C;MAAM,SAAS,EAAC,oBAAoB;MAAA,UACjC,KAAK,KAAK,IAAI,GAAG;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAE,SAAS,GAAG,UAAU,GAAG;MAAM,gBAAI,CAAC,GACvF,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,IAC3B;QAAA,WACE,8DAAC,MAAM;UAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,gBAAE,CAAC,EAC9C;UAAA,WAAK;YAAA,UAAS,QAAQ,CAAC,IAAI;UAAC,gBAAS,CAAC;YAAA,UAAQ,SAAS,CAAC,IAAI,CAAC,UAAU;UAAC,gBAAQ,CAAC;QAAA,eAAK,CAAC,EACtF,IAAI,CAAC,MAAM,KAAK,SAAS,GACxB;UAAA,WACE;YAAQ,IAAI,EAAC,QAAQ;YAAC,OAAO,EAAE,MAAM,MAAM,CAAC,IAAI,EAAE,KAAK,CAAE;YAAA,UAAC;UAAE,gBAAQ,CAAC,EACrE;YAAQ,IAAI,EAAC,QAAQ;YAAC,SAAS,EAAC,SAAS;YAAC,OAAO,EAAE,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,CAAE;YAAA,UAAC;UAAE,gBAAQ,CAAC;QAAA,eACpF,CAAC,GACP;UAAA,UAAK,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;QAAM,gBAAK,CAAC;MAAA,GARxC,IAAI,CAAC,UAAU,MASpB,CAAC,CAAC,GACX;QAAK,SAAS,EAAC,oBAAoB;QAAA,UAAC;MAAM,gBAAK;IAAC,gBAChD,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,YAAY,CAAC;EAAC,KAAK;EAAE,MAAM;EAAE,QAAQ;EAAE;AAAO,CAAC,EAAE;EAIxD,MAAM,kBAAkB,GAAG,KAAK,IAAI,uEAAc,CAAC,qBAAqB,GAAG,KAAK,CAAC;EACjF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,MAAM,kBAAkB,IAAI,IAAI,CAAC;EACxE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,MAAO,kBAAkB,IAAI,kBAAkB,CAAC,OAAO,IAAK,EAAE,CAAC;EACxG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACnD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACjD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,OAAO,GAAG,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,OAAO;EASxD,MAAM,UAAU,GAAG,wDAAiB,CAAC,MAAM;IACzC,0DAAc,CAAC,UAAU,CAAC,0DAAc,CAAC,WAAW,CAAC,0DAAc,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;EACtG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,KAAK,EAAE;IACZ,MAAM,MAAM,GAAG,uEAAc,CAAC,qBAAqB,GAAG,KAAK,CAAC;IAC5D,IAAI,MAAM,EAAE;MAAE,OAAO,CAAC,MAAM,CAAC;MAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAAE;IAC/D,0EAA0B,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAC1C,wEAAe,CAAC,qBAAqB,GAAG,KAAK,EAAE,CAAC,CAAC;MACjD,OAAO,CAAC,CAAC,CAAC;MAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;MAAE,OAAO,CAAC,MAAM,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC;EAC1D,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,MAAM,OAAO,GAAG,MAAM;IACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,EAAE;IAC7B,SAAS,CAAC,IAAI,CAAC;IACf,8EAA8B,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MACrF,wEAAe,CAAC,qBAAqB,GAAG,KAAK,EAAE,CAAC,CAAC;MACjD,OAAO,CAAC,CAAC,CAAC;MAAE,UAAU,CAAC,KAAK,CAAC;MAAE,OAAO,CAAC,QAAQ,CAAC;IAClD,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;EACjF,CAAC;EAID,MAAM,eAAe,GAAG,mDAAY,CAAC,IAAI,CAAC;EAC1C,sDAAe,CAAC,MAAM;IACpB,MAAM,EAAE,GAAG,IAAI,IAAI,IAAI,CAAC,eAAe;IACvC,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,eAAe,CAAC,OAAO,KAAK,EAAE,EAAE;IACrD,eAAe,CAAC,OAAO,GAAG,EAAE;IAC5B,qEAAqB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EAClD,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;EACjB,IAAI,CAAC,IAAI,EAAE,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,KAAK;MAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,gBAAiB;MAAC,SAAS,EAAE,KAAM;MAAC,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG;IAAU,gBAAE,CAAC;MAAM,SAAS,EAAC,2BAA2B;MAAA,UAAC;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAE,SAAS,GAAG,SAAS,GAAG;MAAM,gBAAI;IAAC,gBAAM,CAAC;EAAA,eAAK,CAAC;EAC/S,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,MAAM;MAAC,KAAK,EAAC,KAAK;MAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,gBAAiB;MAAC,SAAS,EAAE,KAAM;MAAC,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAU;MAC7H,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,IAAK;MAAC,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG;IAAU,gBAAE,CAAC,EAC1E;MAAM,SAAS,EAAC,2BAA2B;MAAA,WACxC,OAAO,GAAG;QAAU,SAAS,EAAE,OAAQ;QAAC,KAAK,EAAE,KAAM;QAAC,SAAS,EAAE,IAAK;QACrE,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;QAAC,OAAO,EAAE,MAAM,UAAU,CAAC,IAAI,CAAE;QACzE,WAAW,EAAC;MAAU,gBAAE,CAAC,GACzB;QAAA,WACE,8DAAC,IAAI;UAAA,UAAC;QAAQ,gBAAM,CAAC,EACrB;UAAA,UAAI,IAAI,CAAC,OAAO,IAAI;QAAO,gBAAI,CAAC;MAAA,eAChC,CAAC,EACJ,CAAC,OAAO,GAAG;QAAO,SAAS,EAAC,mBAAmB;QAAA,UAAC;MAAW,gBAAO,CAAC,GAAG,IAAI;IAAA,eACvE,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,aAAa,CAAC;EAAC,KAAK;EAAE,QAAQ;EAAE,MAAM;EAAE;AAAO,CAAC,EAAE;EAKzD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,MAAO,KAAK,IAAI,uEAAc,CAAC,iBAAiB,GAAG,KAAK,CAAC,IAAK,IAAI,CAAC;EAC5G,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAIvD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAM;IACjD,MAAM,MAAM,GAAG,KAAK,IAAI,uEAAc,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChE,OAAO,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE;EACzC,CAAC,CAAC;EACF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,qDAAc,CAAC,MAAM;IAC3D,MAAM,MAAM,GAAG,KAAK,IAAI,uEAAc,CAAC,qBAAqB,GAAG,KAAK,CAAC;IACrE,OAAO,MAAM,IAAI,MAAM,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI;EACjD,CAAC,CAAC;EACF,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,KAAK,EAAE;IACZ,QAAQ,CAAC,uEAAc,CAAC,iBAAiB,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC;IAC3D,UAAU,CAAC,CAAC,uEAAc,CAAC,gBAAgB,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,uEAAc,CAAC,qBAAqB,GAAG,KAAK,CAAC;IAC/D,eAAe,CAAC,SAAS,IAAI,SAAS,CAAC,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IAClE,gEAAgB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,iBAAiB,GAAG,KAAK,EAAE,CAAC,CAAC;MAAE,QAAQ,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;MAAE,OAAO,CAAC,MAAM,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC;IACxJ,+DAAe,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE;MAC9B,wEAAe,CAAC,gBAAgB,GAAG,KAAK,EAAE,KAAK,CAAC;MAChD,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAClB,0EAA0B,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAC1C,wEAAe,CAAC,qBAAqB,GAAG,KAAK,EAAE,CAAC,CAAC;MACjD,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC;IAC5C,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EACpB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,MAAM,OAAO,GAAG,KAAK,IAAI;IACvB,yEAAyB,CAAC,KAAK,EAAE;MAAC,MAAM,EAAE,KAAK,CAAC,MAAM;MAAE,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;MAAE,GAAG;IAAK,CAAC,CAAC,CAC7G,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,IAAI;MACxB,MAAM,IAAI,GAAG;QAAC,GAAG,CAAC;QAAE,GAAG;MAAK,CAAC;MAC7B,wEAAe,CAAC,iBAAiB,GAAG,KAAK,EAAE,IAAI,CAAC;MAChD,OAAO,IAAI;IACb,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACpD,CAAC;EACD,MAAM,KAAK,GAAG,MAAM;IAClB,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE;MAAE,OAAO,CAAC,eAAe,CAAC;MAAE;IAAQ;IAC5E,0DAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM;MAAE,OAAO,CAAC,OAAO,CAAC;MAAE,QAAQ,CAAC,YAAY,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EAC1H,CAAC;EACD,IAAI,CAAC,KAAK,EAAE,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC;IAAY,gBAAE,CAAC;MAAM,SAAS,EAAC,gBAAgB;MAAA,UAAC;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAE,SAAS,GAAG,UAAU,GAAG;MAAM,gBAAI;IAAC,gBAAM,CAAC;EAAA,eAAK,CAAC;EAC7M,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC,mBAAmB;EAC5E,MAAM,KAAK,GAAG,CACZ,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EACpC,CAAC,2BAA2B,EAAE,KAAK,EAAE,YAAY,GAAG,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC,EACnF,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,CAAC,EAC1B,CAAC,mBAAmB,EAAE,SAAS,EAAE,EAAE,CAAC,CACrC;EACD,IAAI,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;EACnE,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC,YAAY;MAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,IAAK;MACpE,OAAO,EAAE,SAAS,GAAG,MAAM,QAAQ,CAAC,kBAAkB,EAAE,KAAK,CAAC,GAAG;IAAU,gBAAE,CAAC,EAChF;MAAM,SAAS,EAAC,gBAAgB;MAAA,WAC9B;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,uBAAuB;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAE;QAAA,WACtG,8DAAC,MAAM;UAAC,IAAI,EAAE;QAAM,gBAAE,CAAC,EACvB;UAAA,WAAM;YAAA,UAAS,KAAK,CAAC;UAAI,gBAAS,CAAC;YAAA,UAAQ,KAAK,CAAC,WAAW,IAAI;UAAa,gBAAQ,CAAC;QAAA,eAAM,CAAC,EAC7F,8DAAC,IAAI;UAAA,UAAC;QAAa,gBAAM,CAAC;MAAA,eACpB,CAAC,EAKT;QAAS,SAAS,EAAC,sBAAsB;QAAA,WACvC;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,4BAA4B;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAE;UAAA,WAC3G;YAAA,UAAQ;UAAG,gBAAQ,CAAC;YAAA,WAAO,IAAE,EAAC,KAAK,CAAC,YAAY,EAAC,MAAI;UAAA,eAAO,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,eACjF,CAAC,EACT;UAAK,SAAS,EAAC,mBAAmB;UAAA,WAC/B,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI;YAAQ,IAAI,EAAC,QAAQ;YAAoB,OAAO,EAAE,MAAM,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAE;YAAA,WACpI,8DAAC,MAAM;cAAC,IAAI,EAAE,IAAK;cAAC,IAAI,EAAC;YAAQ,gBAAE,CAAC;cAAA,UAAQ,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC;YAAY,gBAAQ,CAAC;UAAA,GADnC,IAAI,CAAC,OAAO,MAEhE,CAAC,CAAC,EACV;YAAQ,IAAI,EAAC,QAAQ;YAAC,OAAO,EAAE,MAAM,OAAO,CAAC,kBAAkB,CAAE;YAAA,WAC/D;cAAM,SAAS,EAAC,0BAA0B;cAAA,UAAC,8DAAC,IAAI;gBAAA,UAAC;cAAG,gBAAM;YAAC,gBAAM,CAAC;cAAA,UAAO;YAAE,gBAAO,CAAC;UAAA,eAC7E,CAAC;QAAA,eACN,CAAC;MAAA,eACC,CAAC,EACV;QAAA,UAAU,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI;UAAQ,IAAI,EAAC,QAAQ;UAAe,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAE;UAAA,WACtG;YAAA,UAAO,IAAI,CAAC,CAAC;UAAC,gBAAO,CAAC;YAAA,UAAQ,IAAI,CAAC,CAAC;UAAC,gBAAQ,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,GADnB,IAAI,CAAC,CAAC,CAAC,MAEtD,CAAC;MAAC,gBAAU,CAAC,EACrB;QAAA,WACE;UAAA,WAAK;YAAA,UAAM;UAAI,gBAAM,CAAC,gEAAC,MAAM;YAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,MAAO;YAAC,QAAQ,EAAE,CAAC,IAAI,OAAO,CAAC;cAAC,MAAM,EAAE;YAAC,CAAC;UAAE,gBAAE,CAAC;QAAA,eAAK,CAAC,EACpG;UAAA,WAAK;YAAA,UAAM;UAAK,gBAAM,CAAC,gEAAC,MAAM;YAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAmB;YAAC,QAAQ,EAAE,CAAC,IAAI,OAAO,CAAC;cAAC,kBAAkB,EAAE;YAAC,CAAC;UAAE,gBAAE,CAAC;QAAA,eAAK,CAAC,EAC7H;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAE;UAAA,WAAC;YAAA,UAAM;UAAM,gBAAM,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,eAAQ,CAAC,EAC9H;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM;YACnC,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI;YAChD,CAAC,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;UAC/H,CAAE;UAAA,WAAC;YAAA,UAAM;UAAM,gBAAM,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,eAAQ,CAAC,EAKzD;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM;YACnC,IAAI,IAAI,GAAG,0DAAc,CAAC,eAAe,CAAC,EAAE,EAAE,sBAAsB,CAAC;YACrE,IAAI,GAAG,0DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC;YAC/D,IAAI,GAAG,0DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC;YAC3D,IAAI,GAAG,0DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,EAAG,KAAK,IAAI,KAAK,CAAC,IAAI,IAAK,KAAK,CAAC;YACtF,0DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;UACjC,CAAE;UAAA,WAAC;YAAA,UAAM;UAAK,gBAAM,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,eAAQ,CAAC;MAAA,eACjD,CAAC,EACV;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,cAAc;QAAC,OAAO,EAAE,KAAM;QAAA,UAAC;MAAI,gBAAQ,CAAC;IAAA,eACxE,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,YAAY,CAAC;EAAC,KAAK;EAAE,QAAQ;EAAE;AAAO,CAAC,EAAE;EAGhD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,MAAO,KAAK,IAAI,uEAAc,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAK,IAAI,CAAC;EACnG,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAOvD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACtD,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,KAAK,EAAE;IACZ,QAAQ,CAAC,uEAAc,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC;IAClD,wDAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC;MAAE,QAAQ,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;MAAE,OAAO,CAAC,MAAM,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC;EACzI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,KAAK,EAAE;IACZ,iEAAiB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MACpC,aAAa,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EACpB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,IAAI,CAAC,KAAK,EAAE,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,KAAK;MAAC,IAAI,EAAC,gBAAgB;MAAC,SAAS,EAAE;IAAM,gBAAE,CAAC;MAAM,SAAS,EAAC,eAAe;MAAA,UAAC;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAE,SAAS,GAAG,UAAU,GAAG;MAAM,gBAAI;IAAC,gBAAM,CAAC;EAAA,eAAK,CAAC;EACjO,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC,gBAAgB;EACvE,MAAM,aAAa,GAAG,UAAU,IAAI,KAAK;EACzC,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,MAAM;MAAC,KAAK,EAAC,KAAK;MAAC,IAAI,EAAC,gBAAgB;MAAC,SAAS,EAAE;IAAM,gBAAE,CAAC,EAC9D;MAAM,SAAS,EAAC,eAAe;MAAA,WAC7B;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,sBAAsB;QAAC,QAAQ,EAAE,CAAC,OAAQ;QAAC,OAAO,EAAE,MAAM,OAAO,IAAI,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAE;QAAA,WACnI,8DAAC,MAAM;UAAC,IAAI,EAAE;QAAM,gBAAE,CAAC;UAAA,UAAM;QAAG,gBAAM,CAAC,gEAAC,IAAI;UAAA,UAAC;QAAa,gBAAM,CAAC;MAAA,eAC3D,CAAC,EACT;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,mBAAmB,EAAE,KAAK,CAAE;QAAA,WACtE;UAAA,UAAM;QAAG,gBAAM,CAAC;UAAA,UAAQ;QAAa,gBAAQ,CAAC,gEAAC,IAAI;UAAA,UAAC;QAAa,gBAAM,CAAC;MAAA,eAClE,CAAC,EACV,OAAO,GAAG;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAE;QAAA,WAC9E;UAAA,UAAM;QAAG,gBAAM,CAAC;UAAA,UAAQ,KAAK,CAAC;QAAI,gBAAQ,CAAC,gEAAC,IAAI;UAAA,UAAC;QAAa,gBAAM,CAAC;MAAA,eAC/D,CAAC,GACT;QAAA,WAAK;UAAA,UAAM;QAAG,gBAAM,CAAC;UAAA,UAAQ,KAAK,CAAC;QAAI,gBAAQ,CAAC;MAAA,eAAK,CAAC,EACvD,OAAO,GAAG;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,mBAAmB,EAAE,KAAK,CAAE;QAAA,WACjF;UAAA,UAAM;QAAG,gBAAM,CAAC;UAAA,UAAQ,KAAK,CAAC,WAAW,IAAI;QAAa,gBAAQ,CAAC,gEAAC,IAAI;UAAA,UAAC;QAAa,gBAAM,CAAC;MAAA,eACvF,CAAC,GACT;QAAA,WAAK;UAAA,UAAM;QAAG,gBAAM,CAAC;UAAA,UAAQ,KAAK,CAAC,WAAW,IAAI;QAAa,gBAAQ,CAAC;MAAA,eAAK,CAAC,EAChF;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAE;QAAA,WAAC;UAAA,UAAM;QAAI,gBAAM,CAAC,gEAAC,IAAI;UAAA,UAAC;QAAO,gBAAM,CAAC,gEAAC,IAAI;UAAA,UAAC;QAAa,gBAAM,CAAC;MAAA,eAAQ,CAAC,EAC1I;QAAA,WAAI,KAAK,CAAC,YAAY,EAAC,MAAI;MAAA,eAAG,CAAC;IAAA,eAC3B,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,WAAW,CAAC;EAAC,KAAK;EAAE,QAAQ;EAAE,MAAM;EAAE;AAAO,CAAC,EAAE;EACvD,MAAM,QAAQ,GAAG,mDAAY,CAAC,IAAI,CAAC;EACnC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;EAC/D,MAAM,MAAM,GAAG,CAAC,IAAI;IAClB,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;IACnB,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;IACtB,YAAY,CAAC,IAAI,CAAC;IAKlB,+DAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAC1B,IAAI,CAAC,CAAC;MAAC;IAAM,CAAC,KAAK,wDAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,2DAAW,CAAC,KAAK,EAAE;MAAC,cAAc,EAAE,MAAM;MAAE,OAAO,EAAE,KAAK,CAAC;IAAO,CAAC,CAAC,CAAC,CAAC,CACvH,IAAI,CAAC,MAAM;MAAE,OAAO,CAAC,QAAQ,CAAC;MAAE,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC;IAAE,CAAC,CAAC,CACpE,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;EACpF,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,YAAY;MAAC,KAAK,EAAE,KAAM;MAAC,OAAO,EAAE;IAAQ,gBAAE,CAAC,EAChD;MAAO,GAAG,EAAE,QAAS;MAAC,IAAI,EAAC,MAAM;MAAC,MAAM,EAAC,SAAS;MAAC,KAAK,EAAE;QAAC,OAAO,EAAE;MAAM,CAAE;MAAC,QAAQ,EAAE;IAAO,gBAAE,CAAC,EACjG;MAAK,SAAS,EAAC,sBAAsB;MAAA,UAAC;QAAS,SAAS,EAAC,oBAAoB;QAAA,WAC3E;UAAA,UAAI;QAAK,gBAAI,CAAC,EACd;UAAQ,IAAI,EAAC,QAAQ;UAAC,QAAQ,EAAE,SAAU;UAAC,OAAO,EAAE,IAAK;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC,EAAC,SAAS,GAAG,OAAO,GAAG,OAAO;QAAA,eAAS,CAAC,EAC5H;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAE;UAAA,UAAC;QAAE,gBAAQ,CAAC;MAAA,eAC3E;IAAC,gBAAK,CAAC;EAAA,eACb,CAAC;AACR;AAEA,SAAS,OAAO,CAAC;EAAC,KAAK;EAAE;AAAO,CAAC,EAAE;EACjC,MAAM,GAAG,GAAG,mDAAY,CAAC,IAAI,CAAC;EAC9B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAC5C,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,KAAK,EAAE;IACZ,iEAAiB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;EACxE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE;IAC3B,GAAG,CAAC,OAAO,CAAC,SAAS,GAAG,EAAE;IAC1B,IAAI,iDAAM,CAAC,GAAG,CAAC,OAAO,EAAE;MAAC,IAAI,EAAE,IAAI,CAAC,UAAU;MAAE,KAAK,EAAE,GAAG;MAAE,MAAM,EAAE,GAAG;MAAE,YAAY,EAAE,8DAAmB,CAAC;IAAC,CAAC,CAAC;EAChH,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;EACV,MAAM,KAAK,GAAG,IAAI,IAAI,IAAI,CAAC,cAAc;EACzC,MAAM,KAAK,GAAG,MAAM;IAClB,IAAI,SAAS,CAAC,KAAK,IAAI,IAAI,EAAE;MAC3B,SAAS,CAAC,KAAK,CAAC;QAAC,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC,IAAI;QAAE,IAAI,EAAE,QAAQ;QAAE,GAAG,EAAE,IAAI,CAAC;MAAU,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACrG,CAAC,MAAM,IAAI,IAAI,EAAE;MACf,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1G;EACF,CAAC;EACD,MAAM,IAAI,GAAG,MAAM;IACjB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC;IACjE,IAAI,CAAC,MAAM,EAAE;MAAE,OAAO,CAAC,MAAM,CAAC;MAAE;IAAQ;IACxC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;IACrC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC;IACtC,CAAC,CAAC,QAAQ,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,GAAG,OAAO,IAAI,aAAa;IAC3D,CAAC,CAAC,KAAK,CAAC,CAAC;IACT,OAAO,CAAC,SAAS,CAAC;EACpB,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,0BAA0B;IAAA,WAC9C,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC,eAAe;MAAC,SAAS,EAAE;IAAM,gBAAE,CAAC,EAC9D;MAAA,WACE;QAAS,SAAS,EAAC,eAAe;QAAA,WAChC;UAAA,WAAK,8DAAC,MAAM;YAAC,IAAI,EAAE,KAAK,IAAI,CAAC;UAAE,gBAAE,CAAC;YAAA,WAAM;cAAA,UAAS,KAAK,GAAG,KAAK,CAAC,IAAI,GAAG;YAAE,gBAAS,CAAC;cAAA,WAAQ,KAAK,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,EAAC,MAAI;YAAA,eAAO,CAAC;UAAA,eAAM,CAAC;QAAA,eAAK,CAAC,EAClJ;UAAK,SAAS,EAAC,cAAc;UAAC,GAAG,EAAE;QAAI,gBAAE,CAAC,EAC1C;UAAA,UAAG;QAAe,gBAAG,CAAC;MAAA,eACf,CAAC,EACV;QAAK,SAAS,EAAC,kBAAkB;QAAA,WAC/B;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,KAAM;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAK,gBAAM,CAAC,QAAI;QAAA,eAAQ,CAAC,EACrE;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,IAAK;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAQ,gBAAM,CAAC,SAAK;QAAA,eAAQ,CAAC;MAAA,eACrE,CAAC;IAAA,eACF,CAAC;EAAA,eACJ,CAAC;AACR;AAQA,MAAM,iBAAiB,GAAG,CACxB,CAAC,eAAe,EAAE,MAAM,EAAE,uBAAuB,CAAC,EAClD,CAAC,UAAU,EAAE,MAAM,EAAE,iBAAiB,CAAC,EACvC,CAAC,qBAAqB,EAAE,SAAS,EAAE,kBAAkB,CAAC,EACtD,CAAC,eAAe,EAAE,OAAO,EAAE,sBAAsB,CAAC,EAClD,CAAC,qBAAqB,EAAE,SAAS,EAAE,wCAAwC,CAAC,CAC7E;AAED,SAAS,UAAU,CAAC;EAAC,KAAK;EAAE,MAAM;EAAE;AAAO,CAAC,EAAE;EAI5C,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,qDAAc,CAAC,MAAO,KAAK,IAAI,uEAAc,CAAC,mBAAmB,GAAG,KAAK,CAAC,IAAK,IAAI,CAAC;EAC1G,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACzD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,KAAK,EAAE;IACZ,MAAM,CAAC,uEAAc,CAAC,mBAAmB,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC;IAC3D,kEAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,mBAAmB,GAAG,KAAK,EAAE,CAAC,CAAC;MAAE,MAAM,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;MAAE,OAAO,CAAC,MAAM,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC;EAC5J,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,KAAK,KAAK;IAM/B,qEAAqB,CAAC,KAAK,EAAE;MAAC,CAAC,GAAG,GAAG,KAAK;MAAE,OAAO,EAAE,GAAG,GAAG,GAAG,CAAC,OAAO,GAAG;IAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MAAE,wEAAe,CAAC,mBAAmB,GAAG,KAAK,EAAE,IAAI,CAAC;MAAE,MAAM,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC,CAC7J,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACjD,CAAC;EACD,MAAM,QAAQ,GAAG,MAAM;IACrB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE;IAC9C,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI;IAChD,IAAI,CAAC,CAAC,EAAE;IACR,aAAa,CAAC,IAAI,CAAC;IACnB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM;MAAE,OAAO,CAAC,OAAO,CAAC;MAAE,QAAQ,CAAC,YAAY,CAAC;IAAE,CAAC,CAAC,CACvE,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;EACrF,CAAC;EACD,IAAI,CAAC,GAAG,EAAE,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC,gBAAgB;MAAC,SAAS,EAAE;IAAM,gBAAE,CAAC;MAAM,SAAS,EAAC,kBAAkB;MAAA,UAAC;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAE,SAAS,GAAG,UAAU,GAAG;MAAM,gBAAI;IAAC,gBAAM,CAAC;EAAA,eAAK,CAAC;EACnO,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC,gBAAgB;MAAC,SAAS,EAAE;IAAM,gBAAE,CAAC,EAC/D;MAAM,SAAS,EAAC,kBAAkB;MAAA,WAChC;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAE;QAAA,WAAC;UAAA,UAAM;QAAK,gBAAM,CAAC,gEAAC,IAAI;UAAA,UAAC;QAAa,gBAAM,CAAC;MAAA,eAAQ,CAAC,EAC3H;QAAA,WACE;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,qBAAqB,EAAE,KAAK,CAAE;UAAA,WAAC;YAAA,UAAM;UAAM,gBAAM,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,eAAQ,CAAC,EACnI;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAE;UAAA,WAAC;YAAA,UAAM;UAAM,gBAAM,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,eAAQ,CAAC,EAC3H;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAE;UAAA,WAAC;YAAA,UAAM;UAAK,gBAAM,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,eAAQ,CAAC,EAC3H;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,oBAAoB,EAAE,KAAK,CAAE;UAAA,WAAC;YAAA,UAAM;UAAO,gBAAM,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,eAAQ,CAAC;MAAA,eAC5H,CAAC,EACV;QAAA,UAAU,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK;UAAA,WACtD;YAAA,WAAM;cAAA,UAAS;YAAK,gBAAS,CAAC;cAAA,UAAQ;YAAI,gBAAQ,CAAC;UAAA,eAAM,CAAC,EAC1D,8DAAC,MAAM;YAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAE;YAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,GAAG,WAAW,CAAC,KAAK,KAAM;YAAC,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC;UAAE,gBAAE,CAAC;QAAA,GAF5C,GAAG,MAGhE,CAAC;MAAC,gBAAU,CAAC,EAClB;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,cAAc;QAAC,QAAQ,EAAE,UAAW;QAAC,OAAO,EAAE,QAAS;QAAA,UAAC;MAAI,gBAAQ,CAAC;IAAA,eACjG,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,oBAAoB,CAAC,KAAK,EAAE;EACnC,OAAO;IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,IAAI;IAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;EAAC,CAAC;AAC5G;AAEA,SAAS,SAAS,CAAC;EAAC,KAAK;EAAE;AAAO,CAAC,EAAE;EAGnC,MAAM,aAAa,GAAG,KAAK,IAAI,uEAAc,CAAC,gBAAgB,GAAG,KAAK,CAAC;EACvE,MAAM,IAAI,GAAG,aAAa,GAAG,oBAAoB,CAAC,aAAa,CAAC,GAAG;IAAC,KAAK,EAAE,IAAI;IAAE,MAAM,EAAE;EAAI,CAAC;EAC9F,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC;EAC1D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC;EAC7D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,IAAI,GAAG,wDAAiB,CAAC,MAAM;IACnC,IAAI,CAAC,KAAK,EAAE;IACZ,MAAM,MAAM,GAAG,uEAAc,CAAC,gBAAgB,GAAG,KAAK,CAAC;IACvD,IAAI,MAAM,EAAE;MAAE,MAAM,CAAC,GAAG,oBAAoB,CAAC,MAAM,CAAC;MAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;MAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IAAE;IAM9F,6DAAa,CAAC,MAAM,IAAI,+DAAe,CAAC,KAAK,EAAE;MAAC;IAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI;MACtE,wEAAe,CAAC,gBAAgB,GAAG,KAAK,EAAE,KAAK,CAAC;MAChD,MAAM,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC;MACrC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;MACjB,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IACrB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;MAAE,OAAO,CAAC,MAAM,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC;EAC1D,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,sDAAe,CAAC,MAAM;IAAE,IAAI,CAAC,CAAC;EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;EAC1C,MAAM,MAAM,GAAG,MAAM,IAAI;IACvB,gEAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM;MAAE,QAAQ,CAAC,QAAQ,CAAC;MAAE,IAAI,CAAC,CAAC;IAAE,CAAC,CAAC,CACxE,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACjD,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,MAAM;MAAC,KAAK,EAAC,QAAQ;MAAC,IAAI,EAAC,kBAAkB;MAAC,SAAS,EAAE,KAAM;MAAC,KAAK,EAAC,IAAI;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,iBAAiB,EAAE,KAAK;IAAE,gBAAE,CAAC,EACjI;MAAM,SAAS,EAAC,kBAAkB;MAAA,WAChC;QAAA,WAAO,8DAAC,IAAI;UAAA,UAAC;QAAY,gBAAM,CAAC;UAAA,UAAG;QAAmC,gBAAG,CAAC;MAAA,eAAO,CAAC,EACjF,KAAK,GAAG;QAAA,WAAE;UAAA,UAAI;QAAE,gBAAI,CAAC;UAAA,WAAS,8DAAC,MAAM;YAAC,IAAI,EAAE;UAAM,gBAAE,CAAC;YAAA,WAAM;cAAA,UAAS,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC;YAAY,gBAAS,CAAC;cAAA,UAAO;YAAE,gBAAO,CAAC;UAAA,eAAM,CAAC;QAAA,eAAS,CAAC;MAAA,eAAE,CAAC,GAAG,IAAI,EACrK;QAAA,WAAI,MAAI,EAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAC,KAAG;MAAA,eAAI,CAAC,EAC3C,MAAM,KAAK,IAAI,GAAG;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAE,SAAS,GAAG,UAAU,GAAG;MAAM,gBAAI,CAAC,GACxF,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI;QAAA,WACjC,8DAAC,MAAM;UAAC,IAAI,EAAE;QAAK,gBAAE,CAAC;UAAA,WAAM;YAAA,UAAS,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC;UAAY,gBAAS,CAAC;YAAA,UAAO;UAAG,gBAAO,CAAC;QAAA,eAAM,CAAC,EAChH;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAE;UAAA,UAAC;QAAE,gBAAQ,CAAC;MAAA,GAFvB,IAAI,CAAC,OAAO,MAGpD,CAAC,CAAC,GAAG;QAAK,SAAS,EAAC,oBAAoB;QAAA,UAAC;MAAK,gBAAK,CAAC;IAAA,eAC3D,CAAC,EACP,8DAAC,WAAW;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eACxD,CAAC;AACR;AAKA,SAAS,YAAY,CAAC;EAAC,KAAK;EAAE;AAAO,CAAC,EAAE;EACtC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAO,KAAK,IAAI,uEAAc,CAAC,gBAAgB,GAAG,KAAK,CAAC,IAAK,IAAI,CAAC;EAC/G,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,KAAK,EAAE;IACZ,6DAAa,CAAC,MAAM,IAAI,+DAAe,CAAC,KAAK,EAAE;MAAC;IAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI;MACtE,wEAAe,CAAC,gBAAgB,GAAG,KAAK,EAAE,KAAK,CAAC;MAChD,UAAU,CAAC,KAAK,CAAC;IACnB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;MAAE,OAAO,CAAC,MAAM,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC;EAC1D,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;EACvG,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC;EACtF,MAAM,SAAS,GAAG,IAAI,IAAI,IAAI,KAAK,OAAO,GAAG,IAAI,GAAG,IAAI,KAAK,OAAO,GAAG,KAAK,GAAG,EAAE;EACjF,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,MAAM;MAAC,KAAK,EAAC,KAAK;MAAC,IAAI,EAAC,gBAAgB;MAAC,SAAS,EAAE;IAAM,gBAAE,CAAC,EAC9D,8DAAC,MAAM;MAAC,KAAK,EAAE,KAAM;MAAC,QAAQ,EAAE,QAAS;MAAC,WAAW,EAAC;IAAO,gBAAE,CAAC,EAChE;MAAM,SAAS,EAAC,qBAAqB;MAAA,UAClC,OAAO,KAAK,IAAI,GAAG;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAE,SAAS,GAAG,UAAU,GAAG;MAAM,gBAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,8DAAC,uDAAc;QAAA,WAC1I;UAAK,SAAS,EAAC,qBAAqB;UAAA,UAAE;QAAM,gBAAM,CAAC,EAClD,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI;UAAQ,IAAI,EAAC,QAAQ;UAAoB,OAAO,EAAE,MAAM,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAE;UAAA,WACrH,8DAAC,MAAM;YAAC,IAAI,EAAE,IAAK;YAAC,IAAI,EAAC;UAAQ,gBAAE,CAAC;YAAA,WAAM;cAAA,UAAS,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC;YAAY,gBAAS,CAAC,EAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;cAAA,UAAQ,SAAS,CAAC,IAAI,CAAC,IAAI;YAAC,gBAAQ,CAAC,GAAG,IAAI;UAAA,eAAO,CAAC;QAAA,GADtI,IAAI,CAAC,OAAO,MAEjD,CAAC,CAAC;MAAA,GAJsI,MAAM,MAKxI,CAAC;IAAC,gBACd,CAAC;EAAA,eACJ,CAAC;AACR;AAKA,SAAS,YAAY,CAAC;EAAC,IAAI;EAAE,KAAK;EAAE;AAAO,CAAC,EAAE;EAC5C,MAAM,IAAI,GAAG,IAAI,KAAK,UAAU;EAChC,MAAM,IAAI,GAAG,IAAI,GAAG,aAAa,GAAG,cAAc;EAClD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC7C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,KAAK,EAAE;IACZ,6DAAa,CAAC,MAAM,IAAI,+DAAe,CAAC,KAAK,EAAE;MAAC,MAAM;MAAE,IAAI,IAAI,GAAG;QAAC,YAAY,EAAE;MAAI,CAAC,GAAG;QAAC,YAAY,EAAE;MAAO,CAAC;IAAC,CAAC,CAAC,CAAC,CAClH,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAClE,KAAK,CAAC,MAAM;MAAE,OAAO,CAAC,MAAM,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC;EAC1D,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;EACjB,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;EACvG,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC;EACtF,MAAM,MAAM,GAAG,EAAE,IAAI,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;EAC7F,MAAM,IAAI,GAAG,MAAM;IACjB,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE;IAC9B,OAAO,CAAC,IAAI,CAAC;IACb,MAAM,IAAI,GAAG,IAAI,GAAG,gEAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,KAAK;MAAC;IAAO,CAAC,CAAC,CAAC,CAAC,GAAG,8DAAc,CAAC,KAAK,EAAE,QAAQ,CAAC;IACnH,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI;MAMlB,IAAI,WAAW;MACf,IAAI,IAAI,EAAE;QACR,MAAM,IAAI,GAAI,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;QAC5F,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;MACnD,CAAC,MAAM;QACL,WAAW,GAAI,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,GAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;MAC5G;MACA,QAAQ,CAAC,WAAW,GAAG,QAAQ,QAAQ,CAAC,MAAM,GAAG,WAAW,MAAM,WAAW,QAAQ,GAAG,MAAM,CAAC;MAG/F,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC;IACtD,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;EAC/E,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,MAAM;MAAC,KAAK,EAAE,IAAI,GAAG,QAAQ,GAAG,OAAQ;MAAC,IAAI,EAAE,IAAK;MAAC,SAAS,EAAE,KAAM;MACrE,KAAK,EAAE,KAAK,QAAQ,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,EAAG;MAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,GAAG;IAAU,gBAAE,CAAC,EAC9G,8DAAC,MAAM;MAAC,KAAK,EAAE,KAAM;MAAC,QAAQ,EAAE,QAAS;MAAC,WAAW,EAAC;IAAO,gBAAE,CAAC,EAChE;MAAM,SAAS,EAAC,qBAAqB;MAAA,UAClC,OAAO,KAAK,IAAI,GAAG;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAE,SAAS,GAAG,UAAU,GAAG;MAAM,gBAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,8DAAC,uDAAc;QAAA,WAC1I;UAAK,SAAS,EAAC,qBAAqB;UAAA,UAAE;QAAM,gBAAM,CAAC,EAClD,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI;UAAQ,IAAI,EAAC,QAAQ;UAAoB,OAAO,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAE;UAAA,WAC7F,8DAAC,MAAM;YAAC,IAAI,EAAE;UAAK,gBAAE,CAAC;YAAA,UAAM;cAAA,UAAS,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC;YAAY,gBAAS;UAAC,gBAAM,CAAC,EAC9F;YAAG,SAAS,EAAE,aAAa,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,UAAU,GAAG,EAAE,CAAE;YAAA,UAC/E,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,8DAAC,IAAI;cAAA,UAAC;YAAK,gBAAM,CAAC,GAAG;UAAI,gBAC3D,CAAC;QAAA,GAJuC,IAAI,CAAC,OAAO,MAKjD,CAAC,CAAC;MAAA,GAPsI,MAAM,MAQxI,CAAC;IAAC,gBACd,CAAC,EACP,8DAAC,WAAW;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eACxD,CAAC;AACR;AAEA,SAAS,KAAK,CAAC;EAAC,KAAK;EAAE;AAAO,CAAC,EAAE;EAC/B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,MAAO,KAAK,IAAI,uEAAc,CAAC,cAAc,GAAG,KAAK,CAAC,IAAK,IAAI,CAAC;EAMzG,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC,CAAC;EAC5C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC,CAAC;EAChD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,IAAI,GAAG,wDAAiB,CAAC,MAAM;IACnC,IAAI,CAAC,KAAK,EAAE;IACZ,6DAAa,CAAC,MAAM,IAAI,6DAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MACjE,wEAAe,CAAC,cAAc,GAAG,KAAK,EAAE,IAAI,CAAC;MAC7C,QAAQ,CAAC,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;MAAE,OAAO,CAAC,MAAM,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC;IACxD,6DAAa,CAAC,MAAM,IAAI,+DAAe,CAAC,KAAK,EAAE;MAAC;IAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI;MACtE,MAAM,GAAG,GAAG,CAAC,CAAC;MACd,MAAM,SAAS,GAAG,CAAC,CAAC;MACpB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI;QACjB,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,OAAO;QAChE,IAAI,CAAC,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;UAAC,cAAc,EAAE,CAAC,CAAC;QAAc,CAAC;MACjF,CAAC,CAAC;MACF,QAAQ,CAAC,GAAG,CAAC;MACb,UAAU,CAAC,SAAS,CAAC;IACvB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EACpB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,sDAAe,CAAC,MAAM;IAAE,QAAQ,CAAE,KAAK,IAAI,uEAAc,CAAC,cAAc,GAAG,KAAK,CAAC,IAAK,IAAI,CAAC;IAAE,IAAI,CAAC,CAAC;EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;EACtH,MAAM,MAAM,GAAG,MAAM,IAAI;IACvB,iEAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM;MAAE,OAAO,CAAC,OAAO,CAAC;MAAE,IAAI,CAAC,CAAC;IAAE,CAAC,CAAC,CACvE,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACjD,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,MAAM;MAAC,KAAK,EAAC,QAAQ;MAAC,IAAI,EAAC,kBAAkB;MAAC,SAAS,EAAE,KAAM;MAAC,KAAK,EAAC,IAAI;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,gBAAgB,EAAE,KAAK;IAAE,gBAAE,CAAC,EAChI;MAAM,SAAS,EAAC,kBAAkB;MAAA,WAC/B,KAAK,KAAK,IAAI,GAAG;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAE,SAAS,GAAG,UAAU,GAAG;MAAM,gBAAI,CAAC,GACvF,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI;QAAA,WAI/B,8DAAC,MAAM;UAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAE;UAAC,IAAI,EAAC;QAAQ,gBAAE,CAAC;UAAA,WAAM;YAAA,UAAS,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;UAAO,gBAAS,CAAC;YAAA,UAAQ,IAAI,CAAC,UAAU,GAAG,OAAO,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG;UAAM,gBAAQ,CAAC;QAAA,eAAM,CAAC,EAC7M;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAE;UAAA,UAAC;QAAE,gBAAQ,CAAC;MAAA,GALzB,IAAI,CAAC,OAAO,MAMlD,CAAC,CAAC,GAAG;QAAK,SAAS,EAAC,oBAAoB;QAAA,UAAC;MAAM,gBAAK,CAAC,EAG/D,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG;QAAG,SAAS,EAAC,mBAAmB;QAAA,UAAC;MAAS,gBAAG,CAAC,GAAG,IAAI;IAAA,eAC1E,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,WAAW,CAAC;EAAC,KAAK;EAAE;AAAO,CAAC,EAAE;EACrC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAMhD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC7D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAClD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC7C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,KAAK,EAAE;IACZ,6DAAa,CAAC,MAAM,IAAI,+DAAe,CAAC,KAAK,EAAE;MAAC,MAAM;MAAE,YAAY,EAAE;IAAO,CAAC,CAAC,CAAC,CAC7E,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAClE,KAAK,CAAC,MAAM;MAAE,OAAO,CAAC,MAAM,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC;EAC1D,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,YAAY,IAAI,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;EACvG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;EACtD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;EACtD,MAAM,KAAK,GAAG,MAAM;IAAE,SAAS,CAAC,IAAI,CAAC;IAAE,eAAe,CAAC,KAAK,CAAC;IAAE,WAAW,CAAC,EAAE,CAAC;EAAE,CAAC;EACjF,MAAM,OAAO,GAAG,MAAM;IACpB,IAAI,CAAC,QAAQ,EAAE;MAAE,OAAO,CAAC,UAAU,CAAC;MAAE;IAAQ;IAC9C,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;IACrB,OAAO,CAAC,IAAI,CAAC;IAMb,wDAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,kEAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CACpF,IAAI,CAAC,MAAM;MAAE,OAAO,CAAC,OAAO,CAAC;MAAE,QAAQ,CAAC,kBAAkB,EAAE,KAAK,CAAC;IAAE,CAAC,CAAC,CACtE,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;EAC/E,CAAC;EACD,MAAM,GAAG,GAAG,IAAI,IAAI;IAA4B,IAAI,EAAC,QAAQ;IAAC,QAAQ,EAAE,CAAE;IAAC,OAAO,EAAE,MAAM,SAAS,CAAC,IAAI,CAAE;IAAA,WACxG,8DAAC,MAAM;MAAC,IAAI,EAAE;IAAK,gBAAE,CAAC;MAAA,UAAM;QAAA,UAAS,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC;MAAY,gBAAS;IAAC,gBAAM,CAAC;EAAA,GAD9D,IAAI,CAAC,OAAO,MAErC,CAAC;EACV,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,MAAM;MAAC,KAAK,EAAC,OAAO;MAAC,IAAI,EAAC,kBAAkB;MAAC,SAAS,EAAE;IAAM,gBAAE,CAAC,EAClE,8DAAC,MAAM;MAAC,KAAK,EAAE,KAAM;MAAC,QAAQ,EAAE,QAAS;MAAC,WAAW,EAAC;IAAI,gBAAE,CAAC,EAC7D;MAAM,SAAS,EAAC,oBAAoB;MAAA,UACjC,OAAO,KAAK,IAAI,GAAG;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAE,SAAS,GAAG,UAAU,GAAG;MAAM,gBAAI,CAAC,GAAG;QAAA,WAC3F,MAAM,CAAC,MAAM,GAAG;UAAA,WAAE;YAAK,SAAS,EAAC,qBAAqB;YAAA,UAAC;UAAG,gBAAK,CAAC,EAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QAAA,eAAG,CAAC,GAAG,IAAI,EAC3F,MAAM,CAAC,MAAM,GAAG;UAAA,WAAE;YAAK,SAAS,EAAC,qBAAqB;YAAA,UAAC;UAAG,gBAAK,CAAC,EAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QAAA,eAAG,CAAC,GAAG,IAAI;MAAA,eAC5F;IAAC,gBACC,CAAC,EACN,MAAM,IAAI,CAAC,YAAY,GAAG;MAAK,SAAS,EAAC,sBAAsB;MAAA,UAAC;QAAS,SAAS,EAAC,qBAAqB;QAAA,WACvG;UAAA,UAAI;QAAK,gBAAI,CAAC,EACd;UAAA,WAAI,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,YAAY,EAAC,qBAAmB;QAAA,eAAG,CAAC,EACxE;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,eAAe,CAAC,IAAI,CAAE;UAAA,UAAC;QAAE,gBAAQ,CAAC,EAC1F;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,KAAM;UAAA,UAAC;QAAE,gBAAQ,CAAC;MAAA,eAC1C;IAAC,gBAAK,CAAC,GAAG,IAAI,EACtB,MAAM,IAAI,YAAY,GAAG;MAAK,SAAS,EAAC,sBAAsB;MAAA,UAAC;QAAS,SAAS,EAAC,qBAAqB;QAAA,WACtG;UAAA,UAAI;QAAQ,gBAAI,CAAC,EACjB;UAAA,WAAG,kBAAgB,EAAC,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,YAAY,EAAC,iBAAe;QAAA,eAAG,CAAC,EACpF;UAAO,IAAI,EAAC,UAAU;UAAC,SAAS;UAAC,SAAS,EAAC,sBAAsB;UAAC,KAAK,EAAE,QAAS;UAChF,QAAQ,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;UAAC,WAAW,EAAC;QAAM,gBAAE,CAAC,EACnE;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,QAAQ;UAAC,QAAQ,EAAE,IAAK;UAAC,OAAO,EAAE,OAAQ;UAAA,UAAE,IAAI,GAAG,MAAM,GAAG;QAAI,gBAAS,CAAC,EAC1G;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,KAAM;UAAA,UAAC;QAAE,gBAAQ,CAAC;MAAA,eAC1C;IAAC,gBAAK,CAAC,GAAG,IAAI;EAAA,eACpB,CAAC;AACR;AAEA,MAAM,cAAc,GAAG;EACrB,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;EAAE,KAAK,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;EAAE,KAAK,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC;EAC7F,QAAQ,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC;EAAE,IAAI,EAAE,CAAC,mBAAmB,EAAE,SAAS;AAC7E,CAAC;AAED,SAAS,UAAU,CAAC;EAAC,KAAK;EAAE,MAAM;EAAE;AAAO,CAAC,EAAE;EAC5C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACtD,MAAM,KAAK,GAAG,0EAAiB,CAAC,UAAU,EAAE,GAAG,CAAC;EAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,MAAO,KAAK,IAAI,uEAAc,CAAC,cAAc,GAAG,KAAK,CAAC,IAAK,IAAI,CAAC;EACzG,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACrD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EACtD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAGvD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC,CAAC;EAC5D,MAAM,SAAS,GAAG;IAAC,IAAI,EAAE,mDAAY,CAAC,IAAI,CAAC;IAAE,KAAK,EAAE,mDAAY,CAAC,IAAI,CAAC;IAAE,KAAK,EAAE,mDAAY,CAAC,IAAI;EAAC,CAAC;EAMlG,MAAM,IAAI,GAAG,wDAAiB,CAAC,MAAM;IACnC,IAAI,CAAC,KAAK,EAAE;IACZ,6DAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE;MAC9B,wEAAe,CAAC,cAAc,GAAG,KAAK,EAAE,KAAK,CAAC;MAC9C,QAAQ,CAAC,KAAK,CAAC;IACjB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;MAAE,OAAO,CAAC,MAAM,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC;EAC1D,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,sDAAe,CAAC,MAAM;IAAE,IAAI,CAAC,CAAC;EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;EAC1C,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,KAAK,EAAE;IACZ,+DAAe,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MAClC,MAAM,GAAG,GAAG,CAAC,CAAC;MACd,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI;QAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,OAAO;MAAE,CAAC,CAAC;MACtG,gBAAgB,CAAC,GAAG,CAAC;IACvB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EACpB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,MAAM,YAAY,GAAG,oDAAa,CAAC,MAAM;IACvC,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE;IACvB,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,EAAE,OAAO,GAAG;IAClB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAClE,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;EACnE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;EACjC,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;EAC/E,MAAM,IAAI,GAAG,IAAI,IAAI;IAAE,WAAW,CAAC,KAAK,CAAC;IAAE,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;EAAE,CAAC;EACxG,MAAM,MAAM,GAAG,CAAC,IAAI;IAClB,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;IACnB,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;IACtB,YAAY,CAAC;MAAC,IAAI,EAAE,IAAI,CAAC,IAAI;MAAE,QAAQ,EAAE;IAAC,CAAC,CAAC;IAC5C,+DAAe,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG;MAAC,GAAG,CAAC;MAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG;IAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CACvG,IAAI,CAAC,CAAC;MAAC;IAAM,CAAC,KAAK,4DAAY,CAAC,KAAK,EAAE;MAAC,MAAM;MAAE,QAAQ,EAAE,IAAI,CAAC,IAAI;MAAE,QAAQ,EAAE,IAAI,CAAC,IAAI;MAAE,QAAQ,EAAE,IAAI,CAAC;IAAI,CAAC,CAAC,CAAC,CAChH,IAAI,CAAC,MAAM;MAAE,YAAY,CAAC,IAAI,CAAC;MAAE,IAAI,CAAC,CAAC;IAAE,CAAC,CAAC,CAC3C,KAAK,CAAC,GAAG,IAAI;MAAE,YAAY,CAAC,IAAI,CAAC;MAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;IAAE,CAAC,CAAC;EAC1E,CAAC;EACD,MAAM,MAAM,GAAG,MAAM,IAAI;IACvB,+DAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EAChG,CAAC;EACD,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,GAAI,IAAI,IAAI,CAAE,EAAE,OAAO,CAAC,CAAC,CAAC;EAC5C,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,MAAM;MAAC,KAAK,EAAC,KAAK;MAAC,IAAI,EAAC,gBAAgB;MAAC,SAAS,EAAE,KAAM;MACzD,KAAK,EAAE,8DAAC,IAAI;QAAA,UAAC;MAAG,gBAAM,CAAE;MAAC,OAAO,EAAE,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC;IAAE,gBAAE,CAAC,EAClE;MAAO,GAAG,EAAE,SAAS,CAAC,IAAK;MAAC,IAAI,EAAC,MAAM;MAAC,KAAK,EAAE;QAAC,OAAO,EAAE;MAAM,CAAE;MAAC,QAAQ,EAAE;IAAO,gBAAE,CAAC,EACtF;MAAO,GAAG,EAAE,SAAS,CAAC,KAAM;MAAC,IAAI,EAAC,MAAM;MAAC,MAAM,EAAC,SAAS;MAAC,KAAK,EAAE;QAAC,OAAO,EAAE;MAAM,CAAE;MAAC,QAAQ,EAAE;IAAO,gBAAE,CAAC,EACxG;MAAO,GAAG,EAAE,SAAS,CAAC,KAAM;MAAC,IAAI,EAAC,MAAM;MAAC,MAAM,EAAC,SAAS;MAAC,KAAK,EAAE;QAAC,OAAO,EAAE;MAAM,CAAE;MAAC,QAAQ,EAAE;IAAO,gBAAE,CAAC,EACvG,QAAQ,GAAG;MAAK,SAAS,EAAC,mBAAmB;MAAA,WAC5C;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAE;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAW,gBAAM,CAAC,QAAI;MAAA,eAAQ,CAAC,EACxF;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,CAAE;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAK,gBAAM,CAAC,QAAI;MAAA,eAAQ,CAAC,EACnF;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,CAAE;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAmB,gBAAM,CAAC,QAAI;MAAA,eAAQ,CAAC;IAAA,eAC9F,CAAC,GAAG,IAAI,EACb,8DAAC,MAAM;MAAC,KAAK,EAAE,UAAW;MAAC,QAAQ,EAAE,aAAc;MAAC,WAAW,EAAC;IAAY,gBAAE,CAAC,EAG/E;MAAG,SAAS,EAAC,mBAAmB;MAAA,WAAC,GAAC,EAAC,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,EAAC,SAAO,EAAC,EAAE,CAAC,SAAS,CAAC,EAAC,KAAG;IAAA,eAAG,CAAC,EACrF;MAAM,SAAS,EAAC,iBAAiB;MAAA,WAC9B,SAAS,GAAG;QAAS,SAAS,EAAC,WAAW;QAAA,WACzC;UAAM,SAAS,EAAC,iBAAiB;UAAC,KAAK,EAAE;YAAC,eAAe,EAAE;UAAS,CAAE;UAAA,UAAC,8DAAC,IAAI;YAAA,UAAC;UAAW,gBAAM;QAAC,gBAAM,CAAC,EACtG;UAAA,WAAK;YAAA,UAAS,SAAS,CAAC;UAAI,gBAAS,CAAC;YAAA,WAAO,MAAI,EAAC,SAAS,CAAC,QAAQ,EAAC,GAAC;UAAA,eAAO,CAAC;YAAU,KAAK,EAAE,SAAS,CAAC,QAAS;YAAC,GAAG,EAAC;UAAK,gBAAE,CAAC;QAAA,eAAK,CAAC;MAAA,eAC9H,CAAC,GAAG,IAAI,EAChB,KAAK,KAAK,IAAI,GAAG;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAE,SAAS,GAAG,UAAU,GAAG;MAAM,gBAAI,CAAC,GACvF,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG;QAAG,SAAS,EAAC,oBAAoB;QAAA,UAAC;MAAQ,gBAAG,CAAC,GAC1F,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI;QACvB,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,IAAI;QAC3E,OAAO;UAAA,WACL;YAAM,SAAS,EAAC,iBAAiB;YAAC,KAAK,EAAE;cAAC,eAAe,EAAE;YAAK,CAAE;YAAA,UAAC,8DAAC,IAAI;cAAA,UAAE;YAAI,gBAAO;UAAC,gBAAM,CAAC,EAC7F;YAAA,WAAK;cAAA,UAAS,IAAI,CAAC,SAAS,IAAI;YAAO,gBAAS,CAAC;cAAA,WAAO,KAAG,EAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,EAAC,KAAG,EAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;YAAA,eAAQ,CAAC;UAAA,eAAK,CAAC,EAC5J;YAAQ,IAAI,EAAC,QAAQ;YAAC,OAAO,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,CAAE;YAAA,UAAC,8DAAC,IAAI;cAAA,UAAC;YAAc,gBAAM;UAAC,gBAAQ,CAAC;QAAA,GAHlF,IAAI,CAAC,aAAa,MAI9B,CAAC;MACZ,CAAC,CAAC;IAAA,eACA,CAAC;EAAA,eACJ,CAAC;AACR;AAGA,SAAS,SAAS,CAAC,KAAK,EAAE;EACxB,IAAI,CAAC,KAAK,EAAE,OAAO,MAAM;EACzB,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK;EACjE,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK;EACjF,OAAO,CAAC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK;AAC1D;AAKA,SAAS,eAAe,CAAC;EAAC,KAAK;EAAE;AAAO,CAAC,EAAE;EACzC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,sDAAe,CAAC,MAAM;IAAE,IAAI,KAAK,EAAE,wDAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,QAAQ,CAAC,CAAC,CAAC;MAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EAC1I,MAAM,IAAI,GAAG,MAAM;IACjB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE;IACnB,2DAAW,CAAC,KAAK,EAAE;MAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;MAAE,OAAO,EAAE,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG;IAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;MACtF,OAAO,CAAC,MAAM,CAAC;MAAE,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC;IACjF,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACjD,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,MAAM;MAAC,KAAK,EAAC,KAAK;MAAC,IAAI,EAAC,eAAe;MAAC,SAAS,EAAE,KAAM;MAAC,KAAK,EAAC,IAAI;MAAC,OAAO,EAAE;IAAK,gBAAE,CAAC,EACvF;MAAM,SAAS,EAAC,iBAAiB;MAAA,WAAC;QAAO,SAAS;QAAC,KAAK,EAAE,KAAM;QAAC,SAAS,EAAE,EAAG;QAAC,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;MAAE,gBAAE,CAAC;QAAA,WAAQ,KAAK,CAAC,MAAM,EAAC,KAAG;MAAA,eAAO,CAAC;IAAA,eAAM,CAAC;EAAA,eAC/J,CAAC;AACR;AAEA,SAAS,sBAAsB,CAAC;EAAC,KAAK;EAAE;AAAO,CAAC,EAAE;EAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,sDAAe,CAAC,MAAM;IAAE,IAAI,KAAK,EAAE,wDAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,QAAQ,CAAC,CAAC,CAAC;MAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACvJ,MAAM,OAAO,GAAG,MAAM;IACpB,2DAAW,CAAC,KAAK,EAAE;MAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;MAAE,OAAO,EAAE,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG;IAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;MAC7F,OAAO,CAAC,MAAM,CAAC;MAAE,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC;IACjF,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACjD,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,MAAM;MAAC,KAAK,EAAC,KAAK;MAAC,IAAI,EAAC,eAAe;MAAC,SAAS,EAAE,KAAM;MAAC,KAAK,EAAC,IAAI;MAAC,OAAO,EAAE;IAAQ,gBAAE,CAAC,EAC1F;MAAM,SAAS,EAAC,iBAAiB;MAAA,WAG/B;QAAU,SAAS;QAAC,KAAK,EAAE,KAAM;QAAC,SAAS,EAAE,GAAI;QAAC,WAAW,EAAC,UAAU;QAAC,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;MAAE,gBAAE,CAAC,EACpH;QAAA,WAAQ,KAAK,CAAC,MAAM,EAAC,MAAI;MAAA,eAAO,CAAC;IAAA,eAC7B,CAAC;EAAA,eACJ,CAAC;AACR;AAKA,SAAS,gBAAgB,CAAC;EAAC,KAAK;EAAE;AAAO,CAAC,EAAE;EAC1C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAG5C,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,KAAK,EAAE;IACZ,iEAAiB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EACtF,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,MAAM,IAAI,GAAG,MAAM;IACjB,oEAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;MACtD,OAAO,CAAC,MAAM,CAAC;MAAE,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC;IAClF,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACjD,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,YAAY;IAAA,WAChC,8DAAC,MAAM;MAAC,KAAK,EAAC,SAAS;MAAC,IAAI,EAAC,gBAAgB;MAAC,SAAS,EAAE,KAAM;MAAC,KAAK,EAAC,IAAI;MAAC,OAAO,EAAE;IAAK,gBAAE,CAAC,EAC5F;MAAM,SAAS,EAAC,iBAAiB;MAAA,WAAC;QAAO,SAAS;QAAC,KAAK,EAAE,KAAM;QAAC,SAAS,EAAE,EAAG;QAAC,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;MAAE,gBAAE,CAAC;QAAA,UAAO;MAAY,gBAAO,CAAC;IAAA,eAAM,CAAC;EAAA,eAC1J,CAAC;AACR;AAEe,SAAS,mBAAmB,CAAC;EAAC,IAAI;EAAE,UAAU;EAAE,QAAQ;EAAE,MAAM;EAAE;AAAe,CAAC,EAAE;EACjG,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,KAAK,GAAG,UAAU,IAAI,UAAU,CAAC,KAAK;EAK5C,MAAM,YAAY,GAAG,KAAK,IAAI,QAAQ,GAAG,iBAAiB,KAAK,IAAI,QAAQ,EAAE,GAAG,IAAI;EACpF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,MAAO,YAAY,IAAI,uEAAc,CAAC,YAAY,CAAC,IAAK,IAAI,CAAC;EACxG,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE;MAAE,SAAS,CAAC,IAAI,CAAC;MAAE;IAAQ;IACpD,MAAM,GAAG,GAAG,iBAAiB,KAAK,IAAI,QAAQ,EAAE;IAChD,SAAS,CAAC,uEAAc,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IAMtC,wDAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI;MAC5B,MAAM,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI;MACzC,wEAAe,CAAC,GAAG,EAAE,IAAI,CAAC;MAC1B,SAAS,CAAC,IAAI,CAAC;IACjB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EACpB,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;EACrB,IAAI,OAAO;EACX,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,aAAa,EAAE,OAAO,GAAG,8DAAC,SAAS;IAAC,MAAM,EAAE,MAAO;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC3G,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,eAAe,EAAE,oBAAoB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,8DAAC,SAAS;IAAC,IAAI,EAAE,IAAK;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC9L,IAAI,IAAI,KAAK,qBAAqB,EAAE,OAAO,GAAG,8DAAC,YAAY;IAAC,KAAK,EAAE,KAAM;IAAC,QAAQ,EAAE,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,MAAO;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACpJ,IAAI,IAAI,KAAK,2BAA2B,EAAE,OAAO,GAAG,8DAAC,YAAY;IAAC,KAAK,EAAE,KAAM;IAAC,MAAM,EAAE,MAAO;IAAC,QAAQ,EAAE,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,MAAO;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC1K,IAAI,IAAI,KAAK,gBAAgB,EAAE,OAAO,GAAG,8DAAC,aAAa;IAAC,KAAK,EAAE,KAAM;IAAC,QAAQ,EAAE,QAAS;IAAC,MAAM,EAAE,MAAO;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAChI,IAAI,IAAI,KAAK,eAAe,EAAE,OAAO,GAAG,8DAAC,YAAY;IAAC,KAAK,EAAE,KAAM;IAAC,QAAQ,EAAE,QAAS;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC9G,IAAI,IAAI,KAAK,cAAc,EAAE,OAAO,GAAG,8DAAC,WAAW;IAAC,KAAK,EAAE,KAAM;IAAC,QAAQ,EAAE,QAAS;IAAC,MAAM,EAAE,MAAO;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC5H,IAAI,IAAI,KAAK,gBAAgB,EAAE,OAAO,GAAG,8DAAC,eAAe;IAAC,KAAK,EAAE,KAAM;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC9F,IAAI,IAAI,KAAK,mBAAmB,EAAE,OAAO,GAAG,8DAAC,sBAAsB;IAAC,KAAK,EAAE,KAAM;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACxG,IAAI,IAAI,KAAK,mBAAmB,EAAE,OAAO,GAAG,8DAAC,gBAAgB;IAAC,KAAK,EAAE,KAAM;IAAC,QAAQ,EAAE,QAAS;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACtH,IAAI,IAAI,KAAK,eAAe,EAAE,OAAO,GAAG,8DAAC,YAAY;IAAC,KAAK,EAAE,KAAM;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC1F,IAAI,IAAI,KAAK,UAAU,EAAE,OAAO,GAAG,8DAAC,OAAO;IAAC,KAAK,EAAE,KAAM;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAChF,IAAI,IAAI,KAAK,kBAAkB,EAAE,OAAO,GAAG,8DAAC,UAAU;IAAC,KAAK,EAAE,KAAM;IAAC,MAAM,EAAE,MAAO;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC3G,IAAI,CAAC,cAAc,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,8DAAC,SAAS;IAAC,KAAK,EAAE,KAAM;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACnK,IAAI,IAAI,KAAK,iBAAiB,EAAE,OAAO,GAAG,8DAAC,YAAY;IAAC,IAAI,EAAC,WAAW;IAAC,KAAK,EAAE,KAAM;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC7G,IAAI,IAAI,KAAK,gBAAgB,EAAE,OAAO,GAAG,8DAAC,YAAY;IAAC,IAAI,EAAC,UAAU;IAAC,KAAK,EAAE,KAAM;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC3G,IAAI,IAAI,KAAK,aAAa,EAAE,OAAO,GAAG,8DAAC,KAAK;IAAC,KAAK,EAAE,KAAM;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACjF,IAAI,CAAC,oBAAoB,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,8DAAC,WAAW;IAAC,KAAK,EAAE,KAAM;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC7H,OAAO,GAAG,8DAAC,UAAU;IAAC,KAAK,EAAE,KAAM;IAAC,MAAM,EAAE,MAAO;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC;EAC9E,OAAO;IAAA,WAAG,OAAO,EAAC,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAAE,CAAC;AAC5E,C;;;;;;;;;;;;;;;;;;;;;;ACnoC0B;AACoB;AAEC;AACe;AAAA;AAE/C,MAAM,SAAS,SAAS,wDAAe,CAAC;EACrD,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG;MACX,KAAK,EAAE,KAAK,CAAC,KAAK;MAClB,QAAQ,EAAE,EAAE;MACZ,QAAQ,EAAE,KAAK,CAAC,aAAa;MAC7B,SAAS,EAAE,KAAK,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;EAClD;EAEA,iBAAiB,CAAC,CAAC,EAAE;IACnB,IAAI,CAAC,QAAQ,CAAC;MAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;IAAK,CAAC,CAAC;EACxC;EAEA,oBAAoB,CAAC,CAAC,EAAE;IACtB,IAAI,CAAC,QAAQ,CAAC;MAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;IAAK,CAAC,CAAC;EAC3C;EAEA,qBAAqB,GAAG;IACtB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IACrD,IAAI,CAAC,QAAQ,CAAC;MAAC,SAAS,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;IAAS,CAAC,CAAC;EACnD;EAEA,YAAY,CAAC,CAAC,EAAE;IACd,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;EACzE;EAEA,MAAM,GAAG;IACP,IAAI,aAAa,GAAG,SAAS;IAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;MACvB,aAAa,IAAI,WAAW;IAC9B;IAEA,OACE;MAAM,EAAE,EAAC,YAAY;MAAC,QAAQ,EAAE,IAAI,CAAC,YAAa;MAAA,WAChD,8DAAC,wDAAgB;QAAC,EAAE,EAAC,cAAc;QAAC,cAAc,EAAC,OAAO;QACxD,WAAW,EAAC,+BAA+B;QAAA,UAE1C,YAAY,IAAK;UAAO,IAAI,EAAC,MAAM;UAAC,EAAE,EAAC,YAAY;UAClD,WAAW,EAAE,YAAa;UAC1B,YAAY,EAAC,UAAU;UACvB,WAAW,EAAC,KAAK;UACjB,cAAc,EAAC,MAAM;UACrB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;UACxB,QAAQ,EAAE,IAAI,CAAC,iBAAkB;UACjC,QAAQ;UAAC,SAAS;QAAA,gBAAE;MAAC,gBAEP,CAAC,EACnB,8DAAC,wDAAgB;QAAC,EAAE,EAAC,iBAAiB;QAAC,cAAc,EAAC,UAAU;QAC9D,WAAW,EAAC,0CAA0C;QAAA,UAErD,eAAe,IAAK,8DAAC,qEAAe;UAAC,IAAI,EAAC,UAAU;UAAC,EAAE,EAAC,eAAe;UACtE,WAAW,EAAE,eAAgB;UAC7B,YAAY,EAAC,kBAAkB;UAC/B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAC3B,QAAQ,EAAE,IAAI,CAAC,oBAAqB;UACpC,QAAQ,EAAE;QAAK,gBAAE;MAAC,gBAEJ,CAAC,EACnB;QAAK,SAAS,EAAC,gBAAgB;QAAA,WAC7B,8DAAC,6DAAQ;UAAC,EAAE,EAAC,YAAY;UAAC,IAAI,EAAC,YAAY;UAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;UACxE,QAAQ,EAAE,IAAI,CAAC;QAAsB,gBAAE,CAAC,EAC1C;UAAO,OAAO,EAAC,YAAY;UAAA,WAAC,MAC1B,gEAAC,wDAAgB;YAAC,EAAE,EAAC,gBAAgB;YAAC,cAAc,EAAC,gBAAgB;YACnE,WAAW,EAAC;UAAsB,gBAAE,CAAC;QAAA,eAClC,CAAC,EACR;UAAG,IAAI,EAAC,QAAQ;UAAA,UACd,8DAAC,wDAAgB;YAAC,EAAE,EAAC,sBAAsB;YAAC,cAAc,EAAC,kBAAkB;YAC3E,WAAW,EAAC;UAA6B,gBAAE;QAAC,gBAC7C,CAAC;MAAA,eACD,CAAC,EACN;QAAK,SAAS,EAAC,gBAAgB;QAAA,UAC7B;UAAQ,SAAS,EAAE,aAAc;UAAC,IAAI,EAAC,QAAQ;UAAA,UAC7C,8DAAC,wDAAgB;YAAC,EAAE,EAAC,gBAAgB;YAAC,cAAc,EAAC,SAAS;YAC5D,WAAW,EAAC;UAAkB,gBAAE;QAAC,gBAC7B;MAAC,gBACN,CAAC;IAAA,eACF,CAAC;EAEX;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;;;;;;AC9FyB;AACU;AAEc;AACqE;AACjE;AACI;AACP;AAAA;AAQnD,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,KAAK,KAAK;EAChC,IAAI,IAAI,GAAG,0DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;EACrE,IAAI,GAAG,KAAK,GAAG,0DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,0DAAc,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC;EAC9G,0DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;AACjC,CAAC;AAQD,SAAS,gBAAgB,CAAC,QAAQ,EAAE;EAClC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE;EACjD,OAAO,QAAQ,CACZ,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,8CAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAC/D,KAAK,CAAC,CAAC,CACP,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CACvF,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CACX,GAAG,CAAC,IAAI,KAAK;IACZ,EAAE,EAAE,IAAI,CAAC,KAAK;IACd,IAAI,EAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,IAAK,KAAK;IAC9C,MAAM,EAAE,kEAAY,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IACtD,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;EACjB,CAAC,CAAC,CAAC;AACP;AAMA,MAAM,eAAe,GAAG,CACtB;EAAC,EAAE,EAAE,OAAO;EAAE,IAAI,EAAE,cAAc;EAAE,KAAK,EAAE;AAAI,CAAC,EAChD;EAAC,EAAE,EAAE,MAAM;EAAE,IAAI,EAAE,cAAc;EAAE,KAAK,EAAE;AAAI,CAAC,EAC/C;EAAC,EAAE,EAAE,UAAU;EAAE,IAAI,EAAE,aAAa;EAAE,KAAK,EAAE;AAAI,CAAC,EAClD;EAAC,EAAE,EAAE,WAAW;EAAE,IAAI,EAAE,WAAW;EAAE,KAAK,EAAE;AAAI,CAAC,EACjD;EAAC,EAAE,EAAE,SAAS;EAAE,IAAI,EAAE,OAAO;EAAE,KAAK,EAAE;AAAI,CAAC,EAC3C;EAAC,EAAE,EAAE,QAAQ;EAAE,IAAI,EAAE,MAAM;EAAE,KAAK,EAAE,IAAI;EAAE,KAAK,EAAE;AAAI,CAAC,EACtD;EAAC,EAAE,EAAE,QAAQ;EAAE,IAAI,EAAE,gBAAgB;EAAE,KAAK,EAAE,IAAI;EAAE,KAAK,EAAE;AAAI,CAAC,EAChE;EAAC,EAAE,EAAE,QAAQ;EAAE,IAAI,EAAE,YAAY;EAAE,KAAK,EAAE;AAAI,CAAC,EAG/C;EAAC,EAAE,EAAE,cAAc;EAAE,IAAI,EAAE,aAAa;EAAE,KAAK,EAAE;AAAK,CAAC,CACxD;AAED,SAAS,IAAI,CAAC;EAAC;AAAQ,CAAC,EAAE;EACxB,OAAO;IAAG,SAAS,EAAC,gBAAgB;IAAC,eAAY,MAAM;IAAA,UAAE;EAAQ,gBAAI,CAAC;AACxE;AAEA,SAAS,KAAK,CAAC;EAAC,OAAO;EAAE;AAAM,CAAC,EAAE;EAChC,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,OAAO,EAAE,OAAO,SAAS;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;IAC7C,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EACzC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACrB,OAAO,OAAO,GAAG;IAAK,SAAS,EAAC,gBAAgB;IAAC,IAAI,EAAC,QAAQ;IAAA,UAAE;EAAO,gBAAM,CAAC,GAAG,IAAI;AACvF;AAEA,SAAS,MAAM,CAAC;EAAC,IAAI;EAAE,KAAK,GAAG;AAAK,CAAC,EAAE;EAQrC,MAAM,SAAS,GAAG,kBAAkB,IAAI,KAAK,GAAG,QAAQ,GAAG,EAAE,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC;EAChG,OAAO;IAAK,SAAS,EAAE,SAAU;IAAA,WAC9B,IAAI,CAAC,MAAM,GAAG;MAAK,GAAG,EAAE,IAAI,CAAC,MAAO;MAAC,GAAG,EAAC;IAAE,gBAAE,CAAC,GAAG,8DAAC,IAAI;MAAA,UAAE,IAAI,CAAC,IAAI,IAAI;IAAQ,gBAAO,CAAC,EACrF,IAAI,CAAC,MAAM,KAAK,SAAS,GAAG;MAAM,SAAS,EAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,GAAG;IAAU,gBAAE,CAAC,GAAG,IAAI;EAAA,eACxF,CAAC;AACR;AAMA,SAAS,aAAa,CAAC,OAAO,EAAE;EAC9B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,EAAE,OAAO,OAAO,IAAI,EAAE;EACxE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;IACpD,MAAM,KAAK,GAAG;MAAC,EAAE,EAAE,MAAM;MAAE,EAAE,EAAE,MAAM;MAAE,EAAE,EAAE,MAAM;MAAE,EAAE,EAAE,MAAM;MAAE,EAAE,EAAE,MAAM;MAAE,EAAE,EAAE;IAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzG,IAAI,KAAK,EAAE,OAAO,KAAK;EACzB;EACA,OAAO,OAAO,CAAC,GAAG,IAAI,MAAM;AAC9B;AAEA,SAAS,sBAAsB,CAAC,EAAE,EAAE;EAClC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE;EAClB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;EACzB,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC;EACtB,MAAM,UAAU,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;EACtF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;EACxE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;IAAC,IAAI,EAAE,SAAS;IAAE,MAAM,EAAE;EAAS,CAAC,CAAC;EACzF,IAAI,IAAI,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;EAE7B,IAAI,IAAI,KAAK,CAAC,EAAE,OAAO,IAAI,GAAG,IAAI,CAAC,CAAC;EACpC,IAAI,IAAI,GAAG,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;EAC9E,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;IAAC,KAAK,EAAE,SAAS;IAAE,GAAG,EAAE;EAAS,CAAC,CAAC;AAC7E;AAIA,SAAS,sBAAsB,CAAC,EAAE,EAAE;EAClC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;EACtB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;EAChD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;EAClD,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;AAC1D;AAIA,SAAS,kBAAkB,CAAC,SAAS,EAAE;EACrC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE;EAC/C,MAAM,IAAI,GAAG,EAAE;EACf,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe;EAC7C,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE;IAGtB,IAAI,CAAC,IAAI,CAAC;MAAC,EAAE,EAAE,QAAQ;MAAE,KAAK,EAAE,MAAM;MAAE,OAAO,EAAE,MAAM;MAAE,IAAI,EAAE,eAAe;MAAE,IAAI,EAAE,QAAQ;MAC5F,MAAM,EAAE,IAAI;MAAE,MAAM,EAAE,GAAG,CAAC,YAAY,IAAI;IAAC,CAAC,CAAC;EACjD;EACA,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc;EAC9C,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE;IAC1B,IAAI,CAAC,IAAI,CAAC;MAAC,EAAE,EAAE,OAAO;MAAE,KAAK,EAAE,MAAM;MAAE,OAAO,EAAE,SAAS;MAAE,IAAI,EAAE,QAAQ;MAAE,IAAI,EAAE,OAAO;MACtF,aAAa,EAAE,IAAI;MAAE,KAAK,EAAE,KAAK,CAAC,KAAK;MAAE,MAAM,EAAE,KAAK,CAAC,YAAY,IAAI;IAAC,CAAC,CAAC;EAC9E;EACA,OAAO,IAAI;AACb;AAEA,SAAS,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE;EAClD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE;EACjD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK;IACnC,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,aAAa,KAAK,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI;IACrF,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,MAAM;IAClF,IAAI,MAAM,EAAE,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC;IACnD,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO;IAChE,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;IAC9E,OAAO;MACL,EAAE,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC;MAC5C,KAAK,EAAE,+DAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;MACzD,OAAO;MACP,IAAI,EAAE,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;MAC1C,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;MAG7C,MAAM,EAAE,kEAAY,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;MAEtD,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ;MAElC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM;MAC3C,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;MAY7D,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;IAChD,CAAC;EACH,CAAC,CAAC;AACJ;AAEA,SAAS,gBAAgB,GAAG;EAC1B,OAAO;IAAK,SAAS,EAAC,qBAAqB;IAAC,cAAW,KAAK;IAAA,WAC1D;MAAQ,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,WAAW,CAAE;MAAA,WAAC,8DAAC,IAAI;QAAA,UAAC;MAAS,gBAAM,CAAC;QAAA,UAAM;MAAG,gBAAM,CAAC;IAAA,eAAQ,CAAC,EAC3G;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,QAAQ;MAAA,WAAC,8DAAC,IAAI;QAAA,UAAC;MAAM,gBAAM,CAAC;QAAA,UAAM;MAAE,gBAAM,CAAC;IAAA,eAAQ,CAAC;EAAA,eACjF,CAAC;AACR;AAEA,SAAS,SAAS,CAAC;EAAC,OAAO;EAAE,QAAQ;EAAE;AAAW,CAAC,EAAE;EACnD,MAAM,OAAO,GAAG,CACd;IAAC,EAAE,EAAE,SAAS;IAAE,IAAI,EAAE,OAAO;IAAE,KAAK,EAAE;EAAI,CAAC,EAC3C;IAAC,EAAE,EAAE,SAAS;IAAE,IAAI,EAAE,gBAAgB;IAAE,KAAK,EAAE;EAAI,CAAC,EACpD;IAAC,EAAE,EAAE,cAAc;IAAE,IAAI,EAAE,aAAa;IAAE,KAAK,EAAE,MAAM;IAAE,UAAU,EAAE;EAAc,CAAC,EACpF;IAAC,EAAE,EAAE,YAAY;IAAE,IAAI,EAAE,gBAAgB;IAAE,KAAK,EAAE,MAAM;IAAE,UAAU,EAAE;EAAa,CAAC,EACpF;IAAC,EAAE,EAAE,MAAM;IAAE,IAAI,EAAE,iBAAiB;IAAE,KAAK,EAAE,KAAK;IAAE,UAAU,EAAE;EAAS,CAAC,CAC3E,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,CAAC;EAC5F,OAAO;IAAK,SAAS,EAAC,wBAAwB;IAAC,WAAW,EAAE,OAAQ;IAAA,UAClE;MAAK,SAAS,EAAC,qBAAqB;MAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAE;MAAC,IAAI,EAAC,MAAM;MAAA,UACpF,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI;QAAQ,IAAI,EAAC,QAAQ;QAAC,IAAI,EAAC,UAAU;QAAe,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAE;QAAA,WACrG,8DAAC,IAAI;UAAA,UAAE,IAAI,CAAC;QAAI,gBAAO,CAAC;UAAA,UAAO,IAAI,CAAC;QAAK,gBAAO,CAAC;MAAA,GADa,IAAI,CAAC,EAAE,MAE/D,CAAC;IAAC,gBACP;EAAC,gBACH,CAAC;AACR;AAQA,SAAS,gBAAgB,CAAC,IAAI,EAAE;EAC9B,MAAM,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;EAC9D,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;EAClC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;EACtB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK;AACzG;AAEA,SAAS,qBAAqB,CAAC;EAAC,SAAS;EAAE;AAAS,CAAC,EAAE;EACrD,OAAO;IAAK,SAAS,EAAC,qBAAqB;IAAC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAU;IAAA,UACrF;MAAK,SAAS,EAAC,YAAY;MAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAE;MAAA,WAC3D,SAAS,GAAG;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,kBAAkB;QAAC,cAAW,IAAI;QAAC,OAAO,EAAE,SAAU;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAK,gBAAM;MAAC,gBAAQ,CAAC,GAAG,IAAI,EACtI;QAAA,UAAI;MAAM,gBAAI,CAAC,EACf;QAAA,UAAG;MAA8B,gBAAG,CAAC,EACrC;QAAQ,SAAS,EAAC,cAAc;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,UAAU,CAAE;QAAA,UAAC;MAAK,gBAAQ,CAAC;IAAA,eACjF;EAAC,gBACH,CAAC;AACR;AAEA,SAAS,WAAW,CAAC;EAAC,IAAI;EAAE,SAAS;EAAE,QAAQ;EAAE,QAAQ;EAAE,eAAe;EAAE;AAAa,CAAC,EAAE;EAC1F,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,IAAI,KAAK,eAAe,CAAC;EACxE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAG5C,MAAM,CAAC,SAAS,CAAC,GAAG,sEAAa,CAAC,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,IAAI,EAAE,wDAAY,EAAE,CAAC,QAAQ,CAAC,CAAC;EACtG,MAAM,OAAO,GAAG,IAAI,KAAK,kBAAkB,IAAK,CAAC,CAAC,QAAQ,IAAI,SAAS,KAAK,KAAM;EAUlF,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACjE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;EAC1D,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;EAC7E,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;EAChI,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC;EAS3C,MAAM,YAAY,GAAG,SAAS,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ;EACnF,MAAM,CAAC,cAAc,CAAC,GAAG,sEAAa,CAAC,QAAQ,GAAG,kBAAkB,GAAG,QAAQ,GAAG,IAAI,EAAE,6DAAiB,EAAE,CAAC,QAAQ,CAAC,CAAC;EACtH,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAOvE,MAAM,UAAU,GAAI,QAAQ,IAAI,cAAc,GAC5C,+BAA+B,QAAQ,IAAI,cAAc,CAAC,aAAa,IAAI,cAAc,CAAC,MAAM,EAAE,GAAG,IAAI;EAC3G,IAAI,eAAe,GAAG,CAAC;EACvB,IAAI;IAAE,eAAe,GAAG,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAe;EACnH,MAAM,YAAY,GAAG,eAAe,GAAG,CAAC,IAAK,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,eAAe,GAAI,gBAAgB,CAAC,YAAY,IAAI,YAAY,CAAC,YAAY,CAAC;EACxI,MAAM,oBAAoB,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,iBAAiB,IAAI,CAAC,YAAY,KACjF,cAAc,CAAC,MAAM,KAAK,YAAY,IAAI,cAAc,CAAC,MAAM,KAAK,UAAU,CAAC;EAClF,MAAM,uBAAuB,GAAG,MAAM;IACpC,IAAI,UAAU,EAAE;MAAE,IAAI;QAAE,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;MAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAe;IAAE;IAC3G,oBAAoB,CAAC,IAAI,CAAC;EAC5B,CAAC;EAED,MAAM,kBAAkB,GAAG,IAAI,IAAI;IACjC,IAAI,IAAI,CAAC,MAAM,EAAE;MACf,QAAQ,CAAC,iBAAiB,CAAC;IAC7B,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,IAAI,eAAe,EAAE;MAC9D,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B,CAAC,MAAM,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,IAAI,eAAe,EAAE;MACzD,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1B,CAAC,MAAM;MACL,QAAQ,CAAC,eAAe,CAAC;IAC3B;EACF,CAAC;EAED,MAAM,cAAc,GAAG,IAAI,IAAI;IAC7B,WAAW,CAAC,KAAK,CAAC;IAClB,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,OAAO,QAAQ,CAAC,cAAc,CAAC;IAC1D,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,OAAO,QAAQ,CAAC,iBAAiB,CAAC;IAC7D,IAAI,IAAI,CAAC,EAAE,KAAK,cAAc,EAAE,OAAO,QAAQ,CAAC,YAAY,CAAC;IAC7D,IAAI,IAAI,CAAC,EAAE,KAAK,YAAY,EAAE,OAAO,QAAQ,CAAC,YAAY,CAAC;IAC3D,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,aAAa,EAAE,OAAO,aAAa,CAAC,CAAC;IAC/D,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,GAAG,UAAU,GAAG,GAAG,IAAI,CAAC,KAAK,aAAa,CAAC;EACxE,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,uBAAuB;IAAA,WAC3C;MAAQ,SAAS,EAAC,sBAAsB;MAAA,WACrC,OAAO,GAAG;QAAK,SAAS,EAAC,qBAAqB;QAAA,WAAC;UAAM,SAAS,EAAC;QAAkB,gBAAE,CAAC,OAAG;MAAA,eAAK,CAAC,GAAG;QAAA,UAAI;MAAE,gBAAI,CAAC,EAC5G;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,sBAAsB;QAAC,OAAO,EAAE,MAAM,WAAW,CAAC,IAAI,CAAE;QAAC,cAAW,MAAM;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAI,gBAAM;MAAC,gBAAQ,CAAC;IAAA,eAC/H,CAAC,EACT;MAAM,SAAS,EAAC,uBAAuB;MAAA,WACrC;QAAO,SAAS,EAAC,iBAAiB;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAM,gBAAM,CAAC;UAAO,KAAK,EAAE,KAAM;UAAC,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;UAAC,WAAW,EAAC;QAAI,gBAAE,CAAC;MAAA,eAAO,CAAC,EAC9I,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG;QAAS,SAAS,EAAC,mBAAmB;QAAA,WAC3D;UAAA,UAAI;QAAK,gBAAI,CAAC,EACd;UAAK,SAAS,EAAC,0BAA0B;UAAA,UACtC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI;YAAQ,IAAI,EAAC,QAAQ;YAAe,OAAO,EAAE,MAAM,eAAe,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAE;YAAA,WACnH,8DAAC,MAAM;cAAC,IAAI,EAAE,IAAK;cAAC,KAAK;YAAA,gBAAE,CAAC;cAAA,UAAO,IAAI,CAAC;YAAI,gBAAO,CAAC;UAAA,GADL,IAAI,CAAC,EAAE,MAEhD,CAAC;QAAC,gBACP,CAAC;MAAA,eACC,CAAC,GAAG,IAAI,EACjB;QAAS,SAAS,EAAC,wBAAwB;QAAC,cAAW,MAAM;QAAA,WAC1D,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAE,uBAAuB,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,GAAG,EAAE,CAAE;UAChG,OAAO,EAAE,MAAM,kBAAkB,CAAC,IAAI,CAAE;UAAA,WACtD,8DAAC,MAAM;YAAC,IAAI,EAAE;UAAK,gBAAE,CAAC,EACtB;YAAM,SAAS,EAAC,4BAA4B;YAAA,WAAC;cAAA,UAAS,IAAI,CAAC;YAAK,gBAAS,CAAC;cAAA,UAAQ,IAAI,CAAC;YAAO,gBAAQ,CAAC;UAAA,eAAM,CAAC,EAC9G;YAAM,SAAS,EAAC,4BAA4B;YAAA,WAAC;cAAA,UAAO,IAAI,CAAC;YAAI,gBAAO,CAAC,EAClE,IAAI,CAAC,MAAM,GAAG;cAAA,UAAI,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC;YAAM,gBAAI,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,8DAAC,IAAI;cAAA,UAAC;YAAiB,gBAAM,CAAC,GAAG,IAAI;UAAA,eAC/G,CAAC;QAAA,GALF,IAAI,CAAC,EAAE,MAMN,CAAC,CAAC,EACT,QAAQ,CAAC,MAAM,KAAK,CAAC,GAAG;UAAK,SAAS,EAAC,gBAAgB;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAU,gBAAM,CAAC;YAAA,UAAG;UAAO,gBAAG,CAAC;QAAA,eAAK,CAAC,GAAG,IAAI;MAAA,eACpG,CAAC;IAAA,eACN,CAAC,EACP,8DAAC,gBAAgB,mBAAE,CAAC,EACnB,QAAQ,GAAG,8DAAC,SAAS;MAAC,OAAO,EAAE,MAAM,WAAW,CAAC,KAAK,CAAE;MAAC,QAAQ,EAAE,cAAe;MAAC,WAAW,EAAE,SAAS,IAAI,SAAS,CAAC;IAAY,gBAAE,CAAC,GAAG,IAAI,EAC9I,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC,EACpD,oBAAoB,GAAG,8DAAC,qBAAqB;MAAC,SAAS,EAAE,CAAC,EAAE,YAAY,IAAI,YAAY,CAAC,UAAU,CAAE;MAAC,SAAS,EAAE;IAAwB,gBAAE,CAAC,GAAG,IAAI;EAAA,eACjJ,CAAC;AACR;AAEA,SAAS,cAAc,GAAG;EACxB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAClD,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAEpE,sDAAe,CAAC,MAAM;IACpB,4DAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EAChI,CAAC,EAAE,EAAE,CAAC;EAMN,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;EAEtH,MAAM,SAAS,GAAG,IAAI,IAAI;IACxB,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;IACpB,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,SAAS,CAAC,SAAS,EAAE;MAC7C,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE;IACA,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,OAAO,CAAC;IAC9B,UAAU,CAAC,KAAK,CAAC;EACnB,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,sBAAsB;IAAA,WAC1C;MAAQ,SAAS,EAAC,qBAAqB;MAAA,WAAC;QAAQ,OAAO,EAAE,MAAM,QAAQ,CAAC,eAAe,CAAE;QAAC,cAAW,IAAI;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAkB,gBAAM;MAAC,gBAAQ,CAAC;QAAA,UAAI;MAAK,gBAAI,CAAC,yFAAO,CAAC;IAAA,eAAQ,CAAC,EACjL;MAAM,SAAS,EAAC,sBAAsB;MAAA,WACpC;QAAG,SAAS,EAAC,cAAc;QAAA,UAAC;MAAQ,gBAAG,CAAC,EACxC;QAAK,SAAS,EAAC,kBAAkB;QAAA,WAAC,8DAAC,MAAM;UAAC,IAAI,EAAE;YAAC,MAAM,EAAE;UAAiB;QAAE,gBAAE,CAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,qBAAqB;UAAC,aAAa,EAAE,CAAC,IAAI;YAAC,CAAC,CAAC,cAAc,CAAC,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC;UAAC,CAAE;UAAA,UAAC;QAAiB,gBAAQ,CAAC;MAAA,eAAK,CAAC,EAClO;QAAK,SAAS,EAAC,uBAAuB;QAAA,WAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,0BAA0B;UAAC,aAAa,EAAE,CAAC,IAAI;YAAC,CAAC,CAAC,cAAc,CAAC,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC;UAAC,CAAE;UAAA,UAAC;QAAY,gBAAQ,CAAC,gEAAC,MAAM;UAAC,IAAI,EAAE;YAAC,MAAM,EAAE;UAAiB;QAAE,gBAAE,CAAC;MAAA,eAAK,CAAC,EACtO,QAAQ,GAAG;QAAG,SAAS,EAAC,0BAA0B;QAAA,WAAC,MAAI,EAAC,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,KAAK;MAAA,eAAI,CAAC,GAAG,IAAI;IAAA,eACzH,CAAC,EACP;MAAQ,SAAS,EAAC,uBAAuB;MAAA,WAAC,8DAAC,IAAI;QAAA,UAAC;MAAQ,gBAAM,CAAC;QAAA,UAAM;MAAI,gBAAM,CAAC,gEAAC,IAAI;QAAA,UAAC;MAAuB,gBAAM,CAAC,gEAAC,IAAI;QAAA,UAAC;MAAkB,gBAAM,CAAC;IAAA,eAAQ,CAAC,EAC3J,OAAO,GAAG;MAAK,SAAS,EAAC,yBAAyB;MAAC,WAAW,EAAE,MAAM,UAAU,CAAC,KAAK,CAAE;MAAA,UACvF;QAAK,SAAS,EAAC,qBAAqB;QAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAE;QAAC,IAAI,EAAC,MAAM;QAAA,UACpF,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI;UAAQ,IAAI,EAAC,QAAQ;UAAC,IAAI,EAAC,UAAU;UAAe,OAAO,EAAE,MAAM,SAAS,CAAC,IAAI,CAAE;UAAA,WACtG;YAAA,UAAO,IAAI,CAAC;UAAK,gBAAO,CAAC,gEAAC,IAAI;YAAA,UAAE,IAAI,CAAC;UAAI,gBAAO,CAAC;QAAA,GADa,IAAI,CAAC,EAAE,MAE/D,CAAC;MAAC,gBACP;IAAC,gBACH,CAAC,GAAG,IAAI,EACb,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAClD,CAAC;AACR;AAMA,MAAM,iBAAiB,GAAG;EACxB,qBAAqB,EAAE,UAAU;EACjC,mBAAmB,EAAE,UAAU;EAC/B,sBAAsB,EAAE,UAAU;EAClC,oBAAoB,EAAE,UAAU;EAChC,yBAAyB,EAAE,OAAO;EAClC,oBAAoB,EAAE,UAAU;EAChC,wBAAwB,EAAE,QAAQ;EAClC,QAAQ,EAAE,aAAa;EACvB,QAAQ,EAAE,aAAa;EAKvB,QAAQ,EAAE,gBAAgB;EAC1B,MAAM,EAAE;AACV,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAI,EAAE;EACpC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;EAK3C,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;EAC/E,IAAI,MAAM,EAAE,OAAO,MAAM;EACzB,OAAO,OAAO,IAAI,aAAa;AACjC;AAEA,SAAS,cAAc,CAAC;EAAC;AAAa,CAAC,EAAE;EACvC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAE5C,sDAAe,CAAC,MAAM;IACpB,sEAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAC9D,KAAK,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAC7C,OAAO,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;EACrC,CAAC,EAAE,EAAE,CAAC;EAEN,MAAM,QAAQ,GAAG,IAAI,IAAI;IACvB,IAAI,IAAI,CAAC,OAAO,EAAE;IAClB,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG;MAAC,GAAG,CAAC;MAAE,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;IAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjG,0EAA0B,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM;MAG9C,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG;QAAC,GAAG,CAAC;QAAE,OAAO,EAAE;MAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC;EACJ,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,sBAAsB;IAAA,WAC1C;MAAQ,SAAS,EAAC,qBAAqB;MAAA,WAAC;QAAQ,OAAO,EAAE,MAAM;UAAE,IAAI,CAAC,0DAAc,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;QAAE,CAAE;QAAC,cAAW,IAAI;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAkB,gBAAM;MAAC,gBAAQ,CAAC;QAAA,UAAI;MAAI,gBAAI,CAAC,yFAAO,CAAC;IAAA,eAAQ,CAAC,EACnN;MAAM,SAAS,EAAC,0BAA0B;MAAA,WACvC,OAAO,GAAG;QAAG,SAAS,EAAC,gBAAgB;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAe,gBAAM,CAAC,QAAI;MAAA,eAAG,CAAC,GAAG,IAAI,EACnF,KAAK,GAAG;QAAG,SAAS,EAAC,gBAAgB;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAa,gBAAM,CAAC,EAAC,KAAK;MAAA,eAAI,CAAC,GAAG,IAAI,EAClF,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG;QAAG,SAAS,EAAC,gBAAgB;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAkB,gBAAM,CAAC,UAAM;MAAA,eAAG,CAAC,GAAG,IAAI,EACzH,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI;QAAuB,SAAS,EAAE,IAAI,CAAC,OAAO,GAAG,MAAM,GAAG,EAAG;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAE;QAAA,WAC7G;UAAA,UAAO,sBAAsB,CAAC,IAAI,CAAC,UAAU;QAAC,gBAAO,CAAC,EACtD;UAAK,SAAS,EAAC,0BAA0B;UAAA,WACvC;YAAA,WAAQ;cAAA,UAAK,IAAI,CAAC;YAAK,gBAAK,CAAC,EAAC,CAAC,IAAI,CAAC,OAAO,GAAG;cAAA,UAAM;YAAC,gBAAM,CAAC,GAAG,IAAI;UAAA,eAAS,CAAC,EAC7E;YAAA,UAAI,sBAAsB,CAAC,IAAI;UAAC,gBAAI,CAAC,EACpC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG;YAAA,WAAI;cAAA,WAAK;gBAAA,UAAI;cAAG,gBAAI,CAAC;gBAAA,UAAK,IAAI,CAAC,MAAM,CAAC;cAAM,gBAAK,CAAC;YAAA,eAAK,CAAC,EAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG;cAAA,WAAK;gBAAA,UAAI;cAAK,gBAAI,CAAC;gBAAA,UAAK,IAAI,CAAC,MAAM,CAAC;cAAE,gBAAK,CAAC;YAAA,eAAK,CAAC,GAAG,IAAI;UAAA,eAAK,CAAC,GAAG,IAAI,EASpL,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,GAC1F;YAAQ,IAAI,EAAC,QAAQ;YAAC,SAAS,EAAC,sBAAsB;YAAC,OAAO,EAAE,CAAC,IAAI;cAAE,CAAC,CAAC,eAAe,CAAC,CAAC;cAAE,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,CAAE;YAAA,WAAC,OAAK,gEAAC,IAAI;cAAA,UAAC;YAAa,gBAAM,CAAC;UAAA,eAAQ,CAAC,GACtL,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,gBAAgB,CAAC,GAC7D;YAAQ,IAAI,EAAC,QAAQ;YAAC,SAAS,EAAC,sBAAsB;YAAC,OAAO,EAAE,CAAC,IAAI;cAAE,CAAC,CAAC,eAAe,CAAC,CAAC;cAAE,QAAQ,CAAC,iBAAiB,CAAC;YAAE,CAAE;YAAA,WAAC,QAAM,gEAAC,IAAI;cAAA,UAAC;YAAa,gBAAM,CAAC;UAAA,eAAQ,CAAC,GACrK,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GACnD;YAAQ,IAAI,EAAC,QAAQ;YAAC,SAAS,EAAC,sBAAsB;YAAC,OAAO,EAAE,CAAC,IAAI;cAAE,CAAC,CAAC,eAAe,CAAC,CAAC;cAAE,QAAQ,CAAC,aAAa,GAAG,UAAU,GAAG,gBAAgB,CAAC;YAAE,CAAE;YAAA,WAAC,SAAO,gEAAC,IAAI;cAAA,UAAC;YAAa,gBAAM,CAAC;UAAA,eAAQ,CAAC,GAClM,IAAI,EACV;YAAA,WAAQ,MAAI,uFAAK,CAAC,YAAQ;UAAA,eAAQ,CAAC;QAAA,eAChC,CAAC;MAAA,GAtByB,IAAI,CAAC,EAAE,MAuB/B,CAAC,CAAC;IAAA,eACP,CAAC,EACP,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAClD,CAAC;AACR;AAEe,SAAS,iBAAiB,CAAC,KAAK,EAAE;EAC/C,QAAQ,KAAK,CAAC,IAAI;IAChB,KAAK,iBAAiB;MAAE,OAAO,8DAAC,cAAc;QAAC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC;MAAS,gBAAE,CAAC;IAClF,KAAK,iBAAiB;MAAE,OAAO,8DAAC,cAAc,mBAAE,CAAC;IACjD,KAAK,kBAAkB;IACvB,KAAK,eAAe;IACpB,KAAK,eAAe;IACpB;MAAS,OAAO,8DAAC,WAAW;QAAA,GAAK;MAAK,gBAAG,CAAC;EAC5C;AACF,C;;;;;;;;;;;;;;;;;;;;ACje0B;AAEwB;AAAA;AAElD,MAAM,QAAQ,GAAG,IAAI,IAAI,0DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;AAEjD,MAAM,sBAAsB,GAAG,CACpC,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,kBAAkB,EAC9E,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAC9E,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAChF,qBAAqB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAC/E,oBAAoB,EAAE,gBAAgB,CACvC;AAED,MAAM,OAAO,GAAG,CACd;EAAC,EAAE,EAAE,KAAK;EAAE,IAAI,EAAE,KAAK;EAAE,IAAI,EAAE,UAAU;EAAE,MAAM,EAAE;AAAU,CAAC,EAC9D;EAAC,EAAE,EAAE,OAAO;EAAE,IAAI,EAAE,IAAI;EAAE,IAAI,EAAE,OAAO;EAAE,KAAK,EAAE;AAAiB,CAAC,EAClE;EAAC,EAAE,EAAE,MAAM;EAAE,IAAI,EAAE,MAAM;EAAE,IAAI,EAAE,OAAO;EAAE,KAAK,EAAE;AAAiB,CAAC,EACnE;EAAC,EAAE,EAAE,MAAM;EAAE,IAAI,EAAE,KAAK;EAAE,IAAI,EAAE,OAAO;EAAE,KAAK,EAAE;AAAiB,CAAC,EAClE;EAAC,EAAE,EAAE,MAAM;EAAE,IAAI,EAAE,IAAI;EAAE,IAAI,EAAE,OAAO;EAAE,KAAK,EAAE;AAAiB,CAAC,CAClE;AAED,MAAM,OAAO,GAAG,CACd;EAAC,EAAE,EAAE,MAAM;EAAE,IAAI,EAAE,MAAM;EAAE,IAAI,EAAE,OAAO;EAAE,IAAI,EAAE;AAAgB,CAAC,EACjE;EAAC,EAAE,EAAE,MAAM;EAAE,IAAI,EAAE,OAAO;EAAE,IAAI,EAAE,KAAK;EAAE,KAAK,EAAE;AAAiB,CAAC,EAClE;EAAC,EAAE,EAAE,OAAO;EAAE,IAAI,EAAE,IAAI;EAAE,IAAI,EAAE,IAAI;EAAE,KAAK,EAAE;AAAiB,CAAC,EAC/D;EAAC,EAAE,EAAE,MAAM;EAAE,IAAI,EAAE,MAAM;EAAE,IAAI,EAAE,MAAM;EAAE,KAAK,EAAE;AAAiB,CAAC,EAClE;EAAC,EAAE,EAAE,MAAM;EAAE,IAAI,EAAE,KAAK;EAAE,IAAI,EAAE,OAAO;EAAE,KAAK,EAAE;AAAiB,CAAC,CACnE;AAED,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;AAE1H,SAAS,IAAI,CAAC;EAAC;AAAQ,CAAC,EAAE;EACxB,OAAO;IAAG,SAAS,EAAC,gBAAgB;IAAC,eAAY,MAAM;IAAA,UAAE;EAAQ,gBAAI,CAAC;AACxE;AAEA,SAAS,MAAM,CAAC;EAAC;AAAI,CAAC,EAAE;EACtB,OAAO;IAAM,SAAS,EAAC,gBAAgB;IAAA,UACpC,IAAI,CAAC,KAAK,GAAG;MAAK,GAAG,EAAE,IAAI,CAAC,KAAM;MAAC,GAAG,EAAC;IAAE,gBAAE,CAAC,GAAG,8DAAC,IAAI;MAAA,UAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI;IAAQ,gBAAO;EAAC,gBAC/F,CAAC;AACT;AAEA,SAAS,MAAM,CAAC;EAAC,KAAK,GAAG,OAAO;EAAE,QAAQ,GAAG,KAAK;EAAE;AAAM,CAAC,EAAE;EAC3D,OAAO;IAAQ,SAAS,EAAC,qBAAqB;IAAA,WAC5C;MAAQ,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,eAAe,CAAE;MAAC,cAAW,MAAM;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAkB,gBAAM;IAAC,gBAAQ,CAAC,EAC1H;MAAA,WAAK;QAAA,UAAK;MAAK,gBAAK,CAAC,EAAC,QAAQ,GAAG;QAAA,UAAO;MAAQ,gBAAO,CAAC,GAAG,IAAI;IAAA,eAAM,CAAC,EACtE;MAAQ,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,MAAO;MAAC,cAAW,MAAM;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAS,gBAAM;IAAC,gBAAQ,CAAC;EAAA,eAClF,CAAC;AACX;AAEA,SAAS,KAAK,CAAC;EAAC,OAAO;EAAE;AAAM,CAAC,EAAE;EAChC,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,OAAO,EAAE,OAAO,SAAS;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;IAC7C,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EACzC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACrB,OAAO,OAAO,GAAG;IAAK,SAAS,EAAC,YAAY;IAAC,IAAI,EAAC,QAAQ;IAAA,UAAE;EAAO,gBAAM,CAAC,GAAG,IAAI;AACnF;AAEA,SAAS,WAAW,CAAC;EAAC,IAAI,GAAG,KAAK;EAAE,QAAQ,GAAG,CAAC;EAAE,MAAM,GAAG;AAAK,CAAC,EAAE;EACjE,OAAO;IAAK,SAAS,EAAE,qBAAqB,IAAI,IAAI,GAAG,OAAO,GAAG,EAAE,CAAE;IAAA,WAClE,CAAC,IAAI,GAAG,8DAAC,MAAM;MAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAAE,gBAAE,CAAC,GAAG,IAAI,EAC5C;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAE,sBAAsB,IAAI,IAAI,GAAG,OAAO,GAAG,EAAE,CAAE;MAAC,cAAY,KAAK,QAAQ,KAAM;MAAA,WAC9G,8DAAC,IAAI;QAAA,UAAC;MAAU,gBAAM,CAAC;QAAM,SAAS,EAAC;MAAc,gBAAE,CAAC;QAAA,WAAS,QAAQ,EAAC,GAAC;MAAA,eAAQ,CAAC,EAAC,MAAM,GAAG,oFAAI,CAAC,GAAG,IAAI;IAAA,eACpG,CAAC,EACR,IAAI,GAAG,8DAAC,MAAM;MAAC,IAAI,EAAE;QAAC,KAAK,EAAE;MAAiB;IAAE,gBAAE,CAAC,GAAG,IAAI;EAAA,eACxD,CAAC;AACR;AAEA,SAAS,UAAU,CAAC;EAAC,IAAI,GAAG,KAAK;EAAE,QAAQ;EAAE,QAAQ;EAAE;AAAQ,CAAC,EAAE;EAChE,OAAO;IAAK,SAAS,EAAE,oBAAoB,IAAI,QAAQ,KAAK,SAAS,GAAG,aAAa,GAAG,EAAE,CAAE;IAAA,WACzF,QAAQ,KAAK,SAAS,GAAG;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAE,eAAe,IAAI,QAAQ,GAAG,UAAU,GAAG,EAAE,CAAE;MAAC,OAAO,EAAE,QAAS;MAAC,cAAY,QAAQ,GAAG,MAAM,GAAG,MAAO;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAE,QAAQ,GAAG,OAAO,GAAG;MAAE,gBAAO;IAAC,gBAAQ,CAAC,GAAG,IAAI,EAC5N;MAAK,SAAS,EAAE,qBAAqB,IAAI,IAAI,GAAG,OAAO,GAAG,EAAE,CAAE;MAAA,WAC3D,CAAC,IAAI,GAAG,8DAAC,MAAM;QAAC,IAAI,EAAE,OAAO,CAAC,CAAC;MAAE,gBAAE,CAAC,GAAG,IAAI,EAC5C;QAAK,SAAS,EAAE,qBAAqB,IAAI,IAAI,GAAG,OAAO,GAAG,EAAE,CAAE;QAAA,UAAE;MAAQ,gBAAM,CAAC,EAC9E,IAAI,GAAG,8DAAC,MAAM;QAAC,IAAI,EAAE;UAAC,KAAK,EAAE;QAAiB;MAAE,gBAAE,CAAC,GAAG,IAAI;IAAA,eACxD,CAAC;EAAA,eACH,CAAC;AACR;AAEA,SAAS,WAAW,CAAC;EAAC,QAAQ;EAAE,MAAM,GAAG,KAAK;EAAE,QAAQ;EAAE;AAAQ,CAAC,EAAE;EACnE,OAAO;IAAK,SAAS,EAAE,oBAAoB,IAAI,QAAQ,KAAK,SAAS,GAAG,aAAa,GAAG,EAAE,CAAE;IAAA,WACzF,QAAQ,KAAK,SAAS,GAAG;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAE,eAAe,IAAI,QAAQ,GAAG,UAAU,GAAG,EAAE,CAAE;MAAC,OAAO,EAAE,QAAS;MAAC,cAAW,MAAM;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAE,QAAQ,GAAG,OAAO,GAAG;MAAE,gBAAO;IAAC,gBAAQ,CAAC,GAAG,IAAI,EACtM;MAAK,SAAS,EAAC,0BAA0B;MAAA,WACvC;QAAK,SAAS,EAAC,oBAAoB;QAAA,WAAC;UAAK,GAAG,EAAC,iBAAiB;UAAC,GAAG,EAAC;QAAQ,gBAAE,CAAC,EAC3E,QAAQ,GAAG,GAAG,IAAI,MAAM,GAAG;UAAK,SAAS,EAAC,qBAAqB;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAE,MAAM,GAAG,SAAS,GAAG;UAAc,gBAAO,CAAC;YAAA,UAAS,MAAM,GAAG,WAAW,GAAG,GAAG,QAAQ;UAAG,gBAAS,CAAC,EAAC,CAAC,MAAM,GAAG;YAAU,KAAK,EAAE,QAAS;YAAC,GAAG,EAAC;UAAK,gBAAE,CAAC,GAAG,IAAI;QAAA,eAAM,CAAC,GAAG,IAAI;MAAA,eAC/O,CAAC,EACN,8DAAC,MAAM;QAAC,IAAI,EAAE;UAAC,KAAK,EAAE;QAAiB;MAAE,gBAAE,CAAC;IAAA,eACzC,CAAC;EAAA,eACH,CAAC;AACR;AAEA,SAAS,WAAW,GAAG;EACrB,OAAO;IAAK,SAAS,EAAC,qBAAqB;IAAA,WAAC,8DAAC,MAAM;MAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAAE,gBAAE,CAAC;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,oBAAoB;MAAC,cAAW,MAAM;MAAA,WAAC;QAAK,GAAG,EAAC,iBAAiB;QAAC,GAAG,EAAC;MAAU,gBAAE,CAAC,gEAAC,IAAI;QAAA,UAAC;MAAW,gBAAM,CAAC;QAAA,UAAO;MAAK,gBAAO,CAAC;IAAA,eAAQ,CAAC;EAAA,eAAK,CAAC;AACxP;AAEA,SAAS,UAAU,CAAC;EAAC,QAAQ,GAAG,GAAG;EAAE,IAAI,GAAG,aAAa;EAAE,QAAQ;EAAE;AAAQ,CAAC,EAAE;EAC9E,OAAO;IAAK,SAAS,EAAE,oBAAoB,IAAI,QAAQ,KAAK,SAAS,GAAG,aAAa,GAAG,EAAE,CAAE;IAAA,WACzF,QAAQ,KAAK,SAAS,GAAG;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAE,eAAe,IAAI,QAAQ,GAAG,UAAU,GAAG,EAAE,CAAE;MAAC,OAAO,EAAE,QAAS;MAAC,cAAW,MAAM;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAE,QAAQ,GAAG,OAAO,GAAG;MAAE,gBAAO;IAAC,gBAAQ,CAAC,GAAG,IAAI,EACtM;MAAK,SAAS,EAAC,0BAA0B;MAAA,WAAC;QAAK,SAAS,EAAC,mBAAmB;QAAA,WAAC;UAAM,SAAS,EAAC,mBAAmB;UAAA,UAAC;QAAG,gBAAM,CAAC;UAAA,WAAK;YAAA,UAAS;UAAI,gBAAS,CAAC;YAAA,WAAO,WAAS,EAAC,QAAQ,GAAG,GAAG,GAAG,OAAO,QAAQ,GAAG,GAAG,KAAK;UAAA,eAAQ,CAAC,EAAC,QAAQ,GAAG,GAAG,GAAG;YAAU,KAAK,EAAE,QAAS;YAAC,GAAG,EAAC;UAAK,gBAAE,CAAC,GAAG,IAAI;QAAA,eAAM,CAAC,gEAAC,IAAI;UAAA,UAAE,QAAQ,GAAG,GAAG,GAAG,OAAO,GAAG;QAAU,gBAAO,CAAC;MAAA,eAAK,CAAC,gEAAC,MAAM;QAAC,IAAI,EAAE;UAAC,KAAK,EAAE;QAAiB;MAAE,gBAAE,CAAC;IAAA,eAAK,CAAC;EAAA,eAC5Y,CAAC;AACR;AAEA,SAAS,YAAY,CAAC;EAAC,IAAI;EAAE,cAAc;EAAE,QAAQ;EAAE;AAAc,CAAC,EAAE;EACtE,MAAM,UAAU,GAAG,IAAI,KAAK,qBAAqB,IAAI,IAAI,KAAK,kBAAkB;EAChF,OAAO;IAAM,SAAS,EAAC,wCAAwC;IAAA,WAC7D;MAAG,SAAS,EAAC,WAAW;MAAA,UAAC;IAAQ,gBAAG,CAAC,EACrC,8DAAC,UAAU;MAAA,UAAC;IAAsB,gBAAY,CAAC,EAC/C,8DAAC,UAAU;MAAC,IAAI;MAAC,QAAQ,EAAE,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAU;MAAC,QAAQ,EAAE,MAAM,cAAc,CAAC,MAAM,CAAE;MAAA,UAAC;IAAa,gBAAY,CAAC,EAChJ,IAAI,KAAK,kBAAkB,GAAG,8DAAC,UAAU;MAAA,WAAC;QAAQ,SAAS,EAAC,iBAAiB;QAAA,UAAC;MAAS,gBAAQ,CAAC,kBAAc;IAAA,eAAY,CAAC,GAAG,IAAI,EAClI,CAAC,iBAAiB,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG;MAAA,WACpE,8DAAC,WAAW;QAAC,QAAQ,EAAE;MAAE,gBAAE,CAAC,EAC5B,8DAAC,WAAW;QAAC,QAAQ,EAAE,IAAI,KAAK,aAAa,GAAG,EAAE,GAAG,cAAe;QAAC,MAAM,EAAE,IAAI,KAAK;MAAc,gBAAE,CAAC,EACtG,IAAI,KAAK,eAAe,GAAG;QAAA,WAAE,8DAAC,WAAW;UAAC,IAAI;UAAC,QAAQ,EAAE,EAAG;UAAC,MAAM;QAAA,gBAAE,CAAC,gEAAC,WAAW,mBAAE,CAAC;MAAA,eAAE,CAAC,GAAG,IAAI;IAAA,eAChG,CAAC,GAAG,IAAI,EACT,CAAC,cAAc,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,8DAAC,UAAU;MAAC,QAAQ,EAAE,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAU;MAAC,QAAQ,EAAE,MAAM,cAAc,CAAC,MAAM;IAAE,gBAAE,CAAC,GAAG,IAAI,EACxM,UAAU,GAAG,8DAAC,WAAW;MAAC,QAAQ,EAAE,GAAI;MAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAE;MAAC,QAAQ,EAAE,MAAM,cAAc,CAAC,OAAO;IAAE,gBAAE,CAAC,GAAG,IAAI;EAAA,eAC9H,CAAC;AACT;AAEA,SAAS,UAAU,CAAC;EAAC,OAAO;EAAE;AAAQ,CAAC,EAAE;EACvC,OAAO;IAAS,SAAS,EAAC,qBAAqB;IAAC,cAAW,MAAM;IAAA,WAC/D;MAAA,WAAK;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,QAAQ;QAAC,cAAW,MAAM;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAQ,gBAAM;MAAC,gBAAQ,CAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,cAAW,IAAI;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAuB,gBAAM;MAAC,gBAAQ,CAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,cAAW,MAAM;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAe,gBAAM;MAAC,gBAAQ,CAAC;IAAA,eAAK,CAAC,EACpQ;MAAA,UAAM,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI;QAAQ,IAAI,EAAC,QAAQ;QAAa,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,CAAE;QAAA,UAAE;MAAK,GAA5C,KAAK,OAAgD,CAAC;IAAC,gBAAM,CAAC,EACnH;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,sBAAsB;MAAC,OAAO,EAAE,QAAS;MAAC,cAAW,MAAM;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAS,gBAAM;IAAC,gBAAQ,CAAC;EAAA,eACpH,CAAC;AACZ;AAEA,SAAS,QAAQ,CAAC;EAAC,IAAI;EAAE,KAAK;EAAE,QAAQ;EAAE,MAAM;EAAE;AAAO,CAAC,EAAE;EAC1D,MAAM,KAAK,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;EAC7E,MAAM,KAAK,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;EAC7D,MAAM,OAAO,GAAG,KAAK,IAAI;IACvB,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,KAAK,kBAAkB,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;EAC/G,CAAC;EACD,OAAO;IAAA,WACL;MAAM,SAAS,EAAC,iBAAiB;MAAC,QAAQ,EAAE,KAAK,IAAI;QAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAAE,MAAM,CAAC,CAAC;MAAC,CAAE;MAAA,WACvF;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,GAAG,kBAAkB,GAAG,aAAa,CAAE;QAAC,cAAY,KAAK,GAAG,MAAM,GAAG,MAAO;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAE,KAAK,GAAG,UAAU,GAAG;QAAmB,gBAAO;MAAC,gBAAQ,CAAC,EAC9L,KAAK,GAAG;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,qBAAqB;QAAC,aAAa,EAAE,MAAM,OAAO,CAAC,YAAY,CAAE;QAAC,WAAW,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAE;QAAA,UAAC;MAAI,gBAAQ,CAAC,GAAG;QAAO,SAAS,EAAE,IAAI,KAAK,kBAAmB;QAAC,KAAK,EAAE,KAAM;QAAC,QAAQ,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAE;QAAC,SAAS,EAAE,OAAQ;QAAC,WAAW,EAAC;MAAM,gBAAE,CAAC,EACjU;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,GAAG,kBAAkB,GAAG,aAAa,CAAE;QAAC,cAAW,IAAI;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAuB,gBAAM;MAAC,gBAAQ,CAAC,EACtJ,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,cAAc;QAAA,UAAC;MAAE,gBAAQ,CAAC,GAAG;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,aAAa,CAAE;QAAC,cAAW,IAAI;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAkB,gBAAM;MAAC,gBAAQ,CAAC;IAAA,eACzM,CAAC,EACN,KAAK,GAAG,8DAAC,UAAU;MAAC,OAAO,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAE;MAAC,QAAQ,EAAE,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAAE,gBAAE,CAAC,GAAG,IAAI;EAAA,eACvH,CAAC;AACL;AAEA,SAAS,YAAY,CAAC;EAAC,MAAM,GAAG;AAAK,CAAC,EAAE;EACtC,OAAO;IAAK,SAAS,EAAE,wBAAwB,IAAI,MAAM,GAAG,SAAS,GAAG,EAAE,CAAE;IAAC,IAAI,EAAC,QAAQ;IAAA,WACxF,8DAAC,IAAI;MAAA,UAAE,MAAM,GAAG,gBAAgB,GAAG;IAAK,gBAAO,CAAC,EAChD;MAAK,SAAS,EAAC,eAAe;MAAA,UAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,KAAK;QAAe,KAAK,EAAE;UAAC,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC;QAAI;MAAE,GAA1C,KAAK,OAAuC,CAAC;IAAC,gBAAM,CAAC,EAC/I;MAAA,UAAS,MAAM,GAAG,WAAW,GAAG;IAAW,gBAAS,CAAC;MAAA,UAAO;IAAK,gBAAO,CAAC;EAAA,eACtE,CAAC;AACR;AAEA,SAAS,YAAY,CAAC;EAAC;AAAQ,CAAC,EAAE;EAChC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,QAAQ,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;EACjF,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;EAC9F,MAAM,MAAM,GAAG,EAAE,IAAI,WAAW,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;EAC1H,OAAO;IAAK,SAAS,EAAC,qBAAqB;IAAA,WACzC;MAAQ,SAAS,EAAC,uBAAuB;MAAA,WAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,kBAAkB,CAAE;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAkB,gBAAM;MAAC,gBAAQ,CAAC;QAAA,UAAI;MAAK,gBAAI,CAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,MAAM;QAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAO;QAAC,OAAO,EAAE,MAAM;UAAC,cAAc,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;UAAE,QAAQ,CAAC,kBAAkB,CAAC;QAAC,CAAE;QAAA,WAAC,IAAE,EAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE;MAAA,eAAS,CAAC;IAAA,eAAQ,CAAC,EAC1Z;MAAO,SAAS,EAAC,gBAAgB;MAAA,WAAC,8DAAC,IAAI;QAAA,UAAC;MAAM,gBAAM,CAAC;QAAO,KAAK,EAAE,KAAM;QAAC,QAAQ,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAE;QAAC,WAAW,EAAC;MAAO,gBAAE,CAAC;IAAA,eAAO,CAAC,EACzJ;MAAG,SAAS,EAAC,uBAAuB;MAAA,UAAC;IAAG,gBAAG,CAAC,EAC5C;MAAK,SAAS,EAAC,qBAAqB;MAAA,UAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI;QAAQ,IAAI,EAAC,QAAQ;QAAe,OAAO,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAE;QAAA,WAAC,8DAAC,MAAM;UAAC,IAAI,EAAE;QAAK,gBAAE,CAAC;UAAA,WAAM;YAAA,UAAS,IAAI,CAAC;UAAI,gBAAS,CAAC;YAAA,UAAQ,IAAI,CAAC;UAAI,gBAAQ,CAAC;QAAA,eAAM,CAAC;UAAG,SAAS,EAAE,kBAAkB,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,UAAU,GAAG,EAAE,CAAE;UAAA,UAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,8DAAC,IAAI;YAAA,UAAC;UAAK,gBAAM,CAAC,GAAG;QAAI,gBAAI,CAAC;MAAA,GAAjR,IAAI,CAAC,EAAE,MAAkR,CAAC;IAAC,gBAAM,CAAC;EAAA,eACpX,CAAC;AACR;AAEA,SAAS,cAAc,CAAC;EAAC;AAAO,CAAC,EAAE;EACjC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,CAAC;IAAC,IAAI,EAAE,aAAa;IAAE,IAAI,EAAE,QAAQ;IAAE,QAAQ,EAAE;EAAE,CAAC,CAAC,CAAC;EAC/F,sDAAe,CAAC,MAAM;IACpB,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,OAAO,SAAS;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK;MAAC,GAAG,IAAI;MAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC;IAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IACzI,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EACzC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EACX,OAAO;IAAK,SAAS,EAAC,qBAAqB;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,QAAQ,EAAC,YAAY;MAAC,MAAM,EAAE,MAAM,OAAO,CAAC,eAAe;IAAE,gBAAE,CAAC,EAC/H;MAAA,WAAM;QAAO,SAAS,EAAC,qBAAqB;QAAA,WAAC;UAAO,IAAI,EAAC,MAAM;UAAC,QAAQ;UAAC,QAAQ,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK;YAAC,IAAI,EAAE,IAAI,CAAC,IAAI;YAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;YAAE,QAAQ,EAAE;UAAC,CAAC,CAAC,CAAC;QAAE,gBAAE,CAAC,gEAAC,IAAI;UAAA,UAAC;QAAY,gBAAM,CAAC;UAAA,UAAQ;QAAI,gBAAQ,CAAC;UAAA,UAAO;QAAe,gBAAO,CAAC;MAAA,eAAO,CAAC,EACvU;QAAS,SAAS,EAAC,qBAAqB;QAAA,WAAC;UAAA,UAAI;QAAK,gBAAI,CAAC,EAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI;UAAA,WAAqB;YAAM,SAAS,EAAC,mBAAmB;YAAA,UAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;UAAC,gBAAO,CAAC;YAAA,WAAK;cAAA,UAAS,IAAI,CAAC;YAAI,gBAAS,CAAC;cAAA,WAAQ,IAAI,CAAC,IAAI,EAAC,KAAG,EAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,GAAG,OAAO,IAAI,CAAC,QAAQ,GAAG,GAAG,MAAM;YAAA,eAAQ,CAAC;cAAU,KAAK,EAAE,IAAI,CAAC,QAAS;cAAC,GAAG,EAAC;YAAK,gBAAE,CAAC;UAAA,eAAK,CAAC;YAAQ,IAAI,EAAC,QAAQ;YAAC,cAAW,MAAM;YAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAE;YAAA,UAAC,8DAAC,IAAI;cAAA,UAAC;YAAK,gBAAM;UAAC,gBAAQ,CAAC;QAAA,GAAxa,IAAI,CAAC,IAAI,MAAoa,CAAC,CAAC;MAAA,eAAU,CAAC;IAAA,eAC1gB,CAAC;MAAA,UAAQ;QAAQ,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,MAAO;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,cAAc,CAAE;QAAA,WAAC,IAAE,EAAC,KAAK,CAAC,MAAM,GAAG,KAAK,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE;MAAA,eAAS;IAAC,gBAAQ,CAAC;EAAA,eAClK,CAAC;AACR;AAEA,SAAS,WAAW,CAAC;EAAC,IAAI;EAAE;AAAO,CAAC,EAAE;EACpC,MAAM,KAAK,GAAG,IAAI,KAAK,gBAAgB;EACvC,MAAM,OAAO,GAAG,IAAI,KAAK,oBAAoB,IAAI,IAAI,KAAK,gBAAgB;EAC1E,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,MAAM;IACnD,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE;IACvB,IAAI;MACF,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;IACtF,CAAC,CAAC,OAAO,CAAC,EAAE;MACV,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1B;EACF,CAAC,CAAC;EACF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAChD,MAAM,MAAM,GAAG,EAAE,IAAI,WAAW,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;EACrJ,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;EAC9F,OAAO;IAAK,SAAS,EAAC,sBAAsB;IAAA,WAC1C;MAAQ,SAAS,EAAC,uBAAuB;MAAA,WAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,qBAAqB,CAAE;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAK,gBAAM;MAAC,gBAAQ,CAAC;QAAA,UAAK,OAAO,GAAI,IAAI,KAAK,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAI;MAAQ,gBAAK,CAAC,EAAC,CAAC,OAAO,GAAG;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,MAAM;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,KAAK,GAAG,gBAAgB,GAAG,kBAAkB,CAAE;QAAA,UAAE,KAAK,GAAG,IAAI,GAAG;MAAI,gBAAS,CAAC,GAAG,uFAAO,CAAC;IAAA,eAAS,CAAC,EACrY,CAAC,OAAO,GAAG;MAAA,WAAE;QAAO,SAAS,EAAC,gBAAgB;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAM,gBAAM,CAAC;UAAO,KAAK,EAAE,KAAM;UAAC,QAAQ,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAE;UAAC,WAAW,EAAC;QAAU,gBAAE,CAAC;MAAA,eAAO,CAAC;QAAG,SAAS,EAAC,uBAAuB;QAAA,UAAC;MAAI,gBAAG,CAAC;QAAK,SAAS,EAAC,qBAAqB;QAAA,UAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI;UAAQ,IAAI,EAAC,QAAQ;UAAe,OAAO,EAAE,MAAM;YAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,KAAK,EAAE;cAAC,cAAc,CAAC,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;cAAE,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YAAC;UAAC,CAAE;UAAA,WAAC,8DAAC,MAAM;YAAC,IAAI,EAAE;UAAK,gBAAE,CAAC;YAAA,WAAM;cAAA,UAAS,IAAI,CAAC;YAAI,gBAAS,CAAC;cAAA,UAAQ,IAAI,CAAC;YAAI,gBAAQ,CAAC;UAAA,eAAM,CAAC;YAAG,SAAS,EAAE,kBAAkB,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,UAAU,GAAG,EAAE,CAAE;YAAA,UAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,8DAAC,IAAI;cAAA,UAAC;YAAK,gBAAM,CAAC,GAAG;UAAI,gBAAI,CAAC;QAAA,GAAva,IAAI,CAAC,EAAE,MAAwa,CAAC;MAAC,gBAAM,CAAC,EAAC,KAAK,GAAG;QAAQ,SAAS,EAAC,uBAAuB;QAAA,WAAC;UAAA,WAAM,MAAI,EAAC,QAAQ,CAAC,MAAM,EAAC,QAAM;QAAA,eAAM,CAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAO;UAAC,OAAO,EAAE,MAAM;YAAC,cAAc,CAAC,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAAE,QAAQ,CAAC,oBAAoB,CAAC;UAAC,CAAE;UAAA,UAAC;QAAG,gBAAQ,CAAC;MAAA,eAAQ,CAAC,GAAG,IAAI;IAAA,eAAG,CAAC,GAAG;MAAM,SAAS,EAAC,yBAAyB;MAAA,WAAC;QAAA,WAAS;UAAA,UAAI;QAAG,gBAAI,CAAC;UAAK,SAAS,EAAC,wBAAwB;UAAA,UAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI;YAAA,WAAoB,8DAAC,MAAM;cAAC,IAAI,EAAE;YAAK,gBAAE,CAAC;cAAA,UAAQ,IAAI,CAAC;YAAI,gBAAQ,CAAC;UAAA,GAAzD,IAAI,CAAC,EAAE,MAAwD,CAAC;QAAC,gBAAM,CAAC;MAAA,eAAS,CAAC;QAAS,SAAS,EAAC,yBAAyB;QAAA,WAAC;UAAA,UAAK,IAAI,KAAK,gBAAgB,GAAG,YAAY,GAAG;QAAa,gBAAK,CAAC;UAAA,UAAG;QAAkB,gBAAG,CAAC;UAAA,UAAG;QAAe,gBAAG,CAAC;UAAA,UAAG;QAAM,gBAAG,CAAC;MAAA,eAAS,CAAC;QAAU,KAAK,EAAE,OAAQ;QAAC,QAAQ,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAE;QAAC,WAAW,EAAC;MAAO,gBAAE,CAAC;QAAK,SAAS,EAAC,sBAAsB;QAAA,WAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAE,IAAI,KAAK,oBAAoB,GAAG,QAAQ,GAAG,EAAG;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,oBAAoB,CAAE;UAAA,UAAC;QAAI,gBAAQ,CAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAE,IAAI,KAAK,gBAAgB,GAAG,QAAQ,GAAG,EAAG;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,gBAAgB,CAAE;UAAA,UAAC;QAAI,gBAAQ,CAAC;MAAA,eAAK,CAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,sBAAsB;QAAC,OAAO,EAAE,MAAM;UAAC,OAAO,CAAC,QAAQ,QAAQ,CAAC,MAAM,MAAM,CAAC;UAAE,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,eAAe,CAAC,EAAE,GAAG,CAAC;QAAC,CAAE;QAAA,UAAC;MAAE,gBAAQ,CAAC;IAAA,eAAM,CAAC;EAAA,eAChiE,CAAC;AACR;AAEe,SAAS,mBAAmB,CAAC;EAAC;AAAI,CAAC,EAAE;EAClD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAC5C,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,2BAA2B,CAAC,KAAK,IAAI,KAAK,eAAe,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC;EACpJ,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,qDAAc,CAAC,IAAI,KAAK,iBAAiB,GAAG,EAAE,GAAG,GAAG,CAAC;EACjG,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,IAAI,KAAK,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;EAC3H,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,IAAI,KAAK,kBAAkB,GAAG,WAAW,GAAG,EAAE,CAAC;EACxF,MAAM,QAAQ,GAAG,KAAK,IAAI;IAAC,aAAa,CAAC,KAAK,CAAC;IAAE,cAAc,CAAC,OAAO,CAAC,2BAA2B,EAAE,KAAK,CAAC;EAAC,CAAC;EAE7G,sDAAe,CAAC,MAAM;IACpB,IAAI,IAAI,KAAK,iBAAiB,IAAI,cAAc,IAAI,GAAG,EAAE,OAAO,SAAS;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,iBAAiB,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IAChG,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EACzC,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;EAE1B,IAAI,IAAI,KAAK,iBAAiB,IAAI,IAAI,KAAK,mBAAmB,EAAE,OAAO,8DAAC,YAAY;IAAC,QAAQ,EAAE,IAAI,KAAK;EAAoB,gBAAE,CAAC;EAC/H,IAAI,IAAI,KAAK,aAAa,EAAE,OAAO;IAAA,WAAE,8DAAC,cAAc;MAAC,OAAO,EAAE;IAAS,gBAAE,CAAC,gEAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAAE,CAAC;EAClI,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO;IAAA,WAAE,8DAAC,WAAW;MAAC,IAAI,EAAE,IAAK;MAAC,OAAO,EAAE;IAAS,gBAAE,CAAC,gEAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAAE,CAAC;EAElN,MAAM,cAAc,GAAG,EAAE,IAAI,WAAW,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;EAClI,MAAM,SAAS,GAAG,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,iBAAiB;EACrE,MAAM,WAAW,GAAG,IAAI,KAAK,qBAAqB,IAAI,IAAI,KAAK,kBAAkB;EAEjF,OAAO;IAAK,SAAS,EAAC,yCAAyC;IAAA,WAC7D,8DAAC,MAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,MAAM;IAAE,gBAAE,CAAC,EACzC,WAAW,GAAG;MAAK,SAAS,EAAC,uBAAuB;MAAA,WAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,eAAe,CAAE;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAC;QAAK,gBAAM;MAAC,gBAAQ,CAAC;QAAA,WAAQ,MAAI,EAAC,QAAQ,CAAC,MAAM,EAAC,IAAE;MAAA,eAAQ,CAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,WAAW,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAE;QAAA,UAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,GAAG;MAAI,gBAAS,CAAC;IAAA,eAAK,CAAC,GAAG,IAAI,EACpV,8DAAC,YAAY;MAAC,IAAI,EAAE,IAAK;MAAC,cAAc,EAAE,cAAe;MAAC,QAAQ,EAAE,QAAS;MAAC,cAAc,EAAE;IAAe,gBAAE,CAAC,EAC/G,WAAW,GAAG;MAAK,SAAS,EAAC,uBAAuB;MAAA,WAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAO;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,gBAAgB,CAAE;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAO,gBAAM,CAAC;UAAA,UAAM;QAAE,gBAAM,CAAC;MAAA,eAAQ,CAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAO;QAAC,OAAO,EAAE,MAAM;UAAC,OAAO,CAAC,kBAAkB,CAAC;UAAE,QAAQ,CAAC,OAAO,QAAQ,CAAC,MAAM,MAAM,CAAC;QAAC,CAAE;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAe,gBAAM,CAAC;UAAA,UAAM;QAAE,gBAAM,CAAC;MAAA,eAAQ,CAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAO;QAAC,OAAO,EAAE,MAAM;UAAC,WAAW,CAAC,EAAE,CAAC;UAAE,QAAQ,CAAC,SAAS,CAAC;QAAC,CAAE;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAc,gBAAM,CAAC;UAAA,UAAM;QAAE,gBAAM,CAAC;MAAA,eAAQ,CAAC;IAAA,eAAK,CAAC,GAAG,8DAAC,QAAQ;MAAC,IAAI,EAAE,IAAK;MAAC,KAAK,EAAE,KAAM;MAAC,QAAQ,EAAE,QAAS;MAAC,OAAO,EAAE,OAAQ;MAAC,MAAM,EAAE,MAAM;QAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE;QAAQ,QAAQ,CAAC,OAAO,CAAC;QAAE,QAAQ,CAAC,EAAE,CAAC;MAAC;IAAE,gBAAE,CAAC,EAC1rB,SAAS,GAAG,8DAAC,YAAY;MAAC,MAAM,EAAE;IAAM,gBAAE,CAAC,GAAG,IAAI,EACnD,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAClD,CAAC;AACR,C;;;;;;;;;;;;;;;;;;;;;;;;;ACtO0B;AACgD;AAEtC;AAEkB;AACI;AACC;AACC;AAEV;AACU;AAAA;AAE5D,MAAM,QAAQ,GAAG,0DAAc,CAAC;EAC9B,mBAAmB,EAAE;IACnB,EAAE,EAAE,qBAAqB;IACzB,cAAc,EAAE,6BAA6B;IAC7C,WAAW,EAAE;EACf,CAAC;EACD,iBAAiB,EAAE;IACjB,EAAE,EAAE,mBAAmB;IACvB,cAAc,EAAE,4BAA4B;IAC5C,WAAW,EAAE;EACf,CAAC;EACD,kBAAkB,EAAE;IAClB,EAAE,EAAE,oBAAoB;IACxB,cAAc,EAAE,8CAA8C;IAC9D,WAAW,EAAE;EACf;AACF,CAAC,CAAC;AAEF,MAAM,YAAY,SAAS,wDAAe,CAAC;EACzC,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,MAAM,SAAS,GAAG,0DAAc,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM;IAC1E,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM;IAC7C,MAAM,YAAY,GAAG,UAAU,IAAI,MAAM,GAAI,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,GAAI,IAAI;IAE3E,IAAI,CAAC,KAAK,GAAG;MACX,WAAW,EAAE,UAAU;MACvB,WAAW,EAAE;IACf,CAAC;IAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5E,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;EACxD;EAEA,iBAAiB,GAAG;IAClB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;EACzB;EAEA,cAAc,CAAC,CAAC,EAAE;IAChB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,0DAAc,CAAC,UAAU,CAAC,0DAAc,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9G,IAAI,CAAC,QAAQ,CAAC;MAAC,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC;IAAE,CAAC,CAAC;EAC1D;EAEA,oBAAoB,CAAC,KAAK,EAAE;IAC1B,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,8CAAM,CAAC,QAAQ;IACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,8CAAM,CAAC,QAAQ,EAAE;MAErD,MAAM,KAAK,GAAG,sDAAO,CAAC,KAAK,CAAC;MAC5B,IAAI,KAAK,EAAE;QACT,KAAK,GAAG,GAAG,8CAAM,CAAC,SAAS,GAAG,KAAK,EAAE;MACvC,CAAC,MAAM;QACL,MAAM,GAAG,GAAG,sDAAO,CAAC,KAAK,CAAC;QAC1B,IAAI,GAAG,EAAE;UACP,KAAK,GAAG,GAAG,8CAAM,CAAC,SAAS,GAAG,GAAG,EAAE;QACrC,CAAC,MAAM;UACL,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;YAEnB,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;UAC5B;UAEA,KAAK,GAAG,GAAG,8CAAM,CAAC,SAAS,GAAG,KAAK,IAAI,KAAK,EAAE;QAChD;MACF;IACF;IACA,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC;MAAC,WAAW,EAAE,8CAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG;IAAK,CAAC,CAAC;EACxE;EAEA,0BAA0B,CAAC,SAAS,EAAE;IACpC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,MAAM,EAAE;MACpC,0DAAc,CAAC,UAAU,CAAC,0DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;MAC7F,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC;IACrC;EACF;EAEA,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;IACtE,0DAAc,CAAC,UAAU,CAAC,0DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7F,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,EAChC;MAAC,MAAM,EAAE,sDAAO,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC;MAAE,OAAO,EAAE,IAAI;MAAE,IAAI,EAAE;IAAI,CAAC,EAAE,SAAS,CAAC;EAC9F;EAEA,eAAe,CAAC,SAAS,EAAE;IACzB,0DAAc,CAAC,UAAU,CAAC,0DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7F,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC;EACrC;EAEA,MAAM,GAAG;IACP,MAAM;MAAC;IAAa,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;IACvC,MAAM,uBAAuB,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,GAClE,QAAQ,CAAC,iBAAiB,GAAG,QAAQ,CAAC,mBAAmB,CAAC;IAC5D,MAAM,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IACrE,OACE;MAAK,SAAS,EAAC,aAAa;MAAA,WAC1B;QAAI,SAAS,EAAC,QAAQ;QAAA,WACpB;UAAI,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,KAAK,MAAM,GAAG,QAAQ,GAAG,IAAK;UAAA,UACjE;YAAG,IAAI,EAAC,GAAG;YAAC,WAAQ,MAAM;YAAC,OAAO,EAAE,IAAI,CAAC,cAAe;YAAA,UACtD,8DAAC,wDAAgB;cAAC,EAAE,EAAC,oBAAoB;cAAC,cAAc,EAAC,MAAM;cAC7D,WAAW,EAAC;YAAgB,gBAAE;UAAC,gBAChC;QAAC,gBACF,CAAC,EACL;UAAI,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,KAAK,KAAK,GAAG,QAAQ,GAAG,IAAK;UAAA,UAChE;YAAG,IAAI,EAAC,GAAG;YAAC,WAAQ,KAAK;YAAC,OAAO,EAAE,IAAI,CAAC,cAAe;YAAA,UACrD,8DAAC,wDAAgB;cAAC,EAAE,EAAC,oBAAoB;cAAC,cAAc,EAAC,WAAW;cAClE,WAAW,EAAC;YAAqB,gBAAE;UAAC,gBACrC;QAAC,gBACF,CAAC,EACL;UAAI,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,KAAK,MAAM,GAAG,QAAQ,GAAG,IAAK;UAAA,UACjE;YAAG,IAAI,EAAC,GAAG;YAAC,WAAQ,MAAM;YAAC,OAAO,EAAE,IAAI,CAAC,cAAe;YAAA,UACtD,8DAAC,wDAAgB;cAAC,EAAE,EAAC,sBAAsB;cAAC,cAAc,EAAC,OAAO;cAChE,WAAW,EAAC;YAA4B,gBAAE;UAAC,gBAC5C;QAAC,gBACF,CAAC;MAAA,eACH,CAAC,EACJ,IAAI,CAAC,KAAK,CAAC,WAAW,KAAK,KAAK,GAC/B,8DAAC,oEAAa;QACZ,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;QAC1B,QAAQ,EAAE,IAAI,CAAC,oBAAqB;QACpC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;MAAQ,gBAAE,CAAC,GAEnC,IAAI,CAAC,KAAK,CAAC,WAAW,KAAK,MAAM,GAC/B,8DAAC,oEAAY;QACX,KAAK,EAAE,8CAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAE;QACzE,QAAQ,EAAE,IAAI,CAAC,eAAgB;QAC/B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;MAAQ,gBAAE,CAAC,GAEjC;QAAK,SAAS,EAAC,aAAa;QAAA,WAC1B,8DAAC,oEAAc;UACb,WAAW,EAAE,kBAAmB;UAChC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,EAAG;UAC3C,gBAAgB,EAAE,IAAI,CAAC;QAAqB,gBAAE,CAAC,EACjD,8DAAC,iEAAW;UACV,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;UAC1B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACnC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAC9B,gBAAgB,EAAE,uBAAwB;UAC1C,aAAa,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,WAAY;UACvC,UAAU,EAAE,KAAM;UAClB,UAAU,EAAE,KAAM;UAClB,eAAe,EAAE,KAAM;UACvB,eAAe,EAAE,IAAI,CAAC;QAA2B,gBAAE,CAAC;MAAA,eACnD,CAAC;IAAA,eACL,CAAC;EAEV;AACF;AAAC;AAED,+DAAe,sDAAU,CAAC,YAAY,CAAC,E;;;;;;;;;;;;;;;;;;;;;;;;;;ACrKb;AACI;AAEoB;AACyC;AAC7B;AACd;AAKtB;AAAA;AAE1B,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK;EACjC,IAAI,IAAI,GAAG,0DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;EACrE,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;IACrD,IAAI,GAAG,KAAK,GAAG,0DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,0DAAc,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC;EACxG,CAAC,CAAC;EACF,0DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;AACjC,CAAC;AAEM,MAAM,uBAAuB,GAAG,CACrC,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,oBAAoB,EAC/E,mBAAmB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAC9F,qBAAqB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,wBAAwB,EAC3F,aAAa,EAAE,kBAAkB,EAAE,2BAA2B,EAC9D,gBAAgB,EAAE,eAAe,EAAE,mBAAmB,EACtD,yBAAyB,EAAE,8BAA8B,EAAE,wBAAwB,EACnF,4BAA4B,CAC7B;AAED,SAAS,IAAI,CAAC;EAAC;AAAQ,CAAC,EAAE;EAAE,OAAO;IAAG,SAAS,EAAC,gBAAgB;IAAC,eAAY,MAAM;IAAA,UAAE;EAAQ,gBAAI,CAAC;AAAE;AAEpG,SAAS,MAAM,CAAC;EAAC,KAAK;EAAE,IAAI,GAAG,iBAAiB;EAAE,MAAM;EAAE,WAAW;EAAE,QAAQ;EAAE;AAAc,CAAC,EAAE;EAChG,OAAO;IAAQ,SAAS,EAAC,iBAAiB;IAAA,WACxC;MAAQ,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,MAAM;QAAE,IAAI,CAAC,0DAAc,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC;MAAE,CAAE;MAAC,cAAW,IAAI;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAkB,gBAAM;IAAC,gBAAQ,CAAC,EAChJ;MAAA,UAAK;IAAK,gBAAK,CAAC,EACf,MAAM,GAAG;MAAQ,IAAI,EAAC,QAAQ;MAAC,SAAS,EAAC,MAAM;MAAC,OAAO,EAAE,QAAS;MAAC,QAAQ,EAAE,cAAe;MAAA,UAAE,WAAW,IAAI;IAAM,gBAAS,CAAC,GAAG,uFAAO,CAAC;EAAA,eACnI,CAAC;AACX;AAEA,SAAS,KAAK,CAAC;EAAC,OAAO;EAAE;AAAM,CAAC,EAAE;EAChC,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,OAAO,EAAE,OAAO,SAAS;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;IAC7C,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EACzC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACrB,OAAO,OAAO,GAAG;IAAK,SAAS,EAAC,gBAAgB;IAAC,IAAI,EAAC,QAAQ;IAAA,UAAE;EAAO,gBAAM,CAAC,GAAG,IAAI;AACvF;AAEA,SAAS,MAAM,CAAC;EAAC,OAAO;EAAE,QAAQ;EAAE;AAAQ,CAAC,EAAE;EAC7C,OAAO;IAAQ,IAAI,EAAC,QAAQ;IAAC,IAAI,EAAC,QAAQ;IAAC,gBAAc,OAAQ;IAAC,QAAQ,EAAE,QAAS;IACnF,SAAS,EAAE,iBAAiB,IAAI,OAAO,GAAG,UAAU,GAAG,EAAE,CAAE;IAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,CAAC,OAAO,CAAE;IAAA,UAAC,oFAAI;EAAC,gBAAQ,CAAC;AACjH;AAEA,SAAS,OAAO,CAAC;EAAC,IAAI;EAAE,KAAK;EAAE,KAAK;EAAE,KAAK;EAAE,OAAO;EAAE;AAAM,CAAC,EAAE;EAC7D,OAAO;IAAQ,IAAI,EAAC,QAAQ;IAAC,SAAS,EAAE,mBAAmB,IAAI,MAAM,GAAG,SAAS,GAAG,EAAE,CAAE;IACtF,OAAO,EAAE,OAAO,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAE;IAAA,WACpD,IAAI,GAAG,8DAAC,IAAI;MAAA,UAAE;IAAI,gBAAO,CAAC,GAAG,IAAI,EAClC;MAAA,WAAM;QAAA,UAAS;MAAK,gBAAS,CAAC,EAAC,KAAK,GAAG;QAAA,UAAQ;MAAK,gBAAQ,CAAC,GAAG,IAAI;IAAA,eAAO,CAAC,EAC3E,KAAK,IAAI,OAAO,GAAG,8DAAC,IAAI;MAAA,UAAC;IAAa,gBAAM,CAAC,GAAG,IAAI;EAAA,eAC/C,CAAC;AACX;AAIA,SAAS,UAAU,GAAG;EACpB,IAAI;IAAE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE;EAAE,CAAC,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,EAAE;EAAE;AACjH;AAEA,SAAS,WAAW,CAAC;EAAC,MAAM;EAAE;AAAS,CAAC,EAAE;EACxC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAC1C,sDAAe,CAAC,MAAM;IAAE,IAAI,IAAI,GAAG,IAAI;IAAE,0DAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAAE,OAAO,MAAM;MAAE,IAAI,GAAG,KAAK;IAAE,CAAC;EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;EACtJ,OAAO,GAAG,GAAG;IAAK,SAAS,EAAE,SAAU;IAAC,GAAG,EAAE,GAAI;IAAC,GAAG,EAAC;EAAE,gBAAE,CAAC,GAAG;IAAM,SAAS,EAAE;EAAU,gBAAE,CAAC;AAC9F;AAEA,SAAS,cAAc,GAAG;EAKxB,MAAM,CAAC,OAAO,CAAC,GAAG,sEAAa,CAAC,YAAY,EAAE,wDAAY,EAAE,EAAE,CAAC;EAC/D,OAAO;IAAK,SAAS,EAAC,oCAAoC;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,IAAI;MAAC,IAAI,EAAC;IAAe,gBAAE,CAAC;MAAA,WACnG;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,mBAAmB;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,kBAAkB,CAAE;QAAA,WAC7F,OAAO,IAAI,OAAO,CAAC,cAAc,GAAG,8DAAC,WAAW;UAAC,MAAM,EAAE,OAAO,CAAC;QAAe,gBAAE,CAAC,GAAG;UAAM,SAAS,EAAC,0BAA0B;UAAA,UAAC,8DAAC,IAAI;YAAA,UAAC;UAAM,gBAAM;QAAC,gBAAM,CAAC,EAC5J;UAAA,WAAM;YAAA,UAAU,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC,IAAK;UAAG,gBAAS,CAAC,EACvF;YAAA,WAAO,OAAK,EAAC,UAAU,CAAC,CAAC,IAAI,GAAG;UAAA,eAAQ,CAAC,EACzC;YAAA,WAAO,MAAI,EAAE,OAAO,IAAI,OAAO,CAAC,cAAc,IAAK,GAAG;UAAA,eAAQ,CAAC;QAAA,eAAM,CAAC,EACxE,8DAAC,IAAI;UAAA,UAAC;QAAa,gBAAM,CAAC;MAAA,eACpB,CAAC,EACT;QAAA,UAAS,8DAAC,OAAO;UAAC,IAAI,EAAC,SAAS;UAAC,KAAK,EAAC,OAAO;UAAC,KAAK,EAAC;QAAiB,gBAAE;MAAC,gBAAS,CAAC,EACnF;QAAA,WACE,8DAAC,OAAO;UAAC,IAAI,EAAC,iBAAiB;UAAC,KAAK,EAAC,MAAM;UAAC,KAAK,EAAC;QAAW,gBAAE,CAAC,EACjE,8DAAC,OAAO;UAAC,IAAI,EAAC,gBAAgB;UAAC,KAAK,EAAC,MAAM;UAAC,KAAK,EAAC;QAAa,gBAAE,CAAC,EAClE,8DAAC,OAAO;UAAC,IAAI,EAAC,UAAU;UAAC,KAAK,EAAC,MAAM;UAAC,KAAK,EAAC;QAAe,gBAAE,CAAC,EAC9D,8DAAC,OAAO;UAAC,IAAI,EAAC,UAAU;UAAC,KAAK,EAAC,IAAI;UAAC,KAAK,EAAC;QAAkB,gBAAE,CAAC;MAAA,eACxD,CAAC;IAAA,eACN,CAAC;EAAA,eAAK,CAAC;AACf;AAMA,SAAS,eAAe,CAAC;EAAC,OAAO;EAAE;AAAM,CAAC,EAAE;EAG1C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAM,uEAAc,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;EACxF,MAAM,YAAY,GAAG,mDAAY,CAAC,IAAI,CAAC;EACvC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAEvD,MAAM,IAAI,GAAG,MAAM,4DAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;IAAE,wEAAe,CAAC,YAAY,EAAE,CAAC,CAAC;IAAE,UAAU,CAAC,CAAC,CAAC;EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EACjH,sDAAe,CAAC,MAAM;IAAE,IAAI,CAAC,CAAC;EAAE,CAAC,EAAE,EAAE,CAAC;EAEtC,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;EAC7E,MAAM,gBAAgB,GAAG,KAAK,IAAI;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;IACvB,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;IACtB,YAAY,CAAC,IAAI,CAAC;IAClB,+DAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;MAAC;IAAM,CAAC,KAAK,+DAAe,CAAC;MAAC,cAAc,EAAE,MAAM;MAAE,OAAO,EAAE,OAAO,CAAC;IAAO,CAAC,CAAC,CAAC,CAClH,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CACvC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;EACtF,CAAC;EAED,MAAM,WAAW,GAAG;IAAC,IAAI,EAAE,GAAG;IAAE,MAAM,EAAE,GAAG;IAAE,KAAK,EAAE;EAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK;EAE7F,OAAO;IAAK,SAAS,EAAC,eAAe;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC;IAAM,gBAAE,CAAC;MAAM,SAAS,EAAC,uBAAuB;MAAA,WAClG;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,UAAW;QAAC,QAAQ,EAAE,SAAU;QAAA,WAC7D;UAAA,UAAQ;QAAE,gBAAQ,CAAC,EAClB,OAAO,IAAI,OAAO,CAAC,cAAc,GAAG,8DAAC,WAAW;UAAC,MAAM,EAAE,OAAO,CAAC;QAAe,gBAAE,CAAC,GAAG,8DAAC,IAAI;UAAA,UAAC;QAAM,gBAAM,CAAC,EAC1G,8DAAC,IAAI;UAAA,UAAC;QAAa,gBAAM,CAAC;MAAA,eACpB,CAAC,EACT;QAAO,GAAG,EAAE,YAAa;QAAC,IAAI,EAAC,MAAM;QAAC,MAAM,EAAC,SAAS;QAAC,KAAK,EAAE;UAAC,OAAO,EAAE;QAAM,CAAE;QAAC,QAAQ,EAAE;MAAiB,gBAAE,CAAC,EAC/G,8DAAC,OAAO;QAAC,KAAK,EAAC,IAAI;QAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAE;QAAC,KAAK,EAAC;MAAkB,gBAAE,CAAC,EAC9F,8DAAC,OAAO;QAAC,KAAK,EAAC,IAAI;QAAC,KAAK,EAAE,WAAY;QAAC,KAAK,EAAC;MAAgB,gBAAE,CAAC,EACjE,8DAAC,OAAO;QAAC,KAAK,EAAC,MAAM;QAAC,KAAK,EAAG,OAAO,IAAI,OAAO,CAAC,UAAU,IAAK,KAAM;QAAC,KAAK,EAAC;MAAoB,gBAAE,CAAC,EACpG,8DAAC,OAAO;QAAC,KAAK,EAAC,OAAO;QAAC,KAAK,EAAC;MAAiB,gBAAE,CAAC,EACjD,8DAAC,OAAO;QAAC,KAAK,EAAC,IAAI;QAAC,KAAK,EAAG,OAAO,IAAI,OAAO,CAAC,MAAM,IAAK,KAAM;QAAC,KAAK,EAAC;MAAgB,gBAAE,CAAC,EAC1F,8DAAC,OAAO;QAAC,KAAK,EAAC,MAAM;QAAC,KAAK,EAAG,OAAO,IAAI,OAAO,CAAC,SAAS,IAAK,aAAc;QAAC,KAAK,EAAC;MAAmB,gBAAE,CAAC;IAAA,eACtG,CAAC;EAAA,eAAK,CAAC;AACf;AAMA,MAAM,YAAY,GAAG;EAAC,QAAQ,EAAE,EAAE;EAAE,SAAS,EAAE;AAAG,CAAC;AAEnD,SAAS,UAAU,CAAC;EAAC,KAAK;EAAE,SAAS;EAAE,KAAK;EAAE;AAAO,CAAC,EAAE;EACtD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACjD,sDAAe,CAAC,MAAM;IAAE,4DAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,UAAU,CAAC,CAAC,CAAC;MAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EAE3H,MAAM,IAAI,GAAG,MAAM;IACjB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,UAAU,IAAI,CAAC,UAAU,EAAE;MAAE,OAAO,CAAC,QAAQ,CAAC;MAAE;IAAQ;IACtE,SAAS,CAAC,IAAI,CAAC;IACf,+DAAe,CAAC;MAAC,CAAC,KAAK,GAAG,UAAU;MAAE,OAAO,EAAE,OAAO,CAAC;IAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MACzE,OAAO,CAAC,OAAO,CAAC;MAChB,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,kBAAkB,CAAC,EAAE,GAAG,CAAC;IAC5D,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;EACjF,CAAC;EAED,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC;EACrC,OAAO;IAAK,SAAS,EAAC,mCAAmC;IAAA,WACvD,8DAAC,MAAM;MAAC,KAAK,EAAE,KAAM;MAAC,IAAI,EAAC,kBAAkB;MAAC,MAAM,EAAC,IAAI;MAAC,QAAQ,EAAE,IAAK;MAAC,cAAc,EAAE,CAAC,OAAO,IAAI;IAAO,gBAAE,CAAC,EAChH;MAAA,WACE;QAAA,WACG,SAAS,GACR;UAAU,KAAK,EAAE,KAAM;UAAC,SAAS,EAAE,SAAU;UAAC,SAAS;UAAC,WAAW,EAAC,OAAO;UAAC,QAAQ,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;QAAE,gBAAE,CAAC,GAC/H;UAAO,KAAK,EAAE,KAAM;UAAC,SAAS,EAAE,SAAU;UAAC,SAAS;UAAC,QAAQ,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;QAAE,gBAAE,CAAC,EAC1G;UAAA,WAAQ,KAAK,CAAC,MAAM,EAAC,GAAC,EAAC,SAAS;QAAA,eAAQ,CAAC,EACxC,KAAK,GAAG;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,EAAE,CAAE;UAAC,cAAW,IAAI;UAAA,UAAC,8DAAC,IAAI;YAAA,UAAC;UAAM,gBAAM;QAAC,gBAAQ,CAAC,GAAG,IAAI;MAAA,eAC1G,CAAC,EACR;QAAA,UAAI,KAAK,KAAK,UAAU,GAAG,mBAAmB,GAAG;MAAe,gBAAI,CAAC;IAAA,eACjE,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,eAAe,CAAC;EAAC;AAAO,CAAC,EAAE;EAClC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,sDAAe,CAAC,MAAM;IAAE,4DAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,UAAU,CAAC,CAAC,CAAC;MAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EAAE,CAAC,EAAE,EAAE,CAAC;EAC1H,MAAM,IAAI,GAAG,MAAM;IACjB,+DAAe,CAAC;MAAC,UAAU,EAAE,KAAK;MAAE,OAAO,EAAE,OAAO,CAAC;IAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MACvE,OAAO,CAAC,SAAS,CAAC;MAClB,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,kBAAkB,CAAC,EAAE,GAAG,CAAC;IAC5D,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACjD,CAAC;EACD,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;EACnD,OAAO;IAAK,SAAS,EAAC,mCAAmC;IAAA,WACvD,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC,kBAAkB;MAAC,MAAM,EAAC,IAAI;MAAC,QAAQ,EAAE,IAAK;MAAC,cAAc,EAAE,CAAC;IAAQ,gBAAE,CAAC,EACrG;MAAM,SAAS,EAAC,mBAAmB;MAAA,WACjC,8DAAC,IAAI;QAAA,UAAC;MAAI,gBAAM,CAAC,EACjB;QAAA,WAAO;UAAA,UAAM;QAAM,gBAAM,CAAC;UAAO,IAAI,EAAC,MAAM;UAAC,KAAK,EAAE,KAAM;UAAC,GAAG,EAAE,KAAM;UAAC,GAAG,EAAC,YAAY;UAAC,QAAQ,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;QAAE,gBAAE,CAAC;MAAA,eAAO,CAAC,EACnJ;QAAA,UAAG;MAAgB,gBAAG,CAAC;IAAA,eACnB,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,MAAM,cAAc,GAAG,CAAC;EAAC,KAAK,EAAE,MAAM;EAAE,KAAK,EAAE;AAAG,CAAC,EAAE;EAAC,KAAK,EAAE,QAAQ;EAAE,KAAK,EAAE;AAAG,CAAC,EAAE;EAAC,KAAK,EAAE,OAAO;EAAE,KAAK,EAAE;AAAI,CAAC,CAAC;AAElH,SAAS,YAAY,CAAC;EAAC;AAAO,CAAC,EAAE;EAC/B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,sDAAe,CAAC,MAAM;IAAE,4DAAY,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EAAE,CAAC,EAAE,EAAE,CAAC;EAC/E,MAAM,MAAM,GAAG,KAAK,IAAI;IACtB,+DAAe,CAAC;MAAC,MAAM,EAAE,KAAK;MAAE,OAAO,EAAE,OAAO,CAAC;IAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MACnE,OAAO,CAAC,OAAO,CAAC;MAChB,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,kBAAkB,CAAC,EAAE,GAAG,CAAC;IAC5D,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACjD,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,eAAe;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,IAAI;MAAC,IAAI,EAAC;IAAkB,gBAAE,CAAC;MAAM,SAAS,EAAC,oBAAoB;MAAA,UACpH,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI;QAAQ,IAAI,EAAC,QAAQ;QAAiB,OAAO,EAAE,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAE;QAAC,QAAQ,EAAE,CAAC,OAAQ;QAAA,WACpH;UAAA,UAAS,GAAG,CAAC;QAAK,gBAAS,CAAC,EAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,GAAG,8DAAC,IAAI;UAAA,UAAC;QAAK,gBAAM,CAAC,GAAG,IAAI;MAAA,GAD5C,GAAG,CAAC,KAAK,MAEvD,CAAC;IAAC,gBACN,CAAC;EAAA,eAAK,CAAC;AACf;AAEA,SAAS,YAAY,CAAC;EAAC;AAAO,CAAC,EAAE;EAC/B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,sDAAe,CAAC,MAAM;IAAE,4DAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,UAAU,CAAC,CAAC,CAAC;MAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EAAE,CAAC,EAAE,EAAE,CAAC;EACtH,MAAM,IAAI,GAAG,MAAM;IACjB,+DAAe,CAAC;MAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;MAAE,OAAO,EAAE,OAAO,CAAC;IAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAC1E,OAAO,CAAC,OAAO,CAAC;MAChB,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,kBAAkB,CAAC,EAAE,GAAG,CAAC;IAC5D,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACjD,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,mCAAmC;IAAA,WACvD,8DAAC,MAAM;MAAC,KAAK,EAAC,IAAI;MAAC,IAAI,EAAC,kBAAkB;MAAC,MAAM,EAAC,IAAI;MAAC,QAAQ,EAAE,IAAK;MAAC,cAAc,EAAE,CAAC;IAAQ,gBAAE,CAAC,EACnG;MAAA,UAAM;QAAA,UAAO;UAAO,KAAK,EAAE,KAAM;UAAC,SAAS,EAAE,EAAG;UAAC,SAAS;UAAC,WAAW,EAAC,OAAO;UAAC,QAAQ,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;QAAE,gBAAE;MAAC,gBAAO;IAAC,gBAAM,CAAC;EAAA,eAC9I,CAAC;AACR;AAEA,SAAS,UAAU,CAAC;EAAC;AAAO,CAAC,EAAE;EAK7B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAM,uEAAc,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;EACxF,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EACxC,MAAM,KAAK,GAAG,mDAAY,CAAC,IAAI,CAAC;EAEhC,MAAM,IAAI,GAAG,MAAM;IACjB,8DAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;EAC9E,CAAC;EACD,sDAAe,CAAC,MAAM;IACpB,4DAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,YAAY,EAAE,CAAC,CAAC;MAAE,UAAU,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9F,IAAI,CAAC,CAAC;EACR,CAAC,EAAE,EAAE,CAAC;EAEN,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;IAC3B,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,EAAE;IAC5B,IAAI,iDAAM,CAAC,KAAK,CAAC,OAAO,EAAE;MAAC,IAAI,EAAE,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,QAAQ;MAAE,KAAK,EAAE,GAAG;MAAE,MAAM,EAAE,GAAG;MAAE,YAAY,EAAE,8DAAmB,CAAC;IAAC,CAAC,CAAC;EAC/H,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;EAER,OAAO;IAAK,SAAS,EAAC,gCAAgC;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC;IAAO,gBAAE,CAAC;MAAA,WAC7E;QAAA,WACE;UAAK,SAAS,EAAC,qBAAqB;UAAA,WACjC,OAAO,IAAI,OAAO,CAAC,cAAc,GAAG,8DAAC,WAAW;YAAC,MAAM,EAAE,OAAO,CAAC;UAAe,gBAAE,CAAC,GAAG,8DAAC,IAAI;YAAA,UAAC;UAAM,gBAAM,CAAC,EAC1G;YAAA,WAAM;cAAA,UAAU,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAM,OAAO,IAAI,OAAO,CAAC;YAAe,gBAAS,CAAC;cAAA,UAAQ,UAAU,CAAC;YAAC,gBAAQ,CAAC;UAAA,eAAM,CAAC;QAAA,eAC9H,CAAC,EACN;UAAK,SAAS,EAAC,iBAAiB;UAAC,GAAG,EAAE;QAAM,gBAAE,CAAC,EAC/C;UAAA,UAAG;QAAe,gBAAG,CAAC,EACrB,EAAE,IAAI,EAAE,CAAC,UAAU,GAAG;UAAA,WAAO,QAAM,EAAC,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,CAAC,EAAC,KAAG;QAAA,eAAO,CAAC,GAAG,IAAI;MAAA,eACzF,CAAC,EACV;QAAK,SAAS,EAAC,qBAAqB;QAAA,WAClC;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM;YAAE,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,QAAQ,CAAC;UAAE,CAAE;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAO,gBAAM,CAAC;YAAA,UAAM;UAAE,gBAAM,CAAC;QAAA,eAAQ,CAAC,EACjH;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM;YACnC,IAAI,SAAS,CAAC,KAAK,IAAI,EAAE,EAAE;cACzB,SAAS,CAAC,KAAK,CAAC;gBAAC,KAAK,EAAE,MAAM;gBAAE,IAAI,EAAE,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC;cAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YACtF,CAAC,MAAM;cACL,OAAO,CAAC,WAAW,CAAC;YACtB;UACF,CAAE;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAK,gBAAM,CAAC;YAAA,UAAM;UAAE,gBAAM,CAAC;QAAA,eAAQ,CAAC;MAAA,eAC1C,CAAC;IAAA,eACF,CAAC;EAAA,eAAK,CAAC;AACf;AAIA,SAAS,YAAY,CAAC;EAAC,OAAO;EAAE;AAAQ,CAAC,EAAE;EAOzC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,qDAAc,CAAC,MAAM,uEAAc,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;EACpG,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,MAAM,uEAAc,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC;EAC3F,sDAAe,CAAC,MAAM;IACpB,4DAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,YAAY,EAAE,CAAC,CAAC;MAAE,gBAAgB,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACpG,iEAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,aAAa,EAAE,CAAC,CAAC;MAAE,WAAW,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EACvG,CAAC,EAAE,EAAE,CAAC;EACN,MAAM,YAAY,GAAG,aAAa,GAAG,aAAa,CAAC,OAAO,GAAG,IAAI;EACjE,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,IAAI;EACxD,MAAM,aAAa,GAAG;IAAC,QAAQ,EAAE,KAAK;IAAE,OAAO,EAAE,KAAK;IAAE,QAAQ,EAAE;EAAK,CAAC,CAAC,cAAc,CAAC,IAAI,KAAK;EACjG,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;MACjC,QAAQ,GAAG,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAChD;EACF,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,eAAe;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC;IAAI,gBAAE,CAAC;MAAM,SAAS,EAAC,uBAAuB;MAAA,WAChG;QAAA,WACE,8DAAC,OAAO;UAAC,IAAI,EAAC,cAAc;UAAC,KAAK,EAAC,MAAM;UAAC,KAAK,EAAC;QAAqB,gBAAE,CAAC,EACxE,8DAAC,OAAO;UAAC,IAAI,EAAC,gBAAgB;UAAC,KAAK,EAAC,UAAU;UAAC,KAAK,EAAC;QAAuB,gBAAE,CAAC,EAChF,8DAAC,OAAO;UAAC,IAAI,EAAC,UAAU;UAAC,KAAK,EAAC,MAAM;UAAC,KAAK,EAAC;QAAiB,gBAAE,CAAC;MAAA,eACzD,CAAC,EACV;QAAA,WACE,8DAAC,OAAO;UAAC,IAAI,EAAC,cAAc;UAAC,KAAK,EAAC,MAAM;UAAC,KAAK,EAAC;QAAkB,gBAAE,CAAC,EACrE,8DAAC,OAAO;UAAC,IAAI,EAAC,OAAO;UAAC,KAAK,EAAC,KAAK;UAAC,KAAK,EAAC;QAAY,gBAAE,CAAC,EACvD,8DAAC,OAAO;UAAC,IAAI,EAAC,YAAY;UAAC,KAAK,EAAC,OAAO;UAAC,KAAK,EAAE,YAAY,IAAI,IAAI,GAAG,GAAG,GAAI,YAAY,GAAG,KAAK,GAAG,KAAO;UAC1G,KAAK,EAAE,YAAY,GAAG,eAAe,GAAG;QAAiB,gBAAE,CAAC,EAC9D,8DAAC,OAAO;UAAC,IAAI,EAAC,eAAe;UAAC,KAAK,EAAC,MAAM;UAAC,KAAK,EAAE,aAAc;UAAC,KAAK,EAAC;QAAU,gBAAE,CAAC,EAKpF,8DAAC,OAAO;UAAC,IAAI,EAAC,QAAQ;UAAC,KAAK,EAAC,MAAM;UAAC,KAAK,EAAC;QAAoB,gBAAE,CAAC;MAAA,eAC1D,CAAC,EACV;QAAA,UAAS,8DAAC,OAAO;UAAC,IAAI,EAAC,aAAa;UAAC,KAAK,EAAC,MAAM;UAAC,KAAK,EAAC,wBAAwB;UAAC,MAAM;QAAA,gBAAE;MAAC,gBAAS,CAAC,EACpG;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,iBAAiB;QAAC,OAAO,EAAE,MAAO;QAAA,UAAC;MAAM,gBAAQ,CAAC;IAAA,eAC9E,CAAC;EAAA,eAAK,CAAC;AACf;AAEA,SAAS,YAAY,CAAC;EAAC,IAAI;EAAE,KAAK;EAAE,IAAI;EAAE,YAAY,GAAG,IAAI;EAAE,aAAa,GAAG,IAAI;EAAE,IAAI;EAAE,SAAS;EAAE,QAAQ;EAAE;AAAQ,CAAC,EAAE;EACzH,OAAO;IAAK,SAAS,EAAC,yBAAyB;IAAA,UAAC;MAAS,SAAS,EAAC,wBAAwB;MAAC,IAAI,EAAC,QAAQ;MAAC,cAAW,MAAM;MAAA,WACzH,8DAAC,IAAI;QAAA,UAAE;MAAI,gBAAO,CAAC;QAAA,UAAK;MAAK,gBAAK,CAAC;QAAA,UAAI;MAAI,gBAAI,CAAC,EAC/C,QAAQ,EACT;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAE,aAAa,GAAG,QAAQ,GAAG,SAAU;QAAC,QAAQ,EAAE,IAAK;QAAC,OAAO,EAAE,SAAU;QAAA,UAAE,IAAI,GAAG,MAAM,GAAG;MAAY,gBAAS,CAAC,EAClJ;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,QAAS;QAAC,QAAQ,EAAE,IAAK;QAAA,UAAC;MAAE,gBAAQ,CAAC;IAAA,eAC7D;EAAC,gBAAK,CAAC;AAClB;AAMA,SAAS,UAAU,CAAC;EAAC;AAAO,CAAC,EAAE;EAC7B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC7C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC;EAC3C,MAAM,OAAO,GAAG,YAAY;IAC1B,OAAO,CAAC,IAAI,CAAC;IACb,IAAI;MAMF,MAAM,kBAAkB,GAAG,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,QAAQ;MAC9G,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW;MAC/C,MAAM,MAAM,GAAG,kBAAkB,GAAG,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO;QAAC,KAAK,EAAE;MAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC;MACjH,IAAI,SAAS,EAAE;QACb,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;MACpD;MACA,MAAM,KAAK,GAAG,kBAAkB,GAAG,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO;QAAC,KAAK,EAAE;MAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC;MAChH,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;MACrC,OAAO,CAAC,IAAI,CAAC;IACf,CAAC,CAAC,OAAO,GAAG,EAAE;MACZ,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,UAAU,CAAC;IACpC,CAAC,SAAS;MACR,OAAO,CAAC,KAAK,CAAC;IAChB;EACF,CAAC;EACD,OAAO,8DAAC,YAAY;IAAC,IAAI,EAAE,IAAI,GAAG,cAAc,GAAG,cAAe;IAAC,KAAK,EAAE,IAAI,GAAG,OAAO,GAAG,MAAO;IAChG,IAAI,EAAE,IAAI,GAAG,QAAQ,CAAC,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,GAAG,oDAAqD;IAC1H,YAAY,EAAE,IAAI,GAAG,IAAI,GAAG,IAAK;IAAC,aAAa,EAAE,CAAC,IAAK;IAAC,IAAI,EAAE,IAAK;IACnE,SAAS,EAAE,IAAI,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,GAAG,OAAQ;IAAC,QAAQ,EAAE,MAAM,QAAQ,CAAC,kBAAkB;EAAE,gBAAE,CAAC;AACpH;AAEA,SAAS,mBAAmB,CAAC;EAAC,MAAM;EAAE,QAAQ;EAAE;AAAO,CAAC,EAAE;EACxD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC7C,MAAM,OAAO,GAAG,MAAM;IACpB,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;MAAE,OAAO,CAAC,UAAU,CAAC;MAAE,QAAQ,CAAC,kBAAkB,CAAC;MAAE;IAAQ;IAC3G,OAAO,CAAC,IAAI,CAAC;IACb,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI;MAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;MACrC,OAAO,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;MACb,OAAO,CAAC,SAAS,CAAC;MAClB,QAAQ,CAAC,kBAAkB,CAAC;IAC9B,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;EAClC,CAAC;EACD,OAAO,8DAAC,YAAY;IAAC,IAAI,EAAC,gBAAgB;IAAC,KAAK,EAAC,UAAU;IACzD,IAAI,EAAC,uCAAuC;IAAC,IAAI,EAAE,IAAK;IACxD,SAAS,EAAE,OAAQ;IAAC,QAAQ,EAAE,MAAM,QAAQ,CAAC,kBAAkB;EAAE,gBAAE,CAAC;AACxE;AAQA,SAAS,cAAc,CAAC;EAAC,gBAAgB;EAAE;AAAO,CAAC,EAAE;EACnD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC9C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC9C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACtD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC7C,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;MAAE,OAAO,CAAC,gBAAgB,CAAC;MAAE;IAAQ;IACvE,IAAI,MAAM,KAAK,UAAU,EAAE;MAAE,OAAO,CAAC,aAAa,CAAC;MAAE;IAAQ;IAC7D,IAAI,CAAC,gBAAgB,EAAE;MAAE,OAAO,CAAC,aAAa,CAAC;MAAE;IAAQ;IACzD,IAAI,IAAI,EAAE;IACV,OAAO,CAAC,IAAI,CAAC;IAGb,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;MACnD,OAAO,CAAC,OAAO,CAAC;MAChB,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,kBAAkB,CAAC,EAAE,GAAG,CAAC;IAC5D,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MACd,OAAO,CAAE,GAAG,IAAI,GAAG,CAAC,OAAO,IAAK,UAAU,CAAC;MAC3C,OAAO,CAAC,KAAK,CAAC;IAChB,CAAC,CAAC;EACJ,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,mCAAmC;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC,kBAAkB;MAAC,MAAM,EAAC,IAAI;MAChH,WAAW,EAAE,IAAI,GAAG,MAAM,GAAG,IAAK;MAAC,cAAc,EAAE,IAAK;MAAC,QAAQ,EAAE;IAAO,gBAAE,CAAC;MAAA,WAC7E;QAAA,WAAO;UAAA,UAAM;QAAG,gBAAM,CAAC;UAAO,IAAI,EAAC,UAAU;UAAC,KAAK,EAAE,MAAO;UAAC,QAAQ,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;UAAC,WAAW,EAAC;QAAS,gBAAE,CAAC;MAAA,eAAO,CAAC,EACvI;QAAA,WAAO;UAAA,UAAM;QAAG,gBAAM,CAAC;UAAO,IAAI,EAAC,UAAU;UAAC,KAAK,EAAE,MAAO;UAAC,QAAQ,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;UAAC,WAAW,EAAC;QAAM,gBAAE,CAAC;MAAA,eAAO,CAAC,EACpI;QAAA,WAAO;UAAA,UAAM;QAAK,gBAAM,CAAC;UAAO,IAAI,EAAC,UAAU;UAAC,KAAK,EAAE,UAAW;UAAC,QAAQ,EAAE,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;UAAC,WAAW,EAAC;QAAS,gBAAE,CAAC;MAAA,eAAO,CAAC;IAAA,eAC7I,CAAC;EAAA,eAAK,CAAC;AACf;AAOA,SAAS,oBAAoB,CAAC;EAAC,eAAe;EAAE;AAAO,CAAC,EAAE;EACxD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC;EACzC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAClD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC7C,MAAM,OAAO,GAAG,MAAM;IACpB,IAAI,CAAC,QAAQ,EAAE;MAAE,OAAO,CAAC,UAAU,CAAC;MAAE;IAAQ;IAC9C,IAAI,CAAC,eAAe,EAAE;MAAE,OAAO,CAAC,aAAa,CAAC;MAAE;IAAQ;IACxD,OAAO,CAAC,IAAI,CAAC;IACb,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;MAAE,OAAO,CAAC,KAAK,CAAC;IAAE,CAAC,CAAC;EACtG,CAAC;EACD,IAAI,IAAI,KAAK,CAAC,EAAE;IAKd,OAAO,8DAAC,YAAY;MAAC,IAAI,EAAC,SAAS;MAAC,KAAK,EAAC,MAAM;MAC9C,IAAI,EAAC,+EAA+E;MACpF,YAAY,EAAC,IAAI;MAAC,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAE;MAAC,QAAQ,EAAE,MAAM,QAAQ,CAAC,kBAAkB;IAAE,gBAAE,CAAC;EACnG;EACA,OAAO,8DAAC,YAAY;IAAC,IAAI,EAAC,aAAa;IAAC,KAAK,EAAC,UAAU;IAAC,IAAI,EAAC,+BAA+B;IAC3F,IAAI,EAAE,IAAK;IAAC,SAAS,EAAE,OAAQ;IAAC,QAAQ,EAAE,MAAM,QAAQ,CAAC,kBAAkB,CAAE;IAAA,UAC7E;MAAO,IAAI,EAAC,UAAU;MAAC,SAAS;MAAC,KAAK,EAAE,QAAS;MAAC,QAAQ,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;MAAC,WAAW,EAAC;IAAM,gBAAE;EAAC,gBACvG,CAAC;AACjB;AAMA,SAAS,UAAU,CAAC;EAAC;AAAO,CAAC,EAAE;EAC7B,MAAM,cAAc,GAAG,wDAAe;EAEtC,OAAO;IAAK,SAAS,EAAC,gCAAgC;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC;IAAkB,gBAAE,CAAC;MAAA,WACpG;QAAS,SAAS,EAAC,WAAW;QAAA,WAAC;UAAA,UAAM,8DAAC,IAAI;YAAA,UAAC;UAAK,gBAAM;QAAC,gBAAM,CAAC;UAAA,UAAK,qDAAa;QAAA,gBAAK,CAAC;UAAA,WAAG,KAAG,EAAC,cAAc;QAAA,eAAI,CAAC;MAAA,eAAS,CAAC,EAC1H;QAAS,SAAS,EAAC,uBAAuB;QAAA,WACxC,8DAAC,OAAO;UAAC,KAAK,EAAC,MAAM;UAAC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM;QAAE,gBAAE,CAAC,EACxD,8DAAC,OAAO;UAAC,KAAK,EAAC,MAAM;UAAC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM;QAAE,gBAAE,CAAC,EAKxD,8DAAC,OAAO;UAAC,KAAK,EAAC,MAAM;UAAC,OAAO,EAAE,MAAM;YAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,uDAAe;UAAE;QAAE,gBAAE,CAAC;MAAA,eAC7E,CAAC;IAAA,eACN,CAAC;EAAA,eACF,CAAC;AACR;AAOA,SAAS,eAAe,CAAC;EAAC;AAAO,CAAC,EAAE;EAIlC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAM,uEAAc,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;EACxF,sDAAe,CAAC,MAAM;IAAE,4DAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,YAAY,EAAE,CAAC,CAAC;MAAE,UAAU,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EAAE,CAAC,EAAE,EAAE,CAAC;EAC9H,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,KAAK,KAAK;IAC7B,MAAM,IAAI,GAAG,OAAO;IACpB,UAAU,CAAC;MAAC,GAAG,OAAO;MAAE,CAAC,GAAG,GAAG;IAAK,CAAC,CAAC;IACtC,+DAAe,CAAC;MAAC,CAAC,GAAG,GAAG,KAAK;MAAE,OAAO,EAAE,OAAO,CAAC;IAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,YAAY,EAAE,CAAC,CAAC;MAAE,UAAU,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CACtH,KAAK,CAAC,GAAG,IAAI;MAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;MAAE,UAAU,CAAC,IAAI,CAAC;MAAE,wEAAe,CAAC,YAAY,EAAE,IAAI,CAAC;IAAE,CAAC,CAAC;EAC7G,CAAC;EACD,MAAM,aAAa,GAAG,MAAM;IAC1B,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE;IACvB,MAAM,MAAM,GAAG;MAAC,OAAO,EAAE,IAAI;MAAE,KAAK,EAAE,KAAK;MAAE,EAAE,EAAE,KAAK;MAAE,KAAK,EAAE;IAAI,CAAC;IACpE,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzG,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,MAAM;IAClC,OAAO,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM;EAC1C,CAAC;EAID,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;EACxF,OAAO;IAAK,SAAS,EAAC,eAAe;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC;IAAkB,gBAAE,CAAC;MAAM,SAAS,EAAC,cAAc;MAAA,WACjH;QAAA,UAAS,8DAAC,OAAO;UAAC,KAAK,EAAC,QAAQ;UAAC,KAAK,EAAE,aAAa,CAAC,CAAE;UAAC,KAAK,EAAC;QAA2B,gBAAE;MAAC,gBAAS,CAAC,EACtG,OAAO,GAAG;QAAA,WACT;UAAA,WAAK;YAAA,WAAM;cAAA,UAAQ;YAAQ,gBAAQ,CAAC;cAAA,UAAQ,MAAM,CAAC,eAAe,CAAC,GAAG,gBAAgB,GAAG;YAAkB,gBAAQ,CAAC;UAAA,eAAM,CAAC,EACzH,8DAAC,MAAM;YAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,aAAc;YAAC,QAAQ,EAAE,MAAM,CAAC,eAAe,CAAE;YAAC,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;UAAE,gBAAE,CAAC;QAAA,eAAK,CAAC,EAClI;UAAA,WAAK;YAAA,WAAM;cAAA,UAAQ;YAAQ,gBAAQ,CAAC;cAAA,UAAQ,MAAM,CAAC,sBAAsB,CAAC,GAAG,gBAAgB,GAAG;YAAS,gBAAQ,CAAC;UAAA,eAAM,CAAC,EAKvH,8DAAC,MAAM;YAAC,OAAO,EAAE,OAAO,CAAC,oBAAoB,KAAK,QAAS;YAAC,QAAQ,EAAE,MAAM,CAAC,sBAAsB,CAAE;YAAC,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,sBAAsB,EAAE,CAAC,GAAG,SAAS,GAAG,QAAQ;UAAE,gBAAE,CAAC;QAAA,eAAK,CAAC,EACzL;UAAA,WAAK;YAAA,WAAM;cAAA,UAAQ;YAAU,gBAAQ,CAAC;cAAA,UAAQ,MAAM,CAAC,oBAAoB,CAAC,GAAG,gBAAgB,GAAG;YAAW,gBAAQ,CAAC;UAAA,eAAM,CAAC,EACzH,8DAAC,MAAM;YAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,KAAK,QAAS;YAAC,QAAQ,EAAE,MAAM,CAAC,oBAAoB,CAAE;YAAC,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC,GAAG,SAAS,GAAG,QAAQ;UAAE,gBAAE,CAAC;QAAA,eAAK,CAAC;MAAA,eAC5K,CAAC,GAAG,IAAI;IAAA,eACb,CAAC;EAAA,eAAK,CAAC;AACf;AAEA,SAAS,uBAAuB,CAAC;EAAC;AAAO,CAAC,EAAE;EAG1C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAM,uEAAc,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;EACxF,sDAAe,CAAC,MAAM;IAAE,4DAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,YAAY,EAAE,CAAC,CAAC;MAAE,UAAU,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EAAE,CAAC,EAAE,EAAE,CAAC;EAC9H,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,KAAK,KAAK;IAC7B,MAAM,IAAI,GAAG,OAAO;IACpB,MAAM,WAAW,GAAG;MAAC,IAAI,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC;MAAE,CAAC,GAAG,GAAG;IAAK,CAAC;IACrE,UAAU,CAAC;MAAC,GAAG,OAAO;MAAE,cAAc,EAAE;IAAW,CAAC,CAAC;IACrD,+DAAe,CAAC;MAAC,cAAc,EAAE,WAAW;MAAE,OAAO,EAAE,OAAO,CAAC;IAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,YAAY,EAAE,CAAC,CAAC;MAAE,UAAU,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CACrI,KAAK,CAAC,GAAG,IAAI;MAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;MAAE,UAAU,CAAC,IAAI,CAAC;MAAE,wEAAe,CAAC,YAAY,EAAE,IAAI,CAAC;IAAE,CAAC,CAAC;EAC7G,CAAC;EACD,MAAM,IAAI,GAAG,CAAC;IAAC,GAAG,EAAE,SAAS;IAAE,KAAK,EAAE;EAAI,CAAC,EAAE;IAAC,GAAG,EAAE,OAAO;IAAE,KAAK,EAAE;EAAK,CAAC,EAAE;IAAC,GAAG,EAAE,IAAI;IAAE,KAAK,EAAE;EAAK,CAAC,EAAE;IAAC,GAAG,EAAE,OAAO;IAAE,KAAK,EAAE;EAAI,CAAC,CAAC;EAElI,MAAM,aAAa,GAAG,CAAC,EAAE,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,KAAK,KAAK,CAAC;EAClG,OAAO;IAAK,SAAS,EAAC,eAAe;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,QAAQ;MAAC,IAAI,EAAC;IAAkB,gBAAE,CAAC;MAAM,SAAS,EAAC,cAAc;MAAA,WACnH;QAAG,SAAS,EAAC,cAAc;QAAA,UAAE,aAAa,GAAG,mBAAmB,GAAG;MAA4B,gBAAI,CAAC,EACnG,OAAO,GAAG;QAAA,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;UAAA,WACnC;YAAA,UAAM;cAAA,WAAQ,KAAG,EAAC,GAAG,CAAC,KAAK,EAAC,KAAG;YAAA,eAAQ;UAAC,gBAAM,CAAC,EAC/C,8DAAC,MAAM;YAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAE;YAAC,QAAQ,EAAE,aAAc;YAAC,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;UAAE,gBAAE,CAAC;QAAA,GAF7E,GAAG,CAAC,GAAG,MAGjD,CAAC;MAAC,gBAAU,CAAC,GAAG,IAAI;IAAA,eACrB,CAAC;EAAA,eAAK,CAAC;AACf;AAOA,MAAM,WAAW,GAAG,CAClB,eAAe,qDAAa,wBAAwB,EACpD,oBAAoB,EACpB,kCAAkC,CACnC;AACD,MAAM,eAAe,GAAG,qBAAqB;AAE7C,SAAS,oBAAoB,CAAC,MAAM,EAAE;EACpC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC;EAC/C,sDAAe,CAAC,MAAM;IACpB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;IACnD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI;MAAE,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC;IAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAe;IAC5G,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,MAAM,GAAG;MAAC,IAAI,EAAE,KAAK;MAAE,OAAO,EAAE;IAAC,CAAC;IAC7D,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,OAAO,SAAS;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM;MACrC,UAAU,CAAC,CAAC,IAAI;QACd,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC;QAClB,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC;UAAC,IAAI,EAAE,KAAK;UAAE,OAAO,EAAE;QAAI,CAAC,CAAC,CAAC;QAC1F,OAAO,IAAI;MACb,CAAC,CAAC;IACJ,CAAC,EAAE,IAAI,CAAC;IACR,OAAO,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;EAC1C,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;EACZ,OAAO,OAAO;AAChB;AAEA,SAAS,SAAS,CAAC,YAAY,EAAE;EAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;EACzC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAE,YAAY,GAAG,IAAI,GAAI,EAAE,CAAC;EAChD,MAAM,CAAC,GAAG,YAAY,GAAG,EAAE;EAC3B,MAAM,GAAG,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;EAC3C,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE;AACxC;AAEA,SAAS,SAAS,CAAC;EAAC;AAAO,CAAC,EAAE;EAI5B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,MAAM,uEAAc,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;EAC1F,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC;EAChE,sDAAe,CAAC,MAAM;IACpB,WAAW,CAAC,uEAAc,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;IACjD,4DAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,YAAY,EAAE,CAAC,CAAC;MAAE,WAAW,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EAC9H,CAAC,EAAE,EAAE,CAAC;EAEN,MAAM,WAAW,GAAG,MAAM;IACxB,IAAI,CAAC,QAAQ,EAAE;IACf,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;MAC1B,OAAO,CAAC,UAAU,CAAC;MACnB,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,gBAAgB,EAAE;QAAC,EAAE,EAAE;MAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;MACxE;IACF;IACA,QAAQ,CAAC,mBAAmB,EAAE;MAAC,EAAE,EAAE;IAAQ,CAAC,CAAC;EAC/C,CAAC;EAED,IAAI,CAAC,QAAQ,EAAE,OAAO;IAAK,SAAS,EAAC,+BAA+B;IAAA,UAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,OAAO;MAAC,IAAI,EAAC;IAAkB,gBAAE;EAAC,gBAAK,CAAC;EAE3H,OAAO;IAAK,SAAS,EAAC,+BAA+B;IAAA,WACnD,8DAAC,MAAM;MAAC,KAAK,EAAC,OAAO;MAAC,IAAI,EAAC;IAAkB,gBAAE,CAAC,EAChD;MAAA,WACE,8DAAC,IAAI;QAAA,UAAE,QAAQ,CAAC,OAAO,GAAG,eAAe,GAAG;MAAY,gBAAO,CAAC,EAChE;QAAA,UAAK,QAAQ,CAAC,OAAO,GAAG,UAAU,GAAG;MAAU,gBAAK,CAAC,EACrD;QAAA,UAAK,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI;UAAA,UAAgB;QAAI,GAAX,IAAI,OAAY,CAAC;MAAC,gBAAK,CAAC,EAC7D,QAAQ,CAAC,OAAO,GAAG;QAAG,SAAS,EAAC,aAAa;QAAA,WAAC,QAAM,EAAC,SAAS,CAAC,KAAK,CAAC;MAAA,eAAI,CAAC,GAAG,IAAI;IAAA,eAC9E,CAAC,EACP;MAAA,WACE;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,GAAG,EAAG;QACjE,OAAO,EAAE,MAAM,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,mBAAmB,EAAE;UAAC,EAAE,EAAE;QAAS,CAAC,CAAC,GAAG,WAAW,CAAC,CAAE;QAAA,UAChG,QAAQ,CAAC,OAAO,GAAG,SAAS,GAAG;MAAS,gBACnC,CAAC,EACT;QAAA,UAAO;MAAc,gBAAO,CAAC;IAAA,eACvB,CAAC;EAAA,eACN,CAAC;AACR;AASA,SAAS,eAAe,CAAC;EAAC,UAAU;EAAE;AAAO,CAAC,EAAE;EAC9C,MAAM,IAAI,GAAI,UAAU,IAAI,UAAU,CAAC,EAAE,IAAK,SAAS;EACvD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EACpD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC7C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC;EACvD,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;EAChD,MAAM,oBAAoB,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC;EAGjG,sDAAe,CAAC,MAAM;IACpB,IAAI,oBAAoB,IAAI,CAAC,EAAE;IAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IAC5D,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;EACtC,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC;EAE1B,sDAAe,CAAC,MAAM;IAAE,4DAAY,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EAAE,CAAC,EAAE,EAAE,CAAC;EAEhF,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;MAAE,QAAQ,CAAC,WAAW,CAAC;MAAE;IAAQ;IAC5D,IAAI,oBAAoB,GAAG,CAAC,EAAE;MAAE;IAAQ;IACxC,OAAO,CAAC,IAAI,CAAC;IACb,QAAQ,CAAC,EAAE,CAAC;IAKZ,MAAM,MAAM,GAAG,IAAI,KAAK,QAAQ,GAAG,mBAAmB,GAAG,kBAAkB;IAC3E,yEAAyB,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;MAAC;IAAY,CAAC,KAAK;MACjF,MAAM,IAAI,GAAG,IAAI,KAAK,QAAQ,GAC5B,+DAAe,CAAC,QAAQ,CAAC,cAAc,EAAE,YAAY,CAAC,GACtD,gEAAgB,CAAC,YAAY,CAAC;MAChC,OAAO,IAAI;IACb,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAIX,IAAI,QAAQ,EAAE,wEAAe,CAAC,YAAY,EAAE;QAAC,GAAG,QAAQ;QAAE,OAAO,EAAE,IAAI,KAAK;MAAQ,CAAC,CAAC;MACtF,OAAO,CAAC,IAAI,KAAK,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;MACpD,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,IAAI,KAAK,QAAQ,GAAG,eAAe,GAAG,gBAAgB,CAAC,EAAE,GAAG,CAAC;IAChG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MAKd,IAAI,GAAG,CAAC,MAAM,KAAK,mBAAmB,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE;QACxF,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;MACpB;MACA,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;IACjC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;EAClC,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,+BAA+B;IAAA,WACnD,8DAAC,MAAM;MAAC,KAAK,EAAE,IAAI,KAAK,QAAQ,GAAG,SAAS,GAAG,SAAU;MAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,GAAG,gBAAgB,GAAG;IAAgB,gBAAE,CAAC,EAC1H;MAAM,SAAS,EAAC,qBAAqB;MAAA,WACnC;QAAK,SAAS,EAAC,gBAAgB;QAAC,eAAY,MAAM;QAAA,UAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI;UAAA,UAAe,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG;QAAE,GAA1B,CAAC,OAAgC,CAAC;MAAC,gBAAM,CAAC,EAC/H;QAAO,SAAS,EAAC,gBAAgB;QAAC,IAAI,EAAC,MAAM;QAAC,SAAS,EAAC,SAAS;QAAC,YAAY,EAAC,KAAK;QAAC,SAAS;QAC5F,KAAK,EAAE,QAAS;QAAC,QAAQ,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE;QAAC,cAAW;MAAM,gBAAE,CAAC,EACjH,KAAK,GAAG;QAAK,SAAS,EAAC,kBAAkB;QAAA,UAAE;MAAK,gBAAM,CAAC,GAAG,IAAI,EAC/D;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,cAAc;QAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,IAAI,oBAAoB,GAAG,CAAE;QAAC,OAAO,EAAE,MAAO;QAAA,UACjI,IAAI,GAAG,MAAM,GAAG,oBAAoB,GAAG,CAAC,GAAG,KAAK,oBAAoB,OAAO,GAAG;MAAI,gBAC7E,CAAC,EAOT;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,kBAAkB;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,gBAAgB,EAAE;UAAC,EAAE,EAAE;QAAI,CAAC,CAAE;QAAA,UAAC;MAAO,gBAAQ,CAAC;IAAA,eACtH,CAAC;EAAA,eACJ,CAAC;AACR;AAKA,MAAM,WAAW,GAAG;EAClB,YAAY,EAAE;IAAC,IAAI,EAAE,sBAAsB;IAAE,KAAK,EAAE,QAAQ;IAAE,IAAI,EAAE,6BAA6B;IAAE,MAAM,EAAE,MAAM;IAAE,KAAK,EAAE;EAA8B,CAAC;EACzJ,QAAQ,EAAE;IAAC,IAAI,EAAE,UAAU;IAAE,KAAK,EAAE,UAAU;IAAE,IAAI,EAAE,qBAAqB;IAAE,MAAM,EAAE,IAAI;IAAE,eAAe,EAAE,MAAM;IAAE,KAAK,EAAE;EAAkB,CAAC;EAC9I,MAAM,EAAE;IAAC,IAAI,EAAE,cAAc;IAAE,KAAK,EAAE,UAAU;IAAE,IAAI,EAAE,2BAA2B;IAAE,MAAM,EAAE,MAAM;IAAE,KAAK,EAAE;EAAe,CAAC;EAC5H,UAAU,EAAE;IAAC,IAAI,EAAE,KAAK;IAAE,KAAK,EAAE,WAAW;IAAE,IAAI,EAAE,iCAAiC;IAAE,MAAM,EAAE,MAAM;IAAE,KAAK,EAAE;EAAe;AAC/H,CAAC;AAED,SAAS,eAAe,CAAC;EAAC,IAAI;EAAE;AAAO,CAAC,EAAE;EACxC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC;EAChC,MAAM,OAAO,GAAG,MAAM;IACpB,IAAI,IAAI,KAAK,cAAc,IAAI,cAAc,IAAI,MAAM,EAAE;MACvD,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;MACnE;IACF;IACA,OAAO,CAAC,IAAI,KAAK,UAAU,GAAG,aAAa,GAAG,UAAU,CAAC;IACzD,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;EACtD,CAAC;EACD,OAAO;IAAK,SAAS,EAAC,qCAAqC;IAAA,WACzD;MAAK,SAAS,EAAC,oBAAoB;MAAA,UAAC;QAAA,WAAQ;UAAA,UAAI;QAAE,gBAAI,CAAC,gEAAC,IAAI;UAAA,UAAC;QAAI,gBAAM,CAAC;MAAA,eAAQ;IAAC,gBAAK,CAAC,EACvF;MAAK,SAAS,EAAC,oBAAoB;MAAA,UAAC;QAAS,IAAI,EAAC,QAAQ;QAAC,cAAW,MAAM;QAAA,WAC1E;UAAA,UAAM,8DAAC,IAAI;YAAA,UAAE,MAAM,CAAC;UAAI,gBAAO;QAAC,gBAAM,CAAC,EACvC;UAAA,UAAK,MAAM,CAAC;QAAK,gBAAK,CAAC,EACvB;UAAA,UAAI,MAAM,CAAC;QAAI,gBAAI,CAAC,EACpB;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,OAAQ;UAAA,UAAE,MAAM,CAAC;QAAM,gBAAS,CAAC,EAC/D,MAAM,CAAC,eAAe,GAAG;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,eAAe,CAAE;UAAA,UAAE,MAAM,CAAC;QAAe,gBAAS,CAAC,GAAG,IAAI;MAAA,eAC3H;IAAC,gBAAK,CAAC;EAAA,eACb,CAAC;AACR;AAEe,SAAS,oBAAoB,CAAC;EAAC,IAAI;EAAE,UAAU;EAAE,QAAQ;EAAE,MAAM;EAAE,QAAQ;EAAE,gBAAgB;EAAE,eAAe;EAAE;AAAQ,CAAC,EAAE;EACxI,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,IAAI,OAAO;EACX,IAAI,IAAI,KAAK,iBAAiB,EAAE,OAAO,GAAG,8DAAC,cAAc,mBAAE,CAAC,CAAC,KACxD,IAAI,IAAI,KAAK,kBAAkB,EAAE,OAAO,GAAG,8DAAC,eAAe;IAAC,OAAO,EAAE,QAAS;IAAC,MAAM,EAAE;EAAO,gBAAE,CAAC,CAAC,KAClG,IAAI,IAAI,KAAK,kBAAkB,EAAE,OAAO,GAAG,8DAAC,UAAU;IAAC,KAAK,EAAC,UAAU;IAAC,KAAK,EAAC,MAAM;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC3G,IAAI,IAAI,KAAK,mBAAmB,EAAE,OAAO,GAAG,8DAAC,UAAU;IAAC,KAAK,EAAC,WAAW;IAAC,KAAK,EAAC,MAAM;IAAC,SAAS;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACvH,IAAI,IAAI,KAAK,oBAAoB,EAAE,OAAO,GAAG,8DAAC,eAAe;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACpF,IAAI,IAAI,KAAK,gBAAgB,EAAE,OAAO,GAAG,8DAAC,YAAY;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC7E,IAAI,IAAI,KAAK,gBAAgB,EAAE,OAAO,GAAG,8DAAC,YAAY;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC7E,IAAI,IAAI,KAAK,iBAAiB,EAAE,OAAO,GAAG,8DAAC,UAAU;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC5E,IAAI,IAAI,KAAK,kBAAkB,EAAE,OAAO,GAAG,8DAAC,YAAY;IAAC,OAAO,EAAE,QAAS;IAAC,QAAQ,EAAE;EAAS,gBAAE,CAAC,CAAC,KACnG,IAAI,IAAI,KAAK,qBAAqB,EAAE,OAAO,GAAG,8DAAC,UAAU;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAChF,IAAI,IAAI,KAAK,uBAAuB,EAAE,OAAO,GAAG,8DAAC,mBAAmB;IAAC,OAAO,EAAE,QAAS;IAAC,MAAM,EAAE,MAAO;IAAC,QAAQ,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC/H,IAAI,IAAI,KAAK,iBAAiB,EAAE,OAAO,GAAG,8DAAC,cAAc;IAAC,OAAO,EAAE,QAAS;IAAC,gBAAgB,EAAE;EAAiB,gBAAE,CAAC,CAAC,KACpH,IAAI,IAAI,KAAK,wBAAwB,EAAE,OAAO,GAAG,8DAAC,oBAAoB;IAAC,OAAO,EAAE,QAAS;IAAC,eAAe,EAAE;EAAgB,gBAAE,CAAC,CAAC,KAC/H,IAAI,IAAI,KAAK,aAAa,EAAE,OAAO,GAAG,8DAAC,UAAU;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACxE,IAAI,IAAI,KAAK,kBAAkB,EAAE,OAAO,GAAG,8DAAC,eAAe;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAClF,IAAI,IAAI,KAAK,2BAA2B,EAAE,OAAO,GAAG,8DAAC,uBAAuB;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACnG,IAAI,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,eAAe,EAAE,OAAO,GAAG,8DAAC,SAAS;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACtG,IAAI,IAAI,KAAK,mBAAmB,EAAE,OAAO,GAAG,8DAAC,eAAe;IAAC,UAAU,EAAE,UAAW;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC3G,OAAO,GAAG,8DAAC,eAAe;IAAC,IAAI,EAAE,IAAI,KAAK,yBAAyB,GAAG,cAAc,GAAG,IAAI,KAAK,8BAA8B,GAAG,UAAU,GAAG,IAAI,KAAK,wBAAwB,GAAG,QAAQ,GAAG,YAAa;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC;EACrO,OAAO;IAAA,WAAG,OAAO,EAAC,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAAE,CAAC;AAC5E,C;;;;;;;;;;;;;;;;;;;;;;;AChwB0B;AAEwB;AACwE;AAChD;AAAA;AAE1E,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK;EACjC,IAAI,IAAI,GAAG,0DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;EACrE,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;IACrD,IAAI,GAAG,KAAK,GAAG,0DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,0DAAc,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC;EACxG,CAAC,CAAC;EACF,0DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;AACjC,CAAC;AAEM,MAAM,sBAAsB,GAAG,CACpC,oBAAoB,EAAE,yBAAyB,EAAE,sBAAsB,EACvE,sBAAsB,EAAE,eAAe,CACxC;AAED,SAAS,IAAI,CAAC;EAAC;AAAQ,CAAC,EAAE;EAAE,OAAO;IAAG,SAAS,EAAC,gBAAgB;IAAC,eAAY,MAAM;IAAA,UAAE;EAAQ,gBAAI,CAAC;AAAE;AAEpG,SAAS,MAAM,CAAC;EAAC,KAAK;EAAE;AAAI,CAAC,EAAE;EAC7B,OAAO;IAAQ,SAAS,EAAC,gBAAgB;IAAA,WAAC;MAAQ,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,MAAM;QAAE,IAAI,CAAC,0DAAc,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC;MAAE,CAAE;MAAC,cAAW,IAAI;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAkB,gBAAM;IAAC,gBAAQ,CAAC;MAAA,UAAK;IAAK,gBAAK,CAAC,yFAAO,CAAC;EAAA,eAAQ,CAAC;AAC7N;AAEA,SAAS,KAAK,CAAC;EAAC,OAAO;EAAE;AAAM,CAAC,EAAE;EAChC,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,OAAO,EAAE,OAAO,SAAS;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;IAC7C,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EACzC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACrB,OAAO,OAAO,GAAG;IAAK,SAAS,EAAC,eAAe;IAAC,IAAI,EAAC,QAAQ;IAAA,UAAE;EAAO,gBAAM,CAAC,GAAG,IAAI;AACtF;AAYA,SAAS,cAAc,CAAC;EAAC;AAAS,CAAC,EAAE;EAMnC,OAAO;IAAK,SAAS,EAAC,gCAAgC;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAE,SAAS,GAAG,oBAAoB,GAAG;IAAkB,gBAAE,CAAC;MAAM,SAAS,EAAC,4BAA4B;MAAA,WACpL;QAAM,SAAS,EAAC,aAAa;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAE,SAAS,GAAG,eAAe,GAAG;QAAe,gBAAO;MAAC,gBAAM,CAAC,EAChG,SAAS,GAAG;QAAA,WACX;UAAG,SAAS,EAAC,eAAe;UAAA,UAAC;QAAqB,gBAAG,CAAC,EACtD;UAAA,UAAG;QAAiC,gBAAG,CAAC,EACxC;UAAA,WAAO,8DAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;YAAA,UAAM;UAAiB,gBAAM,CAAC;QAAA,eAAO,CAAC;MAAA,eACvE,CAAC,GAAG;QAAA,WACJ;UAAA,UAAG;QAAkB,gBAAG,CAAC,EACzB;UAAA,WACE;YAAA,WAAI,8DAAC,IAAI;cAAA,UAAC;YAAY,gBAAM,CAAC,aAAS;UAAA,eAAI,CAAC,EAC3C;YAAA,WAAI,8DAAC,IAAI;cAAA,UAAC;YAAa,gBAAM,CAAC,iBAAa;UAAA,eAAI,CAAC,EAChD;YAAA,WAAI,8DAAC,IAAI;cAAA,UAAC;YAAU,gBAAM,CAAC,oBAAgB;UAAA,eAAI,CAAC,EAChD;YAAA,WAAI,8DAAC,IAAI;cAAA,UAAC;YAAI,gBAAM,CAAC,sBAAkB;UAAA,eAAI,CAAC;QAAA,eAC1C,CAAC,EACL;UAAG,SAAS,EAAC,eAAe;UAAA,UAAC;QAAmB,gBAAG,CAAC;MAAA,eACpD,CAAC,EACH;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,SAAS;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,SAAS,GAAG,oBAAoB,GAAG,iBAAiB,CAAE;QAAA,UAAE,SAAS,GAAG,MAAM,GAAG;MAAS,gBAAS,CAAC;IAAA,eAC9J,CAAC;EAAA,eAAK,CAAC;AACf;AAKO,SAAS,iBAAiB,CAAC;EAAC,KAAK;EAAE,OAAO;EAAE,SAAS;EAAE;AAAQ,CAAC,EAAE;EACvE,OAAO;IAAK,SAAS,EAAC,cAAc;IAAA,UAAC;MAAS,SAAS,EAAC,uBAAuB;MAAC,IAAI,EAAC,aAAa;MAAC,cAAW,MAAM;MAAA,WAClH;QAAM,SAAS,EAAC,aAAa;QAAA,UAAC,8DAAC,IAAI;UAAA,UAAE,OAAO,GAAG,OAAO,GAAG;QAAe,gBAAO;MAAC,gBAAM,CAAC,EACvF;QAAA,UAAI;MAAI,gBAAI,CAAC,EACZ,OAAO,GAAG;QAAG,SAAS,EAAC,eAAe;QAAA,UAAC;MAAqB,gBAAG,CAAC,GAAG;QAAA,WAClE;UAAG,SAAS,EAAC,eAAe;UAAA,UAAC;QAAqB,gBAAG,CAAC,EACtD;UAAA,UAAG;QAAkD,gBAAG,CAAC;MAAA,eACzD,CAAC,EACF,OAAO,GACJ;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,QAAS;QAAA,UAAC;MAAI,gBAAQ,CAAC,GACtD;QAAA,WAAE;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,QAAQ;UAAC,OAAO,EAAE,SAAU;UAAA,UAAC;QAAS,gBAAQ,CAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,QAAS;UAAA,UAAC;QAAI,gBAAQ,CAAC;MAAA,eAAE,CAAC;IAAA,eACvI;EAAC,gBAAK,CAAC;AAClB;AAMA,SAAS,aAAa,CAAC;EAAC,UAAU;EAAE;AAAO,CAAC,EAAE;EAC5C,MAAM,UAAU,GAAI,UAAU,IAAI,UAAU,CAAC,WAAW,IAAK,MAAM;EACnE,MAAM,UAAU,GAAI,UAAU,IAAI,UAAU,CAAC,WAAW,IAAK,EAAE;EAC/D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,sDAAe,CAAC,MAAM;IACpB,+DAAe,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAI,IAAI,KAAK,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAK,EAAE,CAAC,CAAC,CAC5H,KAAK,CAAC,GAAG,IAAI;MAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;MAAE,UAAU,CAAC,EAAE,CAAC;IAAE,CAAC,CAAC;EACtE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;EAChB,MAAM,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE;IAAC,GAAG,UAAU;IAAE,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI;IAAE,YAAY,EAAE,MAAM,CAAC,KAAK;IAAE,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,GAAG,GAAG,GAAG;EAAE,CAAC,CAAC;EACpN,CAG6F;EAC7F,OAAO;IAAK,SAAS,EAAC,cAAc;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,IAAI;MAAC,IAAI,EAAC;IAAe,gBAAE,CAAC;MAAM,SAAS,EAAC,gBAAgB;MAAA,WAC5G,UAAU,GAAG;QAAS,SAAS,EAAC,eAAe;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAc,gBAAM,CAAC;UAAA,WAAM;YAAA,WAAQ,IAAE,EAAC,UAAU;UAAA,eAAS,CAAC;YAAA,UAAO;UAAY,gBAAO,CAAC;QAAA,eAAM,CAAC;MAAA,eAAS,CAAC,GAAG,IAAI,EACpK;QAAA,UAAI;MAAO,gBAAI,CAAC,EACf,OAAO,KAAK,IAAI,GAAG;QAAG,SAAS,EAAC,gBAAgB;QAAA,UAAC;MAAI,gBAAG,CAAC,GAAG;QAAS,SAAS,EAAC,oBAAoB;QAAA,UACjG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI;UAAQ,IAAI,EAAC,QAAQ;UAAyC,OAAO,EAAE,MAAM,MAAM,CAAC,MAAM,CAAE;UAAA,WACjH;YAAA,UAAM;cAAA,UAAS,MAAM,CAAC;YAAK,gBAAS;UAAC,gBAAM,CAAC,gEAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,GADtB,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,MAE3E,CAAC;MAAC,gBACH,CAAC;IAAA,eACN,CAAC;EAAA,eAAK,CAAC;AACf;AAEA,SAAS,aAAa,CAAC;EAAC,UAAU;EAAE,MAAM;EAAE;AAAO,CAAC,EAAE;EACpD,MAAM,WAAW,GAAI,UAAU,IAAI,UAAU,CAAC,YAAY,IAAK,EAAE;EACjE,MAAM,UAAU,GAAI,UAAU,IAAI,UAAU,CAAC,WAAW,IAAK,EAAE;EAC/D,MAAM,mBAAmB,GAAG,CAAC,UAAU,IAAI,UAAU,CAAC,oBAAoB,MAAM,GAAG;EACnF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACxD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAClD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACzD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EACtD,MAAM,YAAY,GAAG,mDAAY,CAAC,IAAI,CAAC;EAEvC,MAAM,WAAW,GAAG,KAAK,IAAI;IAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;IACvB,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;IACtB,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE;MAAE,OAAO,CAAC,cAAc,CAAC;MAAE;IAAQ;IAC7D,YAAY,CAAC,IAAI,CAAC;IAClB,+DAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;MAAC;IAAM,CAAC,KAAK,WAAW,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;MAAC,EAAE,EAAE,MAAM;MAAE,IAAI,EAAE,IAAI,CAAC;IAAI,CAAC,CAAC,CAAC,CAAC,CAChH,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;EACpF,CAAC;EAED,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,mBAAmB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE;MAAE,OAAO,CAAC,SAAS,CAAC;MAAE;IAAQ;IAC9E,MAAM,MAAM,GAAG;MAAC,IAAI,EAAE,UAAU,CAAC,WAAW,IAAI;IAAM,CAAC;IACvD,IAAI,UAAU,CAAC,WAAW,KAAK,SAAS,EAAE;MAAE,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK;MAAE,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;IAAE,CAAC,MAC9G,IAAI,UAAU,CAAC,WAAW,KAAK,OAAO,EAAE;MAAE,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,SAAS;IAAE,CAAC,MACpG;MAAE,MAAM,CAAC,OAAO,GAAG,UAAU,CAAC,SAAS;IAAE;IAC9C,aAAa,CAAC,IAAI,CAAC;IACnB,iEAAiB,CAAC;MAAC,MAAM;MAAE,WAAW,EAAE,UAAU;MAAE,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;MAAE,iBAAiB,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE;IAAC,CAAC,CAAC,CAC9H,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CACpC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAC5C,OAAO,CAAC,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;EACxC,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,cAAc;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,IAAI;MAAC,IAAI,EAAC;IAAsB,gBAAE,CAAC,EACnF,SAAS,GAAG;MAAM,SAAS,EAAC,iBAAiB;MAAA,WAAC,8DAAC,IAAI;QAAA,UAAC;MAAQ,gBAAM,CAAC;QAAA,UAAI;MAAK,gBAAI,CAAC;QAAA,UAAG;MAA6B,gBAAG,CAAC;QAAA,UAAI;UAAA,WAAK;YAAA,UAAI;UAAI,gBAAI,CAAC;YAAA,UAAK,SAAS,CAAC;UAAS,gBAAK,CAAC;QAAA,eAAK;MAAC,gBAAI,CAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,eAAe,CAAE;QAAA,UAAC;MAAE,gBAAQ,CAAC;IAAA,eAAM,CAAC,GACrQ;MAAM,SAAS,EAAC,gBAAgB;MAAA,WAC9B;QAAS,SAAS,EAAC,wBAAwB;QAAA,WAAC;UAAA,WAAM;YAAA,UAAO;UAAI,gBAAO,CAAC;YAAA,UAAS;UAAW,gBAAS,CAAC;QAAA,eAAM,CAAC;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,sBAAsB,EAAE,UAAU,CAAE;UAAA,UAAC;QAAE,gBAAQ,CAAC;MAAA,eAAS,CAAC,EAClN;QAAO,SAAS,EAAC,kBAAkB;QAAA,WAAC;UAAA,WAAM,MAAI,EAAC,mBAAmB,GAAG;YAAA,UAAG;UAAC,gBAAG,CAAC,GAAG,IAAI;QAAA,eAAO,CAAC;UAAU,KAAK,EAAE,WAAY;UAAC,SAAS,EAAC,KAAK;UAAC,QAAQ,EAAE,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAE;UAAC,WAAW,EAAC;QAAmB,gBAAE,CAAC;UAAA,WAAQ,WAAW,CAAC,MAAM,EAAC,MAAI;QAAA,eAAO,CAAC;MAAA,eAAO,CAAC,EAClR;QAAS,SAAS,EAAC,kBAAkB;QAAA,WACnC;UAAA,WAAQ;YAAA,WAAM;cAAA,UAAQ;YAAI,gBAAQ,CAAC;cAAA,UAAO;YAAY,gBAAO,CAAC;UAAA,eAAM,CAAC;YAAA,WAAK,QAAQ,CAAC,MAAM,EAAC,IAAE;UAAA,eAAI,CAAC;QAAA,eAAQ,CAAC,EAC1G;UAAA,WACG,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI;YAAA,WAAuB,8DAAC,IAAI;cAAA,UAAC;YAAK,gBAAM,CAAC;cAAA,UAAO,IAAI,CAAC;YAAI,gBAAO,CAAC;cAAQ,IAAI,EAAC,QAAQ;cAAC,OAAO,EAAE,MAAM,WAAW,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAE;cAAC,cAAW,MAAM;cAAA,UAAC,8DAAC,IAAI;gBAAA,UAAC;cAAK,gBAAM;YAAC,gBAAQ,CAAC;UAAA,GAAtM,IAAI,CAAC,EAAE,MAAwM,CAAC,CAAC,EACrP;YAAQ,IAAI,EAAC,QAAQ;YAAC,SAAS,EAAC,iBAAiB;YAAC,QAAQ,EAAE,SAAU;YAAC,OAAO,EAAE,MAAM,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAE;YAAA,WAAC,8DAAC,IAAI;cAAA,UAAC;YAAmB,gBAAM,CAAC;cAAA,UAAO,SAAS,GAAG,MAAM,GAAG;YAAM,gBAAO,CAAC;UAAA,eAAQ,CAAC,EAC/N;YAAO,GAAG,EAAE,YAAa;YAAC,IAAI,EAAC,MAAM;YAAC,MAAM,EAAC,SAAS;YAAC,KAAK,EAAE;cAAC,OAAO,EAAE;YAAM,CAAE;YAAC,QAAQ,EAAE;UAAY,gBAAE,CAAC;QAAA,eACvG,CAAC;MAAA,eACC,CAAC,EACV;QAAO,SAAS,EAAC,qBAAqB;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAI,gBAAM,CAAC;UAAA,UAAM;QAAuB,gBAAM,CAAC;MAAA,eAAO,CAAC;IAAA,eAChG,CAAC,EACR,CAAC,SAAS,GAAG;MAAQ,SAAS,EAAC,oBAAoB;MAAA,UAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAE,UAAW;QAAC,OAAO,EAAE,MAAO;QAAA,UAAE,UAAU,GAAG,MAAM,GAAG;MAAM,gBAAS;IAAC,gBAAQ,CAAC,GAAG,IAAI;EAAA,eACtK,CAAC;AACR;AAUA,SAAS,YAAY,CAAC;EAAC,MAAM;EAAE;AAAO,CAAC,EAAE;EAMvC,MAAM,oBAAoB,GAAG,uEAAc,CAAC,iBAAiB,CAAC;EAO9D,MAAM,CAAC,MAAM,CAAC,GAAG,sEAAa,CAAC,iBAAiB,EAAE,6DAAiB,EAAE,EAAE,CAAC;EACxE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,MAAO,oBAAoB,IAAI,oBAAoB,CAAC,UAAU,IAAI,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAK,EAAE,CAAC;EAC3J,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAChD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC9C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC3D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACzD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EACtD,MAAM,YAAY,GAAG,mDAAY,CAAC,IAAI,CAAC;EACvC,MAAM,QAAQ,GAAI,MAAM,IAAI,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,iBAAiB,CAAC,SAAS,IAAK,CAAC;EAChG,MAAM,SAAS,GAAI,MAAM,IAAI,MAAM,CAAC,UAAU,IAAK,GAAG;EAKtD,sDAAe,CAAC,MAAM;IACpB,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE;MACxE,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACnC;EACF,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;EAEZ,MAAM,eAAe,GAAG;IAAC,GAAG,EAAE,MAAM;IAAE,UAAU,EAAE,MAAM;IAAE,SAAS,EAAE,MAAM;IAAE,KAAK,EAAE;EAAI,CAAC;EAEzF,MAAM,QAAQ,GAAG,KAAK,IAAI;IACxB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;IACvB,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;IACtB,IAAI,MAAM,CAAC,MAAM,IAAI,QAAQ,EAAE;MAAE,OAAO,CAAC,QAAQ,QAAQ,MAAM,CAAC;MAAE;IAAQ;IAC1E,YAAY,CAAC,IAAI,CAAC;IAClB,+DAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;MAAC;IAAM,CAAC,KAAK,SAAS,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;MAAC,EAAE,EAAE;IAAM,CAAC,CAAC,CAAC,CAAC,CAC7F,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;EACpF,CAAC;EAED,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE;MAAE,OAAO,CAAC,SAAS,CAAC;MAAE;IAAQ;IAKnD,IAAI,CAAC,QAAQ,EAAE;MAAE,OAAO,CAAC,SAAS,CAAC;MAAE;IAAQ;IAC7C,aAAa,CAAC,IAAI,CAAC;IACnB,8DAAc,CAAC;MAAC,QAAQ;MAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;MAAE,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;MAAE,mBAAmB,EAAE;IAAW,CAAC,CAAC,CAC9H,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CACpC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAC5C,OAAO,CAAC,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;EACxC,CAAC;EAED,IAAI,SAAS,EAAE,OAAO;IAAK,SAAS,EAAC,cAAc;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC;IAAiB,gBAAE,CAAC;MAAM,SAAS,EAAC,iBAAiB;MAAA,WAAC,8DAAC,IAAI;QAAA,UAAC;MAAe,gBAAM,CAAC;QAAA,UAAI;MAAK,gBAAI,CAAC;QAAA,UAAG;MAAsB,gBAAG,CAAC;QAAA,UAAI;UAAA,WAAK;YAAA,UAAI;UAAI,gBAAI,CAAC;YAAA,UAAK,SAAS,CAAC;UAAW,gBAAK,CAAC;QAAA,eAAK;MAAC,gBAAI,CAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,iBAAiB,CAAE;QAAA,UAAC;MAAI,gBAAQ,CAAC;IAAA,eAAM,CAAC;EAAA,eAAK,CAAC;EAExW,OAAO;IAAK,SAAS,EAAC,4BAA4B;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC;IAAiB,gBAAE,CAAC;MAAA,WAC9F,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG;QAAS,SAAS,EAAC,qBAAqB;QAAA,WAAC;UAAA,UAAI;QAAI,gBAAI,CAAC;UAAA,UAClH,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI;YAAQ,IAAI,EAAC,QAAQ;YAAC,SAAS,EAAE,QAAQ,KAAK,EAAE,GAAG,QAAQ,GAAG,EAAG;YAAU,OAAO,EAAE,MAAM,WAAW,CAAC,EAAE,CAAE;YAAA,UAAE,eAAe,CAAC,EAAE,CAAC,IAAI;UAAE,GAA9D,EAAE,OAAqE,CAAC;QAAC,gBAC1K,CAAC;MAAA,eAAS,CAAC,GAAG,IAAI,EACvB;QAAO,SAAS,EAAC,kBAAkB;QAAA,WACjC;UAAA,WAAM,MAAI;YAAA,UAAG;UAAC,gBAAG,CAAC;QAAA,eAAM,CAAC,EACzB;UAAU,KAAK,EAAE,OAAQ;UAAC,SAAS,EAAE,SAAU;UAAC,QAAQ,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAE;UAAC,WAAW,EAAC;QAA4C,gBAAE,CAAC,EAC9J;UAAA,WAAQ,OAAO,CAAC,MAAM,EAAC,GAAC,EAAC,SAAS;QAAA,eAAQ,CAAC;MAAA,eACtC,CAAC,EACR;QAAS,SAAS,EAAC,iBAAiB;QAAA,WAClC;UAAA,WAAQ;YAAA,UAAM;cAAA,UAAQ;YAAE,gBAAQ;UAAC,gBAAM,CAAC;YAAA,WAAK,MAAM,CAAC,MAAM,EAAC,GAAC,EAAC,QAAQ;UAAA,eAAK,CAAC;QAAA,eAAQ,CAAC,EACpF;UAAQ,IAAI,EAAC,QAAQ;UAAC,QAAQ,EAAE,SAAU;UAAC,OAAO,EAAE,MAAM,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAE;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAW,gBAAM,CAAC;YAAA,UAAO,SAAS,GAAG,MAAM,GAAG;UAAM,gBAAO,CAAC;QAAA,eAAQ,CAAC,EAC3L;UAAO,GAAG,EAAE,YAAa;UAAC,IAAI,EAAC,MAAM;UAAC,MAAM,EAAC,SAAS;UAAC,KAAK,EAAE;YAAC,OAAO,EAAE;UAAM,CAAE;UAAC,QAAQ,EAAE;QAAS,gBAAE,CAAC;MAAA,eAChG,CAAC,EACT,MAAM,IAAI,MAAM,CAAC,kBAAkB,GAAG;QAAO,SAAS,EAAC,qBAAqB;QAAA,WAAC;UAAO,IAAI,EAAC,UAAU;UAAC,OAAO,EAAE,WAAY;UAAC,QAAQ,EAAE,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;QAAE,gBAAE,CAAC;UAAA,WAAM;YAAA,UAAQ;UAAU,gBAAQ,CAAC;YAAA,UAAQ,MAAM,CAAC;UAAkB,gBAAQ,CAAC;QAAA,eAAM,CAAC;MAAA,eAAO,CAAC,GAAG,IAAI;IAAA,eACnR,CAAC;MAAQ,SAAS,EAAC,oBAAoB;MAAA,UAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAE,UAAW;QAAC,OAAO,EAAE,MAAO;QAAA,UAAE,UAAU,GAAG,MAAM,GAAG;MAAI,gBAAS;IAAC,gBAAQ,CAAC;EAAA,eAAK,CAAC;AACjK;AAEe,SAAS,mBAAmB,CAAC;EAAC,IAAI;EAAE,UAAU;EAAE;AAAM,CAAC,EAAE;EACtE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,IAAI,OAAO;EACX,IAAI,IAAI,KAAK,oBAAoB,IAAI,IAAI,KAAK,yBAAyB,EAAE,OAAO,GAAG,8DAAC,cAAc;IAAC,SAAS,EAAE,IAAI,KAAK;EAA0B,gBAAE,CAAC,CAAC,KAChJ,IAAI,IAAI,KAAK,sBAAsB,EAAE,OAAO,GAAG,8DAAC,aAAa;IAAC,UAAU,EAAE,UAAW;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC5G,IAAI,IAAI,KAAK,sBAAsB,EAAE,OAAO,GAAG,8DAAC,aAAa;IAAC,UAAU,EAAE,UAAW;IAAC,MAAM,EAAE,MAAO;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC5H,OAAO,GAAG,8DAAC,YAAY;IAAC,MAAM,EAAE,MAAO;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC;EAClE,OAAO;IAAA,WAAG,OAAO,EAAC,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAAE,CAAC;AAC5E,C;;;;;;;;;;;;;;;;;;;;;;ACvQ0B;AACoB;AAEC;AAES;AAAA;AAEzC,MAAM,YAAY,SAAS,4DAAmB,CAAC;EAC5D,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG;MACX,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK;MACnC,aAAa,EAAE,KAAK,CAAC,aAAa;MAClC,gBAAgB,EAAE,KAAK,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1E,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;EAC9D;EAEA,YAAY,CAAC,CAAC,EAAE;IACd,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;MAClB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;MAC/B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;MACvC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC;IAC/B,CAAC,CAAC;EACJ;EAEA,uBAAuB,CAAC,CAAC,EAAE;IACzB,IAAI,CAAC,QAAQ,CAAC;MAAC,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC;IAAK,CAAC,CAAC;EACnD;EAEA,yBAAyB,CAAC,IAAI,EAAE;IAC9B,IAAI,CAAC,QAAQ,CAAC;MAAC,aAAa,EAAE;IAAI,CAAC,CAAC;EACtC;EAEA,kBAAkB,CAAC,CAAC,EAAE;IACpB,IAAI,CAAC,QAAQ,CAAC;MAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;IAAgB,CAAC,CAAC;EACjE;EAEA,MAAM,GAAG;IACP,MAAM,KAAK,GAAG;MAAC,GAAG,EAAE,SAAS;MAAE,EAAE,EAAE,WAAW;MAAE,EAAE,EAAE;IAAc,CAAC;IACnE,MAAM,gBAAgB,GAAG,EAAE;IAC3B,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI;MAClC,MAAM,EAAE,GAAG,YAAY,GAAG,IAAI;MAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;MACxB,gBAAgB,CAAC,IAAI,CACnB;QAAA,WACE;UAAO,IAAI,EAAC,OAAO;UAAC,EAAE,EAAE,EAAG;UAAC,IAAI,EAAC,kBAAkB;UAAC,KAAK,EAAE,IAAK;UAC9D,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,IAAK;UACvC,QAAQ,EAAE,IAAI,CAAC;QAAwB,gBAAE,CAAC,EAC5C;UAAO,OAAO,EAAE,EAAG;UAAA,UAAE;QAAI,gBAAQ,CAAC;MAAA,GAJ3B,IAAI,MAKT,CACN,CAAC;IACH,CAAC,CAAC;IAEF,OACE;MAAM,EAAE,EAAC,eAAe;MAAC,SAAS,EAAC,YAAY;MAAC,QAAQ,EAAE,IAAI,CAAC,YAAa;MAAA,WAC1E;QAAK,SAAS,EAAC,gBAAgB;QAAA,UAC7B;UAAO,SAAS,EAAC,OAAO;UAAA,UACtB,8DAAC,wDAAgB;YAAC,EAAE,EAAC,qBAAqB;YAAC,cAAc,EAAC,gBAAgB;YACxE,WAAW,EAAC;UAA2C,gBAAE;QAAC,gBACvD;MAAC,gBACL,CAAC,EACN,8DAAC,kEAAY;QAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QAAC,qBAAqB,EAAE,IAAI,CAAC;MAA0B,gBAAE,CAAC,EAChH;QAAK,SAAS,EAAC,gBAAgB;QAAA,WAC7B,8DAAC,6DAAQ;UAAC,EAAE,EAAC,mBAAmB;UAAC,IAAI,EAAC,mBAAmB;UAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAiB;UAC7F,SAAS,EAAC,QAAQ;UAAC,QAAQ,EAAE,IAAI,CAAC;QAAmB,gBAAE,CAAC;UAAO,OAAO,EAAC,mBAAmB;UAAA,UAC1F,8DAAC,wDAAgB;YAAC,EAAE,EAAC,6BAA6B;YAAC,cAAc,EAAC,uBAAuB;YACvF,WAAW,EAAC;UAAkD,gBAAE;QAAC,gBAC9D,CAAC;MAAA,eACL,CAAC,EACN;QAAK,SAAS,EAAC,gBAAgB;QAAA,UAC7B;UAAO,SAAS,EAAC,OAAO;UAAA,UACtB,8DAAC,wDAAgB;YAAC,EAAE,EAAC,sBAAsB;YAAC,cAAc,EAAC,iBAAiB;YAC1E,WAAW,EAAC;UAAoD,gBAAE;QAAC,gBAChE;MAAC,gBACL,CAAC,EACN;QAAK,SAAS,EAAC,gBAAgB;QAAA,UAC7B;UAAI,SAAS,EAAC,QAAQ;UAAA,UACnB;QAAgB,gBACf;MAAC,gBACF,CAAC,EACN;QAAK,SAAS,EAAC,gBAAgB;QAAA,UAC7B;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,SAAS;UAAA,UACvC,8DAAC,wDAAgB;YAAC,EAAE,EAAC,eAAe;YAAC,cAAc,EAAC,QAAQ;YAC1D,WAAW,EAAC;UAAiB,gBAAE;QAAC,gBAC5B;MAAC,gBACN,CAAC;IAAA,eACF,CAAC;EAEX;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjGuC;AACkC;AAEtB;AACE;AACF;AACE;AACM;AACF;AACA;AAC8B;AACM;AACN;AACH;AACA;AACwB;AAClB;AACH;AAExF,MAAM,mBAAmB,GAAG,iDAAU,CAAC,CAAC,IAAI,2fAAqC,CAAC;AACnC;AAC/C,MAAM,iBAAiB,GAAG,iDAAU,CAAC,CAAC,IAAI,qfAAmC,CAAC;AAC1B;AACY;AAChE,MAAM,eAAe,GAAG,iDAAU,CAAC,CAAC,IAAI,gMAAiC,CAAC;AACtB;AACX;AACO;AAChD,MAAM,iBAAiB,GAAG,iDAAU,CAAC,CAAC,IAAI,qfAAmC,CAAC;AAC/B;AACI;AAAA;AACnD,MAAM,cAAc,GAAG,iDAAU,CAAC,CAAC,IAAI,2KAA0B,CAAC;AAGlE,MAAM,QAAQ,GAAG,0DAAc,CAAC;EAC9B,KAAK,EAAE;IACL,EAAE,EAAE,uBAAuB;IAC3B,WAAW,EAAE,gCAAgC;IAC7C,cAAc,EAAE;EAClB,CAAC;EACD,QAAQ,EAAE;IACR,EAAE,EAAE,0BAA0B;IAC9B,WAAW,EAAE,wCAAwC;IACrD,cAAc,EAAE;EAClB,CAAC;EACD,QAAQ,EAAE;IACR,EAAE,EAAE,0BAA0B;IAC9B,WAAW,EAAE,mCAAmC;IAChD,cAAc,EAAE;EAClB,CAAC;EACD,IAAI,EAAE;IACJ,EAAE,EAAE,kCAAkC;IACtC,WAAW,EAAE,0CAA0C;IACvD,cAAc,EAAE;EAClB,CAAC;EACD,OAAO,EAAE;IACP,EAAE,EAAE,qBAAqB;IACzB,WAAW,EAAE,wBAAwB;IACrC,cAAc,EAAE;EAClB,CAAC;EACD,QAAQ,EAAE;IACR,EAAE,EAAE,sBAAsB;IAC1B,WAAW,EAAE,0CAA0C;IACvD,cAAc,EAAE;EAClB,CAAC;EACD,IAAI,EAAE;IACJ,EAAE,EAAE,kBAAkB;IACtB,WAAW,EAAE,2BAA2B;IACxC,cAAc,EAAE;EAClB,CAAC;EACD,KAAK,EAAE;IACL,EAAE,EAAE,mCAAmC;IACvC,WAAW,EAAE,2CAA2C;IACxD,cAAc,EAAE;EAClB,CAAC;EACD,WAAW,EAAE;IACX,EAAE,EAAE,6BAA6B;IACjC,WAAW,EAAE,qCAAqC;IAClD,cAAc,EAAE;EAClB,CAAC;EACD,OAAO,EAAE;IACP,EAAE,EAAE,6BAA6B;IACjC,WAAW,EAAE,qCAAqC;IAClD,cAAc,EAAE;EAClB,CAAC;EACD,MAAM,EAAE;IACN,EAAE,EAAE,wBAAwB;IAC5B,WAAW,EAAE,mCAAmC;IAChD,cAAc,EAAE;EAClB,CAAC;EACD,IAAI,EAAE;IACJ,EAAE,EAAE,sBAAsB;IAC1B,WAAW,EAAE,qCAAqC;IAClD,cAAc,EAAE;EAClB,CAAC;EACD,KAAK,EAAE;IACL,EAAE,EAAE,uBAAuB;IAC3B,WAAW,EAAE,wCAAwC;IACrD,cAAc,EAAE;EAClB,CAAC;EACD,OAAO,EAAE;IACP,EAAE,EAAE,yBAAyB;IAC7B,WAAW,EAAE,2CAA2C;IACxD,cAAc,EAAE;EAClB,CAAC;EACD,OAAO,EAAE;IACP,EAAE,EAAE,yBAAyB;IAC7B,WAAW,EAAE,2CAA2C;IACxD,cAAc,EAAE;EAClB,CAAC;EACD,UAAU,EAAE;IACV,EAAE,EAAE,YAAY;IAChB,WAAW,EAAE,4CAA4C;IACzD,cAAc,EAAE;EAClB;AACF,CAAC,CAAC;AAEF,MAAM,aAAa,SAAS,4DAAmB,CAAC;EAC9C,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;EACtD;EAEA,cAAc,GAAG;IACf,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;EACjC;EAEA,MAAM,GAAG;IACP,MAAM;MAAC;IAAa,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,eAAe,GAAG,QAAQ,CAAC;IACnF,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,UAAU,EAClG,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,sBAAsB,CAAC;IAE1G,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;MAClC,OAAO;QAAK,EAAE,EAAC,WAAW;QAAC,SAAS,EAAC,uBAAuB;QAAA,UAC1D,+DAAC,iEAAkB;UACjB,IAAI,EAAE,IAAK;UACX,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;UAClC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAS;UACrC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;UACxB,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;UAC5B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;UAChC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;UAClC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAe;UAC1C,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAoB;UACpD,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;UAC5C,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAoB;UACpD,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAiB;UAC9C,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;QAAQ,gBAAE;MAAC,gBAC9B,CAAC;IACR;IAEA,MAAM,eAAe,GAAG,CAAC,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,CAAC;IACpH,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;MAClC,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,KAAK,eAAe;MACjE,OAAO;QAAK,EAAE,EAAC,WAAW;QAAC,SAAS,EAAE,sBAAsB,IAAI,QAAQ,GAAG,YAAY,GAAG,EAAE,CAAE;QAAA,UAC5F,+DAAC,gEAAiB;UAChB,IAAI,EAAE,IAAK;UAEX,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;UAChC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAC9B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAC9B,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;UAC5C,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC;QAAc,GALnC,IAAI,OAKiC;MAAC,gBAC1C,CAAC;IACR;IAEA,MAAM,iBAAiB,GAAG,CAAC,sBAAsB,EAAE,sBAAsB,EAAE,uBAAuB,EAChG,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAC3F,kBAAkB,EAAE,YAAY,EAAE,mBAAmB,CAAC;IACxD,IAAI,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;MACpC,OAAO;QAAK,EAAE,EAAC,WAAW;QAAC,SAAS,EAAC,sBAAsB;QAAA,UACzD,+DAAC,gEAAiB;UAAC,IAAI,EAAE;QAAK,GAAM,IAAI,OAAG;MAAC,gBACzC,CAAC;IACR;IAEA,IAAI,8EAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;MACzC,OAAO;QAAK,EAAE,EAAC,WAAW;QAAC,SAAS,EAAC,wBAAwB;QAAA,UAC3D,+DAAC,kEAAmB;UAAC,IAAI,EAAE;QAAK,GAAM,IAAI,OAAG;MAAC,gBAC3C,CAAC;IACR;IAEA,IAAI,mFAAwB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;MAC3C,OAAO;QAAK,EAAE,EAAC,WAAW;QAAC,SAAS,EAAC,0BAA0B;QAAA,UAC7D,+DAAC,qEAAqB;UAAC,IAAI,EAAE,IAAK;UAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;UAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAClG,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;UAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;UAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC;QAAc,GAAM,IAAI,OAAG;MAAC,gBAC7H,CAAC;IACR;IAEA,IAAI,+EAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;MACzC,OAAO;QAAK,EAAE,EAAC,WAAW;QAAC,SAAS,EAAC,wBAAwB;QAAA,UAC3D,+DAAC,mEAAmB;UAAC,IAAI,EAAE,IAAK;UAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;UAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAChG,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;UAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC;QAAgB,GAAM,IAAI,OAAG;MAAC,gBACpF,CAAC;IACR;IAEA,IAAI,6EAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;MACxC,OAAO;QAAK,EAAE,EAAC,WAAW;QAAC,SAAS,EAAC,uBAAuB;QAAA,UAC1D,+DAAC,kEAAkB;UAAC,IAAI,EAAE,IAAK;UAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;UAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAC/F,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;UAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;UAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;QAAS,GAAM,IAAI,OAAG;MAAC,gBACnH,CAAC;IACR;IAEA,IAAI,6EAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;MACxC,OAAO;QAAK,EAAE,EAAC,WAAW;QAAC,SAAS,EAAC,uBAAuB;QAAA,UAC1D,+DAAC,kEAAkB;UAAC,IAAI,EAAE;QAAK,GAAM,IAAI,OAAG;MAAC,gBAC1C,CAAC;IACR;IAEA,IAAI,6FAA6B,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;MAChD,OAAO;QAAK,EAAE,EAAC,WAAW;QAAC,SAAS,EAAC,+BAA+B;QAAA,UAClE,+DAAC,0EAA0B;UAAC,IAAI,EAAE,IAAK;UAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;UAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UACvG,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;UAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC;QAAgB,GAAM,IAAI,OAAG;MAAC,gBACpF,CAAC;IACR;IAEA,IAAI,iFAAuB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;MAC1C,OAAO;QAAK,EAAE,EAAC,WAAW;QAAC,SAAS,EAAC,yBAAyB;QAAA,UAC5D,+DAAC,oEAAoB;UAAC,IAAI,EAAE,IAAK;UAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;UAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UACjG,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;UAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UACzD,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAiB;UAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;UAC3F,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;QAAS,GAAM,IAAI,OAAG;MAAC,gBAC3C,CAAC;IACR;IAEA,IAAI,+EAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;MACzC,OAAO;QAAK,EAAE,EAAC,WAAW;QAAC,SAAS,EAAC,wBAAwB;QAAA,UAC3D,+DAAC,mEAAmB;UAAC,IAAI,EAAE,IAAK;UAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;UAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;QAAO,GAAM,IAAI,OAAG;MAAC,gBACzG,CAAC;IACR;IAEA,IAAI,KAAK,EAAE,MAAM,EAAE,MAAM;IACzB,IAAI,IAAI,IAAI,UAAU,EAAE;MACtB,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;MACxB,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI;MACrD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa;IACnC,CAAC,MAAM;MACL,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;MACrC,MAAM,GAAG,KAAK;MACd,MAAM,GAAG,IAAI;IACf;IAEA,IAAI,QAAQ;IACZ,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;MAC7C,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ;IAChC;IAEA,OACE;MAAK,EAAE,EAAC,WAAW;MAAA,WACjB,+DAAC,gEAAU;QACT,KAAK,EAAE,IAAK;QACZ,KAAK,EAAE,KAAM;QACb,MAAM,EAAE,MAAO;QACf,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;QAC1B,aAAa,EAAE,MAAO;QACtB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;QAClC,UAAU,EAAE,IAAI,CAAC,cAAe;QAChC,QAAQ,EAAE;MAAS,gBAAE,CAAC,EAExB,+DAAC,gEAAU;QACT,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;QAC7B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;QAC3B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;QAC/B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;QACvC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC;MAAQ,gBAAE,CAAC,EAEtC,+DAAC,iEAAW;QAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;MAAmB,gBAAE,CAAC,EAEnD,IAAI,KAAK,OAAO,GACf,+DAAC,wDAAS;QACR,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;QACxB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACnC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;QAC5B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,cAAe;QACnC,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC;MAAoB,gBAAE,CAAC,GAEzD,IAAI,KAAK,UAAU,GACnB,+DAAC,2CAAQ;QAAC,QAAQ,EAAE;UAAK,SAAS,EAAC,gBAAgB;UAAA,UAAC,+DAAC,wDAAgB;YAAC,EAAE,EAAC,cAAc;YACrF,cAAc,EAAC,YAAY;YAAC,WAAW,EAAC;UAAyC,gBAAC;QAAC,gBAAK,CAAE;QAAA,UAC1F,+DAAC,iBAAiB;UAChB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;UAC1B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,qBAAsB;UACxD,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;UAC5C,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAC9B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;QAAQ,gBAAE;MAAC,gBACzB,CAAC,GAEX,IAAI,KAAK,UAAU,GACnB,+DAAC,2DAAY;QACX,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;QAChC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAiB;QAC9C,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;MAAiB,gBAAE,CAAC,GAE3C,IAAI,KAAK,MAAM,GACf,+DAAC,2CAAQ;QAAC,QAAQ,EAAE;UAAK,SAAS,EAAC,gBAAgB;UAAA,UAAC,+DAAC,wDAAgB;YAAC,EAAE,EAAC,cAAc;YACrF,cAAc,EAAC,YAAY;YAAC,WAAW,EAAC;UAAyC,gBAAC;QAAC,gBAAK,CAAE;QAAA,UAC1F,+DAAC,mBAAmB;UAClB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;UAC1B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAC9B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,qBAAsB;UACxD,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;UAClC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;UAChC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAa;UACtC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;QAAQ,gBAAE;MAAC,gBACzB,CAAC,GAEV,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,GACtC,+DAAC,8DAAe;QACd,KAAK,EAAC,IAAI;QACV,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;QAC1B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAoB;QAClD,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAoB;QACpD,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;MAAQ,gBAAE,CAAC,GAEjC,IAAI,KAAK,aAAa,GACtB,+DAAC,8DAAc;QACb,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;QACpC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAmB;QAClD,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;QACpC,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAoB;QACpD,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAkB;QAChD,oBAAoB,EAAE,IAAI,CAAC,KAAK,CAAC;MAAqB,gBAAE,CAAC,GAE3D,IAAI,KAAK,OAAO,GAChB,+DAAC,oEAAoB;QACnB,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,oBAAoB,EAAE,IAAI,CAAC,KAAK,CAAC,oBAAqB;QACtD,yBAAyB,EAAE,IAAI,CAAC,KAAK,CAAC,yBAA0B;QAChE,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC;MAAsB,gBAAE,CAAC,GAE7D,IAAI,KAAK,UAAU,GACjB,+DAAC,2CAAQ;QAAC,QAAQ,EAAE;UAAK,SAAS,EAAC,gBAAgB;UAAA,UAAC,+DAAC,wDAAgB;YAAC,EAAE,EAAC,cAAc;YACrF,cAAc,EAAC,YAAY;YAAC,WAAW,EAAC;UAAyC,gBAAC;QAAC,gBAAK,CAAE;QAAA,UAC1F,+DAAC,eAAe;UACd,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;UAC1B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;UAClC,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAoB;UACpD,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAiB;UAC9C,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAC9B,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;UAC5C,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;UACpC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC;QAAsB,gBAAE;MAAC,gBACrD,CAAC,GAEb,IAAI,KAAK,SAAS,GAClB,+DAAC,8DAAc;QACb,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC;MAAc,gBAAE,CAAC,GAE7C,IAAI,KAAK,YAAY,GACrB,+DAAC,2CAAQ;QAAC,QAAQ,EAAE;UAAK,SAAS,EAAC,gBAAgB;UAAA,UAAC,+DAAC,wDAAgB;YAAC,EAAE,EAAC,cAAc;YACrF,cAAc,EAAC,YAAY;YAAC,WAAW,EAAC;UAAyC,gBAAC;QAAC,gBAAK,CAAE;QAAA,UAC1F,+DAAC,cAAc;UACb,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;UAChC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAkB;UACvG,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC;QAAoB,gBACrD;MAAC,gBACM,CAAC,GAEV,IAAI,KAAK,UAAU,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,GAC9D,+DAAC,2DAAY;QACX,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;QAC1B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;QAChC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,OAAO,EAAE,IAAI,IAAI,SAAU;QAC3B,OAAO,EAAE,IAAI,IAAI,SAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;QAC5C,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;QAC5C,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC;MAAc,gBAAE,CAAC,GAE7C,IAAI,KAAK,QAAQ,GACjB,+DAAC,4DAAY;QACX,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;QAC1B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;QAClC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAiB;QAC9C,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;MAAQ,gBAAE,CAAC,GAEjC,IAAI,KAAK,MAAM,GACf,+DAAC,6DAAc;QACb,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;QAClC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;QAChC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,qBAAsB;QAC3C,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;MAAS,gBAAE,CAAC,GAEnC,IAAI,KAAK,OAAO,GAChB,+DAAC,2CAAQ;QAAC,QAAQ,EAAE;UAAK,SAAS,EAAC,gBAAgB;UAAA,UAAC,+DAAC,wDAAgB;YAAC,EAAE,EAAC,cAAc;YACrF,cAAc,EAAC,YAAY;YAAC,WAAW,EAAC;UAAyC,gBAAC;QAAC,gBAAK,CAAE;QAAA,UAC1F,+DAAC,iBAAiB;UAChB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;UAC1B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,qBAAsB;UACxD,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,sBAAuB;UAC7C,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;UACpC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAC9B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;QAAQ,gBAAE;MAAC,gBACzB,CAAC,GACX,IAAI;IAAA,eACH,CAAC;EAEV;AACF;AAAC;AAED,+DAAe,sDAAU,CAAC,aAAa,CAAC,E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxaA;AACkC;AAEV;AAE8B;AAElD;AAEH;AACa;AACI;AACW;AACb;AACgB;AACxE,MAAM,oBAAoB,GAAG,iDAAU,CAAC,CAAC,IAAI,4NAA+C,CAAC;AAE7F,MAAM,QAAQ,GAAG,iDAAU,CAAC,CAAC,IAAI,wKAAyB,CAAC;AAC3D,MAAM,YAAY,GAAG,iDAAU,CAAC,CAAC,IAAI,oLAA6B,CAAC;AAClB;AAGwC;AAGpC;AACL;AACsB;AACqB;AACpC;AACkD;AAC7B;AAC1B;AACC;AAC0C;AAAA;AAG7F,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,eAAe,CAAC;AAE5C,MAAM,QAAQ,GAAG,0DAAc,CAAC;EAC9B,mBAAmB,EAAE;IACnB,EAAE,EAAE,qBAAqB;IACzB,cAAc,EAAE,0CAA0C;IAC1D,WAAW,EAAE;EACf,CAAC;EACD,aAAa,EAAE;IACb,EAAE,EAAE,eAAe;IACnB,cAAc,EAAE,SAAS;IACzB,WAAW,EAAE;EACf,CAAC;EACD,gBAAgB,EAAE;IAChB,EAAE,EAAE,kBAAkB;IACtB,cAAc,EAAE,yCAAyC;IACzD,WAAW,EAAE;EACf,CAAC;EACD,sBAAsB,EAAE;IACtB,EAAE,EAAE,wBAAwB;IAC5B,cAAc,EAAE,wBAAwB;IACxC,WAAW,EAAE;EACf,CAAC;EACD,aAAa,EAAE;IACb,EAAE,EAAE,eAAe;IACnB,cAAc,EAAE,eAAe;IAC/B,WAAW,EAAE;EACf,CAAC;EACD,kBAAkB,EAAE;IAClB,EAAE,EAAE,oBAAoB;IACxB,cAAc,EAAE,qBAAqB;IACrC,WAAW,EAAE;EACf,CAAC;EACD,cAAc,EAAE;IACd,EAAE,EAAE,gBAAgB;IACpB,cAAc,EAAE,MAAM;IACtB,WAAW,EAAE;EACf,CAAC;EACD,oBAAoB,EAAE;IACpB,EAAE,EAAE,sBAAsB;IAC1B,cAAc,EAAE,MAAM;IACtB,WAAW,EAAE;EACf,CAAC;EACD,oBAAoB,EAAE;IACpB,EAAE,EAAE,sBAAsB;IAC1B,cAAc,EAAE,YAAY;IAC5B,WAAW,EAAE;EACf,CAAC;EACD,2BAA2B,EAAE;IAC3B,EAAE,EAAE,6BAA6B;IACjC,cAAc,EAAE,wBAAwB;IACxC,WAAW,EAAE;EACf,CAAC;EACD,sBAAsB,EAAE;IACtB,EAAE,EAAE,wBAAwB;IAC5B,cAAc,EAAE,6BAA6B;IAC7C,WAAW,EAAE;EACf,CAAC;EACD,cAAc,EAAE;IACd,EAAE,EAAE,gBAAgB;IACpB,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE;EACf;AACF,CAAC,CAAC;AAMF,MAAM,gBAAgB,GAAG,CAAC,aAAa,EAAC,SAAS,EAAC,SAAS,EAAC,UAAU,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,SAAS,EAC3F,QAAQ,EAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,YAAY,EAChF,QAAQ,EAAC,OAAO,EAAC,qBAAqB,EAAC,qBAAqB,EAAC,gBAAgB,EAC7E,UAAU,EAAC,mBAAmB,EAAC,mBAAmB,EAAC,sBAAsB,EACzE,eAAe,EAAC,kBAAkB,EAAC,eAAe,EAAC,iBAAiB,EAAC,iBAAiB,EACtF,sBAAsB,EAAC,sBAAsB,EAAC,uBAAuB,EAAC,aAAa,EACnF,aAAa,EAAC,YAAY,EAAC,cAAc,EAAC,cAAc,EAAC,eAAe,EACxE,kBAAkB,EAAC,YAAY,EAAC,mBAAmB,EACnD,kBAAkB,EAAC,iBAAiB,EAAC,mBAAmB,EAAC,kBAAkB,EAC3E,aAAa,EAAC,eAAe,EAAC,aAAa,EAAC,YAAY,EAAC,iBAAiB,EAC1E,iBAAiB,EAAC,eAAe,EAAC,aAAa,EAAC,aAAa,EAAC,cAAc,EAC5E,qBAAqB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,kBAAkB,EAC5E,oBAAoB,EAAC,gBAAgB,EACrC,cAAc,EAAC,iBAAiB,EAAC,YAAY,EAAC,cAAc,EAAC,WAAW,EAAC,sBAAsB,EAC/F,qBAAqB,EAAC,gBAAgB,EAAC,sBAAsB,EAAC,iBAAiB,EAC/E,yBAAyB,EAAC,uBAAuB,EAAC,YAAY,EAAC,eAAe,EAAC,oBAAoB,EACnG,YAAY,EAAC,aAAa,EAAC,cAAc,EAAC,cAAc,EAAC,qBAAqB,EAC9E,mBAAmB,EAAC,oBAAoB,EAAC,eAAe,EAAC,2BAA2B,EACpF,gBAAgB,EAAC,eAAe,EAAC,cAAc,EAAC,gBAAgB,EAAC,mBAAmB,EACpF,mBAAmB,EAAC,eAAe,EAAC,oBAAoB,EAAC,UAAU,EAAC,kBAAkB,EAAC,cAAc,EAAC,iBAAiB,EACvH,qBAAqB,EAAC,qBAAqB,EAAC,qBAAqB,EAAC,gBAAgB,EAClF,aAAa,EAAC,oBAAoB,EAAC,qBAAqB,EAAC,aAAa,EAAC,mBAAmB,EAC1F,WAAW,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,gBAAgB,EAAC,iBAAiB,EAClF,iBAAiB,EAAC,iBAAiB,EAAC,iBAAiB,EAAC,kBAAkB,EAAC,gBAAgB,EAAC,eAAe,EAAC,kBAAkB,EAC5H,iBAAiB,EAAC,gBAAgB,EAAC,eAAe,EAAC,eAAe,EAAC,gBAAgB,EAAC,gBAAgB,EACpG,cAAc,EAAC,eAAe,EAAC,oBAAoB,EAAC,mBAAmB,EAAC,kBAAkB,EAC1F,oBAAoB,EAAC,oBAAoB,EAAC,uBAAuB,EAAC,mBAAmB,EACrF,4BAA4B,EAAC,gBAAgB,EAC7C,WAAW,EAAC,wBAAwB,EAAC,mBAAmB,EAAC,kBAAkB,EAC3E,gBAAgB,EAAC,gBAAgB,EACjC,qBAAqB,EAAC,mBAAmB,EAAC,mBAAmB,EAAC,qBAAqB,EACnF,uBAAuB,EAAC,qBAAqB,EAAC,qBAAqB,EAAC,uBAAuB,EAC3F,mBAAmB,EAAC,0BAA0B,EAC9C,iBAAiB,EAAC,kBAAkB,EAAC,kBAAkB,EAAC,oBAAoB,EAC5E,mBAAmB,EAAC,gBAAgB,EAAC,gBAAgB,EAAC,iBAAiB,EAAC,kBAAkB,EAC1F,qBAAqB,EAAC,uBAAuB,EAAC,iBAAiB,EAAC,wBAAwB,EACxF,aAAa,EAAC,kBAAkB,EAAC,2BAA2B,EAC5D,gBAAgB,EAAC,eAAe,EAAC,mBAAmB,EACpD,yBAAyB,EAAC,8BAA8B,EAAC,wBAAwB,EACjF,4BAA4B,EAC5B,oBAAoB,EAAC,yBAAyB,EAAC,sBAAsB,EACrE,sBAAsB,EAAC,eAAe,EACtC,EAAE,CAAC;AAIb,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EACrE,qBAAqB,EAAE,qBAAqB,CAAC;AAoB/C,MAAM,kBAAkB,GAAG;EACzB,uBAAuB,EAAE,SAAS;EAClC,yBAAyB,EAAE,MAAM;EACjC,+BAA+B,EAAE,kBAAkB;EACnD,kBAAkB,EAAE,eAAe;EACnC,mBAAmB,EAAE;AACvB,CAAC;AACD,SAAS,kBAAkB,CAAC,GAAG,EAAE;EAC/B,MAAM,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO;EAC9B,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI;EACrB,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;EACzE,OAAO,kBAAkB,CAAC,UAAU,CAAC,IAAI,IAAI;AAC/C;AACA,SAAS,iBAAiB,CAAC,GAAG,EAAE;EAC9B,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC;EACrC,IAAI,KAAK,EAAE,OAAO,KAAK;EAEvB,IAAI,GAAG,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,OAAO,SAAS;EACnE,OAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,IAAK,UAAU;AAC3C;AAIA,MAAM,0BAA0B,GAAG;EACjC,oBAAoB,EAAE,QAAQ;EAC9B,mBAAmB,EAAE,aAAa;EAClC,mBAAmB,EAAE,uBAAuB;EAC5C,mBAAmB,EAAE;AACvB,CAAC;AACD,SAAS,+BAA+B,CAAC,MAAM,EAAE;EAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM;EACtC,OAAQ,MAAM,IAAI,0BAA0B,CAAC,MAAM,CAAC,IAAK,kBAAkB;AAC7E;AAGA,MAAM,oBAAoB,GAAG,KAAK;AAElC,MAAM,SAAS,SAAS,wDAAe,CAAC;EACtC,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,OAAO,GAAG,sDAAe,CAAC,CAAC;IAEhC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IAEjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC;IAChF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;IACtC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9E,IAAI,CAAC,8BAA8B,GAAG,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC;IACpF,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1E,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1E,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxE,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9E,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1E,IAAI,CAAC,gCAAgC,GAAG,IAAI,CAAC,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC;IACxF,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5E,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,yBAAyB,GAAI,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;IAE3E,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IAEtE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1E,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;IAEpE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC;IAChF,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC;IAEhF,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IAEtD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAEhE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IAExD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;IAG5D,IAAI,CAAC,gBAAgB,GAAG,IAAI;EAC9B;EAEA,aAAa,GAAG;IACd,MAAM,QAAQ,GAAG,8DAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,CAAC,CAAC,8DAAgB,CAAC,SAAS,CAAC,gBAAgB,CAAC;IAC9D,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;MACvB,MAAM,SAAS,GAAG,gEAAgB,CAAC,CAAC;MACpC,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,IAAI,EAAE;MACzC,QAAQ,CAAC,aAAa,GAAG,SAAS,CAAC,IAAI,IAAI,CAAC;MAC5C,QAAQ,CAAC,aAAa,GAAG,CAAC;IAC5B;IACA,OAAO;MACL,SAAS,EAAE,KAAK;MAEhB,KAAK,EAAE,KAAK;MAEZ,SAAS,EAAE,KAAK;MAChB,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,IAAI;MACrC,aAAa,EAAE,QAAQ,CAAC,aAAa,IAAI,uEAAmB,CAAC,CAAC;MAC9D,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB,KAAK,SAAS,GACvD,sEAAkB,CAAC,CAAC,GAAG,QAAQ,CAAC,gBAAgB;MAClD,aAAa,EAAE,eAAe;MAE9B,aAAa,EAAE,CAAC,QAAQ,CAAC,gBAAgB;MACzC,aAAa,EAAE,KAAK;MAEpB,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,6DAAoB;MACzD,iBAAiB,EAAE,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO;MAE/F,SAAS,EAAE,QAAQ,CAAC,SAAS;MAC7B,aAAa,EAAE,QAAQ,CAAC,aAAa;MACrC,aAAa,EAAE,CAAC;MAEhB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,0DAAiB;MAEhD,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,OAAO;MAE5C,aAAa,EAAE,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa;MAElD,oBAAoB,EAAE,CAAC,sEAAkB,CAAC,CAAC,IAAI,+DAAW,CAAC,CAAC,KACzD,OAAO,uDAAe,IAAI,WAAY,IAAK,OAAO,SAAS,IAAI,WAAY,IAC3E,OAAO,aAAa,IAAI,WAAY;MACvC,aAAa,EAAE,OAAO,GAAG,8DAAgB,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,IAAI;MAE5E,kBAAkB,EAAE,CAAC,QAAQ,CAAC,MAAM;MAEpC,SAAS,EAAE,EAAE;MACb,UAAU,EAAE,IAAI;MAChB,WAAW,EAAE,SAAS;MACtB,eAAe,EAAE,IAAI;MAErB,iBAAiB,EAAE,QAAQ;MAC3B,eAAe,EAAE,CAAC,CAAC;MACnB,cAAc,EAAE,IAAI;MACpB,eAAe,EAAE,IAAI;MACrB,eAAe,EAAE,EAAE;MACnB,kBAAkB,EAAE,KAAK;MAEzB,KAAK,EAAE,EAAE;MACT,QAAQ,EAAE,EAAE;MACZ,OAAO,EAAE,OAAO;MAChB,QAAQ,EAAE,IAAI;MACd,cAAc,EAAE,SAAS,CAAC,MAAM;MAChC,aAAa,EAAE,EAAE;MACjB,mBAAmB,EAAE,KAAK;MAC1B,gBAAgB,EAAE,IAAI;MACtB,cAAc,EAAE,IAAI;MACpB,aAAa,EAAE,KAAK;MACpB,aAAa,EAAG,MAAM,CAAC,UAAU,IAAI,yDAAiB;MACtD,SAAS,EAAE,SAAS;MACpB,WAAW,EAAE,WAAW;MAGxB,SAAS,EAAE,SAAS;MACpB,SAAS,EAAE,2DAAe;MAC1B,aAAa,EAAE,SAAS;MAGxB,eAAe,EAAE,KAAK;MAEtB,kBAAkB,EAAE,KAAK;MACzB,iBAAiB,EAAE,IAAI;MACvB,kBAAkB,EAAE,IAAI;MACxB,iBAAiB,EAAE,IAAI;MACvB,gBAAgB,EAAE,EAAE;MAEpB,oBAAoB,EAAE,KAAK;MAC3B,cAAc,EAAE,IAAI;MAGpB,UAAU,EAAE,KAAK;MACjB,eAAe,EAAE,IAAI;MACrB,YAAY,EAAE,EAAE;MAChB,mBAAmB,EAAE,KAAK;MAK1B,WAAW,EAAE,KAAK;MAIlB,gBAAgB,EAAE,IAAI;MAGtB,YAAY,EAAE,KAAK;MACnB,WAAW,EAAE,CAAC,CAAC;MAGf,QAAQ,EAAE,EAAE;MAEZ,aAAa,EAAE,EAAE;MAEjB,kBAAkB,EAAE,EAAE;MAEtB,aAAa,EAAE,SAAS;MACxB,UAAU,EAAE,SAAS;MACrB,QAAQ,EAAE,SAAS;MACnB,SAAS,EAAE,SAAS;MAEpB,cAAc,EAAE;IAClB,CAAC;EACH;EAEA,iBAAiB,GAAG;IAClB,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC;IACpD,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI;MAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;IAAE,CAAC;IACvD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC;IACtD,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI;MAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;IAAE,CAAC;IACzD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC;IACxD,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC;IAC3D,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,uBAAuB,CAAC;IAG1G,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,IAAI,CAAC,qBAAqB,CAAC;IAGzE,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC;IAE1D,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW;IACrH,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC;IAE7F,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,EAClG,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;IAG3F,IAAI,OAAO,gBAAgB,IAAI,UAAU,EAAE;MACzC,MAAM,oBAAoB,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC;MAC9D,oBAAoB,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC;IAC1E,CAAC,MAAM;MAEL,OAAO,CAAC,IAAI,CAAC,qFAAqF,CAAC;IACrG;IAIA,IAAI,CAAC,eAAe,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC,IAAI;MACnC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;MAChC,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,GAAG,wDAAe,EAAE;QAEhD,IAAI,CAAC,cAAc,CAAC,CAAC;MACvB;MACA,IAAI,CAAC,eAAe,GAAG,GAAG;IAC5B,CAAC,EAAE,qDAAY,CAAC;IAEhB,IAAI,CAAC,QAAQ,CAAC;MACZ,aAAa,EAAE,QAAQ,CAAC,eAAe,CAAC,WAAW;MACnD,cAAc,EAAE,QAAQ,CAAC,eAAe,CAAC;IAC3C,CAAC,CAAC;IAEF,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;MAM/B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EACzG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;MACtD,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe;MAC5C,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB;MAChD,IAAI,CAAC,MAAM,CAAC,wBAAwB,GAAG,IAAI,CAAC,4BAA4B;MACxE,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB;MAClD,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB;IACpD,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAEX,IAAI,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE;QACnC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAGlC,CAAC,CAAC;MACJ;MAGA,IAAI,CAAC,gBAAgB,CAAC,CAAC;MAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,8DAAgB,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,SAAS;MACvF,IAAI,KAAK,EAAE;QACT,IAAI,CAAC,QAAQ,CAAC;UAAC,SAAS,EAAE;QAAI,CAAC,CAAC;QAGhC,KAAK,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;UAEjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;QACtC,CAAC,CAAC;MACJ;MAGA,MAAM,SAAS,GAAG,2DAAc,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;MAEnE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QAEvE,IAAI,CAAC,QAAQ,CAAC;UAAC,cAAc,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,SAAS,GACzD,2DAAc,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,GACvE,EAAE;QACJ,2DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;MACjC,CAAC,MAAM;QACL,IAAI,CAAC,eAAe,CAAC,CAAC;MACxB;IACF,CAAC,CAAC;EACJ;EAEA,oBAAoB,GAAG;IACrB,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC;IACvD,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC;IAC9D,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC;IACzD,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC;IAC3D,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,uBAAuB,CAAC;IAC7G,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,CAAC,qBAAqB,CAAC;IAC5E,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC;IAE7D,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC;EAClC;EAGA,OAAO,OAAO,CAAC,aAAa,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE;IACpG,MAAM,MAAM,GAAG,IAAI,8CAAM,CAAC;MAAC,OAAO,EAAE,iDAAQ;MAAE,IAAI,EAAE,aAAa;MAAE,MAAM,EAAE,gDAAO;MAAE,SAAS,EAAE,SAAS;MACtG,MAAM,EAAE,gBAAgB;MAAE,OAAO,EAAE;IAAe,CAAC,EAAE,gBAAgB,CAAC;IACxE,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC;IAC/B,MAAM,CAAC,aAAa,CAAC,wDAAe,EAAE,IAAI,CAAC;IAC3C,SAAS,CAAC,oBAAoB,CAAC,MAAM,CAAC;IACtC,OAAO,MAAM;EACf;EAQA,OAAO,oBAAoB,CAAC,MAAM,EAAE;IAClC,MAAM,IAAI,GAAG,MAAM,IAAI,MAAM,CAAC,WAAW;IACzC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE;MACjC;IACF;IACA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IACzC,IAAI,CAAC,QAAQ,GAAG,GAAG,IAAI;MACrB,IAAI,OAAO,GAAG,IAAI,QAAQ,KAAK,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE;QACvF,IAAI;UACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;UAC9B,IAAI,MAAM,CAAC,EAAE,EAAE;YACb,MAAM,MAAM,GAAG,iEAAgB,CAAC,CAAC;YACjC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE;cACzB,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI;cAC9B,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAC9B;UACF,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,iBAAiB,EAAE;YACjD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,iBAAiB,CAAC;YACnD,MAAM,CAAC,iBAAiB,GAAG,IAAI;YAC/B,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;UAC9B;QACF,CAAC,CAAC,OAAO,CAAC,EAAE,CAEZ;MACF;MACA,OAAO,QAAQ,CAAC,GAAG,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,eAAe,GAAG,IAAI;EAC7B;EAGA,iBAAiB,CAAC,OAAO,EAAE;IACzB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;EACjD;EAEA,eAAe,GAAG;IAChB,MAAM;MAAC,aAAa;MAAE;IAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;IAC/C,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK;MAC5B,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;MACvB,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAC;MACjE,IAAI,CAAC,QAAQ,CAAC;QAAC,aAAa,EAAE;MAAI,CAAC,CAAC;MACpC,8DAAgB,CAAC,YAAY,CAAC,UAAU,EAAE;QAAC,aAAa,EAAE;MAAK,CAAC,CAAC;IACnE,CAAC;IAED,IAAI;MACF,IAAI,CAAC,GAAG,GAAG,gEAAoB,CAAC,2DAAe,CAAC,aAAa,EAAE,sDAAa,CAAC,CAAC;MAC9E,OAAO,SAAS,CAAC,aAAa,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;QAC/E,OAAO,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;UAC/E,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;UAC3B,OAAO,GAAG;QACZ,CAAC,CAAC;MACJ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;QAEb,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC;UAAC,MAAM,EAAE,MAAM;UAAE,OAAO,EAAE,yDAAe;QAAA,CAAC,CAAC,CAAC;QAEtG,OAAO,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC;MACjD,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI;QACf,MAAM,OAAO,GAAG,8DAAgB,CAAC,SAAS,CAAC,gBAAgB,CAAC;QAC5D,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;UACrC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC;UACjC,IAAI,OAAO,EAAE;YACX,8DAAgB,CAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC;UACrD;QACF;QACA,IAAI,CAAC,QAAQ,CAAC;UAAC,aAAa,EAAE,KAAK;UAAE,aAAa,EAAE;QAAI,CAAC,CAAC;QAC1D,IAAI,OAAO,EAAE;UACX,8DAAgB,CAAC,YAAY,CAAC,UAAU,EAAE;YAAC,aAAa,EAAE;UAAI,CAAC,CAAC;QAClE;QAKA,6DAAiB,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI;UAAE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;QAAE,CAAC,CAAC;MAC9E,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;QAEd,OAAO,CAAC,GAAG,CAAC;QACZ,MAAM,GAAG;MACX,CAAC,CAAC;IACJ,CAAC,CAAC,OAAO,GAAG,EAAE;MACZ,OAAO,CAAC,GAAG,CAAC;MACZ,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;IAC5B;EACF;EAGA,OAAO,eAAe,CAAC,GAAG,EAAE,EAAE,EAAE;IAC9B,OAAO,4DAAgB,CAAC,GAAG,EAAE;MAC3B,yBAAyB,EAAE,EAAE;MAC7B,QAAQ,EAAE,aAAa,CAAC;IAC1B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI;MACf,IAAI,KAAK,EAAE;QACT,OAAO,KAAK;MACd,CAAC,MAAM,IAAI,OAAO,YAAY,IAAI,WAAW,EAAE;QAE7C,OAAO,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI;UACzD,IAAI,UAAU,KAAK,SAAS,EAAE;YAC5B,OAAO,4DAAgB,CAAC,GAAG,EAAE;cAC3B,yBAAyB,EAAE,EAAE;cAC7B,QAAQ,EAAE,aAAa,CAAC;YAC1B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI;cACf,IAAI,KAAK,EAAE;gBACT,OAAO,KAAK;cACd,CAAC,MAAM;gBACL,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC;cACvD;YACF,CAAC,CAAC;UACJ,CAAC,MAAM;YACL,MAAM,IAAI,KAAK,CAAC,uCAAuC,GAAG,UAAU,CAAC;UACvE;QACF,CAAC,CAAC;MACJ;MACA,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC;IACpD,CAAC,CAAC;EACJ;EAEA,YAAY,GAAG;IACb,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC,WAAW,IAAI,yDAAgB;IACvE,IAAI,CAAC,QAAQ,CAAC;MACZ,aAAa,EAAE,QAAQ,CAAC,eAAe,CAAC,WAAW;MACnD,cAAc,EAAE,QAAQ,CAAC,eAAe,CAAC;IAC3C,CAAC,CAAC;IACF,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,MAAM,EAAE;MACtC,IAAI,CAAC,QAAQ,CAAC;QAAC,aAAa,EAAE;MAAM,CAAC,CAAC;IACxC;EACF;EAEA,eAAe,CAAC,CAAC,EAAE;IACjB,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE,EAAE;MAE1C,IAAI,CAAC,QAAQ,CAAC;QACZ,aAAa,EAAE,IAAI;QACnB,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,WAAW;QACxB,mBAAmB,EAAE,KAAK;QAC1B,gBAAgB,EAAE,IAAI;QACtB,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,IAAI;QACpB,kBAAkB,EAAE,KAAK;QACzB,oBAAoB,EAAE,KAAK;QAC3B,YAAY,EAAE;MAChB,CAAC,CAAC;MAEF,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACjE;EACF;EAGA,iBAAiB,CAAC,GAAG,EAAE;IACrB,GAAG,CAAC,aAAa,GAAG,CAAC,IAAI;MACvB,MAAM,gBAAgB,GAAG,GAAG,CAAC,UAAU;MACvC,gBAAgB,CAAC,aAAa,GAAG,CAAC,IAAI;QACpC,IAAI,gBAAgB,CAAC,KAAK,IAAI,WAAW,IAAI,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE;UAC/E,MAAM,GAAG,GAAG;YAAA,WACV,+DAAC,wDAAgB;cAAC,EAAE,EAAC,kBAAkB;cACrC,cAAc,EAAC,mBAAmB;cAClC,WAAW,EAAC;YAAgD,gBAAE,CAAC,KAAC;cAAG,IAAI,EAAC,EAAE;cAAA,UAC1E,+DAAC,wDAAgB;gBAAC,EAAE,EAAC,eAAe;gBAClC,cAAc,EAAC,QAAQ;gBACvB,WAAW,EAAC;cAAgE,gBAAE;YAAC,gBAChF,CAAC,KAAC;UAAA,eAAE,CAAC;UACV,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC;QAC/B;MACF,CAAC;IACH,CAAC;EACH;EAGA,eAAe,GAAG;IAChB,MAAM,IAAI,GAAG,2DAAc,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;IAE9D,MAAM,QAAQ,GAAG;MACf,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;MAC3B,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC;IACnC,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;MAErC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;QAC3C,QAAQ,CAAC,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM;MACxC,CAAC,MAAM;QACL,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;MACtD;MAGA,IAAI,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI;MACpC,IAAI,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;QACzC,IAAI,CAAC,8CAAM,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;UAEhC,SAAS,GAAG,IAAI;UAChB,QAAQ,CAAC,WAAW,GAAG,WAAW;QACpC,CAAC,MAAM;UAEL,QAAQ,CAAC,WAAW,GAAG,YAAY;QACrC;QACA,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;UACtB,aAAa,EAAE,SAAS;UACxB,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS;QAC5D,CAAC,CAAC;MACJ;IACF,CAAC,MAAM;MAEL,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;QAAC,iBAAiB,EAAE,EAAE;QAAE,eAAe,EAAE,CAAC,CAAC;QAAE,aAAa,EAAE;MAAI,CAAC,CAAC;IAC5F;IAGA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;MACtB,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;IAC1C;IACA,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;MACpB,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI;IACtC;IACA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;MACrB,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK;IACxC;IAGA,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;MACzB,MAAM,CAAC,MAAM,CAAC,QAAQ,EACpB,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EAAE,MAAM,CAAC,CAAC;IACzG;IAEA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;EACzB;EAEA,YAAY,CAAC,MAAM,EAAE;IACnB,IAAI,MAAM,EAAE;MACV,IAAI,CAAC,WAAW,CAAC,CAAC;MAClB,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC;MACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC,MAAM;MACL,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IACjF;IACA,IAAI,CAAC,QAAQ,CAAC;MAAC,cAAc,EAAE;IAAM,CAAC,CAAC;EACzC;EAEA,qBAAqB,GAAG;IACtB,IAAI,CAAC,QAAQ,CAAC;MAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC;IAAM,CAAC,CAAC;EACvD;EAEA,OAAO,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE;IACnD,OAAO;MACL,SAAS,EAAE,GAAG;MACd,UAAU,EAAE,KAAK;MACjB,WAAW,EAAE,MAAM;MACnB,eAAe,EAAE,UAAU;MAC3B,eAAe,EAAE;IACnB,CAAC;EACH;EAEA,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE;IAC1C,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;EACxE;EAGA,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE;IAClC,IAAI,CAAC,QAAQ,CAAC;MACZ,aAAa,EAAE,IAAI;MACnB,KAAK,EAAE,KAAK;MACZ,QAAQ,EAAE,QAAQ;MAClB,kBAAkB,EAAE,IAAI;MACxB,SAAS,EAAE;IACb,CAAC,CAAC;IACF,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC;IAE1B,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE;MAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;QAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;QAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;MAAQ,CAAC,CAAC;IAC/F,CAAC,MAAM;MACL,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;QAEjC,IAAI,CAAC,QAAQ,CAAC;UAAC,aAAa,EAAE,KAAK;UAAE,SAAS,EAAE,KAAK;UAAE,kBAAkB,EAAE;QAAK,CAAC,CAAC;QAClF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;MACtC,CAAC,CAAC;IACJ;IAEA,IAAI,IAAI,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;MAGhE,IAAI,CAAC,eAAe,CAAC,CAAC;IACxB;EACF;EAGA,uBAAuB,CAAC,OAAO,EAAE;IAC/B,IAAI,OAAO,EAAE;MACX,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;QAClC,8DAAgB,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC;UAAC,OAAO,EAAE;QAAI,CAAC,CAAC;MAChC,CAAC,CAAC;IACJ,CAAC,MAAM;MACL,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;QACnC,8DAAgB,CAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC;QACnD,IAAI,CAAC,QAAQ,CAAC;UAAC,OAAO,EAAE;QAAK,CAAC,CAAC;MACjC,CAAC,CAAC;IACJ;EACF;EAGA,eAAe,GAAG;IAEhB,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC;IACtC,IAAI,CAAC,WAAW,CAAC,CAAC;IAElB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC;MACZ,aAAa,EAAE,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC;MAExE,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI;IAC3D,CAAC,CAAC;IAEF,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;MACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EACtD;QAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;QAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC;MAAQ,CAAC,CAAC;IAC7D;EACF;EAGA,4BAA4B,CAAC,GAAG,EAAE,IAAI,EAAE;IACtC,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC;IAEtC,IAAI,GAAG,GAAG,CAAC,EAAE;MAEX,IAAI,CAAC,WAAW,CAAC,CAAC;MAClB;IACF;IAEA,IAAI,IAAI,EAAE;MAER,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI;QAEb,IAAI,CAAC,WAAW,CAAC,CAAC;MACpB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;QACd,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;MACtC,CAAC,CAAC;MACF;IACF;IAEA,MAAM;MAAC;IAAa,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;IACvC,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI;IACtB,KAAK,GAAG,KAAK,GAAG,KAAK;IACrB,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC,CAAC,IAAI;MACzC,IAAI,KAAK,GAAG,CAAC,EAAE,EAAE;QAEf,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvB;MACF;MAEA,MAAM,OAAO,GAAI,KAAK,GAAG,EAAE,GAAI,iEAAa,CAAC,KAAK,CAAC,GAAG,KAAK;MAC3D,IAAI,CAAC,WAAW,CACd,aAAa,CAAC,QAAQ,CAAC,mBAAmB,EAAE;QAAC,OAAO,EAAE;MAAO,CAAC,CAAC,EAC/D,MAAM,EACN,CAAC,IAAI;QACH,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;MACzB,CAAC,EACD,aAAa,CAAC,QAAQ,CAAC,aAAa,CACtC,CAAC;MACD,KAAK,IAAI,CAAC;IACZ,CAAC,EAAE,IAAI,CAAC;EACV;EAMA,gBAAgB,CAAC,GAAG,EAAE;IACpB,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC;MACZ,SAAS,EAAE,KAAK;MAChB,KAAK,EAAE,KAAK;MACZ,mBAAmB,EAAE,KAAK;MAC1B,SAAS,EAAE,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,GAAG,cAAc,CAAC;MACvE,UAAU,EAAE,GAAG,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,GAAG,MAAM;MAC/C,aAAa,EAAE,KAAK;MACpB,kBAAkB,EAAE,KAAK;MACzB,oBAAoB,EAAE,KAAK;MAC3B,aAAa,EAAE;IACjB,CAAC,CAAC;EACJ;EAEA,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;IACvC,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE;MAEjC,2DAAc,CAAC,UAAU,CAAC,EAAE,CAAC;MAC7B;IACF;IAEA,IAAI,KAAK,GAAG,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK;IAChE,IAAI,EAAE,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE;MAGlC,2DAAc,CAAC,UAAU,CAAC,EAAE,CAAC;MAC7B,IAAI,CAAC,QAAQ,CAAC;QAAC,aAAa,EAAE;MAAK,CAAC,CAAC;MACrC;IACF;IAGA,IAAI,GAAG,8CAAM,CAAC,UAAU,CAAC,IAAI,CAAC;IAE9B,IAAI,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE7F,IAAI,YAAY;IAChB,IAAI,KAAK,IAAI,QAAQ,EAAE;MACrB,KAAK,GAAG,IAAI;MACZ,IAAI,CAAC,QAAQ,CAAC;QAAC,QAAQ,EAAE;MAAI,CAAC,CAAC;MAC/B,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3F,CAAC,MAAM;MACL,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACjF;IAEA,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI;MACxB,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,KAAK,sBAAsB,EAAE;QAC5D,IAAI,CAAC,QAAQ,CAAC;UAAC,kBAAkB,EAAE;QAAK,CAAC,CAAC;QAC1C,IAAI,IAAI,EAAE;UACR,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;QACtF;QACA,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;UAC9D,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;QACvE;MACF,CAAC,MAAM;QACL,IAAI,CAAC,qBAAqB,CAAC,CAAC;MAC9B;IACF,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MACd,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG;MAEjC,IAAI,CAAC,QAAQ,CAAC;QACZ,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,SAAS;QACnB,kBAAkB,EAAE,KAAK;QACzB,SAAS,EAAE;MACb,CAAC,CAAC;MACF,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;MAC/C,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC;MACjC,IAAI,CAAC,SAAS,EAAE;QACd,IAAI,KAAK,EAAE;UAET,IAAI,CAAC,YAAY,CAAC,CAAC;UACnB,2DAAc,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B;MAKF;IACF,CAAC,CAAC;EACJ;EASA,OAAO,yBAAyB,CAAC,MAAM,EAAE;IACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE;MACtD,OAAO,KAAK;IACd;IACA,MAAM,MAAM,GAAG,2DAAc,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;IAChE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM;IACvB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK;IACrC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI;IACnC,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACpF,OAAO,IAAI;EACb;EAEA,qBAAqB,GAAG;IACtB,IAAI,CAAC,WAAW,CAAC,CAAC;IAGlB,IAAI,8DAAgB,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE;MAChD,8DAAgB,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IACtE;IAIA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC5C,cAAc,CAAC,OAAO,CAAC,kBAAkB,EAAE,SAAS,GAAG,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC;IAI5E,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa;IAEvE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,EAAE,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY;IACjC,EAAE,CAAC,eAAe,GAAG,IAAI,CAAC,iBAAiB;IAC3C,EAAE,CAAC,aAAa,GAAG,IAAI,CAAC,eAAe;IACvC,IAAI,CAAC,QAAQ,CAAC;MACZ,SAAS,EAAE,IAAI;MACf,UAAU,EAAE,SAAS;MACrB,QAAQ,EAAE,SAAS;MACnB,SAAS,EAAE,SAAS;MACpB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;MACxC,SAAS,EAAE,IAAI;MACf,cAAc,EAAE;IAClB,CAAC,CAAC;IAEF,EAAE,CAAC,SAAS,CACV,EAAE,CAAC,cAAc,CAAC,CAAC,CACjB,YAAY,CAAC,CAAC,CACd,QAAQ,CAAC,CAAC,CACV,QAAQ,CAAC,CAAC,CACV,QAAQ,CAAC,CAAC,CACV,KAAK,CAAC,CACR,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MACb,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;MACxB,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC;MACrC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;MACpC,2DAAc,CAAC,UAAU,CAAC,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI;MACd,IAAI,CAAC,QAAQ,CAAC;QAAC,kBAAkB,EAAE;MAAK,CAAC,CAAC;IAC5C,CAAC,CAAC;IAQJ,MAAM,WAAW,GAAG,2DAAc,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7E,MAAM,gBAAgB,GAAG,CAAC,WAAW,IAAI,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,IAC5E,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC;IACzC,IAAI,OAAO,GAAG,gBAAgB,GAC5B,2DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI;IAC1F,IAAI,SAAS,EAAE;MACb,OAAO,GAAG,2DAAc,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC;IAC1D;IACA,2DAAc,CAAC,UAAU,CAAC,OAAO,CAAC;EACpC;EAEA,YAAY,CAAC,IAAI,EAAE;IACjB,IAAI,CAAC,IAAI,EAAE;MACT;IACF;IAEA,IAAI,IAAI,CAAC,MAAM,EAAE;MACf,IAAI,CAAC,QAAQ,CAAC;QACZ,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;QAC9B,eAAe,EAAE,mEAAY,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;MACjD,CAAC,CAAC;IACJ;IAEA,IAAI,IAAI,CAAC,OAAO,EAAE;MAChB,MAAM,MAAM,GAAG,EAAE;MACjB,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;QACrD,IAAI,GAAG,EAAE;UACP,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAClB;MACF;MACA,IAAI,CAAC,QAAQ,CAAC;QACZ,eAAe,EAAE;MACnB,CAAC,CAAC;IACJ;IAEA,IAAI,IAAI,CAAC,GAAG,EAAE;MACZ,IAAI,CAAC,QAAQ,CAAC;QACZ,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;MACvC,CAAC,CAAC;IACJ;IAEA,IAAI,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;MAC3D,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACzB;EACF;EAGA,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE;IAC5B,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,EAAE;MACjC,IAAI,CAAC,gBAAgB,CAAC,CAAC;MACvB,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,EAAE;QAC1C,IAAI,CAAC,QAAQ,CAAC;UAAC,mBAAmB,EAAG,IAAI,IAAI;QAAK,CAAC,CAAC;MACtD;IACF,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE;MACzB,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACzB,CAAC,MAAM,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;MAEhC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;MAC9C,MAAM,QAAQ,GAAG,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;MAG5C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,QAAQ,EAAE;QAE5D,IAAI,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,EAAE;UAC7D,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAE5B,CAAC,CAAC;QACJ;MACF;MAEA,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACzB,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE,CAE3B,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,EAAE;MAG5C,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,EAAE;QAC1C,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;MAChC;MAEA,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACzB,CAAC,MAAM,IAAI,IAAI,IAAI,KAAK,EAAE;MAGxB,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,EAAE;QAC1C,IAAI,CAAC,QAAQ,CAAC;UAAC,gBAAgB,EAAE,IAAI,CAAC;QAAG,CAAC,CAAC;MAC7C;IACF,CAAC,MAAM,IAAI,IAAI,IAAI,KAAK,EAAE,CAE1B,CAAC,MAAM,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,EAAE,CAE5C,CAAC,MAAM;MAGL,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC;IACpF;EACF;EAEA,eAAe,CAAC,MAAM,EAAE;IACtB,IAAI,CAAC,gBAAgB,CAAC,CAAC;EACzB;EAIA,OAAO,yBAAyB,CAAC,QAAQ,EAAE,aAAa,EAAE;IACxD,MAAM,MAAM,GAAG,CAAC,CAAC;IAIjB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE;MACxB,IAAI,8CAAM,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;QAChC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;UAChB,IAAI,EAAE,CAAC,CAAC,KAAK;UACb,OAAO,EAAE,CAAC,CAAC,OAAO;UAClB,MAAM,EAAE,CAAC,CAAC,MAAM;UAChB,OAAO,EAAE,CAAC,CAAC,OAAO;UAClB,GAAG,EAAE,CAAC,CAAC;QACT,CAAC;MACL;IACF;IAGA,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE;MAC7B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;QACnB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;MACpB;IACF;IAEA,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;EAC9B;EAEA,gBAAgB,GAAG;IACjB,MAAM,QAAQ,GAAG;MACf,QAAQ,EAAE;IACZ,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;MACrB,QAAQ,CAAC,KAAK,GAAG,IAAI;IACvB;IAEA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI;MACf,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;QAEvB,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI;MAClB;MAEA,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;MACzB,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,KAAK,EAAE;QACvC,QAAQ,CAAC,mBAAmB,GAAG,CAAC,CAAC,MAAM;QACvC,QAAQ,CAAC,gBAAgB,GAAG,CAAC,CAAC,GAAG;MACnC;IACF,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK;MAE/B,MAAM,IAAI,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC;MAEtE,OAAO,IAAI,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,EAAE,OAAO,CAAC,CAAC;IACzF,CAAC,CAAC;IAGF,QAAQ,CAAC,kBAAkB,GAAG,SAAS,CAAC,yBAAyB,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;IAC9G,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;EACzB;EAEA,OAAO,kBAAkB,CAAC,EAAE,EAAE,QAAQ,EAAE;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;MACxC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;MACrB,IAAI,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;QAC7C,OAAO,IAAI;MACb;IACF;IACA,OAAO,KAAK;EACd;EAGA,UAAU,GAAG;IACX,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACrC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB;IACzC,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE;MACtB,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACzB,CAAC,MAAM;MACL,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;QACjE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;MACtC,CAAC,CAAC;IACJ;EACF;EAEA,gBAAgB,GAAG;IACjB,MAAM,aAAa,GAAG,EAAE;IAExB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAE,CAAC,IAAK;MACxC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC;MACZ,aAAa,EAAE,aAAa;MAC5B,kBAAkB,EAAE,SAAS,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa;IAC5F,CAAC,CAAC;EACJ;EAKA,oBAAoB,CAAC,KAAK,EAAE;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACrC,GAAG,CAAC,OAAO,CAAC;MAAC,IAAI,EAAE;QAAC,MAAM,EAAE;MAAK;IAAC,CAAC,CAAC,CACjC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAC9D,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;EACvD;EAGA,mBAAmB,CAAC,SAAS,EAAE;IAE7B,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,IAAI,SAAS,EAAE;MAClF,IAAI,CAAC,QAAQ,CAAC;QACZ,cAAc,EAAE;MAClB,CAAC,CAAC;IACJ;IAEA,IAAI,SAAS,EAAE;MACb,IAAI,CAAC,QAAQ,CAAC;QACZ,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,YAAY;QACzB,SAAS,EAAE;MACb,CAAC,CAAC;MAEF,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,SAAS,EAAE;QACzC,IAAI,CAAC,QAAQ,CAAC;UACZ,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC;UACzD,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC;UAC3D,cAAc,EAAE;QAClB,CAAC,CAAC;QACF,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;MACtE;IACF,CAAC,MAAM;MAEL,IAAI,CAAC,QAAQ,CAAC;QACZ,aAAa,EAAE,IAAI;QACnB,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,WAAW;QACxB,mBAAmB,EAAE,KAAK;QAC1B,gBAAgB,EAAE,IAAI;QACtB,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE;MAClB,CAAC,CAAC;MAEF,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACjE;EACF;EAGA,sBAAsB,GAAG;IACvB,IAAI,CAAC,QAAQ,CAAC;MACZ,WAAW,EAAE;IACf,CAAC,CAAC;IACF,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;EACnF;EAQA,iBAAiB,CAAC,GAAG,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;IAC5D,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,CAAC;EACrF;EAEA,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE;IACtE,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC;IAErC,GAAG,CAAC,SAAS,GAAG,QAAQ;IAExB,IAAI,IAAI,EAAE;MACR,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;IAChD;IAEA,MAAM,UAAU,GAAG,EAAE;IACrB,IAAI,uBAAuB,EAAE;MAC3B,UAAU,CAAC,IAAI,CAAC,uBAAuB,CAAC;IAC1C;IAEA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE;MAEzB,MAAM,gBAAgB,GACpB,KAAK,CAAC,SAAS,CAAC,CAAC,CACd,IAAI,CAAC,CAAC,IAAI;QAGT,IAAI,KAAK,GAAG,EAAE;QACd,KAAK,CAAC,cAAc,CAAC,GAAG,IAAI;UAC1B,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE;YACtC;UACF;UACA,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE;YAE/B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YACnB;UACF;UACA,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE;YACxB,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC;UAC3B;QACF,CAAC,CAAC;QACF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;UACpB,KAAK,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC;QACpC;MACF,CAAC,CAAC;MACN,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACnC;IAGA,OAAO,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CACpD,IAAI,CAAC,IAAI,IAAI;MACZ,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE;QACtB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;MACtB;MACA,OAAO,IAAI;IACb,CAAC,CAAC,CACD,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;EACvD;EAEA,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,QAAQ,GAAG,IAAI;IACnB,QAAQ,MAAM;MACZ,KAAK,QAAQ;QAEX,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7C,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;UAAC,GAAG,EAAE;YAAC,IAAI,EAAE;UAAI;QAAC,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE;UAGrB,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC;YAAC,GAAG,EAAE;cAAC,IAAI,EAAE,SAAS;cAAE,IAAI,EAAE;YAAI;UAAC,CAAC,CAAC,CAAC;QACpF;QACA;MACF,KAAK,QAAQ;QAEX,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC/B;MACF,KAAK,OAAO;QAGV,MAAM,EAAE,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;QAC5D,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;UAAC,GAAG,EAAE;YAAC,IAAI,EAAE;UAAE;QAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACrF;MACF;QACE,OAAO,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC;IAClE;IAEA,IAAI,QAAQ,IAAI,IAAI,EAAE;MACpB,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7D;EACF;EAGA,gBAAgB,GAAG;IACjB,IAAI,CAAC,WAAW,CAAC,CAAC;IAElB,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;EAC7F;EAGA,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;IAEhE,IAAI,CAAC,WAAW,CAAC,CAAC;IAElB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAC1C,IAAI,CAAC,CAAC,IAAI;MACT,IAAI,WAAW;MACf,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE;QACjD,WAAW,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;MACnC;MACA,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,EACrD;QAAC,MAAM,EAAE,OAAO;QAAE,IAAI,EAAE,KAAK;QAAE,IAAI,EAAE,8CAAM,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,WAAW,EAAE;MAAW,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MACd,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,sBAAsB,EAAE;QAC3D,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;UACrD,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;QACvE;MACF,CAAC,MAAM;QACL,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;MAClC;IACF,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MACd,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;IACtC,CAAC,CAAC;EACN;EAcA,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE;IACpE,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAG,KAAK;IACrC,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,uDAAO,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC;EACpF;EAEA,yBAAyB,CAAC,EAAE,EAAE;IAE5B,IAAI,CAAC,QAAQ,CAAC;MAAC,aAAa,EAAE;IAAI,CAAC,CAAC;IAEpC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;IACpE,EAAE,CAAC,OAAO,CAAC;MAAC,GAAG,EAAE;QAAC,IAAI,EAAE;MAAE;IAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MAEzC,IAAI,CAAC,QAAQ,CAAC;QAAC,aAAa,EAAE,CAAC;MAAE,CAAC,CAAC;MACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;IACtC,CAAC,CAAC;EACJ;EAGA,uBAAuB,CAAC,MAAM,EAAE;IAC9B,IAAI,CAAC,QAAQ,CAAC;MAAC,WAAW,EAAE;IAAM,CAAC,CAAC;IACpC,8DAAgB,CAAC,YAAY,CAAC,UAAU,EAAE;MAAC,WAAW,EAAE;IAAM,CAAC,CAAC;IAChE,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,IAAI,MAAM,GAAG,YAAY,GAAG,MAAM;IACrF,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;EACvF;EAGA,uBAAuB,CAAC,KAAK,EAAE;IAC7B,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO;IACrD,IAAI,CAAC,QAAQ,CAAC;MAAC,iBAAiB,EAAE;IAAY,CAAC,CAAC;IAChD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;EACvF;EAEA,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE;IAC3C,MAAM,eAAe,GAAG,MAAM,IAAI,MAAM,GAAG,YAAY,GAAG,MAAM;IAChE,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,eAAe,IAAI,MAAM,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;IAC/G,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,EAAE,eAAe,IAAI,MAAM,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,GAAG,CAAC;EACxH;EAEA,sBAAsB,GAAG;IACvB,IAAI,CAAC,WAAW,CAAC,CAAC;IAClB,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;EAC/F;EAEA,sBAAsB,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE;IAC7D,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,iBAAiB,EAAE,QAAQ,SAAS,IAAI,CAAC;IACpF,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,IAAI,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC/F,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,GAAG,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC;IAC1F,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,OAAO,CAAC;IAC5F,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,sBAAsB,EAAE,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7F,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,eAAe,IAAI,MAAM,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;IAC/G,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,EAAE,eAAe,IAAI,MAAM,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,GAAG,CAAC;EACxH;EAEA,uBAAuB,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;IAC7C,IAAI,CAAC,WAAW,CAAC,CAAC;IAClB,8DAAgB,CAAC,YAAY,CAAC,UAAU,EAAE;MAAC,SAAS,EAAE,SAAS;MAAE,aAAa,EAAE,IAAI;MAAE,aAAa,EAAE;IAAI,CAAC,CAAC;IAC3G,IAAI,CAAC,QAAQ,CAAC;MAAC,SAAS,EAAE,SAAS;MAAE,aAAa,EAAE,IAAI;MAAE,aAAa,EAAE;IAAI,CAAC,CAAC;IAC/E,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAC/C,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;EAC7F;EAEA,oBAAoB,CAAC,IAAI,EAAE;IACzB,IAAI,CAAC,QAAQ,CAAC;MAAC,QAAQ,EAAE,IAAI,GAAG;IAAC,CAAC,CAAC;IACnC,8DAAgB,CAAC,YAAY,CAAC,UAAU,EAAE;MAAC,QAAQ,EAAE;IAAI,CAAC,CAAC;IAC3D,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,EAAE,GAAG,IAAI,IAAI,CAAC;EAChF;EAEA,iBAAiB,CAAC,MAAM,EAAE;IACxB,IAAI,CAAC,QAAQ,CAAC;MAAC,WAAW,EAAE;IAAM,CAAC,CAAC;IACpC,8DAAgB,CAAC,YAAY,CAAC,UAAU,EAAE;MAAC,WAAW,EAAE;IAAM,CAAC,CAAC;EAClE;EAEA,8BAA8B,CAAC,CAAC,EAAE,IAAI,EAAE;IACtC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;MAAC,IAAI,EAAE;IAAI,CAAC,CAAC,CAC3C,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;EACvD;EAGA,cAAc,GAAG;IACf,IAAI,CAAC,WAAW,CAAC,CAAC;IAElB,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAC3E,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC,CAAC;EAC/C;EAGA,oBAAoB,CAAC,QAAQ,EAAE;IAC7B,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa;IACxE,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS;IAC5D,MAAM,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,KAAK,SAAS,GAC9D,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB;IACzD,IAAI,IAAI,CAAC,MAAM,EAAE;MACf,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;MAC1B,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,SAAS;MACpC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1B;IACA,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,gBAAgB,EAAE,SAAS,EACxE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,8DAAgB,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACvE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe;IAC5C,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB;IAChD,IAAI,CAAC,MAAM,CAAC,wBAAwB,GAAG,IAAI,CAAC,4BAA4B;IACxE,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB;IAClD,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB;IAElD,IAAI,CAAC,QAAQ,CAAC;MACZ,aAAa,EAAE,aAAa;MAC5B,SAAS,EAAE,SAAS;MACpB,gBAAgB,EAAE;IACpB,CAAC,CAAC;IACF,8DAAgB,CAAC,SAAS,CAAC,UAAU,EAAE;MACrC,aAAa,EAAE,aAAa;MAC5B,SAAS,EAAE,SAAS;MACpB,gBAAgB,EAAE;IACpB,CAAC,CAAC;IAEF,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;EACrF;EAKA,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;IACtC,8DAAgB,CAAC,SAAS,CAAC,WAAW,EAAE;MACtC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,aAAa;MAClC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,aAAa;MACjD;IACF,CAAC,CAAC;IAEF,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa;IACnC,IAAI,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB;IAClD,IAAI,SAAS,CAAC,SAAS,EAAE;MACvB,IAAI;QACF,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC;QAC1C,IAAI,GAAG,KAAK,CAAC,IAAI;QACjB,gBAAgB,GAAG,KAAK,CAAC,QAAQ,KAAK,MAAM;MAC9C,CAAC,CAAC,OAAO,CAAC,EAAE,CAEZ;IACF;IACA,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,gBAAgB,KAAK,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE;MACnG,IAAI,CAAC,oBAAoB,CAAC;QAAC,aAAa,EAAE,IAAI;QAAE;MAAgB,CAAC,CAAC;IACpE;EAGF;EAGA,iBAAiB,GAAG;IAClB,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAC3E,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,GAAG,EAAE,CAAC,CAAC;EAC1C;EAGA,iBAAiB,GAAG;IAClB,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAC3E,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,GAAG,EAAE,CAAC,CAAC;EAC1C;EAEA,cAAc,CAAC,OAAO,EAAE;IACtB,IAAI,OAAO,EAAE;MACX,IAAI,CAAC,QAAQ,CAAC;QAAC,aAAa,EAAE;MAAI,CAAC,CAAC;MACpC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;QAC7B,IAAI,CAAC,eAAe,CAAC,CAAC;MACxB,CAAC,MAAM;QACL,IAAI,CAAC,QAAQ,CAAC;UAAC,aAAa,EAAE;QAAI,CAAC,CAAC;QACpC,IAAI,8DAAgB,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE;UAChD,8DAAgB,CAAC,YAAY,CAAC,UAAU,EAAE;YAAC,aAAa,EAAE;UAAI,CAAC,CAAC;QAClE;MACF;IACF,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,EAAE;MAC/C,+DAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;QACtC,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC;MAC/C,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI;QACd,8DAAgB,CAAC,YAAY,CAAC,UAAU,EAAE;UAAC,aAAa,EAAE;QAAK,CAAC,CAAC;QACjE,YAAY,CAAC,UAAU,CAAC,gBAAgB,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC;UAAC,aAAa,EAAE,KAAK;UAAE,aAAa,EAAE;QAAI,CAAC,CAAC;QAE1D,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC;MAClC,CAAC,CAAC;IACJ,CAAC,MAAM;MACL,IAAI,CAAC,QAAQ,CAAC;QAAC,aAAa,EAAE,KAAK;QAAE,aAAa,EAAE;MAAI,CAAC,CAAC;MAC1D,8DAAgB,CAAC,YAAY,CAAC,UAAU,EAAE;QAAC,aAAa,EAAE;MAAK,CAAC,CAAC;IACnE;EACF;EAEA,yBAAyB,CAAC,OAAO,EAAE;IACjC,IAAI,CAAC,QAAQ,CAAC;MAAC,aAAa,EAAE;IAAO,CAAC,CAAC;IACvC,8DAAgB,CAAC,YAAY,CAAC,UAAU,EAAE;MACxC,gBAAgB,EAAE,CAAC;IACrB,CAAC,CAAC;EACJ;EAEA,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE;IAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,EAAE,CAAC,OAAO,CAAC;MAAC,IAAI,EAAE;QAAC,IAAI,EAAE,MAAM;QAAE,GAAG,EAAE;MAAK;IAAC,CAAC,CAAC,CAC3C,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;EACvD;EAEA,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE;IAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAC5B,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;EACvD;EAEA,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE;IAClC,SAAS,CAAC,yBAAyB,CAAC;MAAC,IAAI,EAAE,CAAC,MAAM,CAAC;MAAE,IAAI,EAAE;IAAQ,CAAC,CAAC;EACvE;EAGA,qBAAqB,GAAG;IACtB,MAAM,MAAM,GAAG,2DAAc,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;IAChE,IAAI,IAAI,GAAG,EAAE;IACb,IAAI,CAAC,UAAU,EAAC,SAAS,EAAC,SAAS,EAAC,OAAO,EAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;MACnF,IAAI,GAAG,MAAM;IACf,CAAC,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;MACnC,IAAI,GAAG,SAAS;IAClB,CAAC,MAAM,IAAI,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;MACtC,IAAI,GAAG,UAAU;IACnB,CAAC,MAAM,IAAI,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;MACzC,IAAI,GAAG,aAAa;IACtB,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;MAC9B,IAAI,GAAG,UAAU;IACnB;IACA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI;IACrB,IAAI,MAAM,CAAC,MAAM,EAAE;MACjB,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI;MACzB,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM;MAC3B,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG;MACxB,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM;MAC3B,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK;IAC5B;IACA,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACpF,IAAI,CAAC,QAAQ,CAAC;MAAC,SAAS,EAAE,EAAE;MAAE,UAAU,EAAE;IAAI,CAAC,CAAC;EAClD;EAGA,cAAc,CAAC,IAAI,EAAE;IACnB,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;EACvF;EAGA,aAAa,CAAC,IAAI,EAAE;IAClB,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;EACvF;EAGA,uBAAuB,CAAC,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE;IAE5D,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE;MACrD,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;MACnC;IACF;IAEA,MAAM,MAAM,GAAG,CAAC,CAAC;IACjB,IAAI,8CAAM,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE;MAEpC,MAAM,CAAC,GAAG,GAAG;QAAC,IAAI,EAAE,gEAAuB;MAAA,CAAC;MAE5C,MAAM,CAAC,IAAI,GAAG;QAAC,MAAM,EAAE;UAAC,IAAI,EAAE,gEAAuB;QAAA;MAAC,CAAC;IACzD,CAAC,MAAM;MACL,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC;MACjE,IAAI,cAAc,EAAE;QAClB,MAAM,CAAC,IAAI,GAAG;UAAC,MAAM,EAAE,cAAc,CAAC,MAAM;UAAE,OAAO,EAAE;YAAC,OAAO,EAAE,cAAc,CAAC;UAAO;QAAC,CAAC;QACzF,MAAM,CAAC,IAAI,GAAG,cAAc,CAAC,IAAI;MACnC;IACF;IACA,MAAM,CAAC,UAAU,GAAG,SAAS;IAC7B,IAAI,CAAC,QAAQ,CAAC;MAAC,cAAc,EAAE;IAAM,CAAC,EAAE,CAAC,IAAI;MAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;IAAA,CAAC,CAAC;EACrF;EAGA,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE;IACtC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;MAC9B,SAAS,GAAG;QAAC,SAAS,EAAE,kEAAsB;QAAE,eAAe,EAAE;MAAK,CAAC;IACzE;IACA,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,EAAE;MAI7D,SAAS,CAAC,aAAa,GAAG,OAAO;IACnC;IACA,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI;MAC5B,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC,CAAC;EACJ;EAEA,wBAAwB,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE;IACrD,IAAI,CAAC,WAAW,CAAC,CAAC;IAElB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,KAAK,EAAE;MACT,MAAM,MAAM,GAAG,CAAC,CAAC;MACjB,IAAI,WAAW;MACf,IAAI,GAAG,EAAE;QACP,IAAI,GAAG,CAAC,KAAK,EAAE;UACb,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,8CAAM,CAAC,QAAQ,EAAE;YACrD,WAAW,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;UAC/B,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,8CAAM,CAAC,QAAQ,EAAE;YAC/D,GAAG,CAAC,KAAK,GAAG,8CAAM,CAAC,QAAQ;UAC7B;QACF;QACA,MAAM,CAAC,MAAM,GAAG,GAAG;MACrB;MAEA,IAAI,OAAO,IAAI,IAAI,QAAQ,EAAE;QAC3B,MAAM,CAAC,OAAO,GAAI,IAAI,KAAK,8CAAM,CAAC,QAAQ,GACxC,8CAAM,CAAC,QAAQ,GAAG;UAAC,OAAO,EAAE;QAAI,CAAC;MACrC;MACA,IAAI,MAAM,EAAE;QACV,MAAM,CAAC,MAAM,GAAG,MAAM;MACxB;MACA,KAAK,CAAC,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM;QAAE,WAAW,EAAE;MAAW,CAAC,CAAC,CACpD,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACvD;EACF;EAEA,eAAe,CAAC,SAAS,EAAE;IACzB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,KAAK,EAAE;MACT,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzE;EACF;EAEA,2BAA2B,CAAC,QAAQ,EAAG;IACrC,IAAI,CAAC,WAAW,CAAC,CAAC;IAElB,IAAI,CAAC,QAAQ,EAAE;MACb,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5C;IAIA,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,CAAC,CACjF,KAAK,CAAC,GAAG,IAAI;MACZ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;MACpC,MAAM,GAAG;IACX,CAAC,CAAC;EACN;EAEA,uBAAuB,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,KAAK,EAAE;MACT,MAAM,EAAE,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;MAChC,IAAI,GAAG,EAAE;QACP,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;QACpB,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;MACtB,CAAC,MAAM;QACL,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QACnB,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;MACrB;MACA,KAAK,CAAC,OAAO,CAAC;QAAC,GAAG,EAAE;UAAC,IAAI,EAAE,GAAG;UAAE,IAAI,EAAE;QAAI;MAAC,CAAC,CAAC,CAC1C,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACvD;EACF;EAEA,uBAAuB,CAAC,SAAS,EAAE,IAAI,EAAE;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,KAAK,EAAE;MACT,KAAK,CAAC,OAAO,CAAC;QAAC,IAAI,EAAE;MAAI,CAAC,CAAC,CACxB,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACvD;EACF;EAEA,YAAY,GAAG;IACb,6DAAa,CAAC,CAAC,CAAC;IAGhB,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC;IACrC,YAAY,CAAC,UAAU,CAAC,gBAAgB,CAAC;IACzC,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC;IACnC,cAAc,CAAC,UAAU,CAAC,kBAAkB,CAAC;IAC7C,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,EAAE;MAExC,+DAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;QACtC,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,GAAG,CAAC;MAC3D,CAAC,CAAC;IACJ;IAGA,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,GAAG,6DAAoB,IAAI,MAAM,GAAG,YAAY,GAAG,6DAAoB;IACjH,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,EAAE,GAAG,0DAAiB,IAAI,CAAC;IAE3F,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC;IAEtC,IAAI,OAAO;IACX,IAAI,IAAI,CAAC,MAAM,EAAE;MACf,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;MACpC,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,SAAS;MACpC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC,MAAM;MACL,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B;IACA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAEnC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI;MAGhB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,EACnF,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,8DAAgB,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI;QAC/F,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe;QAC5C,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB;QAChD,IAAI,CAAC,MAAM,CAAC,wBAAwB,GAAG,IAAI,CAAC,4BAA4B;QACxE,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB;QAClD,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB;QAClD,2DAAc,CAAC,UAAU,CAAC,EAAE,CAAC;MAC/B,CAAC,CAAC;IACN,CAAC,CAAC;EACJ;EAEA,mBAAmB,GAAG;IACpB,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAChD,IAAI,CAAC,YAAY,CAAC,CAAC;IACrB,CAAC,CAAC;EACJ;EAEA,wBAAwB,CAAC,SAAS,EAAE;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IAGA,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAE7B,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MACd,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;IACtC,CAAC,CAAC;EACJ;EAEA,2BAA2B,CAAC,SAAS,EAAE;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IAGA,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CACvB,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;EACvD;EAEA,uBAAuB,CAAC,SAAS,EAAE;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IAEA,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAE1B,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MACd,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;IACtC,CAAC,CAAC;EACJ;EAEA,uBAAuB,CAAC,SAAS,EAAE;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IAEA,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAC1B,IAAI,CAAC,CAAC,IAAI;MAET,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CACD,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;EACvD;EAEA,iBAAiB,CAAC,SAAS,EAAE;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IAOA,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,UAAU,GAAG,gEAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;IACvE,MAAM,MAAM,GAAG,KAAK,GAChB;MAAC,WAAW,EAAE,MAAM;MAAE,SAAS,EAAE,SAAS;MAAE,WAAW,EAAE;IAAU,CAAC,GACpE;MAAC,WAAW,EAAE,OAAO;MAAE,SAAS,EAAE,SAAS;MAAE,KAAK,EAAE,SAAS;MAAE,WAAW,EAAE;IAAU,CAAC;IAG3F,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAC5B,IAAI,CAAC,CAAC,IAAI;MACT,IAAI,IAAI,GAAG,2DAAc,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;MAC/D,IAAI,GAAG,2DAAc,CAAC,eAAe,CAAC,IAAI,EAAE,sBAAsB,CAAC;MACnE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;QAAE,IAAI,GAAG,2DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC;MAAE,CAAC,CAAC;MAC1G,2DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;IACjC,CAAC,CAAC,CACD,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;EACrD;EAEA,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE;IACvC,IAAI,CAAC,QAAQ,CAAC;MACZ,kBAAkB,EAAE,IAAI;MACxB,kBAAkB,EAAE;QAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;MAAC,CAAC;MAC9C,iBAAiB,EAAE,MAAM;MACzB,gBAAgB,EAAE,SAAS,IAAI,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,SAAS,CAAC;MAC7E,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC;IAChE,CAAC,CAAC;EACJ;EAGA,uBAAuB,CAAC,MAAM,EAAE;IAC9B,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,QAAQ,EAAE;MAE5C,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC9B;IACA,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC,QAAQ,GAAG,EAAE;IAC5D,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,OAAO,IAAI,QAAQ,GAAG,8CAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,8CAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC;IACzH,MAAM,OAAO,GAAG,8CAAM,CAAC,OAAO,CAAC,OAAO,EAAE,iEAAwB,EAAE,IAAI,CAAC;IACvE,MAAM,GAAG,GAAG,8CAAM,CAAC,MAAM,CAAC,8CAAM,CAAC,eAAe,CAAC,8CAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;IACnG,MAAM,UAAU,GAAG,8CAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;IAEjE,MAAM,IAAI,GAAG;MACX,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,GAAG,GAAG,MAAM,CAAC;IAC7C,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC;MACZ,oBAAoB,EAAE,IAAI;MAC1B,cAAc,EAAE;QAAE,IAAI,EAAE,IAAI;QAAE,GAAG,EAAE,GAAG;QAAE,OAAO,EAAE;MAAW;IAC9D,CAAC,CAAC;EACJ;EAEA,kBAAkB,CAAC,IAAI,EAAE;IACvB,IAAI,CAAC,QAAQ,CAAC;MACZ,oBAAoB,EAAE,IAAI;MAC1B,cAAc,EAAE;QACd,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,IAAI,CAAC;MACb;IACF,CAAC,CAAC;EACJ;EAKA,YAAY,CAAC,SAAS,EAAE;IAOtB,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,2DAAe,EAAE;MAC3C,OAAO,KAAK;IACd;IACA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,8CAAM,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE;MACjE,OAAO,KAAK;IACd;IACA,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,wEAAc,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI;IACvG,MAAM,aAAa,GAAG,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC,QAAQ,IAChE,eAAe,CAAC,QAAQ,CAAC,UAAU,KAAK,KAAK,IAAI,eAAe,CAAC,QAAQ,CAAC,UAAU,KAAK,KAAM;IAClG,OAAO,MAAM,IAAI,aAAa,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC;EAC9E;EAEA,uBAAuB,CAAC,SAAS,EAAE;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAE7C,IAAI,KAAK,CAAC,QAAQ,EAAE;MAClB,OAAO,CACL,cAAc,CACf;IACH;IAEA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,KAAK,GAAG,KAAK;MAAE,OAAO,GAAG,KAAK;MAAE,YAAY,GAAG,KAAK;MAAE,UAAU,GAAG,KAAK;MAAE,OAAO,GAAG,KAAK;MAC3F,QAAQ,GAAG,KAAK;MAAE,MAAM,GAAG,KAAK;MAAE,MAAM,GAAG,KAAK;MAAE,GAAG,GAAG,KAAK;MAAE,IAAI,GAAG,KAAK;IAC7E,IAAI,KAAK,EAAE;MACT,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;MACjC,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;MAC7B,MAAM,GAAG,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC;MAE1C,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;MACjC,IAAI,GAAG,EAAE;QACP,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzB,YAAY,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QACpC,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;MAC3B;IACF;IAQA,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;IACrC,GAAG,GAAG,8CAAM,CAAC,cAAc,CAAC,SAAS,CAAC;IACtC,IAAI,GAAG,8CAAM,CAAC,eAAe,CAAC,SAAS,CAAC;IAExC,OAAO,CACL,UAAU,GAAG;MACX,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC;MAC7D,OAAO,EAAE,IAAI,CAAC;IAChB,CAAC,GAAG,IAAI,EACR,UAAU,IAAI,GAAG,IAAI,MAAM,GAAG;MAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,CAAC;MACnE,OAAO,EAAE,IAAI,CAAC;IAChB,CAAC,GAAG,IAAI,EACR,UAAU,IAAI,GAAG,IAAI,MAAM,GAAG;MAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,CAAC;MACnE,OAAO,EAAE,IAAI,CAAC;IAChB,CAAC,GAAG,IAAI,EACR,UAAU,GAAG,gBAAgB,GAAG,IAAI,EACpC,UAAU,IAAI,OAAO,IAAI,CAAC,IAAI,GAAG,qBAAqB,GAAG,IAAI,EAC7D,IAAI,GAAG,IAAI,GAAI,KAAK,GAAI,OAAO,GAAG,IAAI,GAAG,cAAc,GAAI,YAAa,EACxE,IAAI,GAAG,IAAI,GAAI,YAAY,GAAG,eAAe,GAAG,aAAc,EAC9D,MAAM,GAAG,aAAa,GAAG,WAAW,EACpC,QAAQ,GAAG,eAAe,GAAG,eAAe,EAC5C,cAAc,CACf;EACH;EAEA,qBAAqB,GAAG;IACtB,IAAI,CAAC,QAAQ,CAAC;MACZ,kBAAkB,EAAE,KAAK;MACzB,kBAAkB,EAAE,IAAI;MACxB,iBAAiB,EAAE,IAAI;MACvB,iBAAiB,EAAE;IACrB,CAAC,CAAC;EACJ;EAEA,uBAAuB,CAAC,oBAAoB,EAAE;IAC5C,IAAI,CAAC,QAAQ,CAAC;MACZ,oBAAoB,EAAE,KAAK;MAC3B,cAAc,EAAE,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG;IACrE,CAAC,CAAC;EACJ;EAEA,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;IAC/C,IAAI,MAAM,IAAI,eAAe,EAAE;MAC7B,IAAI,OAAO,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI;UAChB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;QAChC,CAAC,CAAC;MACJ;IACF,CAAC,MAAM,IAAI,MAAM,IAAI,mBAAmB,EAAE;MACxC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC;IACtC,CAAC,MAAM,IAAI,MAAM,IAAI,kBAAkB,EAAE;MACvC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC;IACpC;EACF;EAGA,qBAAqB,CAAC,MAAM,EAAE;IAC5B,IAAI,CAAC,QAAQ,CAAC;MACZ,UAAU,EAAE,IAAI;MAChB,eAAe,EAAE,MAAM,CAAC,SAAS;MACjC,YAAY,EAAE,CAAC,MAAM,CAAC,GAAG;IAC3B,CAAC,CAAC;EACJ;EAEA,yBAAyB,CAAC,GAAG,EAAE;IAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,GACxD,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAC7C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC;MAAC;IAAY,CAAC,CAAC;EAC/B;EAEA,oBAAoB,GAAG;IACrB,IAAI,CAAC,QAAQ,CAAC;MAAC,UAAU,EAAE,KAAK;MAAE,eAAe,EAAE,IAAI;MAAE,YAAY,EAAE,EAAE;MAAE,mBAAmB,EAAE;IAAK,CAAC,CAAC;EACzG;EAEA,sBAAsB,GAAG;IACvB,IAAI,CAAC,QAAQ,CAAC;MAAC,mBAAmB,EAAE;IAAI,CAAC,CAAC;EAC5C;EAEA,sBAAsB,GAAG;IACvB,IAAI,CAAC,QAAQ,CAAC;MAAC,mBAAmB,EAAE;IAAK,CAAC,CAAC;EAC7C;EAEA,iBAAiB,GAAG;IAClB,IAAI,CAAC,QAAQ,CAAC;MAAC,WAAW,EAAE;IAAI,CAAC,CAAC;EACpC;EAEA,kBAAkB,GAAG;IACnB,IAAI,CAAC,QAAQ,CAAC;MAAC,WAAW,EAAE;IAAK,CAAC,CAAC;EACrC;EAMA,gBAAgB,CAAC,IAAI,EAAE;IACrB,MAAM,SAAS,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;IAC3E,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI;IACxF,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI;IACjD,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI;IACrD,IAAI,CAAC,KAAK,EAAE;MACV,IAAI,CAAC,QAAQ,CAAC;QAAC,WAAW,EAAE;MAAK,CAAC,CAAC;MACnC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC;MACnC;IACF;IACA,8DAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MACzC,IAAI,IAAI,CAAC,OAAO,KAAK,YAAY,IAAI,IAAI,CAAC,KAAK,EAAE;QAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE;UAC5B,IAAI,CAAC,QAAQ,CAAC;YAAC,WAAW,EAAE;UAAK,CAAC,CAAC;UACnC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAC5C,CAAC,MAAM;UACL,IAAI,CAAC,QAAQ,CAAC;YAAC,WAAW,EAAE,KAAK;YAAE,gBAAgB,EAAE;cAAC,GAAG,IAAI,CAAC,KAAK;cAAE,OAAO,EAAE;YAAK;UAAC,CAAC,CAAC;QACxF;QACA;MACF;MACA,IAAI,IAAI,CAAC,IAAI,EAAE;QACb,IAAI,CAAC,QAAQ,CAAC;UAAC,WAAW,EAAE;QAAK,CAAC,CAAC;QAMnC,yEAAe,CAAC,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;UACnD,GAAG,IAAI,CAAC,IAAI;UACZ,YAAY,EAAE;YAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;UAAO;QACpD,CAAC,CAAC;QACF,IAAI,IAAI,GAAG,2DAAc,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/D,IAAI,GAAG,2DAAc,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,QAAQ,GAAG,gBAAgB,GAAG,sBAAsB,CAAC;QAC5H,IAAI,GAAG,2DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QACjE,2DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;QAC/B;MACF;MACA,IAAI,CAAC,QAAQ,CAAC;QAAC,WAAW,EAAE;MAAK,CAAC,CAAC;MACnC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC;IACrC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MACd,IAAI,CAAC,QAAQ,CAAC;QAAC,WAAW,EAAE;MAAK,CAAC,CAAC;MACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,EAAE,KAAK,CAAC;IAClD,CAAC,CAAC;EACJ;EAEA,4BAA4B,CAAC,OAAO,EAAE;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB;IAC3C,IAAI,CAAC,OAAO,EAAE;MACZ,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B;IACA,OAAO,uEAAsB,CAAC,OAAO,CAAC,KAAK,EAAE;MAAC,OAAO;MAAE,MAAM,EAAE,IAAI;MAAE,OAAO,EAAE,OAAO,CAAC;IAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;MACzG,IAAI,CAAC,QAAQ,CAAC;QAAC,gBAAgB,EAAE;MAAI,CAAC,CAAC;MACvC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,CAAC;IAC3C,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MACd,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,EAAE,KAAK,CAAC;IAClD,CAAC,CAAC;EACJ;EAEA,4BAA4B,GAAG;IAC7B,IAAI,CAAC,QAAQ,CAAC;MAAC,gBAAgB,EAAE;IAAI,CAAC,CAAC;EACzC;EAEA,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE;IAC5E,IAAI,CAAC,QAAQ,CAAC;MACZ,YAAY,EAAE,IAAI;MAClB,WAAW,EAAE;QACX,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,WAAW;QACpB,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE;MACV;IACF,CAAC,CAAC;EACJ;EAUA,kBAAkB,GAAG;IACnB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa;IAC1C,IAAI,8CAAM,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE;MAOpC,IAAI,IAAI,GAAG,2DAAc,CAAC,eAAe,CAAC,EAAE,EAAE,iBAAiB,CAAC;MAChE,IAAI,GAAG,2DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC;MACzD,2DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;MAC/B;IACF;IACA,IAAI,CAAC,8CAAM,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE;MACtC,IAAI,IAAI,GAAG,2DAAc,CAAC,eAAe,CAAC,EAAE,EAAE,gBAAgB,CAAC;MAC/D,IAAI,GAAG,2DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC;MAC3D,2DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;MAC/B;IACF;IAEA,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3F,IAAI,CAAC,QAAQ,CAAC;MAAC,SAAS,EAAE;IAAM,CAAC,CAAC;EACpC;EAEA,yBAAyB,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;IACnD,IAAI,CAAC,SAAS,EAAE;MACd;IACF;IAEA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IAEA,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;MAC7B,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI;QACnB,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CACpB,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;MACvD,CAAC,CAAC;IACJ;IAEA,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;MACjC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;QACrB,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CACvB,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;MACvD,CAAC,CAAC;IACJ;EACF;EAEA,gCAAgC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE;IAClD,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE;MAEjC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;QAAC,IAAI,EAAE;UAAC,IAAI,EAAE,IAAI;UAAE,IAAI,EAAE;QAAI;MAAC,CAAC,CAAC,CAC/D,IAAI,CAAC,CAAC,IAAI,2DAAc,CAAC,UAAU,CAAC,2DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CACtG,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC,MAAM;MAEL,IAAI,CAAC,QAAQ,CAAC;QAAC,UAAU,EAAE,IAAI;QAAE,QAAQ,EAAE,IAAI;QAAE,SAAS,EAAE;MAAK,CAAC,CAAC;MACnE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE;QAAC,IAAI,EAAE,IAAI;QAAE,IAAI,EAAE;MAAI,CAAC,CAAC;IAC3D;EACF;EAEA,0BAA0B,CAAC,MAAM,EAAE,KAAK,EAAE;IAExC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CACzB,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CACrE,KAAK,CAAC,GAAG,IAAI;MAEZ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;IACtC,CAAC,CAAC;EACN;EAEA,mBAAmB,CAAC,WAAW,EAAE,QAAQ,EAAE;IACzC,MAAM,MAAM,GAAG,qEAAc,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9C,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;MAC/B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,KAAK,CAAC;IACzF,CAAC,MAAM;MACL,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAClB,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE;QAAC,MAAM,EAAE,QAAQ,CAAC,MAAM;QAAE,MAAM,EAAE;MAAM,CAAC,CAAC,CAAC,CAC7G,IAAI,CAAC,CAAC,IAAI;QACT,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;QACxF,2DAAc,CAAC,UAAU,CAAC,EAAE,CAAC;MAC/B,CAAC,CAAC,CACD,KAAK,CAAC,GAAG,IAAI;QACZ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;MACtC,CAAC,CAAC;IACN;EACF;EAEA,yBAAyB,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE;IACtD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,EACzE,+DAAC,2CAAQ;MAAC,QAAQ,EAAE;QAAA,UAAK,+DAAC,wDAAgB;UAAC,EAAE,EAAC,cAAc;UAAC,cAAc,EAAC,YAAY;UACtF,WAAW,EAAC;QAAyC,gBAAC;MAAC,gBAAK,CAAE;MAAA,UAC9D,+DAAC,oBAAoB;QACnB,QAAQ,EAAE,IAAK;QACf,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK;UAClB,IAAI,CAAC,QAAQ,CAAC;YAAC,YAAY,EAAE;UAAK,CAAC,CAAC;UACpC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;QACxB;MAAE,gBAAE;IAAC,gBACC,CAAC,EACX,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;EAC9B;EAEA,oBAAoB,GAAG;IACrB,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACzB,IAAI,CAAC,QAAQ,CAAC;MACZ,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;MACnC,SAAS,EAAE,wEAA4B;MACvC,aAAa,EAAE;IACjB,CAAC,CAAC;EACJ;EAEA,oBAAoB,GAAG;IACrB,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACzB,IAAI,CAAC,QAAQ,CAAC;MACZ,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;MACnC,SAAS,EAAE,wEAA4B;MACvC,aAAa,EAAE;IACjB,CAAC,CAAC;EACJ;EAsBA,kBAAkB,GAAG;IACnB,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACnC,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAM;MACvC,IAAI,CAAC,gBAAgB,GAAG,IAAI;MAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,wEAA4B,EAAE;QACxD;MACF;MACA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;MAC/D,IAAI,CAAC,eAAe,CAAC,CAAC;IACxB,CAAC,EAAE,oBAAoB,CAAC;EAC1B;EAEA,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE;IACzD,QAAQ,SAAS;MACf,KAAK,wEAA4B;QAC/B,MAAM,IAAI,GAAG;UAAE,MAAM,EAAE,6DAAiB;UAAE,KAAK,EAAE,CAAC,CAAC;QAAU,CAAC;QAQ9D,OAAO,IAAI,CAAC,iBAAiB,CAAC,8CAAM,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CACnF,IAAI,CAAC,IAAI,IAAI;UACZ,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;YACpF,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;YACvC,IAAI,CAAC,eAAe,CAAC,CAAC;YACtB,OAAO,IAAI;UACb;UACA,IAAI,CAAC,QAAQ,CAAC;YAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;UAAC,CAAC,CAAC;UAC5C,OAAO,IAAI;QACb,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;UACd,IAAI,CAAC,WAAW,CAAE,GAAG,IAAI,GAAG,CAAC,OAAO,IAAK,cAAc,EAAE,KAAK,CAAC;UAC/D,IAAI,CAAC,eAAe,CAAC,CAAC;QACxB,CAAC,CAAC;MACN,KAAK,kEAAsB;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC7C,IAAI,CAAC,KAAK,EAAE;UACV;QACF;QAEA,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC;QAClC;IACJ;EACF;EAEA,iBAAiB,CAAC,SAAS,EAAE,OAAO,EAAE;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IAEA,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC;EACrC;EAEA,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IAEA,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC;EACrC;EAEA,mBAAmB,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IAEA,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC;EACxC;EAEA,sBAAsB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IAEA,KAAK,CAAC,SAAS,CAAC,eAAe,EAAE,OAAO,EAAE,SAAS,CAAC;EACtD;EACA,oBAAoB,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IAEA,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC;EACzC;EAEA,eAAe,GAAG;IAChB,IAAI,IAAI,CAAC,gBAAgB,EAAE;MACzB,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACrC;IACA,IAAI,CAAC,QAAQ,CAAC;MACZ,SAAS,EAAE,SAAS;MACpB,SAAS,EAAE,2DAAe;MAC1B,aAAa,EAAE,SAAS;MAMxB,OAAO,EAAE,SAAS;MAQlB,eAAe,EAAE;IACnB,CAAC,CAAC;EACJ;EAEA,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE;IACjD,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IACA,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE;MACxB,IAAI,CAAC,mBAAmB,CAAC,YAAY,GAAG,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;MACzE,MAAM,GAAG,GAAG;QACV,SAAS,EAAE,kEAAsB;MACnC,CAAC;MACD,IAAI,YAAY,EAAE;QAChB,GAAG,CAAC,SAAS,GAAG,SAAS;QACzB,GAAG,CAAC,OAAO,GAAG,OAAO;MACvB;MACA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;IACpB,CAAC,MAAM;MAEL,IAAI,CAAC,QAAQ,CAAC;QACZ,eAAe,EAAE;MACnB,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACzD;EACF;EAEA,iBAAiB,CAAC,IAAI,EAAE;IACtB,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE;MACvB;IACF;IACA,QAAQ,IAAI,CAAC,KAAK;MAChB,KAAK,QAAQ;QAGX,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAEnC,IAAI,8CAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;UACnE,IAAI,CAAC,QAAQ,CAAC;YACZ,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,2DAAe;YAC1B,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,SAAS;YAGxB,eAAe,EAAE;UACnB,CAAC,CAAC;UACF;QACF;QACA,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;UAEtC,IAAI,CAAC,QAAQ,CAAC;YAAC,SAAS,EAAE,kEAAsB;UAAA,CAAC,CAAC;QACpD;QACA;MACF,KAAK,SAAS;QAEZ,IAAI,CAAC,eAAe,CAAC,CAAC;QACtB;IACJ;EACF;EAEA,iBAAiB,CAAC,IAAI,EAAE;IACtB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,6DAAiB,IAAI,8CAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;MAG/G,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;MAC9C,IAAI,KAAK,EAAE;QAGT,MAAM,GAAG,GAAG,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI;QACpD,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,6DAAiB,EAAE;UAEvE,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YACpC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,2DAAe,EAAE;cAE3C,IAAI,CAAC,QAAQ,CAAC;gBACZ,SAAS,EAAE,IAAI,CAAC,KAAK;gBACrB,SAAS,EAAE,wEAA4B;gBACvC,OAAO,EAAE,IAAI,CAAC,GAAG;gBACjB,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;cAC5B,CAAC,CAAC;YACJ,CAAC,MAAM;cAGL,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;YAC7C;UACF;QACF;MACF,CAAC,MAAM;QACL,OAAO,CAAC,IAAI,CAAC,6CAA6C,EAAE,IAAI,CAAC,KAAK,CAAC;MACzE;IACF;EACF;EAEA,MAAM,GAAG;IACP,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB;IAC7G,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,eAAe,GAAG,QAAQ,CAAC;IAC5G,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,UAAU,EAClG,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,sBAAsB,CAAC;IAC1G,MAAM,gBAAgB,GAAG,eAAe,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACpE,MAAM,kBAAkB,GAAG,CAAC,kBAAkB,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAC/H,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,iBAAiB,KAAK,eAAgB;IACjE,MAAM,kBAAkB,GAAG,CAAC,sBAAsB,EAAE,sBAAsB,EAAE,uBAAuB,EACjG,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAC3F,kBAAkB,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACpF,MAAM,iBAAiB,GAAG,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,kBAAkB,EACvG,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAC9E,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAChF,qBAAqB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAC/E,oBAAoB,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACrE,MAAM,iBAAiB,GAAG,CAAC,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EACrG,sBAAsB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,sBAAsB,EACvF,iBAAiB,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,YAAY,EACnF,eAAe,EAAE,oBAAoB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACpE,MAAM,gBAAgB,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EACnF,qBAAqB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,eAAe,EACjF,2BAA2B,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAC9E,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,eAAe,EAAE,oBAAoB,EAAE,UAAU,EAAE,kBAAkB,EACjI,cAAc,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,qBAAqB,EAC/E,qBAAqB,EAAE,gBAAgB,EAAE,aAAa,EAAE,oBAAoB,EAC5E,qBAAqB,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACxF,MAAM,kBAAkB,GAAG,CAAC,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAC7F,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EACjI,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EACzF,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACjE,MAAM,oBAAoB,GAAG,CAAC,cAAc,EAAE,eAAe,EAAE,oBAAoB,EACjF,mBAAmB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EACnF,uBAAuB,EAAE,mBAAmB,EAAE,4BAA4B,EAC1E,gBAAgB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC/C,MAAM,4BAA4B,GAAG,CAAC,WAAW,EAAE,wBAAwB,EAAE,mBAAmB,EAC9F,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EACvH,qBAAqB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,qBAAqB,EAC5F,uBAAuB,EAAE,mBAAmB,EAAE,0BAA0B,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACvG,MAAM,sBAAsB,GAAG,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EACvF,oBAAoB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EACpH,qBAAqB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,wBAAwB,EAC3F,aAAa,EAAE,kBAAkB,EACjC,2BAA2B,EAAE,gBAAgB,EAAE,eAAe,EAAE,mBAAmB,EACnF,yBAAyB,EAAE,8BAA8B,EACzD,wBAAwB,EAAE,4BAA4B,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACrF,MAAM,qBAAqB,GAAG,CAAC,oBAAoB,EAAE,yBAAyB,EAC5E,sBAAsB,EAAE,sBAAsB,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC9F,OACE;MAAK,EAAE,EAAC,eAAe;MAAC,GAAG,EAAE,IAAI,CAAC,OAAQ;MAAA,WACvC,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAC5B,+DAAC,iEAAW;QACV,MAAM,EAAE,IAAI,CAAC,MAAO;QACpB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAkB;QACrC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAmB;QACvC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAkB;QACrC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAiB;QACnC,IAAI,EAAE,IAAI,CAAC,qBAAsB;QACjC,WAAW,EAAE,IAAI,CAAC,eAAgB;QAClC,QAAQ,EAAE,IAAI,CAAC,uBAAwB;QACvC,cAAc,EAAG,SAAS,IAAK;UAC7B,IAAI,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;YACzC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;UAChC;QACF,CAAE;QACF,OAAO,EAAE,IAAI,CAAC;MAAY,gBAAE,CAAC,GAE/B,IAAI,EAEL,IAAI,CAAC,KAAK,CAAC,oBAAoB,GAC9B,+DAAC,mEAAa;QACZ,MAAM,EAAE,IAAI,CAAC,MAAO;QACpB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAE9B,IAAI,EAAE,IAAI,CAAC,uBAAwB;QACnC,UAAU,EAAE,IAAI,CAAC,UAAW;QAC5B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,gBAAgB,EAAE,IAAI,CAAC,oBAAqB;QAC5C,eAAe,EAAE,IAAI,CAAC;MAAwB,gBAC/C,CAAC,GAEF,IAAI,EAEL,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAC7B,+DAAC,yEAAkB;QACjB,MAAM,EAAE,IAAI,CAAC,MAAO;QACpB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAE9B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;QACtC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,YAAa;QAE9B,IAAI,EAAE,IAAI,IAAI;UAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;UAAE,IAAI,IAAI,EAAE;YAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;UAAE;QAAE,CAAE;QAC5F,UAAU,EAAE,IAAI,CAAC,UAAW;QAC5B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,gBAAgB,EAAE,IAAI,CAAC;MAAqB,gBAC7C,CAAC,GAEF,IAAI,EAEL,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,wEAA4B,GAC3E,+DAAC,kEAAY;QACX,MAAM,EAAE,IAAI,CAAC,MAAO;QACpB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;QAC5B,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;QACxB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;QAChC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACpC,OAAO,EAAE,IAAI,CAAC,eAAgB;QAC9B,SAAS,EAAE,IAAI,CAAC,iBAAkB;QAClC,YAAY,EAAE,IAAI,CAAC,gBAAiB;QACpC,QAAQ,EAAE,IAAI,CAAC;MAAiB,gBAC/B,CAAC,GAEJ,IAAI,EAEL,IAAI,CAAC,KAAK,CAAC,WAAW,GACrB,+DAAC,gEAAS;QAAC,QAAQ,EAAE,IAAI,CAAC,gBAAiB;QAAC,OAAO,EAAE,IAAI,CAAC;MAAmB,gBAAE,CAAC,GAEhF,IAAI,EAEL,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAC1B,+DAAC,sEAAgB;QACf,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAiB;QACnC,QAAQ,EAAE,IAAI,CAAC,4BAA6B;QAC5C,QAAQ,EAAE,IAAI,CAAC;MAA6B,gBAC7C,CAAC,GAEF,IAAI,EAEL,IAAI,CAAC,KAAK,CAAC,YAAY,GACtB,+DAAC,0DAAK;QACJ,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAM;QACpC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAQ;QACxC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,GAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;UAAC,YAAY,EAAE;QAAK,CAAC,CAAC,GAAI,IAAK;QAC/F,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAO;QACtC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,GACxC,CAAC,IAAI;UAAC,IAAI,CAAC,QAAQ,CAAC;YAAC,YAAY,EAAE;UAAK,CAAC,CAAC;UAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC,GAAI,IAAK;QAC5F,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;MAAQ,gBACvC,CAAC,GAAG,IAAI,EAEZ,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,WAAW,GACjE,+DAAC,4DAAa;QACZ,MAAM,EAAE,IAAI,CAAC,MAAO;QACpB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;QAChC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAkB;QACpC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;QACvC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,cAAe;QACjC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;QACnC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;QAC1C,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;QACxB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;QAC5B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAmB;QAElD,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;QAChC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;QAClC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;QACpC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;QAE5C,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;QAClC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;QAEhC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;QAChC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,oBAAoB,EAAE,IAAI,CAAC,KAAK,CAAC,oBAAqB;QACtD,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAiB;QAC9C,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;QACpC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;QAChC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAkB;QAChD,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;QAEpC,gBAAgB,EAAE,IAAI,CAAC,oBAAqB;QAC5C,QAAQ,EAAE,IAAI,CAAC,gBAAiB;QAChC,UAAU,EAAE,IAAI,CAAC,cAAe;QAChC,UAAU,EAAE,IAAI,CAAC,cAAe;QAChC,cAAc,EAAE,IAAI,CAAC,kBAAmB;QACxC,gBAAgB,EAAE,IAAI,CAAC,oBAAqB;QAC5C,mBAAmB,EAAE,IAAI,CAAC,uBAAwB;QAClD,eAAe,EAAE,IAAI,CAAC,uBAAwB;QAC9C,mBAAmB,EAAE,IAAI,CAAC,uBAAwB;QAClD,mBAAmB,EAAE,IAAI,CAAC,wBAAyB;QACnD,gBAAgB,EAAE,IAAI,CAAC,2BAA4B;QACnD,mBAAmB,EAAE,IAAI,CAAC,8BAA+B;QACzD,yBAAyB,EAAE,IAAI,CAAC,cAAe;QAC/C,qBAAqB,EAAE,IAAI,CAAC,yBAA0B;QACtD,qBAAqB,EAAE,IAAI,CAAC,yBAA0B;QACtD,mBAAmB,EAAE,IAAI,CAAC,uBAAwB;QAClD,iBAAiB,EAAE,IAAI,CAAC,oBAAqB;QAC7C,oBAAoB,EAAE,IAAI,CAAC,iBAAkB;QAC7C,kBAAkB,EAAE,IAAI,CAAC,sBAAuB;QAChD,mBAAmB,EAAE,IAAI,CAAC,uBAAwB;QAClD,SAAS,EAAE,IAAI,CAAC,aAAc;QAC9B,YAAY,EAAE,IAAI,CAAC,gBAAiB;QACpC,aAAa,EAAE,IAAI,CAAC,iBAAkB;QACtC,eAAe,EAAE,IAAI,CAAC,mBAAoB;QAC1C,aAAa,EAAE,IAAI,CAAC,iBAAkB;QACtC,aAAa,EAAE,IAAI,CAAC,uBAAwB;QAC5C,QAAQ,EAAE,IAAI,CAAC,YAAa;QAC5B,eAAe,EAAE,IAAI,CAAC,mBAAoB;QAC1C,WAAW,EAAE,IAAI,CAAC,eAAgB;QAClC,QAAQ,EAAE,IAAI,CAAC,qBAAsB;QACrC,OAAO,EAAE,IAAI,CAAC,WAAY;QAC1B,qBAAqB,EAAE,IAAI,CAAC,gCAAiC;QAC7D,sBAAsB,EAAE,IAAI,CAAC,0BAA2B;QACxD,eAAe,EAAE,IAAI,CAAC,mBAAoB;QAC1C,aAAa,EAAE,IAAI,CAAC,iBAAkB;QACtC,aAAa,EAAE,IAAI,CAAC,iBAAkB;QACtC,qBAAqB,EAAE,IAAI,CAAC,yBAA0B;QAEtD,UAAU,EAAE,IAAI,CAAC,UAAW;QAC5B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QACxC,gBAAgB,EAAE,IAAI,CAAC,oBAAqB;QAE5C,eAAe,EAAE,IAAI,CAAC;MAAsB,gBAAE,CAAC,GAC/C,IAAI,EAEP,CAAC,gBAAgB,IAAI,CAAC,kBAAkB,IAAI,CAAC,kBAAkB,IAAI,CAAC,iBAAiB,IAAI,CAAC,iBAAiB,IAAI,CAAC,gBAAgB,IAAI,CAAC,kBAAkB,IAAI,CAAC,oBAAoB,IAAI,CAAC,4BAA4B,IAAI,CAAC,sBAAsB,IAAI,CAAC,qBAAqB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,IAAK,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAU,CAAC,GACzW,+DAAC,2CAAQ;QAAC,QAAQ,EAAE;UAAA,UAAK,+DAAC,wDAAgB;YAAC,EAAE,EAAC,cAAc;YAAC,cAAc,EAAC,YAAY;YAC1F,WAAW,EAAC;UAAyC,gBAAC;QAAC,gBAAK,CAAE;QAAA,UAC1D,+DAAC,YAAY;UACX,MAAM,EAAE,IAAI,CAAC,MAAO;UACpB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;UAChC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;UACxB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAoB;UACvC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAiB;UACjC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAe;UAC1C,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UAChC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAQ;UAC5E,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAE9B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,cAAe;UACtC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAmB;UAClD,WAAW,EAAE,WAAY;UACzB,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;UACpC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;UAEhC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAe;UAC1C,sBAAsB,EAAE,IAAI,CAAC,uBAAwB;UAErD,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,aAAc;UAC5F,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAa;UACtC,qBAAqB,EAAE,IAAI,CAAC,yBAA0B;UACtD,gBAAgB,EAAE,IAAI,CAAC,oBAAqB;UAC5C,kBAAkB,EAAE,IAAI,CAAC,sBAAuB;UAEhD,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;UAChC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;UAC5B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;UAChC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,YAAY,EAAE,IAAI,CAAC,gBAAiB;UACpC,YAAY,EAAE,IAAI,CAAC,gBAAiB;UAEpC,YAAY,EAAE,IAAI,CAAC,gBAAiB;UACpC,eAAe,EAAE,IAAI,CAAC,mBAAoB;UAC1C,kBAAkB,EAAE,IAAI,CAAC,sBAAuB;UAChD,gBAAgB,EAAE,IAAI,CAAC,oBAAqB;UAC5C,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,KAAM;UAC7F,gBAAgB,EAAE,IAAI,CAAC,oBAAqB;UAC5C,gBAAgB,EAAE,IAAI,CAAC,oBAAqB;UAE5C,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;UAChC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;UAClC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;UACpC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;UAE5C,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAe;UAE1C,kBAAkB,EAAE,IAAI,CAAC,sBAAuB;UAChD,OAAO,EAAE,IAAI,CAAC,WAAY;UAC1B,iBAAiB,EAAE,IAAI,CAAC,qBAAsB;UAC9C,eAAe,EAAE,IAAI,CAAC,qBAAsB;UAC5C,mBAAmB,EAAE,IAAI,CAAC,uBAAwB;UAClD,SAAS,EAAE,IAAI,CAAC,uBAAwB;UACxC,WAAW,EAAE,IAAI,CAAC,iBAAkB;UACpC,iBAAiB,EAAE,IAAI,CAAC;QAAgB,gBAAE;MAAC,gBACnC,CAAC,GACX,IAAI,EAEP,IAAI,CAAC,KAAK,CAAC,SAAS,GACnB,+DAAC,2CAAQ;QAAC,QAAQ,EAAE;UAAA,UAAK,+DAAC,wDAAgB;YAAC,EAAE,EAAC,cAAc;YAAC,cAAc,EAAC,YAAY;YACtF,WAAW,EAAC;UAAyC,gBAAC;QAAC,gBAAK,CAAE;QAAA,UAC9D,+DAAC,QAAQ;UACP,MAAM,EAAE,IAAI,CAAC,MAAO;UACpB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;UAChC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UACxC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;UAChC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAmB;UAClD,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAC9B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;UAE5B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;UAChC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;UAClC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;UACpC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;UAE5C,UAAU,EAAE,IAAI,CAAC,aAAc;UAC/B,wBAAwB,EAAE,IAAI,CAAC,wBAAyB;UACxD,WAAW,EAAE,IAAI,CAAC,eAAgB;UAClC,mBAAmB,EAAE,IAAI,CAAC,uBAAwB;UAClD,qBAAqB,EAAE,IAAI,CAAC,yBAA0B;UACtD,aAAa,EAAE,IAAI,CAAC,wBAAyB;UAC7C,gBAAgB,EAAE,IAAI,CAAC,2BAA4B;UACnD,YAAY,EAAE,IAAI,CAAC,uBAAwB;UAC3C,YAAY,EAAE,IAAI,CAAC,uBAAwB;UAC3C,aAAa,EAAE,IAAI,CAAC,iBAAkB;UACtC,cAAc,EAAE,IAAI,CAAC,kBAAmB;UACxC,wBAAwB,EAAE,IAAI,CAAC,uBAAwB;UACvD,gBAAgB,EAAE,IAAI,CAAC,eAAgB;UACvC,UAAU,EAAE,IAAI,CAAC,UAAW;UAC5B,OAAO,EAAE,IAAI,CAAC,WAAY;UAE1B,eAAe,EAAE,IAAI,CAAC;QAAsB,gBAC3C;MAAC,gBACI,CAAC,GAEX,IAAI;IAAA,eAEH,CAAC;EAEV;AACF;AAAC;AAED,+DAAe,sDAAU,CAAC,SAAS,CAAC,E;;;;;;;;;;;;;;;;;;;;ACl6FV;AAEiC;AAEd;AAAA;AAE9B,MAAM,eAAe,SAAS,wDAAe,CAAC;EAC3D,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1D,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK,GAAG;MACX,IAAI,EAAE;IACR,CAAC;IAED,IAAI,CAAC,mBAAmB,GAAG,SAAS;IAEpC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;EAC5D;EAGA,kBAAkB,CAAC,KAAK,EAAE;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;IACrD,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IAEA,IAAI,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE;MAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,EAAE;QAC5B,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC,aAAa;QAC9C,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa;MAC1C,CAAC,MAAM;QACL,IAAI,CAAC,mBAAmB,GAAG,SAAS;MACtC;IACF;IAEA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;MACnC,IAAI,CAAC,QAAQ,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC;MAAK,CAAC,CAAC;IACrC;EACF;EAEA,oBAAoB,GAAG;IACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1D,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB;EAChD;EAGA,aAAa,CAAC,IAAI,EAAE;IAClB,IAAI,CAAC,QAAQ,CAAC;MAAC,IAAI,EAAE;IAAI,CAAC,CAAC;IAE3B,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,aAAa,EAAE;MAC9E,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;IAChC;EACF;EAGA,iBAAiB,CAAC,IAAI,EAAE;IACtB,IAAI,CAAC,yDAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;MACxD,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;IACxD;EACF;EAEA,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC,kBAAkB;MAAA,UAC/B,8DAAC,oEAAa;QACZ,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;QAC1B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;QACxB,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAkB;QAChD,YAAY,EAAE,IAAI,CAAC,iBAAkB;QACrC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;MAAQ,gBAAE;IAAC,gBAC9B,CAAC;EAEV;AACF;AAAC,C;;;;;;;;;;;;;;;;;AC7EyB;AACgD;AAAA;AAE1E,MAAM,QAAQ,GAAG,0DAAc,CAAC;EAC9B,KAAK,EAAE;IACL,EAAE,EAAE,cAAc;IAClB,cAAc,EAAE,OAAO;IACvB,WAAW,EAAE;EACf,CAAC;EACD,KAAK,EAAE;IACL,EAAE,EAAE,cAAc;IAClB,cAAc,EAAE,OAAO;IACvB,WAAW,EAAE;EACf;AACF,CAAC,CAAC;AAEF,MAAM,cAAc,SAAS,4DAAmB,CAAC;EAC/C,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG;MACX,IAAI,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;MAC1B,YAAY,EAAE,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;EAClD;EAEA,OAAO,wBAAwB,CAAC,SAAS,EAAE,SAAS,EAAE;IACpD,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,YAAY,EAAE;MAChD,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,QAAQ,IAAI,EAAE;QAC9B,YAAY,EAAE,SAAS,CAAC;MAC1B,CAAC;IACH;IAEA,OAAO,SAAS;EAClB;EAEA,iBAAiB,GAAG;IAElB,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;MACvB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IACvF;EACF;EAEA,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE;IAEvC,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE;MACnF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IACnF;EACF;EAGA,gBAAgB,CAAC,CAAC,EAAE;IAClB,IAAI,CAAC,QAAQ,CAAC;MAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE;IAAC,CAAC,CAAC;EAC7D;EAEA,cAAc,CAAC,CAAC,EAAE;IAChB,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE;MACrB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACtB,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,QAAQ,EAAE;MAC5B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACtB;EACF;EAEA,YAAY,CAAC,CAAC,EAAE;IACd,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;MAC7C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IAC1F;EACF;EAEA,YAAY,CAAC,CAAC,EAAE;IACd,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;EACvB;EAEA,MAAM,GAAG;IACP,MAAM;MAAE;IAAc,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;IACzC,MAAM,OAAO,GAAG;MAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;MAAE,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK;IAAC,CAAC;IAC9F,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU;IACtE,OACE;MAAK,SAAS,EAAC,YAAY;MAAA,WACzB;QAAK,SAAS,EAAC,gBAAgB;QAAA,UAC7B;UAAO,SAAS,EAAC,YAAY;UAAC,OAAO,EAAC,yBAAyB;UAAA,UAC7D,8DAAC,wDAAgB;YAAC,EAAE,EAAC,gCAAgC;YACnD,cAAc,EAAC,mBAAmB;YAClC,WAAW,EAAC,oCAAoC;YAChD,MAAM,EAAE;cAAC,MAAM,EAAE;YAAM;UAAE,gBAAE;QAAC,gBACzB;MAAC,gBACL,CAAC,EACN;QAAK,SAAS,EAAC,gBAAgB;QAAA,UAC7B,8DAAC,wDAAgB;UAAC,EAAE,EAAC,kCAAkC;UACrD,cAAc,EAAC,cAAc;UAAC,WAAW,EAAC,sCAAsC;UAAA,UAC/E,YAAY,IAAK;YAAO,IAAI,EAAC,MAAM;YAAC,EAAE,EAAC,yBAAyB;YAC/D,WAAW,EAAE,YAAa;YAC1B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAK;YAAC,QAAQ,EAAE,IAAI,CAAC,gBAAiB;YACxD,SAAS,EAAE,IAAI,CAAC,cAAe;YAAC,QAAQ;UAAA,gBAAE;QAAC,gBAC5B;MAAC,gBACjB,CAAC,EACN;QAAK,SAAS,EAAC,gBAAgB;QAAA,WAC7B;UAAQ,SAAS,EAAC,WAAW;UAAC,OAAO,EAAE,IAAI,CAAC,YAAa;UAAA,UACvD,8DAAC,wDAAgB;YAAC,EAAE,EAAC,eAAe;YAAC,cAAc,EAAC,QAAQ;YAAC,WAAW,EAAC;UAAiB,gBAAE;QAAC,gBACvF,CAAC,EACT;UAAQ,SAAS,EAAC,SAAS;UAAC,OAAO,EAAE,IAAI,CAAC,YAAa;UAAA,UACrD,8DAAC,wDAAgB;YAAC,EAAE,EAAC,gBAAgB;YAAC,cAAc,EAAC,SAAS;YAAC,WAAW,EAAC;UAAkB,gBAAE;QAAC,gBAC1F,CAAC;MAAA,eACN,CAAC;IAAA,eACH,CAAC;EAEV;AACF;AAAC;AAED,+DAAe,sDAAU,CAAC,cAAc,CAAC,E;;;;;;;;;;;;;;;;;;;;;;;ACtHf;AAE4B;AAEJ;AASxB;AACiE;AAAA;AAE3F,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK;EACjC,IAAI,IAAI,GAAG,0DAAc,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;EACrE,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK;IACrD,IAAI,GAAG,KAAK,GAAG,0DAAc,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,0DAAc,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC;EACxG,CAAC,CAAC;EACF,0DAAc,CAAC,UAAU,CAAC,IAAI,CAAC;AACjC,CAAC;AAEM,MAAM,6BAA6B,GAAG,CAC3C,WAAW,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EAClH,qBAAqB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,EACtF,uBAAuB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,uBAAuB,EAC9F,mBAAmB,EAAE,0BAA0B,CAChD;AAED,SAAS,IAAI,CAAC;EAAC;AAAQ,CAAC,EAAE;EAAE,OAAO;IAAG,SAAS,EAAC,gBAAgB;IAAC,eAAY,MAAM;IAAA,UAAE;EAAQ,gBAAI,CAAC;AAAE;AAEpG,SAAS,MAAM,CAAC;EAAC,KAAK;EAAE,IAAI,GAAG,WAAW;EAAE,MAAM;EAAE,WAAW;EAAE,QAAQ;EAAE;AAAc,CAAC,EAAE;EAC1F,OAAO;IAAQ,SAAS,EAAC,kBAAkB;IAAA,WACzC;MAAQ,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,MAAM;QAAE,IAAI,CAAC,0DAAc,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC;MAAE,CAAE;MAAC,cAAW,IAAI;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAC;MAAkB,gBAAM;IAAC,gBAAQ,CAAC,EAChJ;MAAA,UAAK;IAAK,gBAAK,CAAC,EACf,MAAM,GAAG;MAAQ,IAAI,EAAC,QAAQ;MAAC,OAAO,EAAE,QAAS;MAAC,cAAY,WAAW,IAAI,IAAK;MAAC,QAAQ,EAAE,cAAe;MAAA,UAAC,8DAAC,IAAI;QAAA,UAAE;MAAM,gBAAO;IAAC,gBAAQ,CAAC,GAAG,uFAAO,CAAC;EAAA,eACjJ,CAAC;AACX;AAEA,SAAS,KAAK,CAAC;EAAC,OAAO;EAAE;AAAM,CAAC,EAAE;EAChC,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,OAAO,EAAE,OAAO,SAAS;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC;IAC7C,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;EACzC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACrB,OAAO,OAAO,GAAG;IAAK,SAAS,EAAC,iBAAiB;IAAC,IAAI,EAAC,QAAQ;IAAA,UAAE;EAAO,gBAAM,CAAC,GAAG,IAAI;AACxF;AAGA,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;AAC3D,SAAS,iBAAiB,CAAC,CAAC,EAAE;EAC5B,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC;EACtB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAC9E,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC;EAC3E,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,GAAG,MAAM,GAAG,OAAO,KAAK,CAAC,GAAG,MAAM,GAAG,OAAO,KAAK,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE;EAC7F,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE;AAC/E;AACA,SAAS,UAAU,CAAC,CAAC,EAAE;EACrB,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;AAC9F;AAMA,SAAS,gBAAgB,CAAC,CAAC,EAAE;EAC3B,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;AAClH;AAKA,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC;AAC3B,SAAS,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE;EACnC,IAAI,CAAC,EAAE,EAAE;EACT,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;IAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAAE;EAAQ;EAC5D,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE;EAC3D,8DAAc,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,UAAU,GAAG,8DAAc,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;IACvG,MAAM,IAAI,GAAI,CAAC,KAAK,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,cAAc,CAAC,IAAK,EAAE;IAC5E,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;IACvB,MAAM,CAAC,IAAI,CAAC;EACd,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;IAAE,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;IAAE,MAAM,CAAC,EAAE,CAAC;EAAE,CAAC,CAAC;AACxD;AAMA,SAAS,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE;EACnC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC,CAAC;EAC5C,sDAAe,CAAC,MAAM;IACpB,CAAC,GAAG,IAAI,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI;MACxB,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE;MACpC,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE;MACvD,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,EAAE;QAAE,QAAQ,CAAC,CAAC,KAAK;UAAC,GAAG,CAAC;UAAE,CAAC,EAAE,GAAG;QAAG,CAAC,CAAC,CAAC;QAAE;MAAQ;MACrF,eAAe,CAAC,EAAE,EAAE,IAAI,IAAI,QAAQ,CAAC,CAAC,KAAK;QAAC,GAAG,CAAC;QAAE,CAAC,EAAE,GAAG;MAAI,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC;EAEJ,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;EACnC,OAAO,KAAK;AACd;AAMA,MAAM,SAAS,GAAG;EAAC,YAAY,EAAE,KAAK;EAAE,UAAU,EAAE,QAAQ;EAAE,QAAQ,EAAE,MAAM;EAAE,aAAa,EAAE,QAAQ;EAAE,eAAe,EAAE,QAAQ;EAAE,iBAAiB,EAAE;AAAO,CAAC;AAC/J,MAAM,SAAS,GAAG;EAAC,YAAY,EAAE,cAAc;EAAE,UAAU,EAAE,UAAU;EAAE,QAAQ,EAAE,sBAAsB;EAAE,aAAa,EAAE,UAAU;EAAE,eAAe,EAAE,YAAY;EAAE,iBAAiB,EAAE;AAAc,CAAC;AACvM,MAAM,UAAU,GAAG;EAAC,YAAY,EAAE,wBAAwB;EAAE,QAAQ,EAAE,kBAAkB;EAAE,aAAa,EAAE,mBAAmB;EAAE,eAAe,EAAE,qBAAqB;EAAE,iBAAiB,EAAE;AAAmB,CAAC;AAE7M,SAAS,SAAS,CAAC;EAAC;AAAO,CAAC,EAAE;EAI5B,MAAM,CAAC,EAAE,CAAC,GAAG,sEAAa,CAAC,IAAI,EAAE,iDAAK,EAAE,EAAE,CAAC;EAC3C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAM,uEAAc,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;EAC7F,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC,CAAC;EAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAE9C,sDAAe,CAAC,MAAM;IACpB,4DAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;MAC1B,MAAM,IAAI,GAAI,IAAI,IAAI,IAAI,CAAC,OAAO,IAAK,EAAE;MACzC,wEAAe,CAAC,mBAAmB,EAAE,IAAI,CAAC;MAC1C,UAAU,CAAC,IAAI,CAAC;MAChB,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI;QAChB,IAAI,CAAC,CAAC,YAAY,EAAE;UAClB,0DAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,QAAQ,CAAC,CAAC,KAAK;YAAC,GAAG,CAAC;YAAE,CAAC,CAAC,CAAC,IAAI,GAAG;UAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACvG;MACF,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;EACrD,CAAC,EAAE,EAAE,CAAC;EAEN,MAAM,OAAO,GAAG,GAAG,IAAI;IACrB,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;MAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;MAAE;IAAQ;IACpE,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;EAC/B,CAAC;EAED,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,CAAC,OAAO;EAChC,OAAO;IAAK,SAAS,EAAC,+BAA+B;IAAA,WAAC;MAAA,WACpD;QAAS,SAAS,EAAC,mBAAmB;QAAA,WACnC,OAAO,IAAI,OAAO,CAAC,cAAc,GAChC,8DAAC,WAAW;UAAC,MAAM,EAAE,OAAO,CAAC;QAAe,gBAAE,CAAC,GAC/C;UAAM,SAAS,EAAC,2BAA2B;UAAA,UAAC,8DAAC,IAAI;YAAA,UAAC;UAAM,gBAAM;QAAC,gBAAM,CAAC,EACxE;UAAA,WAAM;YAAA,UAAU,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC,IAAK;UAAG,gBAAS,CAAC,EACvF;YAAA,UAAO;UAAE,gBAAO,CAAC;QAAA,eAAM,CAAC,EAC1B;UAAQ,IAAI,EAAC,QAAQ;UAAC,cAAW,OAAO;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,iBAAiB,CAAE;UAAA,UAAC,8DAAC,IAAI;YAAA,UAAC;UAAI,gBAAM;QAAC,gBAAQ,CAAC;MAAA,eACxG,CAAC,EACV;QAAS,SAAS,EAAC,kBAAkB;QAAA,WAAC;UAAA,WAAK;YAAA,UAAQ;UAAW,gBAAQ,CAAC;YAAA,UAAO;UAA8C,gBAAO,CAAC;QAAA,eAAK,CAAC,gEAAC,IAAI;UAAA,UAAC;QAAe,gBAAM,CAAC;MAAA,eAAS,CAAC,EAC/K,KAAK,GAAG;QAAG,SAAS,EAAC,iBAAiB;QAAA,UAAE;MAAK,gBAAI,CAAC,GAAG,IAAI,EAC1D;QAAS,SAAS,EAAC,gBAAgB;QAAC,cAAW,MAAM;QAAA,UAAE,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI;UAAQ,IAAI,EAAC,QAAQ;UAAgB,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,CAAE;UAAA,WAShK;YAAM,SAAS,EAAE,OAAO,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAE;YAAA,WACxD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG;cAAK,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAE;cAAC,GAAG,EAAC;YAAE,gBAAE,CAAC,GAAG,8DAAC,IAAI;cAAA,UAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI;YAAM,gBAAO,CAAC,EACrG,GAAG,CAAC,YAAY,GAAG;cAAA,UAAK,GAAG,CAAC,YAAY,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,CAAC;YAAY,gBAAK,CAAC,GAAG,IAAI;UAAA,eAClF,CAAC,EACP;YAAA,UAAS,GAAG,CAAC;UAAI,gBAAS,CAAC;QAAA,GAb+F,GAAG,CAAC,IAAI,MAc5H,CAAC;MAAC,gBAAU,CAAC;IAAA,eACjB,CAAC;MAAK,SAAS,EAAC,sBAAsB;MAAC,cAAW,KAAK;MAAA,WAC3D;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,QAAQ;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAS,gBAAM,CAAC;UAAA,UAAM;QAAG,gBAAM,CAAC;MAAA,eAAQ,CAAC,EACxF;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,eAAe,CAAE;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAmB,gBAAM,CAAC;UAAA,UAAM;QAAE,gBAAM,CAAC;MAAA,eAAQ,CAAC;IAAA,eACrH,CAAC;EAAA,eAAK,CAAC;AACd;AAKA,SAAS,WAAW,CAAC;EAAC,MAAM;EAAE;AAAS,CAAC,EAAE;EACxC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAC1C,sDAAe,CAAC,MAAM;IAAE,IAAI,IAAI,GAAG,IAAI;IAAE,0DAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAAE,OAAO,MAAM;MAAE,IAAI,GAAG,KAAK;IAAE,CAAC;EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;EACtJ,OAAO,GAAG,GAAG;IAAK,SAAS,EAAE,SAAU;IAAC,GAAG,EAAE,GAAI;IAAC,GAAG,EAAC;EAAE,gBAAE,CAAC,GAAG;IAAM,SAAS,EAAE;EAAU,gBAAE,CAAC;AAC9F;AAQA,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACzE,MAAM,UAAU,GAAG,CAAC,IAAI,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;AAE1D,SAAS,OAAO,CAAC;EAAC,IAAI;EAAE,KAAK;EAAE,QAAQ;EAAE;AAAQ,CAAC,EAAE;EAClD,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,GAAG,UAAU,GAAG,SAAS;EACjD,OAAO;IAAQ,IAAI,EAAC,QAAQ;IAAC,SAAS,EAAE,iCAAiC,KAAK,GAAG,QAAQ,GAAG,WAAW,GAAG,EAAE,EAAG;IAC7G,KAAK,EAAE;MAAC,WAAW,EAAE,GAAG,CAAC,GAAG,KAAK,GAAG,GAAG;IAAK,CAAE;IAAC,OAAO,EAAE,QAAS;IAAA,WACjE,8DAAC,IAAI;MAAA,UAAE;IAAI,gBAAO,CAAC,EACnB;MAAA,UAAM;QAAA,WAAS,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,GAAG,GAAG,IAAI,CAAC,YAAY,GAAG,GAAG,EAAE,EAAC,GAAC,EAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,EAAC,IAAE;MAAA,eAAQ;IAAC,gBAAM,CAAC,EACzI,8DAAC,IAAI;MAAA,UAAE,QAAQ,GAAG,aAAa,GAAG;IAAe,gBAAO,CAAC;EAAA,eACnD,CAAC;AACX;AAIA,SAAS,aAAa,CAAC;EAAC;AAAI,CAAC,EAAE;EAC7B,OAAO;IAAK,SAAS,EAAC,iCAAiC;IAAC,KAAK,EAAE;MAAC,WAAW,EAAE;IAAM,CAAE;IAAA,WACnF,8DAAC,IAAI;MAAA,UAAC;IAAQ,gBAAM,CAAC,EACrB;MAAA,UAAM;QAAA,WAAS,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,GAAG,IAAI,IAAI,CAAC,YAAY,IAAI,GAAG,EAAE;MAAA,eAAS;IAAC,gBAAM,CAAC;EAAA,eAC9G,CAAC;AACR;AAEA,SAAS,SAAS,CAAC;EAAC,MAAM;EAAE,KAAK;EAAE,IAAI;EAAE;AAAK,CAAC,EAAE;EAC/C,OAAO;IAAQ,IAAI,EAAC,QAAQ;IAAC,SAAS,EAAE,sBAAsB,IAAI,GAAG,KAAK,GAAG,EAAE,EAAG;IAChF,KAAK,EAAE;MAAC,WAAW,EAAE,GAAG,CAAC,GAAG,KAAK,GAAG,GAAG;IAAK,CAAE;IAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,sBAAsB,EAAE;MAAC,GAAG,EAAE,MAAM,CAAC;IAAO,CAAC,CAAE;IAAA,WACtH,8DAAC,IAAI;MAAA,UAAC;IAAsB,gBAAM,CAAC,EACnC;MAAA,UAAM;QAAA,WAAS,MAAM,CAAC,YAAY,EAAC,GAAC,EAAC,UAAU,CAAC,KAAK,CAAC,EAAC,IAAE;MAAA,eAAQ;IAAC,gBAAM,CAAC,EACzE,8DAAC,IAAI;MAAA,UAAC;IAAa,gBAAM,CAAC;EAAA,eACpB,CAAC;AACX;AAIA,SAAS,QAAQ,CAAC;EAAC,IAAI;EAAE,KAAK;EAAE;AAAQ,CAAC,EAAE;EACzC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,KAAK,KAAK,CAAC,CAAC;EAC3D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EACpD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAClD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACnD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAEvD,MAAM,IAAI,GAAG,MAAM;IACjB,IAAI,QAAQ,IAAI,IAAI,EAAE;IACtB,UAAU,CAAC,IAAI,CAAC;IAChB,YAAY,CAAC,KAAK,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,CACV,IAAI,CAAC,WAAW,GAAG,0EAA0B,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EACjI,IAAI,CAAC,YAAY,GAAG,gFAAgC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CACrI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK;MAAE,WAAW,CAAC,KAAK,CAAC;MAAE,UAAU,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC,CAIlE,KAAK,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC,CAC/B,OAAO,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;EACrC,CAAC;EAED,MAAM,MAAM,GAAG,MAAM;IAAE,MAAM,IAAI,GAAG,CAAC,QAAQ;IAAE,WAAW,CAAC,IAAI,CAAC;IAAE,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC;EAAE,CAAC;EACrF,sDAAe,CAAC,MAAM;IAAE,IAAI,QAAQ,EAAE,IAAI,CAAC,CAAC;EAA6D,CAAC,EAAE,EAAE,CAAC;EAE/G,OAAO;IAAA,WACL,8DAAC,OAAO;MAAC,IAAI,EAAE,IAAK;MAAC,KAAK,EAAE,KAAM;MAAC,QAAQ,EAAE,QAAS;MAAC,QAAQ,EAAE;IAAO,gBAAE,CAAC,EAC1E,QAAQ,IAAI,OAAO,GAAG;MAAG,SAAS,EAAC,sBAAsB;MAAA,UAAC;IAAI,gBAAG,CAAC,GAAG,IAAI,EACzE,QAAQ,IAAI,CAAC,OAAO,IAAI,SAAS,GAChC;MAAG,SAAS,EAAC,sBAAsB;MAAA,WAAC,OAAK;QAAG,IAAI,EAAC,GAAG;QAAC,OAAO,EAAE,CAAC,IAAI;UAAE,CAAC,CAAC,cAAc,CAAC,CAAC;UAAE,IAAI,CAAC,CAAC;QAAE,CAAE;QAAA,UAAC;MAAE,gBAAG,CAAC;IAAA,eAAG,CAAC,GAAG,IAAI,EACtH,QAAQ,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,GAAG;MAAA,WACnC,CAAC,QAAQ,IAAI,EAAE,EAAE,GAAG,CAAC,KAAK,IAAI,8DAAC,QAAQ;QAA2B,IAAI,EAAE,KAAM;QAAC,KAAK,EAAE,KAAK,GAAG,CAAE;QAAC,QAAQ,EAAE;MAAS,GAAvE,KAAK,CAAC,aAAa,OAAsD,CAAC,CAAC,EACxH,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,MAAM,IAAI,8DAAC,SAAS;QAAsB,MAAM,EAAE,MAAO;QAAC,KAAK,EAAE,KAAK,GAAG,CAAE;QAC9F,KAAK,EAAE,KAAK,GAAG,CAAE;QAAC,IAAI,EAAE,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,KAAK;MAAS,GAD9C,MAAM,CAAC,OAAO,OACkC,CAAC,CAAC;IAAA,eACjG,CAAC,GAAG,IAAI;EAAA,eACV,CAAC;AACL;AAEA,SAAS,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE;EACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC;EACvE,IAAI,IAAI,IAAI,CAAC,EAAE,OAAO,EAAE;EACxB,IAAI,IAAI,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,EAAE,IAAI;EAC5C,IAAI,IAAI,GAAG,EAAE,EAAE,OAAO,GAAG,IAAI,IAAI;EACjC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,KAAK,IAAI,GAAG,EAAE,IAAI;AACnD;AAEA,MAAM,cAAc,GAAG;EAAC,QAAQ,EAAE,KAAK;EAAE,QAAQ,EAAE,KAAK;EAAE,SAAS,EAAE;AAAI,CAAC;AAM1E,SAAS,WAAW,CAAC;EAAC,OAAO;EAAE,QAAQ;EAAE,SAAS;EAAE;AAAO,CAAC,EAAE;EAC5D,MAAM,aAAa,GAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,YAAY,IAAK,OAAO,CAAC,sBAAsB,IAAI,OAAO,CAAC,YAAY;EACrI,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;EAClG,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,KAAK,QAAQ;EACrD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAE7C,MAAM,OAAO,GAAG,QAAQ,IAAI;IAC1B,OAAO,CAAC,IAAI,CAAC;IAIb,0DAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,8DAAc,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAChH,SAAS,CAAC,CAAC;MACX,OAAO,CAAC,QAAQ,KAAK,UAAU,GAAG,SAAS,GAAG,QAAQ,KAAK,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC/F,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;EAC/E,CAAC;EAED,OAAO;IAAS,SAAS,EAAC,cAAc;IAAA,WACtC;MAAA,WAAQ;QAAA,WAAM;UAAA,WAAQ,iBAAiB,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAC,GAAC,EAAC,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAAA,eAAQ,CAAC,EACnH;UAAA,WAAQ,OAAK,EAAC,OAAO,CAAC,KAAK;QAAA,eAAS,CAAC;MAAA,eAAM,CAAC,EAC5C;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,cAAc;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,gBAAgB,EAAE;UAAC,UAAU,EAAE,OAAO,CAAC;QAAU,CAAC,CAAE;QAAA,WAAC,MAAI,gEAAC,IAAI;UAAA,UAAC;QAAa,gBAAM,CAAC;MAAA,eAAQ,CAAC;IAAA,eAC7J,CAAC,EACT;MAAA,WACE;QAAA,WAAK;UAAA,UAAI;QAAG,gBAAI,CAAC;UAAA,UAAK;QAAa,gBAAK,CAAC;MAAA,eAAK,CAAC,EAC/C;QAAA,WAAK;UAAA,UAAI;QAAE,gBAAI,CAAC;UAAA,UAAK,iBAAiB,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAC,gBAAK,CAAC;MAAA,eAAK,CAAC,EAC7E,OAAO,CAAC,QAAQ,GAAG;QAAA,WAAK;UAAA,UAAI;QAAE,gBAAI,CAAC;UAAA,UAAK,OAAO,CAAC;QAAQ,gBAAK,CAAC;MAAA,eAAK,CAAC,GAAG,IAAI,EAC5E;QAAA,WAAK;UAAA,UAAI;QAAG,gBAAI,CAAC;UAAI,SAAS,EAAC,mBAAmB;UAAA,UAAE,aAAa,IAAI;QAAG,gBAAK,CAAC;MAAA,eAAK,CAAC,EACpF;QAAA,WAAK;UAAA,UAAI;QAAI,gBAAI,CAAC;UAAA,UAAK,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM;QAAC,gBAAK,CAAC;MAAA,eAAK,CAAC;IAAA,eAChF,CAAC,EACJ,CAAC,WAAW,GACX,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,GACtD;MAAA,UAAQ;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,mBAAmB;QAAC,QAAQ;QAAA,UAAE,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC;MAAW,gBAAS;IAAC,gBAAQ,CAAC,GACnJ;MAAQ,SAAS,EAAC,kBAAkB;MAAA,WAClC;QAAQ,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAE,IAAK;QAAC,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,CAAE;QAAA,UAAC;MAAE,gBAAQ,CAAC,EACrF;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,SAAS;QAAC,QAAQ,EAAE,IAAK;QAAC,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,CAAE;QAAA,UAAC;MAAE,gBAAQ,CAAC;IAAA,eACnG,CAAC,GACT,IAAI;EAAA,eACD,CAAC;AACZ;AAEA,SAAS,QAAQ,CAAC;EAAC;AAAO,CAAC,EAAE;EAC3B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,MAAM,uEAAc,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;EACxF,MAAM,CAAC,EAAE,CAAC,GAAG,sEAAa,CAAC,IAAI,EAAE,iDAAK,EAAE,EAAE,CAAC;EAC3C,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,CAAC,OAAO;EAEjC,MAAM,IAAI,GAAG,MAAM,2DAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;IACzC,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;IACxC,wEAAe,CAAC,UAAU,EAAE,IAAI,CAAC;IACjC,WAAW,CAAC,IAAI,CAAC;EACnB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;EAG/C,sDAAe,CAAC,MAAM;IAAE,IAAI,CAAC,CAAC;EAAE,CAAC,EAAE,EAAE,CAAC;EAEtC,OAAO;IAAK,SAAS,EAAC,gBAAgB;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,MAAM,EAAC,KAAK;MAAC,WAAW,EAAC,MAAM;MAAC,QAAQ,EAAE,MAAM,QAAQ,CAAC,gBAAgB;IAAE,gBAAE,CAAC,EACxI;MAAM,SAAS,EAAC,cAAc;MAAA,UAC3B,QAAQ,IAAI,IAAI,GAAG;QAAG,SAAS,EAAC,sBAAsB;QAAA,UAAC;MAAI,gBAAG,CAAC,GAC9D,QAAQ,CAAC,MAAM,KAAK,CAAC,GAAG;QAAG,SAAS,EAAC,sBAAsB;QAAA,UAAC;MAAM,gBAAG,CAAC,GACtE,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,8DAAC,WAAW;QAAoB,OAAO,EAAE,CAAE;QAAC,QAAQ,EAAE,QAAS;QAAC,SAAS,EAAE,IAAK;QAAC,OAAO,EAAE;MAAQ,GAAhF,CAAC,CAAC,UAAU,OAAsE,CAAC;IAAC,gBACtH,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,aAAa,CAAC;EAAC,UAAU;EAAE;AAAO,CAAC,EAAE;EAC5C,MAAM,SAAS,GAAG,UAAU,IAAI,UAAU,CAAC,UAAU;EACrD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAO,SAAS,IAAI,uEAAc,CAAC,UAAU,GAAG,SAAS,CAAC,IAAK,IAAI,CAAC;EACjH,MAAM,CAAC,EAAE,CAAC,GAAG,sEAAa,CAAC,IAAI,EAAE,iDAAK,EAAE,EAAE,CAAC;EAC3C,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,CAAC,OAAO;EACjC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC7C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAKvD,MAAM,cAAc,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,YAAY,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;EAClF,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,cAAc,CAAC,GAAG,EAAE;EACxE,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC;EACrD,MAAM,OAAO,GAAG,CAAC,EAAE,EAAE,QAAQ,KAAK;IAChC,IAAI,QAAQ,IAAI,QAAQ,KAAK,EAAE,EAAE,OAAO,QAAQ;IAChD,OAAQ,EAAE,IAAI,aAAa,CAAC,EAAE,CAAC,IAAK,QAAQ,IAAI,EAAE;EACpD,CAAC;EAED,MAAM,IAAI,GAAG,MAAM,SAAS,IAAI,0DAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;IAAE,wEAAe,CAAC,UAAU,GAAG,SAAS,EAAE,CAAC,CAAC;IAAE,UAAU,CAAC,CAAC,CAAC;EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;IAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC;IAAE,YAAY,CAAC,IAAI,CAAC;EAAE,CAAC,CAAC;EACrM,sDAAe,CAAC,MAAM;IAIpB,IAAI,SAAS,EAAE,UAAU,CAAC,uEAAc,CAAC,UAAU,GAAG,SAAS,CAAC,IAAI,IAAI,CAAC;IACzE,IAAI,CAAC,CAAC;EAER,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;EAEf,IAAI,CAAC,OAAO,EAAE,OAAO;IAAK,SAAS,EAAC,gBAAgB;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC;IAAkB,gBAAE,CAAC;MAAA,UAAM;QAAG,SAAS,EAAC,sBAAsB;QAAA,UAAE,SAAS,GAAG,UAAU,GAAG;MAAM,gBAAI;IAAC,gBAAM,CAAC;EAAA,eAAK,CAAC;EAEhM,MAAM,MAAM,GAAG;IAAC,QAAQ,EAAE,CAAC;IAAE,OAAO,EAAE,CAAC;IAAE,QAAQ,EAAE,CAAC;IAAE,SAAS,EAAE;EAAC,CAAC;EACnE,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI;IAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;EAAE,CAAC,CAAC;EAClG,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,KAAK,QAAQ;EAErD,MAAM,MAAM,GAAG,MAAM;IACnB,OAAO,CAAC,IAAI,CAAC;IACb,oEAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;EACpJ,CAAC;EACD,MAAM,MAAM,GAAG,MAAM;IACnB,OAAO,CAAC,IAAI,CAAC;IAGb,0DAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,6DAAa,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CACzF,IAAI,CAAC,CAAC,IAAI;MAAE,OAAO,CAAC,OAAO,CAAC;MAAE,IAAI,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;EACxH,CAAC;EACD,MAAM,OAAO,GAAG,QAAQ,IAAI;IAC1B,OAAO,CAAC,IAAI,CAAC;IACb,0DAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,8DAAc,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CACpG,IAAI,CAAC,CAAC,IAAI;MAAE,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,CAAC;MAAE,IAAI,CAAC,CAAC;IAAE,CAAC,CAAC,CAClG,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;EAC/E,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,gBAAgB;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC;IAAkB,gBAAE,CAAC,EACpF;MAAM,SAAS,EAAC,cAAc;MAAA,WAC5B;QAAS,SAAS,EAAC,cAAc;QAAA,WAC/B;UAAA,UAAQ;YAAA,WAAM;cAAA,WAAQ,iBAAiB,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAC,GAAC,EAAC,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAAA,eAAQ,CAAC,EACnH;cAAA,WAAQ,OAAK,EAAC,OAAO,CAAC,KAAK;YAAA,eAAS,CAAC;UAAA,eAAM;QAAC,gBAAQ,CAAC,EACvD;UAAA,WACE;YAAA,WAAK;cAAA,UAAI;YAAG,gBAAI,CAAC;cAAA,UAAK,OAAO,CAAC,OAAO,CAAC,YAAY,EAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,YAAY,IAAK,OAAO,CAAC,sBAAsB;YAAC,gBAAK,CAAC;UAAA,eAAK,CAAC,EACxJ;YAAA,WAAK;cAAA,UAAI;YAAE,gBAAI,CAAC;cAAA,WAAK,iBAAiB,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAC,GAAC,EAAC,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAC,KAAG,EAAC,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAAA,eAAK,CAAC;UAAA,eAAK,CAAC,EAC/J,OAAO,CAAC,QAAQ,GAAG;YAAA,WAAK;cAAA,UAAI;YAAE,gBAAI,CAAC;cAAA,UAAK,OAAO,CAAC;YAAQ,gBAAK,CAAC;UAAA,eAAK,CAAC,GAAG,IAAI,EAC5E;YAAA,WAAK;cAAA,UAAI;YAAI,gBAAI,CAAC;cAAA,UAAK,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM;YAAC,gBAAK,CAAC;UAAA,eAAK,CAAC;QAAA,eAChF,CAAC,EACL;UAAI,SAAS,EAAC,0BAA0B;UAAA,UACrC,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI;YAAA,WACrC;cAAA,UAAO,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY;YAAC,gBAAO,CAAC,EACjD;cAAI,SAAS,EAAE,CAAC,CAAC,QAAS;cAAA,UAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI;YAAK,gBAAK,CAAC;UAAA,GAFvB,CAAC,CAAC,OAAO,MAGrD,CAAC;QAAC,gBACJ,CAAC,EACJ,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,WAAW,KAAK,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,GACpI;UAAQ,SAAS,EAAC,kBAAkB;UAAA,WAClC;YAAQ,IAAI,EAAC,QAAQ;YAAC,QAAQ,EAAE,IAAK;YAAC,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,CAAE;YAAA,UAAC;UAAI,gBAAQ,CAAC,EACvF;YAAQ,IAAI,EAAC,QAAQ;YAAC,QAAQ,EAAE,IAAK;YAAC,OAAO,EAAE,MAAM,OAAO,CAAC,WAAW,CAAE;YAAA,UAAC;UAAE,gBAAQ,CAAC,EACtF;YAAQ,IAAI,EAAC,QAAQ;YAAC,SAAS,EAAC,SAAS;YAAC,QAAQ,EAAE,IAAK;YAAC,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,CAAE;YAAA,UAAC;UAAE,gBAAQ,CAAC;QAAA,eACnG,CAAC,GAAG,IAAI;MAAA,eACX,CAAC,EACT,WAAW,GAAG;QAAS,SAAS,EAAC,gBAAgB;QAAA,WAChD;UAAA,UAAI;QAAI,gBAAI,CAAC,EACb;UAAA,WAAK;YAAA,WAAM;cAAA,UAAI,MAAM,CAAC;YAAQ,gBAAI,CAAC;cAAA,UAAO;YAAG,gBAAO,CAAC;UAAA,eAAM,CAAC;YAAA,WAAM;cAAA,UAAI,MAAM,CAAC;YAAO,gBAAI,CAAC;cAAA,UAAO;YAAG,gBAAO,CAAC;UAAA,eAAM,CAAC;YAAA,WAAM;cAAA,UAAI,MAAM,CAAC;YAAQ,gBAAI,CAAC;cAAA,UAAO;YAAG,gBAAO,CAAC;UAAA,eAAM,CAAC;QAAA,eAAK,CAAC,EAC/K;UAAA,WACG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,UAAU,GAAG;YAAQ,IAAI,EAAC,QAAQ;YAAC,QAAQ,EAAE,IAAK;YAAC,OAAO,EAAE,MAAO;YAAA,WAAC,8DAAC,IAAI;cAAA,UAAC;YAAa,gBAAM,CAAC,SAAK;UAAA,eAAQ,CAAC,GAAG,IAAI,EAG9J,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,UAAU,IAAI,OAAO,CAAC,KAAK,KAAK,UAAU,GAAG;YAAQ,IAAI,EAAC,QAAQ;YAAC,SAAS,EAAC,QAAQ;YAAC,QAAQ,EAAE,IAAK;YAAC,OAAO,EAAE,MAAO;YAAA,UAAC;UAAI,gBAAQ,CAAC,GAAG,IAAI;QAAA,eACjL,CAAC;MAAA,eACF,CAAC,GAAG,IAAI;IAAA,eACb,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,aAAa,CAAC;EAAC,QAAQ;EAAE,MAAM;EAAE;AAAO,CAAC,EAAE;EAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;EACpE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACpD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACtD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC,CAAC;EAC5C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAEzD,sDAAe,CAAC,MAAM;IACpB,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM;MACrC,sEAAsB,CAAC;QAAC;MAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,aAAa,CAAC,EAAE,CAAC,CAAC;IACrH,CAAC,EAAE,GAAG,CAAC;IACP,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;EAC1C,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EAEX,MAAM,MAAM,GAAG,GAAG,IAAI;IACpB,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC;IACpD,IAAI,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK;MAAC,GAAG,CAAC;MAAE,CAAC,GAAG,GAAG,IAAI,CAAC;IAAY,CAAC,CAAC,CAAC;EAC7D,CAAC;EAED,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK;IAAC,IAAI,EAAE,CAAC,CAAC,OAAO;IAAE,MAAM,EAAE;MAAC,EAAE,EAAE,CAAC,CAAC;IAAY;EAAC,CAAC,CAAC,CAAC;EAEvF,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;MAC7E,OAAO,CAAC,gBAAgB,CAAC;MACzB;IACF;IACA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,SAAS,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;IAI7D,IAAI,KAAK,IAAI,OAAO,EAAE;MAAE,OAAO,CAAC,aAAa,CAAC;MAAE;IAAQ;IACxD,aAAa,CAAC,IAAI,CAAC;IACnB,6DAAa,CAAC;MAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;MAAE,QAAQ,EAAE,OAAO;MAAE,MAAM,EAAE,KAAK;MAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;MAAE,iBAAiB,EAAE;IAAQ,CAAC,CAAC,CAC3H,IAAI,CAAC,CAAC,IAAI;MAAE,OAAO,CAAC,OAAO,CAAC;MAAE,QAAQ,CAAC,kBAAkB,CAAC;IAAE,CAAC,CAAC,CAC9D,KAAK,CAAC,GAAG,IAAI,OAAO,CAAE,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,QAAQ,GAAI,aAAa,GAAI,GAAG,CAAC,OAAO,IAAI,QAAS,CAAC,CAAC,CAClH,OAAO,CAAC,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;EACxC,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,mCAAmC;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC;IAAkB,gBAAE,CAAC,EACvG;MAAA,WACE;QAAO,SAAS,EAAC,cAAc;QAAA,WAAC;UAAA,WAAM;YAAA,UAAG;UAAC,gBAAG,CAAC,QAAI;QAAA,eAAM,CAAC,EACvD;UAAO,IAAI,EAAC,MAAM;UAAC,KAAK,EAAE,KAAM;UAAC,SAAS,EAAC,IAAI;UAAC,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;UAAC,WAAW,EAAC;QAAS,gBAAE,CAAC;MAAA,eAAO,CAAC,EAC3H;QAAO,SAAS,EAAC,cAAc;QAAA,WAAC;UAAA,WAAM;YAAA,UAAG;UAAC,gBAAG,CAAC,MAAE;QAAA,eAAM,CAAC;UAAO,IAAI,EAAC,MAAM;UAAC,KAAK,EAAE,IAAK;UAAC,QAAQ,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;QAAE,gBAAE,CAAC;MAAA,eAAO,CAAC,EACzI;QAAK,SAAS,EAAC,oBAAoB;QAAA,WACjC;UAAO,SAAS,EAAC,cAAc;UAAA,WAAC;YAAA,WAAM;cAAA,UAAG;YAAC,gBAAG,CAAC,QAAI;UAAA,eAAM,CAAC;YAAO,IAAI,EAAC,MAAM;YAAC,KAAK,EAAE,SAAU;YAAC,QAAQ,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;UAAE,gBAAE,CAAC;QAAA,eAAO,CAAC,EACrJ;UAAO,SAAS,EAAC,cAAc;UAAA,WAAC;YAAA,WAAM;cAAA,UAAG;YAAC,gBAAG,CAAC,QAAI;UAAA,eAAM,CAAC;YAAO,IAAI,EAAC,MAAM;YAAC,KAAK,EAAE,OAAQ;YAAC,QAAQ,EAAE,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;UAAE,gBAAE,CAAC;QAAA,eAAO,CAAC;MAAA,eAC9I,CAAC,EACN;QAAO,SAAS,EAAC,cAAc;QAAA,WAAC;UAAA,UAAM;QAAE,gBAAM,CAAC,EAC7C;UAAO,IAAI,EAAC,MAAM;UAAC,KAAK,EAAE,QAAS;UAAC,SAAS,EAAC,IAAI;UAAC,QAAQ,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;UAAC,WAAW,EAAC;QAAa,gBAAE,CAAC;MAAA,eAAO,CAAC,EACrI;QAAO,SAAS,EAAC,cAAc;QAAA,WAAC;UAAA,WAAM;YAAA,UAAG;UAAC,gBAAG,CAAC,OAAG;QAAA,eAAM,CAAC,EACtD;UAAO,IAAI,EAAC,MAAM;UAAC,KAAK,EAAE,KAAM;UAAC,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;UAAC,WAAW,EAAC;QAAW,gBAAE,CAAC;MAAA,eAAO,CAAC,EAC7G,QAAQ,CAAC,MAAM,GAAG;QAAK,SAAS,EAAC,4BAA4B;QAAA,UAC3D,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI;UAAA,WAAiB,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,EAAC;YAAG,SAAS,EAAC,gBAAgB;YAAC,OAAO,EAAE,MAAM,MAAM,CAAC,GAAG,CAAE;YAAA,UAAC;UAAK,gBAAG,CAAC;QAAA,GAA3F,GAAG,MAA8F,CAAC;MAAC,gBAChI,CAAC,GAAG,IAAI,EACZ,MAAM,GAAG,8DAAC,iEAAW;QAAC,MAAM,EAAE,MAAO;QAAC,QAAQ,EAAE,QAAS;QAAC,QAAQ,EAAE,QAAS;QAC5E,gBAAgB,EAAC,QAAQ;QAAC,UAAU,EAAE,KAAM;QAAC,UAAU,EAAE,KAAM;QAAC,eAAe,EAAE,KAAM;QACvF,aAAa,EAAE,QAAS;QAAC,eAAe,EAAE;MAAO,gBAAE,CAAC,GAAG,IAAI;IAAA,eACzD,CAAC,EACP;MAAQ,SAAS,EAAC,sBAAsB;MAAA,UAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAE,UAAW;QAAC,OAAO,EAAE,MAAO;QAAA,UAAE,UAAU,GAAG,MAAM,GAAG;MAAM,gBAAS;IAAC,gBAAQ,CAAC;EAAA,eACnJ,CAAC;AACR;AAEA,SAAS,qBAAqB,CAAC;EAAC;AAAQ,CAAC,EAAE;EACzC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAC9D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,MAAM,uEAAc,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;EACnF,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACzD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAEtD,MAAM,SAAS,GAAG,wDAAiB,CAAC,MAAM;IACxC,aAAa,CAAC,KAAK,CAAC;IACpB,0EAA0B,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAC3C,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;MAC3C,wEAAe,CAAC,WAAW,EAAE,IAAI,CAAC;MAClC,QAAQ,CAAC,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;MAIb,QAAQ,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;MAC5B,aAAa,CAAC,IAAI,CAAC;IACrB,CAAC,CAAC;EACJ,CAAC,EAAE,EAAE,CAAC;EAEN,sDAAe,CAAC,MAAM;IACpB,SAAS,CAAC,CAAC;IACX,IAAI;MACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;MAC3E,aAAa,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAClC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAe;EAE7B,CAAC,EAAE,EAAE,CAAC;EAON,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE;MAAE,gBAAgB,CAAC,IAAI,CAAC;MAAE;IAAQ;IACrD,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM;MACrC,kEAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACxG,CAAC,EAAE,GAAG,CAAC;IACP,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;EAC1C,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;EAEX,OAAO;IAAK,SAAS,EAAC,gBAAgB;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,QAAQ;MAAC,IAAI,EAAC;IAAW,gBAAE,CAAC,EAC/E;MAAM,SAAS,EAAC,sBAAsB;MAAA,WACpC;QAAO,SAAS,EAAC,kBAAkB;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAM,gBAAM,CAAC,EACrD;UAAO,KAAK,EAAE,KAAM;UAAC,QAAQ,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAE;UAAC,WAAW,EAAC;QAAS,gBAAE,CAAC;MAAA,eACzF,CAAC,EACP,aAAa,GACZ;QAAS,SAAS,EAAC,mBAAmB;QAAA,UACnC,aAAa,CAAC,MAAM,KAAK,CAAC,GAAG;UAAG,SAAS,EAAC,sBAAsB;UAAA,UAAC;QAAQ,gBAAG,CAAC,GAC5E,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,YAAY,GACzD,8DAAC,aAAa;UAAuE,IAAI,EAAE,IAAI,CAAC;QAAW,GAAvF,GAAG,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,IAAI,GAAG,CAAC,OAA0B,CAAC,GAC9G,8DAAC,SAAS;UAAqD,MAAM,EAAE,IAAI,CAAC,IAAK;UAAC,KAAK,EAAE,CAAE;UAAC,KAAK,EAAE,CAAE;UACnG,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,QAAQ;QAAE,GADhF,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,OACqC,CAAC;MAAC,gBACjG,CAAC,GACV;QAAS,SAAS,EAAC,mBAAmB;QAAA,UACnC,KAAK,IAAI,IAAI,GAAG;UAAG,SAAS,EAAC,sBAAsB;UAAA,UAAC;QAAI,gBAAG,CAAC,GAC3D,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG;UAAG,SAAS,EAAC,sBAAsB;UAAA,UACrD,UAAU,GAAG;YAAA,WAAE,OAAK;cAAG,IAAI,EAAC,GAAG;cAAC,OAAO,EAAE,CAAC,IAAI;gBAAE,CAAC,CAAC,cAAc,CAAC,CAAC;gBAAE,SAAS,CAAC,CAAC;cAAE,CAAE;cAAA,UAAC;YAAE,gBAAG,CAAC;UAAA,eAAE,CAAC,GAAG;QAAU,gBAC1G,CAAC,GACJ,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,8DAAC,QAAQ;UAA0B,IAAI,EAAE,IAAK;UAAC,KAAK,EAAE,CAAE;UAAC,QAAQ,EAAE;QAAS,GAA7D,IAAI,CAAC,aAAa,OAA6C,CAAC;MAAC,gBAC7F,CAAC;IAAA,eACR,CAAC;EAAA,eACJ,CAAC;AACR;AAMA,SAAS,eAAe,CAAC,MAAM,EAAE;EAC/B,OAAO,MAAM,CACV,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAC7B,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAC9E,IAAI,CAAC,MAAM,CAAC;AACjB;AAEA,SAAS,iBAAiB,CAAC;EAAC;AAAO,CAAC,EAAE;EACpC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;EAC1C,MAAM,QAAQ,GAAG,sBAAsB,GAAG,KAAK;EAO/C,MAAM,MAAM,GAAG,uEAAc,CAAC,QAAQ,CAAC;EACvC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;EAC/E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;EAQ5E,MAAM,UAAU,GAAG,mDAAY,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;EAC/D,MAAM,cAAc,GAAG,CAAC,IAAI;IAAE,UAAU,CAAC,OAAO,GAAG,CAAC;IAAE,UAAU,CAAC,CAAC,CAAC;EAAE,CAAC;EACtE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;IAAC,KAAK,EAAE,EAAE;IAAE,GAAG,EAAE,EAAE;IAAE,OAAO,EAAE;EAAE,CAAC,CAAC,CAAC;EACxG,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC/C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAQzD,MAAM,YAAY,GAAG,mDAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;EACpD,MAAM,aAAa,GAAG,mDAAY,CAAC,IAAI,CAAC;EACxC,MAAM,SAAS,GAAG,wDAAiB,CAAC,UAAU,IAAI;IAChD,MAAM,GAAG,GAAG,MAAM,gEAAgB,CAAC,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAC1G,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC;MAAE,QAAQ,CAAC,IAAI,CAAC;MAAE,YAAY,CAAC,KAAK,CAAC;MAC9D,wEAAe,CAAC,QAAQ,EAAE;QAAC,QAAQ;QAAE,OAAO,EAAE,CAAC,CAAC,OAAO;QAAE,MAAM,EAAE;MAAU,CAAC,CAAC;MAC7E,OAAO,CAAC;IACV,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;IAC3C,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,OAAO,IAAI;EAEb,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;EAEd,sDAAe,CAAC,MAAM;IACpB,iEAAiB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAQjC,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,CAAC,QAAQ,KAAK,KAAK,EAAE;QAAE,QAAQ,CAAC,qBAAqB,EAAE;UAAC,SAAS,EAAE,CAAC,CAAC;QAAS,CAAC,CAAC;QAAE;MAAQ;MAC5H,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC;QAAC,KAAK,EAAE,EAAE;QAAE,GAAG,EAAE,EAAE;QAAE,OAAO,EAAE,CAAC,CAAC;MAAO,CAAC,CAAC,GAAG,CAAC;QAAC,KAAK,EAAE,EAAE;QAAE,GAAG,EAAE,EAAE;QAAE,OAAO,EAAE;MAAE,CAAC,CAAC;MAC/G,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;MACxB,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC;MACzB,SAAS,CAAC,UAAU,CAAC;MACrB,wEAAe,CAAC,QAAQ,EAAE;QAAC,QAAQ,EAAE,CAAC,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC,CAAC,OAAO;QAAE,MAAM,EAAE;MAAU,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC;EAEnD,CAAC,EAAE,EAAE,CAAC;EAEN,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,QAAQ,EAAE,OAAO,SAAS;IAC/B,QAAQ,CAAC,KAAK,CAAC;IACf,aAAa,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM;MAC9C,aAAa,CAAC,OAAO,GAAG,IAAI;MAC5B,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC,EAAE,GAAG,CAAC;IACP,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC;EACzD,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;EAEjC,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG;IAAC,GAAG,CAAC;IAAE,CAAC,KAAK,GAAG;EAAK,CAAC,GAAG,CAAC,CAAC,CAAC;EAClH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAAC,KAAK,EAAE,EAAE;IAAE,GAAG,EAAE,EAAE;IAAE,OAAO,EAAE;EAAE,CAAC,CAAC,CAAC;EAClF,MAAM,WAAW,GAAG,GAAG,IAAI,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;EAE3F,MAAM,MAAM,GAAG,MAAM;IACnB,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC;IACvC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE;MAAE,OAAO,CAAC,WAAW,CAAC;MAAE;IAAQ;IACrD,aAAa,CAAC,IAAI,CAAC;IACnB,IAAI,aAAa,CAAC,OAAO,EAAE;MAAE,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC;MAAE,aAAa,CAAC,OAAO,GAAG,IAAI;IAAE;IACvG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,iEAAiB,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAChE,IAAI,CAAC,CAAC,IAAI;MAAE,OAAO,CAAC,OAAO,CAAC;MAAE,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,qBAAqB,EAAE;QAAC,SAAS,EAAE;MAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IAAE,CAAC,CAAC,CACtH,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAC5C,OAAO,CAAC,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;EACxC,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,mCAAmC;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,IAAI;MAAC,IAAI,EAAC;IAAmB,gBAAE,CAAC,EACtG;MAAA,WACG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK;QAAmB,SAAS,EAAC,oBAAoB;QAAA,WAC3E;UAAK,SAAS,EAAC,2BAA2B;UAAA,WAAC;YAAA,UAAQ;UAAE,gBAAQ,CAAC,EAC3D,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG;YAAQ,IAAI,EAAC,QAAQ;YAAC,OAAO,EAAE,MAAM,WAAW,CAAC,GAAG,CAAE;YAAC,cAAW,IAAI;YAAA,UAAC,8DAAC,IAAI;cAAA,UAAC;YAAK,gBAAM;UAAC,gBAAQ,CAAC,GAAG,IAAI;QAAA,eAC3H,CAAC,EACN;UAAO,SAAS,EAAC,cAAc;UAAA,WAAC;YAAA,UAAM;UAAI,gBAAM,CAAC;YAAO,SAAS,EAAC,mBAAmB;YAAA,UAAE,iBAAiB,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC;UAAC,gBAAQ,CAAC,EAChI;YAAK,SAAS,EAAC,oBAAoB;YAAA,WACjC;cAAO,IAAI,EAAC,MAAM;cAAC,KAAK,EAAE,KAAK,CAAC,KAAM;cAAC,QAAQ,EAAE,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK;YAAE,gBAAE,CAAC,EACnG;cAAA,UAAM;YAAC,gBAAM,CAAC,EACd;cAAO,IAAI,EAAC,MAAM;cAAC,KAAK,EAAE,KAAK,CAAC,GAAI;cAAC,QAAQ,EAAE,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK;YAAE,gBAAE,CAAC;UAAA,eAC5F,CAAC;QAAA,eACD,CAAC,EACR;UAAO,SAAS,EAAC,cAAc;UAAA,WAAC;YAAA,UAAM;UAAM,gBAAM,CAAC,EACjD;YAAU,KAAK,EAAE,KAAK,CAAC,OAAQ;YAAC,SAAS,EAAC,MAAM;YAAC,WAAW,EAAC,KAAK;YAAC,QAAQ,EAAE,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK;UAAE,gBAAE,CAAC,EACjI;YAAA,WAAQ,KAAK,CAAC,OAAO,CAAC,MAAM,EAAC,OAAK;UAAA,eAAO,CAAC;QAAA,eACrC,CAAC;MAAA,GAdgC,GAAG,MAepC,CAAC,CAAC,EACX;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,wBAAwB;QAAC,OAAO,EAAE,QAAS;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAG,gBAAM,CAAC,SAAK;MAAA,eAAQ,CAAC,EAC1G;QAAG,SAAS,EAAC,qBAAqB;QAAA,UAAE,SAAS,GAAG,mBAAmB,GAAG,KAAK,GAAG,SAAS,GAAG;MAAS,gBAAI,CAAC;IAAA,eACpG,CAAC,EACP;MAAQ,SAAS,EAAC,sBAAsB;MAAA,UAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAE,UAAU,IAAI,CAAC,QAAS;QAAC,OAAO,EAAE,MAAO;QAAA,UAAE,UAAU,GAAG,MAAM,GAAG;MAAI,gBAAS;IAAC,gBAAQ,CAAC;EAAA,eAC9J,CAAC;AACR;AAEA,MAAM,YAAY,GAAG;EAAC,SAAS,EAAE,KAAK;EAAE,KAAK,EAAE;AAAK,CAAC;AAErD,SAAS,eAAe,CAAC;EAAC,MAAM;EAAE,KAAK;EAAE;AAAI,CAAC,EAAE;EAC9C,OAAO;IAAA,WACL;MAAA,WAAQ;QAAA,WAAM;UAAA,UAAS,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC;QAAS,gBAAS,CAAC;UAAO,SAAS,EAAC,YAAY;UAAA,UAAC;QAAE,gBAAO,CAAC;MAAA,eAAM,CAAC,EACzH;QAAI,SAAS,EAAE,MAAM,CAAC,MAAO;QAAA,UAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;MAAM,gBAAK,CAAC;IAAA,eAAQ,CAAC,EAC5F;MAAA,UAAI,MAAM,CAAC,aAAa,IAAI;IAAS,gBAAI,CAAC,EAC1C;MAAA,WAAQ;QAAA,WAAM,8DAAC,IAAI;UAAA,UAAC;QAAQ,gBAAM,CAAC,EAAC,MAAM,CAAC,WAAW;MAAA,eAAO,CAAC,EAC5D;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,qBAAqB,EAAE;UAAC,SAAS,EAAE,MAAM,CAAC;QAAS,CAAC,CAAE;QAAA,WAAC,MAAI,gEAAC,IAAI;UAAA,UAAC;QAAa,gBAAM,CAAC;MAAA,eAAQ,CAAC;IAAA,eAAQ,CAAC;EAAA,eAChJ,CAAC;AACZ;AAEA,SAAS,eAAe,CAAC;EAAC,IAAI;EAAE,QAAQ;EAAE;AAAO,CAAC,EAAE;EAClD,MAAM,QAAQ,GAAG,gBAAgB,IAAI,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC;EAC/D,MAAM,aAAa,GAAG,cAAc,GAAG,gBAAgB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;EAGnE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAM,uEAAc,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;EACpF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,MAAO,IAAI,IAAI,uEAAc,CAAC,aAAa,CAAC,IAAK,IAAI,CAAC;EAC/F,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;EACjD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC;EAEzC,MAAM,IAAI,GAAG,MAAM;IACjB,YAAY,CAAC,KAAK,CAAC;IAMnB,+DAAe,CAAC;MAAC,KAAK,EAAE,IAAI,GAAG,SAAS,GAAG;IAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAC5D,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;MACvC,wEAAe,CAAC,QAAQ,EAAE,IAAI,CAAC;MAC/B,UAAU,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,UAAU,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;MAAE,UAAU,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;IAAE,CAAC,CAAC;IAC5G,IAAI,IAAI,EAAE,kEAAkB,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,aAAa,EAAE,CAAC,CAAC;MAAE,QAAQ,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EAC3I,CAAC;EACD,sDAAe,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;EAE7B,MAAM,QAAQ,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI;IAI3C,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,aAAa,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,WAAW;IACxF,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;EAC5B,CAAC,CAAC;EAEF,MAAM,aAAa,GAAG,MAAM;IAC1B,kEAAkB,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAC5E,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;EACjD,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,iCAAiC;IAAA,WACrD,8DAAC,MAAM;MAAC,KAAK,EAAC,IAAI;MAAC,MAAM,EAAC,KAAK;MAAC,WAAW,EAAC,MAAM;MAAC,QAAQ,EAAE,MAAM,QAAQ,CAAC,qBAAqB,CAAE;MAAC,IAAI,EAAE,IAAI,GAAG,mBAAmB,GAAG;IAAY,gBAAE,CAAC,EACtJ;MAAA,WACG,IAAI,IAAI,KAAK,GAAG;QAAS,SAAS,EAAC,mBAAmB;QAAA,WACrD;UAAA,WAAQ;YAAA,WAAM;cAAA,UAAQ,iBAAiB,CAAC,IAAI,IAAI,CAAC,CAAC;YAAC,gBAAQ,CAAC;cAAA,UAAQ;YAAG,gBAAQ,CAAC;UAAA,eAAM,CAAC,EACrF;YAAQ,IAAI,EAAC,QAAQ;YAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,mBAAmB,CAAE;YAAA,UAAC;UAAI,gBAAQ,CAAC;QAAA,eAAQ,CAAC,EAC5F;UAAA,WAAK;YAAA,WAAM;cAAA,UAAI,KAAK,CAAC,cAAc,IAAI;YAAC,gBAAI,CAAC;cAAA,UAAO;YAAG,gBAAO,CAAC;UAAA,eAAM,CAAC,EACpE;YAAA,WAAM;cAAA,UAAI,KAAK,CAAC,eAAe,IAAI;YAAC,gBAAI,CAAC;cAAA,UAAO;YAAG,gBAAO,CAAC;UAAA,eAAM,CAAC,EAClE;YAAA,WAAM;cAAA,UAAI,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,KAAK,KAAK,CAAC,eAAe,IAAI,CAAC;YAAC,gBAAI,CAAC;cAAA,UAAO;YAAG,gBAAO,CAAC;UAAA,eAAM,CAAC;QAAA,eAAK,CAAC,EAC1G;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,aAAc;UAAA,WAAC,8DAAC,IAAI;YAAA,UAAC;UAAoB,gBAAM,CAAC,WAAO;QAAA,eAAQ,CAAC;MAAA,eACxF,CAAC,GAAG,IAAI,EACjB;QAAO,SAAS,EAAC,kBAAkB;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAM,gBAAM,CAAC,EACrD;UAAO,KAAK,EAAE,KAAM;UAAC,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;UAAC,WAAW,EAAE,IAAI,GAAG,SAAS,GAAG;QAAO,gBAAE,CAAC;MAAA,eAAO,CAAC,EACjH,CAAC,IAAI,GAAG;QAAK,SAAS,EAAC,oBAAoB;QAAA,WAC1C;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,QAAQ;UAAA,UAAC;QAAI,gBAAQ,CAAC,EACtD;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,mBAAmB,CAAE;UAAA,UAAC;QAAI,gBAAQ,CAAC;MAAA,eAC9E,CAAC,GAAG,IAAI,EACb;QAAS,SAAS,EAAC,cAAc;QAAA,UAC9B,OAAO,IAAI,IAAI,GAAG;UAAG,SAAS,EAAC,sBAAsB;UAAA,UAAC;QAAI,gBAAG,CAAC,GAC7D,QAAQ,CAAC,MAAM,KAAK,CAAC,GAAG;UAAG,SAAS,EAAC,sBAAsB;UAAA,UAAE,SAAS,GAAG,UAAU,GAAG;QAAM,gBAAI,CAAC,GACjG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,8DAAC,eAAe;UAAmB,MAAM,EAAE,CAAE;UAAC,KAAK,EAAE,KAAM;UAAC,IAAI,EAAE;QAAK,GAAjD,CAAC,CAAC,SAAS,OAAwC,CAAC;MAAC,gBACxF,CAAC;IAAA,eACN,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,iBAAiB,CAAC;EAAC,UAAU;EAAE,QAAQ;EAAE;AAAO,CAAC,EAAE;EAC1D,MAAM,QAAQ,GAAG,UAAU,IAAI,UAAU,CAAC,SAAS;EACnD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,MAAO,QAAQ,IAAI,uEAAc,CAAC,eAAe,GAAG,QAAQ,CAAC,IAAK,IAAI,CAAC;EAClH,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC;EAEtE,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,QAAQ,EAAE;IAGf,SAAS,CAAC,uEAAc,CAAC,eAAe,GAAG,QAAQ,CAAC,IAAI,IAAI,CAAC;IAC7D,8DAAc,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,eAAe,GAAG,QAAQ,EAAE,CAAC,CAAC;MAAE,SAAS,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC;EAC/K,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;EACd,IAAI,CAAC,MAAM,EAAE,OAAO;IAAK,SAAS,EAAC,gBAAgB;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC;IAAmB,gBAAE,CAAC;MAAA,UAAM;QAAG,SAAS,EAAC,sBAAsB;QAAA,UAAE,SAAS,GAAG,QAAQ,GAAG;MAAM,gBAAI;IAAC,gBAAM,CAAC;EAAA,eAAK,CAAC;EAE9L,OAAO;IAAK,SAAS,EAAC,gBAAgB;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC;IAAmB,gBAAE,CAAC,EACrF;MAAM,SAAS,EAAC,eAAe;MAAA,WAC7B;QAAS,SAAS,EAAC,eAAe;QAAA,WAAC;UAAA,WAAM;YAAA,UAAS,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI;UAAG,gBAAS,CAAC;YAAO,SAAS,EAAC,YAAY;YAAA,UAAC;UAAE,gBAAO,CAAC;QAAA,eAAM,CAAC,EACvI;UAAI,SAAS,EAAE,MAAM,CAAC,MAAO;UAAA,UAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;QAAM,gBAAK,CAAC;MAAA,eAAS,CAAC,EAC7F;QAAA,UAAS;UAAA,WAAO,8DAAC,IAAI;YAAA,UAAC;UAAQ,gBAAM,CAAC,EAAC,MAAM,CAAC,WAAW;QAAA,eAAQ;MAAC,gBAAS,CAAC,EAC3E;QAAA,WAAS;UAAA,UAAI;QAAM,gBAAI,CAAC;UAAA,UAAI,MAAM,CAAC,OAAO,IAAI;QAAK,gBAAI,CAAC;MAAA,eAAS,CAAC;IAAA,eAC9D,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,iBAAiB,CAAC,CAAC,EAAE;EAAE,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;AAAE;AAC1G,SAAS,gBAAgB,CAAC,KAAK,EAAE;EAC/B,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;EAC/B,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI;AACtC;AASA,SAAS,mBAAmB,CAAC;EAAC;AAAO,CAAC,EAAE;EACtC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;EAC3C,MAAM,QAAQ,GAAG,wBAAwB,GAAG,KAAK;EAEjD,MAAM,MAAM,GAAG,uEAAc,CAAC,QAAQ,CAAC;EACvC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;EAC/E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;EAG5E,MAAM,UAAU,GAAG,mDAAY,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;EAC/D,MAAM,cAAc,GAAG,CAAC,IAAI;IAAE,UAAU,CAAC,OAAO,GAAG,CAAC;IAAE,UAAU,CAAC,CAAC,CAAC;EAAE,CAAC;EACtE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;EAC1E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;EAKjE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAQhD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,qDAAc,CAAC,CAAC,MAAM,CAAC;EACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC/C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAKzD,MAAM,YAAY,GAAG,mDAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;EACpD,MAAM,aAAa,GAAG,mDAAY,CAAC,IAAI,CAAC;EACxC,MAAM,SAAS,GAAG,wDAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK;IAC5C,MAAM,GAAG,GAAG,MAAM,kEAAkB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MACrF,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC;MAAE,QAAQ,CAAC,IAAI,CAAC;MAAE,YAAY,CAAC,KAAK,CAAC;MAC9D,wEAAe,CAAC,QAAQ,EAAE;QAAC,QAAQ;QAAE,OAAO,EAAE,CAAC,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE;MAAC,CAAC,CAAC;MAC9E,OAAO,CAAC;IACV,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;IAC3C,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,OAAO,IAAI;EAEb,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;EAEd,sDAAe,CAAC,MAAM;IACpB,mEAAmB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAEnC,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,CAAC,QAAQ,KAAK,KAAK,EAAE;QAAE,QAAQ,CAAC,uBAAuB,EAAE;UAAC,SAAS,EAAE,CAAC,CAAC;QAAS,CAAC,CAAC;QAAE;MAAQ;MAC9H,MAAM,WAAW,GAAG,CAAC,CAAC,YAAY,IAAI,EAAE;MAAE,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,IAAI,EAAE;MAC5E,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;MAAE,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC;MACnD,UAAU,CAAC,WAAW,CAAC;MAAE,OAAO,CAAC,QAAQ,CAAC;MAC1C,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;MAC/E,wEAAe,CAAC,QAAQ,EAAE;QAAC,QAAQ,EAAE,CAAC,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC,CAAC,OAAO;QAAE,OAAO,EAAE,WAAW;QAAE,IAAI,EAAE;MAAQ,CAAC,CAAC;MAC5G,WAAW,CAAC,IAAI,CAAC;IACnB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC;EAEnD,CAAC,EAAE,EAAE,CAAC;EAEN,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,OAAO,SAAS;IAC5C,QAAQ,CAAC,KAAK,CAAC;IACf,aAAa,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM;MAC9C,aAAa,CAAC,OAAO,GAAG,IAAI;MAC5B,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC,EAAE,GAAG,CAAC;IACP,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC;EACzD,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;EAElD,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;MAAE,OAAO,CAAC,SAAS,CAAC;MAAE;IAAQ;IACnE,aAAa,CAAC,IAAI,CAAC;IACnB,IAAI,aAAa,CAAC,OAAO,EAAE;MAAE,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC;MAAE,aAAa,CAAC,OAAO,GAAG,IAAI;IAAE;IACvG,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,mEAAmB,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CACzE,IAAI,CAAC,CAAC,IAAI;MAAE,OAAO,CAAC,OAAO,CAAC;MAAE,MAAM,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,uBAAuB,EAAE;QAAC,SAAS,EAAE;MAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IAAE,CAAC,CAAC,CACxH,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAC5C,OAAO,CAAC,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;EACxC,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,mCAAmC;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,IAAI;MAAC,IAAI,EAAC;IAAqB,gBAAE,CAAC,EACxG;MAAA,WACE;QAAS,SAAS,EAAC,2BAA2B;QAAA,UAAC;UAAA,UAAQ;QAAI,gBAAQ;MAAC,gBAAS,CAAC,EAC9E;QAAO,SAAS,EAAC,cAAc;QAAA,WAAC;UAAA,WAAM;YAAA,UAAG;UAAC,gBAAG,CAAC,UAAM;QAAA,eAAM,CAAC,EACzD;UAAU,KAAK,EAAE,OAAQ;UAAC,SAAS,EAAE,MAAO;UAAC,WAAW,EAAC,KAAK;UAAC,QAAQ,EAAE,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;QAAE,gBAAE,CAAC;UAAA,WAAQ,OAAO,CAAC,MAAM,EAAC,GAAC,EAAC,MAAM;QAAA,eAAQ,CAAC;MAAA,eAAO,CAAC,EAC9J;QAAO,SAAS,EAAC,cAAc;QAAA,WAAC;UAAA,WAAM;YAAA,UAAG;UAAC,gBAAG,CAAC,UAAM;QAAA,eAAM,CAAC,EACzD;UAAU,KAAK,EAAE,IAAK;UAAC,SAAS,EAAE,MAAO;UAAC,WAAW,EAAC,KAAK;UAAC,QAAQ,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;QAAE,gBAAE,CAAC;UAAA,WAAQ,IAAI,CAAC,MAAM,EAAC,GAAC,EAAC,MAAM;QAAA,eAAQ,CAAC;MAAA,eAAO,CAAC,EACrJ;QAAG,SAAS,EAAC,qBAAqB;QAAA,UAAE,SAAS,GAAG,mBAAmB,GAAG,KAAK,GAAG,SAAS,GAAG;MAAS,gBAAI,CAAC;IAAA,eACpG,CAAC,EACP;MAAQ,SAAS,EAAC,sBAAsB;MAAA,UAAC;QAAQ,IAAI,EAAC,QAAQ;QAAC,QAAQ,EAAE,UAAU,IAAI,CAAC,QAAS;QAAC,OAAO,EAAE,MAAO;QAAA,UAAE,UAAU,GAAG,MAAM,GAAG;MAAI,gBAAS;IAAC,gBAAQ,CAAC;EAAA,eAC9J,CAAC;AACR;AAWA,SAAS,iBAAiB,CAAC;EAAC,IAAI;EAAE,QAAQ;EAAE;AAAO,CAAC,EAAE;EACpD,MAAM,QAAQ,GAAG,kBAAkB,IAAI,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC;EACjE,MAAM,aAAa,GAAG,gBAAgB,GAAG,iBAAiB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;EACtE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,MAAM,uEAAc,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;EACpF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,MAAO,IAAI,IAAI,uEAAc,CAAC,aAAa,CAAC,IAAK,IAAI,CAAC;EAC/F,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;EACjD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC;EAEzC,MAAM,IAAI,GAAG,MAAM;IACjB,YAAY,CAAC,KAAK,CAAC;IACnB,iEAAiB,CAAC;MAAC,KAAK,EAAE,IAAI,GAAG,SAAS,GAAG;IAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAC9D,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;MACvC,wEAAe,CAAC,QAAQ,EAAE,IAAI,CAAC;MAC/B,UAAU,CAAC,IAAI,CAAC;IAClB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,UAAU,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;MAAE,UAAU,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;IAAE,CAAC,CAAC;IAC5G,IAAI,IAAI,EAAE,oEAAoB,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,aAAa,EAAE,CAAC,CAAC;MAAE,QAAQ,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EAC9I,CAAC;EACD,sDAAe,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;EAE7B,MAAM,QAAQ,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI;IAC3C,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,kBAAkB,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK;IACvF,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC;EACpC,CAAC,CAAC;EAEF,OAAO;IAAK,SAAS,EAAC,iCAAiC;IAAA,WACrD,8DAAC,MAAM;MAAC,KAAK,EAAC,IAAI;MAAC,MAAM,EAAC,KAAK;MAAC,WAAW,EAAC,MAAM;MAAC,QAAQ,EAAE,MAAM,QAAQ,CAAC,uBAAuB,CAAE;MAAC,IAAI,EAAE,IAAI,GAAG,qBAAqB,GAAG;IAAY,gBAAE,CAAC,EAC1J;MAAA,WACG,IAAI,IAAI,KAAK,GAAG;QAAS,SAAS,EAAC,mBAAmB;QAAA,WACrD;UAAA,WAAQ;YAAA,WAAM;cAAA,UAAQ,gBAAgB,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YAAC,gBAAQ,CAAC;cAAA,UAAQ;YAAG,gBAAQ,CAAC;UAAA,eAAM,CAAC,EACvG;YAAQ,IAAI,EAAC,QAAQ;YAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,qBAAqB,CAAE;YAAA,UAAC;UAAI,gBAAQ,CAAC;QAAA,eAAQ,CAAC,EAC9F;UAAA,WAAK;YAAA,WAAM;cAAA,UAAI,KAAK,CAAC,cAAc,IAAI;YAAC,gBAAI,CAAC;cAAA,UAAO;YAAG,gBAAO,CAAC;UAAA,eAAM,CAAC,EACpE;YAAA,WAAM;cAAA,UAAI,KAAK,CAAC,eAAe,IAAI;YAAC,gBAAI,CAAC;cAAA,UAAO;YAAG,gBAAO,CAAC;UAAA,eAAM,CAAC,EAClE;YAAA,WAAM;cAAA,UAAI,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,KAAK,KAAK,CAAC,eAAe,IAAI,CAAC;YAAC,gBAAI,CAAC;cAAA,UAAO;YAAG,gBAAO,CAAC;UAAA,eAAM,CAAC;QAAA,eAAK,CAAC;MAAA,eACnG,CAAC,GAAG,IAAI,EACjB;QAAO,SAAS,EAAC,kBAAkB;QAAA,WAAC,8DAAC,IAAI;UAAA,UAAC;QAAM,gBAAM,CAAC,EACrD;UAAO,KAAK,EAAE,KAAM;UAAC,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE;UAAC,WAAW,EAAE,IAAI,GAAG,SAAS,GAAG;QAAU,gBAAE,CAAC;MAAA,eAAO,CAAC,EACpH,CAAC,IAAI,GAAG;QAAK,SAAS,EAAC,oBAAoB;QAAA,WAC1C;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,QAAQ;UAAA,UAAC;QAAI,gBAAQ,CAAC,EACtD;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,qBAAqB,CAAE;UAAA,UAAC;QAAI,gBAAQ,CAAC;MAAA,eAChF,CAAC,GAAG,IAAI,EACb;QAAS,SAAS,EAAC,cAAc;QAAA,UAC9B,OAAO,IAAI,IAAI,GAAG;UAAG,SAAS,EAAC,sBAAsB;UAAA,UAAC;QAAI,gBAAG,CAAC,GAC7D,QAAQ,CAAC,MAAM,KAAK,CAAC,GAAG;UAAG,SAAS,EAAC,sBAAsB;UAAA,UAAE,SAAS,GAAG,UAAU,GAAG;QAAM,gBAAI,CAAC,GACjG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI;UAAQ,IAAI,EAAC,QAAQ;UACrC,OAAO,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,MAAM,GAAG,uBAAuB,GAAG,uBAAuB,EAAE;YAAC,SAAS,EAAE,CAAC,CAAC;UAAS,CAAC,CAAE;UAAA,WAC7K;YAAM,SAAS,EAAC,cAAc;YAAA,UAAC,8DAAC,IAAI;cAAA,UAAC;YAAc,gBAAM;UAAC,gBAAM,CAAC,EACjE;YAAA,WAAM;cAAA,UAAS,IAAI,GAAI,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,GAAI,gBAAgB,CAAC,CAAC,CAAC,KAAK;YAAC,gBAAS,CAAC,EAC7F;cAAA,UAAQ,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;YAAW,gBAAQ,CAAC;UAAA,eAAM,CAAC,EACxE;YAAI,SAAS,EAAE,CAAC,CAAC,MAAO;YAAA,UAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;UAAM,gBAAK,CAAC,EAClE,8DAAC,IAAI;YAAA,UAAC;UAAa,gBAAM,CAAC;QAAA,GANiB,CAAC,CAAC,SAAS,MAOhD,CAAC;MAAC,gBACL,CAAC;IAAA,eACN,CAAC;EAAA,eACJ,CAAC;AACR;AAEA,SAAS,mBAAmB,CAAC;EAAC,UAAU;EAAE,QAAQ;EAAE;AAAO,CAAC,EAAE;EAC5D,MAAM,QAAQ,GAAG,UAAU,IAAI,UAAU,CAAC,SAAS;EACnD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,MAAO,QAAQ,IAAI,uEAAc,CAAC,iBAAiB,GAAG,QAAQ,CAAC,IAAK,IAAI,CAAC;EACpH,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC;EAEtE,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,QAAQ,EAAE;IACf,SAAS,CAAC,uEAAc,CAAC,iBAAiB,GAAG,QAAQ,CAAC,IAAI,IAAI,CAAC;IAC/D,gEAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,iBAAiB,GAAG,QAAQ,EAAE,CAAC,CAAC;MAAE,SAAS,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;IAAE,CAAC,CAAC;EACnL,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;EACd,IAAI,CAAC,MAAM,EAAE,OAAO;IAAK,SAAS,EAAC,gBAAgB;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC;IAAqB,gBAAE,CAAC;MAAA,UAAM;QAAG,SAAS,EAAC,sBAAsB;QAAA,UAAE,SAAS,GAAG,QAAQ,GAAG;MAAM,gBAAI;IAAC,gBAAM,CAAC;EAAA,eAAK,CAAC;EAKhM,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW;EAChF,MAAM,MAAM,GAAG,MAAM;IACnB,YAAY,CAAC,IAAI,CAAC;IAClB,mEAAmB,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAClD,IAAI,CAAC,MAAM;MAAE,OAAO,CAAC,aAAa,CAAC;MAAE,QAAQ,CAAC,uBAAuB,CAAC;IAAE,CAAC,CAAC,CAC1E,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC,CAC9C,OAAO,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;EACvC,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,gBAAgB;IAAA,WAAC,8DAAC,MAAM;MAAC,KAAK,EAAC,MAAM;MAAC,IAAI,EAAC;IAAqB,gBAAE,CAAC,EACvF;MAAM,SAAS,EAAC,eAAe;MAAA,WAC7B;QAAS,SAAS,EAAC,eAAe;QAAA,WAAC;UAAA,WAAM;YAAA,UAAS,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI;UAAG,gBAAS,CAAC;YAAO,SAAS,EAAC,YAAY;YAAA,UAAC;UAAE,gBAAO,CAAC;QAAA,eAAM,CAAC,EACvI;UAAI,SAAS,EAAE,MAAM,CAAC,MAAO;UAAA,UAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;QAAM,gBAAK,CAAC;MAAA,eAAS,CAAC,EAC7F;QAAA,UAAS;UAAA,WAAO,8DAAC,IAAI;YAAA,UAAC;UAAQ,gBAAM,CAAC,EAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC;QAAA,eAAQ;MAAC,gBAAS,CAAC,EACvF;QAAA,WAAS;UAAA,UAAI;QAAM,gBAAI,CAAC;UAAA,UAAI,MAAM,CAAC,YAAY,IAAI;QAAK,gBAAI,CAAC;MAAA,eAAS,CAAC,EACvE;QAAA,WAAS;UAAA,UAAI;QAAM,gBAAI,CAAC;UAAA,UAAI,MAAM,CAAC,SAAS,IAAI;QAAK,gBAAI,CAAC;MAAA,eAAS,CAAC,EACnE,SAAS,GAAG;QAAA,UAAS;UAAQ,IAAI,EAAC,QAAQ;UAAC,SAAS,EAAC,mBAAmB;UAAC,QAAQ,EAAE,SAAU;UAAC,OAAO,EAAE,MAAO;UAAA,UAC5G,SAAS,GAAG,MAAM,GAAG;QAAM,gBAAS;MAAC,gBAAS,CAAC,GAAG,IAAI;IAAA,eACrD,CAAC;EAAA,eACJ,CAAC;AACR;AAKA,SAAS,aAAa,CAAC,OAAO,EAAE;EAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;EAC3C,OAAO,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,KAAK;AAC7D;AAEA,SAAS,gBAAgB,CAAC;EAAC,MAAM;EAAE,UAAU;EAAE;AAAO,CAAC,EAAE;EACvD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,qDAAc,CAAC,MAAM,uEAAc,CAAC,0BAA0B,CAAC,IAAI,IAAI,CAAC;EACpG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAChD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EACtD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EACxD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACvD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EACzD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,qDAAc,CAAC,CAAC,CAAC,UAAU,CAAC;EAChE,MAAM,YAAY,GAAG,mDAAY,CAAC,IAAI,CAAC;EAEvC,sDAAe,CAAC,MAAM;IACpB,yEAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAAE,wEAAe,CAAC,0BAA0B,EAAE,CAAC,CAAC;MAAE,SAAS,CAAC,CAAC,CAAC;IAAE,CAAC,CAAC,CAGrG,KAAK,CAAC,MAAM,SAAS,CAAC,IAAI,IAAI,IAAI,IAAI;MAAC,OAAO,EAAE;IAAK,CAAC,CAAC,CAAC;EAC7D,CAAC,EAAE,EAAE,CAAC;EAMN,MAAM,gBAAgB,GAAI,MAAM,IAAI,MAAM,CAAC,iBAAiB,IAAK,CAAC,CAAC;EACnE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,IAAI,gBAAgB,CAAC,SAAS,IAAI,CAAC;EAE9E,MAAM,QAAQ,GAAG,MAAM;IACrB,IAAI,WAAW,CAAC,MAAM,IAAI,QAAQ,EAAE;MAAE,OAAO,CAAC,QAAQ,QAAQ,MAAM,CAAC;MAAE;IAAQ;IAC/E,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;EACtD,CAAC;EACD,MAAM,UAAU,GAAG,KAAK,IAAI;IAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;IACvB,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;IACtB,IAAI,WAAW,CAAC,MAAM,IAAI,QAAQ,EAAE;MAAE,OAAO,CAAC,QAAQ,QAAQ,MAAM,CAAC;MAAE;IAAQ;IAC/E,YAAY,CAAC,IAAI,CAAC;IAClB,+DAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;MAAC;IAAM,CAAC,KAAK;MAC/C,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAAC,MAAM;QAAE,IAAI,EAAE,IAAI,CAAC;MAAI,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;EACtF,CAAC;EAED,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE;MAAE,OAAO,CAAC,SAAS,CAAC;MAAE;IAAQ;IACnD,IAAI,MAAM,IAAI,MAAM,CAAC,eAAe,IAAI,CAAC,SAAS,EAAE;MAAE,OAAO,CAAC,cAAc,CAAC;MAAE;IAAQ;IACvF,aAAa,CAAC,IAAI,CAAC;IACnB,6EAA6B,CAAC;MAC5B,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;MAC/B,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;MACvB,SAAS,EAAE,SAAS,KAAK,WAAW;MACpC,mBAAmB,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM;IACpD,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MACX,OAAO,CAAC,MAAM,CAAC;MACf,UAAU,CAAC,EAAE,CAAC;MAAE,cAAc,CAAC,EAAE,CAAC;MAAE,YAAY,CAAC,IAAI,CAAC;IACxD,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;EACrF,CAAC;EAED,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;IAC7B,OAAO;MAAK,SAAS,EAAC,6BAA6B;MAAA,WAAC,8DAAC,MAAM;QAAC,KAAK,EAAC,OAAO;QAAC,IAAI,EAAC;MAAW,gBAAE,CAAC,EAC3F;QAAA,UAAM;UAAG,SAAS,EAAC,sBAAsB;UAAA,UAAC;QAAU,gBAAG;MAAC,gBAAM,CAAC;IAAA,eAAK,CAAC;EACzE;EAEA,OAAO;IAAK,SAAS,EAAC,6BAA6B;IAAA,WACjD,8DAAC,MAAM;MAAC,KAAK,EAAC,OAAO;MAAC,IAAI,EAAC,WAAW;MAAC,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,cAAc,GAAG,IAAK;MAAC,WAAW,EAAC,QAAQ;MAAC,QAAQ,EAAE,MAAM,aAAa,CAAC,IAAI;IAAE,gBAAE,CAAC,EAC5J;MAAA,WACE;QAAO,SAAS,EAAC,iBAAiB;QAAA,WAAC;UAAA,UAAM;QAAI,gBAAM,CAAC,EAClD;UAAU,KAAK,EAAE,OAAQ;UAAC,SAAS,EAAG,MAAM,IAAI,MAAM,CAAC,UAAU,IAAK,IAAK;UAAC,WAAW,EAAC,KAAK;UAAC,QAAQ,EAAE,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;QAAE,gBAAE,CAAC,EAC3I;UAAA,WAAQ,OAAO,CAAC,MAAM,EAAC,GAAC,EAAE,MAAM,IAAI,MAAM,CAAC,UAAU,IAAK,IAAI;QAAA,eAAQ,CAAC;MAAA,eAAO,CAAC,EACjF;QAAA,WAAM,KAAG,EAAC,WAAW,CAAC,MAAM,EAAC,GAAC,EAAC,QAAQ,EAAC,GAAC;MAAA,eAAM,CAAC,EAChD;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,gBAAgB;QAAC,OAAO,EAAE,QAAS;QAAC,QAAQ,EAAE,SAAS,IAAI,WAAW,CAAC,MAAM,IAAI,QAAS;QAAA,WACxH,8DAAC,IAAI;UAAA,UAAE,SAAS,GAAG,eAAe,GAAG;QAAa,gBAAO,CAAC,EAC1D;UAAA,UAAO,SAAS,GAAG,MAAM,GAAG;QAAM,gBAAO,CAAC;MAAA,eACpC,CAAC,EACT;QAAO,GAAG,EAAE,YAAa;QAAC,IAAI,EAAC,MAAM;QAAC,KAAK,EAAE;UAAC,OAAO,EAAE;QAAM,CAAE;QAAC,QAAQ,EAAE;MAAW,gBAAE,CAAC,EACvF,WAAW,CAAC,MAAM,GAAG;QAAI,SAAS,EAAC,yBAAyB;QAAA,UAC1D,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK;UAAA,WAAoB,CAAC,CAAC,IAAI,EAAC;YAAG,SAAS,EAAC,gBAAgB;YAAC,OAAO,EAAE,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE;YAAA,UAAC;UAAK,gBAAG,CAAC;QAAA,GAA9H,CAAC,CAAC,MAAM,MAA0H,CAAC;MAAC,gBACtK,CAAC,GAAG,IAAI,EACZ;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,mBAAmB;QAAC,QAAQ,EAAE,UAAU,IAAK,MAAM,IAAI,IAAM;QAAC,OAAO,EAAE,MAAO;QAAA,UAAE,UAAU,GAAG,MAAM,GAAG;MAAI,gBAAS,CAAC,EACpJ;QAAK,SAAS,EAAC,0BAA0B;QAAA,WACvC;UAAA,WAAO;YAAO,IAAI,EAAC,OAAO;YAAC,IAAI,EAAC,cAAc;YAAC,OAAO,EAAE,SAAS,KAAK,OAAQ;YAAC,QAAQ,EAAE,MAAM,YAAY,CAAC,OAAO;UAAE,gBAAE,CAAC;YAAA,UAAM;UAAI,gBAAM,CAAC;QAAA,eAAO,CAAC,EACjJ;UAAA,WAAO;YAAO,IAAI,EAAC,OAAO;YAAC,IAAI,EAAC,cAAc;YAAC,OAAO,EAAE,SAAS,KAAK,WAAY;YAAC,QAAQ,EAAE,MAAM,YAAY,CAAC,WAAW,CAAE;YAC3H,QAAQ,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC;UAAgB,gBAAE,CAAC;YAAA,UAAM;UAAI,gBAAM,CAAC;QAAA,eAAO,CAAC;MAAA,eACvE,CAAC;IAAA,eACF,CAAC,EACN,UAAU,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG;MAAK,SAAS,EAAC,yBAAyB;MAAA,UAC/E;QAAS,IAAI,EAAC,QAAQ;QAAC,cAAW,MAAM;QAAC,SAAS,EAAC,uBAAuB;QAAA,WACxE,8DAAC,IAAI;UAAA,UAAC;QAAM,gBAAM,CAAC,EACnB;UAAA,UAAK,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI;QAAW,gBAAK,CAAC,EAC7C;UAAA,UAAI,MAAM,CAAC,MAAM,CAAC;QAAO,gBAAI,CAAC,EAC9B;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,MAAM;YAAE,aAAa,CAAC,KAAK,CAAC;YAAE,IAAI,UAAU,EAAE,QAAQ,CAAC,mBAAmB,CAAC;UAAE,CAAE;UAAA,UAAC;QAAI,gBAAQ,CAAC;MAAA,eACrH;IAAC,gBACP,CAAC,GAAG,IAAI;EAAA,eACV,CAAC;AACR;AAEe,SAAS,0BAA0B,CAAC;EAAC,IAAI;EAAE,UAAU;EAAE,QAAQ;EAAE,MAAM;EAAE;AAAe,CAAC,EAAE;EACxG,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAC5C,IAAI,OAAO;EACX,IAAI,IAAI,KAAK,WAAW,EAAE,OAAO,GAAG,8DAAC,SAAS;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAChE,IAAI,IAAI,KAAK,wBAAwB,EAAE,OAAO,GAAG,8DAAC,qBAAqB;IAAC,QAAQ,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC/F,IAAI,IAAI,KAAK,mBAAmB,IAAI,IAAI,KAAK,kBAAkB,EAAE,OAAO,GAAG,8DAAC,QAAQ;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC3G,IAAI,IAAI,KAAK,gBAAgB,EAAE,OAAO,GAAG,8DAAC,aAAa;IAAC,QAAQ,EAAE,QAAS;IAAC,MAAM,EAAE,MAAO;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAClH,IAAI,IAAI,KAAK,gBAAgB,EAAE,OAAO,GAAG,8DAAC,aAAa;IAAC,UAAU,EAAE,UAAW;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACtG,IAAI,IAAI,KAAK,qBAAqB,EAAE,OAAO,GAAG,8DAAC,iBAAiB;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACvF,IAAI,IAAI,KAAK,uBAAuB,EAAE,OAAO,GAAG,8DAAC,mBAAmB;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC3F,IAAI,IAAI,KAAK,mBAAmB,IAAI,IAAI,KAAK,mBAAmB,EAAE,OAAO,GAAG,8DAAC,eAAe;IAAC,IAAI,EAAE,IAAI,KAAK,mBAAoB;IAAC,QAAQ,EAAE,QAAS;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KAC3K,IAAI,IAAI,KAAK,qBAAqB,IAAI,IAAI,KAAK,qBAAqB,EAAE,OAAO,GAAG,8DAAC,iBAAiB;IAAC,IAAI,EAAE,IAAI,KAAK,qBAAsB;IAAC,QAAQ,EAAE,QAAS;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACnL,IAAI,IAAI,KAAK,qBAAqB,EAAE,OAAO,GAAG,8DAAC,iBAAiB;IAAC,UAAU,EAAE,UAAW;IAAC,QAAQ,EAAE,QAAS;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACnI,IAAI,IAAI,KAAK,uBAAuB,EAAE,OAAO,GAAG,8DAAC,mBAAmB;IAAC,UAAU,EAAE,UAAW;IAAC,QAAQ,EAAE,QAAS;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC,CAAC,KACvI,OAAO,GAAG,8DAAC,gBAAgB;IAAC,MAAM,EAAE,MAAO;IAAC,UAAU,EAAE,IAAI,KAAK,0BAA2B;IAAC,OAAO,EAAE;EAAS,gBAAE,CAAC;EACvH,OAAO;IAAA,WAAG,OAAO,EAAC,8DAAC,KAAK;MAAC,OAAO,EAAE,KAAM;MAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE;IAAE,gBAAE,CAAC;EAAA,eAAE,CAAC;AAC5E,C;;;;;;;;;;;;;;;;;;;;AClmC0B;AACoB;AAAA;AAE/B,MAAM,KAAK,SAAS,4DAAmB,CAAC;EACrD,MAAM,GAAG;IACP,OAAQ;MAAK,SAAS,EAAC,iBAAiB;MAAA,UACtC;QAAK,SAAS,EAAC,OAAO;QAAA,WACpB;UAAK,SAAS,EAAC,OAAO;UAAA,UAAE,IAAI,CAAC,KAAK,CAAC;QAAK,gBAAM,CAAC,EAC/C;UAAK,SAAS,EAAC,SAAS;UAAA,UAAE,IAAI,CAAC,KAAK,CAAC;QAAO,gBAAM,CAAC,EACnD;UAAK,SAAS,EAAC,gBAAgB;UAAA,WAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,GAClB;YAAQ,SAAS,EAAC,SAAS;YAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;YAAA,UACtD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,8DAAC,wDAAgB;cAAC,EAAE,EAAC,eAAe;cAAC,cAAc,EAAC,QAAQ;cAAC,WAAW,EAAC;YAAiB,gBAAE;UAAC,gBAC7G,CAAC,GAET,IAAI,EAEL,IAAI,CAAC,KAAK,CAAC,SAAS,GACnB;YAAQ,SAAS,EAAC,SAAS;YAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;YAAA,UACvD,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,8DAAC,wDAAgB;cAAC,EAAE,EAAC,WAAW;cAAC,cAAc,EAAC,IAAI;cAAC,WAAW,EAAC;YAAa,gBAAG;UAAC,gBACnG,CAAC,GAET,IAAI;QAAA,eAEH,CAAC;MAAA,eACH;IAAC,gBACH,CAAC;EACR;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;AC1ByB;AAC8B;AAEP;AACM;AAAA;AAGvD,MAAM,gBAAgB,GAAG,GAAG;AAE5B,MAAM,UAAU,GAAG,CAAC,GAAG,gBAAgB;AAEvC,MAAM,OAAO,GAAG,CAAC,GAAG,gBAAgB;AAEpC,MAAM,SAAS,GAAG,OAAO;AACzB,MAAM,cAAc,GAAG,OAAO;AAC9B,MAAM,WAAW,GAAG,SAAS;AAE7B,MAAM,kBAAkB,GAAG,EAAE;AAK7B,IAAI,iBAAiB,GAAG,IAAI;AAE5B,MAAM,QAAQ,GAAG,0DAAc,CAAC;EAC9B,eAAe,EAAE;IACf,EAAE,EAAE,iBAAiB;IACrB,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE;EACf;AACF,CAAC,CAAC;AAEF,MAAM,WAAW,SAAS,4DAAmB,CAAC;EAC5C,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,OAAO,GAAG,mEAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE;MAClE,OAAO,GAAG,IAAI;IAChB;IAEA,IAAI,CAAC,KAAK,GAAG;MACX,OAAO,EAAE,KAAK;MACd,OAAO,EAAE,KAAK;MACd,WAAW,EAAE,MAAM;MACnB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,GAAG,6DAAa,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,MAAM;MACtF,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM;MACtC,OAAO,EAAE;IACX,CAAC;IAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAE1C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAE9C,IAAI,CAAC,WAAW,GAAG,IAAI;IAEvB,IAAI,CAAC,UAAU,GAAG,EAAE;IACpB,IAAI,CAAC,SAAS,GAAG,sDAAe,CAAC,CAAC;EACpC;EAEA,iBAAiB,GAAG;IAClB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;MAClB,IAAI,CAAC,SAAS,CAAC,CAAC;IAClB;IAEA,IAAI,CAAC,UAAU,CAAC,CAAC;EACnB;EAEA,oBAAoB,GAAG;IACrB,IAAI,iBAAiB,KAAK,IAAI,EAAE;MAC9B,iBAAiB,GAAG,IAAI;IAC1B;IACA,IAAI,IAAI,CAAC,WAAW,EAAE;MACpB,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,IAAI;MACxC,IAAI,CAAC,WAAW,CAAC,YAAY,GAAG,IAAI;MACpC,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,IAAI;MAC/B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;MACxB,IAAI,CAAC,WAAW,GAAG,IAAI;IACzB;EACF;EAGA,mBAAmB,GAAG;IACpB,IAAI,IAAI,CAAC,WAAW,EAAE;MACpB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1B;IACA,IAAI,CAAC,QAAQ,CAAC;MAAC,OAAO,EAAE;IAAK,CAAC,CAAC;EACjC;EAEA,kBAAkB,CAAC,SAAS,EAAE;IAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE;MACnC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClB;IAEA,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,EAAE;MAC3C,IAAI,OAAO,GAAG,mEAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;MAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE;QAClE,OAAO,GAAG,IAAI;MAChB;MACA,IAAI,CAAC,QAAQ,CAAC;QAAC,OAAO,EAAE;MAAO,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;IACpD;EACF;EAEA,SAAS,GAAG;IACV,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IAC5C,IAAI,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;MAAC,OAAO,EAAE;IAAI,CAAC,CAAC;IACvE,IAAI,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;MACjD,WAAW,EAAE,6DAAa,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;IAC7E,CAAC,CAAC;IACF,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,CAAC,IAAI;MAC9B,IAAI,CAAC,WAAW,CAAC,WAAW,GAAG,CAAC;MAChC,IAAI,CAAC,QAAQ,CAAC;QAAC,OAAO,EAAE,KAAK;QAAE,WAAW,EAAE,6DAAa,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;MAAC,CAAC,CAAC;MAClF,IAAI,iBAAiB,KAAK,IAAI,EAAE;QAC9B,iBAAiB,GAAG,IAAI;MAC1B;IACF,CAAC;EACH;EAEA,UAAU,GAAG;IAEX,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,GAAG,gBAAgB;IACpF,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,GAAG,gBAAgB;IAEtF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,OAAO;IAEpC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IACvD,IAAI,CAAC,SAAS,CAAC,CAAC;EAClB;EAGA,SAAS,GAAG;IACV,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;MAC3B;IACF;IAEA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM;IAE5C,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,UAAU;IAEzC,MAAM,SAAS,GAAG,CAAC,IAAI;MACrB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;QAEhD;MACF;MAEA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;MAExE,IAAI,IAAI,CAAC,UAAU,EAAE;QACnB,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;UACtB,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC;QACzC;QAGA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GACjC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAGrH,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,CAAC,aAAa,CAAC,WAAW,GAAG,cAAc;QAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;UAC/C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,UAAU,GAAG,GAAG;UACzD,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC;UAEtD,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,GAAG,cAAc,GAAG,SAAS;UACtD,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,IAAI,KAAK,EAAE;YAC3C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC3B,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC9B,IAAI,CAAC,aAAa,CAAC,WAAW,GAAG,KAAK;UACxC;UAEA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC;UAChD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC;QAClD;QAEA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAG3B,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;UACvB,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;UAC9B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,GAAG,UAAU,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,EAAE,UAAU,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;UAC9F,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,WAAW;UAC1C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3B;MACF;IACF,CAAC;IAED,SAAS,CAAC,CAAC;EACb;EAGA,YAAY,CAAC,QAAQ,EAAE;IACrB,MAAM,QAAQ,GAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,GAAG,OAAO,KAAK,UAAU,GAAG,OAAO,CAAC,GAAI,CAAC;IAExF,IAAI,CAAC,cAAc,GAAG,QAAQ,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,OAAO;IAEjE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE;MACpD,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;IAC1D;IAEA,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ;IACzC,IAAI,IAAI,GAAG,EAAE;IACb,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;MAC7B,IAAI,EAAE,GAAI,CAAC,GAAG,MAAM,GAAI,CAAC;MACzB,IAAI,EAAE,GAAI,CAAC,CAAC,GAAG,CAAC,IAAI,MAAM,GAAI,CAAC;MAC/B,IAAI,EAAE,IAAI,EAAE,EAAE;QACZ,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;MACxB,CAAC,MAAM;QACL,IAAI,GAAG,GAAG,GAAG;QACb,KAAK,IAAI,CAAC,GAAC,EAAE,EAAE,CAAC,GAAC,EAAE,EAAE,CAAC,EAAE,EAAE;UACxB,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;QACpB;QACA,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;MACxC;MACA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IACpC;IAEA,IAAI,MAAM,GAAG,CAAC,EAAE;MACd,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;IAClC;IACA,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;EAC1D;EAEA,UAAU,CAAC,CAAC,EAAE;IACZ,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;MACvB;IACF;IAEA,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;MACtB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;MACxB,IAAI,CAAC,QAAQ,CAAC;QAAC,OAAO,EAAE;MAAK,CAAC,CAAC;IACjC,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,IAAI,CAAC,EAAE;MAC3C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;MACvB,IAAI,CAAC,QAAQ,CAAC;QAAC,OAAO,EAAE;MAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;MAI9C,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;QACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;MACrB;IACF;EACF;EAEA,WAAW,CAAC,GAAG,EAAE;IACf,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;EACpB;EAEA,UAAU,CAAC,CAAC,EAAE;IACZ,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;MACnC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;MAC7C,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,GAAG,gBAAgB;MAC/E,IAAI,CAAC,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,IAAI;MAClE,IAAI,CAAC,QAAQ,CAAC;QAAC,WAAW,EAAE,6DAAa,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;MAAC,CAAC,CAAC;MAC7F,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;QACvB,IAAI,CAAC,SAAS,CAAC,CAAC;MAClB;IACF;EACF;EAEA,MAAM,GAAG;IACP,MAAM,SAAS,GAAG,gBAAgB,IAC/B,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,QAAQ,CAAC,IACjC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,GAAG,WAAW,CAAC;IACzC,MAAM,IAAI,GAAI;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAE,IAAI,CAAC,UAAW;MAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAE;MAAA,UAC/G;QAAG,SAAS,EAAE,SAAU;QAAA,UAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,cAAc,GAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,aAAa,GAAG;MAAiB,gBAAI;IAAC,gBAC7D,CAAE;IACP,OAAQ;MAAK,SAAS,EAAC,cAAc;MAAA,UAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GACrD;QAAA,WACE;UAAQ,SAAS,EAAC,UAAU;UAAC,GAAG,EAAE,IAAI,CAAC,SAAU;UAAC,OAAO,EAAE,IAAI,CAAC;QAAW,gBAAE,CAAC,EAC7E,IAAI;MAAA,eACL,CAAC,GAEH;QAAA,WACG,IAAI,EACL;UAAA,WACE;YAAQ,SAAS,EAAC,UAAU;YAAC,GAAG,EAAE,IAAI,CAAC,SAAU;YAAC,OAAO,EAAE,IAAI,CAAC;UAAW,gBAAE,CAAC,EAC9E;YAAK,SAAS,EAAC,OAAO;YAAA,WAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAC,GAAC,EAAC,IAAI,CAAC,KAAK,CAAC,QAAQ;UAAA,eAAM,CAAC;QAAA,eACxE,CAAC;MAAA,eACN;IAAC,gBAEA,CAAC;EACR;AACF;AAEA,+DAAe,sDAAU,CAAC,WAAW,CAAC,E;;;;;;;;;;;;;;;;;;;;;;ACvSZ;AACoB;AAEV;AACe;AAAA;AAEpC,MAAM,UAAU,SAAS,4DAAmB,CAAC;EAC1D,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG;MACX,GAAG,EAAE,CAAC;MACN,IAAI,EAAE,CAAC;MACP,KAAK,EAAE,CAAC;MACR,MAAM,EAAE,CAAC;MACT,KAAK,EAAE;IACT,CAAC;IAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;EAClD;EAGA,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;IAC5C,IAAI,CAAC,QAAQ,CAAC;MACZ,IAAI,EAAE,IAAI;MACV,GAAG,EAAE,GAAG;MACR,KAAK,EAAE,KAAK;MACZ,MAAM,EAAE,MAAM;MACd,KAAK,EAAE;IACT,CAAC,CAAC;EACJ;EAEA,YAAY,GAAG;IACb,+DAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAC1C,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EACpE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAChB,IAAI,CAAC,GAAG,IAAI;MACX,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC;IAChE,CAAC,CAAC,CACD,KAAK,CAAC,GAAG,IAAI;MACZ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;IACzB,CAAC,CAAC;EACN;EAEA,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC,YAAY;MAAA,WACzB;QAAK,SAAS,EAAC,gBAAgB;QAAA,UAC7B,8DAAC,oDAAO;UACN,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;UAC1B,QAAQ,EAAE,IAAI,CAAC;QAAa,gBAAE;MAAC,gBAC9B,CAAC,EACN;QAAK,SAAS,EAAC,gBAAgB;QAAA,WAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,GAClB;UAAQ,SAAS,EAAC,WAAW;UAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAAA,UACzD,8DAAC,wDAAgB;YAAC,EAAE,EAAC,eAAe;YAAC,cAAc,EAAC,QAAQ;YAAC,WAAW,EAAC;UAAiB,gBAAE;QAAC,gBACvF,CAAC,GACP,IAAI,EACR;UAAQ,SAAS,EAAC,SAAS;UAAC,OAAO,EAAE,IAAI,CAAC,YAAa;UAAA,UACrD,8DAAC,wDAAgB;YAAC,EAAE,EAAC,WAAW;YAAC,cAAc,EAAC,IAAI;YAAC,WAAW,EAAC;UAAa,gBAAE;QAAC,gBAC3E,CAAC;MAAA,eACN,CAAC;IAAA,eACH,CAAC;EAEV;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;;;ACnEyB;AAEiB;AACE;AAEQ;AAEV;AAAA;AAE5B,MAAM,YAAY,SAAS,wDAAe,CAAC;EACxD,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG;MACX,MAAM,EAAE,KAAK,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;EAC9D;EAEA,kBAAkB,CAAC,SAAS,EAAE;IAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,EAAE;MACzC,IAAI,CAAC,QAAQ,CAAC;QAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;MAAM,CAAC,CAAC;IAC5C;EACF;EAEA,kBAAkB,CAAC,CAAC,EAAE;IACpB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC;IAE7E,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;EACrB;EAEA,MAAM,GAAG;IAGP,MAAM,MAAM,GAAG,oBAAoB,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,YAAY,GAAG,EAAE,CAAC;IAC7E,OACE;MAAK,SAAS,EAAE,SAAU;MAAA,WACvB,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GACxC,IAAI,GACJ;QAAG,IAAI,EAAC,GAAG;QAAC,SAAS,EAAC,cAAc;QAAC,OAAO,EAAG,CAAC,IAAK;UAAC,CAAC,CAAC,cAAc,CAAC,CAAC;UAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAAC,CAAE;QAAA,UACtG;UAAG,SAAS,EAAC,gBAAgB;UAAA,UAAC;QAAK,gBAAG;MAAC,gBACtC,CAAC,EACL,IAAI,CAAC,KAAK,CAAC,MAAM,GAChB;QAAK,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,iEAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE;QAAC,SAAS,EAAC;MAAS,gBAAE,CAAC,GAChH,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,GACnC;QAAK,SAAS,EAAC,YAAY;QAAA,UACzB,8DAAC,wDAAU;UACT,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAa;UAC7C,MAAM,EAAE,IAAK;UACb,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAI;UACtB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;QAAM,gBAAE;MAAC,gBAC1B,CAAC,GAEN;QAAK,SAAS,EAAC,OAAO;QAAA,WAAE,mDAAW,EAAC,GAAO,EAAC,mDAAW;MAAA,eAAM,CAAC,EACjE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,GACzB;QAAO,IAAI,EAAC,MAAM;QAAC,EAAE,EAAE,MAAO;QAAC,SAAS,EAAC,kBAAkB;QACzD,MAAM,EAAC,SAAS;QAAC,QAAQ,EAAE,IAAI,CAAC;MAAmB,gBAAE,CAAC,EACzD,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,GAC3B;QAAO,OAAO,EAAE,MAAO;QAAC,SAAS,EAAC,OAAO;QAAA,UACvC;UAAG,SAAS,EAAC,gBAAgB;UAAA,UAAC;QAAW,gBAAG;MAAC,gBACxC,CAAC,EACR,8DAAC,yDAAW;QAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;QAAC,KAAK,EAAE,IAAK;QAAC,KAAK,EAAE,IAAK;QAAC,QAAQ,EAAE;MAAK,gBAAE,CAAC;IAAA,eAClF,CAAC;EAEV;AACF;AAAC,C;;;;;;;;;;;;;;;;;ACpEyB;AAC8B;AAAA;AAExD,MAAM,YAAY,GAAG;EAAC,OAAO,EAAE;AAAe,CAAC;AAE/C,MAAM,QAAQ,GAAG,0DAAc,CAAC;EAC9B,cAAc,EAAE;IACd,EAAE,EAAE,gBAAgB;IACpB,cAAc,EAAE,mBAAmB;IACnC,WAAW,EAAE;EACf,CAAC;EACD,WAAW,EAAE;IACX,EAAE,EAAE,aAAa;IACjB,cAAc,EAAE,eAAe;IAC/B,WAAW,EAAE;EACf,CAAC;EACD,YAAY,EAAE;IACZ,EAAE,EAAE,cAAc;IAClB,cAAc,EAAE,eAAe;IAC/B,WAAW,EAAE;EACf;AACF,CAAC,CAAC;AAIF,MAAM,SAAS,SAAS,4DAAmB,CAAC;EAC1C,MAAM,GAAG;IACP,MAAM;MAAC;IAAa,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;IACvC,IAAI,MAAM,GAAG,IAAI;IACjB,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;MACnE,MAAM,GAAG,EAAE;MACX,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC/E,MAAM,KAAK,GAAG,iBAAiB,GAAG,CAAC,GAAG,QAAQ;QAC9C,MAAM,CAAC,IAAI,CAAC;UAAK,SAAS,EAAC,eAAe;UAAA,WAAS;YAAG,SAAS,EAAE,KAAM;YAAA,UAAE,YAAY,CAAC,CAAC,CAAC,IAAI;UAAC,gBAAI,CAAC,KAAC,EAAC,OAAO;QAAA,GAA3D,CAAC,MAAgE,CAAC,CAAC;MACrH,CAAC,CAAC;MACF,OAAO;QAAA,UAAG;MAAM,gBAAG,CAAC;IACtB;IACA,OAAO,IAAI;EACb;AACF;AAAC;AAED,+DAAe,sDAAU,CAAC,SAAS,CAAC,E;;;;;;;;;;;;;;;;;;;;;;;;;ACrCV;AAEU;AAES;AACM;AAEA;AACA;AACQ;AAAA;AAG3D,MAAM,mBAAmB,GAAG,GAAG;AAC/B,MAAM,mBAAmB,GAAG,EAAE;AAEf,MAAM,kBAAkB,SAAS,wDAAe,CAAC;EAC9D,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG;MACX,KAAK,EAAE,IAAI;MACX,WAAW,EAAE,KAAK;MAClB,eAAe,EAAE,EAAE;MACnB,cAAc,EAAE,IAAI;MACpB,OAAO,EAAE,EAAE;MACX,OAAO,EAAE,KAAK;MACd,KAAK,EAAE;IACT,CAAC;IAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;EAChE;EAEA,iBAAiB,GAAG;IAClB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACvB,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC;EACjE;EAEA,oBAAoB,GAAG;IACrB,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC;EACpE;EAEA,eAAe,CAAC,CAAC,EAAE;IACjB,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE,EAAE;MACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnB;EACF;EAEA,WAAW,CAAC,CAAC,EAAE;IACb,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;EACnB;EAEA,oBAAoB,CAAC,KAAK,EAAE;IAC1B,IAAI,CAAC,QAAQ,CAAC;MAAC,KAAK,EAAE,8CAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG;IAAK,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC;EACpC;EAEA,uBAAuB,CAAC,CAAC,EAAE;IACzB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK;MAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW;MAAE,eAAe,EAAE;IAAE,CAAC,CAAC,CAAC;EAC1E;EAIA,qBAAqB,CAAC,GAAG,EAAE;IACzB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;MAC3B,IAAI,CAAC,QAAQ,CAAC;QAAC,cAAc,EAAE,CAAC,GAAG;MAAC,CAAC,CAAC;MACtC;IACF;IACA,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI;MACjB,IAAI,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACnC,OAAO;UAAC,eAAe,EAAE,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;UAAE,KAAK,EAAE;QAAI,CAAC;MAChF;MAGA,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;MACrC,IAAI,CAAC,CAAC,eAAe,CAAC,MAAM,IAAI,GAAG,EAAE;QACnC,OAAO;UAAC,KAAK,EAAE,WAAW,GAAG;QAAM,CAAC;MACtC;MACA,OAAO;QAAC,eAAe,EAAE,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC;QAAE,KAAK,EAAE;MAAI,CAAC;IACtE,CAAC,CAAC;EACJ;EAEA,kBAAkB,GAAG;IAEnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,uEAAc,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI;IAC5F,MAAM,UAAU,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;IACjF,OAAO,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,mBAAmB,CAAC,GAAG,mBAAmB;EACzF;EAEA,oBAAoB,CAAC,CAAC,EAAE;IACtB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE;MACrC,IAAI,CAAC,QAAQ,CAAC;QAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC;MAAC,CAAC,CAAC;IACrE;EACF;EAMA,WAAW,GAAG;IACZ,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,QAAQ,GAAG,UAAU;EACvD;EAEA,mBAAmB,GAAG;IACpB,IAAI,CAAC,QAAQ,CAAC;MAAC,cAAc,EAAE,IAAI;MAAE,KAAK,EAAE;IAAI,CAAC,CAAC;EACpD;EAEA,mBAAmB,CAAC,CAAC,EAAE;IACrB,IAAI,CAAC,QAAQ,CAAC;MAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;IAAK,CAAC,CAAC;EAC1C;EAEA,UAAU,GAAG;IAEX,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK;MAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;MAAE,GAAG,EAAE,MAAM,CAAC,GAAG;IAAC,CAAC,CAAC,CAAC;IAG7F,IAAI,OAAO,CAAC,MAAM,GAAG,mBAAmB,EAAE;MACxC,IAAI,CAAC,QAAQ,CAAC;QAAC,KAAK,EAAE,UAAU,mBAAmB,aAAa,OAAO,CAAC,MAAM;MAAI,CAAC,CAAC;MACpF;IACF;IACA,IAAI,CAAC,QAAQ,CAAC;MAAC,OAAO,EAAE,IAAI;MAAE,KAAK,EAAE;IAAI,CAAC,CAAC;IAC3C,+DAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI;MAChH,MAAM,MAAM,GAAI,MAAM,IAAI,MAAM,CAAC,MAAM,IAAK,EAAE;MAC9C,IAAI,MAAM,CAAC,MAAM,EAAE;QACjB,IAAI,CAAC,QAAQ,CAAC;UAAC,OAAO,EAAE,KAAK;UAAE,KAAK,EAAE,GAAG,MAAM,CAAC,MAAM;QAAY,CAAC,CAAC;QACpE;MACF;MACA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MACd,IAAI,CAAC,QAAQ,CAAC;QAAC,OAAO,EAAE,KAAK;QAAE,KAAK,EAAE,GAAG,CAAC,OAAO,IAAI;MAAM,CAAC,CAAC;IAC/D,CAAC,CAAC;EACJ;EAEA,MAAM,GAAG;IACP,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;MAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI;QAAC,IAAI,EAAE,GAAG;QAAE,MAAM,EAAE;MAAI,CAAC,CAAC;MAClH,OACE;QAAK,SAAS,EAAC,iBAAiB;QAAA,UAC9B;UAAK,SAAS,EAAC,sCAAsC;UAAA,WACnD;YAAK,SAAS,EAAC,OAAO;YAAA,UAAC;UAAG,gBAAK,CAAC,EAChC;YAAI,SAAS,EAAC,aAAa;YAAA,UACxB,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI;cAAI,SAAS,EAAC,sBAAsB;cAAA,WACpD;gBAAA,UAAO,8CAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,GAAG,+DAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI;cAAC,gBAAO,CAAC,EACrG;gBAAG,SAAS,EAAC,gBAAgB;gBAAA,UAAC;cAAa,gBAAG,CAAC;YAAA,GAFW,CAAC,CAAC,IAAI,MAG9D,CAAC;UAAC,gBACJ,CAAC,EAGL;YAAO,SAAS,EAAC,uBAAuB;YAAC,IAAI,EAAC,MAAM;YAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;YAC7E,QAAQ,EAAE,IAAI,CAAC,mBAAoB;YAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;YACjE,WAAW,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,QAAQ,GAAG,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG;UAAM,gBAAE,CAAC,EAC5G,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG;YAAK,SAAS,EAAC,kBAAkB;YAAA,UAAE,IAAI,CAAC,KAAK,CAAC;UAAK,gBAAM,CAAC,GAAG,IAAI,EACrF;YAAK,SAAS,EAAC,uBAAuB;YAAA,WACpC;cAAQ,IAAI,EAAC,QAAQ;cAAC,OAAO,EAAE,IAAI,CAAC,mBAAoB;cAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;cAAA,UAAC;YAAE,gBAAQ,CAAC,EAClG;cAAQ,IAAI,EAAC,QAAQ;cAAC,SAAS,EAAC,SAAS;cAAC,OAAO,EAAE,IAAI,CAAC,UAAW;cAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;cAAA,UAC9F,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,GAAG;YAAI,gBAC7B,CAAC;UAAA,eACN,CAAC;QAAA,eACH;MAAC,gBACH,CAAC;IAEV;IAEA,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ;IACxF,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAE,CAAC,IAAM,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE/G,OACE;MAAK,SAAS,EAAC,iBAAiB;MAAA,UAC9B;QAAK,SAAS,EAAC,gBAAgB;QAAA,WAC7B;UAAK,SAAS,EAAC,oBAAoB;UAAA,WACjC;YAAA,UAAK;UAAE,gBAAK,CAAC,EACb;YAAA,WACE;cAAG,IAAI,EAAC,GAAG;cAAC,OAAO,EAAE,IAAI,CAAC,uBAAwB;cAAA,UAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,GAAG;YAAI,gBAAI,CAAC,EAC1F,IAAI,CAAC,KAAK,CAAC,WAAW,GACrB;cAAG,IAAI,EAAC,GAAG;cAAC,OAAO,EAAE,IAAI,CAAC,oBAAqB;cAC7C,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,EAAE,GAAG,UAAW;cAAA,UAAC;YAAE,gBAAG,CAAC,GAAG,IAAI,EACjF;cAAG,IAAI,EAAC,GAAG;cAAC,OAAO,EAAE,IAAI,CAAC,WAAY;cAAA,UAAC;gBAAG,SAAS,EAAC,gBAAgB;gBAAA,UAAC;cAAK,gBAAG;YAAC,gBAAG,CAAC;UAAA,eAC/E,CAAC;QAAA,eACH,CAAC,EACN,8DAAC,4DAAc;UAAC,WAAW,EAAC,OAAO;UAAC,gBAAgB,EAAE,IAAI,CAAC;QAAqB,gBAAE,CAAC,EAClF,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG;UAAK,SAAS,EAAC,kBAAkB;UAAA,UAAE,IAAI,CAAC,KAAK,CAAC;QAAK,gBAAM,CAAC,GAAG,IAAI,EACrF,8DAAC,yDAAW;UACV,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;UAC1B,QAAQ,EAAE,QAAS;UACnB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAC9B,gBAAgB,EAAC,UAAU;UAC3B,UAAU,EAAE,KAAM;UAClB,UAAU,EAAE,KAAM;UAClB,eAAe,EAAE,KAAM;UACvB,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAK;UAC1E,eAAe,EAAE,IAAI,CAAC;QAAsB,gBAAE,CAAC;MAAA,eAC9C;IAAC,gBACH,CAAC;EAEV;AACF,C;;;;;;;;;;;;;;;;;;ACjN0B;AAAA;AAEX,MAAM,UAAU,SAAS,4DAAmB,CAAC;EAC1D,MAAM,GAAG;IACP,OACE;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAG,CAAC,IAAK;QAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;MAAC,CAAE;MAAA,UACrE;QAAG,SAAS,EAAC,gBAAgB;QAAA,UAAC;MAAU,gBAAG;IAAC,gBAC3C,CAAC;EAER;AACF,C;;;;;;;;;;;;;;;;;;;;;;;;ACV0B;AAEe;AACE;AAE4B;AACR;AAET;AACD;AAAA;AAErD,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,mBAAmB,CAAC;AAElC,MAAM,YAAY,SAAS,wDAAe,CAAC;EACxD,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG;MACX,KAAK,EAAE,IAAI;MACX,QAAQ,EAAE,SAAS;MACnB,MAAM,EAAE,IAAI;MACZ,aAAa,EAAE,EAAE;MACjB,gBAAgB,EAAE;IACpB,CAAC;IAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,SAAS,GAAG,IAAI;EACvB;EAEA,iBAAiB,GAAG;IAClB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1D,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IAEA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IACrB,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,uEAA4B,EAAE;MAExD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;MAChC,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC,IAAI;QAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;MAAA,CAAC,EAAE,IAAI,CAAC;MAC3E,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IACxD;EACF;EAGA,kBAAkB,CAAC,KAAK,EAAE;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;IACrD,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IAEA,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,EAAE;MACvC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,UAAU;MACxC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;IACpC;IAEA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;MACnC,IAAI,CAAC,QAAQ,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC;MAAK,CAAC,CAAC;MACnC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;IAC9B;EACF;EAEA,oBAAoB,GAAG;IACrB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE;MAC1B,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;MAC7B,UAAU,CAAC,KAAK,CAAC,CAAC;IACpB;IACA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1D,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IACA,IAAI,CAAC,QAAQ,CAAC;MAAC,KAAK,EAAE;IAAI,CAAC,CAAC;IAC5B,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB;EAC1C;EAEA,SAAS,CAAC,KAAK,EAAE;IACf,MAAM,MAAM,GAAG,EAAE;IACjB,IAAI,KAAK,CAAC,OAAO,EAAE;MACjB,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;QACtD,IAAI,GAAG,EAAE;UACP,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAClB;MACF;IACF;IAEA,IAAI,CAAC,QAAQ,CAAC;MACZ,QAAQ,EAAE,iEAAc,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,SAAS,EAAE,wDAAgB,CAAC;MACtF,MAAM,EAAE,kEAAY,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;MAC9D,aAAa,EAAE;IACjB,CAAC,CAAC;EACJ;EAEA,UAAU,CAAC,IAAI,EAAE;IACf,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1D,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IACA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IAErB,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,UAAU,EAAE;MACrE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;IAC7B;EACF;EAEA,gBAAgB,GAAG;IACjB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;EAC3C;EAEA,gBAAgB,GAAG;IACjB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;EACtB;EAEA,MAAM,GAAG;IACP,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,uEAA4B;IACpE,MAAM,YAAY,GAAG,WAAW,GAAG,oBAAoB,GAAG,oBAAoB;IAC9E,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG;MAAC,uBAAuB,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM;IAAG,CAAC,GAAG,IAAI;IACpG,OACE;MAAK,SAAS,EAAE,yCAAyC,YAAY,WAAY;MAAA,WAC/E;QAAK,SAAS,EAAC;MAAc,gBAAE,CAAC,EAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,IAChB;QAAK,SAAS,EAAC,0BAA0B;QAAC,KAAK,EAAE;MAAW,gBAAE,CAAC,EACjE;QAAK,SAAS,EAAC,gBAAgB;QAAA,WAC7B;UAAK,SAAS,EAAC,gCAAgC;UAAA,UAC7C,8DAAC,wDAAU;YACT,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAa;YAC7C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAK;YAClC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;YACxB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;UAAS,gBAAE;QAAC,gBAC7B,CAAC,EACN;UAAA,WAAK,iEAAc,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,6DAAqB,CAAC,EAC7D,8DAAC,uDAAS;YAAC,KAAK,EAAE,IAAK;YAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC;UAAc,gBAAE,CAAC;QAAA,eAAI,CAAC,EAC1E;UAAA,UAAI,WAAW,GAAG,cAAc,GAAG;QAAc,gBAAI,CAAC,EACrD,OAAO,IAAI;UAAM,SAAS,EAAC,mBAAmB;UAAA,WAAC,oFAAI,CAAC,sFAAI,CAAC,sFAAI,CAAC;QAAA,eAAM,CAAC;MAAA,eACnE,CAAC,EACN;QAAQ,SAAS,EAAC,uBAAuB;QAAA,UACtC,OAAO,GACN;UAAA,WACE;YAAQ,IAAI,EAAC,QAAQ;YAAC,SAAS,EAAC,qBAAqB;YAAC,OAAO,EAAE,IAAI,CAAC,gBAAiB;YAAA,WACnF;cAAA,UAAM;gBAAG,SAAS,EAAC,gBAAgB;gBAAA,UAAC;cAAQ,gBAAG;YAAC,gBAAM,CAAC,EACvD;cAAA,UAAO;YAAE,gBAAO,CAAC;UAAA,eACX,CAAC,EACT;YAAQ,IAAI,EAAC,QAAQ;YAAC,SAAS,EAAC,cAAc;YAAC,OAAO,EAAE,IAAI,CAAC,gBAAiB;YAAA,WAC5E;cAAA,UAAM;gBAAG,SAAS,EAAC,gBAAgB;gBAAA,UAAE,WAAW,GAAG,MAAM,GAAG;cAAU,gBAAI;YAAC,gBAAM,CAAC,EAClF;cAAA,UAAO;YAAE,gBAAO,CAAC;UAAA,eACX,CAAC;QAAA,eACT,CAAC,GAEH;MAAI,gBAEA,CAAC;IAAA,eACN,CAAC;EAEV;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;;AC7JyB;AACoB;AAEM;AAAA;AAErC,MAAM,WAAW,SAAS,4DAAmB,CAAC;EAC3D,MAAM,GAAG;IACP,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IACnG,MAAM,YAAY,GAAG,wBAAwB,IAAI,aAAa,GAAG,KAAK,GAAG,OAAO,CAAC;IACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GACjC,aAAa,GAAG,aAAa,GAAG,eAAe,GAC/C,aAAa,GAAG,sBAAsB,GAAG,WAAY;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAC3B,8DAAC,wDAAgB;MAAC,EAAE,EAAC,gBAAgB;MAAC,cAAc,EAAC,eAAe;MAAC,WAAW,EAAC;IAAqB,gBAAE,CAAC,GACzG,8DAAC,wDAAgB;MAAC,EAAE,EAAC,gBAAgB;MAAC,cAAc,EAAC,eAAe;MAAC,WAAW,EAAC;IAAqB,gBAAE,CAAC;IAC/G,IAAI,QAAQ;IACZ,IAAI,aAAa,EAAE;MACjB,QAAQ,IAAI,CAAC,KAAK,CAAC,SAAS;QAC1B,KAAK,MAAM;UACT,QAAQ,GAAG,8DAAC,wDAAgB;YAAC,EAAE,EAAC,WAAW;YAAC,cAAc,EAAC,MAAM;YAAC,WAAW,EAAC;UAA0B,gBAAE,CAAC;UAC3G;QACF,KAAK,UAAU;UACb,QAAQ,GAAG,8DAAC,wDAAgB;YAAC,EAAE,EAAC,eAAe;YAAC,cAAc,EAAC,UAAU;YAAC,WAAW,EAAC;UAAyB,gBAAE,CAAC;UAClH;QACF,KAAK,QAAQ;UACX,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAC5B,8DAAC,wDAAgB;YAAC,EAAE,EAAC,aAAa;YAAC,cAAc,EAAC,QAAQ;YAAC,WAAW,EAAC;UAAgC,gBAAE,CAAC,GAC1G,8DAAC,wDAAgB;YAAC,EAAE,EAAC,gBAAgB;YAAC,cAAc,EAAC,WAAW;YAAC,WAAW,EAAC;UAAmC,gBAAE,CAAC;UACrH;QACF;UACE,QAAQ,GAAG,8DAAC,wDAAgB;YAAC,EAAE,EAAC,mBAAmB;YAAC,cAAc,EAAC,cAAc;YAAC,WAAW,EAAC;UAA6B,gBAAE,CAAC;UAC9H;MACJ;IACF,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;MAKzF,QAAQ,GAAG,8DAAC,wDAAgB;QAAC,EAAE,EAAC,kBAAkB;QAAC,cAAc,EAAC,aAAa;QAAC,WAAW,EAAC;MAA4B,gBAAE,CAAC;IAC7H,CAAC,MAAM;MACL,QAAQ,GAAG;QAAA,UAAO,gEAAa,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI;MAAC,gBAAO,CAAC;IACrE;IACA,OAAO;MAAK,SAAS,EAAC,cAAc;MAAA,WAClC;QAAA,UAAK;UAAG,SAAS,EAAC,yBAAyB;UAAA,UAAC;QAAI,gBAAG;MAAC,gBAAK,CAAC,EAC1D;QAAK,SAAS,EAAC,oBAAoB;QAAA,WACjC;UAAA,UAAM;QAAK,gBAAM,CAAC,EAClB;UAAK,SAAS,EAAC,UAAU;UAAA,WAAC;YAAG,SAAS,EAAE,YAAa;YAAA,UAAE;UAAQ,gBAAI,CAAC,KAAC,EAAC,QAAQ;QAAA,eAAM,CAAC;MAAA,eAClF,CAAC;IAAA,eACH,CAAC;EACR;AACF,C;;;;;;;;;;;;;;;;;;;;;ACnD0B;AACoB;AAEM;AAAA;AAMrC,MAAM,UAAU,SAAS,4DAAmB,CAAC;EAC1D,MAAM,GAAG;IACP,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IACnG,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAC9B,aAAa,GAAG,aAAa,GAAG,eAAe,GAC/C,aAAa,GAAG,sBAAsB,GAAG,WAAY;IACxD,IAAI,QAAQ;IACZ,IAAI,aAAa,EAAE;MACjB,QAAQ,IAAI,CAAC,KAAK,CAAC,SAAS;QAC1B,KAAK,MAAM;UACT,QAAQ,GAAG,8DAAC,wDAAgB;YAAC,EAAE,EAAC,WAAW;YAAC,cAAc,EAAC,MAAM;YAAC,WAAW,EAAC;UAA0B,gBAAE,CAAC;UAC3G;QACF,KAAK,UAAU;UACb,QAAQ,GAAG,8DAAC,wDAAgB;YAAC,EAAE,EAAC,eAAe;YAAC,cAAc,EAAC,UAAU;YAAC,WAAW,EAAC;UAAyB,gBAAE,CAAC;UAClH;QACF,KAAK,QAAQ;UACX,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAC5B,8DAAC,wDAAgB;YAAC,EAAE,EAAC,aAAa;YAAC,cAAc,EAAC,QAAQ;YAAC,WAAW,EAAC;UAAgC,gBAAE,CAAC,GAC1G,8DAAC,wDAAgB;YAAC,EAAE,EAAC,gBAAgB;YAAC,cAAc,EAAC,WAAW;YAAC,WAAW,EAAC;UAAmC,gBAAE,CAAC;UACrH;QACF;UACE,QAAQ,GAAG,8DAAC,wDAAgB;YAAC,EAAE,EAAC,mBAAmB;YAAC,cAAc,EAAC,cAAc;YAAC,WAAW,EAAC;UAA6B,gBAAE,CAAC;UAC9H;MACJ;IACF,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;MACzF,QAAQ,GAAG,8DAAC,wDAAgB;QAAC,EAAE,EAAC,kBAAkB;QAAC,cAAc,EAAC,aAAa;QAAC,WAAW,EAAC;MAA4B,gBAAE,CAAC;IAC7H,CAAC,MAAM;MACL,QAAQ,GAAG;QAAA,UAAO,gEAAa,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI;MAAC,gBAAO,CAAC;IACrE;IACA,OACE;MAAA,WACE;QAAK,SAAS,EAAC,mBAAmB;QAAA,WAChC;UAAG,SAAS,EAAC,gBAAgB;UAAA,UAAC;QAAI,gBAAG,CAAC;UAAG,SAAS,EAAC,uBAAuB;UAAA,UAAE;QAAK,gBAAI,CAAC;MAAA,eACnF,CAAC,KAAC,EAAC,QAAQ;IAAA,eAChB,CAAC;EAEP;AACF;AAAC,C;;;;;;;;;;;;;;;;;AC/CyB;AAGX,MAAM,QAAQ,SAAS,4DAAmB,CAAC;EACxD,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;EAClD;EAEA,YAAY,GAAG;IACb,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;EAC3D;EAEA,MAAM,GAAG;IACP,IAAI,SAAS,GAAG,CAAC,gBAAgB,CAAC;IAClC,IAAI,QAAQ;IACZ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;MACvC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IACzC,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;MAC/B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IACtC;IACA,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;MACvB,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;QACtB,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;QACnC,QAAQ,GAAG,WAAW;MACxB,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE;QACvC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;QACnC,QAAQ,GAAG,yBAAyB;MACtC,CAAC,MAAM;QACL,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;QACzB,QAAQ,GAAG,yBAAyB;MACtC;IACF,CAAC,MAAM;MACH,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;QACtB,QAAQ,GAAG,WAAW;MACxB,CAAC,MAAM;QACL,QAAQ,GAAG,yBAAyB;MACtC;IACJ;IACA,IAAI,KAAK,GAAG;MACV,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;MAC9B,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;MACvB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY;IACnC;IACA,OAAO,0DAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC;EAClD;AACF,C;;;;;;;;;;;;;;;;;;;;ACjD0B;AAEI;AAEwB;AAAA;AAGvC,MAAM,SAAS,SAAS,wDAAe,CAAC;EACrD,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,oBAAoB,CAAC,KAAK,CAAC;IAClD,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;IACrB,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK;IAE1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;EACpD;EAEA,OAAO,oBAAoB,CAAC,KAAK,EAAE;IACjC,OAAO;MACL,WAAW,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC;MAClE,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK;IAC7C,CAAC;EACH;EAEA,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE;IACvC,IAAI,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IACrC,SAAS,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IACnD,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;MACvC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D;IACA,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE;MACxE,IAAI,CAAC,QAAQ,CAAC;QAAC,KAAK,EAAE;MAAE,CAAC,CAAC;IAC5B;EACF;EAGA,OAAO,UAAU,CAAC,KAAK,EAAE;IACvB,MAAM,KAAK,GAAG,CAAC,CAAC;IAChB,IAAI,KAAK,GAAG,CAAC;IACb,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI;MACpB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK;MACxB,KAAK,EAAG;IACV,CAAC,CAAC;IACF,OAAO,KAAK;EACd;EAGA,OAAO,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE;IAC5B,MAAM,QAAQ,GAAG,EAAE;IACnB,MAAM,MAAM,GAAG,EAAE;IACjB,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI;MACpB,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACpC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;MACrB,CAAC,MAAM;QACL,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;MACnB;IACF,CAAC,CAAC;IACF,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;EAChC;EAEA,eAAe,CAAC,CAAC,EAAE;IACjB,IAAI,CAAC,QAAQ,CAAC;MAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;IAAK,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;MACzB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IACvC;EACF;EAEA,YAAY,CAAC,GAAG,EAAE;IAChB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;EAC5E;EAEA,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE;IAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;EACxB;EAEA,iBAAiB,GAAG;IAClB,IAAI,CAAC,QAAQ,CAAC;MAAC,OAAO,EAAE;IAAI,CAAC,CAAC;EAChC;EAEA,eAAe,GAAG;IAChB,IAAI,CAAC,QAAQ,CAAC;MAAC,OAAO,EAAE;IAAK,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;MAC1B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1C;EACF;EAEA,aAAa,CAAC,CAAC,EAAE;IACf,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,EAAE;MACzB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;QACrE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;QAC5C,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;UAChE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACvB;MACF;IACF,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE;MAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;QACtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;MACtC;IACF,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE;MAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;QACvB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;MACvB;IACF;EACF;EAEA,MAAM,GAAG;IACP,MAAM,KAAK,GAAG,EAAE;IAChB,IAAI,KAAK,GAAG,CAAC;IACb,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE;IACpD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,IAAI;MACrC,KAAK,CAAC,IAAI,CACR,8DAAC,iDAAI;QACH,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;QAC1B,QAAQ,EAAE,IAAI,CAAC,gBAAiB;QAChC,MAAM,EAAE,kEAAY,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAE;QAC7D,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,SAAU;QAChD,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,cAAe;QACpC,KAAK,EAAE,IAAI,CAAC,IAAK;QACjB,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAE;QAC5C,OAAO,EAAE,IAAI,CAAC,OAAQ;QACtB,KAAK,EAAE;MAAM,GACR,IAAI,CAAC,IAAI,OAAG,CACrB,CAAC;MACD,KAAK,EAAE;IACT,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,GAAG,EAAE,CAAC;IACvE,MAAM,SAAS,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC5C,OACE;MAAK,SAAS,EAAE,SAAU;MAAA,WACvB,KAAK,EACN;QAAO,IAAI,EAAC,MAAM;QAChB,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;QAC/B,QAAQ,EAAE,IAAI,CAAC,eAAgB;QAC/B,OAAO,EAAE,IAAI,CAAC,iBAAkB;QAChC,MAAM,EAAE,IAAI,CAAC,eAAgB;QAC7B,SAAS,EAAE,IAAI,CAAC,aAAc;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;QACxB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,SAAS,EAAE;MAAU,gBAAE,CAAC;IAAA,eACvB,CAAC;EAEV;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;ACrJyB;AAEiB;AAAA;AAE5B,MAAM,IAAI,SAAS,4DAAmB,CAAC;EACpD,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;EAClD;EAEA,YAAY,CAAC,CAAC,EAAE;IACd,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;EACzD;EAEA,MAAM,GAAG;IACP,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,cAAc,GAAG,MAAM;IAC9D,OACE;MAAK,SAAS,EAAE,SAAU;MAAA,WACvB,IAAI,CAAC,KAAK,CAAC,QAAQ,GAClB;QAAM,SAAS,EAAC;MAAQ,gBAAE,CAAC,GAC3B;QAAK,SAAS,EAAC,YAAY;QAAA,UACzB,8DAAC,wDAAU;UACT,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAa;UAC7C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAK;UAClC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;UACxB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;QAAM,gBAAE;MAAC,gBAC1B,CAAC,EAER;QAAA,UAAO;MAAK,gBAAO,CAAC,EACnB,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAC1C;QAAG,IAAI,EAAC,GAAG;QAAC,OAAO,EAAE,IAAI,CAAC,YAAa;QAAA,UAAE;MAAO,gBAAG,CAAC,GAClD;QAAM,SAAS,EAAC;MAAQ,gBAAE,CAAC;IAAA,eAC5B,CAAC;EAEV;AACF;AAAC,C;;;;;;;;;;;;;;;;;ACrCyB;AACc;AAAA;AAExC,MAAM,aAAa,SAAS,4DAAmB,CAAC;EAC9C,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;EAChD;EAEA,WAAW,CAAC,CAAC,EAAE;IACb,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,CAAC,CAAC,eAAe,CAAC,CAAC;IACnB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;EACxC;EAEA,MAAM,GAAG;IACP,MAAM;MAAC;IAAa,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;IACvC,OACE;MAAI,OAAO,EAAE,IAAI,CAAC,WAAY;MAAC,SAAS,EAAC,QAAQ;MAAA,UAC/C;QAAK,SAAS,EAAC,aAAa;QAAA,UAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;MAAC,gBAAM;IAAC,gBACrF,CAAC;EAET;AACF;AAAC;AAED,+DAAe,sDAAU,CAAC,aAAa,CAAC,E;;;;;;;;;;;;;;;;;;AC3Bd;AAAA;AAE1B,MAAM,YAAY,GAAG;EAAC,OAAO,EAAE,mBAAmB;EAAE,QAAQ,EAAE,OAAO;EAAE,OAAO,EAAE;AAAe,CAAC;AAGjF,MAAM,aAAa,SAAS,4DAAmB,CAAC;EAC7D,MAAM,GAAG;IACP,IAAI,MAAM,GAAG,IAAI;IACjB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;MACrD,MAAM,GAAG,EAAE;MACX,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI;QAC7B,MAAM,KAAK,GAAI,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,EAAG;QAC5C,IAAI,CAAC,CAAC,IAAI,EAAE;UACV,MAAM,CAAC,IAAI,CAAC;YAAG,SAAS,EAAE,yBAAyB,GAAG,KAAM;YAAA,UAAwB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;UAAI,GAAhD,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,OAAqC,CAAC,CAAC;QAC1H,CAAC,MAAM;UACL,MAAM,CAAC,IAAI,CAAC;YAAM,SAAS,EAAE,OAAO,GAAG,KAAM;YAAA,UAAwB,CAAC,CAAC;UAAI,GAAxB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,OAAgB,CAAC,CAAC;QACtF;MACF,CAAC,CAAC;MACF,OAAO;QAAA,UAAG;MAAM,gBAAG,CAAC;IACtB;IACA,OAAO,IAAI;EACb;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;;;;;ACpByB;AAC8B;AAEZ;AAER;AACa;AAEK;AACH;AAEG;AAAA;AAEtD,MAAM,QAAQ,GAAG,0DAAc,CAAC;EAC9B,SAAS,EAAE;IACT,EAAE,EAAE,WAAW;IACf,cAAc,EAAE,KAAK;IACrB,WAAW,EAAE;EACf,CAAC;EACD,WAAW,EAAE;IACX,EAAE,EAAE,aAAa;IACjB,cAAc,EAAE,OAAO;IACvB,WAAW,EAAE;EACf;AACF,CAAC,CAAC;AAEF,MAAM,WAAW,SAAS,4DAAmB,CAAC;EAC5C,MAAM,GAAG;IACP,MAAM;MAAE;IAAc,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;IACzC,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;IAC7D,MAAM,YAAY,GAAG,EAAE;IAGvB,IAAI,aAAa,GAAG,CAAC;IACrB,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;MAC5B,MAAM,QAAQ,GAAG,aAAa,GAC5B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,8CAAM,CAAC,eAAe,CAAC,GACrD,8CAAM,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;MAClD,YAAY,CAAC,IAAI,CACf,8DAAC,oDAAO;QACN,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;QAC1B,MAAM,EAAE,IAAK;QACb,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAC9B,QAAQ,EAAE,QAAS;QACnB,aAAa,EAAE,aAAc;QAC7B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;QACvC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;QAC5C,KAAK,EAAE,YAAY,CAAC,MAAO;QAC3B,IAAI,EAAC;MAAK,GACN,KAAK,OAAE,CACf,CAAC;MACD,aAAa,EAAG;IAClB;IACA,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;MAEzD,MAAM,QAAQ,GAAG,CAAC,CAAC;MACnB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI;QAC/B,IAAI,CAAC,CAAC,MAAM,EAAE;UAEZ,YAAY,CAAC,IAAI,CACf,8DAAC,2DAAa;YACZ,KAAK,EAAE,CAAC,CAAC,KAAM;YAAC,MAAM,EAAE,CAAC,CAAC,MAAO;YAAC,MAAM,EAAE,CAAC,CAAC,MAAO;YAEnD,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;UAAS,GADzB,CAAC,CAAC,MAAM,OAEZ,CAAC,CAAC;QACT,CAAC,MAAM;UAEL,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,GAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAK;UAC9D,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE;YACjB;UACF;UACA,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI;UAGpB,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAC9C,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC;YACtB,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE;cAClC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;YACvD;YACA,MAAM,WAAW,GAAG,+DAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC;YACzD,IAAI,WAAW,EAAE;cACf,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;YACjD;YACA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;cACvD;YACF;UACF;UAEA,MAAM,SAAS,GAAG,8CAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC;UAChD,MAAM,OAAO,GAAG,CAAC,SAAS,IAAI,8CAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC;UAC1D,MAAM,QAAQ,GAAG,aAAa,GAC3B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAC1C,IAAI,CAAC,KAAK,CAAC,aAAa,KAAK,GAAI;UACpC,MAAM,MAAM,GAAG,EAAE;UACjB,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YACvB,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;cAC9B,MAAM,CAAC,IAAI,CAAC;gBAAC,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE,KAAK,EAAE;cAAO,CAAC,CAAC;YACxE;YACA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE;cAC5B,MAAM,CAAC,IAAI,CAAC;gBAAC,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAAE,KAAK,EAAE;cAAM,CAAC,CAAC;YACzE;UACF;UAEA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GACtC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,GAAG,IAAK;UAC9D,IAAI,OAAO;UACX,IAAI,SAAS;UACb,IAAI,iBAAiB;UACrB,IAAI,cAAc;UAClB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,aAAa,EAAE;YAC3C,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC;YAC7B,IAAI,GAAG,EAAE;cACP,SAAS,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI;cAChD,cAAc,GAAG,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC;cACtD,iBAAiB,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ;cACnD,IAAI,GAAG,CAAC,OAAO,EAAE;gBACf,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,IAAI,QAAQ,GACtC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,8DAAsB,CAAC,GAC7C,8CAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,8DAAsB,CAAC;cACvD;YACF;UACF;UAEA,YAAY,CAAC,IAAI,CACf,8DAAC,oDAAO;YACN,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;YAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,GAAG,+DAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,IAAK;YAC/D,MAAM,EAAE,kEAAY,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAE;YACvD,OAAO,EAAE,OAAQ;YACjB,OAAO,EAAE,OAAQ;YACjB,iBAAiB,EAAE,iBAAkB;YACrC,SAAS,EAAE,SAAU;YACrB,QAAQ,EAAE,cAAe;YACzB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM,GAAG,CAAE;YAC7C,GAAG,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,SAAU;YACtC,GAAG,EAAE,CAAC,CAAC,GAAI;YACX,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;YAC9B,MAAM,EAAE,MAAO;YACf,aAAa,EAAE,aAAc;YAC7B,QAAQ,EAAE,QAAS;YACnB,MAAM,EAAE,CAAC,CAAC,MAAO;YACjB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,SAAU;YAChD,SAAS,EAAE,SAAU;YACrB,OAAO,EAAE,OAAQ;YACjB,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;YAC5C,UAAU,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,QAAS;YAC5C,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,KAAM;YACtC,WAAW,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAO;YAC3C,OAAO,EAAE,CAAC,CAAC,QAAS;YACpB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;YACvC,IAAI,EAAE,GAAI;YACV,KAAK,EAAE,YAAY,CAAC;UAAO,GACtB,GAAG,OAAG,CACf,CAAC;UACD,aAAa,EAAG;QAClB;MACF,CAAC,EAAE,IAAI,CAAC;IACV;IAEA,OACE;MAAK,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,GAAG,kBAAmB;MAAA,WAC7D,aAAa,IAAI,CAAC,GACjB;QAAK,SAAS,EAAC,oBAAoB;QAAC,KAAK,EAAE;UAAC,UAAU,EAAE;QAAU,CAAE;QAAA,UACjE,IAAI,CAAC,KAAK,CAAC;MAAgB,gBACzB,CAAC,GAEN,IAAI,EAEL,YAAY,CAAC,MAAM,GAAG,CAAC,GACtB;QAAI,SAAS,EAAC,aAAa;QAAA,UACxB;MAAY,gBACX,CAAC,GAEL,IAAI;IAAA,eAEH,CAAC;EAEV;AACF;AAAC;AAED,+DAAe,sDAAU,CAAC,WAAW,CAAC,E;;;;;;;;;;;;;;;;;;;;;;;;;ACrLZ;AACgD;AAEtC;AAEa;AACN;AACE;AAET;AAEoB;AACP;AACI;AAAA;AAErD,MAAM,QAAQ,GAAG,0DAAc,CAAC;EAC9B,eAAe,EAAE;IACf,EAAE,EAAE,iBAAiB;IACrB,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE;EACf,CAAC;EACD,kBAAkB,EAAE;IAClB,EAAE,EAAE,oBAAoB;IACxB,cAAc,EAAE,mDAAmD;IACnE,WAAW,EAAE;EACf;AACF,CAAC,CAAC;AAEF,MAAM,OAAO,SAAS,wDAAe,CAAC;EACpC,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;EAC9D;EAEA,WAAW,CAAC,CAAC,EAAE;IACb,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,CAAC,CAAC,eAAe,CAAC,CAAC;IACnB,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;MAEzB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1D;EACF;EAEA,kBAAkB,CAAC,CAAC,EAAE;IACpB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,CAAC,CAAC,eAAe,CAAC,CAAC;IACnB,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;MACzB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;MAC1B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;MAC5B,CAAC,EAAE,CAAC,CAAC,KAAK;MACV,CAAC,EAAE,CAAC,CAAC;IACP,CAAC,CAAC;EACJ;EAEA,MAAM,GAAG;IACP,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;IAC5B,MAAM,IAAI,GAAG,8CAAM,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC,KAAK,EAAE;MACV,IAAI,IAAI,EAAE;QACR,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC;MACjE,CAAC,MAAM;QACL,KAAK,GAAG;UAAA,UAAG,8DAAC,wDAAgB;YAAC,EAAE,EAAC,eAAe;YAAC,cAAc,EAAC,SAAS;YACtE,WAAW,EAAC;UAAwC,gBAAE;QAAC,gBAAG,CAAC;MAC/D;IACF,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE;MAE5B,KAAK,GAAG,iEAAc,CAAC,KAAK,EAAE,EAAE,CAAC;IACnC;IACA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,GAAG,SAAS;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI;IAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE;IACjE,MAAM,WAAW,GAAG,EAAE;IACtB,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;MACzB,WAAW,CAAC,IAAI,CAAC;QAAC,IAAI,EAAE,UAAU;QAAE,KAAK,EAAE;MAAgB,CAAC,CAAC;IAC/D;IACA,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;MACtB,WAAW,CAAC,IAAI,CAAC;QAAC,IAAI,EAAE,OAAO;QAAE,KAAK,EAAE;MAAa,CAAC,CAAC;IACzD;IACA,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;MAC1B,WAAW,CAAC,IAAI,CAAC;QAAC,IAAI,EAAE,WAAW;QAAE,KAAK,EAAE;MAAc,CAAC,CAAC;IAC9D;IACA,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;MAClB,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;QACvB,MAAM,CAAC,IAAI,CAAC;UAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;UAAE,GAAG,EAAE;QAAM,CAAC,CAAC;MAC5D;MACA,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE;QAC5B,WAAW,CAAC,IAAI,CAAC;UAAC,IAAI,EAAE;QAAO,CAAC,CAAC;MACnC;MACA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE;QAC9B,WAAW,CAAC,IAAI,CAAC;UAAC,IAAI,EAAE;QAAQ,CAAC,CAAC;MACpC;IACF;IAGA,IAAI,OAAO;IACX,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,QAAQ,EAAE;MACzC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO;IAC9B,CAAC,MAAM,IAAI,8CAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;MAC7C,OAAO,GAAG,0DAAmB,CAAC,uDAAc,EAAE,IAAI,EAAE,8CAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,gEAAgB,EACpG;QAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa;QAAE,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC;MAAiB,CAAC,CAAC,CAAC;IACrG,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;MAC7B,OAAO,GACL;QAAA,WAAE;UAAG,SAAS,EAAC,qBAAqB;UAAA,UAAC;QAAa,gBAAG,CAAC,KAAC;UAAG,SAAS,EAAC,MAAM;UAAA,UACxE,8DAAC,wDAAgB;YAAC,EAAE,EAAC,iBAAiB;YACpC,cAAc,EAAC,iBAAiB;YAAC,WAAW,EAAC;UAAsC,gBAAE;QAAC,gBAAG,CAAC;MAAA,eAC5F,CAAC;IACP;IAEA,MAAM,IAAI,GAAG,6DAAc,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,GAAG;MAAG,SAAS,EAAE,kCAAkC,IACnE,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAE;MAAA,UAAE,IAAI,CAAC;IAAI,gBAAI,CAAC,GAAG,IAAI;IAC9D,MAAM,UAAU,GAAG,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,GAAG,EAAE,CAAC;IAE3E,MAAM,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,KAC1C,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC,GAAG,QAAQ,CAAC;IAChF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,GAC5C,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,GAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,IAAM;IAC7E,OACE;MAAI,SAAS,EAAE,OAAQ;MAAC,OAAO,EAAE,IAAI,CAAC,WAAY;MAAA,WAChD;QAAK,SAAS,EAAC,YAAY;QAAA,WACzB,8DAAC,wDAAU;UACT,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAa;UAC7C,MAAM,EAAE,MAAO;UACf,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;UACxB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAK;UACvB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;QAAQ,gBAAE,CAAC,EAChC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG;UAAG,SAAS,EAAC,wBAAwB;UAAA,UAAC;QAAM,gBAAG,CAAC,GACnE,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,GAAI;UAAM,SAAS,EAAE;QAAO,gBAAE,CAAC,GAC7D,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,GAChD;UAAG,SAAS,EAAC,0BAA0B;UAAA,UAAC;QAAY,gBAAG,CAAC,GACtD,IAAI;MAAA,eACL,CAAC,EACN;QAAK,SAAS,EAAC,UAAU;QAAA,WACvB;UAAA,WAAK;YAAM,SAAS,EAAE,UAAW;YAAA,UAAE;UAAK,gBAAO,CAAC,EAC7C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG;YAAG,SAAS,EAAC,yBAAyB;YAAA,UAAC;UAAK,gBAAG,CAAC,GAAG,IAAI,EAC5E,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG;YAAG,SAAS,EAAC,yBAAyB;YAAA,UAAC;UAAQ,gBAAG,CAAC,GAAG,IAAI,EACjF,CAAC,IAAI,GAAG,8DAAC,2DAAa;YAAC,MAAM,EAAE;UAAY,gBAAE,CAAC,GAAG,IAAI,EACrD,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,8DAAC,yDAAW;YAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;UAAO,gBAAE,CAAC,GAAG,IAAI;QAAA,eACpE,CAAC,EACL,IAAI,CAAC,KAAK,CAAC,QAAQ,GAClB;UAAA,UAAM,8DAAC,2DAAa;YAAC,MAAM,EAAE;UAAO,gBAAE;QAAC,gBAAM,CAAC,GAC9C,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,GAAG;UAAK,SAAS,EAAC,iBAAiB;UAAA,WAAE,MAAM,EAAC;YAAA,UAAO;UAAO,gBAAO,CAAC;QAAA,eAAK,CAAC;MAAA,eAC9F,CAAC,EACL,IAAI,CAAC,KAAK,CAAC,eAAe,GACzB;QAAM,SAAS,EAAC,aAAa;QAAA,UAC3B;UAAG,IAAI,EAAC,GAAG;UAAC,OAAO,EAAE,IAAI,CAAC,kBAAmB;UAAA,UAC3C;YAAG,SAAS,EAAC,gBAAgB;YAAA,UAAC;UAAW,gBAAG;QAAC,gBAC5C;MAAC,gBACA,CAAC,GAAG,IAAI;IAAA,eACd,CAAC;EAET;AACF;AAAC;AAED,+DAAe,sDAAU,CAAC,OAAO,CAAC,E;;;;;;;;;;;;;;;;;;;;;AC5JR;AAC8B;AACpB;AAEI;AACyD;AAAA;AASjG,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC;AAC/B,SAAS,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE;EAAE,OAAO,SAAS,GAAG,GAAG,GAAG,GAAG;AAAE;AACrE,SAAS,YAAY,CAAC,SAAS,EAAE,GAAG,EAAE;EACpC,OAAO,4DAAY,CAAC;IAAC,IAAI,EAAE;EAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAC9D,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACrG;AAEA,MAAM,QAAQ,GAAG,0DAAc,CAAC;EAC9B,IAAI,EAAE;IACJ,EAAE,EAAE,gBAAgB;IACpB,cAAc,EAAE,MAAM;IACtB,WAAW,EAAE;EACf,CAAC;EACD,cAAc,EAAE;IACd,EAAE,EAAE,0BAA0B;IAC9B,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE;EACf,CAAC;EACD,aAAa,EAAE;IACb,EAAE,EAAE,kCAAkC;IACtC,cAAc,EAAE,eAAe;IAC/B,WAAW,EAAE;EACf,CAAC;EACD,MAAM,EAAE;IACN,EAAE,EAAE,kBAAkB;IACtB,cAAc,EAAE,QAAQ;IACxB,WAAW,EAAE;EACf,CAAC;EACD,cAAc,EAAE;IACd,EAAE,EAAE,0BAA0B;IAC9B,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE;EACf,CAAC;EACD,UAAU,EAAE;IACV,EAAE,EAAE,sBAAsB;IAC1B,cAAc,EAAE,OAAO;IACvB,WAAW,EAAE;EACf,CAAC;EACD,IAAI,EAAE;IACJ,EAAE,EAAE,gBAAgB;IACpB,cAAc,EAAE,MAAM;IACtB,WAAW,EAAE;EACf,CAAC;EACD,MAAM,EAAE;IACN,EAAE,EAAE,kBAAkB;IACtB,cAAc,EAAE,QAAQ;IACxB,WAAW,EAAE;EACf,CAAC;EACD,KAAK,EAAE;IACL,EAAE,EAAE,iBAAiB;IACrB,cAAc,EAAE,OAAO;IACvB,WAAW,EAAE;EACf,CAAC;EACD,OAAO,EAAE;IACP,EAAE,EAAE,mBAAmB;IACvB,cAAc,EAAE,SAAS;IACzB,WAAW,EAAE;EACf,CAAC;EACD,IAAI,EAAE;IACJ,EAAE,EAAE,gBAAgB;IACpB,cAAc,EAAE,MAAM;IACtB,WAAW,EAAE;EACf,CAAC;EACD,YAAY,EAAE;IACZ,EAAE,EAAE,wBAAwB;IAC5B,cAAc,EAAE,QAAQ;IACxB,WAAW,EAAE;EACf,CAAC;EACD,oBAAoB,EAAE;IACpB,EAAE,EAAE,sBAAsB;IAC1B,cAAc,EAAE,yEAAyE;IACzF,WAAW,EAAE;EACf,CAAC;EACD,uBAAuB,EAAE;IACvB,EAAE,EAAE,yBAAyB;IAC7B,cAAc,EAAE,iFAAiF;IACjG,WAAW,EAAE;EACf,CAAC;EACD,OAAO,EAAE;IACP,EAAE,EAAE,mBAAmB;IACvB,cAAc,EAAE,SAAS;IACzB,WAAW,EAAE;EACf,CAAC;EAED,KAAK,EAAE;IACL,EAAE,EAAE,iBAAiB;IACrB,cAAc,EAAE,OAAO;IACvB,WAAW,EAAE;EACf,CAAC;EACD,mBAAmB,EAAE;IACnB,EAAE,EAAE,qBAAqB;IACzB,cAAc,EAAE,mDAAmD;IACnE,WAAW,EAAE;EACf,CAAC;EACD,aAAa,EAAE;IACb,EAAE,EAAE,yBAAyB;IAC7B,cAAc,EAAE,QAAQ;IACxB,WAAW,EAAE;EACf,CAAC;EACD,OAAO,EAAE;IACP,EAAE,EAAE,yBAAyB;IAC7B,cAAc,EAAE,SAAS;IACzB,WAAW,EAAE;EACf,CAAC;EACD,SAAS,EAAE;IACT,EAAE,EAAE,yBAAyB;IAC7B,cAAc,EAAE,SAAS;IACzB,WAAW,EAAE;EACf,CAAC;EACD,gBAAgB,EAAE;IAChB,EAAE,EAAE,4BAA4B;IAChC,cAAc,EAAE,kBAAkB;IAClC,WAAW,EAAE;EACf,CAAC;EACD,sBAAsB,EAAE;IACtB,EAAE,EAAE,wBAAwB;IAC5B,cAAc,EAAE,mEAAmE;IACnF,WAAW,EAAE;EACf,CAAC;EACD,WAAW,EAAE;IACX,EAAE,EAAE,aAAa;IACjB,cAAc,EAAE,KAAK;IACrB,WAAW,EAAE;EACf,CAAC;EACD,aAAa,EAAE;IACb,EAAE,EAAE,eAAe;IACnB,cAAc,EAAE,OAAO;IACvB,WAAW,EAAE;EACf,CAAC;EACD,QAAQ,EAAE;IACR,EAAE,EAAE,UAAU;IACd,cAAc,EAAE,KAAK;IACrB,WAAW,EAAE;EACf,CAAC;EACD,UAAU,EAAE;IACV,EAAE,EAAE,YAAY;IAChB,cAAc,EAAE,OAAO;IACvB,WAAW,EAAE;EACf;AACF,CAAC,CAAC;AAEF,MAAM,WAAW,SAAS,wDAAe,CAAC;EACxC,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,OAAO,GAAG,sDAAe,CAAC,CAAC;IAEhC,MAAM;MAAC;IAAa,CAAC,GAAG,KAAK,CAAC,IAAI;IAElC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAG9C,IAAI,CAAC,SAAS,GAAG;MACf,YAAY,EAAE;QACZ,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnC,OAAO,EAAE;MACX,CAAC;MACD,gBAAgB,EAAE;QAChB,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC7C,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,OAAO,KAAK,CAAC,WAAW,CACtB,MAAM,CAAC,UAAU,IAAI,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,EAC3D,aAAa,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAC7C,CAAC,IAAI;YAAE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC;UAAE,CAAC,EACjE,IAAI,EACJ,IAAI,EACJ,IACF,CAAC;QACH;MACF,CAAC;MACD,qBAAqB,EAAE;QACrB,EAAE,EAAE,qBAAqB;QACzB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC5C,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,OAAO,KAAK,CAAC,WAAW,CACtB,MAAM,CAAC,UAAU,IAAI,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,EAC1D,aAAa,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAC9C,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC;UAAE,CAAC,EACvE,IAAI,EACJ,IAAI,EACJ,IACF,CAAC;QACH;MACF,CAAC;MACD,gBAAgB,EAAE;QAChB,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC;QAChE;MACF,CAAC;MACD,qBAAqB,EAAE;QACrB,EAAE,EAAE,qBAAqB;QACzB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC7C,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC;QAC/D;MACF,CAAC;MAED,wBAAwB,EAAE;QACxB,EAAE,EAAE,wBAAwB;QAC5B,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC;QAC/D;MACF,CAAC;MACD,sBAAsB,EAAE;QACtB,EAAE,EAAE,sBAAsB;QAC1B,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC;QACzC,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC;QAChD;MACF,CAAC;MACD,iBAAiB,EAAE;QACjB,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpC,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC;QAClD;MACF,CAAC;MACD,mBAAmB,EAAE;QACnB,EAAE,EAAE,mBAAmB;QACvB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtC,OAAO,EAAE,CAAC,IAAI,CAAC;MACjB,CAAC;MACD,gBAAgB,EAAE;QAChB,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,YAAY,CAAC;QACnD;MACF,CAAC;MACD,oBAAoB,EAAE;QACpB,EAAE,EAAE,oBAAoB;QACxB,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI;QAC/H,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,OAAO,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,GACjE,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC;QACtF;MACF,CAAC;MACD,kBAAkB,EAAE;QAClB,EAAE,EAAE,kBAAkB;QACtB,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC;QACpD;MACF,CAAC;MACD,kBAAkB,EAAE;QAClB,EAAE,EAAE,kBAAkB;QACtB,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,CAAC,IAAI,CAAC;MACjB,CAAC;MACD,gBAAgB,EAAE;QAChB,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnC,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC;QAC/C;MACF,CAAC;MACD,eAAe,EAAE;QACf,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC1C,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC;QACpD;MACF,CAAC;MACD,iBAAiB,EAAE;QACjB,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC5C,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC;QACrD;MACF,CAAC;MACD,cAAc,EAAE;QACd,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI;MACrD,CAAC;MACD,YAAY,EAAE;QACZ,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnC,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI;MACrD,CAAC;MACD,eAAe,EAAE;QACf,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtC,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK;MACtD,CAAC;MACD,aAAa,EAAE;QACb,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpC,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,OAAO,KAAK,CAAC,WAAW,CACtB,MAAM,CAAC,UAAU,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,EAClD,aAAa,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAC1C,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;YACzE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC;YAC3C,OAAO,IAAI;UACb,CAAC,CAAC,EACF,IAAI,EACJ,IAAI,EACJ,IACF,CAAC;QACH;MACF,CAAC;MACD,cAAc,EAAE;QACd,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC3C,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,OAAO,KAAK,CAAC,WAAW,CACtB,MAAM,CAAC,UAAU,IAAI,aAAa,CAAC,QAAQ,CAAC,YAAY,CAAC,EACzD,aAAa,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAC3C,CAAC,IAAI;YACJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;YAC1D,IAAI,CAAC,KAAK,EAAE;cACV,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,SAAS,CAAC;cACnD;YACF;YACA,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;cACvC,IAAI,YAAY,EAAE;gBAChB,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;cAClC;YACF,CAAC,CAAC;UACJ,CAAC,EACD,IAAI,EACJ,IAAI,EACJ,IACF,CAAC;QACH;MACF,CAAC;MACD,eAAe,EAAE;QACf,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtC,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;UAC1D,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,SAAS,CAAC;YACnD;UACF;UACA,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;YACtC,IAAI,YAAY,EAAE;cAChB,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;YAClC;UACF,CAAC,CAAC;QACJ;MACF,CAAC;MACD,eAAe,EAAE;QACf,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC;QACxC,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;UAC1D,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,SAAS,CAAC;YACnD;UACF;UACA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;YACvC,IAAI,YAAY,EAAE;cAChB,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;YAClC;UACF,CAAC,CAAC;QACJ;MACF,CAAC;MACD,WAAW,EAAE;QACX,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvC,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;UACzC,IAAI,CAAC,EAAE,EAAE;YACP,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC;YACpC;UACF;UACA,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;YACtD,IAAI,YAAY,EAAE;cAChB,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;YAClC;UACF,CAAC,CAAC;QACJ;MACF,CAAC;MACD,aAAa,EAAE;QACb,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC;QACzC,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;UACzC,IAAI,CAAC,EAAE,EAAE;YACP,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC;YACpC;UACF;UACA,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;YACvD,IAAI,YAAY,EAAE;cAChB,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;YAClC;UACF,CAAC,CAAC;QACJ;MACF,CAAC;MAED,aAAa,EAAE;QACb,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC/C,OAAO,EAAE;MACX,CAAC;MACD,eAAe,EAAE;QACf,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC5C,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK;UACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;UAC1D,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAC1B,OAAO,CAAC,IAAI,CAAC,4BAA4B,GAAG,MAAM,CAAC,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC;YAC1F;UACF;UACA,OAAO,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;YACrD,IAAI,YAAY,EAAE;cAChB,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;YAClC;UACF,CAAC,CAAC;QACJ;MACF,CAAC;MACD,aAAa,EAAE;QACb,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnC,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI;MACrD,CAAC;MACD,eAAe,EAAE;QACf,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI;MACrD,CAAC;MACD,cAAc,EAAE;QACd,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpC,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK;MACtD,CAAC;MACD,gBAAgB,EAAE;QAChB,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtC,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK;MACtD;IACF,CAAC;EACH;EAEA,iBAAiB,GAAG;IAClB,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC;IACnE,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC;EACjE;EAEA,oBAAoB,GAAG;IACrB,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC;IACtE,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC;EACpE;EAEA,eAAe,CAAC,CAAC,EAAE;IACjB,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;MAC3C;IACF;IACA,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,CAAC,CAAC,eAAe,CAAC,CAAC;IACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;EACnB;EAEA,eAAe,CAAC,CAAC,EAAE;IACjB,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE,EAAE;MACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnB;EACF;EAEA,WAAW,CAAC,CAAC,EAAE;IACb,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,CAAC,CAAC,eAAe,CAAC,CAAC;IACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjB,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;IACvD,IAAI,OAAO,IAAI,IAAI,QAAQ,EAAE;MAC3B,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC7B;IAEA,IAAI,CAAC,IAAI,EAAE;MACT,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;IACnE,CAAC,MAAM;MACL,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EACnD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IACtB;EACF;EAIA,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;IAC1D,IAAI,CAAC,KAAK,EAAE;MACV,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,SAAS,CAAC;MACnD;IACF;IAMA,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;MACxC;IACF;IAEA,MAAM,OAAO,GAAG,GAAG,GACjB,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,GAC1B,MAAM,CAAC,OAAO,GAAG,CAAC,GAChB,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAC5C,KAAK,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IAE7C,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI;MAC1B,IAAI,YAAY,EAAE;QAChB,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;MAClC;IACF,CAAC,CAAC;EACJ;EAGA,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE;IACpC,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,OAAO,IAAI,QAAQ,GAAG,MAAM,CAAC,OAAO,GAAG,8CAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;IACpG,OAAO,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MAC5D,IAAI,YAAY,EAAE;QAChB,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;MAClC;IACF,CAAC,CAAC;EACJ;EAEA,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE;IAChC,OAAO,gEAAgB,CAAC,CAAC;MAAC,KAAK,EAAE,MAAM,CAAC,SAAS;MAAE,GAAG,EAAE,MAAM,CAAC;IAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI;MAOnF,MAAM,UAAU,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;MAC9D,IAAI,UAAU,EAAE;QACd,IAAI,YAAY,EAAE;UAChB,YAAY,CAAC,UAAU,CAAC,MAAM,KAAK,WAAW,GAAG,qBAAqB,GAAG,MAAM,EAAE,KAAK,CAAC;QACzF;QACA;MACF;MACA,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC;MACrD,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC;MAG5B,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI;QACvD,IAAI,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC;MACtD,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MACd,IAAI,YAAY,EAAE;QAChB,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;MAClC;IACF,CAAC,CAAC;EACJ;EAEA,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE;IACnC,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC;IACrD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;IACrC,MAAM,MAAM,GAAG,UAAU,IAAI,8DAAc,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAG7F,MAAM,KAAK,GAAI,MAAM,IAAI,MAAM,KAAK,IAAI,GAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,WAAW,CAAC;IAC1J,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI;MAC9B,IAAI,CAAC,UAAU,EAAE;QAAE,IAAI,YAAY,EAAE,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC;QAAE;MAAQ;MAC7E,OAAO,MAAM,CAAC,UAAU,CAAC;IAC3B,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MACd,IAAI,YAAY,EAAE;QAChB,YAAY,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,EAAE,KAAK,CAAC;MAC9C;IACF,CAAC,CAAC;EACJ;EAMA,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE;IACrC,OAAO,6DAAa,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI;MAC3D,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC;IAC/D,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MACd,IAAI,YAAY,EAAE;QAChB,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;MAClC;IACF,CAAC,CAAC;EACJ;EAGA,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;IAE1D,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;MAC7C;IACF;IACA,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC;IAOtD,IAAI,MAAM,CAAC,IAAI,EAAE;MACf,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC;IACvD;IACA,OAAO,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MAC1C,IAAI,YAAY,EAAE;QAChB,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;MAClC;IACF,CAAC,CAAC;EACJ;EAGA,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;IAC1D,IAAI,CAAC,KAAK,EAAE;MACV;IACF;IACA,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAC9B,KAAK,CAAC,GAAG,IAAI,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;EACzE;EAGA,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;IAC1D,IAAI,CAAC,KAAK,EAAE;MACV,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,SAAS,CAAC;MACjD;IACF;IAEA,IAAI,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;IAChD,IAAI,YAAY,EAAE;MAChB,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAChE;IACA,OAAO,MAAM;EACf;EAEA,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE;IACnC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC;EAC9F;EAEA,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE;IAChC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC;EAChF;EAEA,MAAM,GAAG;IACP,MAAM,IAAI,GAAG,EAAE;IACf,IAAI,KAAK,GAAG,CAAC;IACb,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI;MAC/B,IAAI,OAAO,IAAI,IAAI,QAAQ,EAAE;QAC3B,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;MAC7B;MACA,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,UAAU,GAAG,SAAS;QACxD,IAAI,CAAC,IAAI,CACP,IAAI,CAAC,KAAK,IAAI,GAAG,GACf;UAAI,SAAS,EAAC;QAAW,GAAM,KAAK,OAAG,CAAC,GAExC;UAAI,SAAS,EAAE,SAAU;UAAC,OAAO,EAAE,IAAI,CAAC,WAAY;UAAC,WAAS,KAAM;UAAA,UAAc,IAAI,CAAC;QAAK,GAAlB,KAAK,OAAkB,CACrG,CAAC;MACH;MACA,KAAK,EAAE;IACT,CAAC,CAAC;IAGF,MAAM,KAAK,GAAG,EAAE,GAAG,gDAAQ;IAC3B,MAAM,KAAK,GAAG,gDAAQ,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;IAClD,MAAM,IAAI,GAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,GAC/D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,GACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAK;IACnD,MAAM,GAAG,GAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,GAC/D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,GACpD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAI;IAElD,MAAM,QAAQ,GAAG;MACf,IAAI,EAAE,IAAI,GAAG,IAAI;MACjB,GAAG,EAAE,GAAG,GAAG;IACb,CAAC;IAED,OACE;MAAI,SAAS,EAAC,MAAM;MAAC,KAAK,EAAE,QAAS;MAAC,GAAG,EAAE,IAAI,CAAC,OAAQ;MAAA,UACrD;IAAI,gBACH,CAAC;EAET;AACF;AAEA,+DAAe,sDAAU,CAAC,WAAW,CAAC,E;;;;;;;;;;;;;;;;;;AC3rBZ;AAAA;AAE1B,MAAM,gBAAgB,GAAG,CAAC;AAEX,MAAM,OAAO,SAAS,wDAAe,CAAC;EACnD,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG;MAEX,IAAI,EAAE,CAAC;MACP,IAAI,EAAE,CAAC;MAEP,OAAO,EAAE,CAAC;MACV,OAAO,EAAE,CAAC;MAEV,IAAI,EAAE,CAAC;MAEP,OAAO,EAAE,KAAK;MACd,OAAO,EAAE;IACX,CAAC;IAID,IAAI,CAAC,OAAO,GAAG,sDAAe,CAAC,CAAC;IAEhC,IAAI,CAAC,MAAM,GAAG,sDAAe,CAAC,CAAC;IAE/B,IAAI,CAAC,OAAO,GAAG,sDAAe,CAAC,CAAC;IAEhC,IAAI,CAAC,WAAW,GAAG,sDAAe,CAAC,CAAC;IAGpC,IAAI,CAAC,UAAU,GAAG,CAAC;IACnB,IAAI,CAAC,WAAW,GAAG,CAAC;IAGpB,IAAI,CAAC,MAAM,GAAG,CAAC;IACf,IAAI,CAAC,MAAM,GAAG,CAAC;IAEf,IAAI,CAAC,YAAY,GAAG,CAAC;IAGrB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;IACpB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IAElB,IAAI,CAAC,OAAO,GAAG,CAAC;IAChB,IAAI,CAAC,OAAO,GAAG,CAAC;IAEhB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IACpC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;IACtC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;EAC5C;EAEA,iBAAiB,GAAG;IAClB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE;MAAE,OAAO,EAAE;IAAK,CAAC,CAAC;IACrF,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE;MAAE,OAAO,EAAE;IAAK,CAAC,CAAC;IAGtF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEhE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC;IACtC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;IAGvC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;EAC/D;EAEA,oBAAoB,GAAG;IACrB,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;MACxB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC;MACrE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC;IACxE;EACF;EAGA,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IAE5B,IAAI,CAAC,QAAQ,CAAC;MACZ,IAAI,EAAE,IAAI;MACV,IAAI,EAAE,IAAI;MACV,IAAI,EAAE,IAAI;MACV,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI;MAC5B,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG;IAC1B,CAAC,CAAC;IAGF,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO;IACxD,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO;IACvD,IAAI,CAAC,KAAK,CAAC,QAAQ,CACjB,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,EACzD,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,IAAI,EACtD,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,IAAI,EAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,EAC7B,IAAI,CAAC;EACT;EAGA,OAAO,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;IAC7C,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAClF,IAAI,QAAQ,IAAI,CAAC,EAAE;MAEjB,OAAO,IAAI,KAAK;IAClB,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE;MAEzE,OAAO,IAAI,KAAK;IAClB;IACA,OAAO,OAAO;EAChB;EAEA,WAAW,GAAG;IAEZ,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAE5D,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK;IAC/B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM;IAGjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACxG,IAAI,CAAC,QAAQ,CAAC;MACZ,OAAO,EAAE,OAAO;MAChB,OAAO,EAAE,OAAO,GAAG;IACrB,CAAC,CAAC;IAGF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAEjG,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,GACpD,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,GAClD,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC;IAE/C,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;EACpC;EAEA,MAAM,CAAC,CAAC,EAAE;IACR,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;EACjC;EAEA,UAAU,CAAC,IAAI,EAAE;IACf,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;IAC1B,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;IAK1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,IAAI;IAC3D,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,IAAI;IAC1D,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI;IAGlD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;IACxD,MAAM,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG;IACrD,MAAM,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;IAE/C,IAAI,MAAM,GAAG,OAAO,EAAE;MACpB,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,IAAI;IACnC,CAAC,MAAM,IAAI,OAAO,GAAG,QAAQ,EAAE;MAC7B,IAAI,IAAI,CAAC,OAAO,GAAG,QAAQ,IAAI,IAAI;IACrC;IAEA,IAAI,KAAK,GAAG,MAAM,EAAE;MAClB,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,IAAI;IACjC,CAAC,MAAM,IAAI,QAAQ,GAAG,SAAS,EAAE;MAC/B,IAAI,IAAI,CAAC,QAAQ,GAAG,SAAS,IAAG,IAAI;IACtC;IAEA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;EACpC;EAEA,SAAS,CAAC,CAAC,EAAE;IACX,IAAI,CAAC,CAAC,OAAO,EAAE;MACb,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK;MAChC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK;IAClC,CAAC,MAAM;MACL,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK;MACrB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK;IACvB;IAEA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE;MAAE,OAAO,EAAE;IAAM,CAAC,CAAC;IACxE,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE;MAAE,OAAO,EAAE;IAAM,CAAC,CAAC;IACzE,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE;MAAE,OAAO,EAAE;IAAK,CAAC,CAAC;IACnE,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE;MAAE,OAAO,EAAE;IAAK,CAAC,CAAC;IAEpE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,MAAM;EAC5C;EAGA,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE;IACtB,MAAM,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI;IAClD,MAAM,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI;IAElD,IAAI,CAAC,MAAM,GAAG,KAAK;IACnB,IAAI,CAAC,MAAM,GAAG,KAAK;IAGnB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAG5D,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAC5E,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,EAC5E,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;IAEpD,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;EAC/C;EAGA,SAAS,CAAC,CAAC,EAAE;IACX,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;EAClC;EAEA,UAAU,CAAC,CAAC,EAAE;IACZ,CAAC,CAAC,cAAc,CAAC,CAAC;IAElB,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE;MACzB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;MACtD;IACF;IAGA,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO;IAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GACtF,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEhE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;MACpB,IAAI,CAAC,YAAY,GAAG,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;IAClD;IAEA,IAAI,KAAK,GAAI,QAAQ,GAAG,IAAI,CAAC,YAAa;IAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;EACxE;EAEA,OAAO,CAAC,CAAC,EAAE;IACT,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC;IACvD,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC;IACxD,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;IACnD,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC;IAEpD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE;IAEtC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;EACrE;EAEA,MAAM,GAAG;IAEP,MAAM,GAAG,GAAG,eAAe,IAAI,CAAC,KAAK,CAAC,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,gBAAgB,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG;IAElG,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI;IAI9D,MAAM,OAAO,GAAG;MACd,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI;MAC/D,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI;MAChE,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI;MAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;IAC/C,CAAC;IACD,OACE;MAAK,SAAS,EAAC,SAAS;MAAA,WACtB;QAAK,SAAS,EAAC,cAAc;QAAC,GAAG,EAAE,IAAI,CAAC,WAAY;QAAA,WAClD;UAAK,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;UAAC,SAAS,EAAC,SAAS;UAAC,GAAG,EAAC,EAAE;UACrD,KAAK,EAAE;YAAC,SAAS,EAAE,GAAG;YAAE,eAAe,EAAE;UAAI,CAAE;UAAC,GAAG,EAAE,IAAI,CAAC,OAAQ;UAAC,MAAM,EAAE,IAAI,CAAC;QAAY,gBAAE,CAAC,EACjG;UAAK,SAAS,EAAC,eAAe;UAAC,GAAG,EAAE,IAAI,CAAC;QAAO,gBAAE,CAAC,EACnD;UAAK,SAAS,EAAC,SAAS;UAAC,KAAK,EAAE,OAAQ;UAAC,GAAG,EAAE,IAAI,CAAC;QAAQ,gBAAE,CAAC;MAAA,eAC3D,CAAC,EACN;QAAK,SAAS,EAAC,cAAc;QAAA,UAC3B;UAAO,IAAI,EAAC,OAAO;UAAC,SAAS,EAAC,QAAQ;UACpC,IAAI,EAAC,OAAO;UAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;UAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;UAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAK;UAAC,QAAQ,EAAE,IAAI,CAAC;QAAO,gBAAE;MAAC,gBAC/G,CAAC;IAAA,eACH,CAAC;EAEV;AACF,C;;;;;;;;;;;;;;;;;;;AC5R0B;AAEiB;AAAA;AAE5B,MAAM,UAAU,SAAS,4DAAmB,CAAC;EAC1D,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG;MACX,IAAI,EAAE;IACR,CAAC;IAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;EAClC;EAEA,kBAAkB,CAAC,SAAS,EAAE;IAC5B,IAAI,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;MACxC,IAAI,CAAC,QAAQ,CAAC;QACZ,IAAI,EAAE,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC;MACtB,CAAC,CAAC;IACJ;EACF;EAEA,IAAI,GAAG;IACL,IAAI,CAAC,QAAQ,CAAC;MAAC,IAAI,EAAE;IAAK,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;MAC3B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC3B;EACF;EAEA,MAAM,GAAG;IACP,MAAM,KAAK,GAAG;MAAC,GAAG,EAAE,OAAO;MAAE,IAAI,EAAE,SAAS;MAAE,IAAI,EAAE;IAAM,CAAC;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;IAC3C,MAAM,SAAS,GAAG,WAAW,GAAG,KAAK;IACrC,OACE;MAAK,SAAS,EAAE,SAAU;MAAA,WACxB;QAAK,SAAS,EAAC,MAAM;QAAA,UAAC;UAAG,SAAS,EAAC,gBAAgB;UAAA,UAAE;QAAK,gBAAI;MAAC,gBAAK,CAAC,EACrE;QAAA,WACG,IAAI,CAAC,KAAK,CAAC,IAAI,EACf,IAAI,CAAC,KAAK,CAAC,MAAM,GAChB;UAAA,WAAE,OACW;YAAG,IAAI,EAAC,GAAG;YACpB,KAAK,EAAE;cAAE,UAAU,EAAE;YAAS,CAAE;YAChC,OAAO,EAAG,CAAC,IAAK;cAAC,CAAC,CAAC,cAAc,CAAC,CAAC;cAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAAC,CAAE;YAAA,UAC1D,IAAI,CAAC,KAAK,CAAC;UAAU,gBACrB,CAAC;QAAA,eACJ,CAAC,GACH,IAAI;MAAA,eACF,CAAC,EACP;QAAK,SAAS,EAAC,QAAQ;QAAA,UAAC,8DAAC,wDAAU;UAAC,QAAQ,EAAE,IAAI,CAAC;QAAK,gBAAE;MAAC,gBAAK,CAAC;IAAA,eAC9D,CAAC;EAEV;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;ACpDyB;AACoB;AAAA;AAE/B,MAAM,YAAY,SAAS,4DAAmB,CAAC;EAC5D,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC,UAAU;MAAA,WACvB;QAAA,UAAK;UAAM,KAAK,EAAE;YAAC,KAAK,EAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,GAAI;UAAG;QAAE,gBAAO;MAAC,gBAAK,CAAC,EAC1E,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,GAC1B;QAAG,IAAI,EAAC,GAAG;QAAC,OAAO,EAAG,CAAC,IAAK;UAAC,CAAC,CAAC,cAAc,CAAC,CAAC;UAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAE;QAAA,WACvE;UAAG,SAAS,EAAC,gBAAgB;UAAA,UAAC;QAAK,gBAAG,CAAC,KAAC,gEAAC,wDAAgB;UAAC,EAAE,EAAC,eAAe;UAC1E,cAAc,EAAC,QAAQ;UAAC,WAAW,EAAC;QAAyB,gBAAE,CAAC;MAAA,eACjE,CAAC,GAEJ,8DAAC,wDAAgB;QAAC,EAAE,EAAC,kBAAkB;QAAC,cAAc,EAAC,cAAc;QACnE,WAAW,EAAC;MAAuC,gBAAE,CAAC;IAAA,eAEvD,CAAC;EAEV;AACF,C;;;;;;;;;;;;;;;;;;;;;;;;ACpB0B;AACoB;AAEV;AAES;AACM;AAAA;AAEpC,MAAM,aAAa,SAAS,wDAAe,CAAC;EACzD,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG;MACX,KAAK,EAAE;IACT,CAAC;IAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAE9C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;EACpE;EAEA,iBAAiB,GAAG;IAClB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;EACzB;EAEA,eAAe,CAAC,CAAC,EAAE;IACjB,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE,EAAE;MAEpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;IACxB;EACF;EAEA,WAAW,CAAC,CAAC,EAAE;IACb,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;EACxB;EAEA,oBAAoB,CAAC,KAAK,EAAE;IAC1B,IAAI,CAAC,QAAQ,CAAC;MAAE,KAAK,EAAE,8CAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG;IAAM,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC;EACpC;EAEA,qBAAqB,CAAC,GAAG,EAAE;IACzB,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;EACvB;EAEA,MAAM,GAAG;IACP,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ;IAExF,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAE,CAAC,IAAK;MAChC,OAAQ,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrF,CAAC,CAAC;IAEF,OACE;MAAK,SAAS,EAAC,iBAAiB;MAAA,UAC9B;QAAK,SAAS,EAAC,gBAAgB;QAAA,WAC7B;UAAK,SAAS,EAAC,oBAAoB;UAAA,WACjC;YAAA,UAAK,8DAAC,wDAAgB;cAAC,EAAE,EAAC,YAAY;cAAC,cAAc,EAAC,YAAY;cAChE,UAAU,EAAC;YAAgE,gBAAE;UAAC,gBAAK,CAAC,EACtF;YAAA,UAAK;cAAG,IAAI,EAAC,GAAG;cAAC,OAAO,EAAE,IAAI,CAAC,WAAY;cAAA,UAAC;gBAAG,SAAS,EAAC,gBAAgB;gBAAA,UAAC;cAAK,gBAAG;YAAC,gBAAG;UAAC,gBAAK,CAAC;QAAA,eAC1F,CAAC,EACN,8DAAC,wDAAgB;UAAC,EAAE,EAAC,+BAA+B;UAAC,cAAc,EAAC,iBAAiB;UACnF,WAAW,EAAC,kDAAkD;UAAA,UAC7D,kBAAkB,IAAK,8DAAC,4DAAc;YACrC,WAAW,EAAE,kBAAmB;YAChC,gBAAgB,EAAE,IAAI,CAAC;UAAqB,gBAAE;QAAC,gBAChC,CAAC,EACpB,8DAAC,wDAAgB;UAAC,EAAE,EAAC,mBAAmB;UAAC,cAAc,EAAC,4BAA4B;UAChF,WAAW,EAAC,6DAA6D;UAAA,UAC1E,qBAAqB,IAAK,8DAAC,yDAAW;YACrC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;YAC1B,QAAQ,EAAE,QAAS;YACnB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;YAC9B,gBAAgB,EAAE,qBAAsB;YACxC,UAAU,EAAE,KAAM;YAClB,UAAU,EAAE,KAAM;YAClB,eAAe,EAAE,KAAM;YACvB,eAAe,EAAE,IAAI,CAAC;UAAsB,gBAAE;QAAC,gBAChC,CAAC;MAAA,eACjB;IAAC,gBACH,CAAC;EAEV;AACF,C;;;;;;;;;;;;;;;;;;;ACvF0B;AAEiB;AAAA;AAI5B,MAAM,YAAY,SAAS,4DAAmB,CAAC;EAC5D,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG;MACX,QAAQ,EAAE,KAAK,CAAC,aAAa;MAC7B,OAAO,EAAE;IACX,CAAC;IAED,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;EACpD;EAEA,oBAAoB,CAAC,CAAC,EAAE;IACtB,IAAI,CAAC,QAAQ,CAAC;MAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK;MAAE,OAAO,EAAE;IAAI,CAAC,CAAC;EAC1D;EAEA,qBAAqB,GAAG;IACtB,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;MACtB,IAAI,CAAC,QAAQ,CAAC;QAAC,OAAO,EAAE;MAAK,CAAC,CAAC;MAC/B,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D;EACF;EAEA,aAAa,CAAC,CAAC,EAAE;IACf,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,EAAE;MACpB,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC9B;EACF;EAEA,MAAM,GAAG;IACP,MAAM,WAAW,GAAG,EAAE;IACtB,KAAK,IAAI,GAAG,IAAI,mDAAW,EAAE;MAC3B,IAAI,IAAI,GAAG,mDAAW,CAAC,GAAG,CAAC;MAC3B,WAAW,CAAC,IAAI,CACd;QAAmB,KAAK,EAAE;MAAK,GAAlB,IAAI,OAAgB,CACnC,CAAC;IACH;IACA,OACE;MAAK,SAAS,EAAC,gBAAgB;MAAA,WAC7B;QAAO,IAAI,EAAC,QAAQ;QAAC,EAAE,EAAC,WAAW;QAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAAC,IAAI,EAAC,aAAa;QACtF,SAAS,EAAC,QAAQ;QAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAAC,QAAQ,EAAE,IAAI,CAAC,oBAAqB;QACnF,MAAM,EAAE,IAAI,CAAC,qBAAsB;QACnC,SAAS,EAAE,IAAI,CAAC,aAAc;QAAC,QAAQ;MAAA,gBAAE,CAAC,EAC5C;QAAU,EAAE,EAAC,aAAa;QAAA,UACvB;MAAW,gBACJ,CAAC;IAAA,eACR,CAAC;EAEV;AACF,C;;;;;;;;;;;;;;;;;;;ACxD0B;AAE2B;AAAA;AAEtC,MAAM,WAAW,SAAS,wDAAe,CAAC;EACvD,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,OAAO,GAAG,sDAAe,CAAC,CAAC;IAEhC,IAAI,CAAC,KAAK,GAAG;MACX,MAAM,EAAE,KAAK,CAAC,MAAM;MACpB,YAAY,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;MAC/B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;MACxB,KAAK,EAAE;IACT,CAAC;IAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;EACtE;EAEA,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE;IAGvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;IACvC,IAAI,SAAS,CAAC,YAAY,IAAI,QAAQ,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;MAC3D,IAAI,CAAC,QAAQ,CAAC;QACZ,YAAY,EAAE,QAAQ;QACtB,KAAK,EAAE;MACT,CAAC,CAAC;IACJ;EACF;EAEA,eAAe,CAAC,CAAC,EAAE;IACjB,IAAI,CAAC,QAAQ,CAAC;MAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI;IAAE,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;MACxB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAClD,IAAI,CAAC,KAAK,IAAI;QACb,IAAI,CAAC,QAAQ,CAAC;UAAC,KAAK,EAAE;QAAK,CAAC,CAAC;MAC/B,CAAC,CAAC,CACD,KAAK,CAAC,GAAG,IAAI;QAEZ,IAAI,GAAG,EAAE;UACP,IAAI,CAAC,QAAQ,CAAC;YAAC,KAAK,EAAE;UAAK,CAAC,CAAC;QAC/B;MACF,CAAC,CAAC;IACN;EACF;EAEA,aAAa,CAAC,CAAC,EAAE;IACf,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE,EAAE;MAEpB,IAAI,CAAC,QAAQ,CAAC;QAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,MAAM,EAAE;MAAK,CAAC,CAAC;IACzD,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE,EAAE;MAE3B,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC/B;EACF;EAEC,kBAAkB,GAAG;IACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;MACxB,IAAI,CAAC,QAAQ,CAAC;QAAC,MAAM,EAAE;MAAI,CAAC,EAAE,CAAC,IAAI;QACjC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;UACxB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B;MACF,CAAC,CAAC;IACJ;EACF;EAEA,qBAAqB,CAAC,KAAK,EAAE;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;MAEpE,IAAI,CAAC,QAAQ,CAAC;QAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,MAAM,EAAE;MAAK,CAAC,CAAC;MACvD;IACF;IACA,IAAI,CAAC,QAAQ,CAAC;MAAC,MAAM,EAAE;IAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAM,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,KAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;MACnF,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;IAC9B;EACF;EAEA,sBAAsB,CAAC,KAAK,EAAE;IAC5B,IAAI,CAAC,QAAQ,CAAC;MAAC,MAAM,EAAE;IAAK,CAAC,CAAC;IAC9B,IAAI,KAAK,IAAK,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,KAAM,EAAE;MACzC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;IAC9B;EACF;EAEA,MAAM,GAAG;IACP,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;MACtB,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;MAC5E,IAAI,SAAS,GAAG,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,WAAW,GAAG,EAAE,CAAC;MAC1E,IAAI,CAAC,QAAQ,EAAE;QACb,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW;QACjC,SAAS,IAAI,cAAc;MAC7B;MACA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,EAAE;QACtD,SAAS,IAAI,QAAQ;MACvB;MAEA,OAAQ;QAAM,SAAS,EAAE,SAAU;QAAC,OAAO,EAAE,IAAI,CAAC,kBAAmB;QAAA,WAClE,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI;UAAG,SAAS,EAAC,2BAA2B;UAAA,UAAE,IAAI,CAAC,KAAK,CAAC;QAAQ,gBAAI,CAAC,EAC1F;UAAA,UAAO;QAAQ,gBAAO,CAAC,EACtB,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI;UAAG,SAAS,EAAC,2BAA2B;UAAA,UAAE,IAAI,CAAC,KAAK,CAAC;QAAS,gBAAI,CAAC;MAAA,eACxF,CAAC;IACT;IAEA,IAAI,OAAO;IACX,MAAM,IAAI,GAAG,CAAC,CAAC;IACf,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,UAAU,EAAE;MACjC,OAAO,GAAG,6DAAe;MACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,sBAAsB;IAC/C,CAAC,MAAM;MACL,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE;QAC5B,OAAO,GAAG,UAAU;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS;QAChC,IAAI,CAAC,SAAS,GAAG,eAAe;MAClC,CAAC,MAAM;QACL,OAAO,GAAG,OAAO;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM;QACrC,IAAI,CAAC,SAAS,GAAG,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,iBAAiB,GACvE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAI,kBAAkB,GAAG,EAAE,CAAC;QACpD,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;UACxB,IAAI,CAAC,SAAS,GAAC,IAAI,CAAC,KAAK,CAAC,SAAS;QACrC;MACF;MACA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;MAC7B,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,UAAU;MACpD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO;MACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe;MACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa;MACnC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,qBAAqB;IAC1C;IACA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW;IACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,GAAG,EAAE;IACrD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY;IAC3C,IAAI,CAAC,SAAS,GAAG,IAAI;IACrB,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE;MACvC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,GAAG,OAAO;IAC5D;IAEA,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;MAC/C,OACE;QAAA,WACG,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI;UAAG,SAAS,EAAC,2BAA2B;UAAA,UAAE,IAAI,CAAC,KAAK,CAAC;QAAQ,gBAAI,CAAC,EACzF,0DAAmB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EACxC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI;UAAG,SAAS,EAAC,2BAA2B;UAAA,UAAE,IAAI,CAAC,KAAK,CAAC;QAAS,gBAAI,CAAC;MAAA,eAC5F,CAAC;IAEP;IACA,OAAO,0DAAmB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;EACjD;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;AC1JyB;AAEyB;AAAA;AAEpC,MAAM,WAAW,SAAS,4DAAmB,CAAC;EAC3D,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,QAAQ,GAAG,sDAAe,CAAC,CAAC;IAEjC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;EAChD;EAEA,WAAW,CAAC,CAAC,EAAE;IACb,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;MAEtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACvB;EACF;EAEA,MAAM,GAAG;IACP,MAAM,QAAQ,GAAG,gEAAa,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAClE,MAAM,SAAS,GAAG,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,kBAAkB,GAAG,EAAE,CAAC;IACjF,OACE;MAAK,SAAS,EAAE,SAAU;MAAA,WACvB,0DAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,EACvC;QAAK,SAAS,EAAC,cAAc;QAAA,UAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,GACjB;UAAG,SAAS,EAAC,4BAA4B;UAAA,UAAC;QAAU,gBAAG,CAAC,GAExD;UAAK,GAAG,EAAC,sBAAsB;UAAC,KAAK,EAAE;YAAC,MAAM,EAAE;UAAc,CAAE;UAAC,KAAK,EAAC,IAAI;UAAC,MAAM,EAAC;QAAI,gBAAE;MAAC,gBACvF,CAAC,EACL,QAAQ,GAAG;QAAK,SAAS,EAAC,UAAU;QAAA,UAAE;MAAQ,gBAAM,CAAC,GAAG,IAAI;IAAA,eAC1D,CAAC;EAEV;AACF;AAAC,C;;;;;;;;;;;;;;;;;ACtCyB;AAEX,MAAM,SAAS,SAAS,4DAAmB,CAAC;EACzD,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG;MACX,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,kBAAkB,GAAG,kBAAkB;MACjE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QAAC,OAAO,EAAE;MAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;MACxD,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;MAC/B,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG;MACnB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;EACH;EAEA,iBAAiB,GAAG;IAElB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAChB,OAAO,CACP,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC;MAAC,GAAG,EAAE,IAAI,CAAC,GAAG;MAAE,KAAK,EAAE;QAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,EAAE;MAAC;IAAC,CAAC,CAAC,CAAC,CACtF,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;MAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,sBAAsB,GAAG;IAAsB,CAAC,CAAC,CAAC;EAC3G;EAEA,oBAAoB,GAAG;IACrB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;EAC9B;EAEA,kBAAkB,CAAC,SAAS,EAAE;IAC5B,IAAI,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;MAC7C,IAAI,CAAC,QAAQ,CAAC;QAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,kBAAkB,GAAG,kBAAkB;QAAE,KAAK,EAAE;UAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;UAAE,OAAO,EAAE;QAAK;MAAC,CAAC,CAAC;MAChI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAChB,OAAO,CACP,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC;QAAC,GAAG,EAAE,IAAI,CAAC,GAAG;QAAE,KAAK,EAAE;UAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;UAAE,OAAO,EAAE;QAAC;MAAC,CAAC,CAAC,CAAC,CACtF,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;QAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,sBAAsB,GAAG;MAAsB,CAAC,CAAC,CAAC;IAC3G;EACF;EAEA,MAAM,GAAG;IACP,OAAO,0DAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;EAC/C;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;;;;ACzCyB;AAEU;AAEiB;AACA;AAEN;AAAA;AAEhC,MAAM,UAAU,SAAS,4DAAmB,CAAC;EAC1D,MAAM,GAAG;IACP,IAAI,MAAM;IACV,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE;MAC9B,IAAI,8CAAM,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QAC5C,MAAM,GAAG;UAAK,SAAS,EAAC,aAAa;UAAC,GAAG,EAAC,QAAQ;UAAC,GAAG,EAAE,uDAAe;QAAC,gBAAE,CAAC;MAC7E,CAAC,MAAM;QACL,MAAM,OAAO,GAAG,8CAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACzD,MAAM,SAAS,GAAG,iEAAc,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC;QAE3D,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE;UACnE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;UAChD,MAAM,SAAS,GAAG,aAAa,GAAG,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,GAAG,EAAE,CAAC;UACrF,MAAM,GAAI;YAAK,SAAS,EAAE,SAAU;YAAA,UAAC;cAAA,UAAM;YAAM,gBAAM;UAAC,gBAAK,CAAE;QACjE,CAAC,MAAM;UACL,MAAM,SAAS,GAAG,iBAAiB,GAAG,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,GAAG,EAAE,CAAC;UACzF,MAAM,GAAG,OAAO,GAAG;YAAG,SAAS,EAAE,SAAU;YAAA,UAAC;UAAK,gBAAG,CAAC,GAAG;YAAG,SAAS,EAAE,SAAU;YAAA,UAAC;UAAM,gBAAG,CAAC;QAC7F;MACF;IACF,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;MAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,iEAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;MAEnF,MAAM,SAAS,GAAG,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,GAAG,EAAE,CAAC;MACnE,MAAM,GAAG;QAAK,SAAS,EAAE,SAAU;QAAC,GAAG,EAAC,QAAQ;QAAC,GAAG,EAAE,GAAI;QACxD,OAAO,EAAE,CAAC,IAAE;UAAC,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI;UAAE,CAAC,CAAC,MAAM,CAAC,GAAG,GAAC,sBAAsB;QAAA;MAAE,gBAAE,CAAC;IAClF,CAAC,MAAM;MACL,MAAM,GAAG,IAAI;IACf;IACA,OAAO,MAAM;EACf;AACF,C;;;;;;;;;;;;;;;;;;ACvC0B;AAAA;AAEX,MAAM,WAAW,SAAS,4DAAmB,CAAC;EAC3D,MAAM,GAAG;IACP,MAAM,SAAS,GAAG,kBAAkB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,GAAG,EAAE,CAAC,IACpE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,WAAW,GAAG,EAAE,CAAC;IACjF,OAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,GACrB;MAAK,SAAS,EAAE,SAAU;MAAA,UAAC;QAAK,SAAS,EAAC;MAAgB,gBAAM;IAAC,gBAAK,CAAC,GAAG,IAAI;EAClF;AACF,C;;;;;;;;;;;;;;;;;;ACR0B;AAAA;AAEX,MAAM,UAAU,SAAS,4DAAmB,CAAC;EAC1D,MAAM,GAAG;IACP,OACE;MAAG,IAAI,EAAC,GAAG;MAAC,OAAO,EAAG,CAAC,IAAK;QAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;MAAC,CAAE;MAAA,UACvE;QAAG,SAAS,EAAC,gBAAgB;QAAA,UAAC;MAAK,gBAAG;IAAC,gBACtC,CAAC;EAER;AACF,C;;;;;;;;;;;;;;;;;;ACX0B;AAAA;AAEX,MAAM,YAAY,SAAS,4DAAmB,CAAC;EAC5D,MAAM,GAAG;IACP,OACE;MAAA,WACE;QAAG,IAAI,EAAC,GAAG;QAAC,OAAO,EAAG,CAAC,IAAK;UAAC,CAAC,CAAC,cAAc,CAAC,CAAC;UAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAAC,CAAE;QAAA,UAAC;UAAG,SAAS,EAAC,gBAAgB;UAAA,UAAC;QAAI,gBAAG;MAAC,gBAAG,CAAC,QAEtH;QAAG,IAAI,EAAC,GAAG;QAAC,OAAO,EAAG,CAAC,IAAK;UAAC,CAAC,CAAC,cAAc,CAAC,CAAC;UAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAAC,CAAE;QAAA,UAAC;UAAG,SAAS,EAAC,gBAAgB;UAAA,UAAC;QAAQ,gBAAG;MAAC,gBAAG,CAAC;IAAA,eACvH,CAAC;EAEV;AACF;AAAC,C;;;;;;;;;;;;;;;;;;ACZyB;AAAA;AAEX,MAAM,SAAS,SAAS,4DAAmB,CAAC;EACzD,MAAM,GAAG;IACP,OACI;MAAA,WACE;QAAG,IAAI,EAAC,GAAG;QAAC,OAAO,EAAG,CAAC,IAAK;UAAC,CAAC,CAAC,cAAc,CAAC,CAAC;UAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAE;QAAA,UAAC;UAAG,SAAS,EAAC,gBAAgB;UAAA,UAAC;QAAU,gBAAG;MAAC,gBAAG,CAAC,QAE1H;QAAG,IAAI,EAAC,GAAG;QAAC,OAAO,EAAG,CAAC,IAAK;UAAC,CAAC,CAAC,cAAc,CAAC,CAAC;UAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAAC,CAAE;QAAA,UAAC;UAAG,SAAS,EAAC,gBAAgB;UAAA,UAAC;QAAQ,gBAAG;MAAC,gBAAG,CAAC;IAAA,eACvH,CAAC;EAEZ;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;ACZ6B;AACJ;AACgD;AAElC;AAAA;AAExC,MAAM,QAAQ,GAAG,0DAAc,CAAC;EAC9B,UAAU,EAAE;IACV,EAAE,EAAE,kBAAkB;IACtB,cAAc,EAAE,YAAY;IAC5B,WAAW,EAAE;EACf;AACF,CAAC,CAAC;AAEF,MAAM,YAAY,SAAS,4DAAmB,CAAC;EAC7C,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,SAAS,GAAG,sDAAe,CAAC,CAAC;IAElC,IAAI,CAAC,KAAK,GAAG;MACX,OAAO,EAAE;IACX,CAAC;IAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;EAClD;EAEA,iBAAiB,GAAG;IAClB,IAAI,iDAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;MACjC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;MACtB,KAAK,EAAE,gDAAW;MAClB,MAAM,EAAE,gDAAW;IACrB,CAAC,CAAC;EACJ;EAEA,YAAY,CAAC,CAAC,EAAE;IACd,IAAI,CAAC,QAAQ,CAAC;MAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;IAAK,CAAC,CAAC;EAC1C;EAEA,cAAc,CAAC,CAAC,EAAE;IAChB,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE;MACrB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACtB;EACF;EAEA,YAAY,CAAC,CAAC,EAAE;IACd,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;MACtB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;MACtC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;MACnC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAC7D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;MAC3B,CAAC,MAAM;QACL,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;MAC/E;IACF;EACF;EAEA,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC,YAAY;MAAA,WACzB;QAAK,SAAS,EAAC,gBAAgB;QAAA,UAC/B,8DAAC,wDAAgB;UAAC,EAAE,EAAC,sBAAsB;UAAC,cAAc,EAAC,kBAAkB;UAC3E,WAAW,EAAC,sCAAsC;UAAA,UACjD,MAAM,IAAK;YAAO,IAAI,EAAC,MAAM;YAAC,WAAW,EAAE,MAAO;YACjD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;YAAC,QAAQ,EAAE,IAAI,CAAC,YAAa;YACvD,SAAS,EAAE,IAAI,CAAC,cAAe;YAAC,QAAQ;YAAC,SAAS;UAAA,gBAAE;QAAC,gBACtC;MAAC,gBACf,CAAC,EACN;QAAK,SAAS,EAAC,gBAAgB;QAAA,UAC7B;UAAQ,SAAS,EAAC,SAAS;UAAC,OAAO,EAAE,IAAI,CAAC,YAAa;UAAA,UACrD,8DAAC,wDAAgB;YAAC,EAAE,EAAC,kBAAkB;YAAC,cAAc,EAAC,WAAW;YAChE,WAAW,EAAC;UAAoB,gBAAE;QAAC,gBAC/B;MAAC,gBACN,CAAC,EACN,qFAAK,CAAC,EACN;QAAK,SAAS,EAAC,mBAAmB;QAAA,WAChC;UAAO,SAAS,EAAC,OAAO;UAAA,UAAC,8DAAC,wDAAgB;YAAC,EAAE,EAAC,eAAe;YAC3D,cAAc,EAAC,aAAa;YAAC,WAAW,EAAC;UAAqB,gBAAE;QAAC,gBAC5D,CAAC,EACR;UAAK,SAAS,EAAC,SAAS;UAAC,GAAG,EAAE,IAAI,CAAC;QAAU,gBAAE,CAAC;MAAA,eAC7C,CAAC;IAAA,eACH,CAAC;EAEV;AACF;AAAC;AAED,+DAAe,sDAAU,CAAC,YAAY,CAAC,E;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzFb;AACoB;AAEH;AACI;AACT;AACK;AAGU;AAC4B;AAC3B;AACD;AAAA;AAEtC,MAAM,aAAa,SAAS,4DAAmB,CAAC;EAC7D,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,QAAQ,GAAG,sDAAe,CAAC,CAAC;IAEjC,IAAI,CAAC,KAAK,GAAG;MACX,QAAQ,EAAE,EAAE;MACZ,OAAO,EAAE,EAAE;MACX,WAAW,EAAE,EAAE;MACf,QAAQ,EAAE,IAAI;MACd,IAAI,EAAE,EAAE;MACR,SAAS,EAAE,KAAK;MAChB,SAAS,EAAE,IAAI;MACf,aAAa,EAAE;IACjB,CAAC;IAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;EAClD;EAEA,iBAAiB,GAAG,CAEpB;EAEA,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE;IACvB,IAAI,CAAC,QAAQ,CAAC;MAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI;IAAE,CAAC,CAAC;EAC/C;EAEA,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE;IAC5B,IAAI,CAAC,QAAQ,CAAC;MAAC,SAAS,EAAE,GAAG;MAAE,aAAa,EAAE;IAAI,CAAC,CAAC;EACtD;EAEA,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;IAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI;IACnD,IAAI,CAAC,QAAQ,CAAC;MAAC,QAAQ,EAAE,GAAG;MAAE,SAAS,EAAE,IAAI;MAAE,aAAa,EAAE;IAAI,CAAC,CAAC;IACpE,IAAI,IAAI,EAAE;MACR,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC;IAC9C;EACF;EAEA,sBAAsB,GAAG;IACvB,IAAI,CAAC,QAAQ,CAAC;MAAC,SAAS,EAAE,IAAI;MAAE,aAAa,EAAE;IAAI,CAAC,CAAC;EACvD;EAIA,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;IACtC,MAAM,aAAa,GAAG,KAAK,IAAI;MAC7B,IAAI;QAAC,IAAI;QAAE;MAAI,CAAC,GAAG,KAAK;MACxB,IAAI,IAAI,CAAC,IAAI,GAAG,wDAAgB,EAAE;QAIhC,MAAM,QAAQ,GAAG,kEAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACtD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAClB,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC;UAAC,QAAQ,EAAE;QAAG,CAAC,CAAC,CAAC,CAC3C,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;MACzD,CAAC,MAAM;QAEL,kEAAY,CAAC,IAAI,CAAC,CACf,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC;UAAC,QAAQ,EAAE,kEAAY,CAAC;YAAC,IAAI,EAAE,GAAG,CAAC,IAAI;YAAE,IAAI,EAAE;UAAI,CAAC;QAAC,CAAC,CAAC,CAAC;MACvF;IACF,CAAC;IAED,IAAI,KAAK,GAAG,mDAAW,IAAI,MAAM,GAAG,mDAAW,IAAI,KAAK,IAAI,MAAM,EAAE;MAElE,iEAAW,CAAC,IAAI,EAAE,mDAAW,EAAE,mDAAW,EAAE,kEAA0B,EAAE,IAAI,CAAC,CAC1E,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,CACrC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC,MAAM;MACL,aAAa,CAAC;QAAC,IAAI,EAAE,IAAI;QAAE,IAAI,EAAE,IAAI;QAAE,KAAK,EAAE,KAAK;QAAE,MAAM,EAAE;MAAM,CAAC,CAAC;IACvE;EACF;EAEA,iBAAiB,CAAC,IAAI,EAAE;IACtB,IAAI,CAAC,QAAQ,CAAC;MAAC,IAAI,EAAE;IAAI,CAAC,CAAC;EAC7B;EAEA,mBAAmB,GAAG;IACpB,IAAI,CAAC,QAAQ,CAAC;MAAC,SAAS,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;IAAS,CAAC,CAAC;EACnD;EAEA,YAAY,CAAC,CAAC,EAAE;IACd,CAAC,CAAC,cAAc,CAAC,CAAC;IAElB,MAAM,EAAE,GAAG,iEAAc,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,wDAAgB,CAAC;IACvE,MAAM,OAAO,GAAG,iEAAc,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,wDAAgB,CAAC;IAC3E,MAAM,WAAW,GAAG,iEAAc,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,oEAA4B,CAAC;IAC/F,IAAI,EAAE,EAAE;MACN,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IAC3G;EACF;EAEA,MAAM,GAAG;IACP,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;MACxB,OACE,+DAAC,wDAAU;QACT,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;QAC7B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QAC/B,QAAQ,EAAE,IAAI,CAAC,mBAAoB;QACnC,QAAQ,EAAE,IAAI,CAAC,sBAAuB;QACtC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;MAAQ,gBAAE,CAAC;IAErC;IAEA,IAAI,aAAa,GAAG,SAAS;IAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;MACvB,aAAa,IAAI,WAAW;IAC9B;IACA,OACE;MAAM,SAAS,EAAC,YAAY;MAAC,QAAQ,EAAE,IAAI,CAAC,YAAa;MAAA,WACvD;QAAK,SAAS,EAAC,mBAAmB;QAAA,WAChC;UAAA,UACE,+DAAC,0DAAY;YACX,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;YAC1B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;YAC5B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;YAC5B,cAAc,EAAE,IAAI,CAAC;UAAmB,gBAAE;QAAC,gBACvC,CAAC,EACT;UAAK,SAAS,EAAC,OAAO;UAAA,WACpB;YAAO,SAAS,EAAC,OAAO;YAAC,OAAO,EAAC,cAAc;YAAA,UAC7C,+DAAC,wDAAgB;cAAC,EAAE,EAAC,kBAAkB;cAAC,cAAc,EAAC,MAAM;cAC3D,WAAW,EAAC;YAA8B,gBAAE;UAAC,gBAC1C,CAAC,EACR,+DAAC,wDAAgB;YAAC,EAAE,EAAC,gCAAgC;YAAC,cAAc,EAAC,4BAA4B;YAC/F,WAAW,EAAC,gCAAgC;YAAA,UAC3C,WAAW,IAAK;cAAO,IAAI,EAAC,MAAM;cAAC,EAAE,EAAC,cAAc;cAAC,WAAW,EAAE,WAAY;cAC7E,GAAG,EAAE,IAAI,CAAC,QAAS;cAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;cAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAE;cACtG,SAAS;cAAC,QAAQ;cAAC,QAAQ,EAAE;YAAE,gBAAE;UAAC,gBACnB,CAAC;QAAA,eACjB,CAAC,EACN;UAAK,SAAS,EAAC,OAAO;UAAA,WACpB;YAAO,SAAS,EAAC,OAAO;YAAC,OAAO,EAAC,gBAAgB;YAAA,UAC/C,+DAAC,wDAAgB;cAAC,EAAE,EAAC,eAAe;cAAC,cAAc,EAAC,iBAAiB;cACnE,WAAW,EAAC;YAA6B,gBAAE;UAAC,gBACzC,CAAC,EACR,+DAAC,wDAAgB;YAAC,EAAE,EAAC,6BAA6B;YAAC,cAAc,EAAC,qBAAqB;YACrF,WAAW,EAAC,mCAAmC;YAAA,UAC9C,WAAW,IAAK;cAAO,IAAI,EAAC,MAAM;cAAC,EAAE,EAAC,gBAAgB;cAAC,WAAW,EAAE,WAAY;cAC/E,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;cAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAE;cAAC,QAAQ,EAAE;YAAE,gBAAE;UAAC,gBACjF,CAAC;QAAA,eACjB,CAAC,EACN;UAAK,SAAS,EAAC,OAAO;UAAA,WACpB;YAAO,SAAS,EAAC,OAAO;YAAC,OAAO,EAAC,gBAAgB;YAAA,UAC/C,+DAAC,wDAAgB;cAAC,EAAE,EAAC,mBAAmB;cAAC,cAAc,EAAC,aAAa;cACnE,WAAW,EAAC;YAAwC,gBAAE;UAAC,gBACpD,CAAC,EACR,+DAAC,wDAAgB;YAAC,EAAE,EAAC,iCAAiC;YAAC,cAAc,EAAC,wBAAwB;YAC5F,WAAW,EAAC,2CAA2C;YAAA,UACtD,WAAW,IAAK;cAAO,IAAI,EAAC,MAAM;cAAC,EAAE,EAAC,gBAAgB;cAAC,WAAW,EAAE,WAAY;cAC/E,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;cAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAE;cAAC,QAAQ,EAAE;YAAE,gBAAE;UAAC,gBACzF,CAAC;QAAA,eACjB,CAAC;MAAA,eACH,CAAC,EACN;QAAK,SAAS,EAAC,gBAAgB;QAAA,WAC7B,+DAAC,qDAAQ;UAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;UAAC,QAAQ,EAAE,CAAE;UAAC,QAAQ,EAAE,IAAI,CAAC;QAAoB,gBAAE,CAAC,QAC5F;UAAO,OAAO,EAAE,IAAI,CAAC,mBAAoB;UAAA,UAAC,+DAAC,wDAAgB;YAAC,EAAE,EAAC,gBAAgB;YAC7E,cAAc,EAAC,mBAAmB;YAClC,WAAW,EAAC;UAAwC,gBAAE;QAAC,gBAAO,CAAC;MAAA,eAC9D,CAAC,EACN,+DAAC,wDAAgB;QAAC,EAAE,EAAC,mBAAmB;QAAC,cAAc,EAAC,2BAA2B;QACjF,WAAW,EAAC,8BAA8B;QAAA,UACzC,KAAK,IAAK,+DAAC,wDAAU;UACpB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;UAC1B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAK;UACtB,SAAS,EAAE,IAAK;UAChB,aAAa,EAAE,IAAI,CAAC,iBAAkB;UACtC,QAAQ,EAAE,CAAE;UACZ,KAAK,EAAE;QAAM,gBAAE;MAAC,gBACD,CAAC,EACpB;QAAK,SAAS,EAAC,gBAAgB;QAAA,UAC7B;UAAQ,SAAS,EAAE,aAAc;UAAA,UAC/B,+DAAC,wDAAgB;YAAC,EAAE,EAAC,eAAe;YAAC,cAAc,EAAC,QAAQ;YAC1D,WAAW,EAAC;UAAiB,gBAAE;QAAC,gBAC5B;MAAC,gBACN,CAAC;IAAA,eACF,CAAC;EAEX;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;;;AC/LyB;AAEF;AAEsB;AAAA;AAE9C,SAAS,IAAI,CAAC;EAAC;AAAQ,CAAC,EAAE;EAAE,OAAO;IAAG,SAAS,EAAC,gBAAgB;IAAC,eAAY,MAAM;IAAA,UAAE;EAAQ,gBAAI,CAAC;AAAE;AAOpG,MAAM,gBAAgB,GAAG,GAAG;AAC5B,MAAM,aAAa,GAAG,GAAG;AACzB,MAAM,YAAY,GAAG;EAAC,iBAAiB,EAAE;AAAY,CAAC;AAEvC,MAAM,SAAS,SAAS,wDAAe,CAAC;EACrD,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IACZ,IAAI,CAAC,KAAK,GAAG;MAAC,MAAM,EAAE,UAAU;MAAE,SAAS,EAAE;IAAE,CAAC;IAChD,IAAI,CAAC,QAAQ,GAAG,sDAAe,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;IAC9C,IAAI,CAAC,MAAM,GAAG,IAAI;IAClB,IAAI,CAAC,KAAK,GAAG,IAAI;IACjB,IAAI,CAAC,QAAQ,GAAG,KAAK;IAErB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IAClC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;EAClC;EAEA,iBAAiB,GAAG;IAClB,IAAI,CAAC,KAAK,CAAC,CAAC;EACd;EAEA,oBAAoB,GAAG;IACrB,IAAI,CAAC,UAAU,CAAC,CAAC;EACnB;EAEA,KAAK,GAAG;IACN,IAAI,CAAC,SAAS,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,EAAE;MACnE,IAAI,CAAC,QAAQ,CAAC;QAAC,MAAM,EAAE,OAAO;QAAE,SAAS,EAAE;MAAe,CAAC,CAAC;MAC5D;IACF;IACA,IAAI,CAAC,QAAQ,GAAG,KAAK;IACrB,IAAI,CAAC,QAAQ,CAAC;MAAC,MAAM,EAAE,UAAU;MAAE,SAAS,EAAE;IAAE,CAAC,CAAC;IAGlD,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;MAAC,KAAK,EAAE;QAAC,UAAU,EAAE;MAAa,CAAC;MAAE,KAAK,EAAE;IAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI;MACrG,IAAI,CAAC,MAAM,GAAG,MAAM;MACpB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO;MACnC,IAAI,CAAC,KAAK,EAAE;QAEV,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD;MACF;MACA,KAAK,CAAC,SAAS,GAAG,MAAM;MACxB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;MAC5B,IAAI,CAAC,QAAQ,CAAC;QAAC,MAAM,EAAE;MAAU,CAAC,CAAC;MACnC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAC9D,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI;MACd,MAAM,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI;MAC5B,MAAM,IAAI,GAAG,IAAI,KAAK,iBAAiB,GAAG,0BAA0B,GAClE,IAAI,KAAK,eAAe,GAAG,WAAW,GACtC,IAAI,KAAK,kBAAkB,GAAG,aAAa,GAAG,aAAa;MAC7D,IAAI,CAAC,QAAQ,CAAC;QAAC,MAAM,EAAE,OAAO;QAAE,SAAS,EAAE;MAAI,CAAC,CAAC;IACnD,CAAC,CAAC;EACJ;EAEA,UAAU,GAAG;IACX,IAAI,IAAI,CAAC,KAAK,EAAE;MACd,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;MAChC,IAAI,CAAC,KAAK,GAAG,IAAI;IACnB;IACA,IAAI,IAAI,CAAC,MAAM,EAAE;MACf,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;MACtD,IAAI,CAAC,MAAM,GAAG,IAAI;IACpB;EACF;EAEA,IAAI,GAAG;IACL,IAAI,IAAI,CAAC,QAAQ,EAAE;MACjB;IACF;IACA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO;IACnC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,gBAAgB,EAAE;MACzD;IACF;IACA,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU;IAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW;IAC5B,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE;MACd;IACF;IACA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC;IAChC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;IACrB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;IACtB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;MAAC,kBAAkB,EAAE;IAAI,CAAC,CAAC;IACpE,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAChC,IAAI,KAAK;IACT,IAAI;MACF,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,OAAO,GAAG,EAAE;MAGZ;IACF;IACA,MAAM,IAAI,GAAG,2CAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC;IACjD,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;MACrB,IAAI,CAAC,QAAQ,GAAG,IAAI;MACpB,IAAI,CAAC,QAAQ,CAAC;QAAC,MAAM,EAAE;MAAW,CAAC,CAAC;MACpC,IAAI,CAAC,UAAU,CAAC,CAAC;MACjB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAChC;EACF;EAEA,MAAM,GAAG;IACP,MAAM;MAAC,MAAM;MAAE;IAAS,CAAC,GAAG,IAAI,CAAC,KAAK;IACtC,OAAO;MAAK,SAAS,EAAC,cAAc;MAAA,WAClC;QAAO,GAAG,EAAE,IAAI,CAAC,QAAS;QAAC,SAAS,EAAC,eAAe;QAAC,KAAK;QAAC,WAAW;QAAC,QAAQ;MAAA,gBAAE,CAAC,EAClF;QAAK,SAAS,EAAC,cAAc;QAAA,UAAC;UAAK,SAAS,EAAC,eAAe;UAAA,WAC1D;YAAG,SAAS,EAAC;UAAkC,gBAAE,CAAC;YAAG,SAAS,EAAC;UAAkC,gBAAE,CAAC,EACpG;YAAG,SAAS,EAAC;UAAkC,gBAAE,CAAC;YAAG,SAAS,EAAC;UAAkC,gBAAE,CAAC;QAAA,eACjG;MAAC,gBAAK,CAAC,EACZ;QAAQ,SAAS,EAAC,gBAAgB;QAAA,WAChC;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;UAAC,cAAW,IAAI;UAAA,UAAC,8DAAC,IAAI;YAAA,UAAC;UAAkB,gBAAM;QAAC,gBAAQ,CAAC,EAC3G;UAAA,UAAI;QAAG,gBAAI,CAAC,yFAAO,CAAC;MAAA,eACd,CAAC,EACR,MAAM,KAAK,UAAU,GAAG;QAAG,SAAS,EAAC,cAAc;QAAA,UAAC;MAAQ,gBAAG,CAAC,GAAG,IAAI,EACvE,MAAM,KAAK,UAAU,GAAG;QAAG,SAAS,EAAC,cAAc;QAAA,UAAC;MAAe,gBAAG,CAAC,GAAG,IAAI,EAC9E,MAAM,KAAK,WAAW,GAAG;QAAG,SAAS,EAAC,cAAc;QAAA,UAAC;MAAI,gBAAG,CAAC,GAAG,IAAI,EACpE,MAAM,KAAK,OAAO,GAAG;QAAK,SAAS,EAAC,eAAe;QAAA,WAClD,8DAAC,IAAI;UAAA,UAAC;QAAa,gBAAM,CAAC;UAAA,UAAI;QAAS,gBAAI,CAAC,EAC5C;UAAQ,IAAI,EAAC,QAAQ;UAAC,OAAO,EAAE,IAAI,CAAC,KAAM;UAAA,UAAC;QAAE,gBAAQ,CAAC;MAAA,eACnD,CAAC,GAAG,IAAI;IAAA,eACV,CAAC;EACR;AACF;AAOO,SAAS,gBAAgB,CAAC;EAAC,KAAK;EAAE,QAAQ;EAAE;AAAQ,CAAC,EAAE;EAC5D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,qDAAc,CAAC,EAAE,CAAC;EAChD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,qDAAc,CAAC,KAAK,CAAC;EAC7C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,qDAAc,CAAC,IAAI,CAAC;EAEtD,sDAAe,CAAC,MAAM;IACpB,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;MACzB,OAAO,SAAS;IAClB;IACA,IAAI,IAAI,GAAG,IAAI;IACf,0DAAU,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;MAAE,IAAI,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC;IAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9F,OAAO,MAAM;MAAE,IAAI,GAAG,KAAK;IAAE,CAAC;EAChC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;EAE1B,MAAM,MAAM,GAAG,MAAM;IACnB,OAAO,CAAC,IAAI,CAAC;IACb,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;EACzE,CAAC;EAED,OAAO;IAAK,SAAS,EAAC,kBAAkB;IAAA,UAAC;MAAS,SAAS,EAAC,eAAe;MAAC,IAAI,EAAC,QAAQ;MAAC,cAAW,MAAM;MAAA,WACzG;QAAM,SAAS,EAAC,gBAAgB;QAAA,UAAE,SAAS,GAAG;UAAK,GAAG,EAAE,SAAU;UAAC,GAAG,EAAC;QAAE,gBAAE,CAAC,GAAG,8DAAC,IAAI;UAAA,UAAC;QAAK,gBAAM;MAAC,gBAAO,CAAC,EACzG;QAAA,UAAK,KAAK,CAAC,IAAI,IAAI;MAAI,gBAAK,CAAC,EAC7B;QAAA,WAAI,KAAK,CAAC,YAAY,IAAI,CAAC,EAAC,IAAE;MAAA,eAAG,CAAC,EAClC;QAAO,KAAK,EAAE,OAAQ;QAAC,QAAQ,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAE;QAAC,WAAW,EAAC,UAAU;QAAC,SAAS,EAAE,EAAG;QAAC,QAAQ,EAAE;MAAK,gBAAE,CAAC,EAClI;QAAQ,IAAI,EAAC,QAAQ;QAAC,SAAS,EAAC,SAAS;QAAC,QAAQ,EAAE,IAAK;QAAC,OAAO,EAAE,MAAO;QAAA,UAAE,IAAI,GAAG,MAAM,GAAG;MAAM,gBAAS,CAAC,EAC5G;QAAQ,IAAI,EAAC,QAAQ;QAAC,OAAO,EAAE,QAAS;QAAC,QAAQ,EAAE,IAAK;QAAA,UAAC;MAAE,gBAAQ,CAAC;IAAA,eAC7D;EAAC,gBAAK,CAAC;AAClB,C;;;;;;;;;;;;;;;;;;;;ACtL0B;AAEU;AAAA;AAErB,MAAM,cAAc,SAAS,4DAAmB,CAAC;EAC9D,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG;MACX,MAAM,EAAE,KAAK;MACb,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI;IACrC,CAAC;IAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;EACpD;EAEA,oBAAoB,GAAG;IACrB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;MACrB,IAAI,CAAC,QAAQ,CAAC;QAAC,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE;MAAK,CAAC,CAAC;MAC1C,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,8CAAM,CAAC,QAAQ,CAAC;IAC9C;EACF;EAEA,kBAAkB,CAAC,CAAC,EAAE;IACpB,IAAI,CAAC,QAAQ,CAAC;MAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;IAAK,CAAC,CAAC;EACzC;EAEA,YAAY,CAAC,CAAC,EAAE;IACd,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,QAAQ,CAAC;MAAC,MAAM,EAAG,KAAK,CAAC,MAAM,GAAG;IAAE,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,8CAAM,CAAC,QAAQ,CAAC;EACzE;EAEA,WAAW,CAAC,CAAC,EAAE;IACb,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;MACrB,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,8CAAM,CAAC,QAAQ,CAAC;IAC9C;IACA,IAAI,CAAC,QAAQ,CAAC;MAAC,MAAM,EAAE,EAAE;MAAE,MAAM,EAAE;IAAK,CAAC,CAAC;EAC5C;EAEA,aAAa,CAAC,CAAC,EAAE;IACf,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE;MACrB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACtB,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE;MAC7B,CAAC,CAAC,eAAe,CAAC,CAAC;MACnB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACrB;EACF;EAEA,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC,YAAY;MAAA,UACzB;QAAK,SAAS,EAAC,gBAAgB;QAAA,WAC7B;UAAG,SAAS,EAAC,uBAAuB;UAAA,UAAC;QAAM,gBAAG,CAAC,EAC/C;UAAO,SAAS,EAAC,QAAQ;UAAC,IAAI,EAAC,MAAM;UACjC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;UACpC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;UAAC,QAAQ,EAAE,IAAI,CAAC,kBAAmB;UAC5D,SAAS,EAAE,IAAI,CAAC,aAAc;UAAC,QAAQ;UAAC,SAAS;QAAA,gBAAE,CAAC,EACvD,IAAI,CAAC,KAAK,CAAC,MAAM,GAChB;UAAG,IAAI,EAAC,GAAG;UAAC,OAAO,EAAE,IAAI,CAAC,WAAY;UAAA,UAAC;YAAG,SAAS,EAAC,gBAAgB;YAAA,UAAC;UAAa,gBAAG;QAAC,gBAAG,CAAC,GAE1F;UAAA,UAAM;YAAG,SAAS,EAAC,gBAAgB;YAAA,UAAC;UAAM,gBAAG;QAAC,gBAAM,CAAC;MAAA,eACpD;IAAC,gBACH,CAAC;EAEV;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;;;;;ACvEyB;AAEiB;AACA;AACM;AACF;AACN;AAEY;AAAA;AAEtC,MAAM,UAAU,SAAS,4DAAmB,CAAC;EAC1D,MAAM,GAAG;IACP,MAAM,WAAW,GAAG,EAAE;IACtB,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;MAC5B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI;QACpC,WAAW,CAAC,IAAI,CAAC;UAAC,IAAI,EAAE,CAAC;UAAE,KAAK,EAAE;QAAW,CAAC,CAAC;MACjD,CAAC,CAAC;IACJ;IACA,IAAI,MAAM,GAAG,IAAI;IACjB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;MACrB,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,iEAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzF;IACA,OACE;MAAK,EAAE,EAAC,oBAAoB;MAAC,SAAS,EAAC,eAAe;MAAA,WACnD,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,8DAAC,wDAAU;QAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;MAAS,gBAAE,CAAC,GAAG,IAAI,EACxE,MAAM,GACL;QAAK,EAAE,EAAC,aAAa;QAAC,SAAS,EAAC,YAAY;QAAA,UAC1C,8DAAC,wDAAU;UACT,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAa;UAC7C,MAAM,EAAE,MAAO;UACf,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAC3B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;QAAM,gBAAE;MAAC,gBAC1B,CAAC,GAEN,IAAI,EACN;QAAK,EAAE,EAAC,iBAAiB;QAAC,SAAS,EAAC,aAAa;QAAA,WAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAC,8DAAC,2DAAa;UAAC,MAAM,EAAE;QAAY,gBAAC,CAAC;MAAA,eAAK,CAAC,EAC9G,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,GACzB,8DAAC,uDAAS;QAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;QAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC;MAAW,gBAAE,CAAC,GACjF,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,GAC7B,8DAAC,0DAAY;QAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAW;QAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC;MAAW,gBAAE,CAAC,GACxF,IAAI;IAAA,eACH,CAAC;EAEV;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;;;;;;AC3CyB;AACoB;AAEL;AAEL;AAEyC;AAChC;AAAA;AAE9B,MAAM,UAAU,SAAS,wDAAe,CAAC;EACtD,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,KAAK,GAAG;MACX,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE;MAC3B,KAAK,EAAE,8CAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,8CAAM,CAAC,SAAS,CAAC,IAAI,EAAE;MAClE,QAAQ,EAAE,EAAE;MACZ,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;EAClD;EAEA,OAAO,wBAAwB,CAAC,SAAS,EAAE,SAAS,EAAE;IACpD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,EAAE;IACjC,IAAI,CAAC,yDAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE;MAC7D,OAAO;QACL,IAAI,EAAE,IAAI,IAAI,EAAE;QAChB,KAAK,EAAE,8CAAM,CAAC,WAAW,CAAC,IAAI,EAAE,8CAAM,CAAC,SAAS,CAAC,IAAI;MACvD,CAAC;IACH;IACA,OAAO,IAAI;EACb;EAEA,cAAc,CAAC,IAAI,EAAE;IACnB,IAAI,CAAC,QAAQ,CAAC;MAAC,QAAQ,EAAE;IAAI,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;MACnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAC,CAAC,CAAC;MAChC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE;QAElB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE;UAClC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAC,CAAC,CAAC,CAAC;QACrD;MACF,CAAC,MAAM,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE;QAEnE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;MAC5D;IACF;EACF;EAEA,YAAY,CAAC,GAAG,EAAE;IAChB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,8CAAM,CAAC,aAAa,EAAE,qDAAa,CAAC;IAEzF,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,EAAE;MAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;MACrC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;MAEd,IAAI,CAAC,QAAQ,CAAC;QAAC,IAAI,EAAE,IAAI;QAAE,QAAQ,EAAE;MAAE,CAAC,CAAC;MACzC,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;QAC5B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC;MAChC;MACA,OAAO,IAAI;IACb;IACA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI;EACxB;EAEA,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACrB,IAAI,CAAC,QAAQ,CAAC;MAAC,IAAI,EAAE;IAAI,CAAC,CAAC;IAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;MAC5B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC;IAChC;EACF;EAEA,YAAY,GAAG;IAEb,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAExD,IAAI,GAAG,8CAAM,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAElD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;IACzB,IAAI,CAAC,QAAQ,CAAC;MAAC,SAAS,EAAE,KAAK;MAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI;IAAE,CAAC,CAAC;EAChE;EAEA,YAAY,GAAG;IACb,IAAI,CAAC,QAAQ,CAAC;MAAC,SAAS,EAAE,KAAK;MAAE,QAAQ,EAAE,EAAE;MAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI;IAAE,CAAC,CAAC;IAC5E,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;MACvB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvB;EACF;EAEA,MAAM,GAAG;IACP,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,8CAAM,CAAC,cAAc,EAAE,sDAAc,CAAC;IAC5F,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,8CAAM,CAAC,cAAc,EAAE,sDAAc,CAAC;IAE5F,IAAI,IAAI,GAAG,EAAE;IACb,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;MACxB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI;QAC7B,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;UAC3B,IAAI,CAAC,IAAI,CAAC;YAAC,IAAI,EAAE,GAAG;YAAE,OAAO,EAAG,GAAG,CAAC,MAAM,GAAG,YAAY,IAAI,GAAG,CAAC,MAAM,GAAG;UAAa,CAAC,CAAC;QAC3F;MACF,CAAC,CAAC;IAEJ,CAAC,MAAM;MACL,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI;QAC7B,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;UAC3B,IAAI,CAAC,IAAI,CAAC;YAAM,SAAS,EAAC,OAAO;YAAA,UAAoB;UAAG,GAAjB,IAAI,CAAC,MAAM,OAAa,CAAC,CAAC;QACnE;MACF,CAAC,CAAC;MACF,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;QACpB,IAAI,GACF;UAAA,UACE,8DAAC,wDAAgB;YAAC,EAAE,EAAC,gBAAgB;YAAC,cAAc,EAAC,4BAA4B;YAAC,WAAW,EAAC;UAAE,gBAAE;QAAC,gBAClG,CACJ;MACH;IACF;IACA,OACE;MAAK,SAAS,EAAC,mBAAmB;MAAA,WAChC;QAAK,SAAS,EAAC,gBAAgB;QAAA,UAC7B;UAAO,SAAS,EAAC,OAAO;UAAA,UAAE,IAAI,CAAC,KAAK,CAAC;QAAK,gBAAQ;MAAC,gBAChD,CAAC,EACL,IAAI,CAAC,KAAK,CAAC,SAAS,GACrB;QAAA,WACE,8DAAC,wDAAgB;UAAC,EAAE,EAAC,qBAAqB;UAAC,cAAc,EAAC,eAAe;UACvE,WAAW,EAAC,2CAA2C;UAAA,UACtD,eAAe,IAAK,8DAAC,uDAAS;YAC7B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;YAC1B,KAAK,EAAE,IAAK;YACZ,cAAc,EAAE,IAAK;YACrB,MAAM,EAAE,eAAgB;YACxB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;YAC9B,OAAO,EAAE,IAAI,CAAC,YAAa;YAC3B,WAAW,EAAE,IAAI,CAAC,YAAa;YAC/B,QAAQ,EAAE,IAAI,CAAC,YAAa;YAC5B,aAAa,EAAE,IAAI,CAAC,eAAgB;YACpC,UAAU,EAAE,IAAI,CAAC;UAAe,gBAAE;QAAC,gBACpB,CAAC,EACnB,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,GACzC;UAAK,EAAE,EAAC,qBAAqB;UAAC,SAAS,EAAC,+BAA+B;UAAA,WACrE;YAAQ,SAAS,EAAC,SAAS;YAAC,OAAO,EAAE,IAAI,CAAC,YAAa;YAAA,UACrD,8DAAC,wDAAgB;cAAC,EAAE,EAAC,eAAe;cAAC,cAAc,EAAC,QAAQ;cAAC,WAAW,EAAC;YAAiB,gBAAE;UAAC,gBACvF,CAAC,EACT;YAAQ,SAAS,EAAC,SAAS;YAAC,OAAO,EAAE,IAAI,CAAC,YAAa;YAAA,UACrD,8DAAC,wDAAgB;cAAC,EAAE,EAAC,WAAW;cAAC,cAAc,EAAC,IAAI;cAAC,WAAW,EAAC;YAAa,gBAAE;UAAC,gBAC3E,CAAC;QAAA,eACN,CAAC,GACN,IAAI;MAAA,eACH,CAAC,GAEN;QAAK,SAAS,EAAC,QAAQ;QAAA,WACrB;UAAG,IAAI,EAAC,GAAG;UAAC,SAAS,EAAC,aAAa;UAAC,OAAO,EAAG,CAAC,IAAK;YAAC,CAAC,CAAC,cAAc,CAAC,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC;cAAC,SAAS,EAAE;YAAI,CAAC,CAAC;UAAC,CAAE;UAAA,WAC1G;YAAG,SAAS,EAAC,gBAAgB;YAAA,UAAC;UAAI,gBAAG,CAAC,SAAO,gEAAC,wDAAgB;YAAC,EAAE,EAAC,mBAAmB;YAAC,cAAc,EAAC,QAAQ;YAC3G,WAAW,EAAC;UAAoC,gBAAE,CAAC;QAAA,eACpD,CAAC,EACJ;UAAA,UAAG;QAAI,gBAAG,CAAC;MAAA,eACR,CAAC;IAAA,eAEH,CAAC;EAEV;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;;ACxKyB;AACgD;AACrC;AAEM;AAAA;AAE3C,MAAM,QAAQ,GAAG,0DAAc,CAAC;EAC9B,YAAY,EAAE;IACZ,EAAE,EAAE,cAAc;IAClB,cAAc,EAAE,SAAS;IACzB,WAAW,EAAE;EACf;AACF,CAAC,CAAC;AAEF,MAAM,WAAW,SAAS,4DAAmB,CAAC;EAC5C,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;EACpD;EAEA,cAAc,CAAC,CAAC,EAAE;IAChB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI;MACF,MAAM,KAAK,GAAG,+CAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;MACrD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE;MAAa,CAAC,CAAC;MACtD,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;MACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;MACrC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;MACxB,CAAC,CAAC,IAAI,GAAG,GAAG;MACZ,CAAC,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,SAAS,IAAI,MAAM;MAC1D,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;MAC5B,CAAC,CAAC,KAAK,CAAC,CAAC;MACT,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;MAC/B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,OAAO,GAAG,EAAE;MACZ,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC;MAC9C,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;QACtB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,0BAA0B,EAAE,KAAK,CAAC;MACvD;IACF;EACF;EAEA,aAAa,CAAC,CAAC,EAAE,CAEjB;EAEA,MAAM,GAAG;IACP,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO;IAC/B,IAAI,CAAC,IAAI,EAAE;MACT,OAAO,IAAI;IACb;IAEA,MAAM,GAAG,GAAG,+CAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC;IAC1C,MAAM,QAAQ,GAAG,+CAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,+CAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACxE,MAAM,GAAG,GAAG,+CAAO,CAAC,MAAM,CAAC,IAAI,CAAC;IAChC,OACE;MAAK,SAAS,EAAC,cAAc;MAAA,WAC3B;QAAK,SAAS,EAAC,cAAc;QAAA,WAC3B;UAAK,SAAS,EAAC,YAAY;UAAA,UACzB,8DAAC,wDAAU;YACT,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAa;YACtC,KAAK,EAAE,GAAG,IAAI,WAAY;YAC1B,MAAM,EAAE,+CAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAK;YAC1C,KAAK,EAAE,IAAI,CAAC;UAAG,gBAAE;QAAC,gBACjB,CAAC,EACN;UAAK,SAAS,EAAC,UAAU;UAAA,WACvB;YAAK,SAAS,EAAC,MAAM;YAAA,UAAE,IAAI,CAAC,EAAE,IAAI,8DAAC,wDAAgB;cAAA,GAAK,QAAQ,CAAC;YAAY,gBAAG;UAAC,gBAAM,CAAC,EACvF,GAAG,IAAI;YAAK,SAAS,EAAC,KAAK;YAAA,UAAE;UAAG,gBAAM,CAAC;QAAA,eACrC,CAAC;MAAA,eACH,CAAC,EACN;QAAK,SAAS,EAAC,iBAAiB;QAAA,WAC7B,GAAG,GACF;UAAA,WACE;YAAG,SAAS,EAAC,aAAa;YAAC,YAAU,GAAI;YAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;YAAA,UACxE,8DAAC,wDAAgB;cAAC,EAAE,EAAC,UAAU;cAAC,cAAc,EAAC,MAAM;cACnD,WAAW,EAAC;YAA0C,gBAAE;UAAC,gBAC1D,CAAC,EACJ;YAAK,SAAS,EAAC;UAAS,gBAAM,CAAC;QAAA,eAC/B,CAAC,GACD,QAAQ,CAAC,MAAM,GAAG,CAAC,GACrB;UAAA,WACE;YAAG,SAAS,EAAC,aAAa;YAAC,YAAU,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAE;YAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;YAAA,UACvF,8DAAC,wDAAgB;cAAC,EAAE,EAAC,WAAW;cAAC,cAAc,EAAC,MAAM;cACpD,WAAW,EAAC;YAAyC,gBAAE;UAAC,gBACzD,CAAC,EACJ;YAAK,SAAS,EAAC;UAAS,gBAAM,CAAC;QAAA,eAC/B,CAAC,GACD,IAAI,EAER;UAAG,SAAS,EAAC,aAAa;UAAC,OAAO,EAAE,IAAI,CAAC,cAAe;UAAA,UACtD,8DAAC,wDAAgB;YAAC,EAAE,EAAC,aAAa;YAAC,cAAc,EAAC,MAAM;YAAC,WAAW,EAAC;UAAuB,gBAAE;QAAC,gBAC9F,CAAC;MAAA,eACD,CAAC;IAAA,eACH,CAAC;EAEV;AACF;AAAC;AAED,+DAAe,sDAAU,CAAC,WAAW,CAAC,E;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClGZ;AACgD;AAEtC;AAEO;AACI;AACD;AACH;AAGU;AAC4B;AAC3B;AACD;AACC;AAAA;AAEtD,MAAM,QAAQ,GAAG,0DAAc,CAAC;EAC9B,aAAa,EAAE;IACb,EAAE,EAAE,eAAe;IACnB,cAAc,EAAE,WAAW;IAC3B,WAAW,EAAE;EACf,CAAC;EACD,mBAAmB,EAAE;IACnB,EAAE,EAAE,qBAAqB;IACzB,cAAc,EAAE,iBAAiB;IACjC,WAAW,EAAE;EACf,CAAC;EACD,eAAe,EAAE;IACf,EAAE,EAAE,iBAAiB;IACrB,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE;EACf,CAAC;EACD,kBAAkB,EAAE;IAClB,EAAE,EAAE,oBAAoB;IACxB,cAAc,EAAE,mDAAmD;IACnE,WAAW,EAAE;EACf;AACF,CAAC,CAAC;AAEF,MAAM,8BAA8B,GAAG,IAAI;AAE3C,MAAM,aAAa,SAAS,wDAAe,CAAC;EAC1C,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1D,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,8CAAM,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IACvD,IAAI,CAAC,KAAK,GAAG;MACX,IAAI,EAAE,8CAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;MAC5C,MAAM,EAAE,MAAM;MACd,KAAK,EAAE,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;MAC3B,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,GACtC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,IAAI;MACzE,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI;MACrD,WAAW,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,GAC3C,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC,GAAG,IAAI;MAC5E,MAAM,EAAE,kEAAY,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;MAC9D,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;MACxB,SAAS,EAAE,IAAI;MACf,aAAa,EAAE,IAAI;MACnB,UAAU,EAAE;IACd,CAAC;IAED,IAAI,CAAC,cAAc,GAAG,IAAI;IAC1B,IAAI,CAAC,eAAe,GAAG,IAAI;IAC3B,IAAI,CAAC,iBAAiB,GAAG,IAAI;IAE7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;EACxD;EAEA,iBAAiB,GAAG;IAClB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1D,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,aAAa;IACzC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS;EACtC;EAEA,oBAAoB,GAAG;IACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1D,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc;IACzC,IAAI,CAAC,eAAe,CAAC,CAAC;EACxB;EAEA,SAAS,CAAC,IAAI,EAAE;IACd,IAAI,CAAC,QAAQ,CAAC;MAAC,IAAI,EAAE;IAAI,CAAC,CAAC;EAC7B;EAEA,oBAAoB,CAAC,EAAE,EAAE;IACvB,EAAE,GAAG,kEAAc,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,wDAAgB,CAAC;IAChD,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,EAAE,EAAE;MACpC,IAAI,CAAC,QAAQ,CAAC;QAAC,QAAQ,EAAE;MAAE,CAAC,CAAC;MAC7B,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,uDAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACnE;EACF;EAEA,mBAAmB,CAAC,OAAO,EAAE;IAC3B,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,wDAAgB,CAAC;IACvD,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE;MAClC,IAAI,CAAC,QAAQ,CAAC;QAAC,OAAO,EAAE;MAAO,CAAC,CAAC;MACjC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,IAAI,8CAAM,CAAC,QAAQ,CAAC;IAClF;EACF;EAEA,uBAAuB,CAAC,IAAI,EAAE;IAC5B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,oEAA4B,CAAC;IAC7D,IAAI,IAAI,EAAE;MACR,IAAI,CAAC,QAAQ,CAAC;QAAC,WAAW,EAAE;MAAI,CAAC,CAAC;MAClC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,uDAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjF;EACF;EAGA,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE;IAE5B,IAAI,CAAC,QAAQ,CAAC;MAAC,SAAS,EAAE,GAAG;MAAE,aAAa,EAAE;IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,EAAE;MAER,IAAI,CAAC,QAAQ,CAAC;QAAC,MAAM,EAAE;MAAI,CAAC,CAAC;MAC7B,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,uDAAO,CAAC,IAAI,EAAE,8CAAM,CAAC,QAAQ,CAAC,CAAC;IAChF;EACF;EAGA,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;IAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI;IACnD,IAAI,CAAC,QAAQ,CAAC;MAAC,MAAM,EAAE,GAAG;MAAE,SAAS,EAAE,IAAI;MAAE,aAAa,EAAE;IAAI,CAAC,CAAC;IAClE,IAAI,IAAI,EAAE;MACR,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC;IAC9C;EACF;EAIA,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;IACtC,MAAM,aAAa,GAAG,KAAK,IAAI;MAC7B,IAAI;QAAC,IAAI;QAAE;MAAI,CAAC,GAAG,KAAK;MACxB,IAAI,IAAI,CAAC,IAAI,GAAG,wDAAgB,EAAE;QAIhC,MAAM,QAAQ,GAAG,kEAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACtD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAClB,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,uDAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAC/E,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;MACzD,CAAC,MAAM;QAEL,kEAAY,CAAC,IAAI,CAAC,CACf,IAAI,CAAC,GAAG,IAAI;UACX,MAAM,EAAE,GAAG,kEAAY,CAAC;YAAC,IAAI,EAAE,GAAG,CAAC,IAAI;YAAE,IAAI,EAAE;UAAI,CAAC,CAAC;UACrD,IAAI,CAAC,QAAQ,CAAC;YAAC,MAAM,EAAE;UAAE,CAAC,CAAC;UAC3B,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,uDAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC;MACN;IACF,CAAC;IAED,IAAI,KAAK,GAAG,mDAAW,IAAI,MAAM,GAAG,mDAAW,IAAI,KAAK,IAAI,MAAM,EAAE;MAElE,iEAAW,CAAC,IAAI,EAAE,mDAAW,EAAE,mDAAW,EAAE,kEAA0B,EAAE,IAAI,CAAC,CAC1E,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,CACrC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC,MAAM;MACL,aAAa,CAAC;QAAC,IAAI,EAAE,IAAI;QAAE,IAAI,EAAE,IAAI;QAAE,KAAK,EAAE,KAAK;QAAE,MAAM,EAAE;MAAM,CAAC,CAAC;IACvE;EACF;EAEA,sBAAsB,GAAG;IACvB,IAAI,CAAC,QAAQ,CAAC;MAAC,SAAS,EAAE,IAAI;MAAE,aAAa,EAAE;IAAI,CAAC,CAAC;EACvD;EAEA,iBAAiB,CAAC,KAAK,EAAE;IACvB,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,KAAK,GAChB,8CAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,8CAAM,CAAC,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,GAC5E,8CAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,8CAAM,CAAC,SAAS,CAAC;IAC1D,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;EAC9B;EAEA,aAAa,CAAC,KAAK,EAAE;IAEnB,IAAI,CAAC,eAAe,CAAC,CAAC;IAEtB,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACpB,IAAI,CAAC,KAAK,EAAE;MACV,IAAI,CAAC,QAAQ,CAAC;QAAC,UAAU,EAAE;MAAE,CAAC,CAAC;MAC/B,OAAO,IAAI;IACb;IAEA,MAAM,KAAK,GAAG,8CAAM,CAAC,eAAe,CAAC,KAAK,CAAC;IAC3C,IAAI,CAAC,KAAK,EAAE;MACV,IAAI,CAAC,QAAQ,CAAC;QAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa;MAAC,CAAC,CAAC;MAClF,OAAO,KAAK;IACd;IACA,IAAI,CAAC,QAAQ,CAAC;MAAC,UAAU,EAAE;IAAE,CAAC,CAAC;IAG/B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG,EAAE;MAER,IAAI,CAAC,QAAQ,CAAC;QAAC,UAAU,EAAE;MAAE,CAAC,CAAC;MAC/B,OAAO,IAAI;IACb;IACA,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;IAC3B,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;MACzD,IAAI,CAAC,iBAAiB,CAAC,OAAO,GAAG,OAAO;MACxC,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,MAAM;IACxC,CAAC,CAAC;IACF,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC,CAAC,IAAI;MACrC,IAAI,CAAC,eAAe,GAAG,IAAI;MAC3B,GAAG,CAAC,kBAAkB,CAAC,GAAG,8CAAM,CAAC,SAAS,GAAG,KAAK,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CACpE,IAAI,CAAC,EAAE,IAAI;QACV,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC;UAAC,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,mBAAmB;QAAC,CAAC,CAAC;MACpG,CAAC,CAAC,CACD,KAAK,CAAC,GAAG,IAAI;QACZ,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC;UAAC,UAAU,EAAE,GAAG,CAAC;QAAO,CAAC,CAAC;MAC1C,CAAC,CAAC;IACN,CAAC,EAAE,8BAA8B,CAAC;IAClC,OAAO,iBAAiB;EAC1B;EAEA,eAAe,GAAG;IAEhB,IAAI,IAAI,CAAC,eAAe,EAAE;MACxB,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;MAClC,IAAI,CAAC,eAAe,GAAG,IAAI;MAC3B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC;IACrC;EACF;EAEA,iBAAiB,CAAC,IAAI,EAAE;IAEtB,IAAI,0DAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;MACvD;IACF;IACA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC;EAC/B;EAEA,MAAM,GAAG;IACP,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;MACxB,OACE,+DAAC,wDAAU;QACT,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;QAC7B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;QAC/B,QAAQ,EAAE,IAAI,CAAC,mBAAoB;QACnC,QAAQ,EAAE,IAAI,CAAC,sBAAuB;QACtC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;MAAQ,gBAAE,CAAC;IAErC;IAEA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAK,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAO;IAC5E,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAChF,IAAI,KAAK,EAAE;MAET,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5B;IAEA,OACE;MAAA,WACA;QAAK,SAAS,EAAC,mBAAmB;QAAA,WAChC;UAAA,UACE,+DAAC,0DAAY;YACX,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;YAC1B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;YAC1B,QAAQ,EAAE,CAAC,QAAS;YACpB,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;YAC3B,cAAc,EAAE,IAAI,CAAC,kBAAmB;YACxC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;UAAQ,gBAAE;QAAC,gBAC3B,CAAC,EACR,IAAI,CAAC,KAAK,CAAC,IAAI,GACd;UAAK,SAAS,EAAC,OAAO;UAAA,WACpB;YAAO,SAAS,EAAC,OAAO;YAAA,UACtB,+DAAC,wDAAgB;cAAC,EAAE,EAAC,iBAAiB;cAAC,cAAc,EAAC,WAAW;cACjE,WAAW,EAAC;YAA6B,gBAAE;UAAC,gBACvC,CAAC,EACR;YAAA,UACE,+DAAC,wDAAgB;cAAC,EAAE,EAAC,kBAAkB;cAAC,cAAc,EAAC,0BAA0B;cAC/E,WAAW,EAAC,0CAA0C;cAAA,UACrD,qBAAqB,IAAK,+DAAC,0DAAW;gBACrC,WAAW,EAAE,qBAAsB;gBACnC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;gBAC3B,QAAQ,EAAE,IAAK;gBACf,UAAU,EAAE,IAAI,CAAC;cAAqB,gBAAE;YAAC,gBAC1B;UAAC,gBACjB,CAAC;QAAA,eACH,CAAC,GAEN;UAAA,WACE;YAAK,SAAS,EAAC,OAAO;YAAA,WACpB;cAAA,UAAK;gBAAO,SAAS,EAAC,OAAO;gBAAA,UAC3B,+DAAC,wDAAgB;kBAAC,EAAE,EAAC,kBAAkB;kBAAC,cAAc,EAAC,MAAM;kBAC3D,WAAW,EAAC;gBAA8B,gBAAE;cAAC,gBAC1C;YAAC,gBAAK,CAAC,EACd;cAAA,UACE,+DAAC,wDAAgB;gBAAC,EAAE,EAAC,gCAAgC;gBAAC,cAAc,EAAC,4BAA4B;gBAC/F,WAAW,EAAC,gCAAgC;gBAAA,UAC3C,sBAAsB,IAAK,+DAAC,0DAAW;kBACtC,WAAW,EAAE,sBAAuB;kBACpC,QAAQ,EAAE,CAAC,QAAS;kBACpB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;kBAC3B,QAAQ,EAAE,IAAK;kBACf,SAAS,EAAE,EAAG;kBACd,UAAU,EAAE,IAAI,CAAC;gBAAqB,gBAAE;cAAC,gBAC1B;YAAC,gBACjB,CAAC;UAAA,eACH,CAAC,EACN;YAAK,SAAS,EAAC,OAAO;YAAA,WACpB;cAAA,UACE;gBAAO,SAAS,EAAC,OAAO;gBAAA,UACtB,+DAAC,wDAAgB;kBAAC,EAAE,EAAC,eAAe;kBAAC,cAAc,EAAC,iBAAiB;kBACnE,WAAW,EAAC;gBAA6B,gBAAE;cAAC,gBACzC;YAAC,gBACL,CAAC,EACN;cAAA,UACE,+DAAC,wDAAgB;gBAAC,EAAE,EAAC,6BAA6B;gBAAC,cAAc,EAAC,qBAAqB;gBACrF,WAAW,EAAC,mCAAmC;gBAAA,UAC9C,mBAAmB,IAAK,+DAAC,0DAAW;kBACnC,WAAW,EAAE,mBAAoB;kBACjC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAQ;kBAC1B,UAAU,EAAE,IAAI,CAAC;gBAAoB,gBAAE;cAAC,gBACzB;YAAC,gBACjB,CAAC;UAAA,eACH,CAAC;QAAA,eACN,CAAC,EAEJ,QAAQ,IAAI,KAAK,GAChB;UAAK,SAAS,EAAC,OAAO;UAAA,WACpB;YAAA,UAAK;cAAO,SAAS,EAAE,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,GAAG,EAAE,CAAE;cAAA,WACzE,+DAAC,wDAAgB;gBAAC,EAAE,EAAC,kBAAkB;gBAAC,cAAc,EAAC,OAAO;gBAC5D,WAAW,EAAC;cAAuC,gBAAE,CAAC,KAAC,EAAC,IAAI,CAAC,KAAK,CAAC,UAAU;YAAA,eAC1E;UAAC,gBAAK,CAAC,EACd;YAAA,UACE,+DAAC,wDAAgB;cAAC,EAAE,EAAC,2BAA2B;cAC9C,cAAc,EAAC,kBAAkB;cACjC,WAAW,EAAC,6CAA6C;cAAA,UACxD,mBAAmB,IAAK,+DAAC,0DAAW;gBACnC,WAAW,EAAE,mBAAoB;gBACjC,QAAQ,EAAE,CAAC,QAAS;gBACpB,KAAK,EAAE,KAAM;gBACb,SAAS,EAAE,IAAI,CAAC,aAAc;gBAC9B,QAAQ,EAAC,iBAAiB;gBAC1B,SAAS,EAAE,EAAG;gBACd,UAAU,EAAE,KAAM;gBAClB,UAAU,EAAE,IAAI,CAAC;cAAkB,gBAAE;YAAC,gBACvB;UAAC,gBACjB,CAAC;QAAA,eACH,CAAC,GACJ,IAAI,EAEP,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,GACjC;UAAK,SAAS,EAAC,OAAO;UAAA,WACpB;YAAA,UAAK;cAAO,SAAS,EAAC,OAAO;cAAA,UAC3B,+DAAC,wDAAgB;gBAAC,EAAE,EAAC,mBAAmB;gBAAC,cAAc,EAAC,aAAa;gBACnE,WAAW,EAAC;cAAwC,gBAAE;YAAC,gBACpD;UAAC,gBAAK,CAAC,EACd;YAAA,UACE,+DAAC,wDAAgB;cAAC,EAAE,EAAC,iCAAiC;cACpD,cAAc,EAAC,wBAAwB;cACvC,WAAW,EAAC,2CAA2C;cAAA,UACtD,mBAAmB,IAAK,+DAAC,0DAAW;gBACnC,WAAW,EAAE,mBAAoB;gBACjC,QAAQ,EAAE,CAAC,QAAS;gBACpB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;gBAC9B,SAAS,EAAE,CAAE;gBACb,UAAU,EAAE,IAAI,CAAC;cAAwB,gBAAE;YAAC,gBAC7B;UAAC,gBACjB,CAAC;QAAA,eACH,CAAC,GACJ,IAAI;MAAA,eAEL,CAAC,EACL,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAC3B;QAAA,WACE;UAAK,SAAS,EAAC;QAAI,gBAAE,CAAC,EACtB,+DAAC,wDAAgB;UAAC,EAAE,EAAC,mBAAmB;UAAC,cAAc,EAAC,2BAA2B;UACjF,WAAW,EAAC,8BAA8B;UAAA,UACvC,iBAAiB,IAAK,+DAAC,wDAAU;YAChC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAO;YAC1B,KAAK,EAAE,iBAAkB;YACzB,SAAS,EAAE,KAAM;YACjB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAK;YACtB,QAAQ,EAAE,IAAI,CAAC;UAAkB,gBAAE;QAAC,gBACvB,CAAC;MAAA,eACpB,CAAC,GACD,IAAI;IAAA,eAEN,CAAC;EAEP;AACF;AAAC;AAED,+DAAe,sDAAU,CAAC,aAAa,CAAC,E;;;;;;;;;;;;;;;;;;ACrZd;AAAA;AAEX,MAAM,WAAW,SAAS,4DAAmB,CAAC;EAC3D,MAAM,GAAG;IACP,OAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,GAC1B;MAAM,SAAS,EAAC,QAAQ;MAAA,UAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IAAK,gBAAO,CAAC,GAC9E,IAAI;EACV;AACF;AAAC,C;;;;;;;;;;;;;;;;;;;ACRyB;AAEqB;AAAA;AAEhC,MAAM,cAAc,SAAS,4DAAmB,CAAC;EAC9D,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;EACd;EAEA,MAAM,GAAG;IACP,OACE;MAAK,SAAS,EAAC,cAAc;MAAA,WAC1B,0DAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,EACvC;QAAK,SAAS,EAAC,mBAAmB;QAAA,UAChC,8DAAC,0DAAY;UAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;UAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;QAAe,gBAAE;MAAC,gBACjF,CAAC;IAAA,eACH,CAAC;EAEV;AACF;AAAC,C;;;;;;;;;;;;;;;;;;ACnByB;AAAA;AAEX,MAAM,eAAe,SAAS,4DAAmB,CAAC;EAC/D,WAAW,CAAC,KAAK,EAAE;IACjB,KAAK,CAAC,KAAK,CAAC;IAEZ,IAAI,CAAC,QAAQ,GAAG,sDAAe,CAAC,CAAC;IAEjC,IAAI,CAAC,KAAK,GAAG;MACX,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;MAC7B,OAAO,EAAE;IACX,CAAC;IAED,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;EACpE;EAEA,iBAAiB,GAAG;IAClB,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;MACxB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B;EACF;EAEA,eAAe,CAAC,CAAC,EAAE;IACjB,IAAI,CAAC,QAAQ,CAAC;MAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;IAAK,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;MACvB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxB;EACF;EAEA,gBAAgB,CAAC,CAAC,EAAE;IAClB,CAAC,CAAC,cAAc,CAAC,CAAC;IAClB,IAAI,CAAC,QAAQ,CAAC;MAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;IAAO,CAAC,CAAC;EAC/C;EAEA,aAAa,CAAC,CAAC,EAAE;IACf,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE;MAEnB,IAAI,CAAC,QAAQ,CAAC;QAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;QAAE,OAAO,EAAE;MAAK,CAAC,CAAC;MAC9D,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;QACzB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;MACzB;IACF,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE;MAE1B,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC9B;EACF;EAEA,qBAAqB,CAAC,CAAC,EAAE;IACvB,IAAI,CAAC,EAAE;MACL,IAAI,aAAa,GAAG,CAAC,CAAC,aAAa;MACnC,UAAU,CAAC,CAAC,IAAI;QACd,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;UACnD,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;YACzB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;UACzC;QACF;MACF,CAAC,EAAE,CAAC,CAAC;IACP,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;MAChC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD;EACF;EAEA,MAAM,GAAG;IACP,OACE;MAAK,QAAQ,EAAC,IAAI;MAAC,SAAS,EAAC,aAAa;MAAC,MAAM,EAAE,IAAI,CAAC,qBAAsB;MAAA,WAC5E;QAAO,SAAS,EAAC,iBAAiB;QAChC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,GAAG,UAAW;QAC/C,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;QACxB,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;QACpC,SAAS,EAAE,EAAG;QACd,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,GAAG,EAAG;QAChD,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,WAAW,GAAG,EAAG;QACnD,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAa;QACtC,QAAQ,EAAE,IAAI,CAAC,eAAgB;QAC/B,SAAS,EAAE,IAAI,CAAC,aAAc;QAC9B,GAAG,EAAE,IAAI,CAAC;MAAS,gBAAE,CAAC,EACxB;QAAM,OAAO,EAAE,IAAI,CAAC,gBAAiB;QAAA,UACnC;UAAG,SAAS,EAAC,qCAAqC;UAAA,UAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,YAAY,GAAG;QAAgB,gBACpD;MAAC,gBACA,CAAC;IAAA,eACJ,CAAC;EAEV;AACF,C;;;;;;;;;;ACxFA;AACA,IAAI,IAAyD;AAC7D;AACA,MAAM;AAAA,EAKqB;AAC3B,CAAC;AACD,qCAAqC;AACrC;AACA;AACA;AACA;AACA,mBAAmB,8BAAmB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,8BAAmB;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,8BAAmB;AAC7B;AACA;AACA,UAAU,8BAAmB;AAC7B;AACA;AACA,UAAU,8BAAmB;AAC7B,eAAe,8BAAmB;AAClC;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,UAAU,8BAAmB;AAC7B;AACA,oCAAoC,4BAA4B;AAChE,0CAA0C;AAC1C,WAAW,8BAAmB;AAC9B;AACA;AACA;AACA;AACA,UAAU,8BAAmB,kCAAkC;AAC/D;AACA;AACA,UAAU,8BAAmB;AAC7B;AACA;AACA,iBAAiB,8BAAmB,CAAC,8BAAmB;AACxD,UAAU;AACV;AACA;AACA;AACA;;AAEA;;AAEA,+CAA+C,aAAa;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,kBAAkB;AAC5C,+BAA+B,kBAAkB;AACjD;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;;;AAGA,OAAO;AACP;AACA,iCAAiC,+BAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D,sBAAsB,+BAAmB;AACzC;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,eAAe;AACvC;AACA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;;;AAGA,OAAO;AACP;AACA,iCAAiC,+BAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D,kBAAkB,+BAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,8BAA8B;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA,iCAAiC,+BAA+B;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,aAAa;AACrC;AACA,4BAA4B,aAAa;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,wBAAwB,UAAU;AAClC;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;;;AAGA,OAAO;AACP;AACA,iCAAiC,gCAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D,kBAAkB,gCAAmB;AACrC,gBAAgB,gCAAmB;AACnC,kBAAkB,gCAAmB;AACrC,gBAAgB,gCAAmB;AACnC;AACA;AACA;AACA;AACA;AACA,8CAA8C,yBAAyB;AACvE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA,6BAA6B;AAC7B;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;AACP;AACA,iCAAiC,gCAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D,kBAAkB,gCAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,WAAW;AAC/B,wBAAwB,YAAY;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,sCAAsC;AACvE,wCAAwC,2CAA2C;AACnF;AACA;AACA;AACA,4BAA4B,iBAAiB;AAC7C,gCAAgC,iBAAiB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,sCAAsC;AACvE,wCAAwC,2CAA2C;AACnF;AACA;AACA;AACA,mCAAmC,cAAc;AACjD,uCAAuC,cAAc;AACrD;AACA;AACA;AACA;AACA,kCAAkC,uBAAuB;AACzD,sCAAsC,uBAAuB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,aAAa;AACb;AACA;;;AAGA,OAAO;AACP;AACA,iCAAiC,gCAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D,kBAAkB,gCAAmB;AACrC,mBAAmB,gCAAmB;AACtC,oBAAoB,gCAAmB;AACvC,gBAAgB,gCAAmB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E,MAAM,4BAA4B,wCAAwC;AAC1E;AACA;AACA,mBAAmB,iCAAiC;AACpD,mBAAmB,yBAAyB;AAC5C,mBAAmB,uBAAuB;AAC1C,mBAAmB,+BAA+B;AAClD,mBAAmB,+DAA+D;AAClF,mBAAmB,qDAAqD;AACxE,mBAAmB,2DAA2D;AAC9E,mBAAmB,2DAA2D;AAC9E;AACA;AACA;AACA;AACA,wCAAwC;AACxC,oDAAoD;AACpD,oDAAoD;AACpD;AACA,2DAA2D,gBAAgB;AAC3E;AACA,+DAA+D,gBAAgB;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD,qDAAqD;AACrD;AACA,yDAAyD;AACzD,yDAAyD;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,iBAAiB;AAC3D,iCAAiC;AACjC;AACA;AACA,wBAAwB,eAAe;AACvC;AACA,uCAAuC,kBAAkB;AACzD;AACA;AACA;AACA;AACA,mCAAmC,YAAY;AAC/C;AACA;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC;AACnC;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,oCAAoC,qBAAqB;AACzD;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,oCAAoC,qBAAqB;AACzD;AACA;AACA;AACA;AACA;AACA,sDAAsD,wBAAwB;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,uBAAuB;AACvB;AACA;AACA;AACA,oBAAoB,QAAQ;AAC5B,uBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA,gCAAgC,oBAAoB,OAAO;AAC3D;AACA;AACA,gCAAgC,eAAe,OAAO;AACtD;AACA;AACA;AACA;AACA,8DAA8D,iCAAiC;AAC/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C,8BAA8B,8DAA8D;AAC5F;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC,oDAAoD,0BAA0B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA;AACA;AACA,oDAAoD,0BAA0B;AAC9E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,gCAAgC;AACzF;AACA;AACA,gDAAgD,0BAA0B;AAC1E;AACA;AACA;AACA;AACA;AACA,wBAAwB,gCAAgC;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kBAAkB;AACtC,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;AACP;AACA,iCAAiC,gCAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D;AACA,kBAAkB,gCAAmB;AACrC,sBAAsB,gCAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,2CAA2C;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;AACA,4DAA4D,iDAAiD;AAC7G;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;AACP;AACA;;AAEA;;AAEA;AACA,+CAA+C,aAAa;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;;;AAGA,OAAO;AACP;AACA;;AAEA;;AAEA,+CAA+C,aAAa;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;AACP;AACA,iCAAiC,iCAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D,kBAAkB,iCAAmB;AACrC,sBAAsB,iCAAmB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,0CAA0C;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,OAAO;AAC3B;AACA;AACA,wBAAwB,OAAO;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD;AACzD;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;AACP;AACA;;AAEA;;AAEA,+CAA+C,aAAa;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,wCAAwC;AACrE,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,wCAAwC;AACrE,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,0CAA0C;AACvE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,yCAAyC;AACtE,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,0CAA0C;AACvE,aAAa;AACb;AACA;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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA,6BAA6B,0CAA0C;AACvE,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA,6BAA6B,0CAA0C;AACvE,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA,6BAA6B,0CAA0C;AACvE,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,2CAA2C;AACjE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,2CAA2C;AACjE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,2CAA2C;AACxE,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,2CAA2C;AACjE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,yCAAyC;AAC/D,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,2CAA2C;AACjE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,yCAAyC;AAC/D;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,2CAA2C;AACjE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA,KAAK;AACL;;;AAGA,OAAO;AACP;AACA,iCAAiC,iCAAmB;;AAEpD;;AAEA,+CAA+C,aAAa;AAC5D,kBAAkB,iCAAmB;AACrC;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,gBAAgB,IAAI,qCAAqC,IAAI,0DAA0D,IAAI,qCAAqC;AACvM;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,wBAAwB;AAC5C,wBAAwB,wBAAwB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,OAAO;AACP;AACA;;AAEA;;AAEA,+CAA+C,aAAa;AAC5D;AACA;AACA;AACA,iCAAiC;AACjC;AACA,2CAA2C,eAAe;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,0BAA0B,kDAAkD;AAC5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,mBAAmB;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,oBAAoB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,YAAY;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,uCAAuC;AACtG,oEAAoE;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,mBAAmB;AAC3E,sDAAsD,mBAAmB;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,wDAAwD,yBAAyB;AACjF;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA,2DAA2D,yBAAyB;AACpF;AACA;AACA;AACA;AACA,yBAAyB,mBAAmB;AAC5C;AACA;AACA,yGAAyG,uDAAuD;AAChK,kFAAkF,0BAA0B;AAC5G,kHAAkH,0BAA0B;AAC5I,wFAAwF,0BAA0B;AAClH;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA,qGAAqG,mCAAmC;AACxI;AACA;AACA,+BAA+B,mCAAmC;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,oCAAoC;AACvE,iBAAiB;AACjB,KAAK;AACL,+BAA+B,aAAa;AAC5C,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,kBAAkB;AACzD,gCAAgC,UAAU,kGAAkG,IAAI;AAChJ,oCAAoC,2BAA2B;AAC/D;AACA;AACA;AACA;AACA,iBAAiB;AACjB,KAAK;AACL,+BAA+B,aAAa;AAC5C,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kEAAkE;AAClG,0BAA0B,kCAAkC;AAC5D;AACA,uBAAuB,4BAA4B;AACnD,wBAAwB,8BAA8B;AACtD,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,kFAAkF;AAClH,0BAA0B,wCAAwC;AAClE,uBAAuB,kCAAkC;AACzD,wBAAwB,oCAAoC;AAC5D;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,oCAAoC;AAC3E,2CAA2C,YAAY;AACvD,iBAAiB;AACjB,KAAK;AACL,+BAA+B,aAAa;AAC5C,gCAAgC,2BAA2B;AAC3D;AACA;AACA;AACA,aAAa;AACb;;;AAGA,OAAO;AACP;AACA,CAAC,E;;;;;;;;;;;ACr3TY;;AAEb,QAAQ,mBAAO,CAAC,4BAAW;AAC3B,IAAI,KAAqC,EAAE;AAAA,EAG1C,CAAC;AACF;AACA,EAAE,kBAAkB;AACpB;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,EAAE,mBAAmB;AACrB;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;;;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb,IAAI,IAAqC;AACzC;AACA;;AAEA,YAAY,mBAAO,CAAC,oBAAO;;AAE3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,iGAAiG,eAAe;AAChH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;;;AAGN;AACA;AACA,KAAK,GAAG;;AAER,kDAAkD;AAClD;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,4BAA4B;AAC5B;AACA,qCAAqC;;AAErC,gCAAgC;AAChC;AACA;;AAEA,gCAAgC;;AAEhC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;;;AAGJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,EAAE;;;AAGF;AACA;AACA,EAAE;;;AAGF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;;AAEvC;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA,sBAAsB;AACtB;AACA,SAAS;AACT,uBAAuB;AACvB;AACA,SAAS;AACT,uBAAuB;AACvB;AACA,SAAS;AACT,wBAAwB;AACxB;AACA,SAAS;AACT,wBAAwB;AACxB;AACA,SAAS;AACT,iCAAiC;AACjC;AACA,SAAS;AACT,2BAA2B;AAC3B;AACA,SAAS;AACT,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,MAAM;;;AAGN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,2DAA2D;;AAE3D;AACA;;AAEA;AACA,yDAAyD;AACzD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;;AAGT;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa,kBAAkB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA,gFAAgF;AAChF;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kBAAkB;;;AAGlB;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAI;;;AAGJ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B;AAC9B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2HAA2H;AAC3H;AACA;AACA;;AAEA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA,oEAAoE;;AAEpE;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,iCAAiC;;AAEjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;;;AAGF;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wCAAwC;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,GAAG;AACd,WAAW,GAAG;AACd,WAAW,eAAe;AAC1B,WAAW,GAAG;AACd,WAAW,GAAG;AACd;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK,GAAG;;AAER;AACA;AACA;AACA;AACA;AACA,KAAK,GAAG;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW,GAAG;AACd,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;;AAEA;AACA;AACA,kBAAkB;;AAElB;AACA;AACA,oBAAoB;AACpB,2DAA2D,UAAU;AACrE,yBAAyB,UAAU;AACnC;AACA,aAAa,UAAU;AACvB;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAM;;;AAGN;AACA;AACA;AACA;AACA,MAAM;;;AAGN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,SAAS;AACpB,YAAY,SAAS;AACrB;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB,WAAW,GAAG;AACd;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,6DAA6D;AAC7D;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,WAAW;AACtB,WAAW,GAAG;AACd;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,iBAAiB;AACvC;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN,4CAA4C;;AAE5C;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,cAAc;AACzB;;;AAGA;AACA;AACA;;AAEA,oBAAoB,iBAAiB;AACrC;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8CAA8C;AAC9C;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;;AAEA,0DAA0D;AAC1D;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA,4BAA4B,qBAAqB;AACjD;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,gDAAgD,gDAAgD,MAAM,aAAa;;AAEnH;AACA,iDAAiD,kCAAkC,OAAO;;AAE1F,yGAAyG,cAAc,UAAU,gGAAgG,kBAAkB,UAAU,UAAU;;AAEvQ;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA,EAAE;;AAEF;;AAEA,gBAAgB;AAChB,cAAc;AACd,GAAG;AACH;;;;;;;;;;;;AClyCa;;AAEb,IAAI,KAAqC,EAAE;AAAA,EAE1C,CAAC;AACF,EAAE,uJAAsE;AACxE;;;;;;;;;;;;ACNA,wB;;;;;;;;;;;ACAA,uB;;;;;;;;;;;ACAA,0B;;;;;;;;;;;ACAA,2B;;;;;;;;;;;ACAA,wB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAoE;AACuB;AACwH;AACpK;AAClB;;AAE7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,gBAAgB,GAAG,gBAAgB;AAC7D;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,oDAAM;;AAEzB;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,gBAAgB,sCAAsC,SAAS;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,cAAc;AACzF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gBAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,SAAS;AAClE;AACA,uEAAuE,SAAS;AAChF,0EAA0E,SAAS;AACnF,sEAAsE,SAAS;AAC/E;AACA;AACA,6EAA6E,SAAS;AACtF;AACA;AACA,iGAAiG,sBAAsB;AACvH,oGAAoG,sBAAsB;AAC1H,oGAAoG,sBAAsB;AAC1H,2GAA2G,sBAAsB;AACjI;AACA;AACA;AACA,0BAA0B,wDAAY;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B,yBAAyB;AACzB;AACA;AACA;AACA;AACA,wCAAwC,0DAAS;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mFAAmF,qBAAqB;AACxG;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,4DAAY;AACnC;AACA,2CAA2C,WAAW;AACtD;AACA;AACA;AACA;AACA,2CAA2C,WAAW;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,WAAW;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,0BAA0B,mEAAmB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,yDAAS;AACrB,YAAY,yDAAS;AACrB;AACA;AACA;AACA,uFAAuF,eAAe;AACtG;AACA;AACA,0BAA0B,mEAAkB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4D;AAC5D,QAAQ,yDAAS,OAAO,2DAAW;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,mEAAmB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mIAAmI;AACnI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,mEAAkB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iCAAiC;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,mEAAmB;AAClE;AACA;AACA;AACA,qEAAqE,eAAe;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,QAAQ;AAC/B;AACA;AACA;AACA;AACA;AACA,2CAA2C,QAAQ,kBAAkB,QAAQ;AAC7E;AACA;AACA,0CAA0C,QAAQ;AAClD;AACA;AACA;AACA;AACA;AACA,0CAA0C,QAAQ;AAClD;AACA;AACA;AACA;AACA,2BAA2B,0DAAS,IAAI,QAAQ,oBAAoB,kBAAkB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,mEAAiB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,6DAAa;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2CAAM;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yDAAa;AACtC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yDAAa;AACtC;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,cAAc,SAAS,GAAG,kBAAkB;AAC5C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,aAAa;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,kCAAkC;AACtD,iCAAiC,6EAA6B,kBAAkB,0CAA0C;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,oEAAoB;AACjC;AACA;AACA;AACA,mBAAmB,yEAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,6EAA6B;AACxC;AACA,qBAAqB,yCAAyC;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,0DAAS;AACpC,2BAA2B,0DAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiY;AACjY;;;;;;;;;;;;;;;;;;;ACptC0C;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,oDAAQ;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,WAAW;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,gBAAgB,eAAe,UAAU;AAC1F;AACA;AACA,yCAAyC,WAAW;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,wCAAwC;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB,gBAAgB,eAAe;AAC/B;AACA;AACA,2BAA2B,UAAU,GAAG,qBAAqB;AAC7D;AACA;AACA,qCAAqC,WAAW;AAChD;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,kCAAkC;AAC/D;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4GAA4G;AAC5G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,gBAAgB,mCAAmC,UAAU;AACtG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEmD;AACnD;;;;;;;;;;;;;;;;;;;;;;;;ACvZ0F;AAC1C;AACa;AAChC;;AAE7B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA,gDAAgD;AAChD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iHAAiH,WAAW;AAC5H;AACA;AACA,yDAAyD,cAAc,4BAA4B,cAAc,cAAc,GAAG,eAAe;AACjJ;AACA;AACA;AACA,0BAA0B,wDAAY;AACtC;AACA;AACA,6BAA6B,yDAAa;AAC1C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,WAAW;AAC/C,cAAc,sBAAsB,YAAY,UAAU;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,sBAAsB,QAAQ;AAC9B;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,yCAAyC,cAAc;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,uBAAuB,EAAE,aAAa;AACpD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,qCAAqC,IAAI,KAAK;AACzF;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,GAAG;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,kBAAkB,GAAG,gBAAgB;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,UAAU;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2CAAM;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,yCAAyC;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,qCAAqC;AAC/E;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,KAAK;AACxD,cAAc,oCAAoC,GAAG,IAAI;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,yCAAyC;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sBAAsB;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,KAAK;AAC7C,cAAc,oCAAoC,GAAG,IAAI;AACzD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,qBAAqB;AAChD,IAAI,iCAAiC;AACrC,qBAAqB,iCAAiC;AACtD;AACA;AACA;AACA,gCAAgC,qDAAM;AACtC,8BAA8B,2DAAY;AAC1C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,2DAAY;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,2DAAY;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iEAAkB,KAAK,0DAAS;AACpC,IAAI,iEAAkB,KAAK,0DAAS;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAAe;AACf;AACA,8DAAe;;AAE+D;AAC9E;;;;;;;;;;;;;;;;;;;AC9oCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,IAAI,KAAK,cAAc;AACnD;AACA;AACA,sFAAsF,QAAQ;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,IAAI;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;;AAE4D;AAC5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1NqD;AACL;AACT;AAC+F;AAC5C;;AAE1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,sCAAsC;;AAEvC;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,2CAAM;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,UAAU,6CAAQ;AAClB,UAAU,6CAAQ;AAClB,UAAU,6CAAQ;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,sBAAsB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iHAAiH,WAAW;AAC5H;AACA;AACA;AACA;AACA;AACA;AACA,gJAAgJ,qBAAqB;AACrK,+HAA+H,WAAW;AAC1I;AACA,0IAA0I,WAAW;AACrJ,4IAA4I,WAAW;AACvJ;AACA;AACA;AACA;AACA,yBAAyB,WAAW;AACpC,wHAAwH,WAAW;AACnI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,wDAAY;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,MAAM,mDAAU;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,WAAW;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,gDAAgD;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,4CAA4C,GAAG,IAAI;AACrF;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,6CAA6C,UAAU,gBAAgB,IAAI;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,4CAA4C,GAAG,mBAAmB;AAC1G;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,4CAA4C,GAAG,MAAM;AAC7F;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,uBAAuB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,WAAW;AAClC,cAAc,SAAS,YAAY,UAAU;AAC7C;AACA,4BAA4B,0BAA0B;AACtD;AACA;AACA;AACA;AACA;AACA,qDAAqD,UAAU;AAC/D,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2CAA2C;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uGAAuG,8BAA8B;AACrI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,UAAU,gBAAgB,IAAI,IAAI;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,mDAAmD;AAC7E,gBAAgB,cAAc;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,mEAAU;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,eAAe;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,UAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD,uDAAuD;AACvD;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iEAAkB,KAAK,0DAAS;AACpC,IAAI,iEAAkB,KAAK,0DAAS;AACpC,IAAI,8DAAe;AACnB;AACA,IAAI,8DAAe;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,yEAAyB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,oEAAoB;AAC5B,QAAQ,iEAAiB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,wBAAwB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,wBAAwB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,qDAAM;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL,WAAW,2DAAY,CAAC,kEAAkB;AAC1C;AACA;AACA,mBAAmB,iBAAiB;AACpC,gFAAgF;AAChF;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB,eAAe,oBAAoB;AACvE;AACA;AACA;AACA;AACA;AACA,gBAAgB,kEAAkB;AAClC;AACA;AACA;AACA,wDAAwD,iBAAiB;AACzE,QAAQ,iBAAiB;AACzB;AACA;AACA,UAAU,eAAe;AACzB,YAAY,sBAAsB;AAClC;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA,oBAAoB,sBAAsB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kEAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kEAAkB;AAClC;AACA;AACA;AACA;AACA,sBAAsB,oBAAoB;AAC1C,0BAA0B,MAAM,oBAAoB;AACpD;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA,wEAAwE;AACxE;AACA;AACA;AACA;AACA,gBAAgB,kEAAkB;AAClC;AACA;AACA;AACA;AACA,yBAAyB,sBAAsB;AAC/C;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA,gBAAgB,kEAAkB;AAClC;AACA;AACA;AACA;AACA;AACA,kBAAkB,eAAe;AACjC;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kEAAkB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,kEAAkB;AAClC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEwK;AACxK;;;;;;;;;;;;;;;;AC97DA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAgD;AAClB;;AAE9B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAAe;AACf;;;;;;;;;;;;;;;;;;;;;;;;;ACvBoC;AACpC;;;;;;;;;;;;;;;;;;;;ACDmE;AACN;;AAE7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,yCAAyC,IAAI;AAC9E;AACA,wBAAwB,qDAAI;AAC5B;AACA;AACA,oBAAoB,qDAAI,sDAAsD,qDAAI;AAClF,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,UAAU,IAAI;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,qDAAI;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAY;AACZ;AACA;AACA;AACA,CAAC;;AAE2B;;;;;;;;;;;;;;;;;;;;AC9F5B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,wBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEqG;;;;;;;;;;;;;;;;;;;;ACxLrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,kCAAkC;AACnC;AACA;AACA;AACA;AACA;;AAEmG;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjB1C;AACA;AACF;AACE;AACC;AACf;AACA;;AAE3C;AACA;AACA;AACA;AACA;AACA,CAAC,sDAAsD;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uDAAW;AACvC;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,QAAQ;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,mCAAmC,uDAAW;AAC9C;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,mDAAQ;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,8DAA8D,cAAc,+BAA+B;AAC3G;AACA;AACA;AACA;AACA;AACA,qDAAqD,mDAAQ;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,kEAAkE,cAAc,+BAA+B;AAC/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8FAA8F,uDAAW;AACzG;AACA;AACA,mBAAmB,uEAAe;AAClC;AACA;AACA,mBAAmB,sEAAe;AAClC;AACA,eAAe,oEAAc;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,8DAAc;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE6E;;;;;;;;;;;;;;;;;ACrMlC;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,mDAAQ;AACrC;AACA;AACA,6BAA6B,mDAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE0B;;;;;;;;;;;;;;;;;ACjFiB;;AAE3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,mDAAQ;AACrC;AACA;AACA,6BAA6B,mDAAQ;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,QAAQ;AACrC;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2B;;;;;;;;;;;;;;;;ACtD3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,OAAO;AAC7C,gBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE2B;;;;;;;;;;;;;;;;;;;AChCuE;;AAElG;AACA;AACA,4CAA4C,2DAAgB;AAC5D;AACA;AACA;AACA,IAAI,2DAAgB;AACpB,SAAS,2DAAgB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,iEAAsB;AAClC,YAAY,iEAAsB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEsD;;;;;;;;;;;;;;;;;;ACzDG;;AAEzD,+BAA+B,8DAAe;AAC9C,iCAAiC,8DAAe;;AAEI;;;;;;;;;;;;;;;;;;;ACLX;AACgB;AACX;;AAE9C;AACA;AACA,iBAAiB,uDAAK,aAAa,uDAAK;AACxC,QAAQ,iEAAkB;AAC1B,iBAAiB,iEAAkB;AACnC;AACA;AACA,8BAA8B,yDAAQ;AACtC;AACA;AACA;AACA;AACA;AACA;;AAEwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnB4J;AAC3I;AACA;AACA;AACgC;AACpB;AACA;AACS;;AAE9D;AACA,mBAAmB,uDAAK;AACxB,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,0EAAkB;AAC9C,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0EAA0E,8DAAW;AACrF,IAAI,0EAAa;AACjB;AACA,sCAAsC,8DAAW;AACjD,oBAAoB,+DAAM;AAC1B;AACA;AACA,oBAAoB,mBAAmB;AACvC;AACA;AACA,wDAAwD,0DAAQ;AAChE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,kBAAkB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,sDAAY;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,0DAAW;AACxC;AACA;AACA,oBAAoB,iEAAkB;AACtC,oBAAoB,+DAAgB;AACpC;AACA,6BAA6B,8DAAe;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,8DAAe;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,KAAK,EAAE,oBAAoB;AACnD,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,QAAQ,6DAAc;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,qEAAsB;AAC/B;AACA;AACA;AACA,8BAA8B,4DAAa;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC,uDAAK;AACtC;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,uDAAK;AAC1B;AACA;AACA;AACA,mBAAmB,uDAAK;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEiN;;;;;;;;;;;;;;;;;;;AC5R5J;AACZ;AACuI;;AAEhL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,kBAAkB;AAC7B,YAAY,+BAA+B;AAC3C;AACA;AACA,4CAA4C,kCAAkC;AAC9E;AACA,kBAAkB,8DAAY;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,8DAAW;AAC/B;AACA,UAAU,OAAO,EAAE,sDAAS;AAC5B;AACA,WAAW,sEAAoB;AAC/B;AACA,WAAW,iEAAe;AAC1B;AACA,yBAAyB,oEAAkB;AAC3C;AACA;AACA;AACA;AACA,IAAI,mEAAiB;AACrB;AACA,IAAI,oEAAkB;AACtB;AACA,IAAI,6DAAW;AACf;AACA,WAAW,gEAAc;AACzB;;AAEkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzEoC;AAC4H;AACzI;AACA;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,QAAQ;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,+DAAY;AACxC,eAAe,8DAAiB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,yDAAY;AACtD,aAAa;AACb;AACA;AACA;AACA;AACA,sBAAsB,+DAAkB;AACxC;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,sBAAsB,+DAAkB;AACxC;AACA,aAAa;AACb;AACA;AACA;AACA,8BAA8B,2DAAc;AAC5C,aAAa;AACb;AACA;AACA;AACA,0CAA0C,0DAAa;AACvD,aAAa;AACb;AACA;AACA;AACA,0CAA0C,0DAAa;AACvD,aAAa;AACb;AACA;AACA;AACA,0CAA0C,0DAAa;AACvD,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,iEAAoB;AACtD;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,kCAAkC,6DAAgB;AAClD;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,4BAA4B,+DAAY;AACxC;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB,EAAE,+DAAkB;AACzD,oBAAoB,mBAAmB,EAAE,mEAAsB;AAC/D;AACA;AACA,6CAA6C,sDAAY;AACzD;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,2DAAc;AACrC;AACA;AACA;AACA,4BAA4B,yDAAY;AACxC;AACA;AACA,6BAA6B,uDAAK;AAClC;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEqK;;;;;;;;;;;;;;;;;ACnMrK;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEkD;;;;;;;;;;;;;;;;;ACZI;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,8DAAe;AACjC;AACA;AACA;AACA;AACA;AACA,CAAC;;AAE2B;;;;;;;;;;;;;;;;;;AC/ukBsB;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,0DAAQ;AACtB;AACA,CAAC;;AAEqC;;;;;;;;;;;;;;;;;;ACznEY;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,0DAAQ;AACtB;AACA,CAAC;;AAEqC;;;;;;;;;;;;;;;;;;AClVY;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,0DAAQ;AACtB;AACA,CAAC;;AAEqC;;;;;;;;;;;;;;;;;;ACxkDY;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,0DAAQ;AACtB;AACA,CAAC;;AAEqC;;;;;;;;;;;;;;;;;;;;;;AC5BY;AACX;AACA;AACA;AACA;AACQ;;AAE/C;AACA,OAAO,gDAAQ;AACf,OAAO,gDAAQ;AACf,OAAO,gDAAQ;AACf,OAAO,gDAAQ;AACf,OAAO,2DAAiB;AACxB,OAAO,wDAAc;AACrB;;AAE0B;;;;;;;;;;;;;;;;;;;;;;;;;;AChBwB;AACC;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,OAAO,EAAE,IAAI;AACzC,8BAA8B,iBAAiB,EAAE,mBAAmB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,+DAAY;AACxB,cAAc,0DAAQ;AACtB;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEyK;;;;;;;;;;;;;;;;;;;AChLvH;AACC;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C,+DAAY;AAC3D,YAAY,+DAAY;AACxB,cAAc,0DAAQ;AACtB;AACA,CAAC;;AAE8C;;;;;;;;;;;;;;;;;;UC1f/C;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WC/BA;WACA;WACA;WACA,eAAe,4BAA4B;WAC3C,eAAe;WACf,iCAAiC,WAAW;WAC5C;WACA,E;;;;;WCPA,uDAAuD,qCAAqC,kBAAkB;WAC9G;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,sDAAsD;WACtD,sCAAsC,mGAAmG;WACzI,8DAA8D,wBAAwB,uBAAuB;WAC7G;WACA,+BAA+B;WAC/B;WACA;WACA,E;;;;;WCzBA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,2CAA2C,0CAA0C;WACrF,MAAM;WACN,2CAA2C,gCAAgC;WAC3E;WACA,KAAK,yBAAyB;WAC9B;WACA,GAAG;WACH;WACA;WACA,0CAA0C,wCAAwC;WAClF;WACA;WACA;WACA,E;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,EAAE;WACF,E;;;;;WCRA;WACA;WACA;WACA;WACA,E;;;;;WCJA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC,I;;;;;WCPD,8CAA8C,yD;;;;;WCA9C;WACA;WACA;WACA;WACA,uBAAuB,4BAA4B;WACnD;WACA;WACA;WACA,iBAAiB,oBAAoB;WACrC;WACA,mGAAmG,YAAY;WAC/G;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,4CAA4C,mBAAmB;WAC/D;WACA;WACA,mEAAmE,iCAAiC;WACpG;WACA;WACA;WACA,E;;;;;WCxCA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;WCNA;WACA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","sources":["webpack://tinode-webapp/./node_modules/@firebase/util/dist/index.esm.js","webpack://tinode-webapp/./src/config.js","webpack://tinode-webapp/./src/constants.js","webpack://tinode-webapp/./src/lib/blob-helpers.js","webpack://tinode-webapp/./src/lib/formatters.js","webpack://tinode-webapp/./src/lib/host-name.js","webpack://tinode-webapp/./src/lib/im-api.js","webpack://tinode-webapp/./src/lib/local-storage.js","webpack://tinode-webapp/./src/lib/navigation.js","webpack://tinode-webapp/./src/lib/strformat.js","webpack://tinode-webapp/./src/lib/use-cached-data.js","webpack://tinode-webapp/./src/lib/utils.js","webpack://tinode-webapp/./src/version.js","webpack://tinode-webapp/./src/views/acc-general-view.jsx","webpack://tinode-webapp/./src/views/acc-notifications-view.jsx","webpack://tinode-webapp/./src/views/acc-support-view.jsx","webpack://tinode-webapp/./src/views/auth-onboarding-view.jsx","webpack://tinode-webapp/./src/views/call-experience-view.jsx","webpack://tinode-webapp/./src/views/contact-management-view.jsx","webpack://tinode-webapp/./src/views/contacts-view.jsx","webpack://tinode-webapp/./src/views/content-library-view.jsx","webpack://tinode-webapp/./src/views/direct-message-view.jsx","webpack://tinode-webapp/./src/views/group-management-view.jsx","webpack://tinode-webapp/./src/views/login-view.jsx","webpack://tinode-webapp/./src/views/message-center-view.jsx","webpack://tinode-webapp/./src/views/message-composer-view.jsx","webpack://tinode-webapp/./src/views/new-topic-view.jsx","webpack://tinode-webapp/./src/views/personal-settings-view.jsx","webpack://tinode-webapp/./src/views/security-support-view.jsx","webpack://tinode-webapp/./src/views/settings-view.jsx","webpack://tinode-webapp/./src/views/sidepanel-view.jsx","webpack://tinode-webapp/./src/views/tinode-web.jsx","webpack://tinode-webapp/./src/views/topic-common-view.jsx","webpack://tinode-webapp/./src/views/validation-view.jsx","webpack://tinode-webapp/./src/views/workplace-collaboration-view.jsx","webpack://tinode-webapp/./src/widgets/alert.jsx","webpack://tinode-webapp/./src/widgets/audio-player.jsx","webpack://tinode-webapp/./src/widgets/avatar-crop.jsx","webpack://tinode-webapp/./src/widgets/avatar-upload.jsx","webpack://tinode-webapp/./src/widgets/badge-list.jsx","webpack://tinode-webapp/./src/widgets/batch-forward-dialog.jsx","webpack://tinode-webapp/./src/widgets/button-back.jsx","webpack://tinode-webapp/./src/widgets/call-incoming.jsx","webpack://tinode-webapp/./src/widgets/call-message.jsx","webpack://tinode-webapp/./src/widgets/call-status.jsx","webpack://tinode-webapp/./src/widgets/checkbox.jsx","webpack://tinode-webapp/./src/widgets/chip-input.jsx","webpack://tinode-webapp/./src/widgets/chip.jsx","webpack://tinode-webapp/./src/widgets/contact-action.jsx","webpack://tinode-webapp/./src/widgets/contact-badges.jsx","webpack://tinode-webapp/./src/widgets/contact-list.jsx","webpack://tinode-webapp/./src/widgets/contact.jsx","webpack://tinode-webapp/./src/widgets/context-menu.jsx","webpack://tinode-webapp/./src/widgets/cropper.jsx","webpack://tinode-webapp/./src/widgets/error-panel.jsx","webpack://tinode-webapp/./src/widgets/file-progress.jsx","webpack://tinode-webapp/./src/widgets/forward-dialog.jsx","webpack://tinode-webapp/./src/widgets/host-selector.jsx","webpack://tinode-webapp/./src/widgets/in-place-edit.jsx","webpack://tinode-webapp/./src/widgets/inline-video.jsx","webpack://tinode-webapp/./src/widgets/lazy-image.jsx","webpack://tinode-webapp/./src/widgets/letter-tile.jsx","webpack://tinode-webapp/./src/widgets/load-spinner.jsx","webpack://tinode-webapp/./src/widgets/menu-cancel.jsx","webpack://tinode-webapp/./src/widgets/menu-contacts.jsx","webpack://tinode-webapp/./src/widgets/menu-start.jsx","webpack://tinode-webapp/./src/widgets/new-topic-by-id.jsx","webpack://tinode-webapp/./src/widgets/new-topic-group.jsx","webpack://tinode-webapp/./src/widgets/qr-scanner.jsx","webpack://tinode-webapp/./src/widgets/search-contacts.jsx","webpack://tinode-webapp/./src/widgets/side-navbar.jsx","webpack://tinode-webapp/./src/widgets/tag-manager.jsx","webpack://tinode-webapp/./src/widgets/the-card-mini.jsx","webpack://tinode-webapp/./src/widgets/topic-desc-edit.jsx","webpack://tinode-webapp/./src/widgets/unread-badge.jsx","webpack://tinode-webapp/./src/widgets/uploading-image.jsx","webpack://tinode-webapp/./src/widgets/visible-password.jsx","webpack://tinode-webapp/./node_modules/jsqr/dist/jsQR.js","webpack://tinode-webapp/./node_modules/react-dom/client.js","webpack://tinode-webapp/./node_modules/react/cjs/react-jsx-dev-runtime.development.js","webpack://tinode-webapp/./node_modules/react/jsx-dev-runtime.js","webpack://tinode-webapp/external var \"QRCode\"","webpack://tinode-webapp/external var \"React\"","webpack://tinode-webapp/external var \"ReactDOM\"","webpack://tinode-webapp/external var \"ReactIntl\"","webpack://tinode-webapp/external var \"tinode\"","webpack://tinode-webapp/./node_modules/@firebase/app/dist/esm/index.esm.js","webpack://tinode-webapp/./node_modules/@firebase/component/dist/esm/index.esm.js","webpack://tinode-webapp/./node_modules/@firebase/installations/dist/esm/index.esm.js","webpack://tinode-webapp/./node_modules/@firebase/logger/dist/esm/index.esm.js","webpack://tinode-webapp/./node_modules/@firebase/messaging/dist/esm/index.esm.js","webpack://tinode-webapp/./node_modules/@firebase/util/dist/postinstall.mjs","webpack://tinode-webapp/./node_modules/firebase/app/dist/esm/index.esm.js","webpack://tinode-webapp/./node_modules/firebase/messaging/dist/esm/index.esm.js","webpack://tinode-webapp/./node_modules/idb/build/index.js","webpack://tinode-webapp/./node_modules/idb/build/wrap-idb-value.js","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/common/constant.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/common/segmentit/index.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/common/segmentit/max-probability.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/common/segmentit/min-tokenization.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/common/segmentit/reverse-max-match.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/common/utils.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/core/custom/state.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/core/pinyin/all.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/core/pinyin/handle.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/core/pinyin/index.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/core/pinyin/middlewares.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/core/traditional/index.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/data/dict1.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/data/dict2.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/data/dict3.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/data/dict4.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/data/dict5.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/data/patterns.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/data/special.mjs","webpack://tinode-webapp/./node_modules/pinyin-pro/dist/esm/data/surname.mjs","webpack://tinode-webapp/webpack/bootstrap","webpack://tinode-webapp/webpack/runtime/compat get default export","webpack://tinode-webapp/webpack/runtime/create fake namespace object","webpack://tinode-webapp/webpack/runtime/define property getters","webpack://tinode-webapp/webpack/runtime/ensure chunk","webpack://tinode-webapp/webpack/runtime/get javascript chunk filename","webpack://tinode-webapp/webpack/runtime/global","webpack://tinode-webapp/webpack/runtime/hasOwnProperty shorthand","webpack://tinode-webapp/webpack/runtime/load script","webpack://tinode-webapp/webpack/runtime/make namespace object","webpack://tinode-webapp/webpack/runtime/set anonymous default export name","webpack://tinode-webapp/webpack/runtime/publicPath","webpack://tinode-webapp/webpack/runtime/jsonp chunk loading","webpack://tinode-webapp/./src/index.js"],"sourcesContent":["import { getDefaultsFromPostinstall } from './postinstall.mjs';\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Firebase constants. Some of these (@defines) can be overridden at compile-time.\n */\nconst CONSTANTS = {\n /**\n * @define {boolean} Whether this is the client Node.js SDK.\n */\n NODE_CLIENT: false,\n /**\n * @define {boolean} Whether this is the Admin Node.js SDK.\n */\n NODE_ADMIN: false,\n /**\n * Firebase SDK Version\n */\n SDK_VERSION: '${JSCORE_VERSION}'\n};\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Throws an error if the provided assertion is falsy\n */\nconst assert = function (assertion, message) {\n if (!assertion) {\n throw assertionError(message);\n }\n};\n/**\n * Returns an Error object suitable for throwing.\n */\nconst assertionError = function (message) {\n return new Error('Firebase Database (' +\n CONSTANTS.SDK_VERSION +\n ') INTERNAL ASSERT FAILED: ' +\n message);\n};\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst stringToByteArray$1 = function (str) {\n // TODO(user): Use native implementations if/when available\n const out = [];\n let p = 0;\n for (let i = 0; i < str.length; i++) {\n let c = str.charCodeAt(i);\n if (c < 128) {\n out[p++] = c;\n }\n else if (c < 2048) {\n out[p++] = (c >> 6) | 192;\n out[p++] = (c & 63) | 128;\n }\n else if ((c & 0xfc00) === 0xd800 &&\n i + 1 < str.length &&\n (str.charCodeAt(i + 1) & 0xfc00) === 0xdc00) {\n // Surrogate Pair\n c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);\n out[p++] = (c >> 18) | 240;\n out[p++] = ((c >> 12) & 63) | 128;\n out[p++] = ((c >> 6) & 63) | 128;\n out[p++] = (c & 63) | 128;\n }\n else {\n out[p++] = (c >> 12) | 224;\n out[p++] = ((c >> 6) & 63) | 128;\n out[p++] = (c & 63) | 128;\n }\n }\n return out;\n};\n/**\n * Turns an array of numbers into the string given by the concatenation of the\n * characters to which the numbers correspond.\n * @param bytes Array of numbers representing characters.\n * @return Stringification of the array.\n */\nconst byteArrayToString = function (bytes) {\n // TODO(user): Use native implementations if/when available\n const out = [];\n let pos = 0, c = 0;\n while (pos < bytes.length) {\n const c1 = bytes[pos++];\n if (c1 < 128) {\n out[c++] = String.fromCharCode(c1);\n }\n else if (c1 > 191 && c1 < 224) {\n const c2 = bytes[pos++];\n out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));\n }\n else if (c1 > 239 && c1 < 365) {\n // Surrogate Pair\n const c2 = bytes[pos++];\n const c3 = bytes[pos++];\n const c4 = bytes[pos++];\n const u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) -\n 0x10000;\n out[c++] = String.fromCharCode(0xd800 + (u >> 10));\n out[c++] = String.fromCharCode(0xdc00 + (u & 1023));\n }\n else {\n const c2 = bytes[pos++];\n const c3 = bytes[pos++];\n out[c++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n }\n }\n return out.join('');\n};\n// We define it as an object literal instead of a class because a class compiled down to es5 can't\n// be treeshaked. https://github.com/rollup/rollup/issues/1691\n// Static lookup maps, lazily populated by init_()\n// TODO(dlarocque): Define this as a class, since we no longer target ES5.\nconst base64 = {\n /**\n * Maps bytes to characters.\n */\n byteToCharMap_: null,\n /**\n * Maps characters to bytes.\n */\n charToByteMap_: null,\n /**\n * Maps bytes to websafe characters.\n * @private\n */\n byteToCharMapWebSafe_: null,\n /**\n * Maps websafe characters to bytes.\n * @private\n */\n charToByteMapWebSafe_: null,\n /**\n * Our default alphabet, shared between\n * ENCODED_VALS and ENCODED_VALS_WEBSAFE\n */\n ENCODED_VALS_BASE: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '0123456789',\n /**\n * Our default alphabet. Value 64 (=) is special; it means \"nothing.\"\n */\n get ENCODED_VALS() {\n return this.ENCODED_VALS_BASE + '+/=';\n },\n /**\n * Our websafe alphabet.\n */\n get ENCODED_VALS_WEBSAFE() {\n return this.ENCODED_VALS_BASE + '-_.';\n },\n /**\n * Whether this browser supports the atob and btoa functions. This extension\n * started at Mozilla but is now implemented by many browsers. We use the\n * ASSUME_* variables to avoid pulling in the full useragent detection library\n * but still allowing the standard per-browser compilations.\n *\n */\n HAS_NATIVE_SUPPORT: typeof atob === 'function',\n /**\n * Base64-encode an array of bytes.\n *\n * @param input An array of bytes (numbers with\n * value in [0, 255]) to encode.\n * @param webSafe Boolean indicating we should use the\n * alternative alphabet.\n * @return The base64 encoded string.\n */\n encodeByteArray(input, webSafe) {\n if (!Array.isArray(input)) {\n throw Error('encodeByteArray takes an array as a parameter');\n }\n this.init_();\n const byteToCharMap = webSafe\n ? this.byteToCharMapWebSafe_\n : this.byteToCharMap_;\n const output = [];\n for (let i = 0; i < input.length; i += 3) {\n const byte1 = input[i];\n const haveByte2 = i + 1 < input.length;\n const byte2 = haveByte2 ? input[i + 1] : 0;\n const haveByte3 = i + 2 < input.length;\n const byte3 = haveByte3 ? input[i + 2] : 0;\n const outByte1 = byte1 >> 2;\n const outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);\n let outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6);\n let outByte4 = byte3 & 0x3f;\n if (!haveByte3) {\n outByte4 = 64;\n if (!haveByte2) {\n outByte3 = 64;\n }\n }\n output.push(byteToCharMap[outByte1], byteToCharMap[outByte2], byteToCharMap[outByte3], byteToCharMap[outByte4]);\n }\n return output.join('');\n },\n /**\n * Base64-encode a string.\n *\n * @param input A string to encode.\n * @param webSafe If true, we should use the\n * alternative alphabet.\n * @return The base64 encoded string.\n */\n encodeString(input, webSafe) {\n // Shortcut for Mozilla browsers that implement\n // a native base64 encoder in the form of \"btoa/atob\"\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\n return btoa(input);\n }\n return this.encodeByteArray(stringToByteArray$1(input), webSafe);\n },\n /**\n * Base64-decode a string.\n *\n * @param input to decode.\n * @param webSafe True if we should use the\n * alternative alphabet.\n * @return string representing the decoded value.\n */\n decodeString(input, webSafe) {\n // Shortcut for Mozilla browsers that implement\n // a native base64 encoder in the form of \"btoa/atob\"\n if (this.HAS_NATIVE_SUPPORT && !webSafe) {\n return atob(input);\n }\n return byteArrayToString(this.decodeStringToByteArray(input, webSafe));\n },\n /**\n * Base64-decode a string.\n *\n * In base-64 decoding, groups of four characters are converted into three\n * bytes. If the encoder did not apply padding, the input length may not\n * be a multiple of 4.\n *\n * In this case, the last group will have fewer than 4 characters, and\n * padding will be inferred. If the group has one or two characters, it decodes\n * to one byte. If the group has three characters, it decodes to two bytes.\n *\n * @param input Input to decode.\n * @param webSafe True if we should use the web-safe alphabet.\n * @return bytes representing the decoded value.\n */\n decodeStringToByteArray(input, webSafe) {\n this.init_();\n const charToByteMap = webSafe\n ? this.charToByteMapWebSafe_\n : this.charToByteMap_;\n const output = [];\n for (let i = 0; i < input.length;) {\n const byte1 = charToByteMap[input.charAt(i++)];\n const haveByte2 = i < input.length;\n const byte2 = haveByte2 ? charToByteMap[input.charAt(i)] : 0;\n ++i;\n const haveByte3 = i < input.length;\n const byte3 = haveByte3 ? charToByteMap[input.charAt(i)] : 64;\n ++i;\n const haveByte4 = i < input.length;\n const byte4 = haveByte4 ? charToByteMap[input.charAt(i)] : 64;\n ++i;\n if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) {\n throw new DecodeBase64StringError();\n }\n const outByte1 = (byte1 << 2) | (byte2 >> 4);\n output.push(outByte1);\n if (byte3 !== 64) {\n const outByte2 = ((byte2 << 4) & 0xf0) | (byte3 >> 2);\n output.push(outByte2);\n if (byte4 !== 64) {\n const outByte3 = ((byte3 << 6) & 0xc0) | byte4;\n output.push(outByte3);\n }\n }\n }\n return output;\n },\n /**\n * Lazy static initialization function. Called before\n * accessing any of the static map variables.\n * @private\n */\n init_() {\n if (!this.byteToCharMap_) {\n this.byteToCharMap_ = {};\n this.charToByteMap_ = {};\n this.byteToCharMapWebSafe_ = {};\n this.charToByteMapWebSafe_ = {};\n // We want quick mappings back and forth, so we precompute two maps.\n for (let i = 0; i < this.ENCODED_VALS.length; i++) {\n this.byteToCharMap_[i] = this.ENCODED_VALS.charAt(i);\n this.charToByteMap_[this.byteToCharMap_[i]] = i;\n this.byteToCharMapWebSafe_[i] = this.ENCODED_VALS_WEBSAFE.charAt(i);\n this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i]] = i;\n // Be forgiving when decoding and correctly decode both encodings.\n if (i >= this.ENCODED_VALS_BASE.length) {\n this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i)] = i;\n this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i)] = i;\n }\n }\n }\n }\n};\n/**\n * An error encountered while decoding base64 string.\n */\nclass DecodeBase64StringError extends Error {\n constructor() {\n super(...arguments);\n this.name = 'DecodeBase64StringError';\n }\n}\n/**\n * URL-safe base64 encoding\n */\nconst base64Encode = function (str) {\n const utf8Bytes = stringToByteArray$1(str);\n return base64.encodeByteArray(utf8Bytes, true);\n};\n/**\n * URL-safe base64 encoding (without \".\" padding in the end).\n * e.g. Used in JSON Web Token (JWT) parts.\n */\nconst base64urlEncodeWithoutPadding = function (str) {\n // Use base64url encoding and remove padding in the end (dot characters).\n return base64Encode(str).replace(/\\./g, '');\n};\n/**\n * URL-safe base64 decoding\n *\n * NOTE: DO NOT use the global atob() function - it does NOT support the\n * base64Url variant encoding.\n *\n * @param str To be decoded\n * @return Decoded result, if possible\n */\nconst base64Decode = function (str) {\n try {\n return base64.decodeString(str, true);\n }\n catch (e) {\n console.error('base64Decode failed: ', e);\n }\n return null;\n};\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Do a deep-copy of basic JavaScript Objects or Arrays.\n */\nfunction deepCopy(value) {\n return deepExtend(undefined, value);\n}\n/**\n * Copy properties from source to target (recursively allows extension\n * of Objects and Arrays). Scalar values in the target are over-written.\n * If target is undefined, an object of the appropriate type will be created\n * (and returned).\n *\n * We recursively copy all child properties of plain Objects in the source- so\n * that namespace- like dictionaries are merged.\n *\n * Note that the target can be a function, in which case the properties in\n * the source Object are copied onto it as static properties of the Function.\n *\n * Note: we don't merge __proto__ to prevent prototype pollution\n */\nfunction deepExtend(target, source) {\n if (!(source instanceof Object)) {\n return source;\n }\n switch (source.constructor) {\n case Date:\n // Treat Dates like scalars; if the target date object had any child\n // properties - they will be lost!\n const dateValue = source;\n return new Date(dateValue.getTime());\n case Object:\n if (target === undefined) {\n target = {};\n }\n break;\n case Array:\n // Always copy the array source and overwrite the target.\n target = [];\n break;\n default:\n // Not a plain Object - treat it as a scalar.\n return source;\n }\n for (const prop in source) {\n // use isValidKey to guard against prototype pollution. See https://snyk.io/vuln/SNYK-JS-LODASH-450202\n if (!source.hasOwnProperty(prop) || !isValidKey(prop)) {\n continue;\n }\n target[prop] = deepExtend(target[prop], source[prop]);\n }\n return target;\n}\nfunction isValidKey(key) {\n return key !== '__proto__';\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Polyfill for `globalThis` object.\n * @returns the `globalThis` object for the given environment.\n * @public\n */\nfunction getGlobal() {\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n throw new Error('Unable to locate global object.');\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst getDefaultsFromGlobal = () => getGlobal().__FIREBASE_DEFAULTS__;\n/**\n * Attempt to read defaults from a JSON string provided to\n * process(.)env(.)__FIREBASE_DEFAULTS__ or a JSON file whose path is in\n * process(.)env(.)__FIREBASE_DEFAULTS_PATH__\n * The dots are in parens because certain compilers (Vite?) cannot\n * handle seeing that variable in comments.\n * See https://github.com/firebase/firebase-js-sdk/issues/6838\n */\nconst getDefaultsFromEnvVariable = () => {\n if (typeof process === 'undefined' || typeof process.env === 'undefined') {\n return;\n }\n const defaultsJsonString = process.env.__FIREBASE_DEFAULTS__;\n if (defaultsJsonString) {\n return JSON.parse(defaultsJsonString);\n }\n};\nconst getDefaultsFromCookie = () => {\n if (typeof document === 'undefined') {\n return;\n }\n let match;\n try {\n match = document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/);\n }\n catch (e) {\n // Some environments such as Angular Universal SSR have a\n // `document` object but error on accessing `document.cookie`.\n return;\n }\n const decoded = match && base64Decode(match[1]);\n return decoded && JSON.parse(decoded);\n};\n/**\n * Get the __FIREBASE_DEFAULTS__ object. It checks in order:\n * (1) if such an object exists as a property of `globalThis`\n * (2) if such an object was provided on a shell environment variable\n * (3) if such an object exists in a cookie\n * @public\n */\nconst getDefaults = () => {\n try {\n return (getDefaultsFromPostinstall() ||\n getDefaultsFromGlobal() ||\n getDefaultsFromEnvVariable() ||\n getDefaultsFromCookie());\n }\n catch (e) {\n /**\n * Catch-all for being unable to get __FIREBASE_DEFAULTS__ due\n * to any environment case we have not accounted for. Log to\n * info instead of swallowing so we can find these unknown cases\n * and add paths for them if needed.\n */\n console.info(`Unable to get __FIREBASE_DEFAULTS__ due to: ${e}`);\n return;\n }\n};\n/**\n * Returns emulator host stored in the __FIREBASE_DEFAULTS__ object\n * for the given product.\n * @returns a URL host formatted like `127.0.0.1:9999` or `[::1]:4000` if available\n * @public\n */\nconst getDefaultEmulatorHost = (productName) => getDefaults()?.emulatorHosts?.[productName];\n/**\n * Returns emulator hostname and port stored in the __FIREBASE_DEFAULTS__ object\n * for the given product.\n * @returns a pair of hostname and port like `[\"::1\", 4000]` if available\n * @public\n */\nconst getDefaultEmulatorHostnameAndPort = (productName) => {\n const host = getDefaultEmulatorHost(productName);\n if (!host) {\n return undefined;\n }\n const separatorIndex = host.lastIndexOf(':'); // Finding the last since IPv6 addr also has colons.\n if (separatorIndex <= 0 || separatorIndex + 1 === host.length) {\n throw new Error(`Invalid host ${host} with no separate hostname and port!`);\n }\n // eslint-disable-next-line no-restricted-globals\n const port = parseInt(host.substring(separatorIndex + 1), 10);\n if (host[0] === '[') {\n // Bracket-quoted `[ipv6addr]:port` => return \"ipv6addr\" (without brackets).\n return [host.substring(1, separatorIndex - 1), port];\n }\n else {\n return [host.substring(0, separatorIndex), port];\n }\n};\n/**\n * Returns Firebase app config stored in the __FIREBASE_DEFAULTS__ object.\n * @public\n */\nconst getDefaultAppConfig = () => getDefaults()?.config;\n/**\n * Returns an experimental setting on the __FIREBASE_DEFAULTS__ object (properties\n * prefixed by \"_\")\n * @public\n */\nconst getExperimentalSetting = (name) => getDefaults()?.[`_${name}`];\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nclass Deferred {\n constructor() {\n this.reject = () => { };\n this.resolve = () => { };\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n /**\n * Our API internals are not promisified and cannot because our callback APIs have subtle expectations around\n * invoking promises inline, which Promises are forbidden to do. This method accepts an optional node-style callback\n * and returns a node-style callback which will resolve or reject the Deferred's promise.\n */\n wrapCallback(callback) {\n return (error, value) => {\n if (error) {\n this.reject(error);\n }\n else {\n this.resolve(value);\n }\n if (typeof callback === 'function') {\n // Attaching noop handler just in case developer wasn't expecting\n // promises\n this.promise.catch(() => { });\n // Some of our callbacks don't expect a value and our own tests\n // assert that the parameter length is 1\n if (callback.length === 1) {\n callback(error);\n }\n else {\n callback(error, value);\n }\n }\n };\n }\n}\n\n/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction createMockUserToken(token, projectId) {\n if (token.uid) {\n throw new Error('The \"uid\" field is no longer supported by mockUserToken. Please use \"sub\" instead for Firebase Auth User ID.');\n }\n // Unsecured JWTs use \"none\" as the algorithm.\n const header = {\n alg: 'none',\n type: 'JWT'\n };\n const project = projectId || 'demo-project';\n const iat = token.iat || 0;\n const sub = token.sub || token.user_id;\n if (!sub) {\n throw new Error(\"mockUserToken must contain 'sub' or 'user_id' field!\");\n }\n const payload = {\n // Set all required fields to decent defaults\n iss: `https://securetoken.google.com/${project}`,\n aud: project,\n iat,\n exp: iat + 3600,\n auth_time: iat,\n sub,\n user_id: sub,\n firebase: {\n sign_in_provider: 'custom',\n identities: {}\n },\n // Override with user options\n ...token\n };\n // Unsecured JWTs use the empty string as a signature.\n const signature = '';\n return [\n base64urlEncodeWithoutPadding(JSON.stringify(header)),\n base64urlEncodeWithoutPadding(JSON.stringify(payload)),\n signature\n ].join('.');\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Returns navigator.userAgent string or '' if it's not defined.\n * @return user agent string\n */\nfunction getUA() {\n if (typeof navigator !== 'undefined' &&\n typeof navigator['userAgent'] === 'string') {\n return navigator['userAgent'];\n }\n else {\n return '';\n }\n}\n/**\n * Detect Cordova / PhoneGap / Ionic frameworks on a mobile device.\n *\n * Deliberately does not rely on checking `file://` URLs (as this fails PhoneGap\n * in the Ripple emulator) nor Cordova `onDeviceReady`, which would normally\n * wait for a callback.\n */\nfunction isMobileCordova() {\n return (typeof window !== 'undefined' &&\n // @ts-ignore Setting up an broadly applicable index signature for Window\n // just to deal with this case would probably be a bad idea.\n !!(window['cordova'] || window['phonegap'] || window['PhoneGap']) &&\n /ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(getUA()));\n}\n/**\n * Detect Node.js.\n *\n * @return true if Node.js environment is detected or specified.\n */\n// Node detection logic from: https://github.com/iliakan/detect-node/\nfunction isNode() {\n const forceEnvironment = getDefaults()?.forceEnvironment;\n if (forceEnvironment === 'node') {\n return true;\n }\n else if (forceEnvironment === 'browser') {\n return false;\n }\n try {\n return (Object.prototype.toString.call(global.process) === '[object process]');\n }\n catch (e) {\n return false;\n }\n}\n/**\n * Detect Browser Environment.\n * Note: This will return true for certain test frameworks that are incompletely\n * mimicking a browser, and should not lead to assuming all browser APIs are\n * available.\n */\nfunction isBrowser() {\n return typeof window !== 'undefined' || isWebWorker();\n}\n/**\n * Detect Web Worker context.\n */\nfunction isWebWorker() {\n return (typeof WorkerGlobalScope !== 'undefined' &&\n typeof self !== 'undefined' &&\n self instanceof WorkerGlobalScope);\n}\n/**\n * Detect Cloudflare Worker context.\n */\nfunction isCloudflareWorker() {\n return (typeof navigator !== 'undefined' &&\n navigator.userAgent === 'Cloudflare-Workers');\n}\nfunction isBrowserExtension() {\n const runtime = typeof chrome === 'object'\n ? chrome.runtime\n : typeof browser === 'object'\n ? browser.runtime\n : undefined;\n return typeof runtime === 'object' && runtime.id !== undefined;\n}\n/**\n * Detect React Native.\n *\n * @return true if ReactNative environment is detected.\n */\nfunction isReactNative() {\n return (typeof navigator === 'object' && navigator['product'] === 'ReactNative');\n}\n/** Detects Electron apps. */\nfunction isElectron() {\n return getUA().indexOf('Electron/') >= 0;\n}\n/** Detects Internet Explorer. */\nfunction isIE() {\n const ua = getUA();\n return ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;\n}\n/** Detects Universal Windows Platform apps. */\nfunction isUWP() {\n return getUA().indexOf('MSAppHost/') >= 0;\n}\n/**\n * Detect whether the current SDK build is the Node version.\n *\n * @return true if it's the Node SDK build.\n */\nfunction isNodeSdk() {\n return CONSTANTS.NODE_CLIENT === true || CONSTANTS.NODE_ADMIN === true;\n}\n/** Returns true if we are running in Safari. */\nfunction isSafari() {\n return (!isNode() &&\n !!navigator.userAgent &&\n navigator.userAgent.includes('Safari') &&\n !navigator.userAgent.includes('Chrome'));\n}\n/** Returns true if we are running in Safari or WebKit */\nfunction isSafariOrWebkit() {\n return (!isNode() &&\n !!navigator.userAgent &&\n (navigator.userAgent.includes('Safari') ||\n navigator.userAgent.includes('WebKit')) &&\n !navigator.userAgent.includes('Chrome'));\n}\n/**\n * This method checks if indexedDB is supported by current browser/service worker context\n * @return true if indexedDB is supported by current browser/service worker context\n */\nfunction isIndexedDBAvailable() {\n try {\n return typeof indexedDB === 'object';\n }\n catch (e) {\n return false;\n }\n}\n/**\n * This method validates browser/sw context for indexedDB by opening a dummy indexedDB database and reject\n * if errors occur during the database open operation.\n *\n * @throws exception if current browser/sw context can't run idb.open (ex: Safari iframe, Firefox\n * private browsing)\n */\nfunction validateIndexedDBOpenable() {\n return new Promise((resolve, reject) => {\n try {\n let preExist = true;\n const DB_CHECK_NAME = 'validate-browser-context-for-indexeddb-analytics-module';\n const request = self.indexedDB.open(DB_CHECK_NAME);\n request.onsuccess = () => {\n request.result.close();\n // delete database only when it doesn't pre-exist\n if (!preExist) {\n self.indexedDB.deleteDatabase(DB_CHECK_NAME);\n }\n resolve(true);\n };\n request.onupgradeneeded = () => {\n preExist = false;\n };\n request.onerror = () => {\n reject(request.error?.message || '');\n };\n }\n catch (error) {\n reject(error);\n }\n });\n}\n/**\n *\n * This method checks whether cookie is enabled within current browser\n * @return true if cookie is enabled within current browser\n */\nfunction areCookiesEnabled() {\n if (typeof navigator === 'undefined' || !navigator.cookieEnabled) {\n return false;\n }\n return true;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Standardized Firebase Error.\n *\n * Usage:\n *\n * // TypeScript string literals for type-safe codes\n * type Err =\n * 'unknown' |\n * 'object-not-found'\n * ;\n *\n * // Closure enum for type-safe error codes\n * // at-enum {string}\n * var Err = {\n * UNKNOWN: 'unknown',\n * OBJECT_NOT_FOUND: 'object-not-found',\n * }\n *\n * let errors: Map = {\n * 'generic-error': \"Unknown error\",\n * 'file-not-found': \"Could not find file: {$file}\",\n * };\n *\n * // Type-safe function - must pass a valid error code as param.\n * let error = new ErrorFactory('service', 'Service', errors);\n *\n * ...\n * throw error.create(Err.GENERIC);\n * ...\n * throw error.create(Err.FILE_NOT_FOUND, {'file': fileName});\n * ...\n * // Service: Could not file file: foo.txt (service/file-not-found).\n *\n * catch (e) {\n * assert(e.message === \"Could not find file: foo.txt.\");\n * if ((e as FirebaseError)?.code === 'service/file-not-found') {\n * console.log(\"Could not read file: \" + e['file']);\n * }\n * }\n */\nconst ERROR_NAME = 'FirebaseError';\n// Based on code from:\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types\nclass FirebaseError extends Error {\n constructor(\n /** The error code for this error. */\n code, message, \n /** Custom data for this error. */\n customData) {\n super(message);\n this.code = code;\n this.customData = customData;\n /** The custom name for all FirebaseErrors. */\n this.name = ERROR_NAME;\n // Fix For ES5\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n // TODO(dlarocque): Replace this with `new.target`: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html#support-for-newtarget\n // which we can now use since we no longer target ES5.\n Object.setPrototypeOf(this, FirebaseError.prototype);\n // Maintains proper stack trace for where our error was thrown.\n // Only available on V8.\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ErrorFactory.prototype.create);\n }\n }\n}\nclass ErrorFactory {\n constructor(service, serviceName, errors) {\n this.service = service;\n this.serviceName = serviceName;\n this.errors = errors;\n }\n create(code, ...data) {\n const customData = data[0] || {};\n const fullCode = `${this.service}/${code}`;\n const template = this.errors[code];\n const message = template ? replaceTemplate(template, customData) : 'Error';\n // Service Name: Error message (service/code).\n const fullMessage = `${this.serviceName}: ${message} (${fullCode}).`;\n const error = new FirebaseError(fullCode, fullMessage, customData);\n return error;\n }\n}\nfunction replaceTemplate(template, data) {\n return template.replace(PATTERN, (_, key) => {\n const value = data[key];\n return value != null ? String(value) : `<${key}?>`;\n });\n}\nconst PATTERN = /\\{\\$([^}]+)}/g;\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Evaluates a JSON string into a javascript object.\n *\n * @param {string} str A string containing JSON.\n * @return {*} The javascript object representing the specified JSON.\n */\nfunction jsonEval(str) {\n return JSON.parse(str);\n}\n/**\n * Returns JSON representing a javascript object.\n * @param {*} data JavaScript object to be stringified.\n * @return {string} The JSON contents of the object.\n */\nfunction stringify(data) {\n return JSON.stringify(data);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Decodes a Firebase auth. token into constituent parts.\n *\n * Notes:\n * - May return with invalid / incomplete claims if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nconst decode = function (token) {\n let header = {}, claims = {}, data = {}, signature = '';\n try {\n const parts = token.split('.');\n header = jsonEval(base64Decode(parts[0]) || '');\n claims = jsonEval(base64Decode(parts[1]) || '');\n signature = parts[2];\n data = claims['d'] || {};\n delete claims['d'];\n }\n catch (e) { }\n return {\n header,\n claims,\n data,\n signature\n };\n};\n/**\n * Decodes a Firebase auth. token and checks the validity of its time-based claims. Will return true if the\n * token is within the time window authorized by the 'nbf' (not-before) and 'iat' (issued-at) claims.\n *\n * Notes:\n * - May return a false negative if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nconst isValidTimestamp = function (token) {\n const claims = decode(token).claims;\n const now = Math.floor(new Date().getTime() / 1000);\n let validSince = 0, validUntil = 0;\n if (typeof claims === 'object') {\n if (claims.hasOwnProperty('nbf')) {\n validSince = claims['nbf'];\n }\n else if (claims.hasOwnProperty('iat')) {\n validSince = claims['iat'];\n }\n if (claims.hasOwnProperty('exp')) {\n validUntil = claims['exp'];\n }\n else {\n // token will expire after 24h by default\n validUntil = validSince + 86400;\n }\n }\n return (!!now &&\n !!validSince &&\n !!validUntil &&\n now >= validSince &&\n now <= validUntil);\n};\n/**\n * Decodes a Firebase auth. token and returns its issued at time if valid, null otherwise.\n *\n * Notes:\n * - May return null if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nconst issuedAtTime = function (token) {\n const claims = decode(token).claims;\n if (typeof claims === 'object' && claims.hasOwnProperty('iat')) {\n return claims['iat'];\n }\n return null;\n};\n/**\n * Decodes a Firebase auth. token and checks the validity of its format. Expects a valid issued-at time.\n *\n * Notes:\n * - May return a false negative if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nconst isValidFormat = function (token) {\n const decoded = decode(token), claims = decoded.claims;\n return !!claims && typeof claims === 'object' && claims.hasOwnProperty('iat');\n};\n/**\n * Attempts to peer into an auth token and determine if it's an admin auth token by looking at the claims portion.\n *\n * Notes:\n * - May return a false negative if there's no native base64 decoding support.\n * - Doesn't check if the token is actually valid.\n */\nconst isAdmin = function (token) {\n const claims = decode(token).claims;\n return typeof claims === 'object' && claims['admin'] === true;\n};\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction contains(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\nfunction safeGet(obj, key) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n return obj[key];\n }\n else {\n return undefined;\n }\n}\nfunction isEmpty(obj) {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n return false;\n }\n }\n return true;\n}\nfunction map(obj, fn, contextObj) {\n const res = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n res[key] = fn.call(contextObj, obj[key], key, obj);\n }\n }\n return res;\n}\n/**\n * Deep equal two objects. Support Arrays and Objects.\n */\nfunction deepEqual(a, b) {\n if (a === b) {\n return true;\n }\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n for (const k of aKeys) {\n if (!bKeys.includes(k)) {\n return false;\n }\n const aProp = a[k];\n const bProp = b[k];\n if (isObject(aProp) && isObject(bProp)) {\n if (!deepEqual(aProp, bProp)) {\n return false;\n }\n }\n else if (aProp !== bProp) {\n return false;\n }\n }\n for (const k of bKeys) {\n if (!aKeys.includes(k)) {\n return false;\n }\n }\n return true;\n}\nfunction isObject(thing) {\n return thing !== null && typeof thing === 'object';\n}\n\n/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Rejects if the given promise doesn't resolve in timeInMS milliseconds.\n * @internal\n */\nfunction promiseWithTimeout(promise, timeInMS = 2000) {\n const deferredPromise = new Deferred();\n setTimeout(() => deferredPromise.reject('timeout!'), timeInMS);\n promise.then(deferredPromise.resolve, deferredPromise.reject);\n return deferredPromise.promise;\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Returns a querystring-formatted string (e.g. &arg=val&arg2=val2) from a\n * params object (e.g. {arg: 'val', arg2: 'val2'})\n * Note: You must prepend it with ? when adding it to a URL.\n */\nfunction querystring(querystringParams) {\n const params = [];\n for (const [key, value] of Object.entries(querystringParams)) {\n if (Array.isArray(value)) {\n value.forEach(arrayVal => {\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(arrayVal));\n });\n }\n else {\n params.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n }\n }\n return params.length ? '&' + params.join('&') : '';\n}\n/**\n * Decodes a querystring (e.g. ?arg=val&arg2=val2) into a params object\n * (e.g. {arg: 'val', arg2: 'val2'})\n */\nfunction querystringDecode(querystring) {\n const obj = {};\n const tokens = querystring.replace(/^\\?/, '').split('&');\n tokens.forEach(token => {\n if (token) {\n const [key, value] = token.split('=');\n obj[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n });\n return obj;\n}\n/**\n * Extract the query string part of a URL, including the leading question mark (if present).\n */\nfunction extractQuerystring(url) {\n const queryStart = url.indexOf('?');\n if (!queryStart) {\n return '';\n }\n const fragmentStart = url.indexOf('#', queryStart);\n return url.substring(queryStart, fragmentStart > 0 ? fragmentStart : undefined);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview SHA-1 cryptographic hash.\n * Variable names follow the notation in FIPS PUB 180-3:\n * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf.\n *\n * Usage:\n * var sha1 = new sha1();\n * sha1.update(bytes);\n * var hash = sha1.digest();\n *\n * Performance:\n * Chrome 23: ~400 Mbit/s\n * Firefox 16: ~250 Mbit/s\n *\n */\n/**\n * SHA-1 cryptographic hash constructor.\n *\n * The properties declared here are discussed in the above algorithm document.\n * @constructor\n * @final\n * @struct\n */\nclass Sha1 {\n constructor() {\n /**\n * Holds the previous values of accumulated variables a-e in the compress_\n * function.\n * @private\n */\n this.chain_ = [];\n /**\n * A buffer holding the partially computed hash result.\n * @private\n */\n this.buf_ = [];\n /**\n * An array of 80 bytes, each a part of the message to be hashed. Referred to\n * as the message schedule in the docs.\n * @private\n */\n this.W_ = [];\n /**\n * Contains data needed to pad messages less than 64 bytes.\n * @private\n */\n this.pad_ = [];\n /**\n * @private {number}\n */\n this.inbuf_ = 0;\n /**\n * @private {number}\n */\n this.total_ = 0;\n this.blockSize = 512 / 8;\n this.pad_[0] = 128;\n for (let i = 1; i < this.blockSize; ++i) {\n this.pad_[i] = 0;\n }\n this.reset();\n }\n reset() {\n this.chain_[0] = 0x67452301;\n this.chain_[1] = 0xefcdab89;\n this.chain_[2] = 0x98badcfe;\n this.chain_[3] = 0x10325476;\n this.chain_[4] = 0xc3d2e1f0;\n this.inbuf_ = 0;\n this.total_ = 0;\n }\n /**\n * Internal compress helper function.\n * @param buf Block to compress.\n * @param offset Offset of the block in the buffer.\n * @private\n */\n compress_(buf, offset) {\n if (!offset) {\n offset = 0;\n }\n const W = this.W_;\n // get 16 big endian words\n if (typeof buf === 'string') {\n for (let i = 0; i < 16; i++) {\n // TODO(user): [bug 8140122] Recent versions of Safari for Mac OS and iOS\n // have a bug that turns the post-increment ++ operator into pre-increment\n // during JIT compilation. We have code that depends heavily on SHA-1 for\n // correctness and which is affected by this bug, so I've removed all uses\n // of post-increment ++ in which the result value is used. We can revert\n // this change once the Safari bug\n // (https://bugs.webkit.org/show_bug.cgi?id=109036) has been fixed and\n // most clients have been updated.\n W[i] =\n (buf.charCodeAt(offset) << 24) |\n (buf.charCodeAt(offset + 1) << 16) |\n (buf.charCodeAt(offset + 2) << 8) |\n buf.charCodeAt(offset + 3);\n offset += 4;\n }\n }\n else {\n for (let i = 0; i < 16; i++) {\n W[i] =\n (buf[offset] << 24) |\n (buf[offset + 1] << 16) |\n (buf[offset + 2] << 8) |\n buf[offset + 3];\n offset += 4;\n }\n }\n // expand to 80 words\n for (let i = 16; i < 80; i++) {\n const t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff;\n }\n let a = this.chain_[0];\n let b = this.chain_[1];\n let c = this.chain_[2];\n let d = this.chain_[3];\n let e = this.chain_[4];\n let f, k;\n // TODO(user): Try to unroll this loop to speed up the computation.\n for (let i = 0; i < 80; i++) {\n if (i < 40) {\n if (i < 20) {\n f = d ^ (b & (c ^ d));\n k = 0x5a827999;\n }\n else {\n f = b ^ c ^ d;\n k = 0x6ed9eba1;\n }\n }\n else {\n if (i < 60) {\n f = (b & c) | (d & (b | c));\n k = 0x8f1bbcdc;\n }\n else {\n f = b ^ c ^ d;\n k = 0xca62c1d6;\n }\n }\n const t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff;\n e = d;\n d = c;\n c = ((b << 30) | (b >>> 2)) & 0xffffffff;\n b = a;\n a = t;\n }\n this.chain_[0] = (this.chain_[0] + a) & 0xffffffff;\n this.chain_[1] = (this.chain_[1] + b) & 0xffffffff;\n this.chain_[2] = (this.chain_[2] + c) & 0xffffffff;\n this.chain_[3] = (this.chain_[3] + d) & 0xffffffff;\n this.chain_[4] = (this.chain_[4] + e) & 0xffffffff;\n }\n update(bytes, length) {\n // TODO(johnlenz): tighten the function signature and remove this check\n if (bytes == null) {\n return;\n }\n if (length === undefined) {\n length = bytes.length;\n }\n const lengthMinusBlock = length - this.blockSize;\n let n = 0;\n // Using local instead of member variables gives ~5% speedup on Firefox 16.\n const buf = this.buf_;\n let inbuf = this.inbuf_;\n // The outer while loop should execute at most twice.\n while (n < length) {\n // When we have no data in the block to top up, we can directly process the\n // input buffer (assuming it contains sufficient data). This gives ~25%\n // speedup on Chrome 23 and ~15% speedup on Firefox 16, but requires that\n // the data is provided in large chunks (or in multiples of 64 bytes).\n if (inbuf === 0) {\n while (n <= lengthMinusBlock) {\n this.compress_(bytes, n);\n n += this.blockSize;\n }\n }\n if (typeof bytes === 'string') {\n while (n < length) {\n buf[inbuf] = bytes.charCodeAt(n);\n ++inbuf;\n ++n;\n if (inbuf === this.blockSize) {\n this.compress_(buf);\n inbuf = 0;\n // Jump to the outer loop so we use the full-block optimization.\n break;\n }\n }\n }\n else {\n while (n < length) {\n buf[inbuf] = bytes[n];\n ++inbuf;\n ++n;\n if (inbuf === this.blockSize) {\n this.compress_(buf);\n inbuf = 0;\n // Jump to the outer loop so we use the full-block optimization.\n break;\n }\n }\n }\n }\n this.inbuf_ = inbuf;\n this.total_ += length;\n }\n /** @override */\n digest() {\n const digest = [];\n let totalBits = this.total_ * 8;\n // Add pad 0x80 0x00*.\n if (this.inbuf_ < 56) {\n this.update(this.pad_, 56 - this.inbuf_);\n }\n else {\n this.update(this.pad_, this.blockSize - (this.inbuf_ - 56));\n }\n // Add # bits.\n for (let i = this.blockSize - 1; i >= 56; i--) {\n this.buf_[i] = totalBits & 255;\n totalBits /= 256; // Don't use bit-shifting here!\n }\n this.compress_(this.buf_);\n let n = 0;\n for (let i = 0; i < 5; i++) {\n for (let j = 24; j >= 0; j -= 8) {\n digest[n] = (this.chain_[i] >> j) & 255;\n ++n;\n }\n }\n return digest;\n }\n}\n\n/**\n * Helper to make a Subscribe function (just like Promise helps make a\n * Thenable).\n *\n * @param executor Function which can make calls to a single Observer\n * as a proxy.\n * @param onNoObservers Callback when count of Observers goes to zero.\n */\nfunction createSubscribe(executor, onNoObservers) {\n const proxy = new ObserverProxy(executor, onNoObservers);\n return proxy.subscribe.bind(proxy);\n}\n/**\n * Implement fan-out for any number of Observers attached via a subscribe\n * function.\n */\nclass ObserverProxy {\n /**\n * @param executor Function which can make calls to a single Observer\n * as a proxy.\n * @param onNoObservers Callback when count of Observers goes to zero.\n */\n constructor(executor, onNoObservers) {\n this.observers = [];\n this.unsubscribes = [];\n this.observerCount = 0;\n // Micro-task scheduling by calling task.then().\n this.task = Promise.resolve();\n this.finalized = false;\n this.onNoObservers = onNoObservers;\n // Call the executor asynchronously so subscribers that are called\n // synchronously after the creation of the subscribe function\n // can still receive the very first value generated in the executor.\n this.task\n .then(() => {\n executor(this);\n })\n .catch(e => {\n this.error(e);\n });\n }\n next(value) {\n this.forEachObserver((observer) => {\n observer.next(value);\n });\n }\n error(error) {\n this.forEachObserver((observer) => {\n observer.error(error);\n });\n this.close(error);\n }\n complete() {\n this.forEachObserver((observer) => {\n observer.complete();\n });\n this.close();\n }\n /**\n * Subscribe function that can be used to add an Observer to the fan-out list.\n *\n * - We require that no event is sent to a subscriber synchronously to their\n * call to subscribe().\n */\n subscribe(nextOrObserver, error, complete) {\n let observer;\n if (nextOrObserver === undefined &&\n error === undefined &&\n complete === undefined) {\n throw new Error('Missing Observer.');\n }\n // Assemble an Observer object when passed as callback functions.\n if (implementsAnyMethods(nextOrObserver, [\n 'next',\n 'error',\n 'complete'\n ])) {\n observer = nextOrObserver;\n }\n else {\n observer = {\n next: nextOrObserver,\n error,\n complete\n };\n }\n if (observer.next === undefined) {\n observer.next = noop;\n }\n if (observer.error === undefined) {\n observer.error = noop;\n }\n if (observer.complete === undefined) {\n observer.complete = noop;\n }\n const unsub = this.unsubscribeOne.bind(this, this.observers.length);\n // Attempt to subscribe to a terminated Observable - we\n // just respond to the Observer with the final error or complete\n // event.\n if (this.finalized) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.task.then(() => {\n try {\n if (this.finalError) {\n observer.error(this.finalError);\n }\n else {\n observer.complete();\n }\n }\n catch (e) {\n // nothing\n }\n return;\n });\n }\n this.observers.push(observer);\n return unsub;\n }\n // Unsubscribe is synchronous - we guarantee that no events are sent to\n // any unsubscribed Observer.\n unsubscribeOne(i) {\n if (this.observers === undefined || this.observers[i] === undefined) {\n return;\n }\n delete this.observers[i];\n this.observerCount -= 1;\n if (this.observerCount === 0 && this.onNoObservers !== undefined) {\n this.onNoObservers(this);\n }\n }\n forEachObserver(fn) {\n if (this.finalized) {\n // Already closed by previous event....just eat the additional values.\n return;\n }\n // Since sendOne calls asynchronously - there is no chance that\n // this.observers will become undefined.\n for (let i = 0; i < this.observers.length; i++) {\n this.sendOne(i, fn);\n }\n }\n // Call the Observer via one of it's callback function. We are careful to\n // confirm that the observe has not been unsubscribed since this asynchronous\n // function had been queued.\n sendOne(i, fn) {\n // Execute the callback asynchronously\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.task.then(() => {\n if (this.observers !== undefined && this.observers[i] !== undefined) {\n try {\n fn(this.observers[i]);\n }\n catch (e) {\n // Ignore exceptions raised in Observers or missing methods of an\n // Observer.\n // Log error to console. b/31404806\n if (typeof console !== 'undefined' && console.error) {\n console.error(e);\n }\n }\n }\n });\n }\n close(err) {\n if (this.finalized) {\n return;\n }\n this.finalized = true;\n if (err !== undefined) {\n this.finalError = err;\n }\n // Proxy is no longer needed - garbage collect references\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.task.then(() => {\n this.observers = undefined;\n this.onNoObservers = undefined;\n });\n }\n}\n/** Turn synchronous function into one called asynchronously. */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction async(fn, onError) {\n return (...args) => {\n Promise.resolve(true)\n .then(() => {\n fn(...args);\n })\n .catch((error) => {\n if (onError) {\n onError(error);\n }\n });\n };\n}\n/**\n * Return true if the object passed in implements any of the named methods.\n */\nfunction implementsAnyMethods(obj, methods) {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n for (const method of methods) {\n if (method in obj && typeof obj[method] === 'function') {\n return true;\n }\n }\n return false;\n}\nfunction noop() {\n // do nothing\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Check to make sure the appropriate number of arguments are provided for a public function.\n * Throws an error if it fails.\n *\n * @param fnName The function name\n * @param minCount The minimum number of arguments to allow for the function call\n * @param maxCount The maximum number of argument to allow for the function call\n * @param argCount The actual number of arguments provided.\n */\nconst validateArgCount = function (fnName, minCount, maxCount, argCount) {\n let argError;\n if (argCount < minCount) {\n argError = 'at least ' + minCount;\n }\n else if (argCount > maxCount) {\n argError = maxCount === 0 ? 'none' : 'no more than ' + maxCount;\n }\n if (argError) {\n const error = fnName +\n ' failed: Was called with ' +\n argCount +\n (argCount === 1 ? ' argument.' : ' arguments.') +\n ' Expects ' +\n argError +\n '.';\n throw new Error(error);\n }\n};\n/**\n * Generates a string to prefix an error message about failed argument validation\n *\n * @param fnName The function name\n * @param argName The name of the argument\n * @return The prefix to add to the error thrown for validation.\n */\nfunction errorPrefix(fnName, argName) {\n return `${fnName} failed: ${argName} argument `;\n}\n/**\n * @param fnName\n * @param argumentNumber\n * @param namespace\n * @param optional\n */\nfunction validateNamespace(fnName, namespace, optional) {\n if (optional && !namespace) {\n return;\n }\n if (typeof namespace !== 'string') {\n //TODO: I should do more validation here. We only allow certain chars in namespaces.\n throw new Error(errorPrefix(fnName, 'namespace') + 'must be a valid firebase namespace.');\n }\n}\nfunction validateCallback(fnName, argumentName, \n// eslint-disable-next-line @typescript-eslint/ban-types\ncallback, optional) {\n if (optional && !callback) {\n return;\n }\n if (typeof callback !== 'function') {\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid function.');\n }\n}\nfunction validateContextObject(fnName, argumentName, context, optional) {\n if (optional && !context) {\n return;\n }\n if (typeof context !== 'object' || context === null) {\n throw new Error(errorPrefix(fnName, argumentName) + 'must be a valid context object.');\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// Code originally came from goog.crypt.stringToUtf8ByteArray, but for some reason they\n// automatically replaced '\\r\\n' with '\\n', and they didn't handle surrogate pairs,\n// so it's been modified.\n// Note that not all Unicode characters appear as single characters in JavaScript strings.\n// fromCharCode returns the UTF-16 encoding of a character - so some Unicode characters\n// use 2 characters in JavaScript. All 4-byte UTF-8 characters begin with a first\n// character in the range 0xD800 - 0xDBFF (the first character of a so-called surrogate\n// pair).\n// See http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3\n/**\n * @param {string} str\n * @return {Array}\n */\nconst stringToByteArray = function (str) {\n const out = [];\n let p = 0;\n for (let i = 0; i < str.length; i++) {\n let c = str.charCodeAt(i);\n // Is this the lead surrogate in a surrogate pair?\n if (c >= 0xd800 && c <= 0xdbff) {\n const high = c - 0xd800; // the high 10 bits.\n i++;\n assert(i < str.length, 'Surrogate pair missing trail surrogate.');\n const low = str.charCodeAt(i) - 0xdc00; // the low 10 bits.\n c = 0x10000 + (high << 10) + low;\n }\n if (c < 128) {\n out[p++] = c;\n }\n else if (c < 2048) {\n out[p++] = (c >> 6) | 192;\n out[p++] = (c & 63) | 128;\n }\n else if (c < 65536) {\n out[p++] = (c >> 12) | 224;\n out[p++] = ((c >> 6) & 63) | 128;\n out[p++] = (c & 63) | 128;\n }\n else {\n out[p++] = (c >> 18) | 240;\n out[p++] = ((c >> 12) & 63) | 128;\n out[p++] = ((c >> 6) & 63) | 128;\n out[p++] = (c & 63) | 128;\n }\n }\n return out;\n};\n/**\n * Calculate length without actually converting; useful for doing cheaper validation.\n * @param {string} str\n * @return {number}\n */\nconst stringLength = function (str) {\n let p = 0;\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c < 128) {\n p++;\n }\n else if (c < 2048) {\n p += 2;\n }\n else if (c >= 0xd800 && c <= 0xdbff) {\n // Lead surrogate of a surrogate pair. The pair together will take 4 bytes to represent.\n p += 4;\n i++; // skip trail surrogate.\n }\n else {\n p += 3;\n }\n }\n return p;\n};\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The amount of milliseconds to exponentially increase.\n */\nconst DEFAULT_INTERVAL_MILLIS = 1000;\n/**\n * The factor to backoff by.\n * Should be a number greater than 1.\n */\nconst DEFAULT_BACKOFF_FACTOR = 2;\n/**\n * The maximum milliseconds to increase to.\n *\n * Visible for testing\n */\nconst MAX_VALUE_MILLIS = 4 * 60 * 60 * 1000; // Four hours, like iOS and Android.\n/**\n * The percentage of backoff time to randomize by.\n * See\n * http://go/safe-client-behavior#step-1-determine-the-appropriate-retry-interval-to-handle-spike-traffic\n * for context.\n *\n *
Visible for testing\n */\nconst RANDOM_FACTOR = 0.5;\n/**\n * Based on the backoff method from\n * https://github.com/google/closure-library/blob/master/closure/goog/math/exponentialbackoff.js.\n * Extracted here so we don't need to pass metadata and a stateful ExponentialBackoff object around.\n */\nfunction calculateBackoffMillis(backoffCount, intervalMillis = DEFAULT_INTERVAL_MILLIS, backoffFactor = DEFAULT_BACKOFF_FACTOR) {\n // Calculates an exponentially increasing value.\n // Deviation: calculates value from count and a constant interval, so we only need to save value\n // and count to restore state.\n const currBaseValue = intervalMillis * Math.pow(backoffFactor, backoffCount);\n // A random \"fuzz\" to avoid waves of retries.\n // Deviation: randomFactor is required.\n const randomWait = Math.round(\n // A fraction of the backoff value to add/subtract.\n // Deviation: changes multiplication order to improve readability.\n RANDOM_FACTOR *\n currBaseValue *\n // A random float (rounded to int by Math.round above) in the range [-1, 1]. Determines\n // if we add or subtract.\n (Math.random() - 0.5) *\n 2);\n // Limits backoff to max to avoid effectively permanent backoff.\n return Math.min(MAX_VALUE_MILLIS, currBaseValue + randomWait);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Provide English ordinal letters after a number\n */\nfunction ordinal(i) {\n if (!Number.isFinite(i)) {\n return `${i}`;\n }\n return i + indicator(i);\n}\nfunction indicator(i) {\n i = Math.abs(i);\n const cent = i % 100;\n if (cent >= 10 && cent <= 20) {\n return 'th';\n }\n const dec = i % 10;\n if (dec === 1) {\n return 'st';\n }\n if (dec === 2) {\n return 'nd';\n }\n if (dec === 3) {\n return 'rd';\n }\n return 'th';\n}\n\n/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction getModularInstance(service) {\n if (service && service._delegate) {\n return service._delegate;\n }\n else {\n return service;\n }\n}\n\n/**\n * @license\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Checks whether host is a cloud workstation or not.\n * @public\n */\nfunction isCloudWorkstation(url) {\n // `isCloudWorkstation` is called without protocol in certain connect*Emulator functions\n // In HTTP request builders, it's called with the protocol.\n // If called with protocol prefix, it's a valid URL, so we extract the hostname\n // If called without, we assume the string is the hostname.\n try {\n const host = url.startsWith('http://') || url.startsWith('https://')\n ? new URL(url).hostname\n : url;\n return host.endsWith('.cloudworkstations.dev');\n }\n catch {\n return false;\n }\n}\n/**\n * Makes a fetch request to the given server.\n * Mostly used for forwarding cookies in Firebase Studio.\n * @public\n */\nasync function pingServer(endpoint) {\n const result = await fetch(endpoint, {\n credentials: 'include'\n });\n return result.ok;\n}\n\n/**\n * @license\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @public\n * Generates a SHA-256 hash for the given input string.\n *\n * @param input The string to hash.\n * @returns A promise that resolves to the SHA-256 hash as a hex string.\n */\nasync function generateSHA256Hash(input) {\n const textEncoder = new TextEncoder();\n const data = textEncoder.encode(input);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n // Convert ArrayBuffer to hex string\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hexHash = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n return hexHash;\n}\n\nexport { CONSTANTS, DecodeBase64StringError, Deferred, ErrorFactory, FirebaseError, MAX_VALUE_MILLIS, RANDOM_FACTOR, Sha1, areCookiesEnabled, assert, assertionError, async, base64, base64Decode, base64Encode, base64urlEncodeWithoutPadding, calculateBackoffMillis, contains, createMockUserToken, createSubscribe, decode, deepCopy, deepEqual, deepExtend, errorPrefix, extractQuerystring, generateSHA256Hash, getDefaultAppConfig, getDefaultEmulatorHost, getDefaultEmulatorHostnameAndPort, getDefaults, getExperimentalSetting, getGlobal, getModularInstance, getUA, isAdmin, isBrowser, isBrowserExtension, isCloudWorkstation, isCloudflareWorker, isElectron, isEmpty, isIE, isIndexedDBAvailable, isMobileCordova, isNode, isNodeSdk, isReactNative, isSafari, isSafariOrWebkit, isUWP, isValidFormat, isValidTimestamp, isWebWorker, issuedAtTime, jsonEval, map, ordinal, pingServer, promiseWithTimeout, querystring, querystringDecode, safeGet, stringLength, stringToByteArray, stringify, validateArgCount, validateCallback, validateContextObject, validateIndexedDBOpenable, validateNamespace };\n//# sourceMappingURL=index.esm.js.map\n","import { PACKAGE_VERSION } from './version.js';\n\n// Version-independent name of this application, used for Firebase app name and shown to users\n// (about page, youth-mode copy).\nexport const BASE_APP_NAME = 'MeetingIM';\n// Name of this application, used in the User-Agent.\nexport const APP_NAME = BASE_APP_NAME + '/' + (PACKAGE_VERSION || '0.25');\n\n// API key. Use https://github.com/tinode/chat/tree/master/keygen to generate your own.\n// Injected at build time via webpack DefinePlugin from the TINODE_API_KEY env var\n// (see webpack.config.js and .env.local). Falls back to the public sample key when unset,\n// which only works against a backend still using the matching sample API_KEY_SALT.\nexport const API_KEY = process.env.TINODE_API_KEY || 'AQEAAAABAAD_rAp4DJh05a1HAwFT3A6K';\n\n// The array of possible hosts to connect to.\nexport const KNOWN_HOSTS = {hosted: 'web.tinode.co', local: 'localhost:6060'};\n\n// Default host name and port to connect to.\nexport const DEFAULT_HOST = KNOWN_HOSTS.hosted;\n\n// Enable console logging.\nexport const LOGGING_ENABLED = true;\n\n// Minimum time between two keypress notifications, milliseconds.\nexport const KEYPRESS_DELAY = 3_000;\n// Delay before sending a read notification, milliseconds.\nexport const READ_DELAY = 1_500;\n\n// The default shortest allowed tag length. Matches the value on the server.\nexport const MIN_TAG_LENGTH = 2;\n// The default greatest allowed tag length. Matches the value on the server.\nexport const MAX_TAG_LENGTH = 96;\n// The default maximum number of tags allowed. Matches the value on the server.\nexport const MAX_TAG_COUNT = 16;\n\n// Access mode for P2P subscriptions initiated by the current user.\nexport const DEFAULT_P2P_ACCESS_MODE = 'JRWPS';\n// Access mode for new group topics created by the current user.\nexport const NEW_GRP_ACCESS_MODE = 'JRWPSAO';\n// Access mode for a channel.\nexport const CHANNEL_ACCESS_MODE = 'JR';\n\n// Access mode for no access.\nexport const NO_ACCESS_MODE = 'N';\n\n// Mediaquery breakpoint between desktop and mobile, in px. Should match the value\n// in @media (max-size: 640px) in base.css\nexport const MEDIA_BREAKPOINT = 640;\n// Size of css 'rem' unit in pixels. Default 1rem = 10pt = 13px.\nexport const REM_SIZE = 13;\n\n// Size of the avatar image: when image dimensions are greater or the image is not square, it's resized to\n// a square of this size or less.\nexport const AVATAR_SIZE = 384;\n\n// Maximum size of an avatar in bytes for sending in-band. Bigger avatars will be sent out of band (as uploads).\nexport const MAX_AVATAR_BYTES = 4096;\n\n// Size of the broken_image shown in MessagesView\nexport const BROKEN_IMAGE_SIZE = 32;\n\n// Size of video preview when dimensions are missing.\nexport const NO_DIMENSIONS_VIDEO = 128;\n\n// Number of chat messages to fetch in one call.\nexport const MESSAGES_PAGE = 24;\n\n// Default maximum in-band (included directly into the message) attachment size which fits into\n// a message of 256K in size. Used when the server-provided value is unavailable. The actual\n// binary size of the attachment should be smaller due to base64 encoding expansion and some overhead,\n// for instance 1024 bytes.\n// Increase this limit to a greater value in production, if desired. Also increase\n// max_message_size in the server config.\nexport const MAX_INBAND_ATTACHMENT_SIZE = 262_144;\n\n// Default absolute maximum attachment size to be used with the server = 8MB.\n// Used when the server-provided value is unavailable. Increase to something like 100MB in production.\nexport const MAX_EXTERN_ATTACHMENT_SIZE = 1 << 23;\n\n// Maximum allowed linear dimension (pixels) of an image sent inline. Larger images will be shrunk\n// to make the larger dimension fit under this size. You may want to adjust it to 1600 or\n// 2400 for production.\nexport const MAX_IMAGE_DIM = 1024;\n\n// Linear dimensions of image preview: shrink image under this size for previews.\nexport const IMAGE_PREVIEW_DIM = 64;\n\n// Linear dimensions of video screencapture: shrink image under this size for previews.\nexport const VIDEO_PREVIEW_DIM = 96;\n\n// Linear dimensions of image thumbnail: shrink image under this size for thumbnails in reply quote previews.\nexport const IMAGE_THUMBNAIL_DIM = 36;\n// Width of video thumbnail: allow it to be wider, but not taller. Use IMAGE_THUMBNAIL_DIM for height.\nexport const VIDEO_THUMBNAIL_WIDTH = 48;\n\n// Maximum number of online users to be shown in a topic title bar. Others will be\n// hidden under \"+X more\"\nexport const MAX_ONLINE_IN_TOPIC = 4;\n\n// Maximum length of user name, topic title, and private comment.\nexport const MAX_TITLE_LENGTH = 60;\n// Maximum length of topic description.\nexport const MAX_TOPIC_DESCRIPTION_LENGTH = 360;\n// Maximum length of user name when displaying a video call.\nexport const MAX_PEER_TITLE_LENGTH = 24;\n\n// Length of message previews in chat list, in characters.\nexport const MESSAGE_PREVIEW_LENGTH = 80;\n\n// Length of a quote in quoted reply (for outgoing messages).\nexport const QUOTED_REPLY_LENGTH = 30;\n// Length of a preview of a forwarded message.\nexport const FORWARDED_PREVIEW_LENGTH = 84;\n// Length of preview for a message being edited.\nexport const EDIT_PREVIEW_LENGTH = 48;\n\n// Minimum duration of an audio recording in milliseconds (2 sec).\nexport const MIN_DURATION = 2_000;\n// Maximum duration of an audio recording in milliseconds (10 min).\nexport const MAX_DURATION = 600_000;\n\n// Link for \"Contact Us\".\nexport const LINK_CONTACT_US = 'mailto:support@tinode.co';\n\n// Link to Privacy Policy.\nexport const LINK_PRIVACY_POLICY = 'https://tinode.co/privacy.html';\n\n// Link to Terms of Service.\nexport const LINK_TERMS_OF_SERVICE = 'https://tinode.co/terms.html';\n\n// When user starts a P2P topic, automatic subscription does not\n// happen until the first message. Setting this option to true enables\n// immediate subscription.\nexport const IMMEDIATE_P2P_SUBSCRIPTION = false;\n\n// URL schemes permitted to appear in links (i.e. no javascript: scheme).\nexport const CLICKABLE_URL_SCHEMES = ['http', 'https', 'ftp', 'ftps'];\n\n// Size of the QR code in the app.\nexport const QRCODE_SIZE = 128;\n\n// How much time has to pass to consider computer awoken from sleep (80 sec).\n// Chrome throttles ticker events in inactive tabs to once per minute. This\n// value ensures that these once-a-minute events do not trigger a reconnect.\nexport const WAKE_UP_TIMEOUT = 80000;\n// Timer interval between checks if computer woke up from sleep (1 sec).\nexport const WAKE_UP_TICK = 1000;\n\n// Swipe distance to register as a gesture, in pixels.\nexport const MIN_SWIPE_DISTANCE = REM_SIZE * 3;\n\n// Self-topic avatar as an SVG icon encoded as data URI\nexport const SELF_AVATAR_URI = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZpZXdCb3g9IjAgMCAxNyAxNyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMy41NjIgMXYxNS40NTlsNC42ODYtMy4yNyA0Ljc1MiAzLjI2di0xNS40NDloLTkuNDM4ek0xMiAxNC41NTFsLTMuNzU2LTIuNTc4LTMuNjgxIDIuNTY4di0xMi41NDFoNy40Mzd2MTIuNTUxeiIgZmlsbD0iIzU1NTU1NSIgLz48L3N2Zz4=' // eslint-disable-line max-len\n\n// Toast display duration, milliseconds.\nexport const TOAST_DURATION = 3_000;\n\n// Initial/default color scheme.\nexport const DEFAULT_COLOR_SCHEME = 'auto';\n\n// Default text size in points.\nexport const DEFAULT_TEXT_SIZE = 10;\n\n// MIME type for the legacy Drafty form-response data.\nexport const DRAFTY_FR_MIME_TYPE_LEGACY = 'application/json'; // Remove in 2026.\n\n// Path to wallpaper images.\nexport const WALLPAPER_DEFAULTS = {type: 'patt', index: 0, path:'img/bkg/'};\n","// Video call states.\nexport const CALL_STATE_NONE = 0;\nexport const CALL_STATE_OUTGOING_INITATED = 1;\nexport const CALL_STATE_INCOMING_RECEIVED = 2;\nexport const CALL_STATE_IN_PROGRESS = 3;\n\n// Video call message headers representing call state.\nexport const CALL_HEAD_STARTED = 'started';\n\n","// File and image helper functions.\nimport { TheCard } from 'tinode-sdk';\n\n// Supported image MIME types and corresponding file extensions.\nexport const SUPPORTED_IMAGE_FORMATS = ['image/jpeg', 'image/gif', 'image/png', 'image/svg', 'image/svg+xml'];\nexport const MIME_EXTENSIONS = ['jpg', 'gif', 'png', 'svg', 'svg'];\n\n// Get an URL from a theCard photo: either create a data: URL or return reference URL.\nexport function makeImageUrl(photo) {\n if (photo && typeof photo == 'object') {\n if (photo.ref) {\n return photo.ref\n }\n if (photo.data && photo.type) {\n const mime = photo.type.startsWith('image/') ? photo.type : ('image/' + photo.type);\n return 'data:' + mime + ';base64,' + photo.data;\n }\n }\n return null;\n}\n\n// Calculate linear dimensions for scaling image down to fit under a certain size.\n// Returns an object which contains destination sizes, source sizes, and offsets\n// into source (when making square images).\nexport function fitImageSize(width, height, maxWidth, maxHeight, forceSquare) {\n // Sanitize input\n width = width | 0;\n height = height | 0;\n maxWidth = maxWidth | 0;\n maxHeight = maxHeight | 0;\n\n if (width <= 0 || height <= 0 || maxWidth <= 0 || maxHeight <= 0) {\n return null;\n }\n\n if (forceSquare) {\n maxWidth = maxHeight = Math.min(maxWidth, maxHeight);\n }\n\n const scale = Math.min(\n Math.min(width, maxWidth) / width,\n Math.min(height, maxHeight) / height\n );\n\n const size = {\n dstWidth: (width * scale) | 0,\n dstHeight: (height * scale) | 0,\n };\n\n if (forceSquare) {\n // Also calculate parameters for making the image square.\n size.dstWidth = size.dstHeight = Math.min(size.dstWidth, size.dstHeight);\n size.srcWidth = size.srcHeight = Math.min(width, height);\n size.xoffset = ((width - size.srcWidth) / 2) | 0;\n size.yoffset = ((height - size.srcWidth) / 2) | 0;\n } else {\n size.xoffset = size.yoffset = 0;\n size.srcWidth = width;\n size.srcHeight = height;\n }\n return size;\n}\n\n// Ensure file's extension matches mime content type\nexport function fileNameForMime(fname, mime) {\n const idx = SUPPORTED_IMAGE_FORMATS.indexOf(mime);\n if (idx < 0 || !fname) {\n // Unknown mime or empty name.\n return fname;\n }\n const ext = MIME_EXTENSIONS[idx];\n\n const at = fname.lastIndexOf('.');\n if (at >= 0) {\n fname = fname.substring(0, at);\n }\n return fname + '.' + ext;\n}\n\n// Scale uploaded image to fit under certain dimensions and byte size, optionally constraining to a square.\n// Returns a promise which is resolven on success or rejected on failure.\nexport function imageScaled(fileOrBlob, maxWidth, maxHeight, maxSize, forceSquare) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = function(err) {\n reject(new Error(\"Image format unrecognized\"));\n }\n img.onload = async function() {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n // Calculate the desired image dimensions.\n const dim = fitImageSize(img.width, img.height, maxWidth, maxHeight, forceSquare);\n if (!dim) {\n reject(new Error(\"Invalid image\"));\n return;\n }\n let canvas = document.createElement('canvas');\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n\n const mime = SUPPORTED_IMAGE_FORMATS.includes(fileOrBlob.type) ? fileOrBlob.type : 'image/jpeg';\n // Generate blob to check size of the image.\n let blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n if (!blob) {\n reject(new Error(\"Unsupported image format\"));\n return;\n }\n // Ensure the image is not too large. Shrink the image keeping the aspect ratio.\n // Do nothing if maxsize is <= 0.\n while (maxSize > 0 && blob.length > maxSize) {\n dim.dstWidth = (dim.dstWidth * 0.70710678118) | 0;\n dim.dstHeight = (dim.dstHeight * 0.70710678118) | 0;\n canvas.width = dim.dstWidth;\n canvas.height = dim.dstHeight;\n ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, dim.xoffset, dim.yoffset, dim.srcWidth, dim.srcHeight,\n 0, 0, dim.dstWidth, dim.dstHeight);\n blob = await new Promise(resolve => canvas.toBlob(resolve, mime));\n }\n\n canvas = null;\n resolve({mime: mime, blob: blob, width: dim.dstWidth, height: dim.dstHeight, name: fileNameForMime(fileOrBlob.name, mime)});\n };\n img.src = URL.createObjectURL(fileOrBlob);\n });\n}\n\n// Scale and crop image according to specified dimensions.\n// The coordinates are in unscaled image pixels, i.e. cut the rectangle first then scale it.\n// returns a promise.\nexport function imageCrop(mime, objURL, left, top, width, height, scale) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onerror = _ => {\n reject(new Error(\"Image format unrecognized\"));\n };\n img.onload = _ => {\n // Once the image is loaded, the URL is no longer needed.\n URL.revokeObjectURL(img.src);\n\n let canvas = document.createElement('canvas');\n canvas.width = width * scale;\n canvas.height = height * scale;\n let ctx = canvas.getContext('2d');\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(img, left, top, width, height, 0, 0, canvas.width, canvas.height);\n\n mime = SUPPORTED_IMAGE_FORMATS.includes(mime) ? mime : 'image/jpeg';\n // Generate blob to check size of the image.\n canvas.toBlob((blob) => {\n // Allow GC.\n canvas = null;\n if (blob) {\n resolve({mime: mime, blob: blob, width: width, height: height});\n } else {\n reject(new Error(\"Unsupported image format\"));\n }\n }, mime);\n };\n img.src = objURL;\n });\n}\n\n// Convert file to base64 string.\nexport function fileToBase64(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n resolve({mime: file.type, bits: reader.result.split(',')[1], name: file.name});\n };\n reader.readAsDataURL(file);\n });\n}\n\n// Convert Blob to base64 string. Returns a promise resolved with the base64 string and mime.\nexport function blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n resolve({mime: blob.type, bits: reader.result.split(',')[1]});\n };\n reader.readAsDataURL(blob);\n });\n}\n\n// File pasted from the clipboard. It's either an inline image or a file attachment.\nexport function filePasted(event, onImageSuccess, onAttachmentSuccess, onError) {\n const items = (event.clipboardData || event.originalEvent.clipboardData || {}).items;\n if (!items || !items.length) {\n return false;\n }\n\n for (let i in items) {\n const item = items[i];\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (!file) {\n console.error(\"Failed to get file object from pasted file item\", item.kind, item.type);\n onError(\"Failed to get file object from pasted file item\");\n continue;\n }\n if (file.type && file.type.split('/')[0] == 'image') {\n onImageSuccess(file);\n } else {\n onAttachmentSuccess(file);\n }\n // Indicate that the pasted data contains a file.\n return true;\n }\n }\n // No file found.\n return false;\n}\n\n// Get mime type from data URL header.\nexport function getMimeType(header) {\n const mime = /^data:(image\\/[-+a-z0-9.]+);base64/.exec(header);\n return (mime && mime.length > 1) ? mime[1] : null;\n}\n\n// Given length of a binary object in bytes, calculate the length after\n// base64 encoding.\nexport function base64EncodedLen(n) {\n return Math.floor((n + 2) / 3) * 4;\n}\n\n// Given length of a base64-encoded object, calculate decoded size of the\n// pbject in bytes.\nexport function base64DecodedLen(n) {\n return Math.floor(n / 4) * 3;\n}\n\n// Re-encode string to standard base64 encoding with padding.\n// The string may be base64-URL encoded without the padding.\nexport function base64ReEncode(str) {\n if (str) {\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n try {\n str = btoa(atob(str));\n } catch(err) {\n console.error(\"Failed to base64 re-encode string.\", err);\n str = null;\n }\n }\n return str;\n}\n\n// Convert a base64 encoded string with the provided mime type into a Blob.\nexport function base64ToBlob(str, mime) {\n if (!str) {\n return null;\n }\n\n try {\n // Make blob.\n const bin = atob(str);\n const length = bin.length;\n const buf = new ArrayBuffer(length);\n const arr = new Uint8Array(buf);\n for (let i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n\n return new Blob([buf], { type: mime });\n } catch(err) {\n console.error(\"Failed to convert base64 to blob: \", err);\n }\n\n return null;\n}\n\nexport function intArrayToBase64(arr) {\n if (!Array.isArray(arr)) {\n return null;\n }\n try {\n let bin = '';\n new Uint8Array(arr).forEach(b => bin += String.fromCharCode(b));\n return window.btoa(bin);\n } catch (err) {}\n return null;\n}\n\nexport function base64ToIntArray(b64) {\n const arr = [];\n try {\n const bin = window.atob(b64);\n [...bin].forEach(c => {\n arr.push(c.charCodeAt(0));\n });\n return arr;\n } catch (err) {}\n return null;\n}\n\nexport function importVCard(fileOrBlob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = _ => {\n reject(reader.error);\n };\n reader.onload = _ => {\n const card = TheCard.importVCard(reader.result);\n if (!card) {\n reject(new Error(\"Failed to parse vCard\"));\n return;\n }\n resolve(card);\n };\n reader.readAsText(fileOrBlob);\n });\n}\n","import React from 'react';\nimport { defineMessages } from 'react-intl';\n\nimport { Drafty, TheCard } from 'tinode-sdk';\n\nimport AudioPlayer from '../widgets/audio-player.jsx'\nimport CallMessage from '../widgets/call-message.jsx'\nimport CallStatus from '../widgets/call-status.jsx';\nimport InlineVideo from '../widgets/inline-video.jsx';\nimport LazyImage from '../widgets/lazy-image.jsx';\nimport TheCardMini from '../widgets/the-card-mini.jsx';\nimport UploadingImage from '../widgets/uploading-image.jsx'\n\nimport { BROKEN_IMAGE_SIZE, CLICKABLE_URL_SCHEMES, IMAGE_THUMBNAIL_DIM, NO_DIMENSIONS_VIDEO,\n REM_SIZE, VIDEO_THUMBNAIL_WIDTH } from '../config.js';\nimport { base64ToBlob, blobToBase64, fitImageSize, imageScaled } from './blob-helpers.js';\nimport { idToColorClass, secondsToTime, shortenFileName } from './strformat.js';\nimport { cancelablePromise, sanitizeUrl, sanitizeUrlForMime } from './utils.js';\n\nconst messages = defineMessages({\n drafty_form: {\n id: 'drafty_form',\n defaultMessage: 'Form: ',\n description: 'Comment for form in Drafty'\n },\n drafty_attachment: {\n id: 'drafty_attachment',\n defaultMessage: 'Attachment',\n description: 'Comment for attachment in Drafty'\n },\n drafty_image: {\n id: 'drafty_image',\n defaultMessage: 'Picture',\n description: 'Comment for embedded images in Drafty'\n },\n drafty_video: {\n id: 'drafty_video',\n defaultMessage: 'Video recording',\n description: 'Comment for videos embedded in Drafty'\n },\n drafty_unknown: {\n id: 'drafty_unknown',\n defaultMessage: 'Unsupported',\n description: 'Unsupported entity in drafty'\n }\n});\n\n// The main Drafty formatter: converts Drafty elements into React classes. 'this' is set by the caller.\n// 'this' must contain:\n// viewportWidth:\n// authorizeURL:\n// onHandleClick:\nexport function fullFormatter(style, data, values, key, stack) {\n if (stack.includes('QQ')) {\n return quoteFormatter.call(this, style, data, values, key);\n }\n\n if (!style) {\n // Unformatted.\n return values;\n }\n\n let el = Drafty.tagName(style);\n let attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch (style) {\n case 'AU':\n // Show audio player.\n if (attr.src) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'audio'));\n attr.duration = data.duration > 0 ? (data.duration | 0) : undefined;\n attr.preview = data.preview;\n attr.loading = 'lazy';\n // 4.9 语音未读红点:chat-message.jsx 的 onVoicePlayed 记录\"这条语音真的被点开听过\",\n // 跟消息本身有没有被标记已读是两件事。favorites/history 等别处复用同一个 formatter\n // context 没有这个字段时,attr.onPlay 就是 undefined,AudioPlayer 那边本来就把它当\n // 可选 prop 处理,不会因此出问题。\n attr.onPlay = this.onVoicePlayed;\n }\n el = AudioPlayer;\n // Audio element cannot have content.\n values = null;\n break;\n case 'BR':\n values = null;\n break;\n case 'EX':\n // Ignore.\n break;\n case 'HL':\n // Highlighted text. Assign class name.\n attr.className = 'highlight';\n break;\n case 'HD':\n el = null;\n values = null;\n break;\n case 'IM':\n // Additional processing for images\n el = handleImageData.call(this, el, data, attr);\n // Image element cannot have content.\n values = null;\n break;\n case 'BN':\n // Button\n attr.onClick = (e) => this.onHandleClick(e, 'form_button');\n let inner = React.Children.map(values, (child) => {\n return typeof child == 'string' ? child : undefined;\n });\n if (!inner || inner.length == 0) {\n inner = [attr.name]\n }\n // Get text which will be sent back when the button is clicked.\n attr['data-title'] = inner.join('');\n break;\n case 'LN':\n if (attr) {\n // Ensure only safe URL schemes are clickable.\n attr.href = typeof attr.href == 'string' ? sanitizeUrl(attr.href, CLICKABLE_URL_SCHEMES) : '';\n }\n break;\n case 'MN':\n // Mention\n attr.className = 'mention'\n if (data) {\n attr.className += ' ' + idToColorClass(data.val, false, true);\n }\n break;\n case 'FM':\n // Form\n attr.className = 'bot-form';\n break;\n case 'RW':\n // Form element formatting is dependent on element content.\n break;\n case 'QQ':\n // Quote/citation.\n attr.className = 'reply-quote'\n attr.onClick = (e) => this.onHandleClick(e, 'quote');\n break;\n case 'TC':\n // TheCard\n el = TheCardMini;\n attr.content = data;\n attr.authorizeURL = this.authorizeURL;\n attr.onChatClick = (e) => this.onHandleClick(e, 'contact_chat');\n attr.onFindClick = (e) => this.onHandleClick(e, 'contact_find');\n values = null;\n break;\n case 'VC':\n el = CallMessage;\n // Video call messages do not have content.\n values = null;\n if (data) {\n attr.callState = data.state;\n attr.incoming = data.incoming;\n attr.duration = data.duration;\n }\n break;\n case 'VD':\n // Additional processing for videos.\n el = handleVideoData.call(this, el, data, attr);\n // Video element cannot have content.\n values = null;\n break;\n default:\n if (!el) {\n // Unknown element.\n el = React.Fragment;\n attr = {key: key};\n // Generate comment for unknown element.\n let body = values;\n if (!Array.isArray(values) || !values.join('').trim()) {\n body = [React.createElement('span',\n {key: 'x1', className: 'gray'},\n this.formatMessage(messages.drafty_unknown)\n )];\n }\n values = [React.createElement('i',\n {key: 'x0', className: 'material-icons gray'},\n 'extension'\n ), ' '].concat(body);\n }\n break;\n }\n if (!el) {\n return values;\n }\n return React.createElement(el, attr, values);\n}\n\n// Additional processing of image data.\nfunction handleImageData(el, data, attr) {\n if (!data) {\n attr.src = 'img/broken_image.png';\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n };\n return el;\n }\n\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n this.viewportWidth > 0 ? Math.min(this.viewportWidth - REM_SIZE * 6.5, REM_SIZE * 34.5) :\n REM_SIZE * 34.5, REM_SIZE * 24, false) ||\n {dstWidth: BROKEN_IMAGE_SIZE, dstHeight: BROKEN_IMAGE_SIZE};\n attr.style = {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px',\n // Looks like a Chrome bug: broken image does not respect 'width' and 'height'.\n minWidth: dim.dstWidth + 'px',\n minHeight: dim.dstHeight + 'px'\n };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'image'));\n attr.alt = data.name;\n if (attr.src) {\n if (Math.max(data.width || 0, data.height || 0) > IMAGE_THUMBNAIL_DIM) {\n // Allow previews for large enough images.\n attr.onClick = (e) => this.onHandleClick(e, 'image');\n attr.className += ' image-clickable';\n }\n attr.loading = 'lazy';\n } else {\n attr.src = null;\n }\n } else {\n // Use custom element instead of or .\n el = UploadingImage;\n }\n\n return el;\n}\n\n// Additional processing of attached video data.\nfunction handleVideoData(el, data, attr) {\n if (!data) {\n attr.src = 'img/broken_video.png';\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n };\n return el;\n }\n attr.className = 'inline-image';\n const dim = fitImageSize(data.width, data.height,\n this.viewportWidth > 0 ? Math.min(this.viewportWidth - REM_SIZE * 6.5, REM_SIZE * 34.5) :\n REM_SIZE * 34.5, REM_SIZE * 24, false) ||\n {dstWidth: NO_DIMENSIONS_VIDEO, dstHeight: NO_DIMENSIONS_VIDEO};\n attr.style = {\n width: dim.dstWidth + 'px',\n height: dim.dstHeight + 'px',\n // Looks like a Chrome bug: broken image does not respect 'width' and 'height'.\n minWidth: dim.dstWidth + 'px',\n minHeight: dim.dstHeight + 'px'\n };\n if (!Drafty.isProcessing(data)) {\n attr.src = this.authorizeURL(sanitizeUrlForMime(attr.src, 'image'));\n attr.alt = data.name;\n if (data.ref || data.val) {\n attr.onClick = (e) => this.onHandleClick(e, 'video');\n attr.loading = 'lazy';\n }\n el = InlineVideo;\n } else {\n // Use custom element instead of or .\n el = UploadingImage;\n }\n\n return el;\n}\n\n// Converts Drafty object into a one-line preview. 'this' is set by the caller.\n// 'this' must contain:\n// formatMessage: this.props.intl.formatMessage\n// messages: formatjs messages defined with defineMessages.\nexport function previewFormatter(style, data, values, key) {\n if (!style) {\n // Unformatted.\n return values;\n }\n\n let el = Drafty.tagName(style);\n const attr = { key: key };\n switch (style) {\n case 'AU':\n // Voicemail as '[mic] 0:00'.\n el = React.Fragment;\n values = [React.createElement('i', {key: 'au', className: 'material-icons'}, 'mic'),\n ' ', secondsToTime(data.duration/1000)];\n break;\n case 'BR':\n // Replace new line with a space.\n el = React.Fragment;\n values = [' '];\n break;\n case 'HL':\n // Make highlight less prominent in preview.\n attr.className = 'highlight preview';\n break;\n case 'LN':\n case 'MN':\n // Disable links in previews.\n el = 'span';\n break;\n case 'IM':\n // Replace image with '[icon] Image'.\n el = React.Fragment;\n values = [React.createElement('i', {key: 'im', className: 'material-icons'}, 'photo'),\n ' ', this.formatMessage(messages.drafty_image)];\n break;\n case 'BN':\n el = 'span';\n attr.className = 'flat-button faux';\n break;\n case 'FM':\n el = React.Fragment;\n values = [React.createElement('i', {key: 'fm', className: 'material-icons'}, 'dashboard'),\n this.formatMessage(messages.drafty_form)].concat(' ', values || []);\n break;\n case 'RW':\n el = React.Fragment;\n break;\n case 'EX':\n if (data) {\n if (Drafty.isFormResponseType(data.mime)) {\n // Ignore JSON attachments: they are form response payloads.\n return null;\n }\n // Clear payload.\n delete data.val;\n delete data.ref;\n }\n el = React.Fragment;\n values = [React.createElement('i', {key: 'ex', className: 'material-icons'}, 'attachment'),\n ' ', this.formatMessage(messages.drafty_attachment)];\n break;\n case 'VC':\n el = CallStatus;\n if (data) {\n attr.callState = data.state;\n attr.incoming = data.incoming;\n attr.duration = data.duration;\n }\n values = null;\n break;\n case 'QQ':\n case 'HD':\n el = null;\n values = null;\n break;\n case 'TC':\n // TheCard\n el = React.Fragment;\n values = [React.createElement('i', {key: 'tc', className: 'material-icons'}, 'contact_mail'), ' ',\n TheCard.getFn(data) || this.formatMessage(messages.drafty_unknown)];\n break;\n case 'VD':\n // Replace image with '[icon] Video'.\n el = React.Fragment;\n values = [React.createElement('i', {key: 'im', className: 'material-icons'}, 'play_circle_outline'),\n ' ', this.formatMessage(messages.drafty_video)];\n break;\n default:\n if (!el) {\n // Unknown element.\n el = React.Fragment;\n values = [React.createElement('i', {key: 'x0', className: 'material-icons gray'}, 'extension'),\n ' ', this.formatMessage(messages.drafty_unknown)];\n }\n break;\n }\n if (!el) {\n return values;\n }\n return React.createElement(el, attr, values);\n};\n\n// Converts Drafty object into a quoted reply; 'this' is set by the caller.\nfunction inlineImageAttr(attr, data) {\n attr.style = {\n width: IMAGE_THUMBNAIL_DIM + 'px',\n height: IMAGE_THUMBNAIL_DIM + 'px',\n maxWidth: IMAGE_THUMBNAIL_DIM + 'px',\n maxHeight: IMAGE_THUMBNAIL_DIM + 'px',\n }\n attr.className = 'inline-image';\n attr.alt = this.formatMessage(messages.drafty_image);\n if (!data) {\n attr.src = 'img/broken_image.png';\n } else {\n attr.src = attr.src || 'img/broken_image.png';\n }\n attr.title = attr.alt;\n return attr;\n}\n\n// Converts Drafty object into a quoted reply; 'this' is set by the caller.\nfunction inlineVideoAttr(attr, data) {\n const dim = fitImageSize(data.width, data.height, VIDEO_THUMBNAIL_WIDTH, IMAGE_THUMBNAIL_DIM);\n attr.style = {\n width: dim.width + 'px',\n height: dim.height + 'px',\n maxWidth: VIDEO_THUMBNAIL_WIDTH + 'px',\n maxHeight: IMAGE_THUMBNAIL_DIM + 'px',\n }\n attr.className = 'inline-image';\n attr.alt = this.formatMessage(messages.drafty_video);\n attr.title = attr.alt;\n if (!data) {\n attr.src = 'img/broken_video.png';\n } else {\n attr.src = attr.src || 'img/broken_video.png';\n }\n return attr;\n}\n\n// Displays a portion of Drafty within 'QQ' quotes. 'this' is set by the caller.\n// 'this' must contain:\n// formatMessage: this.props.intl.formatMessage\n// messages: formatjs messages defined with defineMessages.\n// authorizeURL: this.props.tinode.authorizeURL\n// onHandleClick: this.handleDraftyClick\nfunction quoteFormatter(style, data, values, key) {\n if (['BR', 'EX', 'IM', 'MN', 'VD'].includes(style)) {\n let el = Drafty.tagName(style);\n let attr = Drafty.attrValue(style, data) || {};\n attr.key = key;\n switch(style) {\n case 'BR':\n values = null;\n break;\n case 'IM':\n attr = inlineImageAttr.call(this, attr, data);\n values = [React.createElement('img', attr, null), ' ', attr.alt];\n el = React.Fragment;\n // Fragment attributes.\n attr = {key: key};\n break;\n case 'VD':\n attr = inlineVideoAttr.call(this, attr, data);\n values = [React.createElement('img', attr, null), ' ', attr.alt];\n el = React.Fragment;\n // Fragment attributes.\n attr = {key: key};\n break;\n case 'MN':\n el = 'span';\n attr.className = 'mention'\n if (data) {\n attr.className += ' ' + idToColorClass(data.val, false, true);\n }\n break;\n case 'EX':\n let fname;\n if (data) {\n if (Drafty.isFormResponseType(data.mime)) {\n // Ignore JSON attachments: they are form response payloads.\n return null;\n }\n fname = data.name;\n // Clear payload.\n delete data.val;\n delete data.ref;\n }\n el = React.Fragment;\n values = [React.createElement('i', {key: 'ex', className: 'material-icons'}, 'attachment'),\n shortenFileName(fname, 16) || this.formatMessage(messages.drafty_attachment)];\n break;\n }\n return React.createElement(el, attr, values);\n }\n return previewFormatter.call(this, style, data, values, key);\n}\n\n// Create image thumbnail suitable for inclusion in a quote.\nfunction quoteImageOrVideo(data, isVideo) {\n let promise;\n let bits, ref, mime;\n if (isVideo) {\n bits = data.preview;\n mime = data.premime || 'image/jpeg';\n ref = data.preref;\n } else {\n bits = data.val;\n mime = data.mime;\n ref = data.ref;\n }\n // Get the blob from the image data.\n if (bits) {\n const blob = base64ToBlob(bits, mime);\n if (!blob) {\n throw new Error(\"Invalid image\");\n }\n promise = Promise.resolve(blob);\n } else if (ref) {\n promise = fetch(this.authorizeURL(sanitizeUrlForMime(ref, 'image')))\n .then(evt => {\n if (evt.ok) {\n return evt.blob();\n } else {\n throw new Error(`Image fetch unsuccessful: ${evt.status} ${evt.statusText}`);\n }\n });\n } else {\n throw new Error(\"Missing image data\");\n }\n\n // Scale the blob.\n return promise\n .then(blob => {\n // If it's an image, cut the square from the center of the image and shrink it.\n // If it's a video, allow it to be rectantular.\n return imageScaled(blob, isVideo ? VIDEO_THUMBNAIL_WIDTH : IMAGE_THUMBNAIL_DIM, IMAGE_THUMBNAIL_DIM, -1, !isVideo)\n }).then(scaled => {\n if (isVideo) {\n data.premime = scaled.mime;\n } else {\n data.mime = scaled.mime;\n }\n data.size = scaled.blob.size;\n data.width = scaled.width;\n data.height = scaled.height;\n delete data.ref;\n delete data.preref;\n // Keeping the original file name, if provided: ex.data.name;\n\n data.src = URL.createObjectURL(scaled.blob);\n return blobToBase64(scaled.blob);\n }).then(b64 => {\n if (isVideo) {\n data.preview = b64.bits;\n } else {\n data.val = b64.bits;\n }\n return data;\n }).catch(err => {\n delete data.val;\n delete data.preview;\n delete data.src;\n data.width = IMAGE_THUMBNAIL_DIM;\n data.height = IMAGE_THUMBNAIL_DIM;\n // Rethrow.\n throw err;\n });\n}\n\n// Create a preview of a reply.\nexport function replyFormatter(style, data, values, key, stack) {\n if (style == 'IM' || style == 'VD') {\n const isImage = style == 'IM';\n const attr = isImage ? inlineImageAttr.call(this, {key: key}, data) :\n inlineVideoAttr.call(this, {key: key}, data);\n\n let loadedPromise;\n try {\n loadedPromise = cancelablePromise(quoteImageOrVideo.call(this, data, style == 'VD'));\n } catch (error) {\n console.warn(\"Failed to quote image:\", error.message);\n loadedPromise = cancelablePromise(error);\n }\n attr.whenDone = loadedPromise;\n values = [React.createElement(LazyImage, attr, null), ' ', attr.alt];\n return React.createElement(React.Fragment, {key: key}, values);\n } else if (style == 'QQ') {\n if (stack.includes('QQ')) {\n // Quote inside quote when forwarding a message.\n return React.createElement('span', {key: key},\n [React.createElement('i', {key: 'qq', className: 'material-icons'}, 'format_quote'), ' ']);\n }\n\n const attr = Drafty.attrValue('QQ', data) || {};\n attr.key = key;\n attr.className = 'reply-quote'\n return React.createElement(Drafty.tagName('QQ'), attr, values);\n }\n return quoteFormatter.call(this, style, data, values, key);\n}\n","import { KNOWN_HOSTS, DEFAULT_HOST } from '../config.js';\n\n// Detect server address from the URL\nexport function detectServerAddress() {\n let host = DEFAULT_HOST;\n if (typeof window.location == 'object') {\n if (window.location.protocol == 'file:' || window.location.hostname == 'localhost') {\n host = KNOWN_HOSTS.local;\n } else if (window.location.hostname) {\n host = window.location.hostname + (window.location.port ? ':' + window.location.port : '');\n }\n }\n return host;\n}\n\n// Detect if the page is served over HTTPS.\nexport function isSecureConnection() {\n if (typeof window.location == 'object') {\n return window.location.protocol == 'https:';\n }\n return false;\n}\n\nexport function isLocalHost() {\n if (typeof window.location == 'object') {\n return window.location.hostname == 'localhost';\n }\n return false;\n}\n","// Thin REST client for the product-specific `/v1/im/*` API that sits alongside the Tinode WS protocol.\n// Endpoint shapes verified directly against the deployed backend (im_team/im_server, server/im_http.go).\nimport { API_KEY } from '../config.js';\nimport { PACKAGE_VERSION } from '../version.js';\nimport LocalStorageUtil from './local-storage.js';\n\nconst DEFAULT_API_BASE = '/v1/im';\nconst DEFAULT_FILE_BASE = '/v0/file';\n\nexport class ImApiError extends Error {\n constructor(message, reason, status, details) {\n super(message);\n this.reason = reason;\n this.status = status;\n this.details = details;\n }\n}\n\n// docs/IM-前后端对接文档.md §12.4's full reason list. Every existing call site already does\n// `catch(err => onToast(err.message || '...'))`, so translating known reasons at the one place the\n// error is constructed fixes all of them at once, rather than needing a matching change at every\n// individual catch block scattered across the app.\nconst REASON_MESSAGES = {\n // Real per-account risk is low (this app always sends a hardcoded key, so hitting these means a\n // deployment-wide config problem, not something an individual user did) -- but exactly this \"the\n // whole site is silently misconfigured\" scenario has genuinely happened once already (a stale API\n // key got redeployed to production), so it's worth a real message instead of raw English site-wide.\n API_KEY_REQUIRED: '服务暂不可用,请刷新页面重试',\n METHOD_NOT_ALLOWED: '请求方式有误,请刷新页面重试',\n TENANT_UNAVAILABLE: '企业码不存在或已停用',\n TENANT_MISMATCH: '登录状态异常,请重新进入企业码',\n AUTH_FAILED: '账号或密码错误',\n TOKEN_EXPIRED: '登录已过期,请重新登录',\n ACCOUNT_DISABLED: '账号已被禁用',\n RATE_LIMITED: '操作过于频繁,请稍后再试',\n VALIDATION_FAILED: '提交的内容不符合要求',\n IDEMPOTENCY_CONFLICT: '内容已发生变化,请刷新后重试',\n RESOURCE_NOT_FOUND: '内容不存在或已被删除',\n // 后端 server/im_http.go 里 30+ 处 403 用的都是 imReasonPermissionDenied=\"PERMISSION_DENIED\",\n // 从未发送过字面量 \"FORBIDDEN\"——原来的 FORBIDDEN 条目是死代码,全站 403 一直透传英文原文。\n PERMISSION_DENIED: '没有权限执行此操作',\n NOT_FOUND: '内容不存在或已被删除',\n VERSION_CONFLICT: '内容已被修改,请刷新后重试',\n MALFORMED_REQUEST: '请求内容有误,请稍后重试',\n AUTH_REQUIRED: '请先登录',\n ACTION_TOKEN_INVALID: '操作凭证已失效,请重新操作',\n SCHEMA_UNSUPPORTED: '当前版本过旧,请刷新页面后重试',\n IDEMPOTENCY_IN_PROGRESS: '上一次操作正在处理中,请稍后再试',\n INTERNAL_ERROR: '服务器繁忙,请稍后重试',\n UNSUPPORTED_MEDIA_TYPE: '不支持的文件类型',\n CHALLENGE_EXPIRED: '验证码已过期,请重新获取',\n SMS_DELIVERY_FAILED: '短信发送失败,请稍后重试',\n PASSWORD_POLICY_VIOLATION: '密码不符合安全要求',\n VERIFICATION_RATE_LIMITED: details => details && details.retry_after_seconds\n ? `操作过于频繁,请 ${details.retry_after_seconds} 秒后重试`\n : '操作过于频繁,请稍后再试',\n ALREADY_GROUP_MEMBER: '对方已经是群成员',\n DESCRIPTION_REQUIRED: '请填写简介内容',\n DESCRIPTION_TOO_LONG: '简介内容过长',\n GROUP_ADMIN_LIMIT_EXCEEDED: '群管理员数量已达上限',\n INVALID_CREDIT_CODE: '统一社会信用代码格式不正确',\n INVALID_EMAIL: '邮箱格式不正确',\n MAILBOX_UNAVAILABLE: '总经理信箱暂不可用',\n TOO_MANY_FILES: '文件数量超出限制',\n FRIEND_RELATION_REQUIRED: '需要先添加对方为好友',\n MESSAGE_NOT_ALLOWED: '当前状态无法发送消息',\n GROUP_MUTED: '你已被禁言,无法发言',\n GROUP_MEMBER_LIMIT_EXCEEDED: '群成员数量已达上限',\n TENANT_USER_QUOTA_EXCEEDED: '企业账号数已达上限',\n TENANT_GROUP_QUOTA_EXCEEDED: '企业群组数已达上限',\n FILE_TOO_LARGE: '文件大小超出限制',\n FILE_FORBIDDEN: '没有权限访问此文件',\n FILE_UNAVAILABLE: '文件暂不可用',\n STORAGE_QUOTA_EXCEEDED: '存储空间已达上限',\n REALNAME_REQUIRED: '需要先完成实名认证',\n YOUTH_MODE_RESTRICTED: '青少年模式下无法使用此功能',\n RISK_CONFIRMATION_REQUIRED: '需要先完成安全确认',\n RISK_ACTION_BLOCKED: '该操作已被安全策略拦截',\n // 独立密码校验的两个 reason(对接文档 809 行有写),青少年模式关闭/开启走的都是这条接口。\n // 原来没收录,报错时直接透传后端英文原文——PIN 输错显示 \"code invalid\",连续错误锁定后\n // 显示 \"too many attempts\",且不告诉用户要等多久能重试。\n CODE_INVALID: '独立密码不正确',\n TOO_MANY_ATTEMPTS: details => details && details.retry_after_seconds\n ? `连续输错次数过多,请 ${details.retry_after_seconds} 秒后重试`\n : '连续输错次数过多,请稍后重试'\n};\n\nfunction requestId() {\n return (typeof crypto != 'undefined' && crypto.randomUUID) ? crypto.randomUUID() :\n 'web_' + Date.now().toString(36) + '_' + Math.random().toString(36).slice(2);\n}\n\n// Tenant context persists in localStorage (not sessionStorage): it must survive browser restarts\n// the same way the auth-token does, so a returning user's auto-login can still supply `hi.tenant`.\nexport function getTenantContext() {\n return LocalStorageUtil.getObject('im-tenant');\n}\n\nexport function currentTenantCode() {\n const tenant = getTenantContext();\n return (tenant && tenant.code) || 'default';\n}\n\nfunction apiBase() {\n const tenant = getTenantContext();\n return ((tenant && tenant.endpoints && tenant.endpoints.api) || DEFAULT_API_BASE).replace(/\\/$/, '');\n}\n\nfunction fileBase() {\n const tenant = getTenantContext();\n return ((tenant && tenant.endpoints && tenant.endpoints.file) || DEFAULT_FILE_BASE).replace(/\\/$/, '');\n}\n\n// tinode-web.jsx always sets this on login/reconnect (sessionStorage, tab-lifetime), independent of\n// whether the user opted into \"keep logged in\" (which only controls the separate localStorage token\n// used for surviving a browser restart). REST calls need a token for the current session regardless.\nfunction authToken() {\n return sessionStorage.getItem('im-session-token') || '';\n}\n\nfunction normalizeResponse(payload) {\n return (payload && payload.code === 0 && payload.data !== undefined) ? payload.data : payload;\n}\n\n// Core request helper. `auth: false` skips the Authorization header (pre-login calls).\nexport async function imRequest(path, {method = 'GET', body, headers, auth = true, tenantCodeOverride} = {}) {\n const finalHeaders = {\n 'Content-Type': 'application/json',\n 'X-MeetingIM-APIKey': API_KEY,\n 'X-IM-Schema': '1',\n 'X-Tenant-Code': tenantCodeOverride || currentTenantCode(),\n 'X-Request-ID': requestId(),\n ...headers\n };\n if (auth) {\n const token = authToken();\n if (token) {\n finalHeaders.Authorization = 'Bearer ' + token;\n }\n }\n const response = await fetch(apiBase() + path, {\n method,\n headers: finalHeaders,\n body: body !== undefined ? JSON.stringify(body) : undefined\n });\n const text = await response.text();\n let payload = {};\n if (text) {\n try {\n payload = JSON.parse(text);\n } catch (e) {\n throw new ImApiError(response.ok ? '接口返回非 JSON 数据' : (response.statusText || '接口请求失败'),\n 'NON_JSON_RESPONSE', response.status, text.slice(0, 160));\n }\n }\n if (!response.ok || (payload && payload.code && payload.code !== 0)) {\n // A known reason always wins over the raw backend message -- gives every caller (they all just do\n // `err.message || '...'`) the doc-mandated, consistently-worded text instead of whatever string\n // that particular backend handler happened to write, and instead of duplicating this mapping at\n // every individual call site. An unrecognized reason still falls back to the backend's own message\n // (not silently replaced with a generic string) since this backend's messages have consistently\n // been reasonable, specific, business-appropriate text in real testing, not raw internals -- only\n // reasons this app doesn't otherwise know how to react to fall through to it.\n const known = translateReason(payload.reason, payload.details);\n throw new ImApiError(known || payload.message || payload.reason || response.statusText || '请求失败',\n payload.reason, response.status, payload.details);\n }\n return normalizeResponse(payload);\n}\n\n// Several batch endpoints (favorites/batch, favorites/forward, messages/forward, ...) always return\n// HTTP 200 and bury the real per-item outcome in a nested `items[]`/`failed[]` array instead of\n// throwing -- imRequest's translation above never runs for those, since it only fires on a non-2xx/\n// non-zero-code response. Exported so call sites reading one of those per-item `reason` strings\n// directly (e.g. send-message.jsx's sendFavorite) can reuse the exact same table instead of either\n// duplicating it or -- as was actually happening -- showing the raw untranslated reason string.\nexport function translateReason(reason, details) {\n const entry = reason && REASON_MESSAGES[reason];\n return (typeof entry === 'function' ? entry(details) : entry) || null;\n}\n\nconst idem = () => ({'Idempotency-Key': requestId()});\n\n// Most list endpoints here cap out at 20-50 items per page (some as low as 30, e.g. group\n// members against a 128-member cap) and round7 testing found several call sites only ever\n// fetched the first page -- for things like \"am I this group's owner/admin\" or the admin\n// candidate list, a real owner/admin sitting past page 1 went undetected entirely rather than\n// just showing an incomplete list. Empty/repeated next_cursor means done; this app's list\n// responses haven't been observed to send a separate has_more that disagrees with that.\nexport async function fetchAllPages(fetchPage, startCursor = '') {\n let cursor = startCursor;\n let items = [];\n for (;;) {\n const page = await fetchPage(cursor);\n items = items.concat((page && page.items) || []);\n const nextCursor = (page && page.next_cursor) || '';\n if (!nextCursor || nextCursor === cursor) {\n break;\n }\n cursor = nextCursor;\n }\n return items;\n}\n\nexport const imGet = (path, opts) => imRequest(path, opts);\nexport const imPost = (path, body, opts = {}) => imRequest(path, {method: 'POST', body, headers: idem(), ...opts});\nexport const imPatch = (path, body, opts = {}) => imRequest(path, {method: 'PATCH', body, headers: idem(), ...opts});\nexport const imPut = (path, body, opts = {}) => imRequest(path, {method: 'PUT', body, headers: idem(), ...opts});\nexport const imDelete = (path, opts = {}) => imRequest(path, {method: 'DELETE', headers: idem(), ...opts});\n\nfunction qs(params) {\n const usp = new URLSearchParams();\n Object.entries(params || {}).forEach(([k, v]) => {\n if (v !== undefined && v !== null && v !== '') {\n usp.set(k, v);\n }\n });\n const s = usp.toString();\n return s ? '?' + s : '';\n}\n\n// -- Public uploads (multipart; used before login and for standalone attachments not tied to a chat message). --\nexport async function uploadPublicFile(file, purpose, onProgress) {\n const form = new FormData();\n form.append('purpose', purpose);\n form.append('file', file);\n // Use XHR instead of fetch to get upload progress events.\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('POST', apiBase() + '/public/uploads');\n xhr.setRequestHeader('X-MeetingIM-APIKey', API_KEY);\n xhr.setRequestHeader('X-IM-Schema', '1');\n xhr.setRequestHeader('X-Tenant-Code', currentTenantCode());\n xhr.setRequestHeader('X-Request-ID', requestId());\n if (onProgress) {\n xhr.upload.onprogress = e => onProgress(e.lengthComputable ? e.loaded / e.total : 0);\n }\n xhr.onload = () => {\n let payload = {};\n try { payload = JSON.parse(xhr.responseText); } catch (e) { /* handled below */ }\n if (xhr.status >= 200 && xhr.status < 300 && payload.code === 0) {\n resolve(normalizeResponse(payload));\n } else {\n reject(new ImApiError(payload.message || payload.reason || '上传失败', payload.reason, xhr.status, payload.details));\n }\n };\n xhr.onerror = () => reject(new ImApiError('网络错误,上传失败', 'NETWORK_ERROR', 0));\n xhr.send(form);\n });\n}\n\n// Native large-file upload (Ch.6 group avatars & group files). uploadPublicFile() above can't be reused --\n// its `purpose` is server-whitelisted to exactly 'enterprise_license'/'tenant_entry_feedback'. The vendored\n// SDK's own tinode.getLargeFileHelper().upload() talks to the same underlying native endpoint but gets two\n// headers wrong for this backend (verified live against the real server, not just read from source):\n// it sends 'X-Tinode-APIKey' (server only accepts 'X-MeetingIM-APIKey', same rename Phase 0 already applied\n// everywhere else in this file) and 'X-Tinode-Auth' (server's getHttpAuth() doesn't recognize that header\n// name at all, only 'X-MeetingIM-Auth' or plain 'Authorization'). The auth *value* must be the native Tinode\n// session token (tinode.getAuthToken().token, scheme 'Token') -- the REST layer's own sessionStorage Bearer\n// token is a separate namespace and fails this endpoint's base64 secret decode with a 400. Response is\n// Tinode's native {ctrl:{code,text,params:{url,expires}}} envelope, not the {code:0,data} REST envelope --\n// there's no separate file_id field; the id is the last path segment of `url`, kept verbatim (including its\n// extension suffix) since getFileUrl() already round-trips that exact format unmodified.\n// This upload talks to Tinode's native {ctrl} protocol (see the comment above), not the REST layer,\n// so REASON_MESSAGES above never applies to it -- confirmed against server/datamodel.go's Err*\n// constructors for the literal ctrl.text values a failure here can actually carry.\nconst UPLOAD_CTRL_TEXT_CN = {\n 'too large': '文件大小超出限制',\n 'malformed': '请求内容有误,请稍后重试',\n 'permission denied': '没有权限执行此操作',\n 'gone': '内容不存在或已被删除'\n};\nexport function uploadLargeFile(tinode, file, onProgress) {\n const authToken = tinode && tinode.getAuthToken && tinode.getAuthToken();\n if (!authToken) {\n return Promise.reject(new ImApiError('尚未登录,无法上传文件', 'AUTH_REQUIRED', 401));\n }\n const form = new FormData();\n form.append('file', file);\n form.set('id', tinode.getNextUniqueId());\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('POST', fileBase() + '/u/');\n xhr.setRequestHeader('X-MeetingIM-APIKey', API_KEY);\n xhr.setRequestHeader('Authorization', 'Token ' + authToken.token);\n if (onProgress) {\n xhr.upload.onprogress = e => onProgress(e.lengthComputable ? e.loaded / e.total : 0);\n }\n xhr.onload = () => {\n let payload = {};\n try { payload = JSON.parse(xhr.responseText); } catch (e) { /* handled below */ }\n const ctrl = payload.ctrl || {};\n if (xhr.status >= 200 && xhr.status < 300 && ctrl.params && ctrl.params.url) {\n const url = ctrl.params.url;\n resolve({fileId: url.slice(url.lastIndexOf('/') + 1), url, expires: ctrl.params.expires});\n } else {\n const known = ctrl.text && UPLOAD_CTRL_TEXT_CN[ctrl.text.trim().toLowerCase()];\n reject(new ImApiError(known || ctrl.text || '上传失败', 'UPLOAD_FAILED', xhr.status));\n }\n };\n xhr.onerror = () => reject(new ImApiError('网络错误,上传失败', 'NETWORK_ERROR', 0));\n xhr.send(form);\n });\n}\n\n// Fixed-headers drop-in replacement for tinode.getLargeFileHelper(), for sending chat attachments\n// (messages-view.jsx). The vendored SDK's LargeFileHelper hardcodes the same two wrong headers\n// uploadLargeFile() above works around ('X-Tinode-APIKey' instead of 'X-MeetingIM-APIKey', and\n// 'X-Tinode-Auth' instead of 'Authorization') -- confirmed live: every image/video/file/voice message\n// too large to send inband was silently failing to upload. Can't just call uploadLargeFile() at each\n// call site instead, because messages-view.jsx also depends on LargeFileHelper's cancel-in-flight-send\n// support (handleCancelUpload) and its urlPromise contract (Drafty.attachFile/insertImage/insertVideo/\n// insertAudio expect the resolved value to be a bare URL string, or for video a [url, prevUrl] pair --\n// not the {fileId,url,expires} object uploadLargeFile() returns). This mirrors just that subset of the\n// real class's interface (upload() returning a bare-URL promise, onProgress, and cancel() aborting any\n// still-in-flight XHRs via the same `this.xhr` array pattern the real LargeFileHelper.cancel() uses).\nexport function createChatUploader(tinode) {\n const xhrs = [];\n return {\n onProgress: null,\n upload(file) {\n const self = this;\n const authToken = tinode && tinode.getAuthToken && tinode.getAuthToken();\n if (!authToken) {\n return Promise.reject(new ImApiError('尚未登录,无法上传文件', 'AUTH_REQUIRED', 401));\n }\n return new Promise((resolve, reject) => {\n const form = new FormData();\n form.append('file', file);\n form.set('id', tinode.getNextUniqueId());\n const xhr = new XMLHttpRequest();\n xhrs.push(xhr);\n xhr.open('POST', fileBase() + '/u/');\n xhr.setRequestHeader('X-MeetingIM-APIKey', API_KEY);\n xhr.setRequestHeader('Authorization', 'Token ' + authToken.token);\n xhr.upload.onprogress = e => {\n if (e.lengthComputable && self.onProgress) {\n self.onProgress(e.loaded / e.total);\n }\n };\n xhr.onload = () => {\n let payload = {};\n try { payload = JSON.parse(xhr.responseText); } catch (e) { /* handled below */ }\n const ctrl = payload.ctrl || {};\n if (xhr.status >= 200 && xhr.status < 300 && ctrl.params && ctrl.params.url) {\n resolve(ctrl.params.url);\n } else {\n // Same native-{ctrl}-protocol translation as uploadLargeFile above -- REASON_MESSAGES\n // never applies here, and a too-large photo/video/file picked from the attachment panel\n // is a realistic, easy way for a real user to hit this.\n const known = ctrl.text && UPLOAD_CTRL_TEXT_CN[ctrl.text.trim().toLowerCase()];\n reject(new ImApiError(known || ctrl.text || '上传失败', 'UPLOAD_FAILED', xhr.status));\n }\n };\n xhr.onerror = () => reject(new ImApiError('网络错误,上传失败', 'NETWORK_ERROR', 0));\n xhr.send(form);\n });\n },\n cancel() {\n xhrs.forEach(req => { if (req.readyState < 4) { req.abort(); } });\n }\n };\n}\n\n// Fixed-headers drop-in replacement for tinode.getLargeFileHelper(), for downloading a chat/favorite\n// out-of-band attachment (content-library-view.jsx's DownloadPage). Same wrong-header bug as\n// createChatUploader() above -- the vendored SDK's LargeFileHelper.download() also hardcodes\n// 'X-Tinode-APIKey'/'X-Tinode-Auth', so every real (non-blob:/data:) download was silently failing.\n// Mirrors the real class's download()/cancel() interface exactly (including the onProgress/onError\n// callback-style signature DownloadPage already calls it with) so the call site needs no other change.\nexport function createFileDownloader(tinode) {\n const xhrs = [];\n return {\n download(relativeUrl, filename, mimetype, onProgress, onError) {\n const authToken = tinode && tinode.getAuthToken && tinode.getAuthToken();\n if (!authToken) {\n const err = new ImApiError('尚未登录,无法下载文件', 'AUTH_REQUIRED', 401);\n if (onError) { onError(err); }\n return Promise.reject(err);\n }\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhrs.push(xhr);\n xhr.open('GET', relativeUrl, true);\n xhr.setRequestHeader('X-MeetingIM-APIKey', API_KEY);\n xhr.setRequestHeader('Authorization', 'Token ' + authToken.token);\n xhr.responseType = 'blob';\n xhr.onprogress = e => { if (onProgress) { onProgress(e.loaded); } };\n xhr.onload = () => {\n if (xhr.status === 200) {\n const link = document.createElement('a');\n link.href = window.URL.createObjectURL(new Blob([xhr.response], {type: mimetype}));\n link.style.display = 'none';\n link.setAttribute('download', filename);\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(link.href);\n resolve();\n } else {\n const reader = new FileReader();\n reader.onload = function() {\n let err;\n try {\n const pkt = JSON.parse(this.result);\n const text = pkt.ctrl && pkt.ctrl.text;\n const known = text && UPLOAD_CTRL_TEXT_CN[text.trim().toLowerCase()];\n err = new ImApiError(known || text || '下载失败', 'DOWNLOAD_FAILED', xhr.status);\n } catch (e) {\n err = new ImApiError('下载失败', 'DOWNLOAD_FAILED', xhr.status);\n }\n if (onError) { onError(err); }\n reject(err);\n };\n reader.readAsText(xhr.response);\n }\n };\n xhr.onerror = () => {\n const err = new ImApiError('网络错误,下载失败', 'NETWORK_ERROR', 0);\n if (onError) { onError(err); }\n reject(err);\n };\n xhr.send();\n });\n },\n cancel() {\n xhrs.forEach(req => { if (req.readyState < 4) { req.abort(); } });\n }\n };\n}\n\n// -- 1.1 Tenant resolution & entry (pre-login, no Authorization header). --\nexport function resolveTenant(tenantCode) {\n return imRequest('/tenants/resolve', {\n method: 'POST', auth: false, tenantCodeOverride: tenantCode,\n body: {tenant_code: tenantCode, platform: 'web', app_version: PACKAGE_VERSION || '0.25.3'}\n });\n}\n\n// 企业注册申请 / 入口反馈 / 意见反馈三个接口后端都定义了 client_context 且会入库\n// (imTenantApplicationRequest / imTenantEntryFeedbackRequest / imFeedbackRequest,\n// server/im_http.go:255/263/367,落库点 :790/:840/:1478),需求文档和对接文档也都要求带上\n// 设备与版本信息。前端一直没发。在这里统一注入,省得三处各写一遍、也不会再漏。\nfunction clientContext() {\n return {\n platform: 'web',\n app_version: PACKAGE_VERSION || '',\n user_agent: (typeof navigator !== 'undefined' && navigator.userAgent) || '',\n language: (typeof navigator !== 'undefined' && navigator.language) || '',\n // 网络类型不是所有浏览器都有(Safari/Firefox 没有 navigator.connection),拿不到就不发这一项\n network: (typeof navigator !== 'undefined' && navigator.connection && navigator.connection.effectiveType) || undefined\n };\n}\n\nexport function submitTenantApplication(body) {\n return imRequest('/tenant-applications', {method: 'POST', auth: false, headers: idem(),\n body: {client_context: clientContext(), ...body}});\n}\n\nexport function submitTenantEntryFeedback(body) {\n return imRequest('/tenant-entry-feedback', {method: 'POST', auth: false, headers: idem(),\n body: {client_context: clientContext(), ...body}});\n}\n\n// -- 1.4/1.5/1.6 Phone verification codes (register / reset_password / security scenes). --\nexport function requestVerificationCode(scene, phone) {\n return imRequest('/auth/verification-codes', {method: 'POST', auth: false, headers: idem(), body: {scene, phone}});\n}\n\nexport function verifyRegisterCode(challengeId, code) {\n return imRequest('/auth/verification-codes/' + encodeURIComponent(challengeId) + '/verify',\n {method: 'POST', auth: false, body: {code}});\n}\n\nexport function verifyPasswordResetCode(challengeId, code) {\n return imRequest('/auth/password-reset/challenges/' + encodeURIComponent(challengeId) + '/verify',\n {method: 'POST', auth: false, body: {code}});\n}\n\nexport function confirmPasswordReset(resetToken, newPassword) {\n return imRequest('/auth/password-reset/confirm',\n {method: 'POST', auth: false, headers: idem(), body: {reset_token: resetToken, new_password: newPassword}});\n}\n\n// -- Bootstrap / home. --\nexport function getBootstrap() {\n return imRequest('/bootstrap');\n}\n\nexport function getMe() {\n return imRequest('/me');\n}\n\n// -- Realname (1.8/1.9). --\nexport function getRealnameStatus() {\n return imRequest('/security/realname');\n}\n\nexport function submitRealname(body) {\n return imPost('/security/realname/submissions', body);\n}\n\n// -- Security challenge (1.7) & independent password (1.11). --\nexport function createSecurityChallenge(scene) {\n return imPost('/security/challenges', {scene, channel: 'sms'});\n}\n\nexport function verifySecurityChallenge(challengeId, code) {\n return imPost('/security/challenges/' + encodeURIComponent(challengeId) + '/verify', {code});\n}\n\nexport function setIndependentPassword(password, purpose, actionToken) {\n return imPost('/settings/independent-password', {password, purpose, action_token: actionToken});\n}\n\n// `action` defaults server-side to 'close_youth_mode' if omitted (server/im_http.go\n// imIndependentPasswordVerifyRequest) -- pass 'set_independent_password' to mint a token usable\n// with enableYouthMode instead, letting an already-set password unlock re-enabling without\n// forcing another SMS round-trip through the identity-check flow.\nexport function verifyIndependentPassword(password, purpose, action) {\n return imPost('/settings/independent-password/verify', {password, purpose, action});\n}\n\n// -- Friends / contacts (Ch.5). --\nexport const getFriends = (query = '', cursor = '', initial = '') => imGet('/friends' + qs({query, cursor, initial}));\nexport const getFriendRequests = (direction = 'inbound', status = 'all', cursor = '') =>\n imGet('/friend-requests' + qs({direction, status, cursor}));\nexport const createFriendRequest = (targetUserId, message = '', source = 'search', sourceTopic = '') =>\n imPost('/friend-requests', {target_user_id: targetUserId, message, source, source_topic: sourceTopic});\nexport const acceptFriendRequest = (requestId_, version) => imPost('/friend-requests/' + encodeURIComponent(requestId_) + '/accept', version ? {version} : {});\nexport const rejectFriendRequest = (requestId_, version) => imPost('/friend-requests/' + encodeURIComponent(requestId_) + '/reject', version ? {version} : {});\nexport const deleteFriend = userId => imDelete('/friends/' + encodeURIComponent(userId));\nexport const updateFriendRemark = (userId, remark) => imPatch('/friends/' + encodeURIComponent(userId), {remark});\nexport const searchUsers = (query, type = 'account', cursor = '') => imGet('/users/search' + qs({q: query, type, cursor}));\nexport const getUserProfile = identifier => imGet('/users/' + encodeURIComponent(identifier) + '/profile');\nexport const createMyQRCode = (expiresInSeconds = 86400) => imPost('/me/qrcodes', {purpose: 'add_friend', expires_in_seconds: expiresInSeconds});\nexport const createUserQRCode = (identifier, expiresInSeconds = 86400) =>\n imPost('/users/' + encodeURIComponent(identifier) + '/qrcodes', {purpose: 'add_friend', expires_in_seconds: expiresInSeconds});\nexport const resolveQRCode = (token, purpose = 'add_friend') => imPost('/qrcodes/resolve', {token, purpose});\nexport const getBlocks = (cursor = '') => imGet('/blocks' + qs({cursor}));\nexport const blockUser = userId => imPut('/blocks/' + encodeURIComponent(userId), {});\nexport const unblockUser = userId => imDelete('/blocks/' + encodeURIComponent(userId));\nexport const batchUnblockUsers = userIds => imPost('/blocks/batch-delete', {user_ids: userIds});\n\n// -- Conversations (Ch.2/3). --\nexport const searchConversations = (query = '', cursor = '') => imGet('/search/conversations' + qs({q: query, cursor}));\nexport const getSystemNotifications = (cursor = '', limit = 20) => imGet('/system-notifications' + qs({cursor, limit}));\nexport const markSystemNotificationRead = id => imPost('/system-notifications/' + encodeURIComponent(id) + '/read', {read_at: new Date().toISOString()});\nexport const getConversationContext = topic => imGet('/conversations/' + encodeURIComponent(topic) + '/context');\nexport const createP2PConversation = peerUserId => imPost('/conversations/p2p', {peer_user_id: peerUserId});\nexport const getConversationSettings = topic => imGet('/conversations/' + encodeURIComponent(topic) + '/settings');\nexport const updateConversationSettings = (topic, body) => imPatch('/conversations/' + encodeURIComponent(topic) + '/settings', body);\n\n// -- Messages (Ch.4/7). --\n// version 只能默认传 1:服务端做的是乐观锁校验(tenant_adapter.go:1963 要求 msg.Version 与传入值\n// 完全相等,否则 ErrDuplicate),但**没有任何消息读取接口下发过 version 字段**——messagePayload /\n// messageSearchPayload / mediaMessagePayload / favoriteSnapshot 全都没有,冲突时的错误里也不回传\n// 真实值。所以前端拿不到正确的版本号,被编辑过(version>1)的消息撤回必然失败。这是后端缺口,\n// 已记入《IM-后端问题清单.md》,不在前端绕。\nexport const recallMessage = (topic, seq, version = 1, reason = 'mistake') =>\n imPost('/topics/' + encodeURIComponent(topic) + '/messages/' + encodeURIComponent(seq) + '/recall', {version, reason});\nexport const reviseMessage = (topic, seq, content, version = 1) =>\n imPost('/topics/' + encodeURIComponent(topic) + '/messages/' + encodeURIComponent(seq) + '/revisions', {content, client_mid: requestId(), version});\nexport const getMessageReceipts = (topic, seq, cursor = '') =>\n imGet('/topics/' + encodeURIComponent(topic) + '/messages/' + encodeURIComponent(seq) + '/receipts' + qs({cursor}));\n// type='all' searches every message type (text/image/video/voice/file/link) -- the backend's own\n// default when the param is omitted/empty is \"no filter\", so defaulting to 'text' here would have\n// silently restricted every unqualified call to text-only messages.\nexport const searchTopicMessages = (topic, {query = '', type = 'all', cursor = ''} = {}) =>\n imGet('/topics/' + encodeURIComponent(topic) + '/messages/search' + qs({q: query, type, cursor}));\nexport const getMessageContext = (topic, seq, before = 20, after = 20) =>\n imGet('/topics/' + encodeURIComponent(topic) + '/messages/' + encodeURIComponent(seq) + '/context' + qs({before, after}));\nexport const getTopicMedia = (topic, type = 'image', cursor = '') =>\n imGet('/topics/' + encodeURIComponent(topic) + '/media' + qs({type, cursor}));\nexport const getForwardTargets = (query = '', cursor = '') => imGet('/forward-targets' + qs({query, cursor}));\nexport const forwardMessages = (mode, sources, targetTopics, comment = '') =>\n imPost('/messages/forward', {mode, sources, target_topics: targetTopics, comment});\nexport const getForwardBundle = (bundleId, cursor = '') => imGet('/forward-bundles/' + encodeURIComponent(bundleId) + qs({cursor}));\nexport const favoriteMessages = messages => imPost('/favorites/batch', {messages: messages.map(m => ({...m, seq: String(m.seq)}))});\nexport const getFavorites = ({type = 'all', query = '', cursor = '', limit} = {}) => imGet('/favorites' + qs({type, q: query, cursor, limit}));\nexport const getFavorite = favoriteId => imGet('/favorites/' + encodeURIComponent(favoriteId));\nexport const deleteFavorite = favoriteId => imDelete('/favorites/' + encodeURIComponent(favoriteId));\nexport const batchDeleteFavorites = favoriteIds => imPost('/favorites/batch-delete', {favorite_ids: favoriteIds});\nexport const forwardFavorites = (favoriteIds, targetTopics, comment = '') =>\n imPost('/favorites/forward', {favorite_ids: favoriteIds, target_topics: targetTopics, comment});\nexport const checkURL = (url, source = 'favorite') => imPost('/security/urls/check', {url, source});\nexport const confirmRiskChallenge = (riskChallengeId, decision = 'continue') =>\n imPost('/security/risk-challenges/' + encodeURIComponent(riskChallengeId) + '/confirm', {decision});\nexport const getMentionableGroupMembers = (topic, query = '', cursor = '') =>\n imGet('/groups/' + encodeURIComponent(topic) + '/members' + qs({mentionable: true, query, cursor}));\n// 4.1 跨话题草稿:GET 对不存在的草稿返回 {content:'',entities:[],version:0} 而不是 404,PUT 用\n// version 做乐观锁(对接文档描述的样子)。真实验证过用原生话题名(P2P 是对方 user_id,不是\n// REST 层内部的 p2pXXX id)可以正常读写——这个接口内部会先查 Subs.Get 校验会话存在/有权限,\n// 跟 favorites 那条从不做话题归一化、直接 NOT_FOUND 的坏路径不是同一个问题。\nexport const getTopicDraft = topic => imGet('/topics/' + encodeURIComponent(topic) + '/draft');\nexport const updateTopicDraft = (topic, content, entities, version) =>\n imPut('/topics/' + encodeURIComponent(topic) + '/draft', {content, entities, version});\n\nexport async function fetchFileState(fileId, range = '') {\n const headers = {\n 'X-MeetingIM-APIKey': API_KEY, 'X-IM-Schema': '1',\n 'X-Tenant-Code': currentTenantCode(), 'X-Request-ID': requestId()\n };\n const token = authToken();\n // GET /v0/file/s/{id} is the native Tinode file-serving endpoint, not the /v1/im REST API --\n // it's auth-gated by the vendored SDK's auth-handler registry, which is keyed by the literal\n // scheme word in the header and only recognizes 'token' (used by uploadLargeFile above), never\n // 'bearer'. Sending 'Bearer' here (as imRequest correctly does for actual /v1/im/* calls) gets a\n // flat 400 \"malformed\" from every single call -- confirmed live against the real backend: same\n // token value, only the scheme word differs. authToken() itself already holds the right value\n // (tinode-web.jsx's handleLoginSuccessful stores tinode.getAuthToken().token verbatim into\n // sessionStorage['im-session-token']), so no plumbing change is needed beyond the scheme word.\n if (token) {\n headers.Authorization = 'Token ' + token;\n }\n if (range) {\n headers.Range = range;\n }\n const response = await fetch(fileBase() + '/s/' + encodeURIComponent(fileId), {headers});\n return {\n ok: response.ok, status: response.status,\n contentType: response.headers.get('content-type') || '',\n contentLength: response.headers.get('content-length') || '',\n acceptRanges: response.headers.get('accept-ranges') || '',\n etag: response.headers.get('etag') || ''\n };\n}\n\nexport function publicFileBase() {\n return fileBase();\n}\n\n// Just the URL string -- fileBase() (the tenant's real, possibly cross-origin file domain, e.g.\n// \"https://api.118im.com/v0/file\") + the server-relative path a Drafty ref/upload response carries.\n// No fetch. Split out from getFileUrl() below for DownloadPage (content-library-view.jsx): that\n// caller needs a correctly-qualified URL to *display and hand to the download button*, not to\n// eagerly pull the whole file into a blob the moment the page opens -- getFileUrl()'s eager fetch,\n// used unmodified there, silently downloaded every out-of-band attachment in full before the user\n// ever pressed \"download\", defeating the ready/downloading/done UI entirely.\nexport function resolveFileUrl(fileId) {\n return fileId ? fileBase() + '/s/' + encodeURIComponent(fileId) : null;\n}\n\n// File serving (GET /v0/file/s/{id}) is auth-gated -- the upload endpoints never return a directly\n// servable URL (publicUploadPayload only has file_id/purpose/mime_type/size/expires_at), so a plain\n// can't be pointed at it (browsers don't attach custom headers to img/video/audio requests).\n// This fetches the bytes with the right headers once per file_id and hands back a blob: object URL,\n// cached so avatars/attachments repeated across a list (friends, search results, ...) aren't refetched.\nconst fileUrlCache = new Map();\nexport function getFileUrl(fileId) {\n if (!fileId) {\n return Promise.resolve(null);\n }\n if (fileUrlCache.has(fileId)) {\n return fileUrlCache.get(fileId);\n }\n const headers = {\n 'X-MeetingIM-APIKey': API_KEY, 'X-IM-Schema': '1',\n 'X-Tenant-Code': currentTenantCode(), 'X-Request-ID': requestId()\n };\n const token = authToken();\n // Same native-endpoint scheme requirement as fetchFileState() above -- 'Token', not 'Bearer'.\n if (token) {\n headers.Authorization = 'Token ' + token;\n }\n const promise = fetch(resolveFileUrl(fileId), {headers}).then(res => {\n if (!res.ok) {\n throw new ImApiError('文件加载失败', 'FILE_FETCH_FAILED', res.status);\n }\n return res.blob();\n }).then(blob => URL.createObjectURL(blob)).catch(err => {\n fileUrlCache.delete(fileId);\n throw err;\n });\n fileUrlCache.set(fileId, promise);\n return promise;\n}\n\n// -- Groups (Ch.6). --\nexport const getGroups = ({category = 'joined', query = '', cursor = ''} = {}) => imGet('/groups' + qs({category, query, cursor}));\nexport const createGroup = ({name, description = '', memberUserIds = [], avatarFileId = ''}) =>\n imPost('/groups', {name, description, member_user_ids: memberUserIds, avatar_file_id: avatarFileId});\nexport const getGroup = topic => imGet('/groups/' + encodeURIComponent(topic));\nexport const updateGroup = (topic, body) => imPatch('/groups/' + encodeURIComponent(topic), body);\nexport const getGroupSettings = topic => imGet('/groups/' + encodeURIComponent(topic) + '/settings');\nexport const updateGroupMemberSettings = (topic, {pinned, mute_notifications}) =>\n imPatch('/groups/' + encodeURIComponent(topic) + '/member-settings', {pinned, mute_notifications});\nexport const updateMyGroupProfile = (topic, nickname, version) =>\n imPut('/groups/' + encodeURIComponent(topic) + '/members/me/profile', {nickname, version});\n// GET .../members/me/profile is the only endpoint that actually returns the saved nickname --\n// confirmed live that GET .../members (getGroupMembers below) never includes group_nickname on any\n// item, so anything reading the nickname from that list (as this file's own callers used to) will\n// always see it as unset even right after a successful save.\nexport const getMyGroupProfile = topic => imGet('/groups/' + encodeURIComponent(topic) + '/members/me/profile');\nexport const leaveGroup = topic => imPost('/groups/' + encodeURIComponent(topic) + '/leave', {});\nexport const getGroupMembers = (topic, {query = '', cursor = '', role = '', eligibleRole = '', mentionable, muteEligible} = {}) =>\n imGet('/groups/' + encodeURIComponent(topic) + '/members' +\n qs({query, cursor, role, eligible_role: eligibleRole, mentionable: mentionable ? 'true' : '', mute_eligible: muteEligible ? 'true' : ''}));\nexport const createGroupQRCode = (topic, expiresInSeconds = 86400) =>\n imPost('/groups/' + encodeURIComponent(topic) + '/qrcodes', {expires_in_seconds: expiresInSeconds});\nexport const inviteGroupMembers = (topic, userIds, message = '') =>\n imPost('/groups/' + encodeURIComponent(topic) + '/invitations', {user_ids: userIds, message});\nexport const acceptGroupInvitation = invitationId => imPost('/group-invitations/' + encodeURIComponent(invitationId) + '/accept', {});\nexport const createGroupJoinRequest = (topic, {message = '', source = 'qr', qrToken = ''} = {}) =>\n imPost('/groups/' + encodeURIComponent(topic) + '/join-requests', {message, source, qr_token: qrToken});\nexport const getGroupJoinRequests = (topic, status = 'pending', cursor = '') =>\n imGet('/groups/' + encodeURIComponent(topic) + '/join-requests' + qs({status, cursor}));\nexport const acceptGroupJoinRequest = (topic, requestId_, version) =>\n imPost('/groups/' + encodeURIComponent(topic) + '/join-requests/' + encodeURIComponent(requestId_) + '/accept', version ? {version} : {});\n// Server struct (imGroupJoinRequestActionRequest) only has `Version` -- no reason field exists, and the\n// business layer hardcodes an empty reject-reason even internally, so there's nothing to send here. Every\n// JSON body goes through decodeIMJSONBody's DisallowUnknownFields(), so including an extra `reason` key\n// (as an earlier draft of this function did) makes every single call 400 regardless of its value.\nexport const rejectGroupJoinRequest = (topic, requestId_, version) =>\n imPost('/groups/' + encodeURIComponent(topic) + '/join-requests/' + encodeURIComponent(requestId_) + '/reject', version ? {version} : {});\nexport const getGroupSummary = topic => imGet('/groups/' + encodeURIComponent(topic) + '/summary');\nexport const getLatestGroupAnnouncement = topic => imGet('/groups/' + encodeURIComponent(topic) + '/announcements/latest');\nexport const updateCurrentGroupAnnouncement = (topic, content, version) =>\n imPut('/groups/' + encodeURIComponent(topic) + '/announcements/current', {content, version});\nexport const getGroupAnnouncement = (topic, announcementId) =>\n imGet('/groups/' + encodeURIComponent(topic) + '/announcements/' + encodeURIComponent(announcementId));\nexport const readGroupAnnouncement = (topic, announcementId) =>\n imPost('/groups/' + encodeURIComponent(topic) + '/announcements/' + encodeURIComponent(announcementId) + '/read', {});\nexport const getGroupGovernance = topic => imGet('/groups/' + encodeURIComponent(topic) + '/governance');\nexport const updateGroupGovernance = (topic, body) => imPatch('/groups/' + encodeURIComponent(topic) + '/governance', body);\nexport const getGroupRoleLimits = topic => imGet('/groups/' + encodeURIComponent(topic) + '/role-limits');\nexport const addGroupAdmins = (topic, userIds, version) => imPost('/groups/' + encodeURIComponent(topic) + '/admins/batch', {user_ids: userIds, version});\n// Must merge into idem()'s headers, not replace them (imDelete/imPost's `{headers: idem(), ...opts}`\n// lets a same-key `opts.headers` clobber the whole object) -- the same Idempotency-Key-goes-missing\n// bug this codebase already found and fixed once in disableYouthMode.\nexport const deleteGroupAdmin = (topic, userId, version) =>\n imDelete('/groups/' + encodeURIComponent(topic) + '/admins/' + encodeURIComponent(userId), version ? {headers: {...idem(), 'If-Match': String(version)}} : {});\nexport const muteGroupMembers = (topic, members, reason = '') => imPost('/groups/' + encodeURIComponent(topic) + '/mutes', {members, reason});\nexport const getGroupMutes = (topic, cursor = '') => imGet('/groups/' + encodeURIComponent(topic) + '/mutes' + qs({cursor}));\nexport const unmuteGroupMember = (topic, userId) => imDelete('/groups/' + encodeURIComponent(topic) + '/mutes/' + encodeURIComponent(userId));\nexport const transferGroupOwner = (topic, targetUserId, version, actionToken = '') =>\n imPost('/groups/' + encodeURIComponent(topic) + '/owner-transfer', {target_user_id: targetUserId, version},\n actionToken ? {headers: {...idem(), 'X-Action-Token': actionToken}} : {});\n// Real backend reads the search text from `q`, not `query` (confirmed against ListFiles's real\n// query-param handling, same bug class as getOrganizationMembers) -- the search box in Group Files\n// was silently a no-op.\nexport const getGroupFiles = (topic, {query = '', type = '', cursor = ''} = {}) =>\n imGet('/groups/' + encodeURIComponent(topic) + '/files' + qs({q: query, type, cursor}));\n// All fields besides file_id are `omitempty` server-side, so omitting them (as an earlier draft of this\n// function did) never errors -- it just registers a file with a blank name and 0 size in the files list.\nexport const addGroupFile = (topic, {fileId, fileName = '', mimeType = '', fileType = '', fileSize = 0, sourceTopic = '', sourceSeq} = {}) =>\n imPost('/groups/' + encodeURIComponent(topic) + '/files', {\n file_id: fileId, file_name: fileName, mime_type: mimeType, file_type: fileType, file_size: fileSize,\n source_topic: sourceTopic, source_seq: sourceSeq\n });\nexport const deleteGroupFile = (topic, groupFileId) => imDelete('/groups/' + encodeURIComponent(topic) + '/files/' + encodeURIComponent(groupFileId));\nexport const getGroupMemberProfile = (topic, userId) => imGet('/groups/' + encodeURIComponent(topic) + '/members/' + encodeURIComponent(userId) + '/profile');\n\n// -- Organization / workbench (Ch.9). --\nexport const getWorkbench = () => imGet('/workbench');\nexport const getOrganizationDepartments = (parentId = 'root', cursor = '') => imGet('/organization/departments' + qs({parent_id: parentId, cursor}));\nexport const getOrganizationDepartmentMembers = (departmentId, cursor = '') =>\n imGet('/organization/departments/' + encodeURIComponent(departmentId) + '/members' + qs({cursor}));\n// Real backend only reads `q` (server/im_http.go), never `query` -- confirmed against\n// server/im_http_test.go's own request fixtures. This function used to send `query`, silently making\n// every caller's search box a no-op (server ignores the unrecognized param and returns the unfiltered\n// list every time).\nexport const getOrganizationMembers = ({query = '', departmentId = '', cursor = ''} = {}) =>\n imGet('/organization/members' + qs({q: query, department_id: departmentId, cursor}));\nexport const searchOrganization = (query = '', types = 'department,user', cursor = '') =>\n imGet('/organization/search' + qs({q: query, types, cursor}));\nexport const getMeetings = (cursor = '', limit = 20) => imGet('/meetings' + qs({limit, cursor}));\nexport const createMeeting = body => imPost('/meetings', body);\nexport const getMeeting = meetingId => imGet('/meetings/' + encodeURIComponent(meetingId));\nexport const updateMeeting = (meetingId, body) => imPatch('/meetings/' + encodeURIComponent(meetingId), body);\nexport const cancelMeeting = (meetingId, version, reason = '时间冲突') => imPost('/meetings/' + encodeURIComponent(meetingId) + '/cancel', {version, reason});\nexport const sendMeetingReminders = meetingId => imPost('/meetings/' + encodeURIComponent(meetingId) + '/reminders', {});\nexport const respondMeeting = (meetingId, response, version) => imPut('/meetings/' + encodeURIComponent(meetingId) + '/my-response', {response, version});\n// Note: the server only reads scope/from/to/status/cursor -- 'date' and 'department_id' are\n// silently ignored (confirmed against server/im_http.go), so a single-day filter must be\n// expressed as from==to, and there is no way to scope this list to one department.\nexport const getDailyReports = ({scope = 'mine', from = '', to = '', status = '', cursor = ''} = {}) =>\n imGet('/reports/daily' + qs({scope, from, to, status, cursor}));\nexport const createDailyReport = reportDate => imPost('/reports/daily', {report_date: reportDate});\nexport const getDailyReport = reportId => imGet('/reports/daily/' + encodeURIComponent(reportId));\nexport const updateDailyDraft = (reportId, content, version, attachments = []) =>\n imPut('/reports/daily/' + encodeURIComponent(reportId) + '/draft', {content, attachments, version});\nexport const submitDailyReport = (reportId, version) => imPost('/reports/daily/' + encodeURIComponent(reportId) + '/submit', {version});\n// TenantDailyReportStats does honor department_id (reportMemberScopeWhere adds `m.department_id=?`\n// when it's non-empty) -- confirmed against current im_be HEAD, this wasn't always true and an earlier\n// comment here claimed the opposite.\nexport const getDailyStatistics = (date, departmentId = '') => imGet('/reports/daily/statistics' + qs({date, department_id: departmentId}));\nexport const sendDailyReminders = (date, userIds = []) => imPost('/reports/daily/reminders', {date, user_ids: userIds});\nexport const getMonthlyReports = ({scope = 'mine', fromMonth = '', toMonth = '', status = '', cursor = ''} = {}) =>\n imGet('/reports/monthly' + qs({scope, from_month: fromMonth, to_month: toMonth, status, cursor}));\nexport const createMonthlyReport = month => imPost('/reports/monthly', {month});\nexport const getMonthlyReport = reportId => imGet('/reports/monthly/' + encodeURIComponent(reportId));\nexport const updateMonthlyDraft = (reportId, workSummary, nextPlan, version, attachments = []) =>\n imPut('/reports/monthly/' + encodeURIComponent(reportId) + '/draft', {work_summary: workSummary, next_plan: nextPlan, attachments, version});\nexport const submitMonthlyReport = (reportId, version) => imPost('/reports/monthly/' + encodeURIComponent(reportId) + '/submit', {version});\n// server/im_http.go's serveIMMonthlyReportReopen decodes only {version} (DisallowUnknownFields\n// rejects anything else) -- an earlier draft of this function sent an extra `reason` field that\n// would 400 MALFORMED_REQUEST on every real call. Also: the store layer's UPDATE has\n// `WHERE ... AND author_id=?` keyed off the *caller's* uid, so this only ever lets a report's own\n// author reopen their own already-submitted report for further editing -- there is no\n// manager-reopens-someone-else's-report capability on the backend.\nexport const reopenMonthlyReport = (reportId, version) =>\n imPost('/reports/monthly/' + encodeURIComponent(reportId) + '/reopen', {version});\n// Same department_id support as getDailyStatistics (TenantMonthlyReportStats shares reportMemberScopeWhere).\nexport const getMonthlyStatistics = (month, departmentId = '') => imGet('/reports/monthly/statistics' + qs({month, department_id: departmentId}));\nexport const getExecutiveMailboxConfig = () => imGet('/executive-mailbox/config');\nexport const submitExecutiveMailboxMessage = body => imPost('/executive-mailbox/submissions', body);\n\n// -- Personal settings (Ch.10). --\nexport const getMeProfile = () => imGet('/me/profile');\nexport const updateMeProfile = body => imPatch('/me/profile', body);\nexport const getMePrivacy = () => imGet('/me/privacy');\nexport const updateMePrivacy = body => imPatch('/me/privacy', body);\nexport const getYouthMode = () => imGet('/settings/youth-mode');\nexport const enableYouthMode = (policyVersion, actionToken) => imPost('/settings/youth-mode/enable', {policy_version: policyVersion, action_token: actionToken});\n// imPost spreads `opts` last, so passing `headers` directly would silently replace (not merge\n// with) the Idempotency-Key header from idem() -- confirmed live: the server actually enforces\n// it (\"Idempotency-Key is required\", 400), unlike the earlier research pass's assumption that a\n// missing key here was harmless. Merge explicitly instead of letting the spread clobber it.\nexport const disableYouthMode = actionToken => imPost('/settings/youth-mode/disable', {}, {headers: {...idem(), 'X-Action-Token': actionToken}});\nexport const getLatestAppRelease = ({platform = 'android', currentVersion = '1.0.0', channel = 'stable'} = {}) =>\n imGet('/app/releases/latest' + qs({platform, current_version: currentVersion, channel}));\nexport const updateDevicePushToken = (deviceId, body) => imPut('/devices/' + encodeURIComponent(deviceId) + '/push-token', body);\n\n// -- Reports & feedback (Ch.11). --\nexport const getAbuseReasons = (targetType = 'user') => imGet('/reports/abuse/reasons' + qs({target_type: targetType}));\nexport const submitAbuseReport = body => imPost('/reports/abuse', body);\nexport const getFeedbackConfig = () => imGet('/feedback/config');\nexport const submitFeedback = body => imPost('/feedback', {client_context: clientContext(), ...body});\n","// Helper functions for storing values in localStorage.\n// By default localStorage can store only strings, not objects or other types.\n\nexport default class LocalStorageUtil {\n // Replace old object with the new one.\n static setObject(key, value) {\n localStorage.setItem(key, JSON.stringify(value));\n }\n\n // Get stored object.\n static getObject(key) {\n const value = localStorage.getItem(key);\n return value && JSON.parse(value);\n }\n\n // Partially or wholly update stored object.\n static updateObject(key, value) {\n const oldVal = this.getObject(key);\n this.setObject(key, Object.assign(oldVal || {}, value));\n }\n\n // Just a wrapper.\n static removeItem(key) {\n localStorage.removeItem(key);\n }\n}\n","// Utility class for hash navigation.\n\n// Every `navigateTo` call assigns `location.hash`, which the browser already records as a normal\n// history entry -- `history.back()` would land on whatever the user actually saw before, for free.\n// The product's \"back\" buttons never used that: each page hardcodes a single destination view name\n// (e.g. Profile's `back={friend ? 'friend-profile' : 'chat-standard'}`), which is only ever right for\n// the one entry point its author had in mind. Reach the same page from a second place (search result\n// vs. QR scan vs. a banner inside an open chat) and \"back\" throws you at that guessed destination\n// instead of retracing your actual steps. `goBack()` below is the fix: count real in-app navigations\n// this page load and prefer `history.back()` whenever there's one to return to, only falling back to\n// the old hardcoded guess when there truly isn't (fresh load, deep link, or a page refresh -- this\n// counter is in-memory and intentionally does not survive those).\nlet navigationCount = 0;\n\nexport default class HashNavigation {\n // Parse hash as in http://www.example.com/path#hash as if it were\n // path and arguments.\n static parseUrlHash(hash) {\n // Split 'path/?args' into 'path/' and 'args', path -> parts[0], args->path[1].\n const parts = hash.split('?', 2);\n const params = {};\n let path = [];\n if (parts[0]) {\n path = parts[0].replace('#', '').split('/');\n }\n if (parts[1]) {\n parts[1].split('&').forEach((arg) => {\n // Can't use split() because the value may contain '='.\n const eq = arg.indexOf('=');\n if (eq > 0) {\n params[arg.slice(0, eq)] = decodeURIComponent(arg.slice(eq + 1));\n }\n });\n }\n return {path: path, params: params};\n }\n\n static navigateTo(url) {\n navigationCount++;\n window.location.hash = url;\n }\n\n // Real \"back\": retraces the hash the user was actually on before, via native browser history,\n // rather than a page's own guess at where it must have been reached from. Returns whether it\n // actually did that -- every call site already has its own hardcoded-destination `navigate(...)`\n // fallback (a page's `back`/`backUid`/`backTopic` props) for the one case this can't cover: a\n // fresh load, deep link, or refresh, where there's no in-app history yet to go back to (this\n // counter is in-memory by design and does not survive those) -- callers keep using that fallback\n // unchanged, just gated behind `if (!HashNavigation.goBack()) { ...existing fallback... }`.\n static goBack() {\n if (navigationCount > 0) {\n navigationCount--;\n window.history.back();\n return true;\n }\n return false;\n }\n\n static composeUrlHash(path, params) {\n let url = path.join('/');\n const args = [];\n for (const key in params) {\n if (params.hasOwnProperty(key)) {\n if (params[key] !== undefined) {\n args.push(key + '=' + encodeURIComponent(params[key]));\n }\n }\n }\n if (args.length > 0) {\n url += '?' + args.join('&');\n }\n return url;\n }\n\n static addUrlParam(hash, key, value) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.params[key] = value;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static removeUrlParam(hash, key) {\n const parsed = HashNavigation.parseUrlHash(hash);\n delete parsed.params[key];\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static removeUrlParams(hash, keys) {\n if (!Array.isArray(keys)) {\n keys = [keys];\n }\n const parsed = HashNavigation.parseUrlHash(hash);\n for (const key of keys) {\n delete parsed.params[key];\n }\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlSidePanel(hash, sidepanel) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.path[0] = sidepanel;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlInfoPanel(hash, infopanel) {\n const parsed = HashNavigation.parseUrlHash(hash);\n if (infopanel) {\n parsed.params.info = infopanel;\n } else {\n delete parsed.params.info;\n }\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n\n static setUrlTopic(hash, topic) {\n const parsed = HashNavigation.parseUrlHash(hash);\n parsed.path[1] = topic;\n // Close InfoView on topic change.\n delete parsed.params.info;\n return HashNavigation.composeUrlHash(parsed.path, parsed.params);\n }\n}\n","// Short representation of time in the past.\nexport function shortDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n if (then.getFullYear() == now.getFullYear()) {\n // Same year.\n if (then.getMonth() == now.getMonth() && then.getDate() == now.getDate()) {\n // Same month and day, show time only.\n return then.toLocaleTimeString(locale, {hour12: false, hour: '2-digit', minute: '2-digit'});\n }\n // Different month and/or day, show month day, time.\n return then.toLocaleDateString(locale,\n {hour12: false, month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'});\n }\n // Different year: just show the date.\n return then.toLocaleDateString(locale, {year: 'numeric', month: 'short', day: 'numeric'});\n}\n\n// Representation a date relative to now.\nexport function relativeDateFormat(then, locale) {\n locale = locale || window.navigator.userLanguage || window.navigator.language;\n const now = new Date();\n const thenDays = Math.floor((then.getTime() - then.getTimezoneOffset() * 60_000) / 86_400_000);\n const nowDays = Math.floor((now.getTime() - now.getTimezoneOffset() * 60_000) / 86_400_000);\n const diff = thenDays - nowDays;\n if (Math.abs(diff) < 2) {\n // Today or yesterday.\n return new Intl.RelativeTimeFormat(locale, { numeric: 'auto' }).format(diff, 'day')\n }\n // More than two days: just show the date.\n return new Intl.DateTimeFormat(locale).format(then);\n}\n\n// Convert seconds to [hours:]minutes:seconds, i.e. 156 sec -> 2:36, 3756 sec -> 1:02:36.\n// If fixedMins is true, then minutes are represented by at least two digits.\nexport function secondsToTime(seconds, fixedMin) {\n if (typeof seconds != 'number') {\n return '';\n }\n\n let min = (Math.floor(seconds / 60) | 0) % 60;\n let hours = Math.floor(seconds / 3600) | 0;\n\n if (fixedMin || hours > 0) {\n min = min < 10 ? `0${min}` : min;\n }\n let sec = (seconds | 0) % 60;\n sec = sec < 10 ? `0${sec}` : sec;\n if (hours == 0) {\n return `${min}:${sec}`;\n }\n return `${hours}:${min}:${sec}`;\n}\n\n// Convert a number of bytes to human-readable format.\nexport function bytesToHumanSize(bytes) {\n if (!bytes || bytes == 0) {\n return '0 Bytes';\n }\n\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n const bucket = Math.min(Math.floor(Math.log2(bytes) / 10) | 0, sizes.length-1);\n const count = bytes / Math.pow(1024, bucket);\n const round = bucket > 0 ? (count < 3 ? 2 : (count < 30 ? 1 : 0)) : 0;\n return count.toFixed(round) + ' ' + sizes[bucket];\n}\n\n// Shorten a file name to be under maxLength by clipping out the middle.\nexport function shortenFileName(filename, maxLength) {\n if (typeof filename != 'string') {\n return filename;\n }\n return filename.length > maxLength ?\n filename.slice(0, maxLength/2 - 1) + '…' + filename.slice(1 - maxLength/2) : filename;\n}\n\n// Get 32 bit integer hash value for a string. Ideally it should produce the same value\n// as Java's String#hash().\nfunction stringToColorHash(value) {\n let hash = 0;\n value = '' + value;\n for (let i = 0; i < value.length; i++) {\n hash = ((hash << 5) - hash) + value.charCodeAt(i);\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\n// User avatar letter color id.\nexport function letterTileColorId(userId) {\n return Math.abs(stringToColorHash(userId)) % 16;\n}\n\n// Converts user or topic ID to a CSS color class. Ideally it should produce the same color value as Java version.\n// params:\n// - {string} id: user or topic ID\n// - {boolean} light: light or dark version of the color.\n// - {boolean} fg: foreground (text) or background color.\nexport function idToColorClass(id, light, fg) {\n return (light ? 'lt-' : 'dk-') + (fg ? 'fg-' : 'bg-') + letterTileColorId(id);\n}\n\n// Takes ISO Alpha-2 country code, like 'US' and converts it to a flag emoji.\nexport function flagEmoji(countryCode) {\n const codePoints = countryCode\n .toUpperCase()\n .split('')\n .map(char => 0x1F1A5 + char.charCodeAt());\n return String.fromCodePoint(...codePoints);\n}\n\n// Truncate a string to a specific length and add ellipsis if needed.\n// Support both LTR and RTL languages.\nexport function truncateString(str, maxLength) {\n if (typeof str !== 'string') {\n return str;\n }\n if (str.length <= maxLength) {\n return str;\n }\n\n // Detect RTL characters in the string and truncate accordingly.\n const isRTL = /[\\u0590-\\u05FF\\u0600-\\u06FF\\u0750-\\u077F\\u08A0-\\u08FF\\uFB50-\\uFDFF\\uFE70-\\uFEFF]/.test(str);\n return isRTL ? '…' + str.slice(0, maxLength - 1) : str.slice(0, maxLength - 1) + '…';\n}\n","import React from 'react';\n\n// Many product-prototype views fetch their data with `useState(null)` + a `useEffect` that calls an\n// im-api.js getter. Every one of those unmounts when the user switches to a different sidepanel/tab\n// and remounts from scratch on the way back -- React state doesn't survive that, so the screen goes\n// blank (or shows a \"加载中\" placeholder) again while the same request that already succeeded once\n// this session re-runs. Reported directly: switching between pages feels like it reloads every time.\n//\n// This hook keeps a module-level cache (survives unmount/remount, cleared only by a real page reload)\n// keyed by whatever string the caller passes in, so a remounted view can paint its last-known-good\n// data immediately while a fresh request updates it in the background -- the request still always\n// happens, this only removes the empty flash while waiting for it.\nconst cache = new Map();\n\n// `fetcher` is called on every mount/dep-change (this is not a TTL cache -- there's no staleness\n// window, it always revalidates), but the *first* render after mount can use the previous result\n// for this key instead of null. `key` should already encode whatever varies the result (e.g. include\n// a user id or a \"mine\"/\"team\" flag) -- this module doesn't know how to derive that itself.\nexport function useCachedData(key, fetcher, deps) {\n const [data, setData] = React.useState(() => (key ? cache.get(key) : undefined));\n const [loading, setLoading] = React.useState(() => !!key && !cache.has(key));\n\n React.useEffect(() => {\n if (!key) return;\n let live = true;\n let retried = false;\n // Don't flip back to a loading state just because deps changed while we already have a cached\n // value for the new key -- only the truly-never-fetched case should show a loading affordance.\n setLoading(!cache.has(key));\n const attempt = () => fetcher().then(result => {\n if (!live) return;\n cache.set(key, result);\n setData(result);\n setLoading(false);\n }).catch(() => {\n if (!live) return;\n // A transient failure on the very *first* fetch for this key -- nothing cached yet to fall\n // back on -- used to leave `data` stuck at undefined for the rest of the session, since\n // nothing else ever re-triggers this effect unless `key`/`deps` change. One retry after a\n // short delay covers the common case (a network blip during initial page load) without\n // retry-storming a persistently failing endpoint. A key that already has *some* cached value\n // keeps the original behavior (show the stale value, don't retry) -- that case is already\n // showing the user something, so it's lower urgency than the stuck-at-nothing case.\n if (!retried && !cache.has(key)) {\n retried = true;\n window.setTimeout(() => { if (live) attempt(); }, 3000);\n return;\n }\n // Keep whatever stale/cached value was already showing rather than clearing it on a transient\n // failure -- a blank screen on error is worse than a slightly-out-of-date one.\n setLoading(false);\n });\n attempt();\n return () => { live = false; };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key, ...(deps || [])]);\n\n return [data, loading];\n}\n\n// For the (rarer) case a view wants to seed its own useState from the cache directly -- e.g. when it\n// needs to merge the cached value with other local state instead of holding it as the sole source of\n// truth. Does not itself revalidate; pair it with writeCachedData once a fresh fetch resolves.\nexport function readCachedData(key) {\n return key ? cache.get(key) : undefined;\n}\n\nexport function writeCachedData(key, value) {\n if (key) cache.set(key, value);\n}\n\n// 搜索框防抖:返回一个滞后于 `value` 的值,只有停止输入 `delay` 毫秒后才更新。\n// 用途是把\"每敲一个字符发一次请求\"降成\"停下来才发一次\"。收藏搜索、会话内检索、群聊搜索\n// 原来都是把 query 直接放进 effect 依赖里,输入 6 个字的关键词就打 6 次接口,\n// 而且返回顺序没有保证——后发的短前缀请求可能后到,把正确结果覆盖掉。\nexport function useDebouncedValue(value, delay = 300) {\n const [debounced, setDebounced] = React.useState(value);\n React.useEffect(() => {\n if (value === debounced) return undefined;\n const timer = window.setTimeout(() => setDebounced(value), delay);\n return () => window.clearTimeout(timer);\n }, [value, delay, debounced]);\n return debounced;\n}\n","// Odds and ends\n\nimport { Tinode } from 'tinode-sdk';\nimport { WALLPAPER_DEFAULTS } from '../config.js';\n\n// The backend's REST group layer writes a group's display name into its native Tinode `public`\n// blob under a plain `name` key instead of the protocol-standard `fn` the SDK (and every other\n// Tinode client) expects -- confirmed live against a freshly created group: `topic.public` comes\n// back as `{name:'...', version:1}`, no `fn` at all. P2P/self topics are unaffected (their `public`\n// really does carry `fn`). Until the backend writes `fn` correctly, every place that shows a\n// topic's name has to fall back to `public.name` specifically for groups, or every group in the\n// app displays as \"未命名\"/\"未命名会话\" (unnamed) -- this happened in the chat header, the\n// conversation list, and the contact-list widget (used by member/forward pickers) before this.\nexport function topicDisplayName(topicName, publicData, fallback) {\n const fn = publicData && publicData.fn;\n if (fn) return fn;\n if (publicData && Tinode.isGroupTopicName(topicName) && publicData.name) return publicData.name;\n // 自聊天(slf)没有 public,原来会一路落到 fallback —— 消息首页因此把它显示成\"未命名会话\"。\n // 它的显示名靠 Tinode.isSelfTopicName 特判得出,不在 public 里。这里集中处理,所有调用点都受益;\n // 已经自己判过的地方(batch-forward-dialog 等)在调用前就短路了,不受影响。\n if (Tinode.isSelfTopicName(topicName)) return '已保存的消息';\n return fallback;\n}\n\n// Make shortcut icon appear with a green dot + show unread count in title.\nexport function updateFavicon(count) {\n const oldIcon = document.getElementById('shortcut-icon');\n const head = document.head || document.getElementsByTagName('head')[0];\n const newIcon = document.createElement('link');\n newIcon.type = 'image/png';\n newIcon.id = 'shortcut-icon';\n newIcon.rel = 'shortcut icon';\n newIcon.href = 'img/logo32x32' + (count > 0 ? 'a' : '') + '.png';\n if (oldIcon) {\n head.removeChild(oldIcon);\n }\n head.appendChild(newIcon);\n\n document.title = (count > 0 ? '('+count+') ' : '') + 'Tinode';\n}\n\n// Create theCard which represents user's or topic's \"public\" info.\nexport function theCard(fn, imageUrl, imageMimeType, note) {\n let card = null;\n fn = fn && fn.trim();\n note = note && note.trim();\n\n if (fn) {\n card = {\n fn: fn\n };\n }\n\n if (typeof note == 'string') {\n card = card || {};\n card.note = note ? note : Tinode.DEL_CHAR;\n }\n\n if (imageUrl) {\n card = card || {};\n let mimeType = imageMimeType;\n // Is this a data URL \"data:[][;base64],\"?\n const matches = /^data:(image\\/[-a-z0-9+.]+)?(;base64)?,/i.exec(imageUrl);\n if (matches) {\n mimeType = matches[1];\n card.photo = {\n data: imageUrl.substring(imageUrl.indexOf(',') + 1),\n ref: Tinode.DEL_CHAR\n };\n } else {\n card.photo = {\n data: Tinode.DEL_CHAR,\n ref: imageUrl\n };\n }\n card.photo.type = (mimeType || 'image/jpeg').substring('image/'.length);\n }\n\n return card;\n}\n\n// Deep-shallow compare two arrays: shallow compare each element.\nexport function arrayEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (!Array.isArray(a) || !Array.isArray(b)) {\n return false;\n }\n\n // Compare lengths first.\n if (a.length != b.length) {\n return false;\n }\n // Order of elements is ignored.\n a.sort();\n b.sort();\n for (let i = 0, l = a.length; i < l; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\n// Checks (loosely) if the given string is a phone. If so, returns the phone number in a format\n// as close to E.164 as possible.\nexport function asPhone(val) {\n val = val.trim();\n if (/^(?:\\+?(\\d{1,3}))?[- (.]*(\\d{3})[- ).]*(\\d{3})[- .]*(\\d{2})[- .]*(\\d{2})?$/.test(val)) {\n return val.replaceAll(/[- ().]*/g, '');\n }\n return null;\n}\n\n// Checks (loosely) if the given string is an email. If so returns the email.\nexport function asEmail(val) {\n val = val.trim();\n if (/^[a-z0-9_.+-]+@[a-z0-9-]+(\\.[a-z0-9-]+)+$/i.test(val)) {\n return val;\n }\n return null;\n}\n\n// Checks if URL is a relative url, i.e. has no 'scheme://', including the case of missing scheme '//'.\n// The scheme is expected to be RFC-compliant, e.g. [a-z][a-z0-9+.-]*\n// example.html - ok\n// https:example.com - not ok.\n// http:/example.com - not ok.\n// //example.com or \\\\example.com - not ok.\n// ' ↲ https://example.com' - not ok. (↲ means carriage return)\nexport function isUrlRelative(url) {\n // Replacing backslashes with forward slashes to mimic JS URL parser then testing for\n // 'scheme:' and '//' with optional space at the start.\n return url && !/^\\s*([a-z][a-z0-9+.-]*:|\\/\\/)/im.test(url.replace(/\\\\/g, '/'));\n}\n\n// Ensure URL does not present an XSS risk. Optional allowedSchemes may contain an array of\n// strings with permitted URL schemes, such as ['ftp', 'ftps']; otherwise accept http and https only.\nexport function sanitizeUrl(url, allowedSchemes) {\n if (typeof url != 'string') {\n return url;\n }\n\n // Strip control characters and whitespace. They are not valid URL characters anyway.\n url = url.replace(/[^\\x21-\\x7E]/gmi, '').trim();\n\n // Replace backslashes with forward slashes. They will be replaced in the URL parser anyway.\n url = url.replace(/\\\\/g, '/');\n\n // Relative URLs are safe.\n // Relative URL does not start with ':', abcd123: or '//'.\n if (!/^([a-z][a-z0-9+.-]*:|\\/\\/)/i.test(url)) {\n return url;\n }\n\n // Blob URLs are safe.\n if (/^blob:http/.test(url)) {\n return url;\n }\n\n // Absolute URL. Accept only safe schemes, or no scheme.\n const schemes = Array.isArray(allowedSchemes) ? allowedSchemes.join('|') : 'http|https';\n const re = new RegExp('^((' + schemes + '):|//)', 'i');\n if (!re.test(url)) {\n return null;\n }\n\n return url;\n}\n\n// Ensure URL is suitable as a source like field: the URL must be a relative URL or\n// have http:, https:, blob: or data: scheme.\n// In case of data: scheme, the URL must must be of the right MIME type such as 'data:{mimeMajor}/XXXX;base64,'.\nexport function sanitizeUrlForMime(url, mimeMajor) {\n if (!url) {\n return null;\n }\n\n const sanitizedUrl = sanitizeUrl(url);\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Is this a data: URL of the appropriate mime type?\n const re = new RegExp(`data:${mimeMajor}\\/[-+.a-z0-9]+;base64,`, 'i');\n if (re.test(url.trim())) {\n return url;\n }\n\n return null;\n}\n\n// Append query parameter 'asatt=1' to the URL.\n// It will cause Tinode server to add 'Content-Disposition: attachment' header when serving it.\n// The URL is a string. The URL here is always absolute.\nexport function urlAsAttachment(url) {\n // TODO: check if URL is local or remote, i.e. compare to window.location.origin.\n /*\n if (typeof window.location == 'object') {\n if (!url.startsWith(window.location.origin)) {\n return url;\n }\n }\n */\n // Check if the URL is a data or blob. Do not alter such URLs.\n if (url.startsWith('data:') || url.startsWith('blob:')) {\n return url;\n }\n\n // Split URL into host+path, query, fragment.\n let query = '', fragment = '';\n const idxF = url.indexOf('#');\n if (idxF > 0) {\n fragment = url.substring(idxF+1);\n url = url.substring(0, idxF);\n }\n const idxQ = url.indexOf('?');\n if (idxQ > 0) {\n query = url.substring(idxQ+1);\n url = url.substring(0, idxQ);\n }\n // Add parameter and reassemble.\n const params = new URLSearchParams(query);\n params.append('asatt', '1');\n return `${url}?${params.toString()}` + (fragment ? `#${fragment}` : '');\n}\n\n// Given message's received status, return name and color of a delivery indicator icon.\nexport function deliveryMarker(received) {\n switch (received) {\n case Tinode.MESSAGE_STATUS_SENDING:\n return { name: 'access_time' }; // watch face\n case Tinode.MESSAGE_STATUS_FAILED:\n case Tinode.MESSAGE_STATUS_FATAL:\n return { name: 'warning', color: 'red' }; // red icon /!\\\n case Tinode.MESSAGE_STATUS_SENT:\n return { name: 'done' }; // checkmark\n case Tinode.MESSAGE_STATUS_RECEIVED:\n return { name: 'done_all' }; // double checkmark\n case Tinode.MESSAGE_STATUS_READ:\n return { name: 'done_all', color: 'blue' }; // blue double checkmark\n }\n return null;\n}\n\n// Wraps a promise to make it cancelable.\n// The parameter can be either a promise or an error. If it's an error, the wrapped promise is\n// created in a rejected state.\nexport function cancelablePromise(promise) {\n let hasCanceled = false;\n\n const wrappedPromise = promise instanceof Error ?\n Promise.reject(promise) :\n new Promise((resolve, reject) => {\n promise.then(\n result => hasCanceled ? reject({isCanceled: true}) : resolve(result),\n error => hasCanceled ? reject({isCanceled: true}) : reject(error)\n );\n });\n\n return {\n promise: wrappedPromise,\n cancel() {\n hasCanceled = true;\n },\n };\n};\n\nexport function defaultWallpaper() {\n const wallpaperIndex = require('../../img/bkg/index.json');\n const wp = wallpaperIndex[WALLPAPER_DEFAULTS.type][WALLPAPER_DEFAULTS.index];\n return {name: `../${WALLPAPER_DEFAULTS.path}${wp.name}`, size: wp.size};\n}\n\nexport function wallpaperNameFromUrl(wallpaperUrl) {\n // Get filename from URL.\n const parts = wallpaperUrl.split('/');\n return parts[parts.length - 1];\n}\n\nexport function wallpaperTypeFromUrl(wallpaperUrl) {\n // Get filename from URL.\n const fname = wallpaperNameFromUrl(wallpaperUrl);\n const wallpaperIndex = require('../../img/bkg/index.json');\n for (const type in wallpaperIndex) {\n for (let i = 0; i < wallpaperIndex[type].length; i++) {\n if (wallpaperIndex[type][i].name == fname) {\n return type;\n }\n }\n }\n return null;\n}\n","// This is a generated file. Don't edit.\n\nexport const PACKAGE_VERSION = \"0.25.3\";\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class AccGeneralView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n colorSchema: props.colorSchema || 'auto',\n textSize: (props.textSize * 10) || '100',\n sendOnEnter: props.sendOnEnter || 'plain',\n };\n\n this.isMac = ((navigator.userAgentData && navigator.userAgentData.platform)\n || navigator.platform).toLowerCase().startsWith('mac');\n this.handleColorSchemaSelected = this.handleColorSchemaSelected.bind(this);\n this.handleTextSizeChanged = this.handleTextSizeChanged.bind(this);\n this.handleSendOnEnterSelected = this.handleSendOnEnterSelected.bind(this);\n }\n\n handleColorSchemaSelected(e) {\n this.setState({colorSchema: e.currentTarget.value});\n this.props.onChangeColorSchema(e.currentTarget.value);\n }\n\n handleTextSizeChanged(e) {\n // In %%.\n this.setState({textSize: e.currentTarget.value});\n // Convert %% to pt, 100% = 10pt.\n this.props.onTextSizeChanged((e.currentTarget.value / 10) | 0);\n }\n\n handleSendOnEnterSelected(e) {\n this.setState({sendOnEnter: e.currentTarget.value});\n this.props.onSendOnEnterChanged(e.currentTarget.value);\n }\n\n render() {\n return (\n \n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\n\nexport default class AccNotificationsView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCheckboxClick = this.handleCheckboxClick.bind(this);\n }\n\n handleCheckboxClick(what, checked) {\n if (what == 'sound') {\n this.props.onToggleMessageSounds(checked);\n } else if (what == 'alert') {\n this.props.onTogglePushNotifications(checked);\n }\n }\n\n render() {\n return (\n \n
\n \n \n \n \n
\n
\n \n {this.props.desktopAlertsEnabled ?\n \n :\n \n }\n \n \n
\n
\n );\n }\n};\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { APP_NAME, LINK_CONTACT_US, LINK_PRIVACY_POLICY, LINK_TERMS_OF_SERVICE } from '../config.js';\n\nexport default class AccSupportView extends React.PureComponent {\n render() {\n return (\n \n
\n
\n
\n
\n \n {APP_NAME}\n
\n
\n \n {Tinode.getLibrary()}\n
\n
\n \n {this.props.serverVersion}\n
\n
\n \n {this.props.serverAddress}\n
\n
\n
\n );\n }\n};\n","import React from 'react';\n\nimport HashNavigation from '../lib/navigation.js';\nimport {\n resolveTenant, submitTenantApplication, submitTenantEntryFeedback, uploadPublicFile,\n requestVerificationCode, verifyRegisterCode, verifyPasswordResetCode, confirmPasswordReset,\n createSecurityChallenge, verifySecurityChallenge, getRealnameStatus, submitRealname, setIndependentPassword,\n getYouthMode, enableYouthMode\n} from '../lib/im-api.js';\n\nconst USERNAME_RE = /^[a-z0-9]{1,10}$/;\nconst PHONE_RE = /^\\d{11}$/;\nconst INVITE_RE = /^[A-Za-z]{5}$/;\nconst CREDIT_CODE_RE = /^[0-9A-Z]{18}$/;\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n// params is optional and additive only -- every existing call site that passes just `view` keeps\n// producing the exact same bare hash as the old `HashNavigation.navigateTo(view)` did.\nconst navigate = (view, params) => HashNavigation.navigateTo(HashNavigation.composeUrlHash([view], params || {}));\n\nfunction Icon({children, className = ''}) {\n return {children} ;\n}\n\nfunction AppMark({tenantName}) {\n return \n
J
\n
{tenantName || '即时通讯'} \n
;\n}\n\nfunction Header({title, back = 'tenant'}) {\n return \n { if (!HashNavigation.goBack()) navigate(back); }} aria-label=\"返回\">\n arrow_back_ios_new \n \n {title} \n \n ;\n}\n\nfunction Field({icon, onIconClick, action, error, className = '', ...props}) {\n return \n
\n {icon ? (onIconClick ?\n {icon} :\n {icon} ) : null}\n \n {action}\n
\n {error ?
{error}
: null}\n
;\n}\n\nfunction PasswordField(props) {\n const [visible, setVisible] = React.useState(false);\n return setVisible(!visible)}\n aria-label={visible ? '隐藏密码' : '显示密码'}>{visible ? 'visibility' : 'visibility_off'} } />;\n}\n\nfunction Agreement({checked, onChange, prefix = '同意捷信密使'}) {\n return \n onChange(e.target.checked)} />\n {prefix} e.preventDefault()}>《用户协议》 和 e.preventDefault()}>《隐私政策》 \n ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2800);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? check_circle {message}
: null;\n}\n\n// Shared alert for errors coming back from a real API/WS call (as opposed to local form validation,\n// which each form already reports inline per-field).\nfunction FormAlert({text}) {\n return text ? error_outline {text}
: null;\n}\n\nfunction TenantEntry({onTenantResolved}) {\n const [code, setCode] = React.useState(sessionStorage.getItem('im-tenant-code') || '');\n const [error, setError] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n\n const submit = async e => {\n e.preventDefault();\n const value = code.trim();\n if (!value || value.length > 64) {\n setError(value ? '企业码不能超过 64 个字符' : '请输入企业码');\n return;\n }\n setBusy(true);\n setError('');\n try {\n const data = await resolveTenant(value);\n // Kept for the mock UI's own display of the tenant name while on this screen; the durable\n // context (read by every subsequent /v1/im/* call and by the {hi} tenant field) is persisted\n // by onTenantResolved.\n sessionStorage.setItem('im-tenant-code', data.tenant.code || value);\n sessionStorage.setItem('im-tenant-name', data.tenant.name || data.tenant.code || value);\n onTenantResolved(data, value);\n navigate('login');\n } catch (err) {\n // Per the product spec, tenant-resolve failures are shown as one generic message\n // regardless of reason (not found vs. disabled vs. rate limited).\n setError('企业码不存在或已停用,请核实后重试');\n } finally {\n setBusy(false);\n }\n };\n\n return \n
navigate('enterprise-register')}>企业注册 \n
\n \n { setCode(e.target.value); setError(''); }}\n placeholder=\"请输入企业码\" autoComplete=\"organization\" maxLength=\"64\" error={error} autoFocus />\n {busy ? '进入中…' : '进入企业'} \n \n
navigate('enterprise-feedback')}>遇到问题? \n
;\n}\n\nfunction Login({tenantName, login, loginDisabled, persist, errorText, errorLevel, onLoginRequest, onPersistenceChange, onError}) {\n const [account, setAccount] = React.useState(login || '');\n const [password, setPassword] = React.useState('');\n const [agreed, setAgreed] = React.useState(false);\n\n // The prototype (docs/images/登录页面.png) has no \"stay logged in\" checkbox -- a consumer IM app\n // just keeps you signed in. Opt in silently instead of exposing the old debug-era toggle.\n React.useEffect(() => {\n if (!persist) {\n onPersistenceChange(true);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Real login failures (wrong password, disabled account, ...) clear the password and keep the account,\n // matching the product spec.\n React.useEffect(() => {\n if (errorLevel === 'err' && errorText) {\n setPassword('');\n }\n }, [errorText, errorLevel]);\n\n const submit = e => {\n e.preventDefault();\n if (!account.trim() || !password || !agreed || loginDisabled) return;\n onLoginRequest(account.trim(), password);\n };\n\n return \n
{ onError && onError(); navigate('tenant'); }}>arrow_back_ios_new 切换企业 \n
\n \n \n setAccount(e.target.value)}\n placeholder=\"请输入用户名/手机号\" autoComplete=\"username\" />\n setPassword(e.target.value)}\n placeholder=\"请输入密码\" autoComplete=\"current-password\" />\n navigate('reset')}>忘记密码
\n \n {loginDisabled ? '登录中…' : '登录'}\n \n 没有账户? navigate('register')}>马上注册
\n \n
\n
;\n}\n\nfunction EnterpriseRegister() {\n const [creditCode, setCreditCode] = React.useState('');\n const [email, setEmail] = React.useState('');\n const [file, setFile] = React.useState(null);\n const [errors, setErrors] = React.useState({});\n const [submitting, setSubmitting] = React.useState(false);\n const [submitted, setSubmitted] = React.useState(false);\n const [reviewDays, setReviewDays] = React.useState(1);\n const [toast, setToast] = React.useState('');\n\n React.useEffect(() => () => file && URL.revokeObjectURL(file.url), [file]);\n\n const chooseFile = e => {\n const selected = e.target.files[0];\n if (!selected) return;\n if (selected.size > 10 * 1024 * 1024 || !['image/jpeg', 'image/png', 'image/webp', 'application/pdf'].includes(selected.type)) {\n setErrors({...errors, file: '支持 JPG、PNG、WebP、PDF,文件不超过 10MB'});\n return;\n }\n if (file) URL.revokeObjectURL(file.url);\n setFile({name: selected.name, type: selected.type, url: URL.createObjectURL(selected), blob: selected});\n setErrors({...errors, file: ''});\n };\n\n const submit = async e => {\n e.preventDefault();\n const next = {};\n if (!CREDIT_CODE_RE.test(creditCode)) next.creditCode = '请输入 18 位统一社会信用代码';\n if (email && !EMAIL_RE.test(email)) next.email = '请输入有效的企业邮箱';\n setErrors(next);\n if (Object.keys(next).length) return;\n\n setSubmitting(true);\n try {\n let licenseFileId = '';\n if (file) {\n const uploaded = await uploadPublicFile(file.blob, 'enterprise_license');\n licenseFileId = uploaded.file_id;\n }\n const data = await submitTenantApplication({\n credit_code: creditCode,\n enterprise_email: email,\n license_file_id: licenseFileId,\n tenant_code_hint: sessionStorage.getItem('im-tenant-code') || ''\n });\n // Prototype (docs/images/企业注册-填写注册信息.png) states this in business days, not hours.\n setReviewDays(Math.max(1, Math.round((data.estimated_review_hours || 24) / 24)));\n setSubmitted(true);\n setToast('提交成功,我们会尽快联系你');\n } catch (err) {\n setErrors({...next, form: err.message || '提交失败,请稍后重试'});\n } finally {\n setSubmitting(false);\n }\n };\n\n return \n
\n
\n \n 1 填写企业信息 \n 2 确定信息 \n 3 提交审核 \n \n \n \n 统一社会信用代码 \n setCreditCode(e.target.value.trim().toUpperCase().replace(/[^0-9A-Z]/g, ''))}\n placeholder=\"请输入18位统一社会信用代码\" maxLength=\"18\" icon=\"qr_code_scanner\" error={errors.creditCode}\n onIconClick={() => setToast('扫码识别暂不可用,请手动输入')} />\n 请填写营业执照上的统一社会信用代码
\n\n 上传营业执照 选填 \n \n \n {file && file.type !== 'application/pdf' ? : add_photo_alternate }\n {file ? file.name : '点击上传营业执照'} \n 支持 JPG、PNG、WebP、PDF,不超过 10MB \n \n {file ? { URL.revokeObjectURL(file.url); setFile(null); }}>移除文件 : null}\n {errors.file ? {errors.file}
: null}\n\n 企业邮箱 选填 \n setEmail(e.target.value)}\n placeholder=\"请输入企业邮箱\" type=\"email\" error={errors.email} />\n 用于接收审核结果及企业通知
\n \n {submitted ? '已提交' : submitting ? '提交中…' : '提交资料'}\n \n schedule 资料提交后,预计 {reviewDays} 个工作日完成审核
\n \n \n
setToast('')} />\n ;\n}\n\n// Per docs/images/企业注册-问题反馈.png: titled \"意见反馈\", 300-char textarea with the instructions\n// as its placeholder (not a separate label), \"图片(N/9)\" counter-style label, and no contact field.\nfunction EnterpriseFeedback() {\n const [description, setDescription] = React.useState('');\n const [files, setFiles] = React.useState([]);\n const [error, setError] = React.useState('');\n const [submitting, setSubmitting] = React.useState(false);\n const [toast, setToast] = React.useState('');\n\n const addFiles = e => {\n const selected = Array.from(e.target.files || []).slice(0, 9 - files.length);\n const valid = selected.filter(file => file.size <= 10 * 1024 * 1024 && ['image/jpeg', 'image/png', 'image/webp'].includes(file.type));\n setFiles(files.concat(valid.map(file => ({name: file.name, url: URL.createObjectURL(file), blob: file}))));\n };\n const submit = async e => {\n e.preventDefault();\n const length = description.trim().length;\n if (length < 10 || length > 300) {\n setError('问题描述需为 10 至 300 个字符');\n return;\n }\n setSubmitting(true);\n try {\n const screenshotFileIds = [];\n for (const item of files) {\n const uploaded = await uploadPublicFile(item.blob, 'tenant_entry_feedback');\n screenshotFileIds.push(uploaded.file_id);\n }\n await submitTenantEntryFeedback({\n description: description.trim(),\n tenant_code_hint: sessionStorage.getItem('im-tenant-code') || '',\n screenshot_file_ids: screenshotFileIds\n });\n setToast('已收到反馈,我们会尽快处理');\n files.forEach(item => URL.revokeObjectURL(item.url));\n setDescription(''); setFiles([]); setError('');\n } catch (err) {\n setError(err.message || '提交失败,请稍后重试');\n } finally {\n setSubmitting(false);\n }\n };\n\n return \n
\n
\n \n 问题反馈 \n { setDescription(e.target.value); setError(''); }}\n placeholder=\"为了更好的帮您解决问题,请在提交问题时上传截图信息,方便我们更快速的帮助您解决问题。\" className={error ? 'invalid' : ''} />\n {description.length}/300
\n {error ? {error}
: null}\n 图片({files.length}/9) \n \n {files.map((file, index) =>
\n
\n
{ URL.revokeObjectURL(file.url); setFiles(files.filter((_, i) => i !== index)); }} aria-label=\"删除截图\">close \n
)}\n {files.length < 9 ?
photo_camera 点击上传 : null}\n
\n {submitting ? '提交中…' : '提交'} \n \n \n
setToast('')} />\n ;\n}\n\n// Requests a phone verification code (scene: 'register' | 'reset_password' | 'security') and reports the\n// resulting challenge_id upward -- the caller needs it to verify the code the user types in.\nfunction VerificationButton({phone, scene = 'register', onChallenge, onError}) {\n const [seconds, setSeconds] = React.useState(0);\n const [busy, setBusy] = React.useState(false);\n React.useEffect(() => {\n if (!seconds) return undefined;\n const timer = window.setTimeout(() => setSeconds(s => s - 1), 1000);\n return () => window.clearTimeout(timer);\n }, [seconds]);\n\n const click = async () => {\n if (busy || seconds > 0 || !PHONE_RE.test(phone)) return;\n setBusy(true);\n try {\n const data = await requestVerificationCode(scene, phone);\n onChallenge(data.challenge_id);\n setSeconds(data.resend_after_seconds || 60);\n } catch (err) {\n onError && onError(err.message || '获取验证码失败');\n if (err.details && err.details.retry_after_seconds) {\n setSeconds(err.details.retry_after_seconds);\n }\n if (err.details && err.details.challenge_id) {\n // Rate-limited but a still-valid challenge already exists for this phone/scene -- reuse it.\n onChallenge(err.details.challenge_id);\n }\n } finally {\n setBusy(false);\n }\n };\n\n return 0 || !PHONE_RE.test(phone)} onClick={click}>\n {seconds > 0 ? `${seconds}s` : busy ? '发送中…' : '获取验证码'}\n ;\n}\n\n// Per the actual prototype screenshots (docs/images/注册页面.png), all fields are shown together --\n// no phone-vs-username mode toggle. \"Phone takes precedence\" (per the spec text) is validation-only:\n// if a phone is filled it must be verified; the invite code is only required for a username-only\n// signup (matching the mock's original submit-time validation, now with real backend calls behind it).\nfunction Register({errorText, errorLevel, onImRegisterRequest}) {\n const [form, setForm] = React.useState({username: '', phone: '', code: '', password: '', invite: ''});\n const [challengeId, setChallengeId] = React.useState('');\n const [agreed, setAgreed] = React.useState(false);\n const [errors, setErrors] = React.useState({});\n const [submitting, setSubmitting] = React.useState(false);\n const change = key => e => setForm({...form, [key]: e.target.value});\n const usingPhone = !!form.phone;\n\n // onImRegisterRequest (tinode-web.jsx's handleImRegisterRequest -> a WS connect+createAccountBasic\n // chain) isn't awaited and doesn't return a promise -- on the username/invite-code path (no\n // verifyRegisterCode await ahead of it) `submit` returns and its `finally` clears `submitting`\n // within milliseconds, long before that WS round-trip finishes, leaving the button re-clickable\n // and able to fire a second concurrent registration. The parent's only failure signal is these\n // props changing, so hold `submitting` until either that happens or the phone-path's own catch\n // already handled it (success unmounts this component regardless).\n React.useEffect(() => {\n if (errorLevel === 'err' && errorText) setSubmitting(false);\n }, [errorText, errorLevel]);\n\n const submit = async e => {\n e.preventDefault();\n const next = {};\n if (!form.username && !form.phone) next.username = '用户名和手机号至少填写一项';\n if (form.username && !USERNAME_RE.test(form.username)) next.username = '用户名仅支持 1-10 位小写字母或数字';\n if (usingPhone) {\n if (!PHONE_RE.test(form.phone)) next.phone = '请输入 11 位手机号';\n if (!challengeId) next.code = '请先获取验证码';\n else if (!/^\\d{6}$/.test(form.code)) next.code = '请输入 6 位验证码';\n } else if (!INVITE_RE.test(form.invite)) {\n next.invite = '用户名注册需填写 5 位字母邀请码';\n }\n if (form.password.length < 8) next.password = '密码至少 8 位';\n setErrors(next);\n if (Object.keys(next).length) return;\n\n setSubmitting(true);\n try {\n if (usingPhone) {\n const verified = await verifyRegisterCode(challengeId, form.code);\n // The username field is optional even on the phone path -- filling in both used to silently\n // drop the typed username (always sent '' and always logged in as the phone), because the\n // server only auto-assigns a random handle when username is actually empty\n // (server/user.go resolveRegistrationAccount: username!=\"\" && phone!=\"\" => account=username,\n // secretAccount=username; only username==\"\" falls back to the phone-derived random handle).\n // Per the protocol spec, the phone number itself must never become the display name -- leave\n // it blank when no username was typed either (server assigns a random handle; the user can\n // set a nickname afterwards).\n const secretAccount = form.username || ('+86' + form.phone);\n onImRegisterRequest(secretAccount, form.password, form.username || '',\n // 邀请码不能在手机号路径上丢掉:后端 user.go:175-181 对邀请码的校验和 RecordUse 都不区分\n // 注册路径(`if inviteCode != \"\"` 就会校验并记录),而且 user.go:169 的\n // inviteRequired 在短信通道关闭时对手机号注册同样为真。UI 上明明摆着邀请码输入框,\n // 原来却硬传空串,用户填了也被静默丢弃,邀请来源统计全丢。\n {username: form.username || '', phone: form.phone, invite_code: form.invite || ''},\n {meth: 'tel', val: form.phone, resp: verified.verification_token, params: {challenge_id: challengeId}});\n } else {\n onImRegisterRequest(form.username, form.password, form.username,\n {username: form.username, phone: '', invite_code: form.invite}, null);\n }\n // On success the parent (tinode-web.jsx handleImRegisterRequest -> handleLoginSuccessful)\n // navigates away (unmounting this component, so `submitting` no longer matters); on failure\n // it surfaces errorText/errorLevel, which the effect above clears `submitting` on. No\n // `finally` here on purpose -- onImRegisterRequest isn't awaited (it's not a promise), so a\n // `finally` would clear `submitting` within milliseconds on the username/invite-code path,\n // long before that request's own WS round-trip resolves, defeating the double-submit guard.\n } catch (err) {\n setErrors({...next, code: err.message || '验证码错误或已过期'});\n setSubmitting(false);\n }\n };\n\n return \n
\n \n \n setForm({...form, username: e.target.value.replace(/[^a-z0-9]/g, '').slice(0, 10)})}\n placeholder=\"请输入用户名\" error={errors.username} autoComplete=\"username\" />\n setForm({...form, phone: e.target.value.replace(/\\D/g, '').slice(0, 11)})}\n placeholder=\"请输入手机号\" error={errors.phone} inputMode=\"numeric\" />\n setForm({...form, code: e.target.value.replace(/\\D/g, '').slice(0, 6)})}\n placeholder=\"请输入短信验证码\" inputMode=\"numeric\" error={errors.code}\n action={ setErrors(e => ({...e, code: msg}))} />} />\n \n setForm({...form, invite: e.target.value.replace(/[^A-Za-z]/g, '').slice(0, 5)})}\n placeholder=\"请输入邀请码(非必填)\" error={errors.invite} />\n \n {submitting ? '注册中…' : '注册'}\n \n 已有讯工捷迅账号? navigate('login')}>登录
\n \n
\n
;\n}\n\nfunction PasswordReset() {\n const [form, setForm] = React.useState({phone: '', code: '', password: '', confirm: ''});\n const [challengeId, setChallengeId] = React.useState('');\n const [error, setError] = React.useState('');\n const [submitting, setSubmitting] = React.useState(false);\n const [toast, setToast] = React.useState('');\n const change = key => e => setForm({...form, [key]: e.target.value});\n\n const submit = async e => {\n e.preventDefault();\n if (!PHONE_RE.test(form.phone)) return setError('请输入 11 位手机号');\n if (!challengeId || !/^\\d{6}$/.test(form.code)) return setError('请先获取并输入 6 位验证码');\n // Matches Register's rule (>= 8, no upper bound -- the backend's own checkPasswordPolicy only\n // enforces a minimum length). This page used to also reject anything over 20 characters, a limit\n // invented here with no backend counterpart: a password set during registration could exceed\n // it, then resetting it back to that same value through this flow would be rejected -- a\n // self-inflicted lockout for password reset's own sake.\n if (form.password.length < 8) return setError('密码至少 8 位');\n if (form.password !== form.confirm) return setError('两次输入的密码不一致');\n\n setSubmitting(true);\n setError('');\n try {\n const verified = await verifyPasswordResetCode(challengeId, form.code);\n await confirmPasswordReset(verified.reset_token, form.password);\n setToast('密码修改成功,请重新登录');\n window.setTimeout(() => navigate('login'), 1200);\n } catch (err) {\n setError(err.message || '验证码错误或已过期');\n setSubmitting(false);\n }\n };\n return ;\n}\n\n// Precedes 1.11 (setting the independent password): resolves the account's own verified phone\n// server-side (POST /v1/im/security/challenges never takes a phone number from the client) and, on\n// successful verify, stashes the resulting action_token for the next screen to spend.\nconst IDENTITY_CHECK_SCENE = 'set_independent_password';\n\nfunction IdentityCheck({authenticated, hashParams}) {\n // Carries through whichever youth-mode flow (enable/disable) sent the user here via \"忘记独立\n // 密码?\", if any -- IndependentPassword needs it to know whether to auto-continue into actually\n // enabling youth mode, since the server hands back an enable-flow token unconditionally on every\n // successful password (re)set regardless of why the caller got here. Absent (undefined) for the\n // unrelated generic \"身份验证\" entry in acc-security-view.jsx, which should never touch youth mode.\n const mode = hashParams && hashParams.ym;\n const [phoneMask, setPhoneMask] = React.useState('');\n const [challengeId, setChallengeId] = React.useState('');\n const [code, setCode] = React.useState('');\n const [seconds, setSeconds] = React.useState(0);\n const [busy, setBusy] = React.useState(false);\n const [error, setError] = React.useState('');\n\n React.useEffect(() => {\n if (!seconds) return undefined;\n const timer = window.setTimeout(() => setSeconds(s => s - 1), 1000);\n return () => window.clearTimeout(timer);\n }, [seconds]);\n\n const requestCode = React.useCallback(async () => {\n setBusy(true);\n setError('');\n try {\n const data = await createSecurityChallenge(IDENTITY_CHECK_SCENE);\n setChallengeId(data.challenge_id);\n setPhoneMask(data.phone_mask);\n setSeconds(data.resend_after_seconds || 60);\n } catch (err) {\n setError(err.reason === 'REALNAME_REQUIRED' ? '需要先完成实名认证并绑定手机号' : (err.message || '获取验证码失败'));\n // 限流(429)时服务端会连同还没过期的 challenge_id 和剩余冷却秒数一起返回\n // (im_http.go:6361-6367)。原来这里只把错误文案显示出来就完了,challengeId 一直是空串,\n // 于是 submit() 开头的 `if (!challengeId) return` 会静默吞掉点击——按钮看着能点,\n // 输完 6 位验证码点\"确定\"毫无反应,也没有任何提示。同文件的 VerificationButton\n // 早就处理对了,这里是漏抄。\n if (err.details && err.details.retry_after_seconds) {\n setSeconds(err.details.retry_after_seconds);\n }\n if (err.details && err.details.challenge_id) {\n setChallengeId(err.details.challenge_id);\n }\n if (err.details && err.details.phone_mask) {\n setPhoneMask(err.details.phone_mask);\n }\n } finally {\n setBusy(false);\n }\n }, []);\n\n React.useEffect(() => { requestCode(); }, [requestCode]);\n\n const submit = async e => {\n e.preventDefault();\n if (!challengeId || code.length !== 6 || busy) return;\n setBusy(true);\n try {\n const data = await verifySecurityChallenge(challengeId, code);\n sessionStorage.setItem('im-action-token:' + IDENTITY_CHECK_SCENE, JSON.stringify(data));\n navigate('independent-password', mode ? {ym: mode} : undefined);\n } catch (err) {\n setError(err.message || '验证码错误');\n } finally {\n setBusy(false);\n }\n };\n\n return ;\n}\n\nfunction Realname({authenticated = false}) {\n // Real status (unverified/pending/verified/rejected) drives the view -- the old mock's `verified`\n // prop toggle is gone, both 'realname' and 'realname-verified' routes render this and let the\n // GET /v1/im/security/realname response decide what to show.\n const [status, setStatus] = React.useState('loading');\n const [maskedName, setMaskedName] = React.useState('');\n const [maskedIdNumber, setMaskedIdNumber] = React.useState('');\n const [name, setName] = React.useState('');\n const [idNumber, setIdNumber] = React.useState('');\n const [error, setError] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n\n React.useEffect(() => {\n getRealnameStatus().then(data => {\n setStatus(data.status);\n setMaskedName(data.masked_name || '');\n setMaskedIdNumber(data.masked_id_number || '');\n }).catch(err => { setError(err.message || '加载实名状态失败'); setStatus('load_error'); });\n }, []);\n\n const editable = status === 'unverified' || status === 'rejected';\n\n const submit = async e => {\n e.preventDefault();\n if (name.trim().length < 2 || !/^\\d{17}[\\dXx]$/.test(idNumber)) {\n setError('请输入有效姓名和 18 位身份证号码'); return;\n }\n setBusy(true);\n try {\n // Backend's validIMRealName only accepts the literal 'cn_id' -- 'id_card' was rejected outright\n // with a 400 every time, so real-name submission never actually worked.\n const data = await submitRealname({name: name.trim(), id_type: 'cn_id', id_number: idNumber.toUpperCase()});\n setStatus(data.status || 'pending');\n setError('');\n } catch (err) {\n setError(err.message || '提交失败,请稍后重试');\n } finally {\n setBusy(false);\n }\n };\n\n if (status === 'loading' || status === 'load_error') {\n return \n
{status === 'load_error' ? (error || '加载失败,请重试') : '加载中…'}
\n
;\n }\n\n return \n
\n
实名认证 更加真实,更受欢迎
verified_user \n
\n {status === 'verified' ? '认证信息' : '请您使用有效身份证信息认证'} \n \n 姓名 setName(e.target.value)} readOnly={!editable} placeholder=\"请输入真实姓名\" /> \n 证件号码 setIdNumber(e.target.value)} readOnly={!editable} placeholder=\"请输入证件号码\" /> \n {error ? {error}
: null}\n \n {status === 'verified' ? '已实名' : status === 'pending' ? '审核中' : busy ? '提交中…' : '提交'}\n \n \n info 我们将获取您的姓名、证件号用于认证,信息会被严格保护
\n \n
;\n}\n\nfunction RealnameReminder() {\n return \n
消息 search 搜索
{['系统消息', '文件助手', '项目协作群', '陈经理'].map((item, i) =>
{item[0]} {item} {i ? '最近一条消息内容' : '安全通知与账号动态'}
)}
\n
\n
实名认证提醒 根据国家法律法规要求,您需先进行实名认证才能使用该项 APP
navigate('realname')}>去实名认证 \n
\n
;\n}\n\nfunction IndependentPassword({authenticated, hashParams}) {\n // Only the genuine \"haven't set a password yet, setting one now to enable youth mode for the\n // first time\" flow should auto-continue into enableYouthMode below -- see IdentityCheck's\n // comment on the same param for why this can't just be inferred from enable_action_token being\n // present.\n const mode = hashParams && hashParams.ym;\n const [pin, setPin] = React.useState('');\n const [error, setError] = React.useState('');\n const [toast, setToast] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n // Mirrors server/im_http.go validIMIndependentPassword: 4 digits, not all-same, not a run.\n const invalid = ['0000','1111','2222','3333','4444','5555','6666','7777','8888','9999','0123','1234','2345','3456','4567','5678','6789','9876','8765','7654','6543','5432','4321','3210'];\n const submit = async e => {\n e.preventDefault();\n if (invalid.includes(pin)) { setError('请勿使用连续或重复数字'); return; }\n const stored = sessionStorage.getItem('im-action-token:' + IDENTITY_CHECK_SCENE);\n const actionToken = stored && JSON.parse(stored).action_token;\n if (!actionToken) { setError('身份验证已过期,请返回重新验证'); return; }\n setBusy(true);\n try {\n const result = await setIndependentPassword(pin, 'youth_mode', actionToken);\n sessionStorage.removeItem('im-action-token:' + IDENTITY_CHECK_SCENE);\n setPin('');\n // 设密码只是\"首次开启青少年模式\"这条路的中间一步,不是终点。服务端在这一步就把下一步\n // 要用的凭证一起发回来了(enable_action_token + next_action:\"enable_youth_mode\",\n // 见 server/im_http.go:6178-6189)。原来这里把它整个丢掉、只弹一句\"设置成功\"就停在\n // PIN 页——用户走完短信验证+设密码,青少年模式其实还是关的,得自己摸回设置页再输一遍。\n // 现在拿着这个 token 把最后一步做完。\n // enable_action_token comes back unconditionally on every successful (re)set, regardless of\n // why the caller ended up here (server doesn't know or care) -- only the genuine \"first time\n // enabling\" flow should spend it. Otherwise this silently flipped youth mode on for someone\n // who was mid-way through disabling it, or who came from the unrelated generic \"身份验证\"\n // entry with no youth-mode intent at all.\n const enableToken = result && result.enable_action_token;\n if (enableToken && mode === 'enable') {\n try {\n const current = await getYouthMode();\n await enableYouthMode(current.policy_version, enableToken);\n setError(''); setToast('青少年模式已开启');\n window.setTimeout(() => navigate('youth-mode-on'), 600);\n return;\n } catch (enableErr) {\n // 密码确实设成功了,只是自动开启这一步没成,如实说明并把人送回青少年模式页手动开\n setError('独立密码已设置,但自动开启未成功:' + (enableErr.message || '请返回重试'));\n window.setTimeout(() => navigate('youth-mode-off'), 1200);\n return;\n }\n }\n if (mode === 'disable') {\n // enableToken (if any) can't be spent here -- ConsumeActionToken requires an exact\n // action='close_youth_mode' match, and this one is always tagged 'enable_youth_mode'. The\n // user does know the fresh PIN now though, so send them straight back to actually finish\n // disabling instead of leaving them stuck on this screen with nothing left to do.\n setError(''); setToast('独立密码已重置,请使用新密码关闭青少年模式');\n window.setTimeout(() => navigate('youth-mode-verify', {ym: 'disable'}), 800);\n return;\n }\n setError(''); setToast('独立密码设置成功');\n } catch (err) {\n setError(err.message || '设置失败,请返回重新验证身份');\n } finally {\n setBusy(false);\n }\n };\n return \n
\n
\n 设置独立密码 \n {[0,1,2,3].map(i => {pin[i] ? '●' : ''} )}
\n setPin(e.target.value.replace(/\\D/g, '').slice(0, 4))} inputMode=\"numeric\" autoComplete=\"off\" aria-label=\"四位独立密码\" autoFocus />\n {error ? {error}
: null}\n {busy ? '提交中…' : '确定'} \n \n
setToast('')} />\n ;\n}\n\nexport default function AuthOnboardingView({\n view, hashParams, onTenantResolved, authenticated = false,\n login, loginDisabled, persist, errorText, errorLevel,\n onLoginRequest, onPersistenceChange, onImRegisterRequest, onError\n}) {\n const tenantName = sessionStorage.getItem('im-tenant-name') || '';\n switch (view) {\n case 'tenant': return {})} />;\n case 'login': return ;\n case 'enterprise-register': return ;\n case 'enterprise-feedback': return ;\n case 'register': return ;\n case 'reset': return ;\n case 'identity-check': return ;\n case 'realname': return ;\n case 'realname-verified': return ;\n case 'realname-reminder': return ;\n case 'independent-password': return ;\n default: return {})} />;\n }\n}\n","import React from 'react';\n\nimport HashNavigation from '../lib/navigation.js';\n\nconst navigate = view => HashNavigation.navigateTo(view);\n\nexport const CALL_EXPERIENCE_VIEWS = [\n 'call-history', 'call-incoming', 'audio-call-ringing', 'audio-call-active',\n 'audio-call-muted', 'audio-call-speaker', 'video-call-ringing',\n 'video-call-camera-off', 'video-call-active', 'video-call-peer-camera-off',\n 'call-minimized'\n];\n\nconst PEER = {name: '安妮', avatar: 'img/bkg/p09.jpg'};\n\nconst CALL_RECORDS = [\n {id: 1, type: 'video', direction: 'outgoing', state: 'cancelled', label: '已取消', time: '今天 10:24'},\n {id: 2, type: 'audio', direction: 'incoming', state: 'declined', label: '已拒绝', time: '昨天 21:03'},\n {id: 3, type: 'video', direction: 'incoming', state: 'missed', label: '未接听', time: '昨天 18:42'},\n {id: 4, type: 'audio', direction: 'outgoing', state: 'busy', label: '对方忙线', time: '星期一 15:10'},\n {id: 5, type: 'audio', direction: 'outgoing', state: 'finished', label: '通话时长 12:36', time: '8月20日'}\n];\n\nfunction Icon({children}) { return {children} ; }\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 1800);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\nfunction CallAvatar({small = false}) {\n return ;\n}\n\nfunction CallHeader({onMinimize, light = false}) {\n return \n keyboard_arrow_down \n 端到端加密通话 \n more_vert \n ;\n}\n\nfunction Control({icon, label, active, danger, onClick}) {\n return {icon} {label} ;\n}\n\nfunction CallHistory() {\n return \n
navigate('chat-standard')} aria-label=\"返回会话\">arrow_back_ios_new 安妮 navigate('friend-profile')} aria-label=\"个人资料\">person_outline \n
最近通话
{CALL_RECORDS.map(item => navigate(item.type === 'audio' ? 'audio-call-ringing' : 'video-call-ringing')}>{item.type === 'audio' ? 'call' : 'videocam'} {item.type === 'audio' ? '语音通话' : '视频通话'} {item.label} {item.time} {item.direction === 'incoming' ? 'call_received' : 'call_made'} )}\n
navigate('audio-call-ringing')}>call 语音通话 navigate('video-call-ringing')}>videocam 视频通话 \n
;\n}\n\nfunction IncomingCall({onToast}) {\n return \n
\n
navigate('call-minimized')} />\n {PEER.name} 邀请你进行视频通话
\n {onToast('已拒绝视频通话'); window.setTimeout(() => navigate('call-history'), 600);}} /> navigate('video-call-active')} /> \n ;\n}\n\nfunction formatDuration(seconds) {\n const mins = Math.floor(seconds / 60).toString().padStart(2, '0');\n return `${mins}:${(seconds % 60).toString().padStart(2, '0')}`;\n}\n\nfunction AudioCall({view, onToast}) {\n const ringing = view === 'audio-call-ringing';\n const [seconds, setSeconds] = React.useState(ringing ? 0 : 68);\n const [mic, setMic] = React.useState(view !== 'audio-call-muted');\n const [speaker, setSpeaker] = React.useState(view === 'audio-call-speaker');\n React.useEffect(() => {\n if (ringing) return undefined;\n const timer = window.setInterval(() => setSeconds(value => value + 1), 1000);\n return () => window.clearInterval(timer);\n }, [ringing]);\n const hangup = () => {onToast(ringing ? '已取消呼叫' : `通话结束 ${formatDuration(seconds)}`); window.setTimeout(() => navigate('call-history'), 650);};\n return \n
\n
navigate('call-minimized')} />\n {PEER.name} {ringing ? '正在等待对方接听…' : formatDuration(seconds)}
{!ringing ? 网络良好 : } \n {ringing ? : {setMic(!mic); onToast(mic ? '麦克风已关闭' : '麦克风已开启');}} /> {setSpeaker(!speaker); onToast(speaker ? '已切换到听筒' : '扬声器已开启');}} /> }\n ;\n}\n\nfunction VideoBackdrop({cameraOff, peerOff}) {\n if (peerOff) return 对方摄像头已关闭 语音通话仍在继续
;\n if (cameraOff) return 摄像头已关闭
;\n return ;\n}\n\nfunction VideoCall({view, onToast}) {\n const ringing = view === 'video-call-ringing' || view === 'video-call-camera-off';\n const [camera, setCamera] = React.useState(view !== 'video-call-camera-off');\n const [mic, setMic] = React.useState(true);\n const [seconds, setSeconds] = React.useState(ringing ? 0 : 128);\n const peerOff = view === 'video-call-peer-camera-off';\n React.useEffect(() => {\n if (ringing) return undefined;\n const timer = window.setInterval(() => setSeconds(value => value + 1), 1000);\n return () => window.clearInterval(timer);\n }, [ringing]);\n const hangup = () => {onToast(ringing ? '已取消视频呼叫' : `视频通话结束 ${formatDuration(seconds)}`); window.setTimeout(() => navigate('call-history'), 650);};\n return \n
\n
\n
navigate('call-minimized')} />\n {PEER.name} {ringing ? '正在等待对方接听…' : formatDuration(seconds)}
\n {!ringing ? {!camera ? videocam_off : null} : null}\n onToast('已切换摄像头')} /> {setCamera(!camera); onToast(camera ? '摄像头已关闭' : '摄像头已开启');}} /> {!ringing ? setMic(!mic)} /> : null} \n ;\n}\n\nfunction MinimizedCall({onToast}) {\n const [position, setPosition] = React.useState(() => ({x: Math.max(16, window.innerWidth - 134), y: 168}));\n const drag = React.useRef(null);\n const onPointerDown = event => {drag.current = {x: event.clientX - position.x, y: event.clientY - position.y}; event.currentTarget.setPointerCapture(event.pointerId);};\n const onPointerMove = event => {if (!drag.current) return; setPosition({x: Math.max(8, Math.min(window.innerWidth - 132, event.clientX - drag.current.x)), y: Math.max(70, Math.min(window.innerHeight - 190, event.clientY - drag.current.y))});};\n return navigate('messages-home')}>arrow_back_ios_new 安妮 在线
more_vert 今天 10:24
下午的评审材料我已经发到群里了。
{drag.current = null;}} onClick={() => navigate('video-call-active')} aria-label=\"返回全屏通话\"> 02:18 {onToast('通话已结束'); window.setTimeout(() => navigate('call-history'), 600);}} aria-label=\"挂断通话\">call_end ;\n}\n\nexport default function CallExperienceView({view}) {\n const [toast, setToast] = React.useState('');\n let content;\n if (view === 'call-history') content = ;\n else if (view === 'call-incoming') content = ;\n else if (view.startsWith('audio-call')) content = ;\n else if (view === 'call-minimized') content = ;\n else content = ;\n return <>{content} setToast('')} />>;\n}\n","import React from 'react';\nimport QRCode from 'qrcodejs';\nimport { pinyin } from 'pinyin-pro';\n\nimport HashNavigation from '../lib/navigation.js';\nimport {\n getFriends, getFriendRequests, createFriendRequest, acceptFriendRequest, rejectFriendRequest,\n deleteFriend, updateFriendRemark, searchUsers, getUserProfile, createMyQRCode, getBlocks,\n blockUser, unblockUser, getFileUrl, getBootstrap, getConversationContext, getConversationSettings,\n updateConversationSettings, createUserQRCode, fetchAllPages\n} from '../lib/im-api.js';\nimport { readCachedData, writeCachedData, useCachedData } from '../lib/use-cached-data.js';\n\n// Carries an optional `uid` (and anything else already in the hash) across chapter-5 navigation --\n// e.g. address-book -> friend-profile -> friend-settings all need to know which person this is.\nconst navigate = (view, uid) => {\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, view);\n hash = uid ? HashNavigation.addUrlParam(hash, 'uid', uid) : HashNavigation.removeUrlParam(hash, 'uid');\n HashNavigation.navigateTo(hash);\n};\n\nexport const CONTACT_MANAGEMENT_VIEWS = [\n 'address-book', 'friend-requests', 'add-friend', 'my-friend-qr', 'friend-qr', 'friend-search-result',\n 'friend-verification', 'friend-profile', 'group-member-profile', 'friend-settings',\n 'friend-settings-blocked', 'friend-delete-confirm', 'block-list', 'block-confirm',\n 'clear-chat-confirm'\n];\n\n// Server's own `initial` (bootstrap.go displayInitial) is just the first Unicode code point of the\n// display name -- for Chinese names that's a hanzi, not a Latin letter, so it can't drive the A/B/C\n// section headers docs/images/通讯录.png actually shows. Group client-side by first-pinyin-letter.\nfunction alphaInitial(name) {\n const ch = (name || '').trim()[0] || '#';\n if (/[A-Za-z]/.test(ch)) {\n return ch.toUpperCase();\n }\n if (/[一-龥]/.test(ch)) {\n const letter = pinyin(ch, {pattern: 'first', toneType: 'none'});\n return /[a-z]/i.test(letter) ? letter.toUpperCase() : '#';\n }\n return '#';\n}\n\nfunction Icon({children}) { return {children} ; }\n\nfunction Header({title, back = 'messages-home', backUid, right, onRight}) {\n return { if (!HashNavigation.goBack()) navigate(back, backUid); }} aria-label=\"返回\">arrow_back_ios_new {title} {right ? {right} : } ;\n}\n\n// `person.avatar_file_id` (real API field) is loaded lazily via a cached authenticated fetch --\n// file serving is auth-gated, there's no public URL a plain could point at directly.\nfunction Avatar({person, icon}) {\n const fileId = person && person.avatar_file_id;\n const [url, setUrl] = React.useState(null);\n React.useEffect(() => {\n if (!fileId) { setUrl(null); return undefined; }\n let live = true;\n getFileUrl(fileId).then(u => { if (live) setUrl(u); }).catch(() => {});\n return () => { live = false; };\n }, [fileId]);\n return {url ? : {icon || 'person'} } ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2000);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\nfunction Search({value, onChange, placeholder, onSubmit}) {\n return search onChange(event.target.value)}\n onKeyDown={event => { if (event.key === 'Enter' && onSubmit) onSubmit(); }} placeholder={placeholder} /> ;\n}\n\n// `payload` is the real `qr_payload` string from POST /me/qrcodes (already shaped like\n// `im://qr?token=...&purpose=add_friend` -- same scheme the demo literal used, no format change).\nfunction QrCard({payload, profile, loading}) {\n const ref = React.useRef(null);\n React.useEffect(() => {\n if (!ref.current || !payload) return;\n ref.current.innerHTML = '';\n new QRCode(ref.current, {text: payload, width: 190, height: 190, correctLevel: QRCode.CorrectLevel.M});\n }, [payload]);\n return \n {(profile && profile.display_name) || ''} \n {profile && profile.public_account ? '账号 ' + profile.public_account : ''} \n
\n {loading ? 正在生成二维码…
: 扫一扫上面的二维码,加我为好友
}\n 二维码 24 小时内有效 \n ;\n}\n\nfunction AddressBook({myUserId, onTopicSelected}) {\n const [query, setQuery] = React.useState('');\n // Seeded from cache so re-opening the address book (very much a back-and-forth flow: check\n // contacts, open a chat, come back) doesn't drop straight back to \"加载中…\" for a friend list that\n // hasn't actually changed.\n // Keyed by myUserId (same convention as the 'bootstrap:'+myUserId cache just below) -- a bare\n // 'friends' key meant logging out and into a *different* account in the same tab would briefly\n // paint the previous account's cached friend list on mount, before the fresh getFriends() call\n // overwrote it moments later.\n const friendsCacheKey = myUserId ? 'friends:' + myUserId : null;\n const [friends, setFriends] = React.useState(() => (friendsCacheKey && readCachedData(friendsCacheKey)) || []);\n const [pendingCount, setPendingCount] = React.useState(0);\n const [loading, setLoading] = React.useState(() => !(friendsCacheKey && readCachedData(friendsCacheKey)));\n // Same bootstrap the message center already fetches (and caches under the same key) -- only need\n // it here for the file assistant's real topic, so a plain read of the shared cache is enough.\n const [bootstrap] = useCachedData(myUserId ? 'bootstrap:' + myUserId : null, getBootstrap, [myUserId]);\n const fileAssistantTopic = bootstrap && bootstrap.entries && bootstrap.entries.file_assistant\n && bootstrap.entries.file_assistant.topic;\n React.useEffect(() => {\n // getFriends() defaults to a 50-item page -- a plain single call silently truncated address\n // books past that size, with no \"load more\" affordance to recover the rest.\n fetchAllPages(cursor => getFriends('', cursor)).then(list => {\n if (friendsCacheKey) { writeCachedData(friendsCacheKey, list); }\n setFriends(list);\n }).catch(() => {}).finally(() => setLoading(false));\n fetchAllPages(cursor => getFriendRequests('inbound', 'pending', cursor))\n .then(list => setPendingCount(list.length)).catch(() => {});\n }, []);\n const visible = friends.filter(item => `${item.display_name}${item.remark || ''}`.includes(query));\n const groups = visible.reduce((result, item) => {\n const key = alphaInitial(item.remark || item.display_name);\n return {...result, [key]: (result[key] || []).concat(item)};\n }, {});\n const sortedKeys = Object.keys(groups).sort();\n const entries = [\n {icon: 'person_add_alt', label: '新朋友', route: 'friend-requests', badge: pendingCount || null, tone: 'blue'},\n {icon: 'group', label: '群组', route: 'group-list', tone: 'green'},\n {icon: 'folder_special', label: '文件助手', route: 'chat-standard', tone: 'orange', fileAssistant: true},\n {icon: 'notifications', label: '系统消息', route: 'system-messages', tone: 'red'}\n ];\n const scrollTo = key => {\n const el = document.getElementById('people-group-' + key);\n if (el) el.scrollIntoView({behavior: 'smooth', block: 'start'});\n };\n // The file assistant is a real topic (from bootstrap), not a route -- same bug/fix pattern as the\n // \"常联系的人\" shortcuts in message-center-view.jsx. Falls back to the old demo route only if\n // bootstrap hasn't resolved a real topic yet, so the entry never becomes a dead click.\n const openEntry = item => {\n if (item.fileAssistant && fileAssistantTopic && onTopicSelected) onTopicSelected(fileAssistantTopic);\n else navigate(item.route);\n };\n return navigate('add-friend')} /> \n \n {entries.map(item => openEntry(item)}>{item.label} {item.badge ? {item.badge} : null}chevron_right )} \n 好友通讯录 \n {loading ? 加载中…
: sortedKeys.length === 0 ? 暂无好友
: null}\n {sortedKeys.map(initial => {initial} \n {groups[initial].map(person => { seedProfile(person); navigate('friend-profile', person.user_id); }}>\n {/* 副行只在确实是另一个名字时才显示。后端在有备注时会把 display_name 也设成备注\n (im_http.go:8500-8507,且合并守卫会挡住用 peer 真实昵称覆盖),两个字段同值,\n 原来那句 `person.remark ? {display_name} ` 会把同一串字渲染两遍。\n 后端目前没有单独的原昵称字段,所以拿不到\"备注(主)/昵称(副)\"的第二行,已记为后端缺口。 */}\n {person.remark || person.display_name} {person.remark && person.remark !== person.display_name ? {person.display_name} : null} \n )}\n )}\n \n {sortedKeys.map(value => { e.preventDefault(); scrollTo(value); }}>{value} )} \n ;\n}\n\nfunction requestStatusLabel(item) {\n if (item.status === 'pending') return item.direction === 'outbound' ? '已发送' : null;\n if (item.status === 'accepted') return '已添加';\n if (item.status === 'rejected') return '已拒绝';\n if (item.status === 'expired') return '已过期';\n return null;\n}\n\nfunction FriendRequests({onToast}) {\n const [items, setItems] = React.useState([]);\n const [loading, setLoading] = React.useState(true);\n React.useEffect(() => {\n fetchAllPages(cursor => getFriendRequests('all', 'all', cursor))\n .then(setItems).catch(() => {}).finally(() => setLoading(false));\n }, []);\n const handle = (item, accept) => {\n const nextStatus = accept ? 'accepted' : 'rejected';\n setItems(values => values.map(v => v.request_id === item.request_id ? {...v, status: nextStatus} : v));\n const call = accept ? acceptFriendRequest(item.request_id) : rejectFriendRequest(item.request_id);\n call.then(() => onToast(accept ? '已通过好友申请' : '已拒绝好友申请')).catch(err => {\n setItems(values => values.map(v => v.request_id === item.request_id ? {...v, status: item.status} : v));\n onToast(err.message || '操作失败');\n });\n };\n return \n {loading ? 加载中…
: items.length === 0 ? 暂无新朋友申请
: null}\n {items.map(item => \n \n {(item.peer && item.peer.display_name) || item.applicant_id} {item.message || '请求添加您为好友'}
{new Date(item.created_at).toLocaleString()} \n {item.status === 'pending' && item.direction === 'inbound' ?\n handle(item, false)}>拒绝 handle(item, true)}>通过验证 :\n {requestStatusLabel(item)} }\n )}\n ;\n}\n\n// 中国大陆手机号:11 位、1 开头。与本文件注册/验证流程用的判断保持一致。\nconst CN_MOBILE = /^1[3-9]\\d{9}$/;\n\nfunction classifySearchInput(text) {\n if (text.startsWith('+')) {\n // 已经是国际格式,原样按手机号查\n return {query: text.replace(/[\\s-]/g, ''), type: 'phone'};\n }\n const digits = text.replace(/[\\s-]/g, '');\n if (CN_MOBILE.test(digits)) {\n return {query: '+86' + digits, type: 'phone'};\n }\n return {query: text, type: 'exact_account'};\n}\n\n// 与 personal-settings-view.jsx 的 GENDER_OPTIONS 一一对应,两处写的是同一套后端枚举\nconst GENDER_LABELS = {male: '男', female: '女', other: '其他'};\n\n// `GET /users/{id}/profile` (getUserProfile) 403s for anyone who isn't already a friend, by design\n// (server's default `profile_visibility` is \"friends\"-only, server/im_http.go's imPrivacyAllowsProfile).\n// But the two places that hand you a *stranger* to look at -- an account search hit and a scanned\n// QR code -- already returned the exact same fields (display_name/avatar_file_id/gender/region/\n// public_account/signature, both go through userSearchItemPayload/copyOptionalProfileFields) *before*\n// that gate, unconditionally. Profile used to throw that object away and re-fetch via the gated\n// endpoint, which 403s and leaves the page stuck on \"加载中…\" forever with no way forward -- this\n// stashes what we already have so Profile can render immediately, and only uses getUserProfile as a\n// best-effort background refresh (for when the two really are/become friends, or the peer's privacy\n// setting is \"everyone\").\nfunction seedProfile(item) {\n if (!item || !item.user_id) return;\n writeCachedData('profile-seed:' + item.user_id, {\n ...item,\n capabilities: {can_add_friend: !!item.can_add}\n });\n}\n\nfunction AddFriend({result = false, onToast, onOpenScanner}) {\n const [query, setQuery] = React.useState('');\n const [searching, setSearching] = React.useState(false);\n const [searched, setSearched] = React.useState(result);\n const [results, setResults] = React.useState([]);\n const runSearch = q => {\n const text = q.trim();\n if (!text) { setSearched(false); setResults([]); return; }\n setSearching(true); setSearched(true);\n // 按输入形态选搜索类型。exact_account 只比对 profile.public_account / u.username / u.id\n // (tenant_adapter.go:9170-9172),**不匹配 u.phone** —— 参考图 5.5 里输的恰恰是手机号\n // 18826827724,一直写死 exact_account 的话这个场景必然搜不到。手机号要走 type=phone。\n // 另外 phone 分支服务端不做 E.164 归一化(只有模糊的 account 分支才调 normalizeUserPhone),\n // 而库里存的是 +86 开头的 E.164,所以裸 11 位号码由前端补上区号——注册流程也是这么拼的。\n const {query, type} = classifySearchInput(text);\n searchUsers(query, type).then(data => setResults(data.items || [])).catch(() => setResults([])).finally(() => setSearching(false));\n };\n // 原来复制到剪贴板这条分支不给任何反馈,点了界面上毫无动静(同页的 QrPage.share 是有 toast 的);\n // 生成二维码失败也被 .catch(() => {}) 静默吞掉,用户同样什么都看不到。\n const shareCard = () => {\n createMyQRCode().then(data => {\n const text = `加我为好友:${data.qr_payload}`;\n if (navigator.share) {\n return navigator.share({title: '添加好友', text}).catch(() => {});\n }\n if (navigator.clipboard) {\n return navigator.clipboard.writeText(text).then(() => onToast('邀请链接已复制'))\n .catch(() => onToast('复制失败,请手动分享二维码'));\n }\n onToast('当前浏览器不支持分享,请使用二维码');\n return undefined;\n }).catch(err => onToast(err.message || '生成邀请链接失败'));\n };\n // Real search results carry a relationship for blocked pairs too (blocked_by_me/blocked_by_peer),\n // which previously fell through to the same generic \"添加\" as an untouched stranger -- misleading\n // since tapping through leads to a profile page whose own cannotAddReason (see the Profile\n // component below) already refuses to let the request go anywhere. Matches that component's\n // wording, just condensed to fit this one-line list item.\n const actionLabel = item => item.relationship === 'friend' ? '已是好友' :\n item.relationship === 'pending_outbound' ? '已申请' : item.relationship === 'pending_inbound' ? '待通过' :\n item.relationship === 'blocked_by_me' ? '已拉黑' : item.relationship === 'blocked_by_peer' ? '无法添加' : '添加';\n return \n
{ setQuery(v); if (!v.trim()) { setSearched(false); setResults([]); } }} placeholder=\"查找账号\" onSubmit={() => runSearch(query)} />\n \n {searched ? 查找人 \n {searching ? 搜索中…
: results.length === 0 ? 未找到相关用户
:\n results.map(item => { seedProfile(item); item.relationship === 'friend' ? navigate('friend-profile', item.user_id) : navigate('group-member-profile', item.user_id); }}>\n {item.display_name} \n {actionLabel(item)} \n )}\n : \n navigate('my-friend-qr')}>qr_code 我的二维码 让朋友扫一扫添加我 chevron_right \n onOpenScanner ? onOpenScanner() : onToast('暂不支持扫码,请使用账号搜索添加好友')}>qr_code_scanner 扫一扫 扫描好友或群二维码 chevron_right \n share 分享给好友 分享链接给好友,一起来玩吧 chevron_right \n }\n \n ;\n}\n\nfunction QrPage({onToast}) {\n const [payload, setPayload] = React.useState(null);\n const [profile, setProfile] = React.useState(null);\n React.useEffect(() => {\n createMyQRCode().then(data => { setPayload(data.qr_payload); setProfile(data.display_profile); }).catch(() => onToast('二维码生成失败'));\n }, []);\n const share = () => {\n if (navigator.share && payload) {\n navigator.share({title: '添加好友', text: payload}).then(() => onToast('二维码名片已分享')).catch(() => {});\n } else if (navigator.clipboard && payload) {\n navigator.clipboard.writeText(payload);\n onToast('链接已复制');\n }\n };\n const save = () => {\n const canvas = document.querySelector('.people-qrcode canvas');\n if (!canvas) { onToast('二维码尚未生成'); return; }\n const a = document.createElement('a');\n a.href = canvas.toDataURL('image/png');\n a.download = '我的二维码.png';\n a.click();\n onToast('二维码已保存到相册');\n };\n return \n share 分享好友 download 保存到相册
\n ;\n}\n\nfunction FriendQr({uid, onToast}) {\n const [payload, setPayload] = React.useState(null);\n const [profile, setProfile] = React.useState(null);\n React.useEffect(() => {\n if (!uid) return;\n createUserQRCode(uid).then(data => { setPayload(data.qr_payload); setProfile(data.display_profile); }).catch(() => onToast('二维码生成失败'));\n }, [uid]);\n const save = () => {\n const canvas = document.querySelector('.people-qrcode canvas');\n if (!canvas) { onToast('二维码尚未生成'); return; }\n const a = document.createElement('a');\n a.href = canvas.toDataURL('image/png');\n a.download = '好友二维码.png';\n a.click();\n onToast('二维码已保存到相册');\n };\n return ;\n}\n\nfunction Verification({uid, onToast}) {\n // Same seed-then-best-effort-refresh as Profile -- reached right after it (via its \"添加好友\"\n // button), so the cache this reads is the one Profile itself just kept warm.\n const [profile, setProfile] = React.useState(() => (uid ? readCachedData('profile-seed:' + uid) : null));\n const [message, setMessage] = React.useState('');\n const [sending, setSending] = React.useState(false);\n const [sent, setSent] = React.useState(false);\n React.useEffect(() => {\n if (!uid) return;\n getUserProfile(uid).then(data => { writeCachedData('profile-seed:' + uid, data); setProfile(data); }).catch(() => {});\n }, [uid]);\n const alreadyPending = profile && (profile.relationship === 'pending_outbound' || profile.relationship === 'pending_inbound');\n const alreadyFriend = profile && profile.relationship === 'friend';\n const send = () => {\n setSending(true);\n createFriendRequest(uid, message.trim(), 'search').then(() => {\n onToast('好友申请已发送'); setSent(true);\n // Patch the seed Profile will re-read on remount -- its own background getUserProfile refresh\n // can't do this for us, since a stranger-turned-pending peer still fails that gated endpoint\n // the exact same way a stranger does (server only exempts an established \"friend\").\n writeCachedData('profile-seed:' + uid, {...(readCachedData('profile-seed:' + uid) || {}), relationship: 'pending_outbound'});\n window.setTimeout(() => navigate('group-member-profile', uid), 800);\n }).catch(err => onToast(err.message || '发送失败')).finally(() => setSending(false));\n };\n return \n {(profile && profile.display_name) || ''} \n {alreadyFriend ? 你们已经是好友了
:\n alreadyPending || sent ? 好友申请正在等待验证
:\n 验证留言 setMessage(event.target.value)} />{message.length}/50 }\n {alreadyFriend || alreadyPending || sent ? null : \n navigate('group-member-profile', uid)}>取消 \n {sending ? '发送中…' : '发送'} \n
}\n ;\n}\n\nfunction Profile({uid, friend, onTopicSelected, onToast}) {\n const [profile, setProfile] = React.useState(() => (uid ? readCachedData('profile-seed:' + uid) : null));\n // A failed fetch with no seed to fall back on previously left this stuck on \"加载中…\" forever --\n // tracked separately from `profile` itself (which legitimately stays null while genuinely still\n // loading) so the render below can tell the two apart, same fix as DownloadPage's `loadError`.\n const [loadError, setLoadError] = React.useState(false);\n React.useEffect(() => {\n if (!uid) return;\n getUserProfile(uid).then(data => {\n writeCachedData('profile-seed:' + uid, data);\n setProfile(data);\n }).catch(() => {\n // Expected for anyone who isn't a friend yet (server-side privacy default) -- if a search/QR\n // seed already got us a usable preview, keep showing that instead of erroring the page out.\n // Only a total stranger with no seed data at all (e.g. a stale/direct deep link) has nothing to\n // show, and that's the one case worth telling the user about.\n setProfile(current => {\n if (!current) { onToast('资料加载失败'); setLoadError(true); }\n return current;\n });\n });\n // getUserProfile 403s outright for someone you've blocked (server-side privacy check) --\n // whatever relationship was cached from before the block (typically \"friend\") then just stays\n // stuck, which used to make this page keep showing \"发消息/音视频通话\" for someone actually\n // blocked, entirely missing the blocked_by_me/blocked_by_peer branches cannotAddReason already\n // handles below. getConversationContext resolves for a P2P conversation regardless of block\n // status and correctly reports the real relationship, so it's used here purely to refresh that\n // one field on top of whatever getUserProfile/the seed cache already provided for the rest.\n getConversationContext(uid).then(ctx => {\n if (ctx && ctx.relationship) {\n setProfile(current => current ? {...current, relationship: ctx.relationship} : current);\n }\n }).catch(() => {});\n }, [uid]);\n // group-management-view.jsx 的 navigateToProfile 在跳转之后异步用 getGroupMemberProfile 把\n // capabilities/relationship 补进种子缓存(那两个字段 getUserProfile 对非好友会 403 拿不到,\n // 群场景权限更宽松能拿到)。这个组件已经挂载了,不会自己重新读缓存,靠这个事件通知它有更新。\n React.useEffect(() => {\n if (!uid) return undefined;\n const onSeedUpdated = e => {\n if (e.detail && e.detail.uid === uid) {\n const updated = readCachedData('profile-seed:' + uid);\n if (updated) setProfile(updated);\n }\n };\n window.addEventListener('profile-seed-updated', onSeedUpdated);\n return () => window.removeEventListener('profile-seed-updated', onSeedUpdated);\n }, [uid]);\n if (!profile) return {loadError ? '资料加载失败,请重试' : '加载中…'}
;\n const canAdd = profile.capabilities && profile.capabilities.can_add_friend;\n const isFriend = profile.relationship === 'friend';\n // canAdd===false covers several real, distinct relationships (found live: searching a friend who\n // had blocked me showed this exact page claiming a request was \"pending verification\" when nothing\n // had been sent and nothing ever could be -- they'd blocked me). Only pending_outbound actually\n // matches that wording; the others need their own accurate text instead of reusing it as a catch-all.\n const cannotAddReason = profile.relationship === 'blocked_by_peer' ? '对方已将你拉黑,无法添加为好友' :\n profile.relationship === 'blocked_by_me' ? '你已拉黑对方,需先取消拉黑才能添加为好友' :\n profile.relationship === 'pending_inbound' ? '对方已向你发送好友申请,请前往\"新朋友\"处理' :\n '好友申请正在等待验证';\n // Real native Tinode p2p topic name (from my side) is just the peer's own user_id (\"usrXXXX\") --\n // NOT `profile.topic` (a separate \"p2pXXXX\" identifier the custom REST layer uses internally,\n // which Tinode.topicType() doesn't recognize, so selecting it left the message pane blank).\n const openChat = () => onTopicSelected(uid);\n return ;\n}\n\nfunction Toggle({checked, onChange, disabled}) { return onChange(!checked)}> ; }\n\nfunction Settings({uid, initialBlocked, pinBlocked, onToast}) {\n // Same seed-from-what-we-already-know as Profile/Verification -- getUserProfile can 403 even for a\n // real, current friend (see seedProfile's own comment), which used to leave this page's header\n // blank instead of just stuck like Profile, but no less wrong.\n const [profile, setProfile] = React.useState(() => (uid ? readCachedData('profile-seed:' + uid) : null));\n const [blocked, setBlocked] = React.useState(initialBlocked);\n // 置顶/免打扰原来是纯本地 useState,onChange 只是切一下布尔值,从不调用任何接口——\n // GET/PATCH /conversations/{topic}/settings 早就封装好了(getConversationSettings/\n // updateConversationSettings),只是零调用点。实测接口返回真实的 {pinned, mute_notifications,\n // version},PATCH 需要带 version 做乐观锁。打开设置页永远显示\"关\",点了也只是那次会话内\n // 生效、离开页面就丢,和会话列表真正读取的置顶/免打扰状态是两套毫不相关的东西。\n const [settingsVersion, setSettingsVersion] = React.useState(null);\n const [pinned, setPinned] = React.useState(false);\n const [muted, setMuted] = React.useState(false);\n const [editingRemark, setEditingRemark] = React.useState(false);\n const [remark, setRemark] = React.useState('');\n const [remarkDraft, setRemarkDraft] = React.useState('');\n React.useEffect(() => {\n if (!uid) return;\n getConversationSettings(uid).then(s => {\n setPinned(!!s.pinned); setMuted(!!s.mute_notifications); setSettingsVersion(s.version);\n }).catch(() => {});\n // pinBlocked:确认弹窗把这个页面当背景渲染,并用 initialBlocked 摆出\"操作之后\"的样子。\n // 这时不能让这次拉取回来的真实关系(还是 friend)把它改回去——原来会导致弹窗一弹出来,\n // 背后的拉黑开关自己跳回\"未拉黑\",同时\"删除好友\"红条又冒出来,跟参考图不符也跟弹窗\n // 正在确认的这件事自相矛盾。\n getUserProfile(uid).then(p => { writeCachedData('profile-seed:' + uid, p); setProfile(p); if (!pinBlocked) setBlocked(p.relationship === 'blocked_by_me'); }).catch(() => {\n // Same 403-on-blocked-contact gap as Profile above -- this used to leave `blocked` stuck at\n // whatever initialBlocked was (usually false, e.g. arriving fresh from the address book)\n // whenever the block didn't just happen in this same page session, showing an off \"拉黑\"\n // toggle and the \"删除好友\" button for someone actually already blocked.\n if (!pinBlocked) {\n getConversationContext(uid).then(ctx => {\n if (ctx && ctx.relationship) { setBlocked(ctx.relationship === 'blocked_by_me'); }\n }).catch(() => {});\n }\n });\n // GET /users/{id}/profile never exposes the real remark (backend's userProfilePayload always\n // calls userSummaryPayload(user, \"\") -- confirmed against im_be/server/im_http.go:7844 --\n // folding an empty remark into display_name instead of returning a separate field), only the\n // friends list endpoint's friendListItemPayload does. Look this friend up there instead.\n fetchAllPages(cursor => getFriends('', cursor)).then(list => {\n const entry = list.find(item => item.user_id === uid);\n if (entry) setRemark(entry.remark || '');\n }).catch(() => {});\n }, [uid]);\n const saveRemark = () => {\n const value = remarkDraft.trim();\n updateFriendRemark(uid, value).then(() => {\n setRemark(value);\n setEditingRemark(false); onToast('备注已更新');\n }).catch(err => onToast(err.message || '备注更新失败'));\n };\n return \n {(profile && profile.display_name) || ''} \n HashNavigation.navigateTo(\n HashNavigation.addUrlParam(HashNavigation.setUrlSidePanel(window.location.hash, 'history-search'), 'topic', uid))}>\n 查看聊天记录 chevron_right \n \n 消息传输方式 已启动加密传输
\n 置顶聊天 {\n // settingsVersion starts null until getConversationSettings' GET resolves (below); a toggle\n // clicked inside that window sent version:null over the wire, which the server 400s on as\n // MALFORMED_REQUEST -- disabling the switch during that (usually brief, but real on a slow\n // connection) gap avoids that avoidable round trip and its \"设置失败\" toast entirely.\n const prev = pinned; setPinned(value);\n updateConversationSettings(uid, {pinned: value, version: settingsVersion}).then(s => setSettingsVersion(s.version))\n .catch(err => { setPinned(prev); onToast(err.message || '设置失败'); });\n }} />
\n 消息免打扰 {\n const prev = muted; setMuted(value);\n updateConversationSettings(uid, {mute_notifications: value, version: settingsVersion}).then(s => setSettingsVersion(s.version))\n .catch(err => { setMuted(prev); onToast(err.message || '设置失败'); });\n }} />
\n navigate('clear-chat-confirm', uid)}>清空聊天记录 chevron_right \n {editingRemark ?\n setRemarkDraft(e.target.value)} autoFocus />保存
:\n { setRemarkDraft(remark); setEditingRemark(true); }}>备注 {remark ? {remark} : null}chevron_right }\n {blocked ? '取消拉黑' : '拉黑'} {\n if (value) { navigate('block-confirm', uid); return; }\n unblockUser(uid).then(() => { setBlocked(false); onToast('已移出黑名单'); }).catch(err => onToast(err.message || '操作失败'));\n }} />
\n {\n // The local navigate(view, uid) helper only carries a single `uid` param -- the report\n // flow (security-support-view.jsx's ReportReasons/ReportDetails) needs target_type/\n // target_id/target_name, so build the hash directly here rather than through it.\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, 'abuse-report-reasons');\n hash = HashNavigation.addUrlParam(hash, 'target_type', 'user');\n hash = HashNavigation.addUrlParam(hash, 'target_id', uid);\n hash = HashNavigation.addUrlParam(hash, 'target_name', (profile && profile.display_name) || uid);\n HashNavigation.navigateTo(hash);\n }}>投诉与举报 chevron_right \n \n {blocked ? null : navigate('friend-delete-confirm', uid)}>删除好友 }\n ;\n}\n\nfunction BlockList({onToast}) {\n const [people, setPeople] = React.useState([]);\n const [loading, setLoading] = React.useState(true);\n React.useEffect(() => {\n fetchAllPages(cursor => getBlocks(cursor)).then(setPeople).catch(() => {}).finally(() => setLoading(false));\n }, []);\n const remove = userId => {\n unblockUser(userId).then(() => { setPeople(items => items.filter(item => item.user_id !== userId)); onToast('已移出黑名单'); })\n .catch(err => onToast(err.message || '操作失败'));\n };\n // The only entry point into this view is personal-settings-view.jsx's \"设置\" list\n // ('android-settings'), not friend-settings -- this page has no friend uid in scope at all.\n return \n {loading ? 加载中…
: people.length ?\n people.map(item => {(item.user && item.user.display_name) || item.user_id} 已阻止消息和通话 remove(item.user_id)}>移出 ) :\n person_off 黑名单为空
}\n ;\n}\n\nfunction ConfirmSheet({type, uid, tinode, onToast}) {\n const [busy, setBusy] = React.useState(false);\n const config = {\n delete: {title: '删除好友', text: '删除后将解除好友关系,对方将无法继续向你发送消息。聊天记录仍会保留。', action: '确认删除', route: 'address-book', toast: '好友已删除', keepUid: false},\n block: {title: '黑名单', text: '拉黑后将不会收到对方的消息,可在\"设置\"—\"黑名单\"查看人员名单', action: '确定', route: 'friend-settings-blocked', toast: '已加入黑名单', keepUid: true},\n clear: {title: '清除聊天记录', text: '清空后不可找回,确定要清空当前会话的历史记录吗?', action: '确定', route: 'friend-settings', toast: '聊天记录已清除', keepUid: true}\n }[type];\n const confirm = () => {\n setBusy(true);\n let call;\n if (type === 'delete') call = deleteFriend(uid);\n else if (type === 'block') call = blockUser(uid);\n else {\n // No dedicated \"clear my view of history\" REST endpoint exists yet -- this is the same native\n // Tinode soft-delete-all-for-me the real message-actions menu already uses (context-menu.jsx).\n // Native p2p topic name (from my side) is just the peer's own user_id -- NOT the relationship\n // context's `topic` field, which is a separate \"p2pXXXX\" id the REST layer uses internally and\n // Tinode.topicType() doesn't recognize (see Profile.openChat for the full story).\n const topic = tinode ? tinode.getTopic(uid) : null;\n call = topic ? topic.delMessagesAll(false) : Promise.resolve();\n }\n call.then(() => { onToast(config.toast); navigate(config.route, config.keepUid ? uid : undefined); })\n .catch(err => onToast(err.message || '操作失败')).finally(() => setBusy(false));\n };\n return \n
{config.title} {config.text}
\n {config.action} \n navigate('friend-settings', uid)}>取消 \n \n
;\n}\n\nexport default function ContactManagementView({view, hashParams, myUserId, tinode, onTopicSelected, onOpenScanner}) {\n const [toast, setToast] = React.useState('');\n const uid = hashParams && hashParams.uid;\n let content;\n if (view === 'address-book') content = ;\n else if (view === 'friend-requests') content = ;\n else if (view === 'add-friend' || view === 'friend-search-result') content = ;\n else if (view === 'my-friend-qr') content = ;\n else if (view === 'friend-qr') content = ;\n else if (view === 'friend-verification') content = ;\n else if (view === 'friend-profile' || view === 'group-member-profile') content = ;\n else if (view === 'friend-settings' || view === 'friend-settings-blocked') content = ;\n else if (view === 'block-list') content = ;\n else if (view === 'friend-delete-confirm') content = ;\n else if (view === 'block-confirm') content = ;\n else content = ;\n return <>{content} setToast('')} />>;\n}\n","/* ContactsView holds all contacts-related stuff */\nimport React from 'react';\nimport { FormattedMessage, defineMessages } from 'react-intl';\n\nimport ContactList from '../widgets/contact-list.jsx';\n\nimport { updateFavicon } from '../lib/utils.js';\n\nconst messages = defineMessages({\n archived_contacts_title: {\n id: \"archived_contacts\",\n defaultMessage: \"Archived contacts ({count})\",\n description: \"Label for archived chats\"\n }\n});\n\nexport default class ContactsView extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleAction = this.handleAction.bind(this);\n\n this.state = ContactsView.deriveStateFromProps(props);\n }\n\n static deriveStateFromProps(props) {\n const contacts = [];\n let unreadThreads = 0;\n let archivedCount = 0;\n\n const me = props.tinode.getMeTopic();\n props.chatList.forEach(c => {\n const blocked = c.acs && !c.acs.isJoiner();\n c.pinned = me.pinnedTopicRank(c.topic);\n\n // Show only blocked contacts only when props.blocked == true.\n if (blocked && props.blocked) {\n contacts.push(c);\n }\n if (blocked || props.blocked) {\n return;\n }\n\n if (c.private && c.private.arch) {\n if (props.archive) {\n contacts.push(c);\n } else {\n archivedCount ++;\n }\n } else if (!props.archive) {\n contacts.push(c);\n unreadThreads += c.unread > 0 ? 1 : 0;\n }\n });\n\n contacts.sort((a, b) => {\n const pin = b.pinned - a.pinned;\n return pin != 0 ? pin : (b.touched || 0) - (a.touched || 0);\n });\n\n if (archivedCount > 0) {\n contacts.push({\n action: 'archive',\n title: messages.archived_contacts_title,\n values: {count: archivedCount}\n });\n }\n\n return {\n contactList: contacts,\n unreadThreads: unreadThreads\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chatList != this.props.chatList ||\n prevProps.archive != this.props.archive ||\n prevProps.blocked != this.props.blocked) {\n const newState = ContactsView.deriveStateFromProps(this.props);\n this.setState(newState);\n if (newState.unreadThreads != prevState.unreadThreads) {\n updateFavicon(newState.unreadThreads);\n }\n }\n }\n\n handleAction(action_ignored) {\n this.props.onShowArchive();\n }\n\n render() {\n return (\n {\n (no_contacts) => \n } \n );\n }\n};\n","import React from 'react';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport AudioPlayer from '../widgets/audio-player.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { bytesToHumanSize, secondsToTime, shortDateFormat } from '../lib/strformat.js';\nimport {\n getFavorites, getFavorite, batchDeleteFavorites, forwardFavorites, createFileDownloader,\n searchTopicMessages, getMessageContext, getTopicMedia, checkURL, getFileUrl, resolveFileUrl, getGroup, getUserProfile\n} from '../lib/im-api.js';\nimport { readCachedData, writeCachedData, useDebouncedValue } from '../lib/use-cached-data.js';\nimport { topicDisplayName } from '../lib/utils.js';\n\n// favoritePayload's source.topic is the raw conversation topic id (grpXXX/usrXXX) -- resolve it to a\n// display name the same way every other list in this app does, cached since many favorites usually\n// share a handful of source conversations.\nconst sourceNameCache = new Map();\nfunction resolveSourceName(topic, onDone) {\n if (!topic) return;\n if (sourceNameCache.has(topic)) { onDone(sourceNameCache.get(topic)); return; }\n if (Tinode.isSelfTopicName(topic)) { sourceNameCache.set(topic, '已保存的消息'); onDone('已保存的消息'); return; }\n const call = topic.startsWith('grp') ? getGroup(topic).then(g => g.name) : getUserProfile(topic).then(p => p.display_name);\n call.then(name => { sourceNameCache.set(topic, name); onDone(name); }).catch(() => {});\n}\n\n// Generic multi-param navigate -- content-library-view.jsx's original helper was a bare\n// `HashNavigation.navigateTo(view)`, replacing the whole hash and dropping any existing params on\n// every internal tab/link click; nothing in this file could carry a topic/favoriteId through its own\n// navigation even if a caller threaded one in from outside.\nconst navigate = (view, params) => {\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, view);\n Object.entries(params || {}).forEach(([key, value]) => {\n hash = value ? HashNavigation.addUrlParam(hash, key, value) : HashNavigation.removeUrlParam(hash, key);\n });\n HashNavigation.navigateTo(hash);\n};\n\nexport const CONTENT_LIBRARY_VIEWS = [\n 'favorites', 'favorites-mixed', 'favorites-files', 'favorites-text', 'favorites-voice',\n 'favorites-links', 'favorites-image', 'favorites-video', 'favorites-select', 'favorite-share', 'file-download',\n 'file-downloading', 'file-downloaded', 'history-search', 'history-files',\n 'history-links', 'history-images', 'history-videos'\n];\n\nfunction Icon({children}) { return {children} ; }\nfunction Header({title, back = 'messages-home', backParams, right, onRight}) {\n return \n { if (!HashNavigation.goBack()) navigate(back, backParams); }} aria-label=\"返回\">arrow_back_ios_new \n {title} \n {right ? {right} : }\n ;\n}\nfunction Avatar({item}) { return {item && item.image ? : {(item && item.icon) || 'person'} } ; }\nfunction Toast({message, onDone}) { React.useEffect(() => { if (!message) return undefined; const timer = window.setTimeout(onDone, 2000); return () => window.clearTimeout(timer); }, [message, onDone]); return message ? {message}
: null; }\nfunction Search({value, onChange, placeholder = '搜索'}) { return search onChange(event.target.value)} placeholder={placeholder} /> ; }\n\n// -- Drafty extraction helpers: a favorite's snapshot.content (and a history item's flattened content\n// fields) are literally the original message's own content, not a Ch.7-specific shape -- reuse the same\n// Drafty API chat-message.jsx/context-menu.jsx already use for live messages instead of re-deriving it.\nfunction draftyContentOf(content) {\n return Drafty.isValid(content) ? content : null;\n}\n// 必须用 Drafty.entities 而不是 Drafty.attachments:后者在 SDK 里硬过滤 `ent.tp == 'EX'`\n// (tinode.dev.js:2538),只认「文件附件」这一种实体。而本应用发图片/视频/语音走的分别是\n// insertImage(IM)/insertVideo(VD)/appendAudio(AU),在 attachments 下一个都取不到——收藏的图片视频\n// 缩略图、语音收藏的播放源、聊天记录的图片视频宫格因此全部拿不到资源。entities 的回调第三参给出\n// tp,可以按类型分派,chat-message.jsx:139 用的就是这个。\nconst MEDIA_ENTITY_TYPES = ['IM', 'VD', 'AU', 'EX'];\nfunction firstAttachment(content) {\n const drafty = draftyContentOf(content);\n if (!drafty) return null;\n let found = null;\n Drafty.entities(drafty, (data, _index, tp) => {\n if (!found && data && MEDIA_ENTITY_TYPES.includes(tp)) {\n found = data;\n return true; // 命中第一个就停,entities 的回调返回 true 表示中断遍历\n }\n return false;\n });\n return found;\n}\n// Drafty.getDownloadUrl returns either an already-usable blob: URL (small inband attachment, .val) or\n// the raw .ref relative path (out-of-band, needs an authenticated fetch) -- getFileUrl() takes a bare\n// file_id and builds that path itself, so pull just the id back out of .ref rather than double it up.\nfunction resolveAttachmentUrl(att) {\n if (!att) return Promise.resolve(null);\n const direct = Drafty.getDownloadUrl(att);\n if (!direct) return Promise.resolve(null);\n if (direct.startsWith('blob:') || direct.startsWith('data:')) return Promise.resolve(direct);\n return getFileUrl(direct.slice(direct.lastIndexOf('/') + 1)).catch(() => null);\n}\n// searchTopicMessages/getTopicMedia results spread the original Drafty content's own fields directly\n// onto each item (mediaMessagePayload/messageSearchPayload flatten `content`, they don't nest it) --\n// reconstruct the Drafty shape from whatever ent/fmt/txt survived so the same attachment-extraction\n// path works here as everywhere else, rather than guessing at flat field names that may not exist.\nfunction attachmentFromFlat(item) {\n if (item && (item.ent || item.fmt || item.txt !== undefined)) {\n return firstAttachment({txt: item.txt, fmt: item.fmt, ent: item.ent});\n }\n return null;\n}\nfunction plainTextOf(content, fallbackText) {\n if (typeof content === 'string') return content;\n const drafty = draftyContentOf(content);\n if (drafty) return Drafty.toPlainText(drafty);\n return fallbackText || '';\n}\n// file_type -> {icon, color} matching Ch.6's group-file convention (a colored square + letter/icon).\nconst FILE_TYPE_META = {image: ['image', '#3ba55c'], video: ['videocam', '#3b82c4'], audio: ['audiotrack', '#8b5cf6'], document: ['description', '#e05d44'], file: ['insert_drive_file', '#8a8f98']};\nfunction extFromName(name) {\n const m = /\\.([a-zA-Z0-9]+)$/.exec(name || '');\n return m ? m[1].toUpperCase() : '';\n}\n\nfunction FileCard({name, size, mime, sender, removed, onOpen}) {\n const ext = extFromName(name);\n return \n {ext || (mime || '').split('/')[0].toUpperCase() || '?'} \n {name || '未命名文件'} {typeof size === 'number' ? bytesToHumanSize(size) : (size || '未知大小')}{sender ? ` · ${sender}` : ''}
\n {removed ? 文件已失效 : chevron_right }\n ;\n}\n\n// Real playback via the same widgets/audio-player.jsx used for live voice messages, rather than the\n// mock's plain state-toggle with no actual element -- resolves its own blob URL like Avatar\n// does, so callers don't need their own per-item URL-map bookkeeping just for voice favorites.\n// `removed` (source message deleted/recalled, im_http.go's messageAvailability) skips resolving a\n// blob URL for a file that's gone -- without this, a removed voice favorite just sat on\n// `hourglass_empty` forever (resolveAttachmentUrl's fetch fails silently), indistinguishable from\n// \"still loading\". Same FileCard-style treatment (an label, no playback) as the file case.\nfunction VoiceCard({att, head, removed}) {\n const [src, setSrc] = React.useState(null);\n React.useEffect(() => { if (!removed) resolveAttachmentUrl(att).then(setSrc); }, [att, removed]);\n const duration = (att && att.duration) || (head && head.duration) || 0;\n if (removed) {\n return block 语音已失效
;\n }\n return \n {src ?
:
hourglass_empty }\n
;\n}\n\n// No OG-metadata extraction exists anywhere in the backend (favoriteSnapshot/mediaMessagePayload just\n// copy the raw message content -- no title/thumbnail/summary field is ever populated), matching what\n// every one of the reference screenshots for both 我的收藏-链接 and 查找聊天记录-链接 actually show: a\n// plain URL string, not a card. Rendering a rich card here would be inventing data that doesn't exist.\nfunction LinkText({url, onOpen, removed}) {\n if (removed) {\n return link_off 链接已失效
;\n }\n return onOpen && onOpen(url)}>link {url} ;\n}\n\nfunction MediaThumb({url, video, duration, onOpen, removed}) {\n if (removed) {\n return {video ? 'videocam_off' : 'broken_image'} {video ? '视频已失效' : '图片已失效'}
;\n }\n return \n {url ? : {video ? 'videocam' : 'image'} }\n {video ? <>play_circle {duration ? {secondsToTime(duration)} : null}> : null}\n ;\n}\n\nfunction FavoriteItem({item, onOpen, selecting, selected, onSelect}) {\n const att = firstAttachment(item.snapshot && item.snapshot.content);\n const source = item.source_display || (item.source && item.source.topic) || '';\n return \n {selecting ? {selected ? 'check' : ''} : null}\n \n {item.type === 'text' ?
{plainTextOf(item.snapshot && item.snapshot.content, item.snapshot && item.snapshot.text)}
: null}\n {/* 需求 7.3「失效文件需展示明确状态而非直接报错」原来只有 file 类型传了 removed(FileCard),\n voice/link/image/video 三类完全没处理——即便后端把\"问题13\"(availability 恒为 available)\n 修好,这三类在 UI 上也不会有任何变化,因为组件本身就不认识这个状态,只会静默显示一个和\n \"还在加载中\"没法区分的占位。四个类型现在统一都传。后端 messageAvailability(im_http.go)\n 在源消息被删/被撤回时给 'removed'。 */}\n {item.type === 'file' ?
: null}\n {item.type === 'voice' ?
: null}\n {item.type === 'link' ?
: null}\n {item.type === 'image' || item.type === 'video' ?
: null}\n
来自 {source} {shortDateFormat(new Date(item.collected_at))} \n
\n ;\n}\n\nconst TYPE_ROUTE = {all: 'favorites-mixed', file: 'favorites-files', text: 'favorites-text', voice: 'favorites-voice', link: 'favorites-links', image: 'favorites-image', video: 'favorites-video'};\nconst TYPE_LABELS = [['all', '全部'], ['image', '图片'], ['video', '视频'], ['file', '文件'], ['voice', '语音'], ['text', '文本'], ['link', '链接']];\n\nfunction Favorites({view, tinode, onToast}) {\n const initialType = view === 'favorites-files' ? 'file' : view === 'favorites-text' ? 'text' : view === 'favorites-voice' ? 'voice' : view === 'favorites-links' ? 'link' : view === 'favorites-image' ? 'image' : view === 'favorites-video' ? 'video' : 'all';\n const selecting = view === 'favorites-select';\n const [type, setType] = React.useState(selecting ? 'file' : initialType);\n // 输入值与实际发请求用的值分开:原来 query 直接进 load 的依赖数组,输入 6 个字的关键词就打\n // 6 次接口,而且返回顺序没有保证——后发的短前缀请求可能后到、把正确结果覆盖掉。\n const [queryInput, setQueryInput] = React.useState('');\n const query = useDebouncedValue(queryInput, 300);\n const [selected, setSelected] = React.useState([]);\n // Seeded per-type -- one Favorites instance backs every favorites* tab/route (confirmed multiple\n // entry points: personal-settings' \"我的收藏\" row, direct-message-view.jsx's attachment-panel\n // \"favorite\" action), so an unparameterized key would flash a stale, wrong-type list under a\n // freshly-switched tab. `query` is deliberately excluded -- it always resets to '' on a tab switch,\n // so caching a search result under the same key would show it under a plain (non-search) revisit.\n const [items, setItems] = React.useState(() => readCachedData('favorites:' + type) || null);\n const [cursor, setCursor] = React.useState('');\n const [hasMore, setHasMore] = React.useState(false);\n const [fileUrls, setFileUrls] = React.useState({});\n const [sourceNames, setSourceNames] = React.useState({});\n const load = React.useCallback((append) => {\n getFavorites({type, query, cursor: append ? cursor : ''}).then(data => {\n setItems(prev => {\n const list = append ? (prev || []).concat(data.items || []) : (data.items || []);\n if (!query) writeCachedData('favorites:' + type, list);\n return list;\n });\n setCursor(data.next_cursor || '');\n setHasMore(!!data.next_cursor);\n }).catch(err => onToast(err.message || '加载失败'));\n }, [type, query, cursor]);\n React.useEffect(() => {\n setItems((!query && readCachedData('favorites:' + type)) || null);\n load(false);\n }, [type, query]);\n // Image/video favorites need an authenticated blob URL, same as any other file_id-backed thumbnail.\n React.useEffect(() => {\n (items || []).forEach(item => {\n if ((item.type !== 'image' && item.type !== 'video') || fileUrls[item.favorite_id]) return;\n const att = firstAttachment(item.snapshot && item.snapshot.content);\n resolveAttachmentUrl(att).then(url => { if (url) setFileUrls(v => ({...v, [item.favorite_id]: url})); });\n });\n }, [items]);\n React.useEffect(() => {\n (items || []).forEach(item => {\n const topic = item.source && item.source.topic;\n if (!topic || sourceNames[topic]) return;\n resolveSourceName(topic, name => name && setSourceNames(v => ({...v, [topic]: name})));\n });\n }, [items]);\n const toggle = id => setSelected(values => values.includes(id) ? values.filter(v => v !== id) : values.concat(id));\n const deleteSelected = () => {\n if (!window.confirm(`确定删除已选择的 ${selected.length} 项收藏吗?`)) return;\n batchDeleteFavorites(selected).then(result => {\n const okIds = new Set(((result && result.items) || []).filter(r => r.ok).map(r => r.favorite_id));\n setItems(values => {\n const next = values.filter(item => !okIds.has(item.favorite_id));\n if (!query) writeCachedData('favorites:' + type, next);\n return next;\n });\n setSelected(values => values.filter(id => !okIds.has(id)));\n onToast(okIds.size === selected.length ? '已删除所选收藏' : `已删除 ${okIds.size}/${selected.length} 项,部分删除失败`);\n }).catch(err => onToast(err.message || '删除失败'));\n };\n const openItem = item => {\n if (item.type === 'file') { navigate('file-download', {favoriteId: item.favorite_id, fromType: type}); return; }\n if (item.type === 'link') {\n const url = (item.snapshot && item.snapshot.content && item.snapshot.content.url) || plainTextOf(item.snapshot && item.snapshot.content, item.snapshot && item.snapshot.text);\n checkURL(url, 'favorite').then(res => {\n if (res.decision === 'allow') window.open(url, '_blank', 'noopener,noreferrer');\n else onToast(res.decision === 'block' ? '该链接存在风险,已被拦截' : '该链接可能存在风险,请谨慎访问');\n }).catch(() => onToast('链接安全校验失败'));\n return;\n }\n if (item.type === 'image' || item.type === 'video') {\n // item._thumbUrl is the real resolveAttachmentUrl() result (see the effect above) -- this\n // backend has no separate scaled-down thumbnail concept, so the same URL used to render the\n // grid cell is already the full attachment, safe to open directly.\n if (item._thumbUrl) window.open(item._thumbUrl, '_blank', 'noopener,noreferrer');\n else onToast('正在加载,请稍后重试');\n return;\n }\n onToast('暂不支持预览此类收藏');\n };\n const list = items || [];\n return \n
navigate(selecting ? 'favorites-files' : 'favorites-select')} />\n \n {TYPE_LABELS.map(([id, label]) => { setType(id); if (TYPE_ROUTE[id] && !selecting) navigate(TYPE_ROUTE[id]); }}>{label} )} \n \n {items === null ? 加载中…
:\n list.length ? <>{list.map(item => toggle(item.favorite_id)}\n onOpen={() => openItem(item)} />)}\n {hasMore ? load(true)}>加载更多 : null}> :\n bookmark_border 暂无此类收藏
}\n \n {selecting ? \n navigate('favorite-share', {ids: selected.join(',')})}>share 转发 \n delete_outline 删除 \n : null}\n ;\n}\n\n// Reuses the exact same real-contact-list source as Ch.4's batch-forward-dialog.jsx (the app's own\n// already-subscribed chatList, filtered locally) rather than the pre-built but never-actually-wired\n// getForwardTargets() -- that endpoint's field shape was never verified against a real caller anywhere\n// in this codebase, while this pattern is proven live since Chapter 4.\nfunction FavoriteShare({hashParams, myUserId, chatList, onToast}) {\n const ids = (hashParams && hashParams.ids ? hashParams.ids.split(',') : []).filter(Boolean);\n const [query, setQuery] = React.useState('');\n const [selected, setSelected] = React.useState([]);\n const [confirming, setConfirming] = React.useState(false);\n const [comment, setComment] = React.useState('');\n const [sending, setSending] = React.useState(false);\n const [preview, setPreview] = React.useState(null);\n React.useEffect(() => { if (ids[0]) getFavorite(ids[0]).then(setPreview).catch(() => {}); }, []);\n const toggle = id => setSelected(values => values.includes(id) ? values.filter(v => v !== id) : values.concat(id).slice(0, 9));\n const send = () => {\n if (sending) return;\n setSending(true);\n forwardFavorites(ids, selected, comment.trim()).then(result => {\n // `items` is one row per (favorite x target) pair once a target passes the permission check,\n // or one bare row per target when it fails outright -- either way its length isn't `selected.length`\n // (target count) whenever more than one favorite is being shared at once, so a plain\n // `selected.length - failedItems` mixed the two units and could go negative. Group back to the\n // \"会话\" granularity the toast actually claims to report: a target only counts as fully sent once\n // every one of its own items succeeded.\n const items = (result && result.items) || [];\n const successTargets = selected.filter(target => {\n const forTarget = items.filter(r => r.target_topic === target);\n return forTarget.length > 0 && forTarget.every(r => r.status === 'sent');\n }).length;\n onToast(successTargets === selected.length ? `已分享给 ${selected.length} 个会话` : `${successTargets}/${selected.length} 个会话分享成功`);\n window.setTimeout(() => navigate('favorites-files'), 700);\n }).catch(err => onToast(err.message || '分享失败')).finally(() => setSending(false));\n };\n const previewAtt = preview && firstAttachment(preview.snapshot && preview.snapshot.content);\n const contacts = (chatList || []).filter(c => c.acs && c.acs.isJoiner() && c.acs.isWriter() &&\n (!query || topicDisplayName(c.name, c.public, c.name || '').toLowerCase().includes(query.toLowerCase())));\n const nameOf = uid => { const t = contacts.find(c => c.name === uid); return (t && topicDisplayName(t.name, t.public, uid)) || uid; };\n return \n
\n {!confirming ? <>\n
\n
最近聊天
\n
{contacts.map(item => toggle(item.name)}>\n {topicDisplayName(item.name, item.public, item.name)} \n {selected.includes(item.name) ? 'check' : ''} \n )} \n
已选择 {selected.length}/9 setConfirming(true)}>确定 \n > :
\n 发送给 \n {selected.map(uid =>
{nameOf(uid)} )}
\n {preview ? {previewAtt ? {}} /> :\n {plainTextOf(preview.snapshot && preview.snapshot.content, preview.snapshot && preview.snapshot.text)}
}\n 收藏原件会继续保留,并在目标会话中生成一条新消息。
: null}\n setComment(event.target.value)} placeholder=\"给朋友留言\" />\n 发送 \n }\n
;\n}\n\nfunction DownloadPage({hashParams, tinode, onToast}) {\n const [meta, setMeta] = React.useState(null);\n // A failed fetch previously left this stuck on \"加载中…\" forever -- the toast fired once and faded,\n // but `meta` never left null so the loading branch below never had anything else to show. Tracked\n // separately from `meta` itself since a real \"still loading\" state also has `meta === null`.\n const [loadError, setLoadError] = React.useState(false);\n const [state, setState] = React.useState('ready');\n const [progress, setProgress] = React.useState(0);\n const downloaderRef = React.useRef(null);\n const {favoriteId, topic, seq, fromType} = hashParams || {};\n // Two distinct entry points share this route: Favorites (favoriteId set, Ch.7.1) and History's\n // file tab (topic+seq set, Ch.7.12) -- \"back\" must return to whichever one actually opened this\n // page, not unconditionally to favorites-files (which History never came from and has no topic\n // param for anyway). Within Favorites itself, `openItem` now also threads through the tab the user\n // was actually on (`fromType`) -- opening a file from \"全部\" or \"文件\" both land here, and should\n // each return to where they came from, not always to the \"文件\" tab regardless of origin.\n const backView = favoriteId ? (TYPE_ROUTE[fromType] || 'favorites-files') : 'history-files';\n const backParams = favoriteId ? undefined : {topic};\n React.useEffect(() => {\n const apply = content => {\n const att = firstAttachment(content);\n if (!att) { onToast('文件信息加载失败'); setLoadError(true); return; }\n // Drafty.getDownloadUrl's raw return value is only actually usable as-is for a small inband\n // attachment (an already-local blob: URL built from inline base64 data). For an out-of-band\n // one -- everything above the ~3MB inline threshold, i.e. essentially every real photo/video/\n // document -- it's the bare server-relative .ref path (e.g. \"/v0/file/s/xxx\"), which the\n // browser would resolve against *this page's own* origin rather than the tenant's real\n // (often cross-origin) file domain. resolveAttachmentUrl() elsewhere in this file already\n // gets this right by routing ref-backed attachments through getFileUrl() -- but that eagerly\n // fetches the whole file into a blob immediately, which is wrong here: this page hasn't had\n // the user press \"立即下载\" yet, and doing that on mount would silently pull the entire file in\n // the background and make the ready/downloading/done states below meaningless.\n // resolveFileUrl() is the same domain-qualification with no fetch, exactly what's needed to\n // just populate `meta.url` for later use by the real download button.\n const direct = Drafty.getDownloadUrl(att);\n const url = (direct && (direct.startsWith('blob:') || direct.startsWith('data:'))) ?\n direct : resolveFileUrl(direct && direct.slice(direct.lastIndexOf('/') + 1));\n setMeta({name: att.name, mime: att.mime, size: Drafty.getEntitySize(att), url});\n };\n if (favoriteId) {\n getFavorite(favoriteId).then(fav => apply(fav.snapshot && fav.snapshot.content)).catch(err => { onToast(err.message || '加载失败'); setLoadError(true); });\n } else if (topic && seq) {\n getMessageContext(topic, seq, 0, 0).then(data => {\n const item = (data.items || []).find(m => String(m.seq) === String(seq)) || data.items[0];\n apply(item && item.content);\n }).catch(err => { onToast(err.message || '加载失败'); setLoadError(true); });\n }\n }, [hashParams]);\n const start = () => {\n if (!meta || !tinode) return;\n // A small inband attachment's \"url\" (from Drafty.getDownloadUrl) is already a ready-to-use\n // blob: URL built from its inline base64 data -- there's nothing to fetch from the server, so\n // getLargeFileHelper().download() would be the wrong tool (it requires a *relative* HTTP path and\n // returns bare `undefined`, not a rejected promise, for anything else -- confirmed by triggering\n // this exact case: chaining .then() off that return value threw \"Cannot read properties of\n // undefined\"). Save the already-local blob directly instead.\n if (meta.url && (meta.url.startsWith('blob:') || meta.url.startsWith('data:'))) {\n const link = document.createElement('a');\n link.href = meta.url; link.download = meta.name || 'file';\n document.body.appendChild(link); link.click(); document.body.removeChild(link);\n setState('done');\n return;\n }\n // tinode.getLargeFileHelper().download() sends the same two wrong headers as its upload() sibling\n // (X-Tinode-APIKey/X-Tinode-Auth, neither recognized by this backend) -- every real out-of-band\n // download was silently failing. createFileDownloader() is a fixed-headers drop-in with the exact\n // same download()/cancel() interface.\n const downloader = createFileDownloader(tinode);\n if (!downloader) { onToast('当前环境不支持下载'); return; }\n downloaderRef.current = downloader;\n setState('loading'); setProgress(0);\n // download() resolves once the browser's own save dialog/native download has been triggered --\n // there's no server-side download-completion record to poll (confirmed absent on the backend), so\n // \"downloaded\" here just means the transfer finished, tracked only for this page's own lifetime.\n const result = downloader.download(meta.url, meta.name, meta.mime,\n loaded => setProgress(meta.size ? Math.min(100, Math.round(loaded / meta.size * 100)) : 0),\n err => { setState('ready'); onToast((err && err.message) || '下载失败'); });\n if (result && result.then) {\n result.then(() => setState('done')).catch(() => {}); // onError above already surfaced the failure.\n }\n };\n const cancel = () => { if (downloaderRef.current) downloaderRef.current.cancel(); setState('ready'); setProgress(0); };\n if (!meta) return \n {loadError ? '文件不存在或已被删除' : '加载中…'}
\n ;\n return \n
\n
\n {extFromName(meta.name) || '?'} \n {meta.name} \n 该文件不支持在线预览
\n {state === 'loading' ? \n 下载中... {progress}%
\n \n {bytesToHumanSize(meta.size * progress / 100)} / {bytesToHumanSize(meta.size)} \n : null}\n {state === 'ready' ? download 立即下载({bytesToHumanSize(meta.size)}) :\n state === 'loading' ? close 取消
:\n onToast('已保存,可在浏览器下载列表中查看')}>open_in_new 用其他应用打开
}\n \n
;\n}\n\n// 不用服务端返回的 matches 偏移,改为在展示文本上本地匹配关键词。服务端那份偏移有三层问题,\n// 全都对不上前端要高亮的这段文字:\n// 1. 结构是 [{start,end}] 对象数组(im_http.go:9151),按 [start,len] 数组解构会直接抛\n// TypeError(对象不可迭代),整个搜索结果渲染崩掉;\n// 2. start/end 是 Go 的字节下标(strings.Index + len(query)),中文一字三字节,跟 JS 的\n// UTF-16 下标永远错位;\n// 3. 偏移基准是完整原文,但 snippet 在超过 120 字时会被开窗截断(im_http.go:9128-9139),\n// 两者基准不一致——而且那段开窗自己也混用了字节下标和 rune 切片。\n// 本地匹配没有这些歧义:所见即所高亮。\nfunction Highlight({text, query}) {\n const needle = (query || '').trim();\n if (!needle || !text) return text;\n const parts = [];\n const haystack = text.toLowerCase();\n const lowered = needle.toLowerCase();\n let last = 0;\n for (let at = haystack.indexOf(lowered); at !== -1; at = haystack.indexOf(lowered, at + lowered.length)) {\n if (at > last) parts.push(text.slice(last, at));\n parts.push({text.slice(at, at + needle.length)} );\n last = at + needle.length;\n }\n if (!parts.length) return text;\n if (last < text.length) parts.push(text.slice(last));\n return parts;\n}\n\nfunction HistoryNav({active}) {\n const tabs = [['history-search', '聊天记录'], ['history-images', '图片'], ['history-videos', '视频'], ['history-files', '文件'], ['history-links', '链接']];\n return {tabs.map(item => navigate(item[0])}>{item[1]} )} ;\n}\n\nconst HISTORY_TITLES = {'history-search': '查找聊天记录', 'history-files': '文件', 'history-links': '链接', 'history-images': '图片', 'history-videos': '视频'};\nconst HISTORY_TYPE = {'history-search': 'all', 'history-files': 'file', 'history-links': 'link', 'history-images': 'image', 'history-videos': 'video'};\n// Same bracket-label convention as message-center-view.jsx's draftyPreview() -- messageText() on the\n// backend has no attachment-aware summary, so a non-text search hit's own \"snippet\" field is often just\n// the raw serialized Drafty content; a fixed label per type reads far better than that.\nconst TYPE_LABEL = {image: '[图片]', video: '[视频]', voice: '[语音]', file: '[文件]', link: '[链接]'};\n\nfunction History({view, hashParams, myUserId, onToast}) {\n const topic = hashParams && hashParams.topic;\n // Keyed by both topic and view/tab -- reached from one chat's own settings, and a user plausibly\n // leaves to tweak a setting and comes back to keep browsing/searching the same conversation's\n // records (or checks a different chat's history later the same session), so dropping either half\n // of the key would bleed one chat's or one tab's data into another's.\n const cacheKey = topic ? `history:${topic}:${view}` : null;\n // 输入值与实际发请求用的值分开:原来 query 直接进 load 的依赖数组,输入 6 个字的关键词就打\n // 6 次接口,而且返回顺序没有保证——后发的短前缀请求可能后到、把正确结果覆盖掉。\n const [queryInput, setQueryInput] = React.useState('');\n const query = useDebouncedValue(queryInput, 300);\n const [items, setItems] = React.useState(() => (cacheKey && readCachedData(cacheKey)) || null);\n const [cursor, setCursor] = React.useState('');\n const [hasMore, setHasMore] = React.useState(false);\n const [mediaUrls, setMediaUrls] = React.useState({});\n const [senderNames, setSenderNames] = React.useState({});\n const load = React.useCallback((append) => {\n if (!topic) return;\n const type = HISTORY_TYPE[view];\n const call = view === 'history-search' ? searchTopicMessages(topic, {query, type, cursor: append ? cursor : ''}) :\n getTopicMedia(topic, type, append ? cursor : '');\n call.then(data => {\n setItems(prev => {\n const list = append ? (prev || []).concat(data.items || []) : (data.items || []);\n if (!query && cacheKey) writeCachedData(cacheKey, list);\n return list;\n });\n setCursor(data.next_cursor || ''); setHasMore(!!data.next_cursor);\n }).catch(err => onToast(err.message || '加载失败'));\n }, [topic, view, query, cursor]);\n React.useEffect(() => {\n setItems((!query && cacheKey && readCachedData(cacheKey)) || null);\n load(false);\n }, [topic, view, query]);\n React.useEffect(() => {\n if (view !== 'history-images' && view !== 'history-videos') return;\n (items || []).forEach(item => {\n if (mediaUrls[item.seq]) return;\n resolveAttachmentUrl(attachmentFromFlat(item)).then(url => { if (url) setMediaUrls(v => ({...v, [item.seq]: url})); });\n });\n }, [items, view]);\n // item.from (like snapshot.from on a favorite) is a bare uid with no \"usr\" prefix -- every other uid\n // in this app (topic names, hash params, etc.) is fully-prefixed, so it has to be added back before\n // this can be looked up like any other user id.\n React.useEffect(() => {\n (items || []).forEach(item => {\n const from = item.from;\n if (!from || senderNames[from] || from === myUserId || ('usr' + from) === myUserId) return;\n getUserProfile(from.startsWith('usr') ? from : 'usr' + from).then(p => {\n setSenderNames(v => ({...v, [from]: p.display_name}));\n }).catch(() => {});\n });\n }, [items]);\n // Mirrors tinode-web.jsx's own handleTopicSelected exactly (HashNavigation.setUrlTopic('', topicName)\n // -- an empty base hash, not the current one, per its \"Clear newTopicParams after use\" comment) so\n // this lands the same way a normal chat-list click does, then layers the jump target on as a param;\n // navigate()'s own helper only ever touches path[0]+params, never path[1] (the actual topic slot).\n const jump = seq => HashNavigation.navigateTo(HashNavigation.addUrlParam(HashNavigation.setUrlTopic('', topic), 'jumpseq', seq));\n const nameOf = from => {\n if (!from) return '';\n if (from === myUserId || ('usr' + from) === myUserId) return '我';\n return senderNames[from] || from;\n };\n const openLink = url => {\n checkURL(url, 'message').then(res => {\n if (res.decision === 'allow') window.open(url, '_blank', 'noopener,noreferrer');\n else onToast(res.decision === 'block' ? '该链接存在风险,已被拦截' : '该链接可能存在风险,请谨慎访问');\n }).catch(() => onToast('链接安全校验失败'));\n };\n const list = items || [];\n return \n {/* Reached from either a friend's chat settings (usrXXX topic, reads hashParams.uid) or a\n group's (grpXXX topic, reads hashParams.topic) -- the topic's own prefix says which settings\n page to return to and which param name it expects; passing the wrong one is the same\n blank-page failure as History's other entry points had before this was a switch. */}\n
\n {view === 'history-search' ?
: null}\n
\n
\n {items === null ? 加载中…
: !list.length ?\n {view === 'history-search' ? 'search_off' : 'inbox'} 暂无内容
:\n view === 'history-search' ? \n {list.map(item => jump(item.seq)}>\n {nameOf(item.from)} {item.type === 'text' ?\n : (TYPE_LABEL[item.type] || item.snippet || '')}
\n {shortDateFormat(new Date(item.ts))} chevron_right \n )}\n :\n view === 'history-files' ? {list.map(item => {\n const att = attachmentFromFlat(item);\n return \n {nameOf(item.from)} {shortDateFormat(new Date(item.ts))}
\n navigate('file-download', {topic, seq: item.seq})} />\n ;\n })} :\n view === 'history-links' ? {list.map(item => \n {/* 需求7.14\"点击时执行外链安全策略,并允许用户定位回原始消息\"是两个独立动作——点链接本身\n 走 openLink(安全校验+开外链),定位回原消息复用其它tab都在用的 jump(seq),挂在头部\n 这一行上(sender+时间),跟 history-files 的头部保持视觉一致,只是这里多了可点击行为。 */}\n jump(item.seq)}>\n {nameOf(item.from)} {shortDateFormat(new Date(item.ts))} \n \n \n )} :\n {list.map(item => jump(item.seq)} removed={item.availability === 'removed'} />)} }\n {hasMore ? load(true)}>加载更多 : null}\n \n
;\n}\n\nexport default function ContentLibraryView({view, hashParams, tinode, myUserId, onTopicSelected, chatList}) {\n const [toast, setToast] = React.useState(''); let content;\n if (view.startsWith('favorites')) content = ;\n else if (view === 'favorite-share') content = ;\n else if (view.startsWith('file-download')) content = ;\n else content = ;\n return <>{content} setToast('')} />>;\n}\n","import React from 'react';\n\nimport HashNavigation from '../lib/navigation.js';\n\nconst navigate = view => HashNavigation.navigateTo(view);\n\nconst VIEW_CONFIG = {\n 'chat-inbound-request': {relationship: 'pending_inbound', variant: 'inbound-request'},\n 'chat-inbound-message': {relationship: 'pending_inbound', variant: 'inbound-message'},\n 'chat-outbound-request': {relationship: 'pending_outbound', variant: 'outbound-request'},\n 'chat-status': {relationship: 'friend', variant: 'status'},\n 'chat-friend': {relationship: 'friend', variant: 'friend'},\n 'chat-media': {relationship: 'friend', variant: 'media'},\n 'chat-blocked': {relationship: 'blocked_by_peer', variant: 'blocked'},\n 'chat-deleted': {relationship: 'none', variant: 'deleted'},\n 'chat-standard': {relationship: 'friend', variant: 'standard'},\n 'chat-attachments': {relationship: 'friend', variant: 'attachments'},\n 'chat-mixed': {relationship: 'friend', variant: 'mixed'},\n 'chat-contact-card': {relationship: 'friend', variant: 'contact-card'}\n};\n\nconst ATTACHMENTS = [\n {id: 'photo', icon: 'image', label: '照片'},\n {id: 'camera', icon: 'photo_camera', label: '拍摄'},\n {id: 'call', icon: 'call', label: '视频语音'},\n {id: 'card', icon: 'contact_page', label: '名片'},\n {id: 'file', icon: 'folder', label: '文件'},\n {id: 'favorite', icon: 'bookmark', label: '收藏'},\n {id: 'video', icon: 'videocam', label: '视频通话'}\n];\n\nfunction Icon({children}) {\n return {children} ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2200);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\nfunction ChatAvatar({mine = false, peer = false}) {\n return ;\n}\n\nfunction Status({value, failedReason}) {\n if (!value && !failedReason) return null;\n return \n {failedReason ? error : null}{failedReason || value} \n
;\n}\n\nfunction FileCard() {\n return \n
365天艾宾浩斯记忆曲线复习计划.pdf 115KB
\n
P \n
;\n}\n\nfunction ContactCard({onOpen}) {\n return \n 栗子来了 \n 个人名片 · 账号 QL1024 \n ;\n}\n\nfunction VoiceMessage({duration = 6, playing = false}) {\n return {playing ? 'graphic_eq' : 'volume_up'} {duration}″
;\n}\n\nfunction ImageMessage({progress}) {\n return \n
\n {progress < 100 ?
: null}\n
;\n}\n\nfunction Bubble({mine = false, children, status, failedReason, type = 'text', onOpenCard}) {\n return \n {!mine ?
: null}\n
\n {type === 'file' ?
: type === 'card' ?
:\n
{children}
}\n
\n
\n {mine ?
: null}\n
;\n}\n\nfunction RelationNotice({children, action, onAction}) {\n return {children} {action ? {action} : null}
;\n}\n\nfunction ChatTimeline({variant, uploadProgress, sendStatus, onRetry, onOpenCard, onFriendAction}) {\n if (variant === 'inbound-request' || variant === 'inbound-message') {\n return <>\n 7月30日 11:40
\n {variant === 'inbound-request' ? '请求添加你为好友' : '我是祈万事安好'} \n 以上是打招呼的消息 \n onFriendAction('declined')}>拒绝 onFriendAction('accepted')}>通过申请
\n >;\n }\n\n if (variant === 'outbound-request') {\n return <>\n 7月30日 11:40
\n 请求添加你为好友 \n 好友申请已发送,等待对方处理 \n >;\n }\n\n if (variant === 'status') {\n return <>\n 7月30日 11:40
\n 我是祈万事安好 \n 你已添加安妮,现在可以开始聊天。 \n >;\n }\n\n if (variant === 'friend') {\n return <>\n 8月27日 11:11
\n 你们已成为好友,现在可以开始聊天 \n 我们已成为好友,现在我们可以开始聊天 \n 你还好吗? \n >;\n }\n\n if (variant === 'media') {\n return <>\n 8月27日 11:11
\n 接雨彤创建群聊 \n 你还好吗? \n \n \n \n >;\n }\n\n if (variant === 'blocked') {\n return <>\n 7月30日 11:40
\n 请求添加你为好友 \n 你已添加了安妮,现在可以开始聊天。 \n 7月30日 13:00
\n 这边在网上看见你的留言,你想了解什么课程了 \n 有课程辅导的老师?对新手友好吗? \n 这个不用担心特别好上手,学起来特别简单 \n 拉黑我这么速度,真的牛 \n >;\n }\n\n if (variant === 'deleted') {\n return <>\n 7月30日 13:00
\n 你好我是XXX推荐过来的,这边想了解课程是吗 \n 这边目前找到更好的课程,不考虑你们家,谢谢 \n 这是我们导师名片,你可以加一下,对比一下价格 \n onFriendAction('resent')}>你还不是他(她)朋友。 \n 这么突然把我删了,真心累了 \n onFriendAction('resent')}>你还不是他(她)朋友。 \n >;\n }\n\n const base = <>\n 7月30日 11:40
\n 请求添加你为好友 \n 你已添加了安妮,现在可以开始聊天。 \n 7月30日 13:00
\n 你好,我是王珊珊,很高兴认识你,你怎么称呼 \n 你好,我是安妮,想跟你咨询一下设计课程,方便? \n >;\n\n if (variant === 'standard') {\n return <>{base}非常方便,这是我们的课程目录,你可以看看了解一下 >;\n }\n if (variant === 'mixed') {\n return <>{base} >;\n }\n if (variant === 'contact-card') {\n return <>{base}这是我们导师名片,你可以加一下,有问题随时联系他 好的,非常感谢,那我这边就直接联系他吧 没问题的,有疑问随时沟通 >;\n }\n return base;\n}\n\nfunction AttachmentPanel({onChoose}) {\n return \n {ATTACHMENTS.map(item => onChoose(item)}>{item.icon} {item.label} )}\n
;\n}\n\nfunction Composer({relationship, attachmentOpen, setAttachmentOpen, onSend}) {\n const [draft, setDraft] = React.useState(sessionStorage.getItem('im-chat-draft') || '');\n const canSend = relationship === 'friend';\n const updateDraft = value => {\n setDraft(value);\n sessionStorage.setItem('im-chat-draft', value);\n };\n const submit = e => {\n e.preventDefault();\n if (!canSend || !draft.trim()) return;\n onSend(draft.trim());\n updateDraft('');\n };\n return \n navigate('voice-ready')}>record_voice_over \n updateDraft(e.target.value)} placeholder={canSend ? '输入消息' : relationship === 'pending_inbound' ? '请先处理好友申请' : relationship === 'pending_outbound' ? '等待对方通过好友申请' : '当前无法发送消息'} disabled={!canSend} />\n navigate('emoji-panel')}>sentiment_satisfied_alt \n {draft.trim() ? 发送 : setAttachmentOpen(!attachmentOpen)}>{attachmentOpen ? 'keyboard' : 'add_circle_outline'} }\n ;\n}\n\nexport default function DirectMessageView({view}) {\n const config = VIEW_CONFIG[view] || VIEW_CONFIG['chat-standard'];\n const [relationship, setRelationship] = React.useState(config.relationship);\n const [variant, setVariant] = React.useState(config.variant);\n const [attachmentOpen, setAttachmentOpen] = React.useState(config.variant === 'attachments');\n const [uploadProgress, setUploadProgress] = React.useState(config.variant === 'media' ? 76 : 100);\n const [sendStatus, setSendStatus] = React.useState('发送中');\n const [extraMessages, setExtraMessages] = React.useState([]);\n const [toast, setToast] = React.useState('');\n\n React.useEffect(() => {\n if (variant !== 'status') return undefined;\n const stages = ['已发送', '已送达', '已读'];\n const timers = stages.map((status, index) => window.setTimeout(() => setSendStatus(status), 600 * (index + 1)));\n return () => timers.forEach(timer => window.clearTimeout(timer));\n }, [variant]);\n\n React.useEffect(() => {\n if (variant !== 'media' || uploadProgress >= 100) return undefined;\n const timer = window.setTimeout(() => setUploadProgress(value => Math.min(value + 4, 100)), 350);\n return () => window.clearTimeout(timer);\n }, [variant, uploadProgress]);\n\n const friendAction = action => {\n if (action === 'declined') {\n setRelationship('none');\n setToast('已拒绝好友申请');\n } else {\n setRelationship(action === 'accepted' ? 'friend' : 'pending_outbound');\n if (action === 'accepted') setVariant('friend');\n setToast(action === 'accepted' ? '好友申请已通过' : '好友验证已发送');\n }\n };\n\n return \n
\n navigate('messages-home')} aria-label=\"返回消息\">arrow_back_ios_new \n
接语彤 在线 \n navigate('friend-settings')} aria-label=\"会话设置\">more_vert \n \n
\n setToast('正在重试发送')} onOpenCard={() => navigate('friend-profile')} onFriendAction={friendAction} />\n {extraMessages.map(item => {item.text} )}\n \n {relationship === 'friend' ? null :
info_outline {relationship === 'pending_inbound' ? '通过好友申请后即可发送消息' : relationship === 'pending_outbound' ? '好友申请正在等待处理' : relationship === 'none' ? '对方已不是你的好友,发送消息前需重新验证' : '当前关系状态下无法发送消息'}
}\n
{\n const id = Date.now();\n setExtraMessages(items => items.concat({id, text, status: '发送中'}));\n window.setTimeout(() => setExtraMessages(items => items.map(item => item.id === id ? {...item, status: '已发送'} : item)), 600);\n }} />\n {attachmentOpen && relationship === 'friend' ? {\n setToast(`已选择${item.label},上传接口将在联调阶段接入`);\n if (item.id === 'card') navigate('chat-contact-card');\n if (item.id === 'photo' || item.id === 'camera') navigate('media-uploading');\n if (item.id === 'call' || item.id === 'video') navigate('call-history');\n if (item.id === 'file') navigate('upload-file');\n if (item.id === 'favorite') navigate('favorites');\n }} /> : null}\n setToast('')} />\n ;\n}\n","import React from 'react';\nimport QRCode from 'qrcodejs';\nimport { pinyin } from 'pinyin-pro';\n\nimport HashNavigation from '../lib/navigation.js';\nimport {\n getGroups, createGroup, getGroup, updateGroup, getGroupSettings, updateGroupMemberSettings,\n updateMyGroupProfile, getMyGroupProfile, leaveGroup, getGroupMembers, createGroupQRCode, getGroupJoinRequests,\n acceptGroupJoinRequest, rejectGroupJoinRequest, getLatestGroupAnnouncement,\n updateCurrentGroupAnnouncement, readGroupAnnouncement, getGroupGovernance, updateGroupGovernance, addGroupAdmins,\n deleteGroupAdmin, muteGroupMembers, getGroupMutes, unmuteGroupMember, transferGroupOwner,\n getGroupFiles, addGroupFile, deleteGroupFile, uploadLargeFile, getFileUrl, getUserProfile,\n getGroupMemberProfile, fetchAllPages\n} from '../lib/im-api.js';\nimport { readCachedData, writeCachedData, useDebouncedValue } from '../lib/use-cached-data.js';\n\n// Carries the group `topic` (and anything else already in the hash) across navigation, the same way\n// contact-management-view.jsx threads `uid` -- these pages all need to know *which* group.\nconst navigate = (view, topic) => {\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, view);\n hash = topic ? HashNavigation.addUrlParam(hash, 'topic', topic) : HashNavigation.removeUrlParam(hash, 'topic');\n HashNavigation.navigateTo(hash);\n};\n\n// 'group-member-profile' is contact-management-view.jsx's Profile component (Ch.5) reused as-is for\n// viewing a group member who isn't necessarily a friend -- that route keys off `uid`, not `topic`, so it\n// can't go through this file's own `navigate` helper above without clobbering the wrong hash param.\n// 除了跳转,还必须先把已知资料写进 'profile-seed:' 缓存 —— 目标页(第5章的 Profile)会先读这个种子,\n// 因为 GET /users/{id}/profile 对非好友按隐私默认直接 403(imPrivacyAllowsProfile)。群成员里\n// 大部分不是好友,不 seed 的话点进去就是\"资料加载失败,请重试\"。第5章自己的入口\n// (contact-management-view.jsx 的 seedProfile)一直是这么做的,这里漏了。\nconst navigateToProfile = (topic, userId, member) => {\n // 先用群成员列表里已有的字段摆一个立即可用的种子(避免导航瞬间空白),\n // 但这份种子缺 capabilities/relationship——GET /groups/{topic}/members 从不返回这两个字段\n // (已实测确认),Profile 组件正是靠它们判断\"要不要显示添加好友按钮\"和\"该显示哪句失败文案\"。\n // 缺了它们,非好友的群成员主页会落到 cannotAddReason 的默认分支——不管真实关系是什么,\n // 一律显示\"好友申请正在等待验证\",添加好友按钮永远不出现。\n if (member && userId) {\n writeCachedData('profile-seed:' + userId, {\n user_id: userId,\n display_name: member.group_nickname || member.display_name || userId,\n avatar_file_id: member.avatar_file_id,\n ...(member.signature ? {signature: member.signature} : {}),\n ...(member.region ? {region: member.region} : {}),\n ...(member.gender ? {gender: member.gender} : {})\n });\n }\n HashNavigation.navigateTo(\n HashNavigation.addUrlParam(HashNavigation.setUrlSidePanel(window.location.hash, 'group-member-profile'), 'uid', userId));\n // 群场景下真正该用的是 GET /groups/{topic}/members/{user_id}/profile——群上下文里权限判断更\n // 宽松,实测对方哪怕不是好友也能拿到 {capabilities, relationship}(Profile 组件目标页读的\n // GET /users/{id}/profile 对非好友是 403,只能回退用种子)。异步补种:请求回来后如果用户还\n // 停在这个人的资料页(没有连点跳到别处),用真实数据覆盖种子并强制该页面重新读取。\n if (topic && userId) {\n getGroupMemberProfile(topic, userId).then(real => {\n const current = readCachedData('profile-seed:' + userId) || {};\n writeCachedData('profile-seed:' + userId, {...current, ...real});\n window.dispatchEvent(new CustomEvent('profile-seed-updated', {detail: {uid: userId}}));\n }).catch(() => {});\n }\n};\n\nexport const GROUP_MANAGEMENT_VIEWS = [\n 'group-list', 'group-empty', 'group-invite', 'group-events', 'group-join-requests',\n 'group-new-request', 'group-announcement', 'group-summary', 'group-announcement-detail',\n 'group-settings', 'group-profile', 'group-avatar', 'group-nickname', 'group-description',\n 'group-my-nickname', 'group-members', 'group-role-message', 'group-qr', 'group-governance', 'group-admins',\n 'group-admin-add', 'group-admin-success', 'group-admin-partial', 'group-admin-removed',\n 'group-mute-add', 'group-muted', 'group-owner-select', 'group-owner-confirm', 'group-files',\n 'group-file-upload'\n];\n\n// Same first-pinyin-letter grouping as contact-management-view.jsx's alphaInitial -- duplicated rather\n// than shared, since that file's copy is unexported and this one is the only other place that needs it.\nfunction alphaInitial(name) {\n const ch = (name || '').trim()[0] || '#';\n if (/[A-Za-z]/.test(ch)) {\n return ch.toUpperCase();\n }\n if (/[一-龥]/.test(ch)) {\n const letter = pinyin(ch, {pattern: 'first', toneType: 'none'});\n return /[a-z]/i.test(letter) ? letter.toUpperCase() : '#';\n }\n return '#';\n}\n\nfunction groupBy(list, keyFn) {\n const groups = {};\n list.forEach(item => {\n const key = keyFn(item);\n (groups[key] || (groups[key] = [])).push(item);\n });\n return Object.keys(groups).sort().map(key => [key, groups[key]]);\n}\n\n// GET /v1/im/groups 的 name/member_count 目前不可信:handler 用的是 store.Users.GetSubs,而 store 自己的\n// 注释就写着它 \"Does not load Public/Trusted or Private\"(store.go:834-835),可 groupListItemPayload\n// 偏偏去读 sub.GetPublic() 取名字、sub.GetSubCnt() 取人数——于是每个群都返回自己的 topic id 当名字、\n// 0 当人数(应该用 GetTopics,它会把 Public 拷到 subscription 上)。已记入后端问题清单。\n// 在后端修好之前,用本地 Tinode 会话缓存兜底——消息首页的群名一直是从这里取的,是准的。\nfunction groupDisplayName(tinode, group) {\n if (group.name && group.name !== group.topic) return group.name;\n const t = tinode && tinode.getTopic ? tinode.getTopic(group.topic) : null;\n const pub = t && t.public;\n // 群的 public 用的是 `name`(实测本地缓存就是 {name:\"扫码测试群\", version:1}),后端自己的\n // groupName() 也是按 name/display_name/fn 这个顺序找的,保持一致。\n const local = pub && (pub.name || pub.display_name || pub.fn);\n return local || group.name || group.topic;\n}\n\nfunction groupMemberCount(tinode, group) {\n if (group.member_count) return group.member_count;\n const t = tinode && tinode.getTopic ? tinode.getTopic(group.topic) : null;\n return (t && t.subcnt) || 0;\n}\n\nfunction shortDate(iso) {\n if (!iso) return '';\n const d = new Date(iso);\n return `${d.getMonth() + 1}-${String(d.getDate()).padStart(2, '0')}`;\n}\n\n// -- Demo-only mock data below this line: still used by the untouched GroupChat/ChatHeader/SystemEvent\n// -- trio (see comment above GroupChat). Those views are a standalone design reference showing message-\n// -- timeline states -- the real group chat timeline is messages-view.jsx, not this file (same treatment\n// -- Ch.3 gave direct-message-view.jsx). Nothing else in this file reads these constants any more.\nconst MEMBERS = [\n {id: 'annie', name: '安妮', role: '管理员', avatar: 'img/bkg/p09.jpg'},\n {id: 'lizi', name: '栗子来了', role: '成员', avatar: 'img/bkg/p15.jpg'},\n {id: 'wang', name: '王珊珊', role: '成员', avatar: 'img/bkg/p14.jpg'},\n {id: 'sun', name: '孙光洪', role: '成员', avatar: 'img/bkg/p03.jpg'},\n {id: 'lin', name: '林间风', role: '成员', avatar: 'img/bkg/p18.jpg'}\n];\nconst GROUPS_DEMO = {\n owned: [{id: 'product', name: '产品研发群', count: 18, avatar: 'img/bkg/p22.jpg'}]\n};\n\nfunction Icon({children}) { return {children} ; }\n// onBack:少数页面的返回目标不是\"另一个侧栏视图\",而是要关掉侧栏回到某个会话(需要写 path[1],\n// navigate 辅助函数只会写 query 参数),这类情况传一个自己的回调进来。\nfunction Header({title, back = 'group-list', backTopic, onBack, right, onRight}) {\n return \n { if (!HashNavigation.goBack()) { if (onBack) onBack(); else navigate(back, backTopic); } }} aria-label=\"返回\">arrow_back_ios_new \n {title} \n {right ? {right} : }\n ;\n}\nfunction Avatar({item, icon}) {\n const fileId = item && item.avatar_file_id;\n const [url, setUrl] = React.useState(null);\n React.useEffect(() => {\n if (!fileId) { setUrl(null); return undefined; }\n let live = true;\n getFileUrl(fileId).then(u => { if (live) setUrl(u); }).catch(() => {});\n return () => { live = false; };\n }, [fileId]);\n return {url ? : {icon || 'group'} } ;\n}\nfunction Toast({message, onDone}) {\n React.useEffect(() => { if (!message) return undefined; const timer = window.setTimeout(onDone, 2000); return () => window.clearTimeout(timer); }, [message, onDone]);\n return message ? {message}
: null;\n}\n// Centered overlay confirmation, docs/images/添加管理员-设置成功.png -- distinct from the bottom Toast\n// above (used for lighter \"已同意进群申请\"-style feedback that doesn't need a heavier interrupt).\nfunction CenterToast({message, onDone}) {\n React.useEffect(() => { if (!message) return undefined; const timer = window.setTimeout(onDone, 1400); return () => window.clearTimeout(timer); }, [message, onDone]);\n return message ? check_circle {message}
: null;\n}\nfunction Search({value, onChange, placeholder = '搜索'}) {\n return search onChange(event.target.value)} placeholder={placeholder} /> ;\n}\nfunction Toggle({checked, onChange, disabled}) {\n return !disabled && onChange(!checked)}> ;\n}\n\nfunction GroupList({tinode, onToast}) {\n // Only the unfiltered (query === '') result is worth caching -- caching a search result under the\n // same key would show stale search results instead of the real list on the next plain visit.\n const [lists, setLists] = React.useState(() => readCachedData('groups') || {owned: null, managed: null, joined: null});\n const [loadErrors, setLoadErrors] = React.useState({owned: false, managed: false, joined: false});\n const [category, setCategory] = React.useState('owned');\n // 这里比别处更值得防抖:reload 对 owned/managed/joined 三个分类各发一次请求,\n // 每敲一个字符就是 3 个 getGroups。\n const [queryInput, setQueryInput] = React.useState('');\n const query = useDebouncedValue(queryInput, 300);\n const [creating, setCreating] = React.useState(false);\n const [name, setName] = React.useState('');\n const [submitting, setSubmitting] = React.useState(false);\n const reload = React.useCallback(() => {\n ['owned', 'managed', 'joined'].forEach(cat => {\n getGroups({category: cat, query}).then(data => {\n const items = data.items || [];\n setLists(v => {\n const next = {...v, [cat]: items};\n if (!query) writeCachedData('groups', next);\n return next;\n });\n }).catch(() => { onToast('加载失败'); setLoadErrors(v => ({...v, [cat]: true})); });\n });\n }, [query]);\n React.useEffect(() => { reload(); }, [reload]);\n const current = lists[category];\n const submit = () => {\n if (!name.trim() || submitting) return;\n setSubmitting(true);\n createGroup({name: name.trim()}).then(() => {\n setCreating(false); setName(''); onToast('群聊创建成功'); reload();\n }).catch(err => onToast(err.message || '创建失败')).finally(() => setSubmitting(false));\n };\n return ;\n}\n\n// GroupChat/ChatHeader/SystemEvent: standalone design-reference demo (docs/images/内容沟通对话*.png), same\n// treatment as Ch.3's direct-message-view.jsx -- the real group timeline is messages-view.jsx, which now\n// has its own real relationship/announcement/join-request/role-badge wiring. Left unchanged, not rewired.\nfunction ChatHeader() { return navigate('group-list')}>arrow_back_ios_new
产品研发群 18人
navigate('group-settings')}>more_vert ; }\nfunction SystemEvent({children}) { return {children}
; }\nfunction GroupChat({mode, onToast}) {\n const [joined, setJoined] = React.useState(false);\n return {['group-new-request', 'group-summary'].includes(mode) ?
navigate('group-join-requests')}>person_add_alt 新的进群申请 2 条申请等待处理 chevron_right : null}{['group-announcement', 'group-summary'].includes(mode) ?
navigate('group-announcement-detail')}>campaign 群公告 下午三点进行版本评审,请准时参加 chevron_right : null}
今天 10:24
{mode === 'group-invite' ? 一起参与新版产品的设计与研发讨论
{setJoined(true); onToast('已加入产品研发群');}}>{joined ? '已加入' : '立即加入'} : <>安妮邀请栗子来了加入群聊 管理员通过了王珊珊的进群申请 >}record_voice_over sentiment_satisfied_alt add_circle_outline
;\n}\n\nfunction JoinRequests({topic, fromChat, onToast}) {\n // A persistent in-chat banner (messages-view.jsx's handleShowAnnouncement/handleShowJoinRequests)\n // is a second entry point besides group-settings, and this whole feature remounts on every\n // navigation step (see GroupManagementView's `key={view}` note) -- so an admin actively working\n // through requests re-triggers this blank \"加载中\" flash on essentially every accept/reject.\n // `fromChat`/`backToChat` mirror Announcement's handling of the exact same two-entry-point\n // ambiguity above -- without it, returning from a click on the in-chat banner always landed on\n // \"group-settings\" (closing the open conversation) instead of back to the chat itself.\n const backToChat = React.useCallback(() => {\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(HashNavigation.setUrlSidePanel('', ''), topic));\n }, [topic]);\n const [items, setItems] = React.useState(() => (topic && readCachedData('group-join-requests:' + topic)) || null);\n const [profiles, setProfiles] = React.useState({});\n const [loadError, setLoadError] = React.useState(false);\n // Tracked in a ref (not state) so `load` doesn't need `profiles` in its dependency array --\n // depending on `profiles` here would make `load` a new function every time a profile fetch\n // resolves, which would re-trigger the `useEffect(() => load(), [load])` below and re-fetch\n // the whole join-request list in a cascade, not just skip already-known profiles.\n const fetchedIds = React.useRef(new Set());\n const load = React.useCallback(() => {\n if (!topic) return;\n getGroupJoinRequests(topic, 'all').then(data => {\n const list = data.items || [];\n writeCachedData('group-join-requests:' + topic, list);\n setItems(list);\n const ids = new Set();\n list.forEach(r => { ids.add(r.user_id); if (r.inviter_id) ids.add(r.inviter_id); });\n ids.forEach(id => {\n if (fetchedIds.current.has(id)) return;\n fetchedIds.current.add(id);\n getUserProfile(id).then(p => setProfiles(v => ({...v, [id]: p}))).catch(() => { fetchedIds.current.delete(id); });\n });\n }).catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n React.useEffect(() => { setItems((topic && readCachedData('group-join-requests:' + topic)) || null); load(); }, [topic, load]);\n const handle = (req, accept) => {\n const call = accept ? acceptGroupJoinRequest(topic, req.request_id, req.version) : rejectGroupJoinRequest(topic, req.request_id, req.version);\n call.then(() => { onToast(accept ? '已同意进群申请' : '已拒绝进群申请'); load(); })\n .catch(err => onToast(err.message || '操作失败'));\n };\n const nameOf = id => (profiles[id] && profiles[id].display_name) || id;\n const describe = req => req.source === 'qr' ? `${nameOf(req.user_id)}通过二维码分享进群` :\n req.inviter_id ? `${nameOf(req.inviter_id)}邀请${nameOf(req.user_id)}进群` : `${nameOf(req.user_id)}申请加入群聊`;\n // Exact resolved/rejected label wording isn't confirmed against the live status enum yet -- falls back\n // to the raw status string for anything unrecognized so a mismatch is visible instead of silently wrong.\n const statusLabel = {accepted: '已确定', approved: '已确定', rejected: '已拒绝', expired: '已过期'};\n return \n
\n
\n {items === null ? {loadError ? '申请列表加载失败' : '加载中…'}
:\n items.length ? items.map(item =>\n \n \n {describe(item)} {shortDate(item.created_at)}
\n {item.status === 'pending' ?\n \n handle(item, false)}>拒绝 \n handle(item, true)}>确定 \n :\n {statusLabel[item.status] || item.status} }\n ) :\n 暂无进群申请
}\n \n
;\n}\n\nfunction Announcement({topic, myRole, fromChat, onToast}) {\n // Shares the 'group-announcement:'+topic cache key with GroupSettings' preview snippet below --\n // whichever screen loads first warms the cache for the other, and both are re-entered often (the\n // in-chat banner is a persistent second entry point on top of group-settings).\n const cachedAnnouncement = topic && readCachedData('group-announcement:' + topic);\n const [data, setData] = React.useState(() => cachedAnnouncement || null);\n const [draft, setDraft] = React.useState(() => (cachedAnnouncement && cachedAnnouncement.content) || '');\n const [editing, setEditing] = React.useState(false);\n const [saving, setSaving] = React.useState(false);\n const [loadError, setLoadError] = React.useState(false);\n const canEdit = myRole === 'owner' || myRole === 'admin';\n // Coming from the announcement banner atop the chat itself (messages-view.jsx's\n // handleShowAnnouncement) vs. from group-settings' \"群公告\" row land on the identical\n // path[0]=group-announcement-detail hash -- `fromChat` is the only thing telling them apart, so\n // \"back\" can return to the chat (close the sidepanel) instead of always forcing group-settings.\n // 从聊天页横幅进来时(messages-view.jsx:1152 用空基准拼 hash,所以 path[1] 是空的),返回应该\n // 关掉侧栏回到那个会话。原来写的是 navigate('', topic)——navigate 只把 topic 写成 query 参数,\n // path[1] 依旧为空,tinode-web 的 handleHashRoute 就把 topicSelected 清成 null,会话跟着一起关了。\n // 这里显式把 topic 写回 path[1]。\n const backToChat = React.useCallback(() => {\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(HashNavigation.setUrlSidePanel('', ''), topic));\n }, [topic]);\n React.useEffect(() => {\n if (!topic) return;\n const cached = readCachedData('group-announcement:' + topic);\n if (cached) { setData(cached); setDraft(cached.content || ''); }\n getLatestGroupAnnouncement(topic).then(d => {\n writeCachedData('group-announcement:' + topic, d);\n setData(d); setDraft(d.content || '');\n }).catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n const publish = () => {\n if (!draft.trim() || saving) return;\n setSaving(true);\n updateCurrentGroupAnnouncement(topic, draft.trim(), data ? data.version : 0).then(d => {\n writeCachedData('group-announcement:' + topic, d);\n setData(d); setEditing(false); onToast('群公告已发布');\n }).catch(err => onToast(err.message || '发布失败')).finally(() => setSaving(false));\n };\n // 6.9 要求\"记录已读状态\",但这个接口(POST .../read)之前完全没有调用点——每次打开公告详情页\n // (无论从群设置点进来还是从聊天顶部横幅点进来)都视为\"已读\",用ref去重避免同一条公告在同一次\n // 页面停留内重复上报。静默失败:已读打点不是这个页面的主要功能,不应该在失败时打断用户。\n const readReportedFor = React.useRef(null);\n React.useEffect(() => {\n const id = data && data.announcement_id;\n if (!id || !topic || readReportedFor.current === id) return;\n readReportedFor.current = id;\n readGroupAnnouncement(topic, id).catch(() => {});\n }, [topic, data]);\n if (!data) return {loadError ? '群公告加载失败' : '加载中…'}
;\n return \n
\n
\n {canEdit ? setDraft(e.target.value)} onFocus={() => setEditing(true)}\n placeholder=\"请输入群公告内容\" /> :\n <>\n campaign \n {data.content || '暂无群公告'}
\n >}\n {!canEdit ? 仅群主及群管理员可编辑 : null}\n \n
;\n}\n\nfunction GroupSettings({topic, myUserId, tinode, onToast}) {\n // This is the landing point for \"back\" from GroupProfile/GroupFiles/Governance/MyNicknameEditor/\n // Announcement, and (per GroupManagementView's `key={view}` note) the whole subtree remounts on\n // every one of those round trips -- essentially every group-settings visit after the first refetches\n // from scratch, making this the single highest-traffic page in this file to seed from cache.\n const [group, setGroup] = React.useState(() => (topic && readCachedData('group-settings:' + topic)) || null);\n const [loadError, setLoadError] = React.useState(false);\n // The member strip and AdminList/`myRole` all call the identical unfiltered getGroupMembers(topic) --\n // sharing one 'group-members:'+topic cache entry (storing the raw list, sliced to 9 only for local\n // display here) lets any one of the three warm it for the others.\n const [members, setMembers] = React.useState(() => {\n const cached = topic && readCachedData('group-members:' + topic);\n return cached ? cached.slice(0, 9) : [];\n });\n const [announcement, setAnnouncement] = React.useState(() => {\n const cached = topic && readCachedData('group-announcement:' + topic);\n return cached && cached.content ? cached : null;\n });\n React.useEffect(() => {\n if (!topic) return;\n setGroup(readCachedData('group-settings:' + topic) || null);\n setMembers((readCachedData('group-members:' + topic) || []).slice(0, 9));\n const cachedAnn = readCachedData('group-announcement:' + topic);\n setAnnouncement(cachedAnn && cachedAnn.content ? cachedAnn : null);\n getGroupSettings(topic).then(g => { writeCachedData('group-settings:' + topic, g); setGroup(g); }).catch(() => { onToast('加载失败'); setLoadError(true); });\n getGroupMembers(topic).then(data => {\n const items = data.items || [];\n writeCachedData('group-members:' + topic, items);\n setMembers(items.slice(0, 9));\n }).catch(() => {});\n getLatestGroupAnnouncement(topic).then(d => {\n writeCachedData('group-announcement:' + topic, d);\n setAnnouncement(d && d.content ? d : null);\n }).catch(() => {});\n }, [topic]);\n const setPref = patch => {\n updateGroupMemberSettings(topic, {pinned: group.pinned, mute_notifications: group.mute_notifications, ...patch})\n .then(() => setGroup(g => {\n const next = {...g, ...patch};\n writeCachedData('group-settings:' + topic, next);\n return next;\n })).catch(err => onToast(err.message || '设置失败'));\n };\n const leave = () => {\n if (group && group.my_role === 'owner') { onToast('群主需先转让群主或解散群聊'); return; }\n leaveGroup(topic).then(() => { onToast('已退出群聊'); navigate('group-list'); }).catch(err => onToast(err.message || '操作失败'));\n };\n if (!group) return {loadError ? '群组信息加载失败' : '加载中…'}
;\n const canManage = group.permissions && group.permissions.can_manage_settings;\n const links = [\n ['group-profile', '群资料', group.name],\n ['group-announcement-detail', '群公告', announcement ? announcement.content : '暂无群公告'],\n ['group-files', '群文件', ''],\n ['group-my-nickname', '我在本群的昵称', '']\n ];\n if (canManage) links.splice(3, 0, ['group-governance', '群组管理', '']);\n return \n
navigate('group-governance', topic) : undefined} />\n \n navigate('group-profile', topic)}>\n \n {group.name} {group.description || '群主很懒,还没有群简介'} \n chevron_right \n \n {/* 参考图 docs/images/群聊设置.png:\"群成员\"标题行右侧是可点的\"查看{N}群成员 >\",现在真的有\n 落地页了(GroupMembers,复用 MemberPicker 同款字母分组/搜索,只读不可多选)。参考图里最后\n 一格的\"删除\"(移除成员)没有做——那是一个独立的、需要产品先确认交互细节的成员管理功能,\n 不属于这条\"看不到全部成员\"缺口本身。 */}\n \n navigate('group-members', topic)}>\n 群成员 共 {group.member_count} 位成员 chevron_right \n \n \n {members.slice(0, 9).map(item =>
navigateToProfile(topic, item.user_id, item)}>\n {item.group_nickname || item.display_name} \n )}\n
onToast('请通过转发/分享群二维码邀请成员')}>\n add 添加 \n \n
\n \n {links.map(item => navigate(item[0], topic)}>\n {item[1]} {item[2]} chevron_right \n )} \n \n 置顶聊天 setPref({pinned: v})} />
\n 消息免打扰 setPref({mute_notifications: v})} />
\n navigate('history-search', topic)}>查看聊天记录 chevron_right \n {\n const t = tinode ? tinode.getTopic(topic) : null;\n (t ? t.delMessagesAll(false) : Promise.resolve()).then(() => onToast('聊天记录已清除')).catch(err => onToast(err.message || '操作失败'));\n }}>清空聊天记录 chevron_right \n {/* target_type='group' 这条链路早就是通的(tinode-web.jsx 的 handleReportTopic 就在用),\n 这里原来一直是个\"暂未开放\"的死桩。跟 contact-management-view.jsx 的好友举报入口一样,\n 举报页要的是 target_type/target_id/target_name 三个参数,本文件的 navigate 辅助函数\n 只会写 topic,所以直接拼 hash。 */}\n {\n let hash = HashNavigation.setUrlSidePanel('', 'abuse-report-reasons');\n hash = HashNavigation.addUrlParam(hash, 'target_type', 'group');\n hash = HashNavigation.addUrlParam(hash, 'target_id', topic);\n hash = HashNavigation.addUrlParam(hash, 'target_name', (group && group.name) || topic);\n HashNavigation.navigateTo(hash);\n }}>投诉/举报 chevron_right \n \n 退出群组 \n \n ;\n}\n\nfunction GroupProfile({topic, myUserId, onToast}) {\n // Shares 'group:'+topic with the nickname/description editors' own getGroup(topic) calls -- opening\n // this once warms the cache for either of those too.\n const [group, setGroup] = React.useState(() => (topic && readCachedData('group:' + topic)) || null);\n const [loadError, setLoadError] = React.useState(false);\n // \"群昵称\" here means \"my nickname within this group\" (see MyNicknameEditor below), not the group's\n // own name -- confirmed live this preview row was showing group.name instead, since it's easy to\n // conflate the two. GET .../members/me/profile is the only endpoint that actually returns this --\n // confirmed live that the member list endpoint (getGroupMembers) never includes group_nickname on\n // any item, so a version of this fix that read it from there (like MyNicknameEditor below does)\n // would always show \"未设置\" even right after a successful save.\n const [myNickname, setMyNickname] = React.useState('');\n React.useEffect(() => {\n if (!topic) return;\n setGroup(readCachedData('group:' + topic) || null);\n getGroup(topic).then(g => { writeCachedData('group:' + topic, g); setGroup(g); }).catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n React.useEffect(() => {\n if (!topic) return;\n getMyGroupProfile(topic).then(data => {\n setMyNickname(data.nickname || '');\n }).catch(() => {});\n }, [topic]);\n if (!group) return {loadError ? '群组信息加载失败' : '加载中…'}
;\n const canEdit = group.permissions && group.permissions.can_edit_profile;\n const nicknameLabel = myNickname || '未设置';\n return \n
\n
\n canEdit && navigate('group-avatar', topic)}>\n 群头像 chevron_right \n \n navigate('group-my-nickname', topic)}>\n 群昵称 {nicknameLabel} chevron_right \n \n {canEdit ? navigate('group-nickname', topic)}>\n 群名称 {group.name} chevron_right \n :\n 群名称 {group.name}
}\n {canEdit ? navigate('group-description', topic)}>\n 群简介 {group.description || '群主很懒,还没有群简介'} chevron_right \n :\n 群简介 {group.description || '群主很懒,还没有群简介'}
}\n navigate('group-qr', topic)}>群二维码 qr_code chevron_right \n {group.member_count} 位成员
\n \n
;\n}\n\nfunction AvatarSheet({topic, myUserId, tinode, onToast}) {\n const inputRef = React.useRef(null);\n const [uploading, setUploading] = React.useState(false);\n const pick = () => inputRef.current && inputRef.current.click();\n const onFile = e => {\n const file = e.target.files && e.target.files[0];\n e.target.value = '';\n if (!file || !tinode) return;\n setUploading(true);\n // Fetch the current version right before the write, same optimistic-concurrency protection the\n // name/description editors already have (GroupProfile below re-fetches independently and its\n // possibly-stale copy isn't reused here) -- avatar updates were the one group-profile field with\n // none at all.\n uploadLargeFile(tinode, file)\n .then(({fileId}) => getGroup(topic).then(group => updateGroup(topic, {avatar_file_id: fileId, version: group.version})))\n .then(() => { onToast('群头像已更新'); navigate('group-profile', topic); })\n .catch(err => onToast(err.message || '上传失败')).finally(() => setUploading(false));\n };\n return \n
\n
\n
\n 设置群头像 \n photo_library {uploading ? '正在上传…' : '从相册选择'} \n navigate('group-profile', topic)}>取消 \n
\n
;\n}\n\nfunction GroupQr({topic, onToast}) {\n const ref = React.useRef(null);\n const [data, setData] = React.useState(null);\n React.useEffect(() => {\n if (!topic) return;\n createGroupQRCode(topic).then(setData).catch(() => onToast('二维码生成失败'));\n }, [topic]);\n React.useEffect(() => {\n if (!ref.current || !data) return;\n ref.current.innerHTML = '';\n new QRCode(ref.current, {text: data.qr_payload, width: 190, height: 190, correctLevel: QRCode.CorrectLevel.M});\n }, [data]);\n const group = data && data.group_snapshot;\n const share = () => {\n if (navigator.share && data) {\n navigator.share({title: group && group.name, text: '扫码加入群聊', url: data.qr_payload}).catch(() => {});\n } else if (data) {\n navigator.clipboard.writeText(data.qr_payload).then(() => onToast('链接已复制')).catch(() => onToast('分享失败'));\n }\n };\n const save = () => {\n const canvas = ref.current && ref.current.querySelector('canvas');\n if (!canvas) { onToast('保存失败'); return; }\n const a = document.createElement('a');\n a.href = canvas.toDataURL('image/png');\n a.download = (group ? group.name : 'group') + '-qrcode.png';\n a.click();\n onToast('群二维码已保存');\n };\n return \n
\n
\n \n {group ? group.name : ''} {group ? group.member_count : 0} 位成员 \n
\n 使用APP扫码二维码,加入群聊
\n \n \n share 分享好友 \n download 保存至相册 \n
\n \n
;\n}\n\n// The five backend-persisted governance fields (server/im_http.go imGroupGovernancePatchRequest) --\n// docs/images/群组管理.png showed a 4th toggle \"群成员修改昵称\" that doesn't correspond to any real\n// governance field (its own description text also doesn't match member_upload_files' actual meaning,\n// which a *different*, buggier draft screenshot happened to label correctly). Shipping a toggle with\n// nothing to persist would be worse than a label mismatch, so this uses the mock's original 5-key\n// structure -- which lines up exactly with the 5 real backend fields -- with corrected descriptions.\nconst GOVERNANCE_FIELDS = [\n ['join_approval', '进群验证', '开启后,他人申请加入群聊需群主或管理员同意'],\n ['mute_all', '全体禁言', '开启后,仅群主和管理员可以发言'],\n ['member_upload_files', '群成员文件上传', '关闭后,普通成员将无法上传群文件'],\n ['member_invite', '群成员邀请', '关闭后,仅群主和管理员可以邀请新成员进群'],\n ['member_private_chat', '群成员私信权限', '关闭后,不允许发送名片消息,且普通成员在群聊界面、群组信息内点击头像无反应。']\n];\n\nfunction Governance({topic, tinode, onToast}) {\n // Router page for AdminList/Muted/OwnerSelect/the avatar editor -- remounts (per GroupManagementView's\n // `key={view}` note) and reflashes its 5 toggles every time the user finishes one of those sub-tasks\n // and returns, so this is one of the highest-traffic pages in the file.\n const [gov, setGov] = React.useState(() => (topic && readCachedData('group-governance:' + topic)) || null);\n const [dissolving, setDissolving] = React.useState(false);\n const [loadError, setLoadError] = React.useState(false);\n React.useEffect(() => {\n if (!topic) return;\n setGov(readCachedData('group-governance:' + topic) || null);\n getGroupGovernance(topic).then(d => { writeCachedData('group-governance:' + topic, d); setGov(d); }).catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n const setField = (key, value) => {\n // GET .../governance does return a real `version` (confirmed live) -- omitting it here isn't\n // just \"no version sent\", the server-side UPDATE for this endpoint skips its optimistic-lock\n // WHERE clause entirely whenever version<=0, so two admins toggling different switches at\n // nearly the same time would have the second write silently clobber the first with no conflict\n // signal. Sending the version this page already has on hand costs nothing and closes that gap.\n updateGroupGovernance(topic, {[key]: value, version: gov ? gov.version : 0}).then(data => { writeCachedData('group-governance:' + topic, data); setGov(data); })\n .catch(err => onToast(err.message || '设置失败'));\n };\n const dissolve = () => {\n if (!window.confirm('解散后群聊将无法恢复,确定要解散该群聊吗?')) return;\n const t = tinode ? tinode.getTopic(topic) : null;\n if (!t) return;\n setDissolving(true);\n t.delTopic(true).then(() => { onToast('群聊已解散'); navigate('group-list'); })\n .catch(err => onToast(err.message || '解散失败')).finally(() => setDissolving(false));\n };\n if (!gov) return {loadError ? '群组管理加载失败' : '加载中…'}
;\n return \n
\n
\n navigate('group-avatar', topic)}>设置群头像 chevron_right \n \n navigate('group-join-requests', topic)}>邀请进群申请 chevron_right \n navigate('group-muted', topic)}>禁言的群成员 chevron_right \n navigate('group-admins', topic)}>设置管理员 chevron_right \n navigate('group-owner-select', topic)}>群主管理权转让 chevron_right \n \n {GOVERNANCE_FIELDS.map(([key, label, desc]) => \n {label} {desc} \n setField(key, v)} />\n
)} \n 解散群组 \n \n
;\n}\n\nfunction deriveOwnerAndAdmins(items) {\n return {owner: items.find(m => m.role === 'owner') || null, admins: items.filter(m => m.role === 'admin')};\n}\n\nfunction AdminList({topic, onToast}) {\n // Shares the same 'group-members:'+topic cache entry as GroupSettings' member strip and\n // GroupManagementView's `myRole` lookup -- all three call the identical unfiltered getGroupMembers.\n const cachedMembers = topic && readCachedData('group-members:' + topic);\n const seed = cachedMembers ? deriveOwnerAndAdmins(cachedMembers) : {owner: null, admins: null};\n const [owner, setOwner] = React.useState(() => seed.owner);\n const [admins, setAdmins] = React.useState(() => seed.admins);\n const [toast, setToast] = React.useState('');\n const [loadError, setLoadError] = React.useState(false);\n const load = React.useCallback(() => {\n if (!topic) return;\n const cached = readCachedData('group-members:' + topic);\n if (cached) { const d = deriveOwnerAndAdmins(cached); setOwner(d.owner); setAdmins(d.admins); }\n // Fetch the unfiltered member list rather than {role:'admin'} + a separate per-user profile lookup\n // for the owner -- GET /users/{id}/profile 400s (\"malformed request\", field \"user_id\") when {id} is\n // the caller's own uid, which broke this whenever the viewer is themselves the group's owner.\n // Members cap out at 30/page against a 128-member group limit -- an admin sitting past page 1\n // used to vanish from this list entirely rather than the list just being incomplete.\n fetchAllPages(cursor => getGroupMembers(topic, {cursor})).then(items => {\n writeCachedData('group-members:' + topic, items);\n const d = deriveOwnerAndAdmins(items);\n setOwner(d.owner);\n setAdmins(d.admins);\n }).catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n React.useEffect(() => { load(); }, [load]);\n const remove = userId => {\n deleteGroupAdmin(topic, userId).then(() => { setToast('管理员已移除'); load(); })\n .catch(err => onToast(err.message || '操作失败'));\n };\n return ;\n}\n\n// 参考图 群聊设置.png 里\"群成员\"标题行是可点的(\"查看{N}群成员 >\"),但 GroupSettings 一直没有\n// 对应的落地页——群成员超过预览网格的9人就完全看不到其余成员。复用 MemberPicker 已经在用的\n// 字母分组+搜索逻辑,去掉多选/提交,只读展示每个人的角色。\nfunction GroupMembers({topic, onToast}) {\n const [members, setMembers] = React.useState(() => (topic && readCachedData('group-members:' + topic)) || null);\n const [query, setQuery] = React.useState('');\n const [loadError, setLoadError] = React.useState(false);\n React.useEffect(() => {\n if (!topic) return;\n fetchAllPages(cursor => getGroupMembers(topic, {cursor})).then(items => {\n writeCachedData('group-members:' + topic, items);\n setMembers(items);\n }).catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n const visible = (members || []).filter(m => (m.group_nickname || m.display_name || '').includes(query));\n const groups = groupBy(visible, m => alphaInitial(m.group_nickname || m.display_name));\n const roleLabel = role => role === 'owner' ? '群主' : role === 'admin' ? '管理员' : '';\n return \n
\n
\n
\n {members === null ? {loadError ? '成员列表加载失败' : '加载中…'}
: groups.map(([letter, list]) => \n {letter}
\n {list.map(item => navigateToProfile(topic, item.user_id, item)}>\n {item.group_nickname || item.display_name} {roleLabel(item.role) ? {roleLabel(item.role)} : null} \n )}\n )}\n \n
;\n}\n\n// Shared alphabetically-grouped multi-select picker for admin-add / mute-add (same visual component,\n// three purposes, per docs/images/添加管理员.png vs .../添加管理员-设置成功(1).png which turned out to\n// actually be the mute-add variant of the identical layout).\nfunction MemberPicker({type, topic, onToast}) {\n const mute = type === 'mute-add';\n const back = mute ? 'group-muted' : 'group-admins';\n const [members, setMembers] = React.useState(null);\n const [selected, setSelected] = React.useState([]);\n const [query, setQuery] = React.useState('');\n const [toast, setToast] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n const [loadError, setLoadError] = React.useState(false);\n React.useEffect(() => {\n if (!topic) return;\n fetchAllPages(cursor => getGroupMembers(topic, {cursor, ...(mute ? {muteEligible: true} : {eligibleRole: 'admin'})}))\n .then(items => setMembers(items.filter(m => m.eligible !== false)))\n .catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic, mute]);\n const visible = (members || []).filter(m => (m.group_nickname || m.display_name || '').includes(query));\n const groups = groupBy(visible, m => alphaInitial(m.group_nickname || m.display_name));\n const toggle = id => setSelected(v => v.includes(id) ? v.filter(x => x != id) : v.concat(id));\n const done = () => {\n if (!selected.length || busy) return;\n setBusy(true);\n const call = mute ? muteGroupMembers(topic, selected.map(user_id => ({user_id}))) : addGroupAdmins(topic, selected);\n call.then(result => {\n // 两个批量接口的响应结构不一样,不能用同一套判定:\n // - 添加管理员 POST .../admins/batch 返回 succeeded[],每项带 ok/reason(im_http.go:5377-5392)\n // - 添加禁言 POST .../mutes 返回 {topic, items},只有成功的才进 items,\n // 非法 uid 会被静默 continue(im_http.go:5486-5488),根本没有 succeeded 字段\n // 原来两条路都读 succeeded,禁言那条恒为 undefined → failed 恒为空 → 不管实际成没成都弹\"设置成功\"。\n let failedCount;\n if (mute) {\n const done = (result && Array.isArray(result.items)) ? result.items.length : selected.length;\n failedCount = Math.max(selected.length - done, 0);\n } else {\n failedCount = (result && Array.isArray(result.succeeded)) ? result.succeeded.filter(s => !s.ok).length : 0;\n }\n setToast(failedCount ? `成功设置 ${selected.length - failedCount} 人,${failedCount} 人设置失败` : '设置成功');\n // 导航会让整棵子树重挂载、把 toast 一起销毁。原来 900ms 就跳走,而 CenterToast 的生命\n // 周期是 1400ms —— 参考图里那个「设置成功」实际上只闪一下就被截断,而且从不在目标列表页出现。\n window.setTimeout(() => navigate(back, topic), 1500);\n }).catch(err => onToast(err.message || '设置失败')).finally(() => setBusy(false));\n };\n return \n
\n
\n
\n {members === null ? {loadError ? '成员列表加载失败' : '加载中…'}
: groups.map(([letter, list]) => \n {letter}
\n {list.map(item => toggle(item.user_id)}>\n {item.group_nickname || item.display_name} \n \n {selected.includes(item.user_id) ? check : null}\n \n )}\n )}\n \n
setToast('')} />\n ;\n}\n\nfunction Muted({topic, onToast}) {\n const [items, setItems] = React.useState(() => (topic && readCachedData('group-muted:' + topic)) || null);\n // groupGovernancePayload's mute list only ever returns a flat user_id (no display_name field --\n // confirmed against the real backend struct), so without this it rendered raw ids like \"usr8x2kf9\"\n // instead of names. The full member roster already carries group_nickname/display_name for\n // everyone still in the group, and fetching it here is one extra request for the whole list\n // (not per-row), unlike JoinRequests' per-item getUserProfile lookup.\n const [names, setNames] = React.useState({});\n const [avatars, setAvatars] = React.useState({});\n const [loadError, setLoadError] = React.useState(false);\n const load = React.useCallback(() => {\n if (!topic) return;\n fetchAllPages(cursor => getGroupMutes(topic, cursor)).then(list => {\n writeCachedData('group-muted:' + topic, list);\n setItems(list);\n }).catch(() => { onToast('加载失败'); setLoadError(true); });\n fetchAllPages(cursor => getGroupMembers(topic, {cursor})).then(items => {\n const map = {};\n const avatarMap = {};\n items.forEach(m => {\n map[m.user_id] = m.group_nickname || m.display_name || m.user_id;\n if (m.avatar_file_id) avatarMap[m.user_id] = {avatar_file_id: m.avatar_file_id};\n });\n setNames(map);\n setAvatars(avatarMap);\n }).catch(() => {});\n }, [topic]);\n React.useEffect(() => { setItems((topic && readCachedData('group-muted:' + topic)) || null); load(); }, [topic, load]);\n const unmute = userId => {\n unmuteGroupMember(topic, userId).then(() => { onToast('已解除禁言'); load(); })\n .catch(err => onToast(err.message || '操作失败'));\n };\n return ;\n}\n\nfunction OwnerSelect({topic, onToast}) {\n const [members, setMembers] = React.useState(null);\n const [query, setQuery] = React.useState('');\n const [target, setTarget] = React.useState(null);\n // 后端 serveIMGroupOwnerTransfer 只认 {target_user_id, version},没有任何二次验证/action_token\n // 机制(跟青少年模式关闭那种真的会被服务端拒绝的场景不一样)。群主转让同样不可逆、后果同样\n // 重大,照抄本项目已有的处理这类\"后端没有二次验证但操作本身很危险\"场景的方式——见\n // personal-settings-view.jsx 的 DeleteAccountConfirm:加一步前端自己的密码输入门槛,不追加到\n // 请求体、不指望服务端校验它,只是让\"手滑点确定\"变成需要多一步真实操作才会发生的事。\n const [passwordStep, setPasswordStep] = React.useState(false);\n const [password, setPassword] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n const [loadError, setLoadError] = React.useState(false);\n React.useEffect(() => {\n if (!topic) return;\n fetchAllPages(cursor => getGroupMembers(topic, {cursor, eligibleRole: 'owner'}))\n .then(items => setMembers(items.filter(m => m.eligible !== false)))\n .catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n const visible = (members || []).filter(m => (m.group_nickname || m.display_name || '').includes(query));\n const admins = visible.filter(m => m.role === 'admin');\n const others = visible.filter(m => m.role !== 'admin');\n const reset = () => { setTarget(null); setPasswordStep(false); setPassword(''); };\n const confirm = () => {\n if (!password) { onToast('请输入密码以确认'); return; }\n if (busy || !target) return;\n setBusy(true);\n // transferGroupOwner's `version` param was never supplied here, so the optimistic-lock WHERE\n // clause on the backend's UPDATE was silently skipped (version<=0) -- this is the single most\n // consequential owner-transfer call in the app having zero protection against a concurrent\n // transfer. Fetch the live group version right before the irreversible call rather than trusting\n // any value this page might have cached earlier in its lifetime.\n getGroup(topic).then(group => transferGroupOwner(topic, target.user_id, group.version))\n .then(() => { onToast('群主已转让'); navigate('group-governance', topic); })\n .catch(err => onToast(err.message || '转让失败')).finally(() => setBusy(false));\n };\n const row = item => setTarget(item)}>\n {item.group_nickname || item.display_name} \n ;\n return \n
\n
\n
\n {members === null ? {loadError ? '成员列表加载失败' : '加载中…'}
: <>\n {admins.length ? <>管理员
{admins.map(row)}> : null}\n {others.length ? <>群成员
{others.map(row)}> : null}\n >}\n \n {target && !passwordStep ?
\n 选择新群主 \n {target.group_nickname || target.display_name}成为新群主,确定后你将立即失去群主身份
\n setPasswordStep(true)}>确定 \n 取消 \n : null}\n {target && passwordStep ?
: null}\n
;\n}\n\nconst FILE_TYPE_META = {\n image: ['image', '#3ba55c'], video: ['videocam', '#3b82c4'], audio: ['audiotrack', '#8b5cf6'],\n document: ['description', '#e05d44'], file: ['insert_drive_file', '#8a8f98']\n};\n\nfunction GroupFiles({topic, tinode, onToast}) {\n const [queryInput, setQueryInput] = React.useState('');\n const query = useDebouncedValue(queryInput, 300);\n const [files, setFiles] = React.useState(() => (topic && readCachedData('group-files:' + topic)) || null);\n const [menuOpen, setMenuOpen] = React.useState(false);\n const [uploading, setUploading] = React.useState(null);\n const [loadError, setLoadError] = React.useState(false);\n // groupFilePayload 只给 uploader_id、不给昵称(im_http.go:6532-6559),原来直接把裸 user_id\n // 显示在\"来自\"位置。跟 Muted 页一样,拉一次成员表交叉引用出可读的名字。\n const [uploaderNames, setUploaderNames] = React.useState({});\n const inputRefs = {file: React.useRef(null), image: React.useRef(null), video: React.useRef(null)};\n // 搜索框文案承诺\"搜索文件名或者上传者\",但服务端 ListFiles 的 `q` 只匹配文件名(上传者昵称\n // 这类展示用的名字根本不在服务端索引里,是前端自己拿 getGroupMembers 交叉查出来的)——如果把\n // query 传给服务端,按上传者名字搜索永远是静默的空结果。改成服务端只拿全量列表(本来文件数量\n // 就不大,也没有任何\"加载更多\"分页UI),文件名/上传者两个维度都在本地用已有的 uploaderNames\n // 表一起过滤,让搜索框真正兑现自己的文案。\n const load = React.useCallback(() => {\n if (!topic) return;\n getGroupFiles(topic, {}).then(data => {\n const items = data.items || [];\n writeCachedData('group-files:' + topic, items);\n setFiles(items);\n }).catch(() => { onToast('加载失败'); setLoadError(true); });\n }, [topic]);\n React.useEffect(() => { load(); }, [load]);\n React.useEffect(() => {\n if (!topic) return;\n getGroupMembers(topic).then(data => {\n const map = {};\n (data.items || []).forEach(m => { map[m.user_id] = m.group_nickname || m.display_name || m.user_id; });\n setUploaderNames(map);\n }).catch(() => {});\n }, [topic]);\n const visibleFiles = React.useMemo(() => {\n const all = files || [];\n const q = query.trim().toLowerCase();\n if (!q) return all;\n return all.filter(f => (f.file_name || '').toLowerCase().includes(q) ||\n (uploaderNames[f.uploader_id] || '').toLowerCase().includes(q));\n }, [files, query, uploaderNames]);\n const usedBytes = (files || []).reduce((sum, f) => sum + (f.file_size || 0), 0);\n const pick = kind => { setMenuOpen(false); inputRefs[kind].current && inputRefs[kind].current.click(); };\n const onFile = e => {\n const file = e.target.files && e.target.files[0];\n e.target.value = '';\n if (!file || !tinode) return;\n setUploading({name: file.name, progress: 0});\n uploadLargeFile(tinode, file, frac => setUploading(u => u ? {...u, progress: Math.round(frac * 100)} : u))\n .then(({fileId}) => addGroupFile(topic, {fileId, fileName: file.name, mimeType: file.type, fileSize: file.size}))\n .then(() => { setUploading(null); load(); })\n .catch(err => { setUploading(null); onToast(err.message || '上传失败'); });\n };\n const remove = fileId => {\n deleteGroupFile(topic, fileId).then(() => load()).catch(err => onToast(err.message || '删除失败'));\n };\n const gb = n => (n / (1024 ** 3)).toFixed(2);\n return ;\n}\n\n// 名字叫 bytesToGB 却只输出到 MB —— 1.4GB 的文件会显示成 \"1433.6 MB\"。补上 GB 档。\nfunction bytesToGB(bytes) {\n if (!bytes) return '0 KB';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n if (bytes < 1024 * 1024 * 1024) return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n return (bytes / (1024 * 1024 * 1024)).toFixed(2) + ' GB';\n}\n\n// 标题\"群昵称\"是参考图 设置昵称(1).png 本身的用词(不是笔误)——虽然编辑的其实是 group.name\n// 这个所有人都看得到的真实群名,跟 MyNicknameEditor(\"我在本群的昵称\",个人在群内的显示名,\n// 完全不同的字段)概念上容易混,但这是设计稿明确画出来的文案,不是代码猜的,不要改。\nfunction GroupNameEditor({topic, onToast}) {\n const [group, setGroup] = React.useState(null);\n const [value, setValue] = React.useState('');\n React.useEffect(() => { if (topic) getGroup(topic).then(g => { setGroup(g); setValue(g.name); }).catch(() => onToast('加载失败')); }, [topic]);\n const save = () => {\n if (!value.trim()) return;\n updateGroup(topic, {name: value.trim(), version: group ? group.version : 0}).then(() => {\n onToast('保存成功'); window.setTimeout(() => navigate('group-profile', topic), 600);\n }).catch(err => onToast(err.message || '保存失败'));\n };\n return \n \n setValue(e.target.value)} />{value.length}/11 \n
;\n}\n\nfunction GroupDescriptionEditor({topic, onToast}) {\n const [group, setGroup] = React.useState(null);\n const [value, setValue] = React.useState('');\n React.useEffect(() => { if (topic) getGroup(topic).then(g => { setGroup(g); setValue(g.description || ''); }).catch(() => onToast('加载失败')); }, [topic]);\n const publish = () => {\n updateGroup(topic, {description: value.trim(), version: group ? group.version : 0}).then(() => {\n onToast('保存成功'); window.setTimeout(() => navigate('group-profile', topic), 600);\n }).catch(err => onToast(err.message || '保存失败'));\n };\n return \n \n \n {/* 上限跟后端硬限对齐(im_http.go:4667 超过 200 rune 直接 400 field=description)。\n 参考图标的是 0/225,但那个数字后端不接受——按 225 放行会让用户写满再被服务端打回。 */}\n setValue(e.target.value)} />\n {value.length}/200 \n \n
;\n}\n\n// \"我在本群的昵称\" has no dedicated reference screenshot (see plan notes) -- placed in GroupSettings,\n// governed by the real member_invite... no, by the group_nickname field on groupMemberPayload, gated by\n// the \"群成员修改昵称\" concept the images described (server-side enforcement, not re-checked client-side).\nfunction MyNicknameEditor({topic, onToast}) {\n const [value, setValue] = React.useState('');\n // getGroupMembers' list items never include group_nickname (confirmed live) -- only\n // GET .../members/me/profile actually returns it, same fix as GroupProfile's preview row above.\n React.useEffect(() => {\n if (!topic) return;\n getMyGroupProfile(topic).then(data => setValue(data.nickname || '')).catch(() => {});\n }, [topic]);\n const save = () => {\n updateMyGroupProfile(topic, value.trim(), 0).then(() => {\n onToast('保存成功'); window.setTimeout(() => navigate('group-settings', topic), 600);\n }).catch(err => onToast(err.message || '保存失败'));\n };\n return \n \n setValue(e.target.value)} />群昵称仅在当前群内显示。 \n
;\n}\n\nexport default function GroupManagementView({view, hashParams, myUserId, tinode, onTopicSelected}) {\n const [toast, setToast] = React.useState('');\n const topic = hashParams && hashParams.topic;\n // This container remounts on every navigation step inside the feature (see `key={view}` in\n // sidepanel-view.jsx), and Announcement's edit/publish UI is gated on this role -- uncached, that\n // gate visibly flickers off and back on every time the announcement page (or any sibling page) is\n // opened. Also warms the same shared 'group-members:'+topic entry GroupSettings/AdminList use.\n const roleCacheKey = topic && myUserId ? `group-my-role:${topic}:${myUserId}` : null;\n const [myRole, setMyRole] = React.useState(() => (roleCacheKey && readCachedData(roleCacheKey)) || null);\n React.useEffect(() => {\n if (!topic || !myUserId) { setMyRole(null); return; }\n const key = `group-my-role:${topic}:${myUserId}`;\n setMyRole(readCachedData(key) || null);\n // Used to look this up by paginating the full member list and finding myUserId in it (30/page\n // against a 128-member cap) -- a real owner/admin sitting past page 1 read back as `null`,\n // silently hiding every governance affordance gated on this value. getGroup's own `my_role`\n // (already relied on elsewhere, e.g. the disband-group guard above) isn't paginated at all --\n // it's always exactly \"me\", so this no longer needs the member list at all.\n getGroup(topic).then(group => {\n const role = group ? group.my_role : null;\n writeCachedData(key, role);\n setMyRole(role);\n }).catch(() => {});\n }, [topic, myUserId]);\n let content;\n if (view === 'group-list' || view === 'group-empty') content = ;\n else if (['group-invite', 'group-events', 'group-new-request', 'group-announcement', 'group-summary', 'group-role-message'].includes(view)) content = ;\n else if (view === 'group-join-requests') content = ;\n else if (view === 'group-announcement-detail') content = ;\n else if (view === 'group-settings') content = ;\n else if (view === 'group-profile') content = ;\n else if (view === 'group-avatar') content = ;\n else if (view === 'group-nickname') content = ;\n else if (view === 'group-description') content = ;\n else if (view === 'group-my-nickname') content = ;\n else if (view === 'group-members') content = ;\n else if (view === 'group-qr') content = ;\n else if (view === 'group-governance') content = ;\n else if (['group-admins', 'group-admin-success', 'group-admin-partial', 'group-admin-removed'].includes(view)) content = ;\n else if (view === 'group-admin-add') content = ;\n else if (view === 'group-mute-add') content = ;\n else if (view === 'group-muted') content = ;\n else if (['group-owner-select', 'group-owner-confirm'].includes(view)) content = ;\n else content = ;\n return <>{content} setToast('')} />>;\n}\n","// Login form.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\nimport VisiblePassword from '../widgets/visible-password.jsx';\n\nexport default class LoginView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n login: props.login,\n password: '',\n hostName: props.serverAddress,\n saveToken: props.persist\n };\n this.handleLoginChange = this.handleLoginChange.bind(this);\n this.handlePasswordChange = this.handlePasswordChange.bind(this);\n this.handleToggleSaveToken = this.handleToggleSaveToken.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n handleLoginChange(e) {\n this.setState({login: e.target.value});\n }\n\n handlePasswordChange(e) {\n this.setState({password: e.target.value});\n }\n\n handleToggleSaveToken() {\n this.props.onPersistenceChange(!this.state.saveToken);\n this.setState({saveToken: !this.state.saveToken});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onLogin(this.state.login.trim(), this.state.password.trim());\n }\n\n render() {\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n\n return (\n \n \n {\n (login_prompt) => \n }\n \n \n {\n (password_prompt) => \n }\n \n \n \n \n \n \n
\n \n );\n }\n};\n","import React from 'react';\nimport { Tinode } from 'tinode-sdk';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { getBootstrap, getRealnameStatus, getSystemNotifications, markSystemNotificationRead } from '../lib/im-api.js';\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { useCachedData } from '../lib/use-cached-data.js';\nimport { topicDisplayName } from '../lib/utils.js';\n\n// Must go through setUrlSidePanel (not a bare navigateTo(view), which replaces the whole hash) so\n// switching panels from \"messages-home\" doesn't silently drop path[1] -- the currently open\n// conversation topic, which coexists with this panel in the split view once a chat is selected.\n// `topic` 可选:系统消息里的群事件通知需要带着群 topic 跳进对应群聊设置页,写法与\n// group-management-view.jsx 的同名辅助函数保持一致(不带 topic 时显式清掉,避免把上一个页面\n// 残留的 topic 参数带进不相关的页面)。\nconst navigate = (view, topic) => {\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, view);\n hash = topic ? HashNavigation.addUrlParam(hash, 'topic', topic) : HashNavigation.removeUrlParam(hash, 'topic');\n HashNavigation.navigateTo(hash);\n};\n\n// Was a hardcoded FREQUENT_CONTACTS mock (5 fake names, always clicking through to the same\n// direct-message-view.jsx demo regardless of which avatar was tapped -- confirmed independently by\n// a user screenshot showing every contact opening the identical \"接语彤\" script). Real \"frequently\n// contacted\" data doesn't exist as its own bootstrap field, so this derives it from the same\n// `chatList` the conversation list below already uses: P2P topics only (a \"people you talk to\" rail\n// isn't the place for groups), most-recently-touched first.\nfunction frequentContacts(chatList) {\n if (!chatList || chatList.length === 0) return [];\n return chatList\n .filter(item => item.topic && Tinode.isP2PTopicName(item.topic))\n .slice()\n .sort((a, b) => new Date(b.touched || 0).getTime() - new Date(a.touched || 0).getTime())\n .slice(0, 8)\n .map(item => ({\n id: item.topic,\n name: (item.public && item.public.fn) || '未命名',\n avatar: makeImageUrl(item.public && item.public.photo),\n online: !!item.online\n }));\n}\n\n// Matches docs/images/消息页面—长按弹出.png exactly (9 items, in this order -- no \"编辑\" despite\n// bootstrap.message_policy.supported_actions listing it; the mock predates that field and the\n// prototype just doesn't surface an edit action here). 'recall' is gated against supported_actions\n// (server/im_http.go serveIMBootstrap); favorite/forward/translate/select are pure client affordances.\nconst MESSAGE_ACTIONS = [\n {id: 'quote', icon: 'format_quote', label: '引用'},\n {id: 'copy', icon: 'content_copy', label: '复制'},\n {id: 'favorite', icon: 'inventory_2', label: '收藏'},\n {id: 'translate', icon: 'translate', label: '翻译'},\n {id: 'forward', icon: 'reply', label: '转发'},\n {id: 'recall', icon: 'undo', label: '撤回', gated: true},\n {id: 'delete', icon: 'delete_outline', label: '删除', gated: true},\n {id: 'select', icon: 'select_all', label: '多选'},\n // Not in bootstrap.message_policy.supported_actions at all (that list only covers 'recall' for the\n // sender's own message) -- left ungated like the other pure client affordances above.\n {id: 'group_recall', icon: 'restart_alt', label: '群撤回'}\n];\n\nfunction Icon({children}) {\n return {children} ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2200);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\nfunction Avatar({item, small = false}) {\n // The tone modifier is namespaced ('tone-orange', not 'orange') because base.css's original\n // Tinode styles already define bare `.orange`/`.green`/`.blue` as generic `color: ... !important`\n // text-color utility classes -- an unprefixed tone class collides with those and, since\n // `!important` beats any selector this component could use to fight back, silently overrides the\n // intended white icon-on-tint background to whatever that generic utility's text color is (this is\n // exactly why the default/no-tone case rendered an invisible blue-on-blue icon: 'blue' is one of\n // the collision names).\n const className = 'messages-avatar ' + (small ? 'small ' : '') + 'tone-' + (item.tone || 'blue');\n return \n {item.avatar ?
:
{item.icon || 'person'} }\n {item.online !== undefined ?
: null}\n
;\n}\n\n// A chat list row needs a one-line summary even when the latest message isn't plain text. This is a\n// plain-Chinese equivalent of lib/formatters.js's previewFormatter (which needs react-intl wired in,\n// inconsistent with this file's all-hardcoded-Chinese mock strings) -- just enough to label the\n// message by Drafty entity type for a conversation list preview.\nfunction draftyPreview(content) {\n if (typeof content === 'string' || content == null) return content || '';\n if (Array.isArray(content.ent) && content.ent.length) {\n const label = {IM: '[图片]', VD: '[视频]', AU: '[语音]', EX: '[文件]', TC: '[名片]', VC: '[通话]'}[content.ent[0].tp];\n if (label) return label;\n }\n return content.txt || '[消息]';\n}\n\nfunction formatConversationTime(ts) {\n if (!ts) return '';\n const date = new Date(ts);\n const now = new Date();\n const startOfDay = d => new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n const days = Math.round((startOfDay(now) - startOfDay(date)) / 86400000);\n const hhmm = () => date.toLocaleTimeString('zh-CN', {hour: '2-digit', minute: '2-digit'});\n if (days === 0) return hhmm();\n // 参考图 docs/images/消息.png 里昨天的会话显示的是\"昨天21:03\",带具体时间,不是只有\"昨天\"\n if (days === 1) return '昨天' + hhmm();\n if (days < 7) return ['周日', '周一', '周二', '周三', '周四', '周五', '周六'][date.getDay()];\n return date.toLocaleDateString('zh-CN', {month: 'numeric', day: 'numeric'});\n}\n\n// 参考图 系统消息.png 的时间格式是\"6月28日 10:04\"——不带年份、中文月日、不带秒。原来直接用\n// toLocaleString('zh-CN') 默认格式,会输出\"2026/8/20 18:04:00\"(带年份、斜杠、秒),跟设计不符。\nfunction formatNotificationTime(ts) {\n const d = new Date(ts);\n const hh = String(d.getHours()).padStart(2, '0');\n const mm = String(d.getMinutes()).padStart(2, '0');\n return `${d.getMonth() + 1}月${d.getDate()}日 ${hh}:${mm}`;\n}\n\n// Entries (system messages / file assistant) come from bootstrap.entries and are always shown --\n// unlike the old mock, they don't disappear once the user has real conversations (that was a bug).\nfunction entryConversations(bootstrap) {\n if (!bootstrap || !bootstrap.entries) return [];\n const list = [];\n const sys = bootstrap.entries.system_messages;\n if (sys && sys.enabled) {\n // Matches docs/images/消息.png (\"最新公告\"). bootstrap doesn't carry a preview of the latest\n // notification, so this is a static label like the rest of that screenshot's demo content.\n list.push({id: 'system', title: '系统消息', summary: '最新公告', icon: 'notifications', tone: 'orange',\n system: true, unread: sys.unread_count || 0});\n }\n const files = bootstrap.entries.file_assistant;\n if (files && files.enabled) {\n list.push({id: 'files', title: '文件助手', summary: '你上传1份文件', icon: 'folder', tone: 'green',\n fileAssistant: true, topic: files.topic, unread: files.unread_count || 0});\n }\n return list;\n}\n\nfunction normalizeConversations(chatList, myUserId) {\n if (!chatList || chatList.length === 0) return [];\n return chatList.map((item, index) => {\n const latest = typeof item.latestMessage === 'function' ? item.latestMessage() : null;\n let summary = item.private && item.private.comment ? item.private.comment : '暂无消息';\n if (latest) summary = draftyPreview(latest.content);\n if (latest && latest.from === myUserId) summary = '我:' + summary;\n const isGroup = typeof item.topic === 'string' && item.topic.startsWith('grp');\n return {\n id: item.topic || item.user || String(index),\n title: topicDisplayName(item.topic, item.public, '未命名会话'),\n summary,\n time: formatConversationTime(item.touched),\n unread: Math.max(Number(item.unread) || 0, 0),\n // 真实头像:跟同文件 frequentContacts() 一样从 public.photo 取,原来漏了这一项,\n // 导致会话列表每一行都只能落到下面的兜底图标,永远显示不出头像。\n avatar: makeImageUrl(item.public && item.public.photo),\n // 没有真实头像时的兜底图标要区分群聊和单聊,否则群聊也画成单人像,列表里分不出哪条是群\n icon: isGroup ? 'group' : 'person',\n // 在线状态只对单聊有意义:群不存在\"在线\",传 undefined 让 Avatar 不渲染那个状态点\n online: isGroup ? undefined : !!item.online,\n muted: !!(item.acs && item.acs.isMuted && item.acs.isMuted()),\n // 原来读的是 item.pinned——这个键在原生订阅对象上根本不存在,永远 undefined,置顶开关点了\n // 会话列表从来没有过任何视觉变化。真实存放位置是 subscription 原生 private.pinned 字段,\n // 但只对**群聊**成立:group-management-view.jsx 的置顶走 updateGroupMemberSettings ->\n // serveIMGroupMemberSettings,服务端确实写的是 Subs.Private,随原生 {meta} 同步下来(真实\n // 验证:开关点亮后要等下一次重连/刷新才会在这里体现——同一会话内没有实时 {pres} 通知去让\n // 已连接的这份 subscription 缓存失效,这是已知的、这次没有顺手解决的次要延迟,不是没生效)。\n // contact-management-view.jsx 的单聊置顶走的是完全不同的 updateConversationSettings ->\n // serveIMConversationSettings,服务端存进独立的 im_conversation_settings 表,从不写入原生\n // Subs.Private——单聊置顶因此不管等多久重连都不会在这里出现,这是真实的后端架构缺口(没有\n // 批量查询会话设置的接口,前端也不可能为渲染一屏会话列表挨个按 topic 发请求),已记录到\n // 后端问题清单,不是这一行能修的。\n pinned: !!(item.private && item.private.pinned)\n };\n });\n}\n\nfunction BottomNavigation() {\n return \n navigate('workbench')}>dashboard 工作台 \n person 消息 \n ;\n}\n\nfunction QuickMenu({onClose, onAction, permissions}) {\n const actions = [\n {id: 'friends', icon: 'group', label: '朋友'},\n {id: 'profile', icon: 'person_outline', label: '我的'},\n {id: 'create-group', icon: 'add_comment', label: '创建群组', permission: 'create_group'},\n {id: 'add-friend', icon: 'person_add_alt', label: '添加好友', permission: 'user_search'},\n {id: 'scan', icon: 'qr_code_scanner', label: '扫一扫', permission: 'scan_qr'}\n ].filter(item => !item.permission || !permissions || permissions[item.permission] !== false);\n return \n
e.stopPropagation()} role=\"menu\">\n {actions.map(item => onAction(item)}>\n {item.icon} {item.label} \n )}\n
\n
;\n}\n\n// 1.10 实名认证提醒:docs/images/实名认证(安卓).png 显示的是不可跳过的强制态(单按钮\"去实名\n// 认证\",没有关闭/稍后处理)——但那张图对应的是 bootstrap.security.realname.required===true 这个\n// 分支,这个环境(以及目前后端唯一会返回的默认配置)实际是 required:false / allow_skip:true。\n// 照抄参考图做成完全关不掉的弹层,等于把\"实名认证目前是可选的\"这个真实配置,实现成挡住所有人的\n// 强制墙——所以按这两个字段分叉:允许跳过时加一个参考图没画但后端明确允许的关闭按钮;且遵守\n// remind_after,跳过后在这个时长内不重复弹(不是每次进消息首页都弹一次)。\nfunction parseRemindAfter(text) {\n const m = /^(\\d+)\\s*([hdm])$/i.exec(String(text || '').trim());\n if (!m) return 24 * 60 * 60 * 1000;\n const n = Number(m[1]);\n return m[2].toLowerCase() === 'd' ? n * 86400000 : m[2].toLowerCase() === 'h' ? n * 3600000 : n * 60000;\n}\n\nfunction RealnameReminderModal({allowSkip, onDismiss}) {\n return \n
e.stopPropagation()}>\n {allowSkip ?
close : null}\n
实名认证提醒 \n
根据国家法律法规要求,您需先进行实名认证才能使用该项 APP
\n
navigate('realname')}>去实名认证 \n
\n
;\n}\n\nfunction MessageHome({view, connected, chatList, myUserId, onTopicSelected, onOpenScanner}) {\n const [query, setQuery] = React.useState('');\n const [menuOpen, setMenuOpen] = React.useState(view === 'messages-menu');\n const [toast, setToast] = React.useState('');\n // Was `useState(null)` + its own effect -- refetched from scratch (blank entries/badges for a\n // beat) every time this component remounted, e.g. after a trip to another sidepanel and back.\n const [bootstrap] = useCachedData(myUserId ? 'bootstrap:' + myUserId : null, getBootstrap, [myUserId]);\n const offline = view === 'messages-offline' || (!!myUserId && connected === false);\n\n // \"置顶\" only ever changed a background tint (see the `pinned` comment inside\n // normalizeConversations) -- every other IM this product's users have used floats a pinned chat to\n // the top of the list and keeps it there, so a tint-only \"pin\" reads as broken even where the\n // underlying flag is genuinely correct (group chats). Array.prototype.sort is stable (guaranteed\n // since ES2019), so this only reorders pinned-vs-not and otherwise preserves chatList's own\n // ordering. Applied after normalizing, not to the concatenated list, so the two fixed system\n // entries (system_messages/file_assistant) -- which have no `pinned` concept at all -- stay\n // pinned to the very top the way they always have, ahead of even a pinned real conversation.\n const realConversations = normalizeConversations(chatList, myUserId)\n .sort((a, b) => (b.pinned ? 1 : 0) - (a.pinned ? 1 : 0));\n const conversations = entryConversations(bootstrap).concat(realConversations);\n const filtered = conversations.filter(item => `${item.title}${item.summary}`.toLowerCase().includes(query.trim().toLowerCase()));\n const frequent = frequentContacts(chatList);\n\n // bootstrap.security.realname carries required/allow_skip/remind_after, but -- confirmed live --\n // its handler (serveIMBootstrap) builds that block from a 4-field literal that never includes\n // submission_id, unlike the dedicated GET /security/realname endpoint (realNamePayload). The\n // dismissKey fix below depends on submission_id to tell two separate rejections apart; sourcing\n // `status` from bootstrap alone made that fix a no-op in practice (it always fell back to `status`,\n // reproducing the exact bug it was meant to fix). Fetching this separately, the same\n // useCachedData-with-retry way bootstrap itself is fetched, gets the real submission_id.\n const realnameMeta = bootstrap && bootstrap.security && bootstrap.security.realname;\n const [realnameStatus] = useCachedData(myUserId ? 'realname-status:' + myUserId : null, getRealnameStatus, [myUserId]);\n const [reminderDismissed, setReminderDismissed] = React.useState(false);\n // Keyed by submission_id (a new one is minted per resubmission, server/im_http.go's\n // realNamePayload/serveIMRealNameSubmissions), not just status -- two separate rejections both\n // report status:\"rejected\", and without something that actually changes between them, dismissing\n // the first would keep suppressing the reminder for a brand new rejection submitted and rejected\n // again within the same snooze window. Falls back to status for the states that never had a\n // submission (e.g. never-submitted \"unverified\", where there's only ever one such state anyway).\n const dismissKey = (myUserId && realnameStatus) ?\n `realname-reminder-dismissed:${myUserId}:${realnameStatus.submission_id || realnameStatus.status}` : null;\n let lastDismissedAt = 0;\n try { lastDismissedAt = dismissKey ? Number(localStorage.getItem(dismissKey) || 0) : 0; } catch (_) { /* ignore */ }\n const withinSnooze = lastDismissedAt > 0 && (Date.now() - lastDismissedAt) < parseRemindAfter(realnameMeta && realnameMeta.remind_after);\n const showRealnameReminder = !!realnameStatus && !reminderDismissed && !withinSnooze &&\n (realnameStatus.status === 'unverified' || realnameStatus.status === 'rejected');\n const dismissRealnameReminder = () => {\n if (dismissKey) { try { localStorage.setItem(dismissKey, String(Date.now())); } catch (_) { /* ignore */ } }\n setReminderDismissed(true);\n };\n\n const selectConversation = item => {\n if (item.system) {\n navigate('system-messages');\n } else if (item.fileAssistant && item.topic && onTopicSelected) {\n onTopicSelected(item.topic);\n } else if (chatList && chatList.length && onTopicSelected) {\n onTopicSelected(item.id);\n } else {\n navigate('chat-standard');\n }\n };\n\n const runQuickAction = item => {\n setMenuOpen(false);\n if (item.id === 'friends') return navigate('address-book');\n if (item.id === 'profile') return navigate('personal-center');\n if (item.id === 'create-group') return navigate('group-list');\n if (item.id === 'add-friend') return navigate('add-friend');\n if (item.id === 'scan' && onOpenScanner) return onOpenScanner();\n setToast(item.id === 'scan' ? '扫码功能暂不可用' : `${item.label}页面将在对应章节中提供`);\n };\n\n return \n
\n {offline ? 加载中
: 消息 }\n setMenuOpen(true)} aria-label=\"更多功能\">menu \n \n
\n search setQuery(e.target.value)} placeholder=\"搜索\" /> \n {frequent.length > 0 ? \n 常联系的人 \n \n {frequent.map(item =>
onTopicSelected && onTopicSelected(item.id)}>\n {item.name} \n )}\n
\n : null}\n \n {filtered.map(item => selectConversation(item)}>\n \n {item.title} {item.summary} \n {item.time} \n {item.unread ? {item.unread > 99 ? '99+' : item.unread} : item.muted ? notifications_off : null}\n \n )}\n {filtered.length === 0 ? : null}\n \n \n
\n {menuOpen ?
setMenuOpen(false)} onAction={runQuickAction} permissions={bootstrap && bootstrap.permissions} /> : null}\n setToast('')} />\n {showRealnameReminder ? : null}\n ;\n}\n\nfunction MessageActions() {\n const [visible, setVisible] = React.useState(true);\n const [toast, setToast] = React.useState('');\n const [selected, setSelected] = React.useState('');\n const [supportedActions, setSupportedActions] = React.useState(null);\n\n React.useEffect(() => {\n getBootstrap().then(data => setSupportedActions(data.message_policy && data.message_policy.supported_actions)).catch(() => {});\n }, []);\n\n // This screen is a static illustration of the long-press menu (not attached to a real message), so\n // there's no real (topic, seq) to act on -- the real wiring belongs in messages-view.jsx (chapter 4)\n // where an actual message exists. Here we only let the server's declared capabilities decide which\n // gated actions (recall/edit/delete) are worth showing at all.\n const actions = MESSAGE_ACTIONS.filter(item => !item.gated || !supportedActions || supportedActions.includes(item.id));\n\n const runAction = item => {\n setSelected(item.id);\n if (item.id === 'copy' && navigator.clipboard) {\n navigator.clipboard.writeText('明天上午十点开项目会,请准时参加。').catch(() => {});\n }\n setToast(`${item.label}操作已选择`);\n setVisible(false);\n };\n\n return \n
navigate('messages-home')} aria-label=\"返回\">arrow_back_ios_new 项目协作群 \n
\n 今天 10:24
\n {e.preventDefault(); setVisible(true);}}>明天上午十点开项目会,请准时参加。 \n {e.preventDefault(); setVisible(true);}}>收到,我会提前准备材料。 \n {selected ? 已选择:{MESSAGE_ACTIONS.find(item => item.id === selected).label}
: null}\n \n
mic_none 输入消息 sentiment_satisfied_alt add_circle_outline \n {visible ?
setVisible(false)}>\n
e.stopPropagation()} role=\"menu\">\n {actions.map(item => runAction(item)}>\n {item.label} {item.icon} \n )}\n
\n
: null}\n
setToast('')} />\n ;\n}\n\n// 系统通知的 summary 在多处后端代码里被直接填成机器码而不是人话:群事件统一写\n// summary=event.EventType(server/im_group_events.go:42-44,所有群事件共用 title=\"群聊动态\"),\n// 好友申请处理结果写 summary=status(server/im_http.go:5956 与 db/mysql/tenant_adapter.go:8643,8700,\n// 值就是 \"accepted\"/\"rejected\")。已记入后端问题清单,在后端给出可读文案之前前端按已知码兜底翻译。\nconst NOTIFICATION_TEXT = {\n 'group.member.joined': '有成员加入了群聊',\n 'group.member.left': '有成员退出了群聊',\n 'group.member.updated': '群成员资料有更新',\n 'group.mute.updated': '群禁言设置有变更',\n 'group.owner.transferred': '群主已转让',\n 'group.role.updated': '群成员角色有变更',\n 'group.settings.updated': '群设置有更新',\n accepted: '对方已通过你的好友申请',\n rejected: '对方拒绝了你的好友申请',\n // 新样本:security.risk.continue/cancel 事件的 summary 直接是 decision 字面量\n // \"continue\"/\"cancel\"(风险确认审计记录,见 im-api.js 的 confirmRiskChallenge),同样是机器码——\n // 两个 decision 枚举值只有一个\"continue\"曾被收录,\"cancel\"(第11章发消息前风险提示点\"取消发送\"\n // 产生)此前会直接把英文单词\"cancel\"展示在系统消息列表里。\n continue: '你确认继续了一次安全风险提示',\n cancel: '你取消了一次风险操作确认'\n};\n\nfunction systemNotificationText(item) {\n const summary = (item.summary || '').trim();\n // 只在查表命中时才替换。后端的 summary 有些确实是机器码(好友申请通过时是 \"accepted\"),\n // 但也有些就是真实数据——日报提醒的 summary 是纯日期字符串\n // (db/mysql/tenant_adapter.go:4917 传 date.Format(\"2006-01-02\")),会议通知的 summary 是会议标题。\n // 一旦按\"看起来像机器码就吞掉\"来判断,这些真实内容会被换成一句无意义的兜底文案。\n const mapped = NOTIFICATION_TEXT[summary] || NOTIFICATION_TEXT[item.event_type];\n if (mapped) return mapped;\n return summary || '您有一条新的系统通知。';\n}\n\nfunction SystemMessages({authenticated}) {\n const [items, setItems] = React.useState([]);\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState('');\n const [toast, setToast] = React.useState('');\n\n React.useEffect(() => {\n getSystemNotifications().then(data => setItems(data.items || []))\n .catch(err => setError(err.message || '加载失败'))\n .finally(() => setLoading(false));\n }, []);\n\n const markRead = item => {\n if (item.read_at) return;\n setItems(list => list.map(i => i.id === item.id ? {...i, read_at: new Date().toISOString()} : i));\n markSystemNotificationRead(item.id).catch(() => {\n // Roll the optimistic update back on failure -- otherwise the \"new\" badge silently vanishes\n // even though the server never actually recorded this notification as read.\n setItems(list => list.map(i => i.id === item.id ? {...i, read_at: null} : i));\n });\n };\n\n return \n
{ if (!HashNavigation.goBack()) navigate('messages-home'); }} aria-label=\"返回\">arrow_back_ios_new 系统消息 \n
\n {loading ? hourglass_empty 加载中…
: null}\n {error ? error_outline {error}
: null}\n {!loading && !error && items.length === 0 ? notifications_none 暂无系统消息
: null}\n {items.map(item => markRead(item)}>\n {formatNotificationTime(item.created_at)} \n \n
{item.title} {!item.read_at ? 新 : null}\n
{systemNotificationText(item)}
\n {item.action && item.action.device ?
设备: {item.action.device} {item.action.ip ?
IP地址: {item.action.ip} : null} : null}\n {/* 入口按通知自身的 action 决定,不再对所有通知一律显示\"前往安全设置\"。注意 action.topic\n 不能直接当成群:好友申请类通知的 action 里带的是 p2p 会话 topic\n (db/mysql/tenant_adapter.go:8643),只有 grp 前缀才是真的群。都不匹配时不显示按钮,\n 避免把人导到跟这条通知无关的页面。\n 真实好友申请通知的 action 判断改用 event_type 而不是 action.type:实测\n GET /system-notifications 拿到的 friend.request.created 通知,action 里只有\n {user_id},从来没有 type 字段(当初写 action.type==='friend_request' 是凭对接文档\n 猜的,不是照真实响应写的)——导致\"查看新朋友\"按钮对这条最常见的通知永远不出现。 */}\n {item.action && typeof item.action.topic === 'string' && item.action.topic.startsWith('grp') ?\n
{ e.stopPropagation(); navigate('group-settings', item.action.topic); }}>查看群聊 chevron_right :\n item.event_type && item.event_type.startsWith('friend.request') ?\n
{ e.stopPropagation(); navigate('friend-requests'); }}>查看新朋友 chevron_right :\n item.action && (item.action.device || item.action.ip) ?\n
{ e.stopPropagation(); navigate(authenticated ? 'security' : 'identity-check'); }}>前往安全设置 chevron_right :\n null}\n
\n
\n )}\n \n
setToast('')} />\n ;\n}\n\nexport default function MessageCenterView(props) {\n switch (props.view) {\n case 'system-messages': return ;\n case 'message-actions': return ;\n case 'messages-offline':\n case 'messages-menu':\n case 'messages-home':\n default: return ;\n }\n}\n","import React from 'react';\n\nimport HashNavigation from '../lib/navigation.js';\n\nconst navigate = view => HashNavigation.navigateTo(view);\n\nexport const MESSAGE_COMPOSER_VIEWS = [\n 'compose-keyboard', 'mentions-select', 'mentions-complete', 'mentions-message',\n 'emoji-panel', 'emoji-message', 'voice-ready', 'voice-hold', 'voice-recording',\n 'media-uploading', 'media-gallery', 'media-retry', 'upload-file', 'file-message',\n 'message-multiselect', 'favorite-success', 'forward-select', 'forward-multiple',\n 'forward-individual', 'forward-bundle'\n];\n\nconst MEMBERS = [\n {id: 'all', name: '所有人', note: '提醒群内所有成员', avatar: 'campaign'},\n {id: 'annie', name: '安妮', note: '产品设计组', image: 'img/bkg/p09.jpg'},\n {id: 'lizi', name: '栗子来了', note: '前端开发组', image: 'img/bkg/p15.jpg'},\n {id: 'wang', name: '王珊珊', note: '市场运营组', image: 'img/bkg/p14.jpg'},\n {id: 'chen', name: '陈晨', note: '项目管理组', image: 'img/bkg/p05.jpg'}\n];\n\nconst TARGETS = [\n {id: 'file', name: '文件助手', note: '仅自己可见', icon: 'folder_special'},\n {id: 'team', name: '产品研发群', note: '18人', image: 'img/bkg/p22.jpg'},\n {id: 'annie', name: '安妮', note: '在线', image: 'img/bkg/p09.jpg'},\n {id: 'lizi', name: '栗子来了', note: '刚刚活跃', image: 'img/bkg/p15.jpg'},\n {id: 'wang', name: '王珊珊', note: '市场运营组', image: 'img/bkg/p14.jpg'}\n];\n\nconst EMOJIS = ['😀', '😄', '😂', '🥰', '😎', '🤔', '👍', '👏', '🎉', '❤️', '🔥', '💡', '✅', '🙏', '💪', '🌟', '📌', '🚀'];\n\nfunction Icon({children}) {\n return {children} ;\n}\n\nfunction Avatar({item}) {\n return \n {item.image ? : {item.icon || item.avatar || 'person'} }\n ;\n}\n\nfunction Header({title = '产品研发群', subtitle = '18人', onMore}) {\n return ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2000);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\nfunction VoiceBubble({mine = false, duration = 8, unread = false}) {\n return \n {!mine ?
: null}\n
\n graphic_eq {duration}″ {unread ? : null}\n \n {mine ?
: null}\n
;\n}\n\nfunction TextBubble({mine = false, children, selected, onSelect}) {\n return \n {selected !== undefined ?
{selected ? 'check' : ''} : null}\n
\n {!mine ?
: null}\n
{children}
\n {mine ?
: null}\n
\n
;\n}\n\nfunction ImageBubble({progress, failed = false, selected, onSelect}) {\n return \n {selected !== undefined ?
{selected ? 'check' : ''} : null}\n
\n
\n {progress < 100 || failed ?
{failed ? 'refresh' : 'cloud_upload'} {failed ? '上传失败,点击重试' : `${progress}%`} {!failed ?
: null}
: null}\n
\n
\n
\n
;\n}\n\nfunction VideoBubble() {\n return play_circle 00:24 ;\n}\n\nfunction FileBubble({progress = 100, name = '产品需求说明书.pdf', selected, onSelect}) {\n return \n {selected !== undefined ?
{selected ? 'check' : ''} : null}\n
PDF {name} 2.4 MB · {progress < 100 ? `上传中 ${progress}%` : '已发送'} {progress < 100 ?
: null}
{progress < 100 ? 'close' : 'download'} \n
;\n}\n\nfunction BaseTimeline({mode, uploadProgress, selected, toggleSelected}) {\n const selectable = mode === 'message-multiselect' || mode === 'favorite-success';\n return \n 今天 10:24
\n 上午的评审结论已经整理好了,大家有空看一下。 \n toggleSelected('text')}>好的,我补充一下交互细节。 \n {mode === 'mentions-message' ? @安妮 @栗子来了 下午三点一起确认新版流程。 : null}\n {['media-uploading', 'media-gallery', 'media-retry'].includes(mode) ? <>\n \n \n {mode === 'media-gallery' ? <> > : null}\n > : null}\n {['file-message', 'message-multiselect', 'favorite-success'].includes(mode) ? toggleSelected('file')} /> : null}\n {selectable ? toggleSelected('image')} /> : null}\n ;\n}\n\nfunction EmojiPanel({onEmoji, onDelete}) {\n return \n schedule sentiment_satisfied_alt favorite_border \n {EMOJIS.map(emoji => onEmoji(emoji)}>{emoji} )}
\n backspace \n ;\n}\n\nfunction Composer({mode, draft, setDraft, onSend, setMode}) {\n const voice = ['voice-ready', 'voice-hold', 'voice-recording'].includes(mode);\n const emoji = ['emoji-panel', 'emoji-message'].includes(mode);\n const keyDown = event => {\n if (event.key === '@' && mode !== 'mentions-message') window.setTimeout(() => navigate('mentions-select'), 0);\n };\n return <>\n {event.preventDefault(); onSend();}}>\n setMode(voice ? 'compose-keyboard' : 'voice-ready')} aria-label={voice ? '切换键盘' : '切换语音'}>{voice ? 'keyboard' : 'record_voice_over'} \n {voice ? setMode('voice-hold')} onPointerUp={() => setMode('media-uploading')}>按住说话 : setDraft(event.target.value)} onKeyDown={keyDown} placeholder=\"输入消息\" />}\n setMode(emoji ? 'compose-keyboard' : 'emoji-panel')} aria-label=\"表情\">sentiment_satisfied_alt \n {draft.trim() && !voice ? 发送 : navigate('upload-file')} aria-label=\"更多\">add_circle_outline }\n \n {emoji ? setDraft(draft + value)} onDelete={() => setDraft(draft.slice(0, -1))} /> : null}\n >;\n}\n\nfunction VoiceOverlay({cancel = false}) {\n return \n
{cancel ? 'delete_outline' : 'mic'} \n
{[2, 5, 8, 12, 9, 6, 11, 4].map((height, index) => )}
\n
{cancel ? '松开手指,取消发送' : '手指上滑,取消发送'} 00:08 \n
;\n}\n\nfunction MemberPicker({complete}) {\n const [query, setQuery] = React.useState('');\n const [selected, setSelected] = React.useState(complete ? ['annie', 'lizi'] : []);\n const visible = MEMBERS.filter(item => item.name.includes(query) || item.note.includes(query));\n const toggle = id => setSelected(values => values.includes(id) ? values.filter(value => value !== id) : values.concat(id));\n return \n
navigate('compose-keyboard')}>arrow_back_ios_new 选择提醒人 {sessionStorage.setItem('im-mentions', JSON.stringify(selected)); navigate('mentions-message');}}>完成{selected.length ? `(${selected.length})` : ''} \n
search setQuery(event.target.value)} placeholder=\"搜索群成员\" />\n
群成员
\n
{visible.map(item =>
toggle(item.id)}>{item.name} {item.note} {selected.includes(item.id) ? check : null} )}
\n
;\n}\n\nfunction UploadFilePage({onToast}) {\n const [files, setFiles] = React.useState([{name: '产品需求说明书.pdf', size: '2.4 MB', progress: 64}]);\n React.useEffect(() => {\n if (files.every(file => file.progress >= 100)) return undefined;\n const timer = window.setTimeout(() => setFiles(items => items.map(file => ({...file, progress: Math.min(100, file.progress + 6)}))), 300);\n return () => window.clearTimeout(timer);\n }, [files]);\n return ;\n}\n\nfunction ForwardPage({mode, onToast}) {\n const multi = mode !== 'forward-select';\n const confirm = mode === 'forward-individual' || mode === 'forward-bundle';\n const [selected, setSelected] = React.useState(() => {\n if (!confirm) return [];\n try {\n return JSON.parse(sessionStorage.getItem('im-forward-targets')) || ['team', 'annie'];\n } catch (_) {\n return ['team', 'annie'];\n }\n });\n const [query, setQuery] = React.useState('');\n const [comment, setComment] = React.useState('');\n const toggle = id => setSelected(values => values.includes(id) ? values.filter(value => value !== id) : multi ? values.concat(id).slice(0, 9) : [id]);\n const visible = TARGETS.filter(item => item.name.includes(query) || item.note.includes(query));\n return \n
navigate('message-multiselect')}>close {confirm ? (mode === 'forward-bundle' ? '合并转发' : '逐条转发') : '选择转发对象'} {!confirm ? navigate(multi ? 'forward-select' : 'forward-multiple')}>{multi ? '单选' : '多选'} : }\n {!confirm ? <>
search setQuery(event.target.value)} placeholder=\"搜索会话或联系人\" />最近会话
{visible.map(item =>
{toggle(item.id); if (!multi) {sessionStorage.setItem('im-forward-targets', JSON.stringify([item.id])); window.setTimeout(() => navigate('forward-individual'), 0);}}}>{item.name} {item.note} {selected.includes(item.id) ? check : null} )}
{multi ?
已选择 {selected.length}/9 个会话 {sessionStorage.setItem('im-forward-targets', JSON.stringify(selected)); navigate('forward-individual');}}>下一步 : null}> :
发送给 {TARGETS.filter(item => selected.includes(item.id)).map(item =>
{item.name} )}
{mode === 'forward-bundle' ? '产品研发群的聊天记录' : '将逐条发送 3 条消息'} 栗子来了:上午的评审结论已经整理好了
我:好的,我补充一下交互细节。
我:[图片]
setComment(event.target.value)} placeholder=\"给朋友留言\" /> navigate('forward-individual')}>逐条转发 navigate('forward-bundle')}>合并转发
{onToast(`已发送给 ${selected.length} 个会话`); window.setTimeout(() => navigate('chat-standard'), 900);}}>发送 }\n
;\n}\n\nexport default function MessageComposerView({view}) {\n const [mode, setMode] = React.useState(view);\n const [draft, setDraftState] = React.useState(() => sessionStorage.getItem('im-message-composer-draft') || (view === 'emoji-message' ? '收到啦 ' : ''));\n const [uploadProgress, setUploadProgress] = React.useState(view === 'media-uploading' ? 22 : 100);\n const [selected, setSelected] = React.useState(view === 'favorite-success' ? ['text', 'file', 'image'] : ['text', 'image']);\n const [toast, setToast] = React.useState(view === 'favorite-success' ? '已收藏 3 条消息' : '');\n const setDraft = value => {setDraftState(value); sessionStorage.setItem('im-message-composer-draft', value);};\n\n React.useEffect(() => {\n if (mode !== 'media-uploading' || uploadProgress >= 100) return undefined;\n const timer = window.setTimeout(() => setUploadProgress(value => Math.min(100, value + 5)), 350);\n return () => window.clearTimeout(timer);\n }, [mode, uploadProgress]);\n\n if (view === 'mentions-select' || view === 'mentions-complete') return ;\n if (view === 'upload-file') return <> setToast('')} />>;\n if (['forward-select', 'forward-multiple', 'forward-individual', 'forward-bundle'].includes(view)) return <> setToast('')} />>;\n\n const toggleSelected = id => setSelected(values => values.includes(id) ? values.filter(value => value !== id) : values.concat(id));\n const recording = mode === 'voice-hold' || mode === 'voice-recording';\n const multiselect = mode === 'message-multiselect' || mode === 'favorite-success';\n\n return \n
setToast('会话设置')} />\n {multiselect ? navigate('chat-standard')}>close 已选择 {selected.length} 条 setSelected(selected.length ? [] : ['text', 'file', 'image'])}>{selected.length ? '取消全选' : '全选'}
: null}\n \n {multiselect ? navigate('forward-select')}>forward 转发 {setMode('favorite-success'); setToast(`已收藏 ${selected.length} 条消息`);}}>bookmark_border 收藏 {setSelected([]); setToast('已删除所选消息');}}>delete_outline 删除 : {if (!draft.trim()) return; setToast('消息已发送'); setDraft('');}} />}\n {recording ? : null}\n setToast('')} />\n ;\n}\n","// Create new topic and invite users or send an invite.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from '../widgets/contact-list.jsx';\nimport NewTopicById from '../widgets/new-topic-by-id.jsx';\nimport NewTopicGroup from '../widgets/new-topic-group.jsx';\nimport SearchContacts from '../widgets/search-contacts.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { asEmail, asPhone, theCard } from '../lib/utils.js';\n\nconst messages = defineMessages({\n search_for_contacts: {\n id: \"search_for_contacts\",\n defaultMessage: \"Use search to find contacts\",\n description: \"Text shown in contacts view when user entered no search query.\"\n },\n search_no_results: {\n id: \"search_no_results\",\n defaultMessage: \"Search returned no results\",\n description: \"Text shown in contacts view when query returned no results.\"\n },\n search_placeholder: {\n id: \"search_placeholder\",\n defaultMessage: \"List like alice@example.com, +17025550003...\",\n description: \"Placeholder in contacts search field\"\n },\n});\n\nclass NewTopicView extends React.Component {\n constructor(props) {\n super(props);\n\n const urlParams = HashNavigation.parseUrlHash(window.location.hash).params;\n const initialTab = urlParams['tab'] || 'find';\n const initialQuery = initialTab == 'find' ? (urlParams['q'] || null) : null;\n\n this.state = {\n tabSelected: initialTab,\n searchQuery: initialQuery\n };\n\n this.handleTabClick = this.handleTabClick.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleSearchResultSelected = this.handleSearchResultSelected.bind(this);\n this.handleNewGroupSubmit = this.handleNewGroupSubmit.bind(this);\n this.handleGroupByID = this.handleGroupByID.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleTabClick(e) {\n e.preventDefault();\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'tab', e.currentTarget.dataset.id));\n this.setState({tabSelected: e.currentTarget.dataset.id});\n }\n\n handleSearchContacts(query) {\n query = query.trim() || Tinode.DEL_CHAR;\n if (!/[\\s,:]/.test(query) && query != Tinode.DEL_CHAR) {\n // No colons, spaces or commas, not DEL char. Try as email, phone, or alias.\n const email = asEmail(query);\n if (email) {\n query = `${Tinode.TAG_EMAIL}${email}`;\n } else {\n const tel = asPhone(query);\n if (tel) {\n query = `${Tinode.TAG_PHONE}${tel}`;\n } else {\n if (query[0] == '@') {\n // Strip the leading '@' sign if present.\n query = query.substring(1);\n }\n // 'alice' -> 'alias:alice,alice'\n query = `${Tinode.TAG_ALIAS}${query},${query}`;\n }\n }\n }\n this.props.onSearchContacts(query);\n this.setState({searchQuery: Tinode.isNullValue(query) ? null : query});\n }\n\n handleSearchResultSelected(topicName) {\n if (this.state.tabSelected == 'find') {\n HashNavigation.navigateTo(HashNavigation.removeUrlParams(window.location.hash, ['tab', 'q']));\n this.props.onCreateTopic(topicName);\n }\n }\n\n handleNewGroupSubmit(name, description, dataUrl, priv, tags, isChannel) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParams(window.location.hash, ['tab', 'q']));\n this.props.onCreateTopic(undefined,\n {public: theCard(name, dataUrl, null, description), private: priv, tags: tags}, isChannel);\n }\n\n handleGroupByID(topicName) {\n HashNavigation.navigateTo(HashNavigation.removeUrlParams(window.location.hash, ['tab', 'q']));\n this.props.onCreateTopic(topicName);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const no_contacts_placeholder = formatMessage(this.state.searchQuery ?\n messages.search_no_results : messages.search_for_contacts);\n const search_placeholder = formatMessage(messages.search_placeholder);\n return (\n \n
\n {this.state.tabSelected === 'grp' ?\n
:\n\n this.state.tabSelected === 'byid' ?\n
:\n\n
\n \n \n
}\n
\n );\n }\n};\n\nexport default injectIntl(NewTopicView);\n","import React from 'react';\nimport QRCode from 'qrcodejs';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { useCachedData, readCachedData, writeCachedData } from '../lib/use-cached-data.js';\nimport { BASE_APP_NAME, LINK_CONTACT_US } from '../config.js';\nimport { PACKAGE_VERSION } from '../version.js';\nimport {\n getMeProfile, updateMeProfile, getFileUrl, uploadLargeFile,\n getMePrivacy, updateMePrivacy, getYouthMode, enableYouthMode, disableYouthMode, verifyIndependentPassword,\n createMyQRCode, getRealnameStatus\n} from '../lib/im-api.js';\n\nconst navigate = (view, params) => {\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, view);\n Object.entries(params || {}).forEach(([key, value]) => {\n hash = value ? HashNavigation.addUrlParam(hash, key, value) : HashNavigation.removeUrlParam(hash, key);\n });\n HashNavigation.navigateTo(hash);\n};\n\nexport const PERSONAL_SETTINGS_VIEWS = [\n 'personal-center', 'personal-profile', 'profile-nickname', 'profile-birth-date',\n 'profile-signature', 'profile-gender', 'profile-region', 'personal-qrcode', 'android-settings',\n 'cache-clear-confirm', 'clear-history-confirm', 'change-password', 'delete-account-confirm',\n 'app-version', 'privacy-settings', 'friend-discovery-settings',\n 'youth-mode-off', 'youth-mode-on', 'youth-mode-verify',\n 'notification-permission', 'permission-settings-reminder', 'camera-permission-info',\n 'microphone-permission-info'\n];\n\nfunction Icon({children}) { return {children} ; }\n\nfunction Header({title, back = 'personal-center', action, actionLabel, onAction, actionDisabled}) {\n return \n { if (!HashNavigation.goBack()) navigate(back); }} aria-label=\"返回\">arrow_back_ios_new \n {title} \n {action ? {actionLabel || action} : }\n ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2100);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\nfunction Toggle({checked, disabled, onChange}) {\n return onChange(!checked)}> ;\n}\n\nfunction MenuRow({icon, title, value, route, onClick, danger}) {\n return route && navigate(route))}>\n {icon ? {icon} : null}\n {title} {value ? {value} : null} \n {route || onClick ? chevron_right : null}\n ;\n}\n\n// docs/images/我的.png 的\"企业名称\"字段实际上是租户名,不是组织架构的部门 -- 复用 Ch.9 workbench\n// 已经验证过的读取方式(登录时 tenants/resolve 缓存进 localStorage['im-tenant'])。\nfunction tenantName() {\n try { return JSON.parse(window.localStorage.getItem('im-tenant') || '{}').name || ''; } catch (_) { return ''; }\n}\n\nfunction ImgFromFile({fileId, className}) {\n const [url, setUrl] = React.useState(null);\n React.useEffect(() => { let live = true; getFileUrl(fileId).then(u => live && setUrl(u)).catch(() => {}); return () => { live = false; }; }, [fileId]);\n return url ? : ;\n}\n\nfunction PersonalCenter() {\n // Was `useState(null)` + its own effect -- remounting this (e.g. tabbing back from 设置) blanked\n // the name/avatar back to the loading placeholder for a beat even though nothing had changed,\n // same \"switching pages feels like it reloads every time\" complaint this cache already fixed for\n // the workbench/message list/address book.\n const [profile] = useCachedData('me-profile', getMeProfile, []);\n return \n navigate('personal-profile')}>\n {profile && profile.avatar_file_id ? : person }\n {(profile && (profile.nickname || profile.public_account)) || '…'} \n 企业名称:{tenantName() || '…'} \n ID: {(profile && profile.public_account) || '…'} \n chevron_right \n \n \n \n ;\n}\n\n// docs/images/个人信息.png 两张截图字段不完全一样(一张有用户名/职位/公司,另一张有ID号/地区)--\n// 代码调研确认 /me/profile 真实字段只有 avatar/nickname/gender/birth_date/region/signature/email;\n// \"职位/公司\"属于第9章组织架构数据源(这里没有反查接口,不展示);\"ID号\"、\"用户名\"是原型臆造字段,\n// 后端没有对应概念(用户id恒为usrXXX格式),不做。\nfunction PersonalProfile({onToast, tinode}) {\n // Shares the 'me-profile' key with PersonalCenter's already-fixed cache -- this is the hub every\n // field editor below navigates back to on save, so it's revisited constantly.\n const [profile, setProfile] = React.useState(() => readCachedData('me-profile') || null);\n const fileInputRef = React.useRef(null);\n const [uploading, setUploading] = React.useState(false);\n\n const load = () => getMeProfile().then(p => { writeCachedData('me-profile', p); setProfile(p); }).catch(() => {});\n React.useEffect(() => { load(); }, []);\n\n const pickAvatar = () => fileInputRef.current && fileInputRef.current.click();\n const handleAvatarFile = event => {\n const file = event.target.files && event.target.files[0];\n event.target.value = '';\n if (!file || !tinode) return;\n setUploading(true);\n uploadLargeFile(tinode, file).then(({fileId}) => updateMeProfile({avatar_file_id: fileId, version: profile.version}))\n .then(load).then(() => onToast('头像已更新'))\n .catch(err => onToast(err.message || '头像上传失败')).finally(() => setUploading(false));\n };\n\n const genderLabel = {male: '男', female: '女', other: '其他'}[profile && profile.gender] || '未设置';\n\n return ;\n}\n\n// Real field_rules confirmed against server/im_http.go: nickname max_length=32, signature\n// max_length=120 -- the reference screenshots show 120/20 respectively (swapped and wrong),\n// mock code already had the right numbers by luck; kept here but sourced from a constant that\n// matches the server contract rather than the screenshots.\nconst FIELD_LIMITS = {nickname: 32, signature: 120};\n\nfunction TextEditor({field, multiline, title, onToast}) {\n const [profile, setProfile] = React.useState(null);\n const [value, setValue] = React.useState('');\n const [saving, setSaving] = React.useState(false);\n React.useEffect(() => { getMeProfile().then(p => { setProfile(p); setValue(p[field] || ''); }).catch(() => {}); }, [field]);\n\n const save = () => {\n const normalized = value.trim();\n if (field === 'nickname' && !normalized) { onToast('昵称不能为空'); return; }\n setSaving(true);\n updateMeProfile({[field]: normalized, version: profile.version}).then(_ => {\n onToast('资料已保存');\n window.setTimeout(() => navigate('personal-profile'), 500);\n }).catch(err => onToast(err.message || '保存失败')).finally(() => setSaving(false));\n };\n\n const maxLength = FIELD_LIMITS[field];\n return \n
\n
\n \n {multiline ?\n setValue(event.target.value)} /> :\n setValue(event.target.value)} />}\n {value.length}/{maxLength} \n {value ? setValue('')} aria-label=\"清空\">cancel : null}\n \n {field === 'nickname' ? '昵称将展示在联系人资料和聊天页面中' : '签名将展示在你的个人资料页'}
\n \n
;\n}\n\nfunction BirthDateEditor({onToast}) {\n const [profile, setProfile] = React.useState(null);\n const [value, setValue] = React.useState('');\n React.useEffect(() => { getMeProfile().then(p => { setProfile(p); setValue(p.birth_date || ''); }).catch(() => {}); }, []);\n const save = () => {\n updateMeProfile({birth_date: value, version: profile.version}).then(_ => {\n onToast('出生日期已保存');\n window.setTimeout(() => navigate('personal-profile'), 500);\n }).catch(err => onToast(err.message || '保存失败'));\n };\n const today = new Date().toISOString().slice(0, 10);\n return \n
\n
\n cake \n 选择出生日期 setValue(event.target.value)} /> \n 出生日期的可见范围由隐私设置决定
\n \n
;\n}\n\nconst GENDER_OPTIONS = [{value: 'male', label: '男'}, {value: 'female', label: '女'}, {value: 'other', label: '其他'}];\n\nfunction GenderEditor({onToast}) {\n const [profile, setProfile] = React.useState(null);\n React.useEffect(() => { getMeProfile().then(setProfile).catch(() => {}); }, []);\n const choose = value => {\n updateMeProfile({gender: value, version: profile.version}).then(_ => {\n onToast('性别已更新');\n window.setTimeout(() => navigate('personal-profile'), 400);\n }).catch(err => onToast(err.message || '保存失败'));\n };\n return \n {GENDER_OPTIONS.map(opt => choose(opt.value)} disabled={!profile}>\n {opt.label} {profile && profile.gender === opt.value ? check : null}\n )}\n
;\n}\n\nfunction RegionEditor({onToast}) {\n const [profile, setProfile] = React.useState(null);\n const [value, setValue] = React.useState('');\n React.useEffect(() => { getMeProfile().then(p => { setProfile(p); setValue(p.region || ''); }).catch(() => {}); }, []);\n const save = () => {\n updateMeProfile({region: value.trim(), version: profile.version}).then(_ => {\n onToast('地区已保存');\n window.setTimeout(() => navigate('personal-profile'), 500);\n }).catch(err => onToast(err.message || '保存失败'));\n };\n return \n \n setValue(event.target.value)} /> \n
;\n}\n\nfunction PersonalQr({onToast}) {\n // Same shared 'me-profile' key as PersonalCenter/PersonalProfile -- this only needs it for the\n // avatar/name display next to the code. `qr` itself is deliberately NOT cached: createMyQRCode()\n // mints/renews a signed code each call (POST semantics, not a GET), so seeding a stale payload\n // risks showing an already-superseded code that fails to scan -- worse than a brief spinner.\n const [profile, setProfile] = React.useState(() => readCachedData('me-profile') || null);\n const [qr, setQr] = React.useState(null);\n const qrRef = React.useRef(null);\n\n const load = () => {\n createMyQRCode().then(setQr).catch(err => onToast(err.message || '二维码生成失败'));\n };\n React.useEffect(() => {\n getMeProfile().then(p => { writeCachedData('me-profile', p); setProfile(p); }).catch(() => {});\n load();\n }, []);\n\n React.useEffect(() => {\n if (!qr || !qrRef.current) return;\n qrRef.current.innerHTML = '';\n new QRCode(qrRef.current, {text: qr.qr_payload || qr.qr_token, width: 210, height: 210, correctLevel: QRCode.CorrectLevel.M});\n }, [qr]);\n\n return \n \n \n {profile && profile.avatar_file_id ?
:
person }\n
{(profile && profile.nickname) || (profile && profile.public_account)} {tenantName()} \n
\n
\n 扫一扫上面的二维码,加我为好友
\n {qr && qr.expires_at ? 二维码将于 {new Date(qr.expires_at).toLocaleString()} 失效 : null}\n \n \n { load(); onToast('二维码已刷新'); }}>refresh 刷新 \n {\n if (navigator.share && qr) {\n navigator.share({title: '我的名片', text: qr.qr_payload || qr.qr_token}).catch(() => {});\n } else {\n onToast('当前环境不支持分享');\n }\n }}>share 分享 \n
\n ;\n}\n\n// docs/images/设置(iOS).png 只有7项,docs/images/设置(安卓).png 多了\"青少年模式\"/\"实名认证\"两行状态\n// 展示 -- 两个平台业务能力理应一致(文字需求也这么写),采用更完整的安卓版列表,不再区分iOS/安卓两份。\nfunction SettingsList({onToast, onLogout}) {\n // 'youth-mode' is shared with the YouthMode page's own fetch of the same endpoint; 'me-realname'\n // has no other reader today but gets the same treatment for consistency -- both status badges here\n // otherwise flash a plausible-but-possibly-wrong value (realnameLabel's own fallback below shows\n // \"未认证\" the instant this remounts, even while the still-unauthenticated-looking fetch is in\n // flight) rather than a neutral loading placeholder, so caching avoids a *wrong* badge, not just a\n // blank one.\n const [youthSettings, setYouthSettings] = React.useState(() => readCachedData('youth-mode') || null);\n const [realname, setRealname] = React.useState(() => readCachedData('me-realname') || null);\n React.useEffect(() => {\n getYouthMode().then(d => { writeCachedData('youth-mode', d); setYouthSettings(d); }).catch(() => {});\n getRealnameStatus().then(d => { writeCachedData('me-realname', d); setRealname(d); }).catch(() => {});\n }, []);\n const youthEnabled = youthSettings ? youthSettings.enabled : null;\n const realnameStatus = realname ? realname.status : null;\n const realnameLabel = {verified: '已认证', pending: '审核中', rejected: '未通过'}[realnameStatus] || '未认证';\n const logout = () => {\n if (window.confirm('确定要退出当前登录吗?')) {\n onLogout ? onLogout() : onToast('当前环境不支持退出登录');\n }\n };\n return \n \n \n \n \n \n \n {/* security-support-view.jsx 的 FraudAwareness 组件自己的注释就写着这应该是个\n \"always-reachable safety-info page\",但此前没有任何页面真的链接过去——只能靠手改\n hash 才能打开。这是 personal-settings-view.jsx 之外的一个路由,和本文件其它跳转\n 用的是同一套 hash 导航,可以直接指过去。 */}\n \n \n \n 退出当前登录 \n
;\n}\n\nfunction ConfirmSheet({icon, title, body, confirmLabel = '确认', confirmDanger = true, busy, onConfirm, onCancel, children}) {\n return \n {icon} {title} {body}
\n {children}\n {busy ? '处理中…' : confirmLabel} \n 取消 \n ;\n}\n\n// No backend endpoint clears cache/history -- both are pure client-side operations (confirmed:\n// server/main.go's ~74 routes have nothing for either). Cache clearing empties Cache Storage/IDB;\n// clearing all history calls the native Tinode delMessagesAll(false) per open conversation, same\n// method contact-management-view.jsx/group-management-view.jsx already use for single-topic clears.\nfunction CacheClear({onToast}) {\n const [busy, setBusy] = React.useState(false);\n const [done, setDone] = React.useState(false);\n const [freed, setFreed] = React.useState(0);\n const confirm = async () => {\n setBusy(true);\n try {\n // navigator.storage/caches can be entirely absent (private browsing in some browsers, older\n // WebViews) rather than just rejecting -- referencing a missing global throws synchronously,\n // which a bare .catch() on the call below can't catch (it never gets that far), so without\n // this check the whole confirm() throws, `done` never becomes true, and the \"已完成\" state is\n // never reached even though the button correctly stops spinning via `finally`.\n const hasStorageEstimate = typeof navigator !== 'undefined' && navigator.storage && navigator.storage.estimate;\n const hasCaches = typeof caches !== 'undefined';\n const before = hasStorageEstimate ? (await navigator.storage.estimate().catch(() => ({usage: 0}))).usage || 0 : 0;\n if (hasCaches) {\n const keys = await caches.keys();\n await Promise.all(keys.map(k => caches.delete(k)));\n }\n const after = hasStorageEstimate ? (await navigator.storage.estimate().catch(() => ({usage: 0}))).usage || 0 : 0;\n setFreed(Math.max(0, before - after));\n setDone(true);\n } catch (err) {\n onToast(err.message || '清理失败,请重试');\n } finally {\n setBusy(false);\n }\n };\n return navigate('android-settings') : confirm} onCancel={() => navigate('android-settings')} />;\n}\n\nfunction ClearHistoryConfirm({tinode, chatList, onToast}) {\n const [busy, setBusy] = React.useState(false);\n const confirm = () => {\n if (!tinode || !chatList || !chatList.length) { onToast('没有可清除的会话'); navigate('android-settings'); return; }\n setBusy(true);\n Promise.all(chatList.map(c => {\n const topic = tinode.getTopic(c.name);\n return topic ? topic.delMessagesAll(false).catch(() => {}) : Promise.resolve();\n })).then(() => {\n onToast('聊天记录已清空');\n navigate('android-settings');\n }).finally(() => setBusy(false));\n };\n return navigate('android-settings')} />;\n}\n\n// Changing password has no REST endpoint -- it's native Tinode {acc} protocol\n// (Tinode.updateAccountBasic), already wired end-to-end via tinode-web.jsx's\n// handleUpdatePasswordRequest/onUpdatePassword prop (used today by the old acc-security-view.jsx).\n// Reusing that verified callback here instead of reimplementing the WS call.\n// The server-side account-update call never checks the caller's current password -- \"原密码\" below\n// is a frontend-only speed bump against fat-fingering this field, not a real credential check.\nfunction ChangePassword({onUpdatePassword, onToast}) {\n const [oldPwd, setOldPwd] = React.useState('');\n const [newPwd, setNewPwd] = React.useState('');\n const [confirmPwd, setConfirmPwd] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n const submit = () => {\n if (!oldPwd || newPwd.length < 6) { onToast('请输入原密码,新密码至少6位'); return; }\n if (newPwd !== confirmPwd) { onToast('两次输入的新密码不一致'); return; }\n if (!onUpdatePassword) { onToast('当前环境不支持修改密码'); return; }\n if (busy) return;\n setBusy(true);\n // 等真实结果再报成功。原来是发出去就立刻弹\"密码已更新\"并跳走,服务端拒绝(密码策略不符等)\n // 时用户看到的仍然是成功提示,密码其实没变。\n Promise.resolve(onUpdatePassword(newPwd)).then(() => {\n onToast('密码已更新');\n window.setTimeout(() => navigate('android-settings'), 500);\n }).catch(err => {\n onToast((err && err.message) || '修改失败,请重试');\n setBusy(false);\n });\n };\n return \n 原密码 setOldPwd(e.target.value)} placeholder=\"请输入当前密码\" /> \n 新密码 setNewPwd(e.target.value)} placeholder=\"至少6位\" /> \n 确认新密码 setConfirmPwd(e.target.value)} placeholder=\"再次输入新密码\" /> \n
;\n}\n\n// Account deletion is also native Tinode ({del what=\"user\" hard=true} -> delCurrentUser(true)),\n// already wired via tinode-web.jsx's handleDeleteAccount/onDeleteAccount prop. Server-side there's\n// no cooldown/soft-delete and no password re-check (confirmed against server/user.go) -- adding a\n// password confirmation step here is a deliberate, conservative frontend-only safeguard given how\n// irreversible and consequential this action is, not something the backend requires.\nfunction DeleteAccountConfirm({onDeleteAccount, onToast}) {\n const [step, setStep] = React.useState(1);\n const [password, setPassword] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n const proceed = () => {\n if (!password) { onToast('请输入密码以确认'); return; }\n if (!onDeleteAccount) { onToast('当前环境不支持注销账号'); return; }\n setBusy(true);\n Promise.resolve(onDeleteAccount()).catch(err => { onToast(err.message || '注销失败'); setBusy(false); });\n };\n if (step === 1) {\n // im_be's replyDelUser -> hub.stopTopicsForUser hard-deletes every group topic this account\n // owns (not just leaves them) -- confirmed against hub.go's topic.owner==uid branch. Callers\n // in those groups get no advance warning and no forced-ownership-transfer prompt, so this has\n // to be disclosed here since it's the only place the user sees before confirming.\n return setStep(2)} onCancel={() => navigate('android-settings')} />;\n }\n return navigate('android-settings')}>\n setPassword(e.target.value)} placeholder=\"登录密码\" />\n ;\n}\n\n// docs/images/版本更新页面.png 其实是\"关于我们\"页(app图标+版本号+用户条款/隐私协议/检测新版本/联系我们),\n// 品牌名图片里出现了5个不同版本(捷信密使/光讯通讯/笔墨讯使/光迅通讯...),判定为设计稿混用了多版本草稿,\n// 统一用代码里已确立的 BASE_APP_NAME(纯品牌名,不带版本号后缀),不采信任何一个图片品牌名。\n// \"检测新版本\"(及跳转应用商店的更新弹窗)是原型给移动端设计的,web版没有应用商店可跳,按要求隐藏。\nfunction AppVersion({onToast}) {\n const currentVersion = PACKAGE_VERSION;\n\n return \n forum {BASE_APP_NAME} 版本 {currentVersion}
\n \n onToast('用户条款')} />\n onToast('隐私协议')} />\n {/* 参考图\"版本更新页面.png\"里这行是明确画出来的,之前漏掉了(跟\"检测新版本\"不一样,\n 那个是核对图片后判断web版没有应用商店可跳、主动决定不做,这里没有类似理由)。\n 图上那个联系邮箱本身很可能是设计稿混用多版本草稿的产物,不采信,复用代码里已有的\n LINK_CONTACT_US——如果这不是最终要用的联系方式,需要产品另外提供真实地址。 */}\n { window.location.href = LINK_CONTACT_US; }} />\n \n \n
;\n}\n\n// docs/images/隐私设置.png 只画了\"添加我的方式\"+\"邀我入群需要验证\"两项,但 UserPrivacySettings\n// 结构体真实还有 profile_visibility/last_seen_visibility/read_receipts 三个字段 -- 图片大概率没拍全,\n// 这三项是真实、有意义的字段,保留;\"邀我入群需要验证\"反过来是图片有但后端完全没有对应字段(代码调研\n// 确认 UserPrivacySettings 里没有这个概念,群邀请入群逻辑本身也不检查任何隐私开关),故不做这一项,\n// 记录为后端缺口而不是造一个点了没有效果的假开关。\nfunction PrivacySettings({onToast}) {\n // Shares 'me-privacy' with FriendDiscoverySettings' identical getMePrivacy() call -- a toggle page,\n // not a text edit form, so a background refetch self-corrects any stale toggle state harmlessly\n // (no risk of clobbering in-progress typing the way a free-text field would).\n const [privacy, setPrivacy] = React.useState(() => readCachedData('me-privacy') || null);\n React.useEffect(() => { getMePrivacy().then(p => { writeCachedData('me-privacy', p); setPrivacy(p); }).catch(() => {}); }, []);\n const update = (key, value) => {\n const prev = privacy;\n setPrivacy({...privacy, [key]: value});\n updateMePrivacy({[key]: value, version: privacy.version}).then(p => { writeCachedData('me-privacy', p); setPrivacy(p); })\n .catch(err => { onToast(err.message || '保存失败'); setPrivacy(prev); writeCachedData('me-privacy', prev); });\n };\n const methodSummary = () => {\n if (!privacy) return '';\n const labels = {account: '账号', phone: '手机号', qr: '二维码', group: '群聊'};\n const on = Object.entries(privacy.add_me_methods || {}).filter(([, v]) => v).map(([k]) => labels[k] || k);\n if (on.length === 4) return '全部允许';\n return on.length ? on.join('、') : '全部关闭';\n };\n // 后端 userPrivacyPayload 会返回 editable{add_me_methods, profile_visibility, last_seen_visibility,\n // read_receipts},用来表达\"企业强制策略锁死了这一项\"。原来完全没读这个字段,被锁的开关照样能点,\n // 点了服务端 400 再回滚,用户只看到开关自己弹回去、不知道为什么。\n const locked = key => !!(privacy && privacy.editable && privacy.editable[key] === false);\n return \n \n {privacy ? \n 显示消息已读状态 {locked('read_receipts') ? '该项由企业统一设置,不可修改' : '关闭后你也无法查看对方的已读状态'} \n update('read_receipts', v)} />
\n 展示最后在线时间 {locked('last_seen_visibility') ? '该项由企业统一设置,不可修改' : '仅向联系人显示'} \n {/* Backend's validVisibility only accepts everyone/friends/nobody -- 'contacts'/'hidden' were\n rejected by the PATCH validator outright (every toggle attempt 400'd and silently reverted),\n and even a lenient backend would enforce the opposite of what turning this \"on\" should do\n (imCanViewLastSeen's default case treats any unrecognized value as hidden). */}\n update('last_seen_visibility', v ? 'friends' : 'nobody')} />
\n 允许好友查看我的资料 {locked('profile_visibility') ? '该项由企业统一设置,不可修改' : '关闭后仅你自己可见'} \n update('profile_visibility', v ? 'friends' : 'nobody')} />
\n : null}\n ;\n}\n\nfunction FriendDiscoverySettings({onToast}) {\n // Same shared 'me-privacy' key as PrivacySettings -- identical resource, so whichever of the two\n // screens is opened first warms the cache for the other.\n const [privacy, setPrivacy] = React.useState(() => readCachedData('me-privacy') || null);\n React.useEffect(() => { getMePrivacy().then(p => { writeCachedData('me-privacy', p); setPrivacy(p); }).catch(() => {}); }, []);\n const update = (key, value) => {\n const prev = privacy;\n const nextMethods = {...(privacy.add_me_methods || {}), [key]: value};\n setPrivacy({...privacy, add_me_methods: nextMethods});\n updateMePrivacy({add_me_methods: nextMethods, version: privacy.version}).then(p => { writeCachedData('me-privacy', p); setPrivacy(p); })\n .catch(err => { onToast(err.message || '保存失败'); setPrivacy(prev); writeCachedData('me-privacy', prev); });\n };\n const rows = [{key: 'account', title: '账号'}, {key: 'phone', title: '手机号'}, {key: 'qr', title: '二维码'}, {key: 'group', title: '群聊'}];\n // 同 PrivacySettings:企业强制策略锁死时不让点,避免\"能点但必然 400 再弹回\"。\n const methodsLocked = !!(privacy && privacy.editable && privacy.editable.add_me_methods === false);\n return \n {methodsLocked ? '添加方式由企业统一设置,不可修改。' : '关闭某种方式后,其他人将无法通过该渠道搜索或添加你。'}
\n {privacy ? {rows.map(row => \n 可通过{row.title}添加我 \n update(row.key, v)} />\n
)} : null}\n ;\n}\n\n// docs/images/青少年模式未开启(安卓).png 的\"每日不超过40分钟\"/\"加好友群聊每日各4次\"是纯前端文案,\n// 代码调研确认 YouthModeSettings.Restrictions 后端真实内容是三个类别码\n// (night_quiet/content_filter/payment_guard),没有任何分钟数/次数字段 -- 这两个具体数字只作为说明\n// 文案展示,不冒充是从后端配置读出来的。使用时长同理没有后端字段,这里做的是纯本地、按自然日重置的\n// 近似计时(刷新/换设备会丢,不追求精确,比完全不显示更贴近原型但明确知道它不是权威数据)。\nconst YOUTH_RULES = [\n `为呵护未成年人健康成长,${BASE_APP_NAME}推出青少年模式。该模式下部分功能将受限制使用`,\n '每天开启后使用时长不超过 40 分钟',\n '限制加好友/群聊次数(主动/被动加好友或群聊每日最多各 4 次)'\n];\nconst YOUTH_USAGE_KEY = 'im-youth-mode-usage';\n\nfunction useYouthUsageSeconds(active) {\n const [seconds, setSeconds] = React.useState(0);\n React.useEffect(() => {\n const today = new Date().toISOString().slice(0, 10);\n let stored = {};\n try { stored = JSON.parse(window.localStorage.getItem(YOUTH_USAGE_KEY) || '{}'); } catch (_) { /* ignore */ }\n if (stored.date !== today) stored = {date: today, seconds: 0};\n setSeconds(stored.seconds || 0);\n if (!active) return undefined;\n const timer = window.setInterval(() => {\n setSeconds(s => {\n const next = s + 1;\n window.localStorage.setItem(YOUTH_USAGE_KEY, JSON.stringify({date: today, seconds: next}));\n return next;\n });\n }, 1000);\n return () => window.clearInterval(timer);\n }, [active]);\n return seconds;\n}\n\nfunction formatHMS(totalSeconds) {\n const h = Math.floor(totalSeconds / 3600);\n const m = Math.floor((totalSeconds % 3600) / 60);\n const s = totalSeconds % 60;\n const pad = n => String(n).padStart(2, '0');\n return `${pad(h)}:${pad(m)}:${pad(s)}`;\n}\n\nfunction YouthMode({onToast}) {\n // Shares 'youth-mode' with SettingsList's badge fetch (see comment there) and gets patched directly\n // by YouthModeVerify right after a successful enable/disable, so navigating back here shows the new\n // state immediately instead of the stale cached one for a moment before self-correcting.\n const [settings, setSettings] = React.useState(() => readCachedData('youth-mode') || null);\n const usage = useYouthUsageSeconds(settings && settings.enabled);\n React.useEffect(() => {\n setSettings(readCachedData('youth-mode') || null);\n getYouthMode().then(d => { writeCachedData('youth-mode', d); setSettings(d); }).catch(err => onToast(err.message || '加载失败'));\n }, []);\n\n const startEnable = () => {\n if (!settings) return;\n if (!settings.password_set) {\n onToast('请先设置独立密码');\n window.setTimeout(() => navigate('identity-check', {ym: 'enable'}), 400);\n return;\n }\n navigate('youth-mode-verify', {ym: 'enable'});\n };\n\n if (!settings) return
;\n\n return \n
\n
\n {settings.enabled ? 'verified_user' : 'child_care'} \n {settings.enabled ? '青少年模式已开启' : '青少年模式未开启'} \n {YOUTH_RULES.map(rule => {rule} )} \n {settings.enabled ? 今日已使用:{formatHMS(usage)}
: null}\n \n
\n settings.enabled ? navigate('youth-mode-verify', {ym: 'disable'}) : startEnable()}>\n {settings.enabled ? '关闭青少年模式' : '开启青少年模式'}\n \n 可在设置中查看青少年模式状态 \n \n
;\n}\n\n// docs/images/青少年模式提示(安卓).png 实际内容是\"今日已达40分钟拦截层\"(文件名误导),其中的\n// \"输入密码继续使用\"选项代码调研确认后端没有任何\"临时解锁但不关闭\"的操作可对应 -- serveIMYouthModeEnable\n// /Disable 只有开/关两种终态,没有\"本次会话继续\"的中间态。不做这个假按钮,只保留真实可行的\"关闭\"路径。\n//\n// 开关流程统一:已设置密码时,输入密码 -> POST .../independent-password/verify 换 action_token\n// (action 按 enable/disable 传 enable_youth_mode/close_youth_mode)-> 调 enable/disable。\n// 未设置密码时开启前必须先走 identity-check(短信验证码)设置密码,这一步不消费于开启本身。\nfunction YouthModeVerify({hashParams, onToast}) {\n const mode = (hashParams && hashParams.ym) || 'disable';\n const [settings, setSettings] = React.useState(null);\n const [password, setPassword] = React.useState('');\n const [error, setError] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n const [lockedUntil, setLockedUntil] = React.useState(0);\n const [now, setNow] = React.useState(Date.now());\n const remainingLockSeconds = lockedUntil ? Math.max(0, Math.ceil((lockedUntil - now) / 1000)) : 0;\n // Self-rescheduling tick, not setInterval -- naturally stops once the countdown reaches 0 instead\n // of needing separate start/stop bookkeeping.\n React.useEffect(() => {\n if (remainingLockSeconds <= 0) return;\n const id = window.setTimeout(() => setNow(Date.now()), 1000);\n return () => window.clearTimeout(id);\n }, [remainingLockSeconds]);\n\n React.useEffect(() => { getYouthMode().then(setSettings).catch(() => {}); }, []);\n\n const submit = () => {\n if (password.length !== 4) { setError('请输入4位独立密码'); return; }\n if (remainingLockSeconds > 0) { return; }\n setBusy(true);\n setError('');\n // Server's serveIMYouthModeEnable consumes the token with a strict action='enable_youth_mode'\n // match (ConsumeActionToken does an exact WHERE action=? lookup) -- minting it tagged\n // 'set_independent_password' meant the lookup could never find it, so every enable attempt\n // 403'd with ACTION_TOKEN_INVALID regardless of a correct password.\n const action = mode === 'enable' ? 'enable_youth_mode' : 'close_youth_mode';\n verifyIndependentPassword(password, 'youth_mode', action).then(({action_token}) => {\n const call = mode === 'enable' ?\n enableYouthMode(settings.policy_version, action_token) :\n disableYouthMode(action_token);\n return call;\n }).then(_ => {\n // Patch the shared cache with the now-known new state before navigating back to YouthMode/\n // SettingsList -- without this they'd briefly show the pre-toggle cached value again and then\n // flip, which is a more confusing flash than the plain loading state they had before caching.\n if (settings) writeCachedData('youth-mode', {...settings, enabled: mode === 'enable'});\n onToast(mode === 'enable' ? '青少年模式已开启' : '青少年模式已关闭');\n window.setTimeout(() => navigate(mode === 'enable' ? 'youth-mode-on' : 'youth-mode-off'), 400);\n }).catch(err => {\n // Server locks out further attempts for retry_after_seconds after too many wrong passwords\n // (any request during that window 429s regardless of whether THIS password is correct) --\n // without tracking that window here, the button stayed enabled the whole time, letting the\n // user fire off more requests that were guaranteed to fail before the lock even lifts.\n if (err.reason === 'TOO_MANY_ATTEMPTS' && err.details && err.details.retry_after_seconds) {\n setLockedUntil(Date.now() + err.details.retry_after_seconds * 1000);\n setNow(Date.now());\n }\n setError(err.message || '验证失败');\n }).finally(() => setBusy(false));\n };\n\n return \n
\n
\n {[0, 1, 2, 3].map(i => {password[i] ? '●' : ''} )}
\n setPassword(e.target.value.replace(/\\D/g, '').slice(0, 4))} aria-label=\"独立密码\" />\n {error ? {error}
: null}\n 0} onClick={submit}>\n {busy ? '验证中…' : remainingLockSeconds > 0 ? `请 ${remainingLockSeconds} 秒后重试` : '确定'}\n \n {/* 一旦设过密码,这个页面就是唯一入口,之前完全没有出路——真忘了密码只能不断输错直到被\n 限流,限流也只是让你等,不会给别的办法。identity-check 走的短信验证码本来就支持在\n password_set:true 时重新设置密码(实测确认过),只是没有从这里链接过去。\n 必须带上当前 mode:IndependentPassword 设完新密码后,服务端每次都会无条件带回\n enable_action_token(与调用者意图无关),原来因为不知道是从\"关闭\"这个流程点进来的,\n 会把这次重置误当成\"继续开启\",用户想关闭青少年模式却被弹\"已开启\"、状态也没有真的关掉。 */}\n navigate('identity-check', {ym: mode})}>忘记独立密码? \n \n
;\n}\n\n// 10.18-10.21:纯静态权限说明卡片,浏览器原生权限API(Notification.requestPermission()/\n// getUserMedia())本身没有\"用途说明\"这个中间步骤,所以这一层完全是前端自己在真正触发系统权限\n// 弹窗前插入的说明UI,不需要任何后端接口 -- 与代码调研确认的\"清缓存/清聊天记录\"是同一类判断。\nconst PERMISSIONS = {\n notification: {icon: 'notifications_active', title: '获取推送权限', text: '向您及时送达重要通知、活动提醒、个性化内容更新等信息。', action: '开启通知', route: 'permission-settings-reminder'},\n reminder: {icon: 'settings', title: '消息推送暂未开启', text: `前往【设置 - 通知管理】一键开启吧!`, action: '好的', secondaryAction: '暂不开启', route: 'android-settings'},\n camera: {icon: 'photo_camera', title: '相机权限使用说明', text: '调用相机拍摄/扫码,为您提供拍照、扫码识别等服务。', action: '继续授权', route: 'messages-home'},\n microphone: {icon: 'mic', title: '麦克风权限使用说明', text: '用于语音消息、语音输入和音视频通话,未授权时不会创建录音文件。', action: '继续授权', route: 'messages-home'}\n};\n\nfunction PermissionGuide({type, onToast}) {\n const config = PERMISSIONS[type];\n const proceed = () => {\n if (type === 'notification' && 'Notification' in window) {\n Notification.requestPermission().then(() => navigate(config.route));\n return;\n }\n onToast(type === 'reminder' ? '请前往系统设置开启通知' : '等待系统授权结果');\n window.setTimeout(() => navigate(config.route), 500);\n };\n return \n
\n
\n {config.icon} \n {config.title} \n {config.text}
\n {config.action} \n {config.secondaryAction ? navigate('messages-home')}>{config.secondaryAction} : null}\n \n
;\n}\n\nexport default function PersonalSettingsView({view, hashParams, myUserId, tinode, chatList, onUpdatePassword, onDeleteAccount, onLogout}) {\n const [toast, setToast] = React.useState('');\n let content;\n if (view === 'personal-center') content = ;\n else if (view === 'personal-profile') content = ;\n else if (view === 'profile-nickname') content = ;\n else if (view === 'profile-signature') content = ;\n else if (view === 'profile-birth-date') content = ;\n else if (view === 'profile-gender') content = ;\n else if (view === 'profile-region') content = ;\n else if (view === 'personal-qrcode') content = ;\n else if (view === 'android-settings') content = ;\n else if (view === 'cache-clear-confirm') content = ;\n else if (view === 'clear-history-confirm') content = ;\n else if (view === 'change-password') content = ;\n else if (view === 'delete-account-confirm') content = ;\n else if (view === 'app-version') content = ;\n else if (view === 'privacy-settings') content = ;\n else if (view === 'friend-discovery-settings') content = ;\n else if (view === 'youth-mode-off' || view === 'youth-mode-on') content = ;\n else if (view === 'youth-mode-verify') content = ;\n else content = ;\n return <>{content} setToast('')} />>;\n}\n","import React from 'react';\n\nimport HashNavigation from '../lib/navigation.js';\nimport { uploadLargeFile, getAbuseReasons, submitAbuseReport, getFeedbackConfig, submitFeedback } from '../lib/im-api.js';\nimport { readCachedData, useCachedData } from '../lib/use-cached-data.js';\n\nconst navigate = (view, params) => {\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, view);\n Object.entries(params || {}).forEach(([key, value]) => {\n hash = value ? HashNavigation.addUrlParam(hash, key, value) : HashNavigation.removeUrlParam(hash, key);\n });\n HashNavigation.navigateTo(hash);\n};\n\nexport const SECURITY_SUPPORT_VIEWS = [\n 'fraud-risk-warning', 'fraud-risk-confirmation', 'abuse-report-reasons',\n 'abuse-report-details', 'user-feedback'\n];\n\nfunction Icon({children}) { return {children} ; }\n\nfunction Header({title, back}) {\n return { if (!HashNavigation.goBack()) navigate(back); }} aria-label=\"返回\">arrow_back_ios_new {title} ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2200);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\n// Backend has no \"content risk scan\" or \"post-send fraud alert\" mechanism (confirmed against\n// im_be/server/im_http.go and session.go -- grepping for 诈骗/反诈/110/fraud in the whole backend\n// only turns up abuse-report reason labels, no scanning logic and no system-notification event type\n// for it). The two reference images (反诈弹窗(安卓).png / 反诈弹窗(二次提示安卓).png) show generic\n// anti-fraud education content that isn't tied to any specific message or backend-driven trigger --\n// there's no field anywhere (bootstrap, profile, settings) indicating \"has this been shown before\".\n// So this is implemented as a standalone, always-reachable safety-info page (not something that\n// pops up automatically), reusing the two designs' content/copy verbatim for their real interactive\n// counterpart: the pre-send URL risk check below (RiskConfirmDialog), which DOES have a real backend\n// (POST /security/urls/check + POST /security/risk-challenges/{id}/confirm).\nfunction FraudAwareness({secondary}) {\n // 这里必须带上 risk-dialog:本页的 ul/li/aside/.risk-emphasis/button.primary 全部样式都挂在\n // base.css 的 .risk-dialog 下(14 条规则),而 .risk-info-page 在 base.css 里一条规则都没有——\n // 只写 risk-info-page 的话整页会渲染成带原生项目符号的裸列表。\n // 图标名也修正了:shield_lock 只存在于 Material Symbols,index.html 加载的是经典 Material Icons,\n // 那套字体里没有这个字形,会原样显示 \"shield_lock\" 这串文本。改用仓库已在用的 verified_user。\n return \n {secondary ? 'warning_amber' : 'verified_user'} \n {secondary ? <>\n 您发送的内容可能涉及诈骗风险,请注意甄别。
\n 切勿轻信陌生人的投资理财、兼职刷单、网络贷款等信息,谨防上当受骗。
\n phone_in_talk 如遇诈骗请立即拨打 110 报警。 \n > : <>\n 为保障您的账号及资金安全,请您注意:
\n \n receipt_long 不参与刷单返利活动 \n currency_yuan 不轻信高收益投资、理财信息 \n person_off 不出租、出借、出售账号及实名信息 \n lock 不向任何人泄露验证码、密码等敏感信息 \n \n 请提高安全防范意识,谨防电信网络诈骗。
\n >}\n navigate(secondary ? 'fraud-risk-warning' : 'personal-center')}>{secondary ? '我已知晓' : '我已阅读并知晓'} \n ;\n}\n\n// Exported for messages-view.jsx to render inline when composing a message that contains a URL --\n// this is the one piece of Ch.11 with a genuine backend mechanism behind it (checkURL/confirmRiskChallenge,\n// verified against im_http.go:1184-1285). `level`/`blocked` come straight from the checkURL response.\nexport function RiskConfirmDialog({level, blocked, onConfirm, onCancel}) {\n return \n {blocked ? 'block' : 'warning_amber'} \n 安全提醒 \n {blocked ? 检测到该内容存在较高安全风险,暂无法发送。
: <>\n 您发送的内容可能涉及诈骗风险,请注意甄别。
\n 切勿轻信陌生人的投资理财、兼职刷单、网络贷款等信息,谨防上当受骗。如遇诈骗请立即拨打 110 报警。
\n >}\n {blocked\n ? 我已知晓 \n : <>我已知晓,继续发送 取消发送 >}\n ;\n}\n\n// target_type is one of user/group/message only (verified against server/store/store.go's\n// AbuseReasons validation and im_http.go's normalizeIMAbuseTarget switch -- there is no\n// \"group_member\" variant server-side; reporting a group member uses target_type=user and simply\n// loses the \"which group\" context, which is a real backend limitation, not something fixable here).\nfunction ReportReasons({hashParams, onToast}) {\n const targetType = (hashParams && hashParams.target_type) || 'user';\n const targetName = (hashParams && hashParams.target_name) || '';\n const [reasons, setReasons] = React.useState(null);\n React.useEffect(() => {\n getAbuseReasons(targetType).then(data => setReasons(Array.isArray(data) ? data : (data && (data.reasons || data.items)) || []))\n .catch(err => { onToast(err.message || '加载失败'); setReasons([]); });\n }, [targetType]);\n const select = reason => navigate('abuse-report-details', {...hashParams, reason_code: reason.reason_code || reason.code, reason_label: reason.label, requires_description: reason.requires_description ? '1' : ''});\n {/* 'personal-center' made sense when contact-management-view.jsx's friend-settings page was the\n only entry point; tinode-web.jsx's handleReportTopic (block-and-report from inside a chat,\n which closes that chat before landing here) now also routes here, and for that origin\n 'personal-center' is a non-sequitur -- messages-home is a reasonable default for both. */}\n return \n {targetName ? account_circle 举报{targetName} 举报人身份不会向对方公开 : null}\n 请选择举报原因 \n {reasons === null ? 加载中…
: \n {reasons.map(reason => select(reason)}>\n {reason.label} chevron_right \n )}\n }\n ;\n}\n\nfunction ReportDetails({hashParams, tinode, onToast}) {\n const reasonLabel = (hashParams && hashParams.reason_label) || '';\n const reasonCode = (hashParams && hashParams.reason_code) || '';\n const requiresDescription = (hashParams && hashParams.requires_description) === '1';\n const [description, setDescription] = React.useState('');\n const [evidence, setEvidence] = React.useState([]);\n const [uploading, setUploading] = React.useState(false);\n const [submitting, setSubmitting] = React.useState(false);\n const [submitted, setSubmitted] = React.useState(null);\n const fileInputRef = React.useRef(null);\n\n const addEvidence = event => {\n const file = event.target.files && event.target.files[0];\n event.target.value = '';\n if (!file || !tinode) return;\n if (evidence.length >= 9) { onToast('最多上传 9 个证据文件'); return; }\n setUploading(true);\n uploadLargeFile(tinode, file).then(({fileId}) => setEvidence(items => items.concat({id: fileId, name: file.name})))\n .catch(err => onToast(err.message || '上传失败')).finally(() => setUploading(false));\n };\n\n const submit = () => {\n if (requiresDescription && !description.trim()) { onToast('请补充问题描述'); return; }\n const target = {type: hashParams.target_type || 'user'};\n if (hashParams.target_type === 'message') { target.topic = hashParams.topic; target.seq = String(hashParams.seq); }\n else if (hashParams.target_type === 'group') { target.topic = hashParams.topic || hashParams.target_id; }\n else { target.user_id = hashParams.target_id; }\n setSubmitting(true);\n submitAbuseReport({target, reason_code: reasonCode, description: description.trim(), evidence_file_ids: evidence.map(e => e.id)})\n .then(result => setSubmitted(result))\n .catch(err => onToast(err.message || '提交失败'))\n .finally(() => setSubmitting(false));\n };\n\n return \n {submitted ?
task_alt 举报已受理 我们会依据平台规则核实处理,举报人身份不会向被举报方公开。
受理编号 {submitted.report_id} navigate('messages-home')}>完成 \n :
\n 举报原因 {reasonLabel} navigate('abuse-report-reasons', hashParams)}>修改 \n 问题描述{requiresDescription ? * : null} setDescription(event.target.value)} placeholder=\"请描述具体情况、发生时间和相关行为\" />{description.length}/500 \n \n 证据材料 图片或文件,最多 9 个 {evidence.length}/9 \n \n {evidence.map(file =>
image {file.name} setEvidence(items => items.filter(item => item.id !== file.id))} aria-label=\"删除证据\">close )}\n
fileInputRef.current && fileInputRef.current.click()}>add_photo_alternate {uploading ? '上传中…' : '添加证据'} \n
\n
\n \n lock 证据仅用于平台审核,将按照安全策略保存和访问。 \n }\n {!submitted ?
{submitting ? '提交中…' : '提交举报'} : null}\n
;\n}\n\n// category is REQUIRED server-side (POST /feedback rejects empty category) but the reference image\n// (意见反馈.png) shows no category-selection UI at all -- picking a sensible default silently would\n// mean every feedback submission gets misfiled under one bucket. A minimal category picker is added\n// here (using the real categories from GET /feedback/config, not the mock's invented four-item list)\n// since it's a real, meaningful, backend-required field -- same judgment call as Ch.6's \"my nickname\n// in this group\" editor: no reference image, but a real backend capability worth a minimal UI for.\n// `contact` (image has no input for it) is left unset -- it's optional server-side, so omitting it\n// doesn't break the request, and adding a field the design never showed would be inventing UI.\nfunction UserFeedback({tinode, onToast}) {\n // Fixed/parameterless config (max files, categories, max length, diagnostics notice) reached from a\n // single entry point (personal-center's \"意见反馈\" row) off the same hub whose own profile fetch is\n // already cached -- seeding both `config` and its derived default `category` together from the same\n // cached object avoids a flash where the category picker renders (gated on `config` alone) with\n // nothing selected yet.\n const cachedFeedbackConfig = readCachedData('feedback-config');\n // Was its own useState + one-shot useEffect with no retry -- a failed first fetch with nothing\n // cached yet left `config` stuck at null for the rest of the page's life (the category picker\n // below never renders since it's gated on `config`, but content/submit stay visible the whole\n // time), and the only way out was a full page reload. Routing through useCachedData gets the same\n // \"one retry after 3s if there's truly nothing cached yet\" behavior bootstrap and friends already\n // have, for free.\n const [config] = useCachedData('feedback-config', getFeedbackConfig, []);\n const [category, setCategory] = React.useState(() => (cachedFeedbackConfig && cachedFeedbackConfig.categories && cachedFeedbackConfig.categories[0]) || '');\n const [content, setContent] = React.useState('');\n const [images, setImages] = React.useState([]);\n const [uploading, setUploading] = React.useState(false);\n const [diagnostics, setDiagnostics] = React.useState(false);\n const [submitting, setSubmitting] = React.useState(false);\n const [submitted, setSubmitted] = React.useState(null);\n const fileInputRef = React.useRef(null);\n const maxFiles = (config && config.attachment_policy && config.attachment_policy.max_files) || 5;\n const maxLength = (config && config.max_length) || 300;\n\n // Only fills in the default once, the first time a fetch (initial or the useCachedData retry)\n // actually resolves without one already picked synchronously above from a warm cache -- doesn't\n // clobber a category the user already changed.\n React.useEffect(() => {\n if (config && config.categories && config.categories.length && !category) {\n setCategory(config.categories[0]);\n }\n }, [config]);\n\n const CATEGORY_LABELS = {bug: '功能异常', suggestion: '产品建议', complaint: '服务投诉', other: '其他'};\n\n const addImage = event => {\n const file = event.target.files && event.target.files[0];\n event.target.value = '';\n if (!file || !tinode) return;\n if (images.length >= maxFiles) { onToast(`最多上传 ${maxFiles} 张图片`); return; }\n setUploading(true);\n uploadLargeFile(tinode, file).then(({fileId}) => setImages(items => items.concat({id: fileId})))\n .catch(err => onToast(err.message || '上传失败')).finally(() => setUploading(false));\n };\n\n const submit = () => {\n if (!content.trim()) { onToast('请填写反馈内容'); return; }\n // category is a required backend field (empty string 400s as MALFORMED_REQUEST) but the picker\n // that sets it only renders once `config` has loaded -- if getFeedbackConfig() is still in\n // flight or failed, `category` can still be '' here while content/submit stay visible the whole\n // time, so this needs its own explicit guard rather than relying on the picker having run.\n if (!category) { onToast('请选择反馈类型'); return; }\n setSubmitting(true);\n submitFeedback({category, content: content.trim(), attachment_file_ids: images.map(i => i.id), include_diagnostics: diagnostics})\n .then(result => setSubmitted(result))\n .catch(err => onToast(err.message || '提交失败'))\n .finally(() => setSubmitting(false));\n };\n\n if (submitted) return mark_email_read 反馈已受理 感谢你的反馈,我们会尽快查看并用于改进产品。
反馈编号 {submitted.feedback_id} navigate('personal-center')}>返回我的 ;\n\n return ;\n}\n\nexport default function SecuritySupportView({view, hashParams, tinode}) {\n const [toast, setToast] = React.useState('');\n let content;\n if (view === 'fraud-risk-warning' || view === 'fraud-risk-confirmation') content = ;\n else if (view === 'abuse-report-reasons') content = ;\n else if (view === 'abuse-report-details') content = ;\n else content = ;\n return <>{content} setToast('')} />>;\n}\n","// Tinode config panel.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport CheckBox from '../widgets/checkbox.jsx';\n\nimport HostSelector from '../widgets/host-selector.jsx';\n\nexport default class SettingsView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n transport: props.transport || 'def',\n serverAddress: props.serverAddress,\n secureConnection: props.secureConnection,\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleTransportSelected = this.handleTransportSelected.bind(this);\n this.handleServerAddressChange = this.handleServerAddressChange.bind(this);\n this.handleToggleSecure = this.handleToggleSecure.bind(this);\n }\n\n handleSubmit(e) {\n e.preventDefault();\n this.props.onUpdate({\n transport: this.state.transport,\n serverAddress: this.state.serverAddress,\n secureConnection: this.state.secureConnection,\n });\n }\n\n handleTransportSelected(e) {\n this.setState({transport: e.currentTarget.value});\n }\n\n handleServerAddressChange(name) {\n this.setState({serverAddress: name});\n }\n\n handleToggleSecure(e) {\n this.setState({secureConnection: !this.state.secureConnection});\n }\n\n render() {\n const names = {def: \"default\", ws: \"websocket\", lp: \"long polling\"};\n const transportOptions = [];\n ['def', 'ws', 'lp'].forEach(item => {\n const id = 'transport-' + item;\n const name = names[item];\n transportOptions.push(\n \n \n {name} \n \n );\n });\n\n return (\n \n \n \n \n \n
\n \n \n \n \n \n
\n \n \n \n \n
\n \n \n \n \n \n
\n \n );\n }\n};\n","import React, { Suspense } from 'react';\nimport { defineMessages, FormattedMessage, injectIntl } from 'react-intl';\n\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport SideNavbar from '../widgets/side-navbar.jsx';\nimport TopicCommonView from './topic-common-view.jsx';\nimport AuthOnboardingView from './auth-onboarding-view.jsx';\nimport MessageCenterView from './message-center-view.jsx';\nimport DirectMessageView from './direct-message-view.jsx';\nimport MessageComposerView, {MESSAGE_COMPOSER_VIEWS} from './message-composer-view.jsx';\nimport ContactManagementView, {CONTACT_MANAGEMENT_VIEWS} from './contact-management-view.jsx';\nimport GroupManagementView, {GROUP_MANAGEMENT_VIEWS} from './group-management-view.jsx';\nimport ContentLibraryView, {CONTENT_LIBRARY_VIEWS} from './content-library-view.jsx';\nimport CallExperienceView, {CALL_EXPERIENCE_VIEWS} from './call-experience-view.jsx';\nimport WorkplaceCollaborationView, {WORKPLACE_COLLABORATION_VIEWS} from './workplace-collaboration-view.jsx';\nimport PersonalSettingsView, {PERSONAL_SETTINGS_VIEWS} from './personal-settings-view.jsx';\nimport SecuritySupportView, {SECURITY_SUPPORT_VIEWS} from './security-support-view.jsx';\n\nconst AccountSettingsView = React.lazy(_ => import('./account-settings-view.jsx'));\nimport ContactsView from './contacts-view.jsx';\nconst CreateAccountView = React.lazy(_ => import('./create-account-view.jsx'));\nimport AccGeneralView from './acc-general-view.jsx';\nimport AccNotificationsView from './acc-notifications-view.jsx';\nconst AccSecurityView = React.lazy(_ => import('./acc-security-view.jsx'));\nimport AccSupportView from './acc-support-view.jsx';\nimport LoginView from './login-view.jsx';\nimport NewTopicView from './new-topic-view.jsx';\nconst PasswordResetView = React.lazy(_ => import('./password-reset-view.jsx'));\nimport SettingsView from './settings-view.jsx';\nimport ValidationView from './validation-view.jsx';\nconst WallpapersView = React.lazy(_ => import('./wallpapers.jsx'));\n\n// Panel titles for translation.\nconst messages = defineMessages({\n login: {\n id: 'sidepanel_title_login',\n description: 'Sidepanel title for LoginView.',\n defaultMessage: 'Sign In'\n },\n register: {\n id: 'sidepanel_title_register',\n description: 'Sidepanel title for CreateAccountView.',\n defaultMessage: 'Create Account'\n },\n settings: {\n id: 'sidepanel_title_settings',\n description: 'Sidepanel title for SettingsView.',\n defaultMessage: 'Settings'\n },\n edit: {\n id: 'sidepanel_title_account_settings',\n description: 'Sidepanel title for AccountSettingsView.',\n defaultMessage: 'Account Settings'\n },\n general: {\n id: 'panel_title_general',\n description: 'Title for TopicCommon.',\n defaultMessage: 'General'\n },\n security: {\n id: 'panel_title_security',\n description: 'Title for TopicSecirity and AccSecurity.',\n defaultMessage: 'Security'\n },\n crop: {\n id: 'panel_title_crop',\n description: 'Title for AvatarCropView.',\n defaultMessage: 'Drag to Adjust'\n },\n notif: {\n id: 'sidepanel_title_acc_notifications',\n description: 'Sidepanel title for AccNotificationsView.',\n defaultMessage: 'Notifications'\n },\n acc_general: {\n id: 'sidepanel_title_acc_general',\n description: 'Sidepanel title for AccGeneralView.',\n defaultMessage: 'General'\n },\n support: {\n id: 'sidepanel_title_acc_support',\n description: 'Sidepanel title for AccSupportView.',\n defaultMessage: 'Support'\n },\n newtpk: {\n id: 'sidepanel_title_newtpk',\n description: 'Sidepanel title for NewTopicView.',\n defaultMessage: 'Start New Chat'\n },\n cred: {\n id: 'sidepanel_title_cred',\n description: 'Sidepanel title for ValidationView.',\n defaultMessage: 'Confirm Credentials'\n },\n reset: {\n id: 'sidepanel_title_reset',\n description: 'Sidepanel title for PasswordResetView.',\n defaultMessage: 'Reset Password'\n },\n archive: {\n id: 'sidepanel_title_archive',\n description: 'Sidepanel title for ContactsView-Archive.',\n defaultMessage: 'Archived Chats'\n },\n blocked: {\n id: 'sidepanel_title_blocked',\n description: 'Sidepanel title for ContactsView-Blocked.',\n defaultMessage: 'Blocked Chats'\n },\n wallpapers: {\n id: 'wallpapers',\n description: 'Link or title for working with wallpapers.',\n defaultMessage: 'Wallpapers'\n }\n});\n\nclass SidepanelView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleNewTopic = this.handleNewTopic.bind(this);\n }\n\n handleNewTopic() {\n this.props.onNavigate('newtpk');\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n const view = this.props.state || (this.props.myUserId ? 'messages-home' : 'tenant');\n const chapterOneViews = ['tenant', 'login', 'enterprise-register', 'enterprise-feedback', 'register',\n 'reset', 'identity-check', 'realname', 'realname-verified', 'realname-reminder', 'independent-password'];\n\n if (chapterOneViews.includes(view)) {\n return ;\n }\n\n const chapterTwoViews = ['messages-home', 'messages-offline', 'messages-menu', 'message-actions', 'system-messages'];\n if (chapterTwoViews.includes(view)) {\n const fullPage = !this.props.myUserId || view !== 'messages-home';\n return \n \n
;\n }\n\n const chapterThreeViews = ['chat-inbound-request', 'chat-inbound-message', 'chat-outbound-request',\n 'chat-status', 'chat-friend', 'chat-media', 'chat-blocked', 'chat-deleted', 'chat-standard',\n 'chat-attachments', 'chat-mixed', 'chat-contact-card'];\n if (chapterThreeViews.includes(view)) {\n return \n \n
;\n }\n\n if (MESSAGE_COMPOSER_VIEWS.includes(view)) {\n return \n \n
;\n }\n\n if (CONTACT_MANAGEMENT_VIEWS.includes(view)) {\n return \n \n
;\n }\n\n if (GROUP_MANAGEMENT_VIEWS.includes(view)) {\n return \n \n
;\n }\n\n if (CONTENT_LIBRARY_VIEWS.includes(view)) {\n return \n \n
;\n }\n\n if (CALL_EXPERIENCE_VIEWS.includes(view)) {\n return \n \n
;\n }\n\n if (WORKPLACE_COLLABORATION_VIEWS.includes(view)) {\n return \n \n
;\n }\n\n if (PERSONAL_SETTINGS_VIEWS.includes(view)) {\n return ;\n }\n\n if (SECURITY_SUPPORT_VIEWS.includes(view)) {\n return \n \n
;\n }\n\n let title, avatar, badges;\n if (view == 'contacts') {\n title = this.props.title;\n avatar = this.props.avatar ? this.props.avatar : true;\n badges = this.props.trustedBadges;\n } else {\n title = formatMessage(messages[view]);\n avatar = false;\n badges = null;\n }\n\n let onCancel;\n if (['login', 'contacts'].indexOf(view) == -1) {\n onCancel = this.props.onCancel;\n }\n\n return (\n \n \n\n \n\n \n\n {view === 'login' ?\n :\n\n view === 'register' ?\n
}>\n \n :\n\n view === 'settings' ?\n :\n\n view === 'edit' ?\n }>\n \n :\n\n (view === 'general' || view === 'crop') ?\n :\n\n view === 'acc_general' ?\n :\n\n view === 'notif' ?\n :\n\n view === 'security' ?\n }>\n \n :\n\n view === 'support' ?\n :\n\n view === 'wallpapers' ?\n }>\n \n :\n\n (view === 'contacts' || view == 'archive' || view == 'blocked') ?\n :\n\n view === 'newtpk' ?\n :\n\n view === 'cred' ?\n :\n\n view === 'reset' ?\n }>\n \n :\n null}\n \n );\n }\n};\n\nexport default injectIntl(SidepanelView);\n","// The top-level class to hold all functionality together.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { initializeApp as firebaseInitApp } from 'firebase/app';\nimport { getMessaging as firebaseGetMessaging, getToken as firebaseGetToken,\n deleteToken as firebaseDelToken, onMessage as firebaseOnMessage } from 'firebase/messaging';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Alert from '../widgets/alert.jsx';\nimport ContextMenu from '../widgets/context-menu.jsx';\nimport ForwardDialog from '../widgets/forward-dialog.jsx';\nimport BatchForwardDialog from '../widgets/batch-forward-dialog.jsx';\nimport CallIncoming from '../widgets/call-incoming.jsx';\nimport QrScanner, { GroupJoinPreview } from '../widgets/qr-scanner.jsx';\nconst PhoneCountrySelector = React.lazy(_ => import('../widgets/phone-country-selector.jsx'));\n\nconst InfoView = React.lazy(_ => import('./info-view.jsx'));\nconst MessagesView = React.lazy(_ => import('./messages-view.jsx'));\nimport SidepanelView from './sidepanel-view.jsx';\n\nimport { API_KEY, APP_NAME, BASE_APP_NAME, DEFAULT_COLOR_SCHEME, DEFAULT_P2P_ACCESS_MODE, DEFAULT_TEXT_SIZE, FORWARDED_PREVIEW_LENGTH,\n LOGGING_ENABLED, MEDIA_BREAKPOINT, WAKE_UP_TICK, WAKE_UP_TIMEOUT } from '../config.js';\nimport { CALL_STATE_NONE, CALL_STATE_OUTGOING_INITATED,\n CALL_STATE_INCOMING_RECEIVED, CALL_STATE_IN_PROGRESS,\n CALL_HEAD_STARTED } from '../constants.js';\nimport { PACKAGE_VERSION } from '../version.js';\nimport { base64ReEncode, makeImageUrl } from '../lib/blob-helpers.js';\nimport { detectServerAddress, isLocalHost, isSecureConnection } from '../lib/host-name.js';\nimport LocalStorageUtil from '../lib/local-storage.js';\nimport { getTenantContext, resolveQRCode, createGroupJoinRequest, getBootstrap } from '../lib/im-api.js';\nimport { readCachedData, writeCachedData } from '../lib/use-cached-data.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { secondsToTime } from '../lib/strformat.js'\nimport { defaultWallpaper, theCard, topicDisplayName, updateFavicon } from '../lib/utils.js';\n\n// Sound to play on message received.\nconst POP_SOUND = new Audio('audio/msg.m4a');\n\nconst messages = defineMessages({\n reconnect_countdown: {\n id: 'reconnect_countdown',\n defaultMessage: 'Disconnected. Reconnecting in {seconds}…',\n description: 'Message shown when an app update is available.'\n },\n reconnect_now: {\n id: 'reconnect_now',\n defaultMessage: 'Try now',\n description: 'Prompt for reconnecting now'\n },\n push_init_failed: {\n id: 'push_init_failed',\n defaultMessage: 'Failed to initialize push notifications',\n description: 'Error message when push notifications have failed to initialize.'\n },\n invalid_security_token: {\n id: 'invalid_security_token',\n defaultMessage: 'Invalid security token',\n description: 'Error message when resetting password.'\n },\n no_connection: {\n id: 'no_connection',\n defaultMessage: 'No connection',\n description: 'Warning that the user is offline.'\n },\n code_doesnot_match: {\n id: 'code_doesnot_match',\n defaultMessage: 'Code does not match',\n description: 'Error message when the credential validation code is incorrect.'\n },\n menu_item_info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n menu_item_audio_call: {\n id: 'menu_item_audio_call',\n defaultMessage: 'Call',\n description: 'Start audio call'\n },\n menu_item_video_call: {\n id: 'menu_item_video_call',\n defaultMessage: 'Video call',\n description: 'Start video call'\n },\n cred_confirmed_successfully: {\n id: 'cred_confirmed_successfully',\n defaultMessage: 'Confirmed successfully',\n description: 'Notification message that the credential was successfully validated.'\n },\n password_reset_success: {\n id: 'password_reset_success',\n defaultMessage: 'Password reset successfully',\n description: 'Notification message that the password was successfully reset.'\n },\n select_country: {\n id: 'select_country',\n defaultMessage: 'Select country',\n description: 'Placeholder for the country selector'\n }\n});\n\n// 全部合法的侧栏视图名。抽成模块级常量而不是内联在 handleHashRoute 里,是因为初始化时的\n// \"要不要保留 hash\" 判断也需要同一份名单——那里原来写的是上游 Tinode 遗留的\n// ['cred','reset','register'] 三个名字,本工程新增的上百个路由一个都不在里面,导致带任何新路由的\n// 地址刷新/深链进入都会被 navigateTo('') 清空 hash 弹回首页。\nconst SIDE_PANEL_VIEWS = ['acc_general','archive','blocked','contacts','cred','crop','edit','general',\n 'newtpk','notif','register','reset','security','settings','support','wallpapers',\n 'tenant','login','enterprise-register','enterprise-feedback','identity-check',\n 'realname','realname-verified','realname-reminder','independent-password',\n 'messages-home','messages-offline','messages-menu','message-actions','system-messages',\n 'chat-inbound-request','chat-inbound-message','chat-outbound-request','chat-status',\n 'chat-friend','chat-media','chat-blocked','chat-deleted','chat-standard',\n 'chat-attachments','chat-mixed','chat-contact-card',\n 'compose-keyboard','mentions-select','mentions-complete','mentions-message',\n 'emoji-panel','emoji-message','voice-ready','voice-hold','voice-recording',\n 'media-uploading','media-gallery','media-retry','upload-file','file-message',\n 'message-multiselect','favorite-success','forward-select','forward-multiple',\n 'forward-individual','forward-bundle',\n 'address-book','friend-requests','add-friend','my-friend-qr','friend-qr','friend-search-result',\n 'friend-verification','friend-profile','group-member-profile','friend-settings',\n 'friend-settings-blocked','friend-delete-confirm','block-list','block-confirm','clear-chat-confirm',\n 'group-list','group-empty','group-invite','group-events','group-join-requests',\n 'group-new-request','group-announcement','group-summary','group-announcement-detail',\n 'group-settings','group-profile','group-avatar','group-nickname','group-description',\n 'group-my-nickname','group-members','group-role-message','group-qr','group-governance','group-admins','group-admin-add',\n 'group-admin-success','group-admin-partial','group-admin-removed','group-mute-add',\n 'group-muted','group-owner-select','group-owner-confirm','group-files','group-file-upload',\n 'favorites','favorites-mixed','favorites-files','favorites-text','favorites-voice',\n 'favorites-links','favorites-image','favorites-video','favorites-select','favorite-share','file-download','file-downloading',\n 'file-downloaded','history-search','history-files','history-links','history-images','history-videos',\n 'call-history','call-incoming','audio-call-ringing','audio-call-active','audio-call-muted',\n 'audio-call-speaker','video-call-ringing','video-call-camera-off','video-call-active',\n 'video-call-peer-camera-off','call-minimized',\n 'workbench','organization-directory','meeting-organizer','meeting-attendee',\n 'meeting-create','meeting-detail',\n 'daily-report-editor','daily-report-mine','daily-report-team','daily-report-detail',\n 'monthly-report-editor','monthly-report-mine','monthly-report-team','monthly-report-detail',\n 'executive-mailbox','executive-mailbox-notice',\n 'personal-center','personal-profile','profile-nickname','profile-birth-date',\n 'profile-signature','profile-gender','profile-region','personal-qrcode','android-settings',\n 'cache-clear-confirm','clear-history-confirm','change-password','delete-account-confirm',\n 'app-version','privacy-settings','friend-discovery-settings',\n 'youth-mode-off','youth-mode-on','youth-mode-verify',\n 'notification-permission','permission-settings-reminder','camera-permission-info',\n 'microphone-permission-info',\n 'fraud-risk-warning','fraud-risk-confirmation','abuse-report-reasons',\n 'abuse-report-details','user-feedback',\n ''];\n\n// 登录流程本身的页面。从这些页面登录成功后应该落到工作台;从任何其它页面(刷新触发的自动登录)\n// 则应该留在原处。\nconst AUTH_FLOW_VIEWS = ['tenant', 'login', 'register', 'reset', 'cred',\n 'enterprise-register', 'enterprise-feedback'];\n\n// Tinode 原生 WS 登录失败走的是 {ctrl} 协议,不是 REST 层——im-api.js 里那张\n// REASON_MESSAGES 翻译表只在 REST 请求里生效,这条路径完全绕开它。ctrl.text 是服务端\n// datamodel.go 里固定的英文串(authentication failed / unknown authentication scheme 等),\n// ctrl.params 里也没有像 REST 层那样稳定的 reason 字段可用(已实测确认)。\n// 原来这里直接把 err.message 原样显示,登录密码打错用户看到的是英文 \"authentication failed\",\n// 不是参考图要求的\"账号或密码错误\"。\n//\n// 这张表原来按 err.message 精确匹配裸文案——但 tinode-sdk 的 CommError 构造时会把状态码拼进\n// message 里(\"authentication failed (401)\"),导致这张表实际上从未真正命中过:'authentication\n// failed' 之所以看起来工作正常,纯粹是因为紧接着的 401/403 兜底分支凑巧给出了同一句译文,掩盖\n// 了匹配从未成立这件事;一旦命中 'unknown authentication scheme'(401,跟密码错误共用同一个状态\n// 码,会被兜底分支误判成\"账号或密码错误\")或 'policy violation'(422,不在兜底范围内)这两种更\n//少见的场景,用户就会看到带着 \"(状态码)\" 尾巴的原始英文。translateCtrlError 先去掉这段状态码\n// 后缀再查表,两个问题一并解决。\n//\n// 同一张表也被 handleDisconnect 复用,用来翻译 {hi} 阶段(登录请求发出之前)的连接失败——那个\n// 场景下 permission denied 最常见的真实原因是租户被停用,不是\"账号或密码错误\",所以只在这里放\n// 一份不带 401/403 兜底的裸翻译(loginErrorMessage 自己的兜底只应用在真正的登录尝试上)。\nconst CTRL_ERROR_TEXT_CN = {\n 'authentication failed': '账号或密码错误',\n 'authentication required': '请先登录',\n 'unknown authentication scheme': '登录方式不受支持,请刷新页面重试',\n 'policy violation': '当前操作不符合安全策略要求',\n 'permission denied': '没有权限执行此操作,请重新登录'\n};\nfunction translateCtrlError(err) {\n const raw = err && err.message;\n if (!raw) return null;\n const normalized = raw.replace(/\\s*\\(\\d+\\)\\s*$/, '').trim().toLowerCase();\n return CTRL_ERROR_TEXT_CN[normalized] || null;\n}\nfunction loginErrorMessage(err) {\n const known = translateCtrlError(err);\n if (known) return known;\n // 未知文案时按状态码兜底,401/403 绝大多数场景就是账号或密码错误\n if (err && (err.code === 401 || err.code === 403)) return '账号或密码错误';\n return (err && err.message) || '登录失败,请重试';\n}\n// navigateToCredentialsView 拒绝导航时,ctrl.params.reason 用来给用户一句能看懂的话——目前只有\n// INVITE_CODE_INVALID/INVITE_CODE_REQUIRED 两个真实用真实请求验证过,REVOKED/EXPIRED 是同一命名\n// 规律下合理的兄弟值,未逐一实测,先按同一套文案兜底,不影响已确认的两个分支。\nconst INVITE_CODE_REASON_TEXT_CN = {\n INVITE_CODE_REQUIRED: '请填写邀请码',\n INVITE_CODE_INVALID: '邀请码错误,请重新输入',\n INVITE_CODE_REVOKED: '邀请码已被撤销,请联系管理员获取新的邀请码',\n INVITE_CODE_EXPIRED: '邀请码已过期,请联系管理员获取新的邀请码'\n};\nfunction invalidCredentialsReasonMessage(params) {\n const reason = params && params.reason;\n return (reason && INVITE_CODE_REASON_TEXT_CN[reason]) || '注册信息校验未通过,请检查后重试';\n}\n\n// See armCallRingTimeout below.\nconst CALL_RING_TIMEOUT_MS = 60000;\n\nclass TinodeWeb extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n this.state = this.getBlankState();\n\n this.handleResize = this.handleResize.bind(this);\n this.handleHashRoute = this.handleHashRoute.bind(this);\n this.handleOnline = this.handleOnline.bind(this);\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleColorSchemeChange = this.handleColorSchemeChange.bind(this);\n this.checkForAppUpdate = this.checkForAppUpdate.bind(this);\n this.handleVisibilityEvent = this.handleVisibilityEvent.bind(this);\n this.handleError = this.handleError.bind(this);\n this.handleLoginRequest = this.handleLoginRequest.bind(this);\n this.handlePersistenceChange = this.handlePersistenceChange.bind(this);\n this.handleConnected = this.handleConnected.bind(this);\n this.handleAutoreconnectIteration = this.handleAutoreconnectIteration.bind(this);\n this.doLogin = this.doLogin.bind(this);\n this.handleLoginSuccessful = this.handleLoginSuccessful.bind(this);\n this.handleTenantResolved = this.handleTenantResolved.bind(this);\n this.handleDisconnect = this.handleDisconnect.bind(this);\n this.tnMeMetaDesc = this.tnMeMetaDesc.bind(this);\n this.tnMeContactUpdate = this.tnMeContactUpdate.bind(this);\n this.tnMeSubsUpdated = this.tnMeSubsUpdated.bind(this);\n this.resetContactList = this.resetContactList.bind(this);\n this.tnInitFind = this.tnInitFind.bind(this);\n this.tnFndSubsUpdated = this.tnFndSubsUpdated.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleTopicSelected = this.handleTopicSelected.bind(this);\n this.handleHideMessagesView = this.handleHideMessagesView.bind(this);\n this.handleSendMessage = this.handleSendMessage.bind(this);\n this.handleNewChatInvitation = this.handleNewChatInvitation.bind(this);\n this.handleNewAccount = this.handleNewAccount.bind(this);\n this.handleNewAccountRequest = this.handleNewAccountRequest.bind(this);\n this.handleImRegisterRequest = this.handleImRegisterRequest.bind(this);\n this.handleUpdatePasswordRequest = this.handleUpdatePasswordRequest.bind(this);\n this.handleUpdateAccountTagsRequest = this.handleUpdateAccountTagsRequest.bind(this);\n this.handleToggleIncognitoMode = this.handleToggleIncognitoMode.bind(this);\n this.handleChangeColorSchema = this.handleChangeColorSchema.bind(this);\n this.handleChangeTextSize = this.handleChangeTextSize.bind(this);\n this.handleSendOnEnter = this.handleSendOnEnter.bind(this);\n this.handleSelectWallpapers = this.handleSelectWallpapers.bind(this);\n this.handleWallpaperSelected = this.handleWallpaperSelected.bind(this);\n this.handleSettings = this.handleSettings.bind(this);\n this.handleGlobalSettings = this.handleGlobalSettings.bind(this);\n this.handleShowArchive = this.handleShowArchive.bind(this);\n this.handleShowBlocked = this.handleShowBlocked.bind(this);\n this.handleToggleMessageSounds = this.handleToggleMessageSounds.bind(this);\n this.handleCredAdd = this.handleCredAdd.bind(this);\n this.handleCredDelete = this.handleCredDelete.bind(this);\n this.handleCredConfirm = this.handleCredConfirm.bind(this);\n this.initFCMessaging = this.initFCMessaging.bind(this);\n this.toggleFCMToken = this.toggleFCMToken.bind(this);\n this.handlePushMessage = this.handlePushMessage.bind(this);\n this.handleSidepanelCancel = this.handleSidepanelCancel.bind(this);\n this.handleStartTopicRequest = this.handleStartTopicRequest.bind(this);\n this.handleNewTopicCreated = this.handleNewTopicCreated.bind(this);\n this.handleTopicUpdateRequest = this.handleTopicUpdateRequest.bind(this);\n this.handleUnarchive = this.handleUnarchive.bind(this);\n this.handleChangePermissions = this.handleChangePermissions.bind(this);\n this.handleTagsUpdateRequest = this.handleTagsUpdateRequest.bind(this);\n this.handleLogout = this.handleLogout.bind(this);\n this.handleDeleteAccount = this.handleDeleteAccount.bind(this);\n this.handleDeleteTopicRequest = this.handleDeleteTopicRequest.bind(this);\n this.handleDeleteMessagesRequest = this.handleDeleteMessagesRequest.bind(this);\n this.handleLeaveUnsubRequest = this.handleLeaveUnsubRequest.bind(this);\n this.handleBlockTopicRequest = this.handleBlockTopicRequest.bind(this);\n this.handleReportTopic = this.handleReportTopic.bind(this);\n this.handleShareTheCard = this.handleShareTheCard.bind(this);\n this.handleShowContextMenu = this.handleShowContextMenu.bind(this);\n this.defaultTopicContextMenu = this.defaultTopicContextMenu.bind(this);\n this.handleHideContextMenu = this.handleHideContextMenu.bind(this);\n this.handleShowAlert = this.handleShowAlert.bind(this);\n this.handleShowInfoView = this.handleShowInfoView.bind(this);\n this.handleMemberUpdateRequest = this.handleMemberUpdateRequest.bind(this);\n this.handleValidateCredentialsRequest = this.handleValidateCredentialsRequest.bind(this);\n this.handlePasswordResetRequest = this.handlePasswordResetRequest.bind(this);\n this.handleResetPassword = this.handleResetPassword.bind(this);\n this.handleContextMenuAction = this.handleContextMenuAction.bind(this);\n this.handleShowCountrySelector = this.handleShowCountrySelector.bind(this);\n\n this.handleShowForwardDialog = this.handleShowForwardDialog.bind(this);\n this.handleHideForwardDialog = this.handleHideForwardDialog.bind(this);\n\n this.handleEnterSelectMode = this.handleEnterSelectMode.bind(this);\n this.handleToggleMessageSelect = this.handleToggleMessageSelect.bind(this);\n this.handleExitSelectMode = this.handleExitSelectMode.bind(this);\n this.handleShowBatchForward = this.handleShowBatchForward.bind(this);\n this.handleHideBatchForward = this.handleHideBatchForward.bind(this);\n\n this.handleOpenScanner = this.handleOpenScanner.bind(this);\n this.handleCloseScanner = this.handleCloseScanner.bind(this);\n this.handleQrDetected = this.handleQrDetected.bind(this);\n this.handleSubmitGroupJoinRequest = this.handleSubmitGroupJoinRequest.bind(this);\n this.handleCancelGroupJoinPreview = this.handleCancelGroupJoinPreview.bind(this);\n\n this.handleStartVideoCall = this.handleStartVideoCall.bind(this);\n this.handleStartAudioCall = this.handleStartAudioCall.bind(this);\n this.handleInfoMessage = this.handleInfoMessage.bind(this);\n this.handleDataMessage = this.handleDataMessage.bind(this);\n this.handleCallClose = this.handleCallClose.bind(this);\n\n this.handleCallInvite = this.handleCallInvite.bind(this);\n this.handleCallRinging = this.handleCallRinging.bind(this);\n this.handleCallHangup = this.handleCallHangup.bind(this);\n this.handleCallSendOffer = this.handleCallSendOffer.bind(this);\n this.handleCallIceCandidate = this.handleCallIceCandidate.bind(this);\n this.handleCallSendAnswer = this.handleCallSendAnswer.bind(this);\n\n this.handleCallAccept = this.handleCallAccept.bind(this);\n\n this.sendMessageToTopic = this.sendMessageToTopic.bind(this);\n\n // FIXME: this is unused.\n this.callTimeoutTimer = null;\n }\n\n getBlankState() {\n const settings = LocalStorageUtil.getObject('settings') || {};\n const persist = !!LocalStorageUtil.getObject('keep-logged-in');\n if (!settings.wallpaper) {\n const wallpaper = defaultWallpaper();\n settings.wallpaper = wallpaper.name || '';\n settings.wallpaperSize = wallpaper.size || 0;\n settings.wallpaperBlur = 0;\n }\n return {\n connected: false,\n // Connected and subscribed to 'me'\n ready: false,\n // Try to re-login on new connection.\n autoLogin: false,\n transport: settings.transport || null,\n serverAddress: settings.serverAddress || detectServerAddress(),\n secureConnection: settings.secureConnection === undefined ?\n isSecureConnection() : settings.secureConnection,\n serverVersion: \"no connection\",\n // \"On\" is the default, so saving the \"off\" state.\n messageSounds: !settings.messageSoundsOff,\n incognitoMode: false,\n // Manually selected color scheme. Default: 'system default' ('auto').\n colorSchema: settings.colorSchema || DEFAULT_COLOR_SCHEME,\n systemColorSchema: window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light',\n // Wallpaper settings.\n wallpaper: settings.wallpaper,\n wallpaperSize: settings.wallpaperSize,\n wallpaperBlur: 0,\n // Text size in points. Default size: 10pt\n textSize: settings.textSize || DEFAULT_TEXT_SIZE,\n // Default: 'plain' (just Enter)\n sendOnEnter: settings.sendOnEnter || 'plain',\n // Persistent request to enable alerts.\n desktopAlerts: persist && !!settings.desktopAlerts,\n // Enable / disable checkbox.\n desktopAlertsEnabled: (isSecureConnection() || isLocalHost()) &&\n (typeof firebaseInitApp != 'undefined') && (typeof navigator != 'undefined') &&\n (typeof FIREBASE_INIT != 'undefined'),\n firebaseToken: persist ? LocalStorageUtil.getObject('firebase-token') : null,\n\n applicationVisible: !document.hidden,\n\n errorText: '',\n errorLevel: null,\n errorAction: undefined,\n errorActionText: null,\n\n sidePanelSelected: 'tenant',\n sidePanelParams: {},\n sidePanelTitle: null,\n sidePanelAvatar: null,\n myTrustedBadges: [],\n loadSpinnerVisible: false,\n\n login: '',\n password: '',\n persist: persist,\n myUserId: null,\n liveConnection: navigator.onLine,\n topicSelected: '',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n newTopicParams: null,\n loginDisabled: false,\n displayMobile: (window.innerWidth <= MEDIA_BREAKPOINT),\n infoPanel: undefined,\n mobilePanel: 'sidepanel',\n\n // Video calls.\n callTopic: undefined,\n callState: CALL_STATE_NONE,\n callAudioOnly: undefined,\n // If true, call state should be transitioned to CALL_STATE_IN_PROGRESS upon\n // switching to the call topic.\n callShouldStart: false,\n\n contextMenuVisible: false,\n contextMenuBounds: null,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuItems: [],\n\n forwardDialogVisible: false,\n forwardMessage: null,\n\n // Ch.4 multi-select: entered via the message context menu's \"menu_item_select\" item.\n selectMode: false,\n selectModeTopic: null,\n selectedSeqs: [],\n batchForwardVisible: false,\n\n // QR scanning (\"扫一扫\", Ch.2/5). Holds live camera state so it's modeled the same way as\n // the call panel/forward dialog above, not as a hash route -- there's nothing to deep-link\n // into mid-scan, and the camera stream needs a reliable single owner to tear down.\n scannerOpen: false,\n // Set once a \"join_group\" QR resolves to a real group the user isn't in yet (status\n // \"can_request\") -- holds enough of the group's summary to render the confirm sheet, plus\n // the scanned token so the join request can reference how it was created.\n groupJoinPreview: null,\n\n // Modal alert dialog.\n alertVisible: false,\n alertParams: {},\n\n // Chats as shown in the ContactsView\n chatList: [],\n // Contacts returned by a search query.\n searchResults: [],\n // Merged results of a search query and p2p chats.\n searchableContacts: [],\n // Credential validation.\n reqCredMethod: undefined,\n credMethod: undefined,\n credCode: undefined,\n credToken: undefined,\n // Topic to go to after login.\n requestedTopic: undefined\n };\n }\n\n componentDidMount() {\n window.addEventListener('resize', this.handleResize);\n this.handleOnlineOn = _ => { this.handleOnline(true); }\n window.addEventListener('online', this.handleOnlineOn);\n this.handleOnlineOff = _ => { this.handleOnline(false); }\n window.addEventListener('offline', this.handleOnlineOff);\n window.addEventListener('hashchange', this.handleHashRoute);\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', this.handleColorSchemeChange);\n\n // Window/tab visible or invisible for pausing timers.\n document.addEventListener('visibilitychange', this.handleVisibilityEvent);\n\n // Listen for Escape key to clear selections.\n document.addEventListener('keydown', this.handleEscapeKey);\n\n document.documentElement.style.colorScheme = this.state.colorSchema == 'auto' ? 'light dark' : this.state.colorSchema;\n document.documentElement.style.setProperty('--message-text-size', `${this.state.textSize}pt`);\n\n this.applyWallpaperSettings(this.state.wallpaper, this.state.wallpaperSize, this.state.wallpaperBlur,\n this.state.colorSchema == 'auto' ? this.state.systemColorSchema : this.state.colorSchema);\n\n // Process background notifications from the service worker.\n if (typeof BroadcastChannel == 'function') {\n const serviceWorkerChannel = new BroadcastChannel('tinode-sw');\n serviceWorkerChannel.addEventListener('message', this.handlePushMessage);\n } else {\n // Safari is broken by design.\n console.warn(\"Your browser does not support BroadcastChannel. Some features will not be available\");\n }\n\n // Detect if computer just woke up from sleep. Checks how much time has passed since the last tick.\n // If too much time has passed then the computer was asleep.\n this.lastWakeUpCheck = new Date().getTime();\n this.wakeUpTicker = setInterval(_ => {\n const now = new Date().getTime();\n if (now - this.lastWakeUpCheck > WAKE_UP_TIMEOUT) {\n // Trigger reconnect.\n this.handleOnlineOn();\n }\n this.lastWakeUpCheck = now;\n }, WAKE_UP_TICK);\n\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n\n new Promise((resolve, reject) => {\n // Must match state.secureConnection's own fallback (line ~233), not just isSecureConnection()\n // directly -- otherwise a tenant resolved on a prior visit (which persists secureConnection via\n // handleTenantResolved) diverges from the client actually constructed here on this load, and\n // handleTenantResolved's own \"did anything change\" check (comparing against this same state)\n // then wrongly concludes there's nothing to reconnect.\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, this.state.secureConnection, this.state.transport,\n this.props.intl.locale, this.state.persist, resolve);\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n }).then(_ => {\n // Initialize desktop alerts.\n if (this.state.desktopAlertsEnabled) {\n this.initFCMessaging().catch(_ => {\n // do nothing: handled earlier.\n // catch needed to pervent unnecessary logging of error.\n });\n }\n\n // Read contacts from cache.\n this.resetContactList();\n\n const token = this.state.persist ? LocalStorageUtil.getObject('auth-token') : undefined;\n if (token) {\n this.setState({autoLogin: true});\n\n // When reading from storage, date is returned as string.\n token.expires = new Date(token.expires);\n this.tinode.setAuthToken(token);\n this.tinode.connect().catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n\n // Parse the hash navigation params.\n const parsedNav = HashNavigation.parseUrlHash(window.location.hash);\n // Maybe navigate to home screen.\n if (!SIDE_PANEL_VIEWS.includes(parsedNav.path[0]) || !parsedNav.path[0]) {\n // Save possible topic name.\n this.setState({requestedTopic: parsedNav.path[1]});\n const path = parsedNav.params && parsedNav.params.cred_done ?\n HashNavigation.addUrlParam('', 'cred_done', parsedNav.params.cred_done):\n '';\n HashNavigation.navigateTo(path);\n } else {\n this.handleHashRoute();\n }\n });\n }\n\n componentWillUnmount() {\n window.removeEventListener('resize', this.handleResize);\n window.removeEventListener('hashchange', this.handleHashRoute);\n window.removeEventListener('online', this.handleOnlineOn);\n window.removeEventListener('offline', this.handleOnlineOff);\n window.matchMedia('(prefers-color-scheme: dark)').removeEventListener('change', this.handleColorSchemeChange);\n document.removeEventListener('visibilitychange', this.handleVisibilityEvent);\n document.removeEventListener('keydown', this.handleEscapeKey);\n\n clearInterval(this.wakeUpTicker);\n }\n\n // Setup transport (usually websocket) and server address. This will terminate connection with the server.\n static tnSetup(serverAddress, secureConnection, transport, locale, persistentCache, onSetupCompleted) {\n const tinode = new Tinode({appName: APP_NAME, host: serverAddress, apiKey: API_KEY, transport: transport,\n secure: secureConnection, persist: persistentCache}, onSetupCompleted);\n tinode.setHumanLanguage(locale);\n tinode.enableLogging(LOGGING_ENABLED, true);\n TinodeWeb.installTenantHiPatch(tinode);\n return tinode;\n }\n\n // The server extends two stock packets with fields the JS SDK has no API for (server/datamodel.go):\n // MsgClientHi.Tenant (`hi.tenant`, resolved via POST /v1/im/tenants/resolve) and MsgClientAcc's\n // `username`/`phone`/`invite_code` (used by server/user.go replyCreateUser during registration).\n // #initPacket is a private class field so the only usable hook is wrapping the connection's sendText\n // and injecting fields into the outgoing packet's already-serialized JSON. A cheap substring check\n // keeps this a no-op for the hot path (every {pub}/{note}/... also goes through sendText).\n static installTenantHiPatch(tinode) {\n const conn = tinode && tinode._connection;\n if (!conn || conn.__tenantPatched) {\n return;\n }\n const original = conn.sendText.bind(conn);\n conn.sendText = msg => {\n if (typeof msg == 'string' && (msg.indexOf('\"hi\":') >= 0 || msg.indexOf('\"acc\":') >= 0)) {\n try {\n const parsed = JSON.parse(msg);\n if (parsed.hi) {\n const tenant = getTenantContext();\n if (tenant && tenant.code) {\n parsed.hi.tenant = tenant.code;\n msg = JSON.stringify(parsed);\n }\n } else if (parsed.acc && tinode.__pendingAccExtra) {\n Object.assign(parsed.acc, tinode.__pendingAccExtra);\n tinode.__pendingAccExtra = null;\n msg = JSON.stringify(parsed);\n }\n } catch (e) {\n // Not valid JSON -- send as is.\n }\n }\n return original(msg);\n };\n conn.__tenantPatched = true;\n }\n\n // Tinode received a push notification from the server.\n handlePushMessage(payload) {\n this.tinode.oobNotification(payload.data || {});\n }\n\n initFCMessaging() {\n const {formatMessage, locale} = this.props.intl;\n const onError = (msg, err) => {\n console.error(msg, err);\n this.handleError(formatMessage(messages.push_init_failed), 'err');\n this.setState({firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n }\n\n try {\n this.fcm = firebaseGetMessaging(firebaseInitApp(FIREBASE_INIT, BASE_APP_NAME));\n return navigator.serviceWorker.getRegistration('/service-worker.js').then(reg => {\n return reg || navigator.serviceWorker.register('/service-worker.js').then(reg => {\n this.checkForAppUpdate(reg);\n return reg;\n });\n }).then(reg => {\n // Pass locale and version config to the service worker.\n (reg.active || reg.installing).postMessage(JSON.stringify({locale: locale, version: PACKAGE_VERSION}));\n // Request token.\n return TinodeWeb.requestFCMToken(this.fcm, reg);\n }).then(token => {\n const persist = LocalStorageUtil.getObject('keep-logged-in');\n if (token != this.state.firebaseToken) {\n this.tinode.setDeviceToken(token);\n if (persist) {\n LocalStorageUtil.setObject('firebase-token', token);\n }\n }\n this.setState({firebaseToken: token, desktopAlerts: true});\n if (persist) {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }\n\n // Handhe FCM pushes\n // (a) for channels always,\n // (b) pushes when the app is in foreground but has no focus.\n firebaseOnMessage(this.fcm, payload => { this.handlePushMessage(payload); });\n }).catch(err => {\n // SW registration or FCM has failed :(\n onError(err);\n throw err;\n });\n } catch (err) {\n onError(err);\n return Promise.reject(err);\n }\n }\n\n // Google's FCM API is idiotic.\n static requestFCMToken(fcm, sw) {\n return firebaseGetToken(fcm, {\n serviceWorkerRegistration: sw,\n vapidKey: FIREBASE_INIT.messagingVapidKey\n }).then(token => {\n if (token) {\n return token;\n } else if (typeof Notification != 'undefined') {\n // Try to request permissions.\n return Notification.requestPermission().then(permission => {\n if (permission === 'granted') {\n return firebaseGetToken(fcm, {\n serviceWorkerRegistration: sw,\n vapidKey: FIREBASE_INIT.messagingVapidKey\n }).then(token => {\n if (token) {\n return token;\n } else {\n throw new Error(\"Failed to initialize notifications\");\n }\n });\n } else {\n throw new Error(\"No permission to send notifications: \" + permission);\n }\n });\n }\n throw new Error(\"Notifications are not supported\");\n });\n }\n\n handleResize() {\n const mobile = document.documentElement.clientWidth <= MEDIA_BREAKPOINT;\n this.setState({\n viewportWidth: document.documentElement.clientWidth,\n viewportHeight: document.documentElement.clientHeight\n });\n if (this.state.displayMobile != mobile) {\n this.setState({displayMobile: mobile});\n }\n }\n\n handleEscapeKey(e) {\n if (e.key === 'Escape' || e.keyCode === 27) {\n // Clear selections and navigate to base state\n this.setState({\n topicSelected: null,\n errorText: '',\n errorLevel: null,\n mobilePanel: 'sidepanel',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n infoPanel: undefined,\n forwardMessage: null,\n contextMenuVisible: false,\n forwardDialogVisible: false,\n alertVisible: false\n });\n // Navigate to contacts or login view\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', null));\n }\n }\n\n // Check if a newer version of TinodeWeb app is available at the server.\n checkForAppUpdate(reg) {\n reg.onupdatefound = _ => {\n const installingWorker = reg.installing;\n installingWorker.onstatechange = _ => {\n if (installingWorker.state == 'installed' && navigator.serviceWorker.controller) {\n const msg = <>\n \n \n .>;\n this.handleError(msg, 'info');\n }\n }\n }\n }\n\n // Handle for hash navigation (hashchange) event: update state.\n handleHashRoute() {\n const hash = HashNavigation.parseUrlHash(window.location.hash);\n // Start with panel parameters.\n const newState = {\n infoPanel: hash.params.info,\n newTopicTabSelected: hash.params.tab\n };\n\n if (hash.path && hash.path.length > 0) {\n // Left-side panel selector.\n if (SIDE_PANEL_VIEWS.includes(hash.path[0])) {\n newState.sidePanelSelected = hash.path[0];\n newState.sidePanelParams = hash.params;\n } else {\n console.warn(\"Unknown sidepanel view\", hash.path[0]);\n }\n\n // Topic for MessagesView selector.\n let topicName = hash.path[1] || null;\n if (topicName != this.state.topicSelected) {\n if (!Tinode.topicType(topicName)) {\n // Clear invalid topic name and hide messages view on mobile.\n topicName = null;\n newState.mobilePanel = 'sidepanel';\n } else {\n // Topic valid: show messages view on mobile.\n newState.mobilePanel = 'topic-view';\n }\n Object.assign(newState, {\n topicSelected: topicName,\n topicSelectedAcs: this.tinode.getTopicAccessMode(topicName)\n });\n }\n } else {\n // Empty hashpath\n Object.assign(newState, {sidePanelSelected: '', sidePanelParams: {}, topicSelected: null});\n }\n\n // Save credential validation parameters, if available.\n if (hash.params.method) {\n newState.credMethod = hash.params.method;\n }\n if (hash.params.code) {\n newState.credCode = hash.params.code;\n }\n if (hash.params.token) {\n newState.credToken = hash.params.token;\n }\n\n // Show a message if validation was successful.\n if (hash.params.cred_done) {\n Object.assign(newState,\n TinodeWeb.stateForError(this.props.intl.formatMessage(messages.cred_confirmed_successfully), 'info'));\n }\n\n this.setState(newState);\n }\n\n handleOnline(online) {\n if (online) {\n this.handleError();\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n } else {\n this.handleError(this.props.intl.formatMessage(messages.no_connection), 'warn');\n }\n this.setState({liveConnection: online});\n }\n\n handleVisibilityEvent() {\n this.setState({applicationVisible: !document.hidden});\n }\n\n static stateForError(err, level, action, actionText) {\n return {\n errorText: err,\n errorLevel: level,\n errorAction: action,\n errorActionText: actionText,\n callShouldStart: false,\n };\n }\n\n handleError(err, level, action, actionText) {\n this.setState(TinodeWeb.stateForError(err, level, action, actionText));\n }\n\n // User clicked Login button in the side panel.\n handleLoginRequest(login, password) {\n this.setState({\n loginDisabled: true,\n login: login,\n password: password,\n loadSpinnerVisible: true,\n autoLogin: true\n });\n this.handleError('', null);\n\n if (this.tinode.isConnected()) {\n this.doLogin(login, password, null, {meth: this.state.credMethod, resp: this.state.credCode});\n } else {\n this.tinode.connect().catch(err => {\n // Socket error\n this.setState({loginDisabled: false, autoLogin: false, loadSpinnerVisible: false});\n this.handleError(err.message, 'err');\n });\n }\n\n if (this.state.desktopAlertsEnabled && !this.state.firebaseToken) {\n // Firefox and Safari: \"The Notification permission may only be requested from inside a\n // short running user-generated event handler\".\n this.initFCMessaging();\n }\n }\n\n // Enable or disable saving the password and IndexedDB.\n handlePersistenceChange(persist) {\n if (persist) {\n this.tinode.initStorage().then(_ => {\n LocalStorageUtil.setObject('keep-logged-in', true);\n this.setState({persist: true});\n });\n } else {\n this.tinode.clearStorage().then(_ => {\n LocalStorageUtil.setObject('keep-logged-in', false);\n this.setState({persist: false});\n });\n }\n }\n\n // Connection succeeded.\n handleConnected() {\n // Just to be sure.\n clearInterval(this.reconnectCountdown);\n this.handleError();\n\n const params = this.tinode.getServerInfo();\n this.setState({\n serverVersion: params.ver + ' ' + (params.build ? params.build : 'none'),\n // \"reqCred\":{\"auth\":[\"email\"]}\n reqCredMethod: ((params.reqCred || {}).auth || [])[0] || 'email'\n });\n\n if (this.state.autoLogin) {\n this.doLogin(this.state.login, this.state.password, null,\n {meth: this.state.credMethod, resp: this.state.credCode});\n }\n }\n\n // Called for each auto-reconnect iteration.\n handleAutoreconnectIteration(sec, prom) {\n clearInterval(this.reconnectCountdown);\n\n if (sec < 0) {\n // Clear error\n this.handleError();\n return;\n }\n\n if (prom) {\n // Reconnecting now\n prom.then(_ => {\n // Reconnected: clear error\n this.handleError();\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n return;\n }\n\n const {formatMessage} = this.props.intl;\n let count = sec / 1000;\n count = count | count;\n this.reconnectCountdown = setInterval(_ => {\n if (count < -10) {\n // Count could go to negative if computer woke up from sleep.\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n return;\n }\n\n const fmtTime = (count > 99) ? secondsToTime(count) : count;\n this.handleError(\n formatMessage(messages.reconnect_countdown, {seconds: fmtTime}),\n 'warn',\n _ => {\n clearInterval(this.reconnectCountdown);\n this.tinode.reconnect();\n },\n formatMessage(messages.reconnect_now)\n );\n count -= 1;\n }, 1000);\n }\n\n // Connection lost. Also covers a {hi} handshake rejected before login ever gets a chance to run\n // (e.g. the tenant being deactivated mid-session) -- that path calls onDisconnect, not the {login}\n // catch block down in doLogin, so without translateCtrlError here it showed the raw English\n // ctrl.text (e.g. \"permission denied (403)\") instead of any Chinese message at all.\n handleDisconnect(err) {\n const known = translateCtrlError(err);\n this.setState({\n connected: false,\n ready: false,\n topicSelectedOnline: false,\n errorText: known || (err && err.message ? err.message : \"Disconnected\"),\n errorLevel: err && err.message ? 'err' : 'warn',\n loginDisabled: false,\n contextMenuVisible: false,\n forwardDialogVisible: false,\n serverVersion: \"no connection\"\n });\n }\n\n doLogin(login, password, tmpToken, cred) {\n if (this.tinode.isAuthenticated()) {\n // Already logged in. Go to default screen.\n HashNavigation.navigateTo('');\n return;\n }\n\n let token = tmpToken || (this.tinode.getAuthToken() || {}).token;\n if (!(login && password) && !token) {\n // No login credentials provided.\n // Make sure we are on the login page.\n HashNavigation.navigateTo('');\n this.setState({loginDisabled: false});\n return;\n }\n\n // Sanitize and package credentail.\n cred = Tinode.credential(cred);\n // May be disconnected.\n let connectionPromise = this.tinode.isConnected() ? Promise.resolve() : this.tinode.connect();\n // Try to login with login/password. If they are not available, try token; if no token, ask for login/password.\n let loginPromise;\n if (login && password) {\n token = null;\n this.setState({password: null});\n loginPromise = connectionPromise.then(_ => this.tinode.loginBasic(login, password, cred));\n } else {\n loginPromise = connectionPromise.then(_ => this.tinode.loginToken(token, cred));\n }\n\n loginPromise.then(ctrl => {\n if (ctrl.code >= 300 && ctrl.text === 'validate credentials') {\n this.setState({loadSpinnerVisible: false});\n if (cred) {\n this.handleError(this.props.intl.formatMessage(messages.code_doesnot_match), 'warn');\n }\n if (!TinodeWeb.navigateToCredentialsView(ctrl.params) && !cred) {\n this.handleError(invalidCredentialsReasonMessage(ctrl.params), 'err');\n }\n } else {\n this.handleLoginSuccessful();\n }\n }).catch(err => {\n const autoLogin = err.code >= 500;\n // Connection or login failed, report error.\n this.setState({\n loginDisabled: false,\n credMethod: undefined,\n credCode: undefined,\n loadSpinnerVisible: false,\n autoLogin: autoLogin\n });\n this.handleError(loginErrorMessage(err), 'err');\n console.warn(\"Login failed\", err);\n if (!autoLogin) {\n if (token) {\n // 存的 token 失效(过期/被撤销)——这属于\"会话没了\",回到登录入口是对的。\n this.handleLogout();\n HashNavigation.navigateTo('');\n }\n // 用户手输账号密码失败(401 之类)时**不要**导航。原来这里无条件 navigateTo(''),\n // 会把 sidePanelSelected 清成 '',render 里 '' 又落到 'tenant',于是密码打错一次就被\n // 弹回企业码页,刚输的账号丢了;而 TenantEntry 不渲染 FormAlert、chapterOne 分支也不渲染\n // ErrorPanel,那句错误提示用户根本看不到。留在登录页,errorText 才能显示出来。\n }\n });\n }\n\n // ctrl.code>=300 / ctrl.text=='validate credentials' is standard Tinode for \"account created,\n // now confirm a real credential (email code etc.)\" -- ctrl.params.cred is guaranteed non-empty in\n // that case. This backend reuses the exact same code/text pair for its own invite-code errors\n // (INVITE_CODE_INVALID/INVITE_CODE_REQUIRED, confirmed live), which carry `reason`/`what` instead\n // of `cred` -- calling this without checking left `params.cred[0]` throwing a raw TypeError that\n // surfaced to the user as unreadable English. Returns whether it actually navigated, so both call\n // sites can show a real error message instead when it didn't.\n static navigateToCredentialsView(params) {\n if (!Array.isArray(params.cred) || !params.cred.length) {\n return false;\n }\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n parsed.path[0] = 'cred';\n parsed.params['method'] = params.cred[0];\n parsed.params['token'] = params.token;\n parsed.params['code'] = params.code;\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n return true;\n }\n\n handleLoginSuccessful() {\n this.handleError();\n\n // Refresh authentication token.\n if (LocalStorageUtil.getObject('keep-logged-in')) {\n LocalStorageUtil.setObject('auth-token', this.tinode.getAuthToken());\n }\n // im-api.js's REST calls (bootstrap, friends, ...) need a bearer token independent of whether the\n // user opted into surviving a browser restart -- sessionStorage covers \"this tab's session\",\n // matching how long the in-memory WS auth actually lasts when \"keep logged in\" is off.\n const authToken = this.tinode.getAuthToken();\n sessionStorage.setItem('im-session-token', authToken ? authToken.token : '');\n\n // On reconnect, requestedTopic is undefined but topicSelected may still be set.\n // Preserve the open topic so it gets restored after re-login.\n const goToTopic = this.state.requestedTopic || this.state.topicSelected;\n // Logged in fine, subscribe to 'me' attaching callbacks from the contacts view.\n const me = this.tinode.getMeTopic();\n me.onMetaDesc = this.tnMeMetaDesc;\n me.onContactUpdate = this.tnMeContactUpdate;\n me.onSubsUpdated = this.tnMeSubsUpdated;\n this.setState({\n connected: true,\n credMethod: undefined,\n credCode: undefined,\n credToken: undefined,\n myUserId: this.tinode.getCurrentUserID(),\n autoLogin: true,\n requestedTopic: undefined,\n });\n // Subscribe, fetch topic desc, the list of subscriptions. Messages are not fetched.\n me.subscribe(\n me.startMetaQuery().\n withLaterSub().\n withDesc().\n withTags().\n withCred().\n build()\n ).catch(err => {\n this.tinode.disconnect();\n localStorage.removeItem('auth-token');\n this.handleError(err.message, 'err');\n HashNavigation.navigateTo('');\n }).finally(_ => {\n this.setState({loadSpinnerVisible: false});\n });\n // The new bottom nav only has \"workbench\" and \"messages\" -- there's no standalone contacts\n // entry point anymore, so landing a fresh login there orphaned the user outside the nav they can\n // actually see. Land on the workbench instead (matches the \"工作台优先\" home screen in the mocks).\n //\n // 但只在\"真的刚走完登录流程\"时才这么跳。这个方法在页面刷新触发自动登录时也会执行,原来无条件\n // 改写 hash,等于把用户刷新前所在的页面冲掉——不管停在个人中心、群设置还是收藏,刷新后一律\n // 被弹到工作台。现在先看当前 hash 是不是一个有效的、非登录流程的视图,是就原样保留。\n const currentView = HashNavigation.parseUrlHash(window.location.hash).path[0];\n const cameFromAuthFlow = !currentView || AUTH_FLOW_VIEWS.includes(currentView) ||\n !SIDE_PANEL_VIEWS.includes(currentView);\n let urlHash = cameFromAuthFlow ?\n HashNavigation.setUrlSidePanel(window.location.hash, 'workbench') : window.location.hash;\n if (goToTopic) {\n urlHash = HashNavigation.setUrlTopic(urlHash, goToTopic);\n }\n HashNavigation.navigateTo(urlHash);\n }\n\n tnMeMetaDesc(desc) {\n if (!desc) {\n return;\n }\n\n if (desc.public) {\n this.setState({\n sidePanelTitle: desc.public.fn,\n sidePanelAvatar: makeImageUrl(desc.public.photo)\n });\n }\n\n if (desc.trusted) {\n const badges = [];\n for (const [key, val] of Object.entries(desc.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n this.setState({\n myTrustedBadges: badges,\n });\n }\n\n if (desc.acs) {\n this.setState({\n incognitoMode: !desc.acs.isPresencer()\n });\n }\n\n if (TinodeWeb.checkIfPinsUpdated(desc, this.state.chatList)) {\n this.resetContactList();\n }\n }\n\n // Reactions to updates to the contact list.\n tnMeContactUpdate(what, cont) {\n if (what == 'on' || what == 'off') {\n this.resetContactList();\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedOnline: (what == 'on')});\n }\n } else if (what == 'read') {\n this.resetContactList();\n } else if (what == 'msg' && cont) {\n // Check if the topic is archived. If so, don't play a sound.\n const topic = this.tinode.getTopic(cont.topic);\n const archived = topic && topic.isArchived();\n\n // New message received. Maybe the message is from the current user, then unread is 0.\n if (cont.unread > 0 && this.state.messageSounds && !archived) {\n // Skip update if the topic is currently open, otherwise the badge will annoyingly flash.\n if (document.hidden || this.state.topicSelected != cont.topic) {\n POP_SOUND.play().catch(_ => {\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n });\n }\n }\n // Reorder contact list to use possibly updated 'touched'.\n this.resetContactList();\n } else if (what == 'recv') {\n // Explicitly ignoring \"recv\" -- it causes no visible updates to contact list.\n } else if (what == 'gone' || what == 'unsub') {\n // Topic deleted or user unsubscribed. Remove topic from view.\n // If the currently selected topic is gone, clear the selection.\n if (this.state.topicSelected == cont.topic) {\n this.handleTopicSelected(null);\n }\n // Redraw without the deleted topic.\n this.resetContactList();\n } else if (what == 'acs') {\n // Permissions changed. If it's for the currently selected topic,\n // update the views.\n if (this.state.topicSelected == cont.topic) {\n this.setState({topicSelectedAcs: cont.acs});\n }\n } else if (what == 'del') {\n // TODO: messages deleted (hard or soft) -- update pill counter.\n } else if (what == 'upd' || what == 'call') {\n // upd, call - handled by the SDK. Explicitly ignoring here.\n } else {\n // TODO(gene): handle other types of notifications:\n // * ua -- user agent changes (maybe display a pictogram for mobile/desktop).\n console.info(\"Unsupported (yet) presence update:\", what, \"in\", (cont || {}).topic);\n }\n }\n\n tnMeSubsUpdated(unused) {\n this.resetContactList();\n }\n\n // Merge search results and contact list to create a single flat\n // list of known contacts for GroupManager to use.\n static prepareSearchableContacts(chatList, foundContacts) {\n const merged = {};\n\n // For chatList topics merge only p2p topics and convert them to the\n // same format as foundContacts.\n for (const c of chatList) {\n if (Tinode.isP2PTopicName(c.topic)) {\n merged[c.topic] = {\n user: c.topic,\n updated: c.updated,\n public: c.public,\n private: c.private,\n acs: c.acs\n };\n }\n }\n\n // Add all foundCountacts if they have not been added already.\n for (const c of foundContacts) {\n if (!merged[c.user]) {\n merged[c.user] = c;\n }\n }\n\n return Object.values(merged);\n }\n\n resetContactList() {\n const newState = {\n chatList: []\n };\n\n if (!this.state.ready) {\n newState.ready = true;\n }\n\n const me = this.tinode.getMeTopic();\n me.contacts(c => {\n if (!c.topic && !c.user) {\n // Contacts expect c.topic to be set.\n c.topic = c.name;\n }\n\n newState.chatList.push(c);\n if (this.state.topicSelected == c.topic) {\n newState.topicSelectedOnline = c.online;\n newState.topicSelectedAcs = c.acs;\n }\n });\n\n const past = new Date(0);\n newState.chatList.sort((a, b) => {\n // Pinned topics take precedence.\n const pins = me.pinnedTopicRank(b.topic) - me.pinnedTopicRank(a.topic);\n // Then sort by last touched time.\n return pins != 0 ? pins : (b.touched || past).getTime() - (a.touched || past).getTime();\n });\n\n // Merge search results and chat list.\n newState.searchableContacts = TinodeWeb.prepareSearchableContacts(newState.chatList, this.state.searchResults);\n this.setState(newState);\n }\n\n static checkIfPinsUpdated(me, chatList) {\n for (let i = 0; i < chatList.length; i++) {\n const c = chatList[i];\n if (!!me.pinnedTopicRank(c.topic) != c.pinned) {\n return true;\n }\n }\n return false;\n }\n\n /* Fnd topic: find contacts by tokens */\n tnInitFind() {\n const fnd = this.tinode.getFndTopic();\n fnd.onSubsUpdated = this.tnFndSubsUpdated;\n if (fnd.isSubscribed()) {\n this.tnFndSubsUpdated();\n } else {\n fnd.subscribe(fnd.startMetaQuery().withSub().build()).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n tnFndSubsUpdated() {\n const foundContacts = [];\n // Don't attempt to create P2P topics which already exist. Server will reject the duplicates.\n this.tinode.getFndTopic().contacts((s) => {\n foundContacts.push(s);\n });\n this.setState({\n searchResults: foundContacts,\n searchableContacts: TinodeWeb.prepareSearchableContacts(this.state.chatList, foundContacts)\n });\n }\n\n /** Called when the user enters a contact into the contact search field in the NewAccount panel\n @param query {Array} is an array of contacts to search for\n */\n handleSearchContacts(query) {\n const fnd = this.tinode.getFndTopic();\n fnd.setMeta({desc: {public: query}})\n .then(_ => fnd.getMeta(fnd.startMetaQuery().withSub().build()))\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n // User clicked on a topic in the side panel or deleted a topic.\n handleTopicSelected(topicName) {\n // Clear newTopicParams after use.\n if (this.state.newTopicParams && this.state.newTopicParams._topicName != topicName) {\n this.setState({\n newTopicParams: null\n });\n }\n\n if (topicName) {\n this.setState({\n errorText: '',\n errorLevel: null,\n mobilePanel: 'topic-view',\n infoPanel: undefined\n });\n // Different topic selected.\n if (this.state.topicSelected != topicName) {\n this.setState({\n topicSelectedOnline: this.tinode.isTopicOnline(topicName),\n topicSelectedAcs: this.tinode.getTopicAccessMode(topicName),\n forwardMessage: null\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', topicName));\n }\n } else {\n // Currently selected contact deleted\n this.setState({\n topicSelected: null,\n errorText: '',\n errorLevel: null,\n mobilePanel: 'sidepanel',\n topicSelectedOnline: false,\n topicSelectedAcs: null,\n infoPanel: undefined,\n forwardMessage: null\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', null));\n }\n }\n\n // In mobile view user requested to show sidepanel\n handleHideMessagesView() {\n this.setState({\n mobilePanel: 'sidepanel'\n });\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, null));\n }\n\n // User is sending a message, either plain text or a drafty object, possibly\n // with attachments.\n // - msg - Drafty message with content\n // - promise - Promise to be resolved when the upload is completed\n // - uploadCompletionPromise - for tracking progress\n // - head - head dictionary to be attached to the message\n handleSendMessage(msg, uploadCompletionPromise, uploader, head) {\n const topic = this.tinode.getTopic(this.state.topicSelected);\n return this.sendMessageToTopic(topic, msg, uploadCompletionPromise, uploader, head);\n }\n\n sendMessageToTopic(topic, msg, uploadCompletionPromise, uploader, head) {\n msg = topic.createMessage(msg, false);\n // The uploader is used to show progress.\n msg._uploader = uploader;\n\n if (head) {\n msg.head = Object.assign(msg.head || {}, head);\n }\n\n const completion = [];\n if (uploadCompletionPromise) {\n completion.push(uploadCompletionPromise);\n }\n\n if (!topic.isSubscribed()) {\n // Topic is not subscribed yet. Subscribe.\n const subscribePromise =\n topic.subscribe()\n .then(_ => {\n // If there are unsent messages (except video call messages),\n // try sending them now. Unsent video call messages will be dropped.\n let calls = [];\n topic.queuedMessages(pub => {\n if (pub._sending || pub.seq == msg.seq) {\n return;\n }\n if (pub.head && pub.head.webrtc) {\n // Filter out unsent video call messages.\n calls.push(pub.seq);\n return;\n }\n if (topic.isSubscribed()) {\n topic.publishMessage(pub);\n }\n });\n if (calls.length > 0) {\n topic.delMessagesList(calls, true);\n }\n });\n completion.push(subscribePromise);\n }\n\n // TODO: check if return is required.\n return topic.publishDraft(msg, Promise.all(completion))\n .then(ctrl => {\n if (topic.isArchived()) {\n topic.archive(false);\n }\n return ctrl;\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleNewChatInvitation(topicName, action) {\n const topic = this.tinode.getTopic(topicName);\n let response = null;\n switch (action) {\n case 'accept':\n // Accept given permissions.\n const mode = topic.getAccessMode().getGiven();\n response = topic.setMeta({sub: {mode: mode}});\n if (topic.isP2PType()) {\n // For P2P topics change 'given' permission of the peer too.\n // In p2p topics the other user has the same name as the topic.\n response = response.then(_ => topic.setMeta({sub: {user: topicName, mode: mode}}));\n }\n break;\n case 'delete':\n // Ignore invitation by deleting it.\n response = topic.delTopic(true);\n break;\n case 'block':\n // Ban the topic making futher invites impossible.\n // Just self-ban.\n const am = topic.getAccessMode().updateWant('-JP').getWant();\n response = topic.setMeta({sub: {mode: am}}).then(_ => this.handleTopicSelected(null));\n break;\n default:\n console.warn(\"Unknown invitation action\", '\"' + action + '\"\"');\n }\n\n if (response != null) {\n response.catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n // User chose a Sign Up menu item.\n handleNewAccount() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, 'register'));\n }\n\n // Actual registration of a new account.\n handleNewAccountRequest(login_, password_, public_, cred_, tags_) {\n // Clear old error, if any.\n this.handleError();\n\n this.tinode.connect(this.state.serverAddress)\n .then(_ => {\n let attachments;\n if (public_ && public_.photo && public_.photo.ref) {\n attachments = [public_.photo.ref];\n }\n return this.tinode.createAccountBasic(login_, password_,\n {public: public_, tags: tags_, cred: Tinode.credential(cred_), attachments: attachments});\n }).then(ctrl => {\n if (ctrl.code >= 300 && ctrl.text == 'validate credentials') {\n if (!TinodeWeb.navigateToCredentialsView(ctrl.params)) {\n this.handleError(invalidCredentialsReasonMessage(ctrl.params), 'err');\n }\n } else {\n this.handleLoginSuccessful(this);\n }\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n // Registration via the product's username/phone flow (chapter 1.4). `extra` carries the fields the\n // server added to {acc} (username/phone/invite_code, see server/user.go resolveRegistrationAccount) --\n // the SDK has no API for them, so they're injected by the sendText patch installed in tnSetup().\n // `cred_` (when phone was verified through POST /v1/im/auth/verification-codes) is\n // {meth:'tel', val, resp: verification_token, params: {challenge_id}} -- see server/user.go\n // consumeProductVerificationCred, which validates resp/params against the REST-issued token.\n //\n // `login_` must equal what the server's own resolveRegistrationAccount will compute as the\n // account name, or replyCreateUser rejects the whole request with a policy violation before it\n // even looks at username/phone/cred: for phone registration that's the E.164 phone (not blank --\n // registrationSecretMatches requires a non-empty match), for username registration it's the\n // username itself.\n handleImRegisterRequest(login_, password_, displayName, extra, cred_) {\n this.tinode.__pendingAccExtra = extra;\n this.handleNewAccountRequest(login_, password_, theCard(displayName, null), cred_);\n }\n\n handleToggleIncognitoMode(on) {\n // Make state undefined.\n this.setState({incognitoMode: null});\n\n const me = this.tinode.getMeTopic();\n const am = me.getAccessMode().updateWant(on ? '-P' : '+P').getWant();\n me.setMeta({sub: {mode: am}}).catch(err => {\n // Request failed, keep existing state.\n this.setState({incognitoMode: !on});\n this.handleError(err.message, 'err');\n });\n }\n\n // Manual change of color scheme: 'dark', 'light', 'auto'.\n handleChangeColorSchema(schema) {\n this.setState({colorSchema: schema});\n LocalStorageUtil.updateObject('settings', {colorSchema: schema});\n document.documentElement.style.colorScheme = schema == 'auto' ? 'light dark' : schema;\n this.applyColorSchema(schema, this.state.systemColorSchema, this.state.wallpaperSize);\n }\n\n // System color scheme has changed.\n handleColorSchemeChange(event) {\n const systemSchema = event.matches ? 'dark' : 'light';\n this.setState({systemColorSchema: systemSchema});\n this.applyColorSchema(this.state.colorSchema, systemSchema, this.state.wallpaperSize);\n }\n\n applyColorSchema(schema, systemSchema, size) {\n const effectiveSchema = schema == 'auto' ? systemSchema : schema;\n document.documentElement.style.setProperty('--wallpaper-invert', effectiveSchema == 'dark' && size ? '1' : '0');\n document.documentElement.style.setProperty('--wallpaper-brightness', effectiveSchema == 'dark' && !size ? '0.5' : '1');\n }\n\n handleSelectWallpapers() {\n this.handleError();\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, 'wallpapers'));\n }\n\n applyWallpaperSettings(wallpaper, size, blur, effectiveSchema) {\n document.documentElement.style.setProperty('--wallpaper-url', `url('${wallpaper}')`);\n document.documentElement.style.setProperty('--wallpaper-repeat', size ? 'repeat' : 'no-repeat');\n document.documentElement.style.setProperty('--wallpaper-blur', size ? '0px' : `${blur}px`);\n document.documentElement.style.setProperty('--wallpaper-size', size ? `${size}px` : 'cover');\n document.documentElement.style.setProperty('--wallpaper-position', size ? 'unset' : 'center');\n document.documentElement.style.setProperty('--wallpaper-invert', effectiveSchema == 'dark' && size ? '1' : '0');\n document.documentElement.style.setProperty('--wallpaper-brightness', effectiveSchema == 'dark' && !size ? '0.5' : '1');\n }\n\n handleWallpaperSelected(wallpaper, size, blur) {\n this.handleError();\n LocalStorageUtil.updateObject('settings', {wallpaper: wallpaper, wallpaperSize: size, wallpaperBlur: blur});\n this.setState({wallpaper: wallpaper, wallpaperSize: size, wallpaperBlur: blur});\n this.applyWallpaperSettings(wallpaper, size, blur,\n this.state.colorSchema == 'auto' ? this.state.systemColorSchema : this.state.colorSchema);\n }\n\n handleChangeTextSize(size) {\n this.setState({textSize: size | 0});\n LocalStorageUtil.updateObject('settings', {textSize: size});\n document.documentElement.style.setProperty('--message-text-size', `${size}pt`);\n }\n\n handleSendOnEnter(option) {\n this.setState({sendOnEnter: option});\n LocalStorageUtil.updateObject('settings', {sendOnEnter: option});\n }\n\n handleUpdateAccountTagsRequest(_, tags) {\n this.tinode.getMeTopic().setMeta({tags: tags})\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n // User chose Settings menu item.\n handleSettings() {\n this.handleError();\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'edit' : 'settings'));\n }\n\n // User updated global parameters.\n handleGlobalSettings(settings) {\n const serverAddress = settings.serverAddress || this.state.serverAddress;\n const transport = settings.transport || this.state.transport;\n const secureConnection = settings.secureConnection === undefined ?\n this.state.secureConnection : settings.secureConnection;\n if (this.tinode) {\n this.tinode.clearStorage();\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n }\n this.tinode = TinodeWeb.tnSetup(serverAddress, secureConnection, transport,\n this.props.intl.locale, LocalStorageUtil.getObject('keep-logged-in'));\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n\n this.setState({\n serverAddress: serverAddress,\n transport: transport,\n secureConnection: secureConnection,\n });\n LocalStorageUtil.setObject('settings', {\n serverAddress: serverAddress,\n transport: transport,\n secureConnection: secureConnection,\n });\n\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, ''));\n }\n\n // Tenant was resolved via POST /v1/im/tenants/resolve (see auth-onboarding-view.jsx TenantEntry).\n // Persists the tenant context (read by im-api.js and by the {hi}-patching in tnSetup) and, if the\n // resolved tenant genuinely lives on a different host, rebuilds the Tinode client to point there.\n handleTenantResolved(data, requestedCode) {\n const tenant = data.tenant || {};\n const endpoints = data.endpoints || {};\n LocalStorageUtil.setObject('im-tenant', {\n code: tenant.code || requestedCode,\n name: tenant.name || tenant.code || requestedCode,\n endpoints\n });\n\n let host = this.state.serverAddress;\n let secureConnection = this.state.secureConnection;\n if (endpoints.websocket) {\n try {\n const wsUrl = new URL(endpoints.websocket);\n host = wsUrl.host;\n secureConnection = wsUrl.protocol === 'wss:';\n } catch (e) {\n // Malformed endpoint; keep the current host/scheme.\n }\n }\n if (host && (host !== this.state.serverAddress || secureConnection !== this.state.secureConnection)) {\n this.handleGlobalSettings({serverAddress: host, secureConnection});\n }\n // Else: same host/scheme, nothing to reconnect -- the sendText patch installed in tnSetup() reads\n // the tenant context fresh on every {hi}, so the newly-persisted code takes effect immediately.\n }\n\n // User chose 'Archived chats'.\n handleShowArchive() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'archive' : ''));\n }\n\n // User viewes 'Blocked chats'.\n handleShowBlocked() {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash,\n this.state.myUserId ? 'blocked' : ''));\n }\n\n toggleFCMToken(enabled) {\n if (enabled) {\n this.setState({desktopAlerts: null});\n if (!this.state.firebaseToken) {\n this.initFCMessaging();\n } else {\n this.setState({desktopAlerts: true});\n if (LocalStorageUtil.getObject('keep-logged-in')) {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: true});\n }\n }\n } else if (this.state.firebaseToken && this.fcm) {\n firebaseDelToken(this.fcm).catch(err => {\n console.error(\"Unable to delete token.\", err);\n }).finally(_ => {\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n localStorage.removeItem('firebase-token');\n this.setState({desktopAlerts: false, firebaseToken: null});\n // Inform the server that the token was deleted.\n this.tinode.setDeviceToken(null);\n });\n } else {\n this.setState({desktopAlerts: false, firebaseToken: null});\n LocalStorageUtil.updateObject('settings', {desktopAlerts: false});\n }\n }\n\n handleToggleMessageSounds(enabled) {\n this.setState({messageSounds: enabled});\n LocalStorageUtil.updateObject('settings', {\n messageSoundsOff: !enabled\n });\n }\n\n handleCredAdd(method, value) {\n const me = this.tinode.getMeTopic();\n me.setMeta({cred: {meth: method, val: value}})\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleCredDelete(method, value) {\n const me = this.tinode.getMeTopic();\n me.delCredential(method, value)\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleCredConfirm(method, response) {\n TinodeWeb.navigateToCredentialsView({cred: [method], code: response});\n }\n\n // User clicked Cancel button in Setting or Sign Up panel.\n handleSidepanelCancel() {\n const parsed = HashNavigation.parseUrlHash(window.location.hash);\n let path = '';\n if (['security','support','general','notif','acc_general'].includes(parsed.path[0])) {\n path = 'edit';\n } else if ('crop' == parsed.path[0]) {\n path = 'general';\n } else if ('blocked' == parsed.path[0]) {\n path = 'security';\n } else if ('wallpapers' == parsed.path[0]) {\n path = 'acc_general';\n } else if (this.state.myUserId) {\n path = 'contacts';\n }\n parsed.path[0] = path;\n if (parsed.params) {\n delete parsed.params.code;\n delete parsed.params.method;\n delete parsed.params.tab;\n delete parsed.params.scheme;\n delete parsed.params.token;\n }\n HashNavigation.navigateTo(HashNavigation.composeUrlHash(parsed.path, parsed.params));\n this.setState({errorText: '', errorLevel: null});\n }\n\n // Sidepanel navigator. No need to bind to 'this'.\n basicNavigator(hash) {\n HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, hash));\n }\n\n // Topic info navigator. No need to bind to 'this'.\n infoNavigator(hash) {\n HashNavigation.navigateTo(HashNavigation.setUrlInfoPanel(window.location.hash, hash));\n }\n\n // Request to start a topic, new or selected from search results, or \"by ID\".\n handleStartTopicRequest(topicName, newTopicParams, isChannel) {\n // Check if topic is indeed new. If not, launch it.\n if (topicName && this.tinode.isTopicCached(topicName)) {\n this.handleTopicSelected(topicName);\n return;\n }\n\n const params = {};\n if (Tinode.isP2PTopicName(topicName)) {\n // Because we are initiating the subscription, set 'want' to all permissions.\n params.sub = {mode: DEFAULT_P2P_ACCESS_MODE};\n // Give the other user all permissions too.\n params.desc = {defacs: {auth: DEFAULT_P2P_ACCESS_MODE}};\n } else {\n topicName = topicName || this.tinode.newGroupTopicName(isChannel);\n if (newTopicParams) {\n params.desc = {public: newTopicParams.public, private: {comment: newTopicParams.private}};\n params.tags = newTopicParams.tags;\n }\n }\n params._topicName = topicName;\n this.setState({newTopicParams: params}, _ => {this.handleTopicSelected(topicName)});\n }\n\n // New topic was created, here is the new topic name.\n handleNewTopicCreated(oldName, newName) {\n let nextState = {};\n if (this.state.callShouldStart) {\n nextState = {callState: CALL_STATE_IN_PROGRESS, callShouldStart: false};\n }\n if (this.state.topicSelected == oldName && oldName != newName) {\n // If the current URl contains the old topic name, replace it with new.\n // Update the name of the selected topic first so the navigator doen't clear\n // the state.\n nextState.topicSelected = newName;\n }\n this.setState(nextState, _ => {\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', newName));\n });\n }\n\n handleTopicUpdateRequest(topicName, pub, priv, defacs) {\n this.handleError();\n\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const params = {};\n let attachments;\n if (pub) {\n if (pub.photo) {\n if (pub.photo.ref && pub.photo.ref != Tinode.DEL_CHAR) {\n attachments = [pub.photo.ref];\n } else if (!pub.photo.data || pub.photo.data == Tinode.DEL_CHAR) {\n pub.photo = Tinode.DEL_CHAR;\n }\n }\n params.public = pub;\n }\n\n if (typeof priv == 'string') {\n params.private = (priv === Tinode.DEL_CHAR) ?\n Tinode.DEL_CHAR : {comment: priv};\n }\n if (defacs) {\n params.defacs = defacs;\n }\n topic.setMeta({desc: params, attachments: attachments})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleUnarchive(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n topic.archive(false).catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleUpdatePasswordRequest(password) {\n this.handleError();\n\n if (!password) {\n return Promise.reject(new Error('密码不能为空'));\n }\n // 必须把 Promise 返回出去:调用方(personal-settings-view 的修改密码页)要靠它判断成败。\n // 原来这里只在内部 catch 掉、什么都不返回,调用方拿到 undefined,于是密码策略被服务端拒绝时\n // 用户照样看到\"密码已更新\"并被跳走。跟之前修过的 handleDeleteAccount 是同一类问题。\n return this.tinode.updateAccountBasic(null, this.tinode.getCurrentLogin(), password)\n .catch(err => {\n this.handleError(err.message, 'err');\n throw err;\n });\n }\n\n handleChangePermissions(topicName, mode, uid) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n const am = topic.getAccessMode();\n if (uid) {\n am.updateGiven(mode);\n mode = am.getGiven();\n } else {\n am.updateWant(mode);\n mode = am.getWant();\n }\n topic.setMeta({sub: {user: uid, mode: mode}})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleTagsUpdateRequest(topicName, tags) {\n const topic = this.tinode.getTopic(topicName);\n if (topic) {\n topic.setMeta({tags: tags})\n .catch(err => this.handleError(err.message, 'err'));\n }\n }\n\n handleLogout() {\n updateFavicon(0);\n\n // Remove stored data.\n localStorage.removeItem('auth-token');\n localStorage.removeItem('firebase-token');\n localStorage.removeItem('settings');\n sessionStorage.removeItem('im-session-token');\n if (this.state.firebaseToken && this.fcm) {\n // Unsubscribe failures (e.g. 403 token-unsubscribe-failed) should not block logout.\n firebaseDelToken(this.fcm).catch(err => {\n console.warn('Failed to delete FCM token on logout', err);\n });\n }\n\n // Reset color scheme.\n document.documentElement.style.colorScheme = DEFAULT_COLOR_SCHEME == 'auto' ? 'light dark' : DEFAULT_COLOR_SCHEME;\n document.documentElement.style.setProperty('--message-text-size', `${DEFAULT_TEXT_SIZE}pt`);\n\n clearInterval(this.reconnectCountdown);\n\n let cleared;\n if (this.tinode) {\n cleared = this.tinode.clearStorage();\n this.tinode.onDisconnect = undefined;\n this.tinode.disconnect();\n } else {\n cleared = Promise.resolve();\n }\n this.setState(this.getBlankState());\n\n cleared.then(_ => {\n // Same fix as the initial tnSetup call in componentDidMount: use the resolved\n // state.secureConnection (settings-aware), not a raw isSecureConnection() page-protocol check.\n this.tinode = TinodeWeb.tnSetup(this.state.serverAddress, this.state.secureConnection,\n this.state.transport, this.props.intl.locale, LocalStorageUtil.getObject('keep-logged-in'), _ => {\n this.tinode.onConnect = this.handleConnected;\n this.tinode.onDisconnect = this.handleDisconnect;\n this.tinode.onAutoreconnectIteration = this.handleAutoreconnectIteration;\n this.tinode.onInfoMessage = this.handleInfoMessage;\n this.tinode.onDataMessage = this.handleDataMessage;\n HashNavigation.navigateTo('');\n })\n });\n }\n\n handleDeleteAccount() {\n return this.tinode.delCurrentUser(true).then(_ => {\n this.handleLogout();\n });\n }\n\n handleDeleteTopicRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Request to hard-delete topic.\n topic.delTopic(true).then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleDeleteMessagesRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // Request hard-delete all messages.\n topic.delMessagesAll(true)\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleLeaveUnsubRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.leave(true).then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n }).catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n\n handleBlockTopicRequest(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n topic.updateMode(null, '-JP')\n .then(_ => {\n // Hide MessagesView and InfoView panels.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic(window.location.hash, ''));\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleReportTopic(topicName) {\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n // The native `this.tinode.report('report', topicName)` call (WS pub to the \"sys\" topic) requires\n // auth.LevelRoot server-side (server/session.go) which a normal logged-in user never has -- it\n // silently fails permission checks and never reaches the abuse-report tables. Route to the real\n // REST reporting flow (im-api.js's getAbuseReasons/submitAbuseReport, backed by POST /reports/abuse)\n // instead of the old dead-end call.\n const isP2P = topic.isP2PType();\n const targetName = topicDisplayName(topicName, topic.public, topicName);\n const params = isP2P\n ? {target_type: 'user', target_id: topicName, target_name: targetName}\n : {target_type: 'group', target_id: topicName, topic: topicName, target_name: targetName};\n\n // Remove J and P permissions (the \"block\" half of \"block and report\").\n topic.updateMode(null, '-JP')\n .then(_ => {\n let hash = HashNavigation.setUrlTopic(window.location.hash, '');\n hash = HashNavigation.setUrlSidePanel(hash, 'abuse-report-reasons');\n Object.entries(params).forEach(([key, value]) => { hash = HashNavigation.addUrlParam(hash, key, value); });\n HashNavigation.navigateTo(hash);\n })\n .catch(err => this.handleError(err.message, 'err'));\n }\n\n handleShowContextMenu(params, menuItems) {\n this.setState({\n contextMenuVisible: true,\n contextMenuClickAt: {x: params.x, y: params.y},\n contextMenuParams: params,\n contextMenuItems: menuItems || this.defaultTopicContextMenu(params.topicName),\n contextMenuBounds: this.selfRef.current.getBoundingClientRect()\n });\n }\n\n //\n handleShowForwardDialog(params) {\n if (this.state.sidePanelSelected == 'newtpk') {\n // If the Find panel is active, close it.\n this.handleSidepanelCancel();\n }\n const header = params.userName ? '➦ ' + params.userName : '';\n const content = typeof params.content == 'string' ? Drafty.init(params.content) : Drafty.forwardedContent(params.content);\n const preview = Drafty.preview(content, FORWARDED_PREVIEW_LENGTH, true);\n const msg = Drafty.append(Drafty.appendLineBreak(Drafty.mention(header, params.userFrom)), content);\n const msgPreview = Drafty.quote(header, params.userFrom, preview);\n\n const head = {\n forwarded: params.topicName + ':' + params.seq\n };\n this.setState({\n forwardDialogVisible: true,\n forwardMessage: { head: head, msg: msg, preview: msgPreview }\n });\n }\n\n handleShareTheCard(card) {\n this.setState({\n forwardDialogVisible: true,\n forwardMessage: {\n content: card,\n type: card.contentType,\n }\n });\n }\n\n // Extracted out of defaultTopicContextMenu so the new 4.9-4.14 attachment-panel call shortcuts\n // (send-message.jsx) can gate on exactly the same real-world availability check as the existing\n // \"...\" menu items, instead of re-deriving (and risking drifting from) the same three conditions.\n canStartCall(topicName) {\n // Never checked whether a call was already in progress -- the \"...\" menu entry and\n // send-message.jsx's attachment-panel shortcut stayed clickable for the whole (very normal,\n // product-supported) duration of a minimized call. A second click re-arms\n // handleStartVideoCall/handleStartAudioCall's 60s ring timeout and forces callState back to\n // CALL_STATE_OUTGOING_INITATED with no visible effect (the already-mounted CallPanel doesn't\n // react to that prop), silently hanging up the real, healthy call a full minute later.\n if (this.state.callState != CALL_STATE_NONE) {\n return false;\n }\n const topic = this.tinode.getTopic(topicName);\n if (!topic || topic._deleted || !Tinode.isP2PTopicName(topicName)) {\n return false;\n }\n const acs = topic.getAccessMode();\n const writer = !!(acs && acs.isWriter());\n const cachedBootstrap = this.state.myUserId ? readCachedData('bootstrap:' + this.state.myUserId) : null;\n const callFeatureOk = !cachedBootstrap || !cachedBootstrap.features ||\n (cachedBootstrap.features.audio_call !== false && cachedBootstrap.features.video_call !== false);\n return writer && callFeatureOk && !!this.tinode.getServerParam('iceServers');\n }\n\n defaultTopicContextMenu(topicName) {\n const topic = this.tinode.getTopic(topicName);\n\n if (topic._deleted) {\n return [\n 'topic_delete'\n ];\n }\n\n const me = this.tinode.getMeTopic();\n let muted = false, blocked = false, self_blocked = false, subscribed = false, deleter = false,\n archived = false, pinned = false, webrtc = false, p2p = false, self = false;\n if (topic) {\n subscribed = topic.isSubscribed();\n archived = topic.isArchived();\n pinned = me.pinnedTopicRank(topicName) > 0;\n\n const acs = topic.getAccessMode();\n if (acs) {\n muted = acs.isMuted();\n blocked = !acs.isJoiner();\n self_blocked = !acs.isJoiner('want');\n deleter = acs.isDeleter();\n }\n }\n\n // 后端今天新增了一个全局(非按租户)的通话总开关:{pub head:webrtc:...} 现在会先过\n // im_client_feature 这个开关,关闭时整条消息直接被服务端拒绝。这个开关缺失/查询失败时是\n // fail-closed(当成关闭),比 Tinode 协议层的 iceServers 配置更容易出现\"某天突然打不通\"的\n // 情况。canStartCall 统一做这几条判断(也是 4.9-4.14 附件面板通话入口在用的同一份逻辑),\n // 按钮可见性只是一层预判,真正失败时上面 handleCallInvite 已经会报错,这里不做的话用户点了\n // 按钮才发现打不通,做了至少能提前少显示一个注定失败的入口。\n webrtc = this.canStartCall(topicName);\n p2p = Tinode.isP2PTopicName(topicName);\n self = Tinode.isSelfTopicName(topicName);\n\n return [\n subscribed ? {\n title: this.props.intl.formatMessage(messages.menu_item_info),\n handler: this.handleShowInfoView\n } : null,\n subscribed && p2p && webrtc ? {\n title: this.props.intl.formatMessage(messages.menu_item_audio_call),\n handler: this.handleStartAudioCall\n } : null,\n subscribed && p2p && webrtc ? {\n title: this.props.intl.formatMessage(messages.menu_item_video_call),\n handler: this.handleStartVideoCall\n } : null,\n subscribed ? 'messages_clear' : null,\n subscribed && deleter && !self ? 'messages_clear_hard' : null,\n self ? null : (muted ? (blocked ? null : 'topic_unmute') : 'topic_mute'),\n self ? null : (self_blocked ? 'topic_unblock' : 'topic_block'),\n pinned ? 'topic_unpin' : 'topic_pin',\n archived ? 'topic_restore' : 'topic_archive',\n 'topic_delete'\n ];\n }\n\n handleHideContextMenu() {\n this.setState({\n contextMenuVisible: false,\n contextMenuClickAt: null,\n contextMenuParams: null,\n contextMenuBounds: null\n });\n }\n\n handleHideForwardDialog(keepForwardedMessage) {\n this.setState({\n forwardDialogVisible: false,\n forwardMessage: keepForwardedMessage ? this.state.forwardMessage : null\n });\n }\n\n handleContextMenuAction(action, promise, params) {\n if (action == 'topic_archive') {\n if (promise && params.topicName && params.topicName == this.state.topicSelected) {\n promise.then(_ => {\n this.handleTopicSelected(null);\n });\n }\n } else if (action == 'menu_item_forward') {\n this.handleShowForwardDialog(params);\n } else if (action == 'menu_item_select') {\n this.handleEnterSelectMode(params);\n }\n }\n\n // Ch.4 multi-select: pre-selects the message that was long-pressed to reach \"多选\".\n handleEnterSelectMode(params) {\n this.setState({\n selectMode: true,\n selectModeTopic: params.topicName,\n selectedSeqs: [params.seq]\n });\n }\n\n handleToggleMessageSelect(seq) {\n const selectedSeqs = this.state.selectedSeqs.includes(seq) ?\n this.state.selectedSeqs.filter(s => s != seq) :\n this.state.selectedSeqs.concat(seq);\n this.setState({selectedSeqs});\n }\n\n handleExitSelectMode() {\n this.setState({selectMode: false, selectModeTopic: null, selectedSeqs: [], batchForwardVisible: false});\n }\n\n handleShowBatchForward() {\n this.setState({batchForwardVisible: true});\n }\n\n handleHideBatchForward() {\n this.setState({batchForwardVisible: false});\n }\n\n handleOpenScanner() {\n this.setState({scannerOpen: true});\n }\n\n handleCloseScanner() {\n this.setState({scannerOpen: false});\n }\n\n // `text` is whatever jsQR decoded from the camera frame -- only codes this app itself generated\n // (createMyQRCode/createGroupQRCode, both `im://qr?token=...&purpose=...`) resolve to anything;\n // a QR code from the outside world (a URL, a WiFi code) is reported as unrecognized rather than\n // silently failing the resolve call with a confusing server error.\n handleQrDetected(text) {\n const hasScheme = typeof text === 'string' && text.indexOf('im://qr') === 0;\n const params = hasScheme ? new URLSearchParams(text.slice(text.indexOf('?') + 1)) : null;\n const token = params ? params.get('token') : null;\n const purpose = params ? params.get('purpose') : null;\n if (!token) {\n this.setState({scannerOpen: false});\n this.handleError('无法识别的二维码', 'err');\n return;\n }\n resolveQRCode(token, purpose).then(data => {\n if (data.purpose === 'join_group' && data.group) {\n if (data.status === 'joined') {\n this.setState({scannerOpen: false});\n this.handleTopicSelected(data.group.topic);\n } else {\n this.setState({scannerOpen: false, groupJoinPreview: {...data.group, qrToken: token}});\n }\n return;\n }\n if (data.user) {\n this.setState({scannerOpen: false});\n // The profile page this navigates to re-fetches via GET /users/{id}/profile, which 403s for\n // anyone who isn't already a friend (server-side privacy default) -- but resolveQRCode's\n // response already carries the same fields unconditionally, so stash it under the same\n // cache key contact-management-view.jsx's Profile/Verification read on mount, the same fix\n // applied there for the account-search entry point into this identical dead end.\n writeCachedData('profile-seed:' + data.user.user_id, {\n ...data.user,\n capabilities: {can_add_friend: !!data.user.can_add}\n });\n let hash = HashNavigation.setUrlTopic(window.location.hash, '');\n hash = HashNavigation.setUrlSidePanel(hash, data.user.relationship === 'friend' ? 'friend-profile' : 'group-member-profile');\n hash = HashNavigation.addUrlParam(hash, 'uid', data.user.user_id);\n HashNavigation.navigateTo(hash);\n return;\n }\n this.setState({scannerOpen: false});\n this.handleError('无法识别的二维码', 'err');\n }).catch(err => {\n this.setState({scannerOpen: false});\n this.handleError(err.message || '二维码已失效', 'err');\n });\n }\n\n handleSubmitGroupJoinRequest(message) {\n const preview = this.state.groupJoinPreview;\n if (!preview) {\n return Promise.resolve();\n }\n return createGroupJoinRequest(preview.topic, {message, source: 'qr', qrToken: preview.qrToken}).then(() => {\n this.setState({groupJoinPreview: null});\n this.handleError('申请已提交,等待管理员通过', 'info');\n }).catch(err => {\n this.handleError(err.message || '申请提交失败', 'err');\n });\n }\n\n handleCancelGroupJoinPreview() {\n this.setState({groupJoinPreview: null});\n }\n\n handleShowAlert(title, content, onConfirm, confirmText, onReject, rejectText) {\n this.setState({\n alertVisible: true,\n alertParams: {\n title: title,\n content: content,\n onConfirm: onConfirm,\n confirm: confirmText,\n onReject: onReject,\n reject: rejectText\n }\n });\n }\n\n // The \"信息\" context-menu item used to always open the old, pre-migration InfoView (info-view.jsx)\n // -- for P2P/group topics that's a real, previously-unnoticed gap: the new contact-management-view.jsx\n // \"friend-settings\" / group-management-view.jsx \"group-settings\" pages (built and verified across\n // Ch.5/6, with real HashNavigation.goBack()-based back navigation) had no way to actually be reached\n // from an open chat's own header -- every test of them this engagement typed the hash directly.\n // InfoView's own back button (handleBackNavigate in info-view.jsx) still hardcodes a single fixed\n // parent per panel and never used real browser history, so routing here fixed both problems at once\n // rather than teaching the old view a second back-navigation scheme it's slated for removal anyway.\n handleShowInfoView() {\n const topicName = this.state.topicSelected;\n if (Tinode.isP2PTopicName(topicName)) {\n // Base the new hash on '' (not window.location.hash) -- the current hash's path[1] still holds\n // the open chat's own topic, and setUrlSidePanel only ever touches path[0]. Reusing the current\n // hash as-is here leaves that topic sitting in path[1] where it collides with group-settings'/\n // friend-settings' own query params, and handleHashRoute re-interprets the leftover path[1] as a\n // fresh topic selection, blanking the whole view -- the exact bug already found and fixed for\n // handleShowAnnouncement/handleShowJoinRequests/handleSendFriendVerification; same fix here.\n let hash = HashNavigation.setUrlSidePanel('', 'friend-settings');\n hash = HashNavigation.addUrlParam(hash, 'uid', topicName);\n HashNavigation.navigateTo(hash);\n return;\n }\n if (!Tinode.isSelfTopicName(topicName)) {\n let hash = HashNavigation.setUrlSidePanel('', 'group-settings');\n hash = HashNavigation.addUrlParam(hash, 'topic', topicName);\n HashNavigation.navigateTo(hash);\n return;\n }\n // \"已保存的消息\" (self topic) has no equivalent new settings page -- keep the old InfoView for it.\n HashNavigation.navigateTo(HashNavigation.addUrlParam(window.location.hash, 'info', 'info'));\n this.setState({infoPanel: 'info'});\n }\n\n handleMemberUpdateRequest(topicName, added, removed) {\n if (!topicName) {\n return;\n }\n\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n\n if (added && added.length > 0) {\n added.forEach(uid => {\n topic.invite(uid, null)\n .catch(err => this.handleError(err.message, 'err'));\n });\n }\n\n if (removed && removed.length > 0) {\n removed.forEach(uid => {\n topic.delSubscription(uid)\n .catch(err => this.handleError(err.message, 'err'));\n });\n }\n }\n\n handleValidateCredentialsRequest(cred, code, token) {\n if (this.tinode.isAuthenticated()) {\n // Adding new email or phone number in account setting.\n this.tinode.getMeTopic().setMeta({cred: {meth: cred, resp: code}})\n .then(_ => HashNavigation.navigateTo(HashNavigation.setUrlSidePanel(window.location.hash, 'contacts')))\n .catch(err => this.handleError(err.message, 'err'));\n } else {\n // Credential validation on signup.\n this.setState({credMethod: cred, credCode: code, credToken: token});\n this.doLogin(null, null, token, {meth: cred, resp: code});\n }\n }\n\n handlePasswordResetRequest(method, value) {\n // If already connected, connnect() will return a resolved promise.\n return this.tinode.connect()\n .then(_ => this.tinode.requestResetAuthSecret('basic', method, value))\n .catch(err => {\n // Socket error\n this.handleError(err.message, 'err');\n });\n }\n\n handleResetPassword(newPassword, tempAuth) {\n const secret = base64ReEncode(tempAuth.secret);\n if (!secret || !tempAuth.scheme) {\n this.handleError(this.props.intl.formatMessage(messages.invalid_security_token), 'err');\n } else {\n this.tinode.connect()\n .then(_ => this.tinode.updateAccountBasic(null, null, newPassword, {scheme: tempAuth.scheme, secret: secret}))\n .then(_ => {\n this.handleError(this.props.intl.formatMessage(messages.password_reset_success), 'info');\n HashNavigation.navigateTo('');\n })\n .catch(err => {\n this.handleError(err.message, 'err');\n });\n }\n }\n\n handleShowCountrySelector(code, dial, selectedCallback) {\n this.handleShowAlert(this.props.intl.formatMessage(messages.select_country),\n }>\n {\n this.setState({alertVisible: false});\n selectedCallback(c, d);\n }} />\n ,\n null, null, _ => {}, null);\n }\n\n handleStartVideoCall() {\n this.armCallRingTimeout();\n this.setState({\n callTopic: this.state.topicSelected,\n callState: CALL_STATE_OUTGOING_INITATED,\n callAudioOnly: false\n });\n }\n\n handleStartAudioCall() {\n this.armCallRingTimeout();\n this.setState({\n callTopic: this.state.topicSelected,\n callState: CALL_STATE_OUTGOING_INITATED,\n callAudioOnly: true\n });\n }\n\n // this.callTimeoutTimer was declared (and already read/cleared in handleCallClose) but never\n // actually assigned anywhere -- whose 'accept' {note} gets silently dropped, since every\n // call-signaling step after the initial invite is a fire-and-forget {note}, not a {pub} with a\n // server ack, left the caller's UI stuck on \"呼叫中\" forever, with manual hang-up the only way out.\n // This arms a 60s backstop that reuses the exact same hang-up path as clicking cancel by hand\n // (real 'hang-up' note to the peer + the usual top-level state reset), so it doesn't invent any\n // new call-outcome semantics.\n //\n // Note this is a secondary safety net, not the primary defense against a plain unanswered call --\n // the backend already has its own call_establishment_timeout (30s, server/main.go in the im_be\n // reference repo) that ends a genuinely-unanswered call server-side and notifies both parties via\n // {info hang-up}, which handleInfoMessage's 'hang-up' case below already handles independently of\n // this timer. For that common case this 60s timer mostly just no-ops (state has already moved to\n // CALL_STATE_NONE by the time it fires). What it actually guards against is a narrower case: the\n // {info hang-up} notification carrying that server-side timeout is itself lost -- the same class\n // of signaling drop this whole mechanism exists for, just at a different stage. Kept comfortably\n // above the server's own 30s so it never races or duplicates that primary path. Deliberately scoped\n // to just the outgoing-ring wait: adding similar timeouts around mid-call offer/ice-candidate/\n // answer signaling would risk false-positive hangups on connections that are just slow, not\n // actually dropped.\n armCallRingTimeout() {\n clearTimeout(this.callTimeoutTimer);\n this.callTimeoutTimer = setTimeout(() => {\n this.callTimeoutTimer = null;\n if (this.state.callState != CALL_STATE_OUTGOING_INITATED) {\n return;\n }\n this.handleCallHangup(this.state.callTopic, this.state.callSeq);\n this.handleCallClose();\n }, CALL_RING_TIMEOUT_MS);\n }\n\n handleCallInvite(callTopic, callSeq, callState, audioOnly) {\n switch (callState) {\n case CALL_STATE_OUTGOING_INITATED:\n const head = { webrtc: CALL_HEAD_STARTED, aonly: !!audioOnly };\n // sendMessageToTopic 自己的 .catch 会吞掉发送失败(只标记 pub._failed=true 让消息列表画\n // 红色感叹号——这是给聊天气泡设计的反馈方式,通话邀请这条消息不会被用户看到,走这条路径\n // 相当于什么反馈都没有),resolve 成 undefined 而不是 reject。原来这里 `ctrl.code` 直接\n // 解引用,undefined.code 会抛 TypeError,变成一个没人 catch 的 rejected promise——\n // handleCallClose() 根本不会被调用,通话面板会卡在\"呼叫中\"状态出不来,且用户不知道为什么。\n // 今天这条路径已经有真实后果:新的全局通话开关 (im_client_feature) 关闭时服务端会拒绝这条\n // {pub},命中的就是这个从未被验证过的失败分支。\n return this.handleSendMessage(Drafty.videoCall(audioOnly), undefined, undefined, head)\n .then(ctrl => {\n if (!ctrl || ctrl.code < 200 || ctrl.code >= 300 || !ctrl.params || !ctrl.params.seq) {\n this.handleError('通话发起失败,请稍后重试', 'err');\n this.handleCallClose();\n return ctrl;\n }\n this.setState({callSeq: ctrl.params['seq']});\n return ctrl\n }).catch(err => {\n this.handleError((err && err.message) || '通话发起失败,请稍后重试', 'err');\n this.handleCallClose();\n });\n case CALL_STATE_IN_PROGRESS:\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n // We've accepted the call. Let the other side know.\n topic.videoCall('accept', callSeq);\n break;\n }\n }\n\n handleCallRinging(callTopic, callSeq) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('ringing', callSeq);\n }\n\n handleCallHangup(callTopic, callSeq) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('hang-up', callSeq);\n }\n\n handleCallSendOffer(callTopic, callSeq, sdp) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('offer', callSeq, sdp);\n }\n\n handleCallIceCandidate(callTopic, callSeq, candidate) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('ice-candidate', callSeq, candidate);\n }\n handleCallSendAnswer(callTopic, callSeq, sdp) {\n const topic = this.tinode.getTopic(callTopic);\n if (!topic) {\n return;\n }\n\n topic.videoCall('answer', callSeq, sdp);\n }\n\n handleCallClose() {\n if (this.callTimeoutTimer) {\n clearTimeout(this.callTimeoutTimer);\n }\n this.setState({\n callTopic: undefined,\n callState: CALL_STATE_NONE,\n callAudioOnly: undefined,\n // callSeq is otherwise only ever set once handleCallInvite's {pub} ack comes back (see its\n // .then() below), never cleared -- without resetting it here, a call ended before that ack\n // arrives (or armCallRingTimeout's hang-up firing before it) leaves this call's callSeq\n // pointing at whatever the *previous* call's seq was, and the next outgoing call could read\n // that stale value for the brief window before its own ack lands.\n callSeq: undefined,\n // handleCallAccept's \"topic not subscribed yet\" branch (below) sets this and waits for\n // handleNewTopicCreated to both flip callState to CALL_STATE_IN_PROGRESS and clear this flag\n // once that subscription succeeds -- but a call closed/abandoned (rejected, or the subscribe\n // itself failing) before that ever happens left this stuck at true with no owner left to clear\n // it. It would then get read by the *next*, entirely unrelated topic subscription that happens\n // to succeed, incorrectly forcing callState to CALL_STATE_IN_PROGRESS for a call that was\n // already given up on.\n callShouldStart: false\n });\n }\n\n handleCallAccept(topicName, setCallTopic, callSeq) {\n clearTimeout(this.callTimeoutTimer);\n const topic = this.tinode.getTopic(topicName);\n if (!topic) {\n return;\n }\n if (topic.isSubscribed()) {\n this.handleTopicSelected(setCallTopic ? topicName : this.state.callTopic);\n const upd = {\n callState: CALL_STATE_IN_PROGRESS\n };\n if (setCallTopic) {\n upd.callTopic = topicName;\n upd.callSeq = callSeq;\n }\n this.setState(upd);\n } else {\n // We need to switch and subscribe to callTopic first.\n this.setState({\n callShouldStart: true,\n }, _ => this.handleTopicSelected(this.state.callTopic));\n }\n }\n\n handleInfoMessage(info) {\n if (info.what != 'call') {\n return;\n }\n switch (info.event) {\n case 'accept':\n // Either branch below means the outgoing ring wait is over one way or another --\n // see armCallRingTimeout.\n clearTimeout(this.callTimeoutTimer);\n // If another my session has accepted the call.\n if (Tinode.isMeTopicName(info.topic) && this.tinode.isMe(info.from)) {\n this.setState({\n callTopic: null,\n callState: CALL_STATE_NONE,\n callSeq: null,\n callAudioOnly: undefined,\n // Same stuck-flag risk handleCallClose() guards against -- this call is being given up\n // on here just as much as a local close/reject would, so it needs the same cleanup.\n callShouldStart: false\n });\n return;\n }\n if (info.topic == this.state.callTopic) {\n // Update state.\n this.setState({callState: CALL_STATE_IN_PROGRESS});\n }\n break;\n case 'hang-up':\n // Remote hangup.\n this.handleCallClose();\n break;\n }\n }\n\n handleDataMessage(data) {\n if (data.head && data.head.webrtc && data.head.webrtc == CALL_HEAD_STARTED && Tinode.isP2PTopicName(data.topic)) {\n // If it's a video call invite message.\n // See if we need to display incoming call UI.\n const topic = this.tinode.getTopic(data.topic);\n if (topic) {\n // Check if a later version of the message exists (which means the call\n // has been either accepted or finished already).\n const msg = topic.latestMsgVersion(data.seq) || data;\n if (msg.head && msg.head.webrtc && msg.head.webrtc == CALL_HEAD_STARTED) {\n // This is a legit new call.\n if (data.from != this.state.myUserId) {\n if (this.state.callState == CALL_STATE_NONE) {\n // Incoming call.\n this.setState({\n callTopic: data.topic,\n callState: CALL_STATE_INCOMING_RECEIVED,\n callSeq: data.seq,\n callAudioOnly: !!msg.head.aonly\n });\n } else {\n // Another call is either in progress or being established.\n // Reject the incoming call.\n this.handleCallHangup(data.topic, data.seq);\n }\n }\n }\n } else {\n console.warn(\"Received vc data message from unknown topic\", data.topic);\n }\n }\n }\n\n render() {\n const colorSchema = this.state.colorSchema !== 'auto' ? this.state.colorSchema : this.state.systemColorSchema;\n const activeProductView = this.state.sidePanelSelected || (this.state.myUserId ? 'messages-home' : 'tenant');\n const chapterOneViews = ['tenant', 'login', 'enterprise-register', 'enterprise-feedback', 'register',\n 'reset', 'identity-check', 'realname', 'realname-verified', 'realname-reminder', 'independent-password'];\n const chapterOneActive = chapterOneViews.includes(activeProductView);\n const chapterTwoFullPage = ['messages-offline', 'messages-menu', 'message-actions', 'system-messages'].includes(activeProductView) ||\n (!this.state.myUserId && activeProductView === 'messages-home');\n const chapterThreeActive = ['chat-inbound-request', 'chat-inbound-message', 'chat-outbound-request',\n 'chat-status', 'chat-friend', 'chat-media', 'chat-blocked', 'chat-deleted', 'chat-standard',\n 'chat-attachments', 'chat-mixed', 'chat-contact-card'].includes(activeProductView);\n const chapterFourActive = ['compose-keyboard', 'mentions-select', 'mentions-complete', 'mentions-message',\n 'emoji-panel', 'emoji-message', 'voice-ready', 'voice-hold', 'voice-recording',\n 'media-uploading', 'media-gallery', 'media-retry', 'upload-file', 'file-message',\n 'message-multiselect', 'favorite-success', 'forward-select', 'forward-multiple',\n 'forward-individual', 'forward-bundle'].includes(activeProductView);\n const chapterFiveActive = ['address-book', 'friend-requests', 'add-friend', 'my-friend-qr', 'friend-qr',\n 'friend-search-result', 'friend-verification', 'friend-profile', 'group-member-profile',\n 'friend-settings', 'friend-settings-blocked', 'friend-delete-confirm', 'block-list',\n 'block-confirm', 'clear-chat-confirm'].includes(activeProductView);\n const chapterSixActive = ['group-list', 'group-empty', 'group-invite', 'group-events',\n 'group-join-requests', 'group-new-request', 'group-announcement', 'group-summary',\n 'group-announcement-detail', 'group-settings', 'group-profile', 'group-avatar',\n 'group-nickname', 'group-description', 'group-my-nickname', 'group-members', 'group-role-message', 'group-qr', 'group-governance',\n 'group-admins', 'group-admin-add', 'group-admin-success', 'group-admin-partial',\n 'group-admin-removed', 'group-mute-add', 'group-muted', 'group-owner-select',\n 'group-owner-confirm', 'group-files', 'group-file-upload'].includes(activeProductView);\n const chapterSevenActive = ['favorites', 'favorites-mixed', 'favorites-files', 'favorites-text',\n 'favorites-voice', 'favorites-links', 'favorites-image', 'favorites-video', 'favorites-select', 'favorite-share', 'file-download',\n 'file-downloading', 'file-downloaded', 'history-search', 'history-files', 'history-links',\n 'history-images', 'history-videos'].includes(activeProductView);\n const callExperienceActive = ['call-history', 'call-incoming', 'audio-call-ringing',\n 'audio-call-active', 'audio-call-muted', 'audio-call-speaker', 'video-call-ringing',\n 'video-call-camera-off', 'video-call-active', 'video-call-peer-camera-off',\n 'call-minimized'].includes(activeProductView);\n const workplaceCollaborationActive = ['workbench', 'organization-directory', 'meeting-organizer',\n 'meeting-attendee', 'meeting-create', 'meeting-detail', 'daily-report-editor', 'daily-report-mine', 'daily-report-team',\n 'daily-report-detail', 'monthly-report-editor', 'monthly-report-mine', 'monthly-report-team',\n 'monthly-report-detail', 'executive-mailbox', 'executive-mailbox-notice'].includes(activeProductView);\n const personalSettingsActive = ['personal-center', 'personal-profile', 'profile-nickname',\n 'profile-birth-date', 'profile-signature', 'profile-gender', 'profile-region', 'personal-qrcode', 'android-settings',\n 'cache-clear-confirm', 'clear-history-confirm', 'change-password', 'delete-account-confirm',\n 'app-version', 'privacy-settings',\n 'friend-discovery-settings', 'youth-mode-off', 'youth-mode-on', 'youth-mode-verify',\n 'notification-permission', 'permission-settings-reminder',\n 'camera-permission-info', 'microphone-permission-info'].includes(activeProductView);\n const securitySupportActive = ['fraud-risk-warning', 'fraud-risk-confirmation',\n 'abuse-report-reasons', 'abuse-report-details', 'user-feedback'].includes(activeProductView);\n return (\n \n {this.state.contextMenuVisible ?\n
{\n if (topicName == this.state.topicSelected) {\n this.handleTopicSelected(null);\n }\n }}\n onError={this.handleError} />\n :\n null\n }\n {this.state.forwardDialogVisible ?\n \n :\n null\n }\n {this.state.batchForwardVisible ?\n { this.handleHideBatchForward(); if (sent) { this.handleExitSelectMode(); } }}\n onInitFind={this.tnInitFind}\n searchResults={this.state.searchResults}\n onSearchContacts={this.handleSearchContacts}\n />\n :\n null\n }\n {this.state.callTopic && this.state.callState == CALL_STATE_INCOMING_RECEIVED ?\n \n :\n null\n }\n {this.state.scannerOpen ?\n \n :\n null\n }\n {this.state.groupJoinPreview ?\n \n :\n null\n }\n {this.state.alertVisible ?\n this.setState({alertVisible: false})) : null}\n reject={this.state.alertParams.reject}\n onConfirm={this.state.alertParams.onConfirm ?\n (_ => {this.setState({alertVisible: false}); this.state.alertParams.onConfirm();}) : null}\n confirm={this.state.alertParams.confirm}\n /> : null}\n\n {!this.state.displayMobile || this.state.mobilePanel == 'sidepanel' ?\n \n : null}\n\n {!chapterOneActive && !chapterTwoFullPage && !chapterThreeActive && !chapterFourActive && !chapterFiveActive && !chapterSixActive && !chapterSevenActive && !callExperienceActive && !workplaceCollaborationActive && !personalSettingsActive && !securitySupportActive && (!this.state.displayMobile || (this.state.mobilePanel == 'topic-view' && !this.state.infoPanel)) ?\n }>\n \n \n : null}\n\n {this.state.infoPanel ?\n }>\n \n \n :\n null\n }\n \n );\n }\n};\n\nexport default injectIntl(TinodeWeb);\n","// View for editing topic parameters (including 'me' topic).\n\nimport React from 'react';\n\nimport TopicDescEdit from '../widgets/topic-desc-edit.jsx';\n\nimport { arrayEqual } from '../lib/utils.js';\n\nexport default class TopicCommonView extends React.Component {\n constructor(props) {\n super(props);\n\n const topic = this.props.tinode.getTopic(this.props.topic);\n const acs = topic.getAccessMode();\n this.state = {\n tags: []\n };\n\n this.previousTagsUpdated = undefined;\n\n this.onTagsUpdated = this.onTagsUpdated.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (topic.onTagsUpdated != this.onTagsUpdated) {\n if (topic.getType() == 'grp') {\n this.previousTagsUpdated = topic.onTagsUpdated;\n topic.onTagsUpdated = this.onTagsUpdated;\n } else {\n this.previousTagsUpdated = undefined;\n }\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n }\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onTagsUpdated = this.previousTagsUpdated;\n }\n\n // Server informs that the tags have been updated.\n onTagsUpdated(tags) {\n this.setState({tags: tags});\n\n if (this.previousTagsUpdated && this.previousTagsUpdated != this.onTagsUpdated) {\n this.previousTagsUpdated(tags);\n }\n }\n\n // Request server to change tags.\n handleTagsUpdated(tags) {\n if (!arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n this.props.onUpdateTagsRequest(this.props.topic, tags);\n }\n }\n\n render() {\n return (\n \n \n
\n );\n }\n};\n","// ValidationView: panel for confirming credentials, like email or phone.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n phone: {\n id: 'phone_dative',\n defaultMessage: 'phone',\n description: \"Dative case of 'phone', i.e. 'phone' in 'by phone'\",\n },\n email: {\n id: 'email_dative',\n defaultMessage: 'email',\n description: \"Dative case of 'email', i.e. 'email' in 'by email'\",\n }\n});\n\nclass ValidationView extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n code: props.credCode || '',\n codeReceived: props.credCode\n };\n\n this.handleCodeChange = this.handleCodeChange.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n if (nextProps.credCode != prevState.codeReceived) {\n return {\n code: nextProps.credCode || '',\n codeReceived: nextProps.credCode\n };\n }\n\n return prevState;\n }\n\n componentDidMount() {\n // Submit code automatically if it's received from the parent.\n if (this.props.credCode) {\n this.props.onSubmit(this.props.credMethod, this.props.credCode, this.props.credToken);\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n // Submit code automatically if it's received from the parent.\n if (this.state.codeReceived && this.state.code && this.state.code != prevState.code) {\n this.props.onSubmit(this.props.credMethod, this.state.code, this.props.credToken);\n }\n }\n\n\n handleCodeChange(e) {\n this.setState({code: e.target.value.replace(/[^\\d]/g, '')});\n }\n\n handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n } else if (e.key == 'Escape') {\n this.handleCancel(e);\n }\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.code && this.state.code.trim()) {\n this.props.onSubmit(this.props.credMethod, this.state.code.trim(), this.props.credToken);\n }\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel();\n }\n\n render() {\n const { formatMessage } = this.props.intl;\n const methods = {'email': formatMessage(messages.email), 'tel': formatMessage(messages.phone)};\n const method = methods[this.props.credMethod] || this.props.credMethod;\n return (\n \n
\n \n \n \n
\n
\n {\n (numbers_only) => \n } \n
\n
\n \n \n \n \n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(ValidationView);\n","import React from 'react';\n\nimport ContactList from '../widgets/contact-list.jsx';\n\nimport HashNavigation from '../lib/navigation.js';\nimport {\n uploadLargeFile, getMe, getFileUrl, getUserProfile,\n getWorkbench,\n getOrganizationDepartments, getOrganizationDepartmentMembers, getOrganizationMembers, searchOrganization,\n getMeetings, createMeeting, getMeeting, cancelMeeting, sendMeetingReminders, respondMeeting,\n getDailyReports, createDailyReport, getDailyReport, updateDailyDraft, submitDailyReport, getDailyStatistics, sendDailyReminders,\n getMonthlyReports, createMonthlyReport, getMonthlyReport, updateMonthlyDraft, submitMonthlyReport, reopenMonthlyReport, getMonthlyStatistics,\n getExecutiveMailboxConfig, submitExecutiveMailboxMessage\n} from '../lib/im-api.js';\nimport { useCachedData, readCachedData, writeCachedData } from '../lib/use-cached-data.js';\n\nconst navigate = (view, params) => {\n let hash = HashNavigation.setUrlSidePanel(window.location.hash, view);\n Object.entries(params || {}).forEach(([key, value]) => {\n hash = value ? HashNavigation.addUrlParam(hash, key, value) : HashNavigation.removeUrlParam(hash, key);\n });\n HashNavigation.navigateTo(hash);\n};\n\nexport const WORKPLACE_COLLABORATION_VIEWS = [\n 'workbench', 'organization-directory', 'meeting-organizer', 'meeting-attendee', 'meeting-create', 'meeting-detail',\n 'daily-report-editor', 'daily-report-mine', 'daily-report-team', 'daily-report-detail',\n 'monthly-report-editor', 'monthly-report-mine', 'monthly-report-team', 'monthly-report-detail',\n 'executive-mailbox', 'executive-mailbox-notice'\n];\n\nfunction Icon({children}) { return {children} ; }\n\nfunction Header({title, back = 'workbench', action, actionLabel, onAction, actionDisabled}) {\n return \n { if (!HashNavigation.goBack()) navigate(back); }} aria-label=\"返回\">arrow_back_ios_new \n {title} \n {action ? {action} : }\n ;\n}\n\nfunction Toast({message, onDone}) {\n React.useEffect(() => {\n if (!message) return undefined;\n const timer = window.setTimeout(onDone, 2100);\n return () => window.clearTimeout(timer);\n }, [message, onDone]);\n return message ? {message}
: null;\n}\n\n// \"6月25日 周四(今天)\" style used throughout this chapter's reference screenshots.\nconst WEEKDAYS = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];\nfunction formatMeetingDate(d) {\n const now = new Date();\n const dayDiff = Math.round((new Date(d.getFullYear(), d.getMonth(), d.getDate()) -\n new Date(now.getFullYear(), now.getMonth(), now.getDate())) / 86_400_000);\n const suffix = dayDiff === 0 ? '(今天)' : dayDiff === 1 ? '(明天)' : dayDiff === -1 ? '(昨天)' : '';\n return `${d.getMonth() + 1}月${d.getDate()}日 ${WEEKDAYS[d.getDay()]}${suffix}`;\n}\nfunction formatTime(d) {\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;\n}\n// toISOString() is always UTC -- for any timezone ahead of UTC (e.g. China, UTC+8) this returned\n// the *previous* calendar day for the first several hours of every local day (00:00-08:00 local\n// still reads as \"yesterday\" in UTC), so opening the daily report editor in the early morning\n// loaded/redirected to yesterday's already-submitted report instead of starting today's. Match\n// toMonthInputValue's already-correct local-getters approach instead.\nfunction toDateInputValue(d) {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\n}\n\n// Resolves a bare/prefixed user id to a display name, cached -- organization member/meeting\n// participant ids returned by different Ch.9 endpoints aren't consistently confirmed to carry the\n// 'usr' prefix, so try the id as given first and fall back to prefixing it before giving up.\nconst nameCache = new Map();\nfunction resolveUserName(id, onDone) {\n if (!id) return;\n if (nameCache.has(id)) { onDone(nameCache.get(id)); return; }\n const withPrefix = id.startsWith('usr') ? null : 'usr' + id;\n getUserProfile(id).catch(err => withPrefix ? getUserProfile(withPrefix) : Promise.reject(err)).then(p => {\n const name = (p && (p.display_name || p.nickname || p.public_account)) || id;\n nameCache.set(id, name);\n onDone(name);\n }).catch(() => { nameCache.set(id, id); onDone(id); });\n}\n\n// GET /users/{id}/profile 400s (\"malformed request\") when {id} is the caller's own uid -- same\n// backend restriction AdminList already routes around by never calling this endpoint for the owner.\n// author_id/organizer_id fields here have no such alternative source, so the caller's own id has to\n// be special-cased directly rather than resolved through the same lookup as everyone else's.\nfunction useUserNames(ids, myUserId) {\n const [names, setNames] = React.useState({});\n React.useEffect(() => {\n (ids || []).forEach(id => {\n if (!id || names[id] !== undefined) return;\n const prefixed = id.startsWith('usr') ? id : 'usr' + id;\n if (myUserId && prefixed === myUserId) { setNames(v => ({...v, [id]: '我'})); return; }\n resolveUserName(id, name => setNames(v => ({...v, [id]: name})));\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(ids), myUserId]);\n return names;\n}\n\n// Real module codes confirmed live from GET /workbench (differ from the mock's guessed\n// monthly/daily/organization/meeting/mailbox). 'attendance' (\"打卡\") is a real, enabled module\n// with no reference screenshot or requirements text anywhere in this chapter -- routed to a\n// \"not yet available\" toast rather than guessing a feature with zero design reference.\nconst APP_TONES = {organization: 'red', attendance: 'orange', meetings: 'blue', daily_reports: 'orange', monthly_reports: 'violet', executive_mailbox: 'green'};\nconst APP_ICONS = {organization: 'account_tree', attendance: 'schedule', meetings: 'notifications_active', daily_reports: 'task_alt', monthly_reports: 'event_note', executive_mailbox: 'mail_outline'};\nconst APP_ROUTES = {organization: 'organization-directory', meetings: 'meeting-attendee', daily_reports: 'daily-report-mine', monthly_reports: 'monthly-report-mine', executive_mailbox: 'executive-mailbox'};\n\nfunction Workbench({onToast}) {\n // `me` and `modules` decide whether this screen renders its real content or a blank/loading\n // placeholder -- caching just these two (not the per-icon `icons` map, which fills in gradually\n // regardless) removes the \"blank workbench for a beat\" flash every time the user tabs back to it.\n const [me] = useCachedData('me', getMe, []);\n const [modules, setModules] = React.useState(() => readCachedData('workbench-modules') || []);\n const [icons, setIcons] = React.useState({});\n const [error, setError] = React.useState(null);\n\n React.useEffect(() => {\n getWorkbench().then(data => {\n const list = (data && data.modules) || [];\n writeCachedData('workbench-modules', list);\n setModules(list);\n list.forEach(m => {\n if (m.icon_file_id) {\n getFileUrl(m.icon_file_id).then(url => url && setIcons(v => ({...v, [m.code]: url}))).catch(() => {});\n }\n });\n }).catch(err => setError(err.message || '工作台加载失败'));\n }, []);\n\n const openApp = app => {\n if (APP_ROUTES[app.code]) { navigate(APP_ROUTES[app.code]); return; }\n onToast && onToast('该功能暂未开放');\n };\n\n const profile = me && me.profile;\n return \n \n {profile && profile.avatar_file_id ?\n :\n person }\n {(profile && (profile.nickname || profile.public_account)) || '…'} \n 员工 \n navigate('personal-center')}>tune \n \n 提高效率,从工作台开始 Business applications start from the workbench
business_center \n {error ? {error}
: null}\n {modules.filter(m => m.enabled).map(app => openApp(app)}>\n {/* Namespaced ('tone-red', not 'red') because base.css's original Tinode styles already define\n bare `.red`/`.orange`/`.blue`/`.green` as generic `color: ... !important` text-color\n utilities -- an unprefixed tone class here collided with those and, since `!important`\n beats this span's own `color: #fff`, silently retinted 5 of these 6 icons to whichever\n generic accent color happened to share their tone's name (only 月报's 'violet' has no such\n collision, which is why it alone rendered the intended plain white) instead of the uniform\n white every icon here is meant to have -- same bug, same fix, as message-center-view.jsx's\n Avatar tone class. */}\n \n {icons[app.code] ? : {APP_ICONS[app.code] || 'apps'} }\n {app.unread_count ? {app.unread_count > 99 ? '99+' : app.unread_count} : null}\n \n {app.name} \n )} \n \n dashboard 工作台 \n navigate('messages-home')}>chat_bubble_outline 消息 \n ;\n}\n\n// Resolves a file id to an , used for the few real photo/icon spots in this chapter\n// (workbench module icons, my own avatar) -- most Ch.9 screens use plain icons/text only,\n// confirmed against every reference screenshot, so this is intentionally not used everywhere.\nfunction ImgFromFile({fileId, className}) {\n const [url, setUrl] = React.useState(null);\n React.useEffect(() => { let live = true; getFileUrl(fileId).then(u => live && setUrl(u)).catch(() => {}); return () => { live = false; }; }, [fileId]);\n return url ? : ;\n}\n\n// Depth-based icon per docs/images/部门组织框架.png: level 1 = building, level 2 (collapsed) =\n// hollow diamond / (expanded) = filled blue diamond, level 3+ (a person, not a sub-department) =\n// hollow circle. The backend never returns a depth field (confirmed against organizationDepartmentPayload),\n// so depth is purely how far this node is from the root in the client's own recursion.\n// 层级标注统一用中文数字。原来树形分支只手写到\"二级\"、更深就退化成\"3级\",\n// 而搜索分支又硬传字符串 \"三\",同一个标注两条路径两种格式。\nconst LEVEL_NUMERALS = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十'];\nconst levelLabel = n => LEVEL_NUMERALS[n - 1] || String(n);\n\nfunction DeptRow({dept, depth, expanded, onToggle}) {\n const icon = depth === 0 ? 'business' : 'diamond';\n return \n {icon} \n {dept.name}{typeof dept.member_count === 'number' ? `${dept.member_count}人` : ''}({levelLabel(depth + 1)}级) \n {expanded ? 'expand_more' : 'chevron_right'} \n ;\n}\n\n// Search-result-only department row: no tree position to expand into (search returns a flat\n// match list, not a subtree), so unlike DeptRow this is informational, not clickable.\nfunction SearchDeptRow({dept}) {\n return \n business \n {dept.name}{typeof dept.member_count === 'number' ? `(${dept.member_count}人)` : ''} \n
;\n}\n\nfunction PersonRow({person, depth, isMe, level}) {\n return navigate('group-member-profile', {uid: person.user_id})}>\n radio_button_unchecked \n {person.display_name}({levelLabel(level)}级) \n chevron_right \n ;\n}\n\n// One department node: on first expand, fetches its child departments AND its direct members\n// (two separate calls -- there is no combined endpoint) and renders both, recursing for children.\nfunction DeptNode({dept, depth, myUserId}) {\n const [expanded, setExpanded] = React.useState(depth === 0);\n const [children, setChildren] = React.useState(null);\n const [members, setMembers] = React.useState(null);\n const [loading, setLoading] = React.useState(false);\n const [loadError, setLoadError] = React.useState(false);\n\n const load = () => {\n if (children != null) return;\n setLoading(true);\n setLoadError(false);\n Promise.all([\n dept.child_count ? getOrganizationDepartments(dept.department_id).then(d => d.departments || d.items || []) : Promise.resolve([]),\n dept.member_count ? getOrganizationDepartmentMembers(dept.department_id).then(d => d.members || d.items || []) : Promise.resolve([])\n ]).then(([depts, mems]) => { setChildren(depts); setMembers(mems); })\n // Without this, a rejected Promise.all left children/members at null forever -- rendered as\n // an empty (but not loading) node, indistinguishable from \"this department genuinely has no\n // sub-departments or members\". loadError lets the retry link below tell the two apart.\n .catch(() => setLoadError(true))\n .finally(() => setLoading(false));\n };\n\n const toggle = () => { const next = !expanded; setExpanded(next); if (next) load(); };\n React.useEffect(() => { if (expanded) load(); /* eslint-disable-next-line react-hooks/exhaustive-deps */ }, []);\n\n return <>\n \n {expanded && loading ? 加载中…
: null}\n {expanded && !loading && loadError ?\n 加载失败 { e.preventDefault(); load(); }}>重试
: null}\n {expanded && !loading && !loadError ? <>\n {(children || []).map(child => )}\n {(members || []).map(person => )}\n > : null}\n >;\n}\n\nfunction durationLabel(startAt, endAt) {\n const mins = Math.round((new Date(endAt) - new Date(startAt)) / 60_000);\n if (mins <= 0) return '';\n if (mins % 60 === 0) return `${mins / 60}小时`;\n if (mins < 60) return `${mins}分钟`;\n return `${Math.floor(mins / 60)}小时${mins % 60}分钟`;\n}\n\nconst RESPONSE_LABEL = {accepted: '已接受', declined: '已拒绝', tentative: '待定'};\n\n// 这条只对 GET /meetings(列表)成立——实测确认只有列表接口会解析真实姓名,MeetingCard 只在\n// 列表页使用,不需要额外查询。**创建/详情/更新/取消/我的回应这5个接口不会**(display_name\n// 恒等于裸 user_id,第一次记录这条时误以为\"响应已带姓名解析\"对所有会议接口都成立,被这次复测\n// 用真实创建的会议证伪)——MeetingDetail 复用的是这5个接口之一,接了 useUserNames 兜底。\nfunction MeetingCard({meeting, myUserId, onRespond, onToast}) {\n const organizerName = (meeting.organizer && meeting.organizer.display_name) || meeting.organizer_display_name || meeting.organizer_id;\n const attendeeNames = (meeting.participants || []).map(p => p.display_name || p.user_id).join('、');\n const isOrganizer = meeting.organizer_id === myUserId;\n const [busy, setBusy] = React.useState(false);\n\n const respond = response => {\n setBusy(true);\n // Same stale-version hazard MeetingDetail's respond/cancel already guard against (every\n // participant's response bumps the meeting's version) -- this card's `meeting` prop is\n // whatever the list loaded, which can be behind if another invitee responded since.\n getMeeting(meeting.meeting_id).then(fresh => respondMeeting(fresh.meeting_id, response, fresh.version)).then(_ => {\n onRespond();\n onToast(response === 'accepted' ? '已接受会议邀请' : response === 'declined' ? '已拒绝会议邀请' : '已标记为待定');\n }).catch(err => onToast(err.message || '操作失败')).finally(() => setBusy(false));\n };\n\n return \n {formatMeetingDate(new Date(meeting.start_at))} {formatTime(new Date(meeting.start_at))} \n 会议主题:{meeting.title} \n navigate('meeting-detail', {meeting_id: meeting.meeting_id})}>查看更多chevron_right \n \n \n
发起人 {organizerName} \n
时间 {formatMeetingDate(new Date(meeting.start_at))} \n {meeting.location ?
地点 {meeting.location} : null}\n
参会人 {attendeeNames || '无'} \n
会议时间 {durationLabel(meeting.start_at, meeting.end_at)} \n \n {!isOrganizer ? (\n meeting.my_response && meeting.my_response !== 'pending' ?\n {RESPONSE_LABEL[meeting.my_response] || meeting.my_response} :\n \n respond('declined')}>拒绝 \n respond('accepted')}>接受 \n \n ) : null}\n ;\n}\n\nfunction Meetings({onToast}) {\n const [meetings, setMeetings] = React.useState(() => readCachedData('meetings') || null);\n const [me] = useCachedData('me', getMe, []);\n const myUserId = me && me.user_id;\n\n const load = () => getMeetings().then(d => {\n const list = d.meetings || d.items || [];\n writeCachedData('meetings', list);\n setMeetings(list);\n }).catch(() => setMeetings(prev => prev || []));\n // `load` has a concise arrow body, so it returns the whole promise chain -- passing it directly as\n // the effect callback made React treat that promise as an (invalid) cleanup return value.\n React.useEffect(() => { load(); }, []);\n\n return navigate('meeting-create')} />\n \n {meetings == null ? 加载中…
:\n meetings.length === 0 ? 暂无会议通知
:\n meetings.map(m => )}\n \n ;\n}\n\nfunction MeetingDetail({hashParams, onToast}) {\n const meetingId = hashParams && hashParams.meeting_id;\n const [meeting, setMeeting] = React.useState(() => (meetingId && readCachedData('meeting:' + meetingId)) || null);\n const [me] = useCachedData('me', getMe, []);\n const myUserId = me && me.user_id;\n const [busy, setBusy] = React.useState(false);\n const [loadError, setLoadError] = React.useState(false);\n // 详情/创建/更新/取消/我的回应这5个接口的 organizer.display_name / participants[].display_name\n // 实测就是裸 user_id 本身(只有列表接口 GET /meetings 真的解析姓名)——上面 MeetingCard 那段\n // \"响应已带姓名解析、不需要额外查询\"的注释只对列表成立,本页面复用同一份 useUserNames 兜底\n // (日报/月报详情页已经在用同一套机制)。\n const participantIds = (meeting && meeting.participants || []).map(p => p.user_id);\n const nameIds = meeting ? [meeting.organizer_id, ...participantIds] : [];\n const resolvedNames = useUserNames(nameIds, myUserId);\n const nameFor = (id, fallback) => {\n if (fallback && fallback !== id) return fallback;\n return (id && resolvedNames[id]) || fallback || id;\n };\n\n const load = () => meetingId && getMeeting(meetingId).then(m => { writeCachedData('meeting:' + meetingId, m); setMeeting(m); }).catch(err => { onToast(err.message || '加载失败'); setLoadError(true); });\n React.useEffect(() => {\n // This view is only ever keyed by view-name in sidepanel-view.jsx, not by meeting_id, so jumping\n // directly between two different meetings' details would otherwise briefly show the previous\n // meeting's cached data under the new id -- reseed explicitly from the new id's own cache entry.\n if (meetingId) setMeeting(readCachedData('meeting:' + meetingId) || null);\n load();\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [meetingId]);\n\n if (!meeting) return {loadError ? '会议信息加载失败' : '加载中…'}
;\n\n const counts = {accepted: 0, pending: 0, declined: 0, tentative: 0};\n (meeting.participants || []).forEach(p => { counts[p.response] = (counts[p.response] || 0) + 1; });\n const isOrganizer = meeting.organizer_id === myUserId;\n\n const remind = () => {\n setBusy(true);\n sendMeetingReminders(meeting.meeting_id).then(_ => onToast('已提醒未响应成员')).catch(err => onToast(err.message || '提醒失败')).finally(() => setBusy(false));\n };\n const cancel = () => {\n setBusy(true);\n // Every participant response bumps the meeting's version, so refetch immediately before\n // cancelling to avoid a stale-version rejection.\n getMeeting(meeting.meeting_id).then(fresh => cancelMeeting(fresh.meeting_id, fresh.version))\n .then(_ => { onToast('会议已取消'); load(); }).catch(err => onToast(err.message || '取消失败')).finally(() => setBusy(false));\n };\n const respond = response => {\n setBusy(true);\n getMeeting(meeting.meeting_id).then(fresh => respondMeeting(fresh.meeting_id, response, fresh.version))\n .then(_ => { onToast(RESPONSE_LABEL[response] ? `已${RESPONSE_LABEL[response]}` : '已回应'); load(); })\n .catch(err => onToast(err.message || '操作失败')).finally(() => setBusy(false));\n };\n\n return \n
\n \n {formatMeetingDate(new Date(meeting.start_at))} {formatTime(new Date(meeting.start_at))} \n 会议主题:{meeting.title} \n \n
发起人 {nameFor(meeting.organizer_id, (meeting.organizer && meeting.organizer.display_name) || meeting.organizer_display_name)} \n
时间 {formatMeetingDate(new Date(meeting.start_at))} {formatTime(new Date(meeting.start_at))} - {formatTime(new Date(meeting.end_at))} \n {meeting.location ?
地点 {meeting.location} : null}\n
会议时间 {durationLabel(meeting.start_at, meeting.end_at)} \n \n \n {(meeting.participants || []).map(p => \n {nameFor(p.user_id, p.display_name)} \n {RESPONSE_LABEL[p.response] || '待确认'} \n )}\n \n {!isOrganizer && meeting.permissions && meeting.permissions.can_respond && (!meeting.my_response || meeting.my_response === 'pending') ?\n \n respond('declined')}>无法参加 \n respond('tentative')}>待定 \n respond('accepted')}>接受 \n : null}\n \n {isOrganizer ? \n 参会确认 \n {counts.accepted} 已接受 {counts.pending} 待响应 {counts.declined} 已拒绝
\n \n {meeting.permissions && meeting.permissions.can_remind ? notifications 提醒未响应 : null}\n {/* 后端常量是 \"canceled\" 单 l(store/types/meetings.go:7),原来写成 \"cancelled\" 永远不相等,\n 会议取消之后\"取消会议\"按钮还挂在那儿 */}\n {meeting.permissions && meeting.permissions.can_cancel && meeting.state !== 'canceled' ? 取消会议 : null}\n \n : null}\n \n
;\n}\n\nfunction MeetingCreate({myUserId, tinode, onToast}) {\n const [title, setTitle] = React.useState('');\n const [date, setDate] = React.useState(toDateInputValue(new Date()));\n const [startTime, setStartTime] = React.useState('');\n const [endTime, setEndTime] = React.useState('');\n const [location, setLocation] = React.useState('');\n const [query, setQuery] = React.useState('');\n const [candidates, setCandidates] = React.useState([]);\n const [selected, setSelected] = React.useState([]);\n const [names, setNames] = React.useState({});\n const [submitting, setSubmitting] = React.useState(false);\n\n React.useEffect(() => {\n const handle = window.setTimeout(() => {\n getOrganizationMembers({query}).then(d => setCandidates(d.members || d.items || [])).catch(() => setCandidates([]));\n }, 300);\n return () => window.clearTimeout(handle);\n }, [query]);\n\n const toggle = uid => {\n setSelected(v => v.includes(uid) ? v.filter(x => x != uid) : v.concat(uid));\n const cand = candidates.find(c => c.user_id === uid);\n if (cand) setNames(v => ({...v, [uid]: cand.display_name}));\n };\n\n const contacts = candidates.map(c => ({user: c.user_id, public: {fn: c.display_name}}));\n\n const submit = () => {\n if (!title.trim() || !date || !startTime || !endTime || selected.length === 0) {\n onToast('请完善会议主题、时间与参会人');\n return;\n }\n const startAt = new Date(`${date}T${startTime}:00`).toISOString();\n const endAt = new Date(`${date}T${endTime}:00`).toISOString();\n // Backend 400s with {details:{field:\"end_at\"}} for this (real request confirmed), but nothing\n // upstream of onToast reads `details` -- catching it locally avoids a round-trip for the single\n // most likely input mistake (single shared date, two independent time inputs).\n if (endAt <= startAt) { onToast('结束时间需晚于开始时间'); return; }\n setSubmitting(true);\n createMeeting({title: title.trim(), start_at: startAt, end_at: endAt, location: location.trim(), attendee_user_ids: selected})\n .then(_ => { onToast('会议已发起'); navigate('meeting-attendee'); })\n .catch(err => onToast((err.details && err.details.field === 'end_at') ? '结束时间需晚于开始时间' : (err.message || '发起会议失败')))\n .finally(() => setSubmitting(false));\n };\n\n return ;\n}\n\nfunction OrganizationDirectory({myUserId}) {\n const [query, setQuery] = React.useState('');\n const [searchResults, setSearchResults] = React.useState(null);\n const [roots, setRoots] = React.useState(() => readCachedData('org-roots') || null);\n const [rootsError, setRootsError] = React.useState(false);\n const [tenantName, setTenantName] = React.useState('');\n\n const loadRoots = React.useCallback(() => {\n setRootsError(false);\n getOrganizationDepartments('root').then(d => {\n const list = d.departments || d.items || [];\n writeCachedData('org-roots', list);\n setRoots(list);\n }).catch(() => {\n // Was collapsing a genuine load failure into the exact same `roots: []` state as \"this\n // tenant truly has no departments\" -- rootsError lets the render below tell them apart\n // instead of showing \"暂无组织架构数据\" for what might just be a network blip.\n setRoots(prev => prev || []);\n setRootsError(true);\n });\n }, []);\n\n React.useEffect(() => {\n loadRoots();\n try {\n const tenant = JSON.parse(window.localStorage.getItem('im-tenant') || '{}');\n setTenantName(tenant.name || '');\n } catch (_) { /* ignore */ }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Was calling getOrganizationMembers({query}) -- besides that function's own now-fixed q/query\n // param bug, it only ever returns users, so \"搜索成员或部门\" (search members OR departments) could\n // never actually find a department. searchOrganization is the documented endpoint for this exact\n // box (GET /organization/search?q=&types=department,user) and already existed in im-api.js, matching\n // the real backend, but had no caller anywhere -- a correct implementation nothing used.\n React.useEffect(() => {\n if (!query.trim()) { setSearchResults(null); return; }\n const handle = window.setTimeout(() => {\n searchOrganization(query).then(d => setSearchResults(d.items || [])).catch(() => setSearchResults([]));\n }, 300);\n return () => window.clearTimeout(handle);\n }, [query]);\n\n return \n
\n search \n setQuery(event.target.value)} placeholder=\"搜索成员或部门\" />\n \n {searchResults ?\n \n {searchResults.length === 0 ? 未找到匹配的成员
:\n searchResults.map((item, idx) => item.type === 'department' ?\n :\n )}\n :\n }\n \n
;\n}\n\n// The backend's daily report Content field is a flat string (confirmed against\n// store/types/reports.go -- no entries array exists server-side). docs/images/日报.png shows a\n// repeatable \"起止时间 + 今日工作总结\" block editor, so that's purely a front-end authoring\n// convenience: blocks are joined into one formatted string before being sent as `content`.\nfunction blocksToContent(blocks) {\n return blocks\n .filter(b => b.content.trim())\n .map(b => (b.start && b.end ? `${b.start}-${b.end}\\n` : '') + b.content.trim())\n .join('\\n\\n');\n}\n\nfunction DailyReportEditor({onToast}) {\n const today = toDateInputValue(new Date());\n const cacheKey = 'daily-report-editor:' + today;\n // This composer sits in a side panel next to chat -- a user plausibly starts today's report,\n // switches away to answer a message, and comes back mid-edit, so seed from cache (not just the\n // read-only hub pages) to avoid the blocks textarea flashing back to empty on that round trip.\n // createDailyReport() below always still runs and overwrites this with the server's own state,\n // so a stale/wrong seed here self-corrects within one request -- same \"revalidate in background\"\n // shape as everywhere else, just with a same-shape object rather than a single field.\n const cached = readCachedData(cacheKey);\n const [reportId, setReportId] = React.useState(cached ? cached.reportId : null);\n const [version, setVersion] = React.useState(cached ? cached.version : null);\n // The debounced autosave below reads `version` from inside a setTimeout scheduled by an effect\n // keyed on `blocks`/`reportId` (not `version`) -- if a save request is still in flight when the\n // next edit re-schedules the timer, the new timer's closure captures whatever `version` was at\n // that moment, which can be one save behind the real server version by the time it actually\n // fires (the earlier save's response, which bumps `version`, can land after the new timer was\n // created but before it runs). A ref always reflects the latest value regardless of when the\n // closure was created, so reads through it can't be stale the way a captured state variable can.\n const versionRef = React.useRef(cached ? cached.version : null);\n const setVersionBoth = v => { versionRef.current = v; setVersion(v); };\n const [blocks, setBlocks] = React.useState(cached ? cached.blocks : [{start: '', end: '', content: ''}]);\n const [saved, setSaved] = React.useState(false);\n const [saveError, setSaveError] = React.useState(false);\n const [submitting, setSubmitting] = React.useState(false);\n // Serializes every draft save (the debounced autosave below AND submit()'s own pre-submit save)\n // through one chain, so two overlapping requests can never both read the same not-yet-updated\n // versionRef and race the server -- confirmed live: clicking submit right as/after the debounce\n // timer's own autosave fires can otherwise send two saves built from the same stale version, and\n // whichever the server sees second comes back 409 VERSION_CONFLICT, leaving the report un-submitted\n // with no obvious explanation. Reopening a cached draft and only touching a little before submitting\n // (now a normal flow, where blank-every-time wasn't) makes this window much easier to hit than before.\n const saveChainRef = React.useRef(Promise.resolve());\n const draftTimerRef = React.useRef(null);\n const saveDraft = React.useCallback(nextBlocks => {\n const run = () => updateDailyDraft(reportId, blocksToContent(nextBlocks), versionRef.current, []).then(r => {\n setVersionBoth(r.version); setSaved(true); setSaveError(false);\n writeCachedData(cacheKey, {reportId, version: r.version, blocks: nextBlocks});\n return r;\n });\n const next = saveChainRef.current.then(run);\n saveChainRef.current = next.catch(() => {});\n return next;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [reportId]);\n\n React.useEffect(() => {\n createDailyReport(today).then(r => {\n // createDailyReport is idempotent -- reopening this editor for a day whose report was already\n // submitted returns that same (now non-draft) report instead of erroring. The draft-save\n // endpoint's UPDATE is scoped to `WHERE status='draft'` (im_be's TenantDailyReportSaveDraft),\n // so every autosave against a submitted report's affected-rows count is 0 -> a 409 that used\n // to be silently swallowed. can_edit is the backend's own real-time signal for this (same\n // status check), so redirect to the read-only detail view instead of handing the user a\n // composer that looks editable but can never actually save.\n if (r.permissions && r.permissions.can_edit === false) { navigate('daily-report-detail', {report_id: r.report_id}); return; }\n const nextBlocks = r.content ? [{start: '', end: '', content: r.content}] : [{start: '', end: '', content: ''}];\n setReportId(r.report_id);\n setVersionBoth(r.version);\n setBlocks(nextBlocks);\n writeCachedData(cacheKey, {reportId: r.report_id, version: r.version, blocks: nextBlocks});\n }).catch(err => onToast(err.message || '创建日报失败'));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n if (!reportId) return undefined;\n setSaved(false);\n draftTimerRef.current = window.setTimeout(() => {\n draftTimerRef.current = null;\n saveDraft(blocks).catch(() => setSaveError(true));\n }, 600);\n return () => window.clearTimeout(draftTimerRef.current);\n }, [blocks, reportId, saveDraft]);\n\n const updateBlock = (idx, field, value) => setBlocks(v => v.map((b, i) => i === idx ? {...b, [field]: value} : b));\n const addBlock = () => setBlocks(v => v.concat({start: '', end: '', content: ''}));\n const removeBlock = idx => setBlocks(v => v.length > 1 ? v.filter((_, i) => i !== idx) : v);\n\n const submit = () => {\n const content = blocksToContent(blocks);\n if (!content.trim()) { onToast('请填写今日工作总结'); return; }\n setSubmitting(true);\n if (draftTimerRef.current) { window.clearTimeout(draftTimerRef.current); draftTimerRef.current = null; }\n saveDraft(blocks).then(r => submitDailyReport(reportId, r.version))\n .then(_ => { onToast('日报已提交'); window.setTimeout(() => navigate('daily-report-detail', {report_id: reportId}), 500); })\n .catch(err => onToast(err.message || '提交失败'))\n .finally(() => setSubmitting(false));\n };\n\n return \n
\n {blocks.map((block, idx) => )}\n add 添加时间段 \n {saveError ? '草稿保存失败,请检查网络后重新编辑' : saved ? '草稿已自动保存' : '正在保存草稿…'}
\n \n
{submitting ? '提交中…' : '提交'} \n
;\n}\n\nconst STATUS_LABEL = {submitted: '已提交', draft: '未提交'};\n\nfunction DailyReportCard({report, names, team}) {\n return \n {names[report.author_id] || report.author_id} 员工 \n {STATUS_LABEL[report.status] || report.status} \n {report.content_short || '(未填写内容)'}
\n schedule {report.report_date} \n navigate('daily-report-detail', {report_id: report.report_id})}>查看详情chevron_right \n ;\n}\n\nfunction DailyReportList({team, myUserId, onToast}) {\n const cacheKey = 'daily-reports:' + (team ? 'managed' : 'mine');\n const statsCacheKey = 'daily-stats:' + toDateInputValue(new Date());\n // Seed from cache so re-entering \"我的日报\"/\"团队统计\" (a real user flow: check the list, go fill\n // in today's report, come back) doesn't blank the list out while the identical request re-runs.\n const [reports, setReports] = React.useState(() => readCachedData(cacheKey) || null);\n const [loadError, setLoadError] = React.useState(false);\n const [query, setQuery] = React.useState('');\n const [stats, setStats] = React.useState(() => (team && readCachedData(statsCacheKey)) || null);\n const ids = (reports || []).map(r => r.author_id);\n const names = useUserNames(ids, myUserId);\n\n const load = () => {\n setLoadError(false);\n // Previously swallowed every failure (network error, 403, ...) into a bare empty/stale list --\n // indistinguishable from \"genuinely no reports today\" (which also renders as an empty list).\n // A real failure now surfaces via toast + loadError so the list can say \"加载失败\" instead of\n // silently implying \"暂无日报\", matching how DailyReportDetail/MonthlyReportList already report\n // their own load failures.\n getDailyReports({scope: team ? 'managed' : 'mine'}).then(d => {\n const list = d.reports || d.items || [];\n writeCachedData(cacheKey, list);\n setReports(list);\n }).catch(err => { onToast(err.message || '日报列表加载失败'); setLoadError(true); setReports(prev => prev || []); });\n if (team) getDailyStatistics(toDateInputValue(new Date())).then(s => { writeCachedData(statsCacheKey, s); setStats(s); }).catch(() => {});\n };\n React.useEffect(load, [team]);\n\n const filtered = (reports || []).filter(r => {\n // department_name 后端根本不返回(dailyReportListPayload 的字段只有 report_id/author_id/\n // report_date/content_short/status/draft_updated_at/read_state/version),拼进来恒为空串,\n // 等于占位符承诺的\"部门\"那半个搜索永远搜不到任何东西。改为按真实有的字段搜:姓名 + 摘要内容。\n const hay = team ? `${names[r.author_id] || ''}${r.content_short || ''}` : r.report_date;\n return hay.includes(query);\n });\n\n const remindMissing = () => {\n sendDailyReminders(toDateInputValue(new Date())).then(_ => onToast('已提醒未提交成员'))\n .catch(err => onToast(err.message || '提醒失败'));\n };\n\n return \n
navigate('daily-report-editor')} back={team ? 'daily-report-mine' : 'workbench'} />\n \n {team && stats ? \n {formatMeetingDate(new Date())} 全公司 \n navigate('daily-report-mine')}>我的日报 \n {stats.expected_count || 0} 应提交 \n {stats.submitted_count || 0} 已提交 \n {(stats.expected_count || 0) - (stats.submitted_count || 0)} 未提交
\n notifications_active 提醒未提交成员 \n : null}\n search \n setQuery(e.target.value)} placeholder={team ? '搜索姓名或内容' : '搜索日期'} /> \n {!team ? \n 我的日报 \n navigate('daily-report-team')}>团队统计 \n : null}\n \n {reports == null ? 加载中…
:\n filtered.length === 0 ? {loadError ? '日报列表加载失败' : '暂无日报'}
:\n filtered.map(r => )}\n \n \n ;\n}\n\nfunction DailyReportDetail({hashParams, myUserId, onToast}) {\n const reportId = hashParams && hashParams.report_id;\n const [report, setReport] = React.useState(() => (reportId && readCachedData('daily-report:' + reportId)) || null);\n const [loadError, setLoadError] = React.useState(false);\n const names = useUserNames(report ? [report.author_id] : [], myUserId);\n\n React.useEffect(() => {\n if (!reportId) return;\n // Keyed only by view-name upstream (not report_id), so reseed per-id here rather than relying\n // on the initializer -- see the identical MeetingDetail comment for why that matters.\n setReport(readCachedData('daily-report:' + reportId) || null);\n getDailyReport(reportId).then(r => { writeCachedData('daily-report:' + reportId, r); setReport(r); }).catch(err => { onToast(err.message || '日报加载失败'); setLoadError(true); });\n }, [reportId]);\n if (!report) return {loadError ? '日报加载失败' : '加载中…'}
;\n\n return \n
\n {names[report.author_id] || '…'} 员工 \n {STATUS_LABEL[report.status] || report.status} \n schedule {report.report_date} \n 今日工作总结 {report.content || '未填写'}
\n \n
;\n}\n\nfunction toMonthInputValue(d) { return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`; }\nfunction formatMonthLabel(month) {\n const [y, m] = month.split('-');\n return `${y} 年 ${parseInt(m, 10)} 月`;\n}\n\n// docs/images/月报(1).png shows the second field labeled \"其他事项\" (optional-looking, no\n// asterisk) but the backend's only real second field is `next_plan` (store/types/reports.go),\n// declared required in the backend's own advertised contract (monthlyReportDetailPayload:\n// next_plan_required:true). The 月报 image set also had a confirmed content mix-up elsewhere\n// (月报.png's list content is verbatim 日报 demo text), so it's trusted less than usual here --\n// labeling this field by what it actually stores/is required to avoid silently mislabeling\n// \"next month's plan\" as generic \"other matters\".\nfunction MonthlyReportEditor({onToast}) {\n const month = toMonthInputValue(new Date());\n const cacheKey = 'monthly-report-editor:' + month;\n // Same rationale as DailyReportEditor's cache seed -- see the comment there.\n const cached = readCachedData(cacheKey);\n const [reportId, setReportId] = React.useState(cached ? cached.reportId : null);\n const [version, setVersion] = React.useState(cached ? cached.version : null);\n // See the matching comment in DailyReportEditor -- a ref avoids the debounced-save-in-flight\n // stale-version race that a captured `version` state variable would be exposed to.\n const versionRef = React.useRef(cached ? cached.version : null);\n const setVersionBoth = v => { versionRef.current = v; setVersion(v); };\n const [summary, setSummary] = React.useState(cached ? cached.summary : '');\n const [plan, setPlan] = React.useState(cached ? cached.plan : '');\n // monthlyReportDetailPayload's real validation.max_length is 10000, not the 1000 this page used to\n // hardcode -- confirmed live (a 2000-char draft save was accepted while this UI would have blocked\n // it at 1000). Keep 1000 as the pre-load fallback so the textarea has *some* limit before the first\n // response comes back, not because it's the real cap.\n const [maxLen, setMaxLen] = React.useState(1000);\n // A cached seed can go stale the instant something outside this component's lifetime mutates the\n // report's version -- concretely, MonthlyReportDetail's \"重新编辑\" (reopenMonthlyReport) does that,\n // then navigates straight here. Live-reproduced: reopen -> land here with the cache still holding\n // the pre-reopen version -> the autosave effect below fired on mount before this component's own\n // fresh fetch (below) could correct versionRef, 409'd, and surfaced a scary (and wrong) \"请检查\n // 网络\" toast. Gate the very first autosave on that fresh confirmation whenever there was a cache\n // to distrust; skip the wait entirely (unchanged fast path) when there wasn't one.\n const [hydrated, setHydrated] = React.useState(!cached);\n const [saved, setSaved] = React.useState(false);\n const [saveError, setSaveError] = React.useState(false);\n const [submitting, setSubmitting] = React.useState(false);\n // Same serialized-save fix as DailyReportEditor -- see the comment there. Live-reproduced here: a\n // real submit attempt raced the debounced autosave, both built from version 9, one landed and bumped\n // the server to version 10, the other came back 409 VERSION_CONFLICT and the report never actually\n // got submitted.\n const saveChainRef = React.useRef(Promise.resolve());\n const draftTimerRef = React.useRef(null);\n const saveDraft = React.useCallback((s, p) => {\n const run = () => updateMonthlyDraft(reportId, s, p, versionRef.current, []).then(r => {\n setVersionBoth(r.version); setSaved(true); setSaveError(false);\n writeCachedData(cacheKey, {reportId, version: r.version, summary: s, plan: p});\n return r;\n });\n const next = saveChainRef.current.then(run);\n saveChainRef.current = next.catch(() => {});\n return next;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [reportId]);\n\n React.useEffect(() => {\n createMonthlyReport(month).then(r => {\n // Same already-submitted-report trap as DailyReportEditor -- see the comment there.\n if (r.permissions && r.permissions.can_edit === false) { navigate('monthly-report-detail', {report_id: r.report_id}); return; }\n const nextSummary = r.work_summary || ''; const nextPlan = r.next_plan || '';\n setReportId(r.report_id); setVersionBoth(r.version);\n setSummary(nextSummary); setPlan(nextPlan);\n if (r.validation && r.validation.max_length) setMaxLen(r.validation.max_length);\n writeCachedData(cacheKey, {reportId: r.report_id, version: r.version, summary: nextSummary, plan: nextPlan});\n setHydrated(true);\n }).catch(err => onToast(err.message || '创建月报失败'));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n if (!reportId || !hydrated) return undefined;\n setSaved(false);\n draftTimerRef.current = window.setTimeout(() => {\n draftTimerRef.current = null;\n saveDraft(summary, plan).catch(() => setSaveError(true));\n }, 600);\n return () => window.clearTimeout(draftTimerRef.current);\n }, [summary, plan, reportId, hydrated, saveDraft]);\n\n const submit = () => {\n if (!summary.trim() || !plan.trim()) { onToast('请完成必填内容'); return; }\n setSubmitting(true);\n if (draftTimerRef.current) { window.clearTimeout(draftTimerRef.current); draftTimerRef.current = null; }\n saveDraft(summary, plan).then(r => submitMonthlyReport(reportId, r.version))\n .then(_ => { onToast('月报已提交'); window.setTimeout(() => navigate('monthly-report-detail', {report_id: reportId}), 500); })\n .catch(err => onToast(err.message || '提交失败'))\n .finally(() => setSubmitting(false));\n };\n\n return \n
\n \n * 本月工作总结 \n setSummary(e.target.value)} />{summary.length}/{maxLen} \n * 下月工作计划 \n setPlan(e.target.value)} />{plan.length}/{maxLen} \n {saveError ? '草稿保存失败,请检查网络后重新编辑' : saved ? '草稿已自动保存' : '正在保存草稿…'}
\n \n
{submitting ? '提交中…' : '提交'} \n
;\n}\n\n// 团队统计视图镜像 DailyReportList 的同款设计(这个页面原来只有\"我的月报\"一种,没有任何管理员/\n// 团队入口,日报有的东西月报完全没有)。核对 im_be 源码确认后端接口本身是对称的:\n// TenantMonthlyReportList 的 scope=managed 分支跟日报那边字面上是同一段\n// canUseManagedReports(visibility) 权限校验代码,GET /reports/monthly/statistics 的响应字段\n// (expected_count/submitted_count/missing_count)也跟日报统计完全一致——真实请求过一次确认\n// 无权限账号会收到 403 PERMISSION_DENIED 而不是被拒之前那种误报全公司数据。\n// 唯一确认过不对称的一点:月报没有\"提醒未提交成员\"这个后端能力(日报有\n// POST /reports/daily/reminders,月报连对应路由都不存在),所以团队视图不画这个按钮——\n// 画一个点了必炸404的按钮不算\"镜像\",是给用户挖坑。\nfunction MonthlyReportList({team, myUserId, onToast}) {\n const cacheKey = 'monthly-reports:' + (team ? 'managed' : 'mine');\n const statsCacheKey = 'monthly-stats:' + toMonthInputValue(new Date());\n const [reports, setReports] = React.useState(() => readCachedData(cacheKey) || null);\n const [loadError, setLoadError] = React.useState(false);\n const [query, setQuery] = React.useState('');\n const [stats, setStats] = React.useState(() => (team && readCachedData(statsCacheKey)) || null);\n const ids = (reports || []).map(r => r.author_id);\n const names = useUserNames(ids, myUserId);\n\n const load = () => {\n setLoadError(false);\n getMonthlyReports({scope: team ? 'managed' : 'mine'}).then(d => {\n const list = d.reports || d.items || [];\n writeCachedData(cacheKey, list);\n setReports(list);\n }).catch(err => { onToast(err.message || '月报列表加载失败'); setLoadError(true); setReports(prev => prev || []); });\n if (team) getMonthlyStatistics(toMonthInputValue(new Date())).then(s => { writeCachedData(statsCacheKey, s); setStats(s); }).catch(() => {});\n };\n React.useEffect(load, [team]);\n\n const filtered = (reports || []).filter(r => {\n const hay = team ? `${names[r.author_id] || ''}${r.work_summary_short || ''}` : r.month;\n return (hay || '').includes(query);\n });\n\n return \n
navigate('monthly-report-editor')} back={team ? 'monthly-report-mine' : 'workbench'} />\n \n {team && stats ? \n {formatMonthLabel(toMonthInputValue(new Date()))} 全公司 \n navigate('monthly-report-mine')}>我的月报 \n {stats.expected_count || 0} 应提交 \n {stats.submitted_count || 0} 已提交 \n {(stats.expected_count || 0) - (stats.submitted_count || 0)} 未提交
\n : null}\n search \n setQuery(e.target.value)} placeholder={team ? '搜索姓名或内容' : '搜索月份或内容'} /> \n {!team ? \n 我的月报 \n navigate('monthly-report-team')}>团队统计 \n : null}\n \n {reports == null ? 加载中…
:\n filtered.length === 0 ? {loadError ? '月报列表加载失败' : '暂无月报'}
:\n filtered.map(r => navigate((r.action || (r.status === 'submitted' ? 'view' : 'edit')) === 'view' ? 'monthly-report-detail' : 'monthly-report-editor', {report_id: r.report_id})}>\n calendar_month \n {team ? (names[r.author_id] || r.author_id) : formatMonthLabel(r.month)} \n {team ? formatMonthLabel(r.month) : '工作总结与下月计划'} \n {STATUS_LABEL[r.status] || r.status} \n chevron_right \n )}\n \n \n ;\n}\n\nfunction MonthlyReportDetail({hashParams, myUserId, onToast}) {\n const reportId = hashParams && hashParams.report_id;\n const [report, setReport] = React.useState(() => (reportId && readCachedData('monthly-report:' + reportId)) || null);\n const [loadError, setLoadError] = React.useState(false);\n const [reopening, setReopening] = React.useState(false);\n const names = useUserNames(report ? [report.author_id] : [], myUserId);\n\n React.useEffect(() => {\n if (!reportId) return;\n setReport(readCachedData('monthly-report:' + reportId) || null);\n getMonthlyReport(reportId).then(r => { writeCachedData('monthly-report:' + reportId, r); setReport(r); }).catch(err => { onToast(err.message || '月报加载失败'); setLoadError(true); });\n }, [reportId]);\n if (!report) return {loadError ? '月报加载失败' : '加载中…'}
;\n\n // reopenMonthlyReport is self-service only (server keys the UPDATE off the caller's own uid --\n // see the comment on the im-api.js export), so this button only ever makes sense for the report's\n // own author looking at their own already-submitted report, never a manager viewing someone else's.\n const canReopen = report.author_id === myUserId && report.status === 'submitted';\n const reopen = () => {\n setReopening(true);\n reopenMonthlyReport(report.report_id, report.version)\n .then(() => { onToast('已重新打开,可继续编辑'); navigate('monthly-report-editor'); })\n .catch(err => onToast(err.message || '重新打开失败'))\n .finally(() => setReopening(false));\n };\n\n return \n
\n {names[report.author_id] || '…'} 员工 \n {STATUS_LABEL[report.status] || report.status} \n schedule {formatMonthLabel(report.month)} \n 本月工作总结 {report.work_summary || '未填写'}
\n 下月工作计划 {report.next_plan || '未填写'}
\n {canReopen ? \n {reopening ? '处理中…' : '重新编辑'} : null}\n \n
;\n}\n\n// docs/images/总经理信箱.png has no subject input at all -- just 反馈内容 + 附件 + 实名/匿名. The\n// backend's submission body does accept a real, stored `subject` (store/types/mailbox.go), but\n// never validates it, so a derived summary is sent without exposing a box the image doesn't show.\nfunction deriveSubject(content) {\n const first = content.trim().split('\\n')[0];\n return first.length > 30 ? first.slice(0, 30) + '…' : first;\n}\n\nfunction ExecutiveMailbox({tinode, noticeOnly, onToast}) {\n const [config, setConfig] = React.useState(() => readCachedData('executive-mailbox-config') || null);\n const [content, setContent] = React.useState('');\n const [anonymous, setAnonymous] = React.useState(null);\n const [attachments, setAttachments] = React.useState([]);\n const [uploading, setUploading] = React.useState(false);\n const [submitting, setSubmitting] = React.useState(false);\n const [noticeOpen, setNoticeOpen] = React.useState(!!noticeOnly);\n const fileInputRef = React.useRef(null);\n\n React.useEffect(() => {\n getExecutiveMailboxConfig().then(c => { writeCachedData('executive-mailbox-config', c); setConfig(c); })\n // Keep a prior good value on a transient failure rather than clobbering it to the disabled\n // placeholder -- only fall back to {enabled:false} when there's truly nothing cached yet.\n .catch(() => setConfig(prev => prev || {enabled: false}));\n }, []);\n\n // Real tenant config uses attachment_policy.max_files (confirmed live -- matches the key the\n // 意见反馈 config uses); the Go-side struct literal that only ever backs a tenant with no config\n // row at all names it max_count instead, so check both rather than assuming a single unlimited\n // upload button is fine. Previously nothing here capped the count at all.\n const attachmentPolicy = (config && config.attachment_policy) || {};\n const maxFiles = attachmentPolicy.max_files || attachmentPolicy.max_count || 5;\n\n const pickFile = () => {\n if (attachments.length >= maxFiles) { onToast(`最多上传 ${maxFiles} 个附件`); return; }\n fileInputRef.current && fileInputRef.current.click();\n };\n const handleFile = event => {\n const file = event.target.files && event.target.files[0];\n event.target.value = '';\n if (!file || !tinode) return;\n if (attachments.length >= maxFiles) { onToast(`最多上传 ${maxFiles} 个附件`); return; }\n setUploading(true);\n uploadLargeFile(tinode, file).then(({fileId}) => {\n setAttachments(v => v.concat({fileId, name: file.name}));\n }).catch(err => onToast(err.message || '附件上传失败')).finally(() => setUploading(false));\n };\n\n const submit = () => {\n if (!content.trim()) { onToast('请填写反馈内容'); return; }\n if (config && config.allow_anonymous && !anonymous) { onToast('请选择实名反馈或匿名反馈'); return; }\n setSubmitting(true);\n submitExecutiveMailboxMessage({\n subject: deriveSubject(content),\n content: content.trim(),\n anonymous: anonymous === 'anonymous',\n attachment_file_ids: attachments.map(a => a.fileId)\n }).then(_ => {\n onToast('反馈成功');\n setContent(''); setAttachments([]); setAnonymous(null);\n }).catch(err => onToast(err.message || '提交失败')).finally(() => setSubmitting(false));\n };\n\n if (config && !config.enabled) {\n return ;\n }\n\n return ;\n}\n\nexport default function WorkplaceCollaborationView({view, hashParams, myUserId, tinode, onTopicSelected}) {\n const [toast, setToast] = React.useState('');\n let content;\n if (view === 'workbench') content = ;\n else if (view === 'organization-directory') content = ;\n else if (view === 'meeting-organizer' || view === 'meeting-attendee') content = ;\n else if (view === 'meeting-create') content = ;\n else if (view === 'meeting-detail') content = ;\n else if (view === 'daily-report-editor') content = ;\n else if (view === 'monthly-report-editor') content = ;\n else if (view === 'daily-report-mine' || view === 'daily-report-team') content = ;\n else if (view === 'monthly-report-mine' || view === 'monthly-report-team') content = ;\n else if (view === 'daily-report-detail') content = ;\n else if (view === 'monthly-report-detail') content = ;\n else content = ;\n return <>{content} setToast('')} />>;\n}\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Alert extends React.PureComponent {\n render() {\n return (\n
\n
{this.props.title}
\n
{this.props.content}
\n
\n {this.props.onReject ?\n \n {this.props.reject || }\n \n :\n null\n }\n {this.props.onConfirm ?\n \n {this.props.confirm || }\n \n :\n null\n }\n
\n
\n
);\n }\n};\n","// Audio recorder widget.\n\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat';\nimport { base64ToIntArray } from '../lib/blob-helpers';\n\n// Make canvas bigger than the element size to reduce blurring.\nconst CANVAS_UPSCALING = 2.0;\n// Thickness of a visualization bar.\nconst LINE_WIDTH = 3 * CANVAS_UPSCALING;\n// Spacing between two visualization bars.\nconst SPACING = 2 * CANVAS_UPSCALING;\n// Color of histogram bars.\nconst BAR_COLOR = '#888A';\nconst BAR_COLOR_DARK = '#666C';\nconst THUMB_COLOR = '#1781d7'; // average between dark and light accent colors.\n// Minimum number of amplitude bars to draw.\nconst MIN_PREVIEW_LENGTH = 16;\n\n// 7.5 \"列表中同时只能有一条语音播放\":favorites/history 列表和聊天气泡里的每条语音各自是一个独立\n// AudioPlayer 实例,彼此不知道对方的存在。Module-scoped(不是某个列表父组件的 state)所以跨 tab、\n// 跨收藏/聊天记录也生效,不只是同一个列表内部。\nlet activeAudioPlayer = null;\n\nconst messages = defineMessages({\n icon_title_play: {\n id: 'icon_title_play',\n defaultMessage: 'Play recording',\n description: 'Icon tool tip for starting audio playback'\n }\n});\n\nclass AudioPlayer extends React.PureComponent {\n constructor(props) {\n super(props);\n\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n\n this.state = {\n canPlay: false,\n playing: false,\n currentTime: '0:00',\n duration: this.props.duration > 0 ? secondsToTime(this.props.duration / 1000) : '-:--',\n longMin: this.props.duration >= 600000,\n preview: preview\n };\n\n this.initAudio = this.initAudio.bind(this);\n this.initCanvas = this.initCanvas.bind(this);\n this.resampleBars = this.resampleBars.bind(this);\n this.visualize = this.visualize.bind(this);\n\n this.handlePlay = this.handlePlay.bind(this);\n this.handleSeek = this.handleSeek.bind(this);\n this.handleError = this.handleError.bind(this);\n\n this.audioPlayer = null;\n\n this.viewBuffer = [];\n this.canvasRef = React.createRef();\n }\n\n componentDidMount() {\n if (this.props.src) {\n this.initAudio();\n }\n\n this.initCanvas();\n }\n\n componentWillUnmount() {\n if (activeAudioPlayer === this) {\n activeAudioPlayer = null;\n }\n if (this.audioPlayer) {\n this.audioPlayer.onloadedmetadata = null;\n this.audioPlayer.ontimeupdate = null;\n this.audioPlayer.onended = null;\n this.audioPlayer.pause();\n this.audioPlayer = null;\n }\n }\n\n // Called on the previously-playing instance by whichever other instance is about to start.\n pauseForOtherPlayer() {\n if (this.audioPlayer) {\n this.audioPlayer.pause();\n }\n this.setState({playing: false});\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.src != prevProps.src) {\n this.initAudio();\n }\n\n if (this.props.preview != prevProps.preview) {\n let preview = base64ToIntArray(this.props.preview);\n if (!Array.isArray(preview) || preview.length < MIN_PREVIEW_LENGTH) {\n preview = null;\n }\n this.setState({preview: preview}, this.initCanvas);\n }\n }\n\n initAudio() {\n this.audioPlayer = new Audio(this.props.src);\n this.audioPlayer.onloadedmetadata = _ => this.setState({canPlay: true});\n this.audioPlayer.ontimeupdate = _ => this.setState({\n currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)\n });\n this.audioPlayer.onended = _ => {\n this.audioPlayer.currentTime = 0;\n this.setState({playing: false, currentTime: secondsToTime(0, this.state.longMin)});\n if (activeAudioPlayer === this) {\n activeAudioPlayer = null;\n }\n }\n }\n\n initCanvas() {\n // Force canvas aspect ratio to match one of the element + upscale canvas to reduce blurring.\n this.canvasRef.current.width = this.canvasRef.current.offsetWidth * CANVAS_UPSCALING;\n this.canvasRef.current.height = this.canvasRef.current.offsetHeight * CANVAS_UPSCALING;\n\n this.canvasContext = this.canvasRef.current.getContext('2d');\n this.canvasContext.lineCap = 'round';\n\n this.viewBuffer = this.resampleBars(this.state.preview);\n this.visualize();\n }\n\n // Draw amplitude of sound.\n visualize() {\n if (!this.canvasRef.current) {\n return;\n }\n\n const width = this.effectiveWidth;\n const height = this.canvasRef.current.height;\n\n this.canvasContext.lineWidth = LINE_WIDTH;\n\n const drawFrame = _ => {\n if (!this.canvasRef.current || !this.audioPlayer) {\n // The component is unmounted.\n return;\n }\n\n this.canvasContext.clearRect(0, 0, this.canvasRef.current.width, height);\n\n if (this.viewBuffer) {\n if (this.state.playing) {\n window.requestAnimationFrame(drawFrame);\n }\n\n // Current playback position.\n const thumbAt = this.props.duration ?\n Math.max(0, Math.min(this.audioPlayer.currentTime * 1000 / this.props.duration, 1)) * (width - LINE_WIDTH * 2) : -1;\n\n // Draw amplitude bars.\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = BAR_COLOR_DARK;\n for (let i = 0; i < this.viewBuffer.length; i++) {\n let x = 1 + i * (LINE_WIDTH + SPACING) + LINE_WIDTH * 0.5;\n let y = Math.max(this.viewBuffer[i] * height * 0.9, 1);\n\n const color = x < thumbAt ? BAR_COLOR_DARK : BAR_COLOR;\n if (this.canvasContext.strokeStyle != color) {\n this.canvasContext.stroke();\n this.canvasContext.beginPath();\n this.canvasContext.strokeStyle = color;\n }\n\n this.canvasContext.moveTo(x, (height - y) * 0.5);\n this.canvasContext.lineTo(x, (height + y) * 0.5);\n }\n // Actually draw the bars on canvas.\n this.canvasContext.stroke();\n\n // Draw thumb.\n if (this.props.duration) {\n this.canvasContext.beginPath();\n this.canvasContext.arc(thumbAt + LINE_WIDTH * 2, height * 0.5, LINE_WIDTH * 2, 0, 2 * Math.PI);\n this.canvasContext.fillStyle = THUMB_COLOR;\n this.canvasContext.fill();\n }\n }\n }\n\n drawFrame();\n }\n\n // Quick and dirty downsampling of the original preview bars into a smaller (or equal) number of bars we can display here.\n resampleBars(original) {\n const dstCount = ((this.canvasRef.current.width - SPACING) / (LINE_WIDTH + SPACING)) | 0;\n // Remove extra padding on the right due to fractional bar which is not drawn.\n this.effectiveWidth = dstCount * (LINE_WIDTH + SPACING) + SPACING;\n\n if (!Array.isArray(original) || original.length == 0) {\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n const factor = original.length / dstCount;\n let amps = [];\n let maxAmp = -1;\n for (let i=0; i 0) {\n return amps.map(a => a / maxAmp);\n }\n return Array.apply(null, Array(dstCount)).map(_ => 0.01);\n }\n\n handlePlay(e) {\n e.preventDefault();\n if (!this.state.canPlay) {\n return;\n }\n\n if (this.state.playing) {\n this.audioPlayer.pause();\n this.setState({playing: false});\n } else if (this.audioPlayer.readyState >= 2) {\n this.audioPlayer.play();\n this.setState({playing: true}, this.visualize);\n // 4.9 语音未读红点:唯一一个知道\"用户真的点了播放\"这一刻的地方——上层只知道会话/消息本身\n // 有没有被标记已读(原生 Tinode recv/read),跟\"这条语音有没有被真的点开听过\"是两件事。\n // 可选 prop,不传不影响任何现有调用点(收藏页/聊天记录检索也在用这个组件,不需要这个信号)。\n if (this.props.onPlay) {\n this.props.onPlay();\n }\n }\n }\n\n handleError(err) {\n console.error(err);\n }\n\n handleSeek(e) {\n e.preventDefault();\n if (e.target && this.props.duration) {\n const rect = e.target.getBoundingClientRect();\n const offset = (e.clientX - rect.left) / this.effectiveWidth * CANVAS_UPSCALING;\n this.audioPlayer.currentTime = this.props.duration * offset / 1000;\n this.setState({currentTime: secondsToTime(this.audioPlayer.currentTime, this.state.longMin)});\n if (!this.state.playing) {\n this.visualize();\n }\n }\n }\n\n render() {\n const playClass = 'material-icons' +\n (this.props.short ? '' : ' large') +\n (this.state.canPlay ? '' : ' disabled');\n const play = (\n {this.state.playing ? 'pause_circle' :\n (this.state.canPlay ? 'play_circle' : 'not_interested')} \n );\n return ({this.props.short ?\n <>\n
\n {play}\n >\n :\n <>\n {play}\n
\n
\n
{this.state.currentTime}/{this.state.duration}
\n
\n >\n }\n
);\n }\n}\n\nexport default injectIntl(AudioPlayer);\n","// Edit account parameters.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport Cropper from './cropper.jsx';\nimport { imageCrop } from '../lib/blob-helpers.js';\n\nexport default class AvatarCrop extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n scale: 1\n };\n\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleChange = this.handleChange.bind(this);\n }\n\n // Cut out in image coordinates and desired scale factor.\n handleChange(left, top, width, height, scale) {\n this.setState({\n left: left,\n top: top,\n width: width,\n height: height,\n scale: scale\n });\n }\n\n handleSubmit() {\n imageCrop(this.props.mime, this.props.avatar,\n this.state.left, this.state.top, this.state.width, this.state.height,\n this.state.scale)\n .then(img => {\n this.props.onSubmit(img.mime, img.blob, img.width, img.height);\n })\n .catch(err => {\n this.props.onError(err);\n });\n }\n\n render() {\n return (\n \n
\n \n
\n
\n {this.props.onCancel ?\n \n \n \n : null}\n \n \n \n
\n
\n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\nimport LoadSpinner from './load-spinner.jsx';\n\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nimport { AVATAR_SIZE } from '../config.js';\n\nexport default class AvatarUpload extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n source: props.avatar\n };\n\n this.handleFileReceived = this.handleFileReceived.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.avatar != prevProps.avatar) {\n this.setState({source: this.props.avatar});\n }\n }\n\n handleFileReceived(e) {\n const image = e.target.files[0];\n this.props.onImageUpdated(image.type, URL.createObjectURL(image), image.name);\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n render() {\n // Randomize id value in case more than one AvatarUpload is shown\n // at the same time.\n const randId = 'file-input-avatar-' + ('' + Math.random()).substring(0, 4);\n const className = 'avatar-upload' + (this.props.readOnly ? ' read-only' : '');\n return (\n \n {this.props.readOnly || !this.state.source ?\n null :\n
{e.preventDefault(); this.props.onImageUpdated();}}>\n clear \n }\n {this.state.source ?\n
:\n this.props.readOnly && this.props.uid ?\n
\n \n
\n :\n
{AVATAR_SIZE}×{AVATAR_SIZE}
}\n {this.props.readOnly ? null :\n
}\n {this.props.readOnly ? null :\n
\n file_upload \n }\n
\n
\n );\n }\n};\n","import React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst icon_mapping = {'staff': 'verified_user'};\n\nconst messages = defineMessages({\n badge_verified: {\n id: 'badge_verified',\n defaultMessage: 'Verified/official',\n description: 'Explanation of a verified account or topic badge'\n },\n badge_staff: {\n id: 'badge_staff',\n defaultMessage: 'Staff-managed',\n description: 'Explanation of a staff-managed account or topic badge'\n },\n badge_danger: {\n id: 'badge_danger',\n defaultMessage: 'Untrustworthy',\n description: 'Suspicious or untrustworthy account or topic badge'\n },\n});\n\n\n/* Trusted badges with labels: verified, staff, danger */\nclass BadgeList extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let badges = null;\n if (this.props.trustedBadges && this.props.trustedBadges.length > 0) {\n badges = [];\n this.props.trustedBadges.forEach(b => {\n const comment = this.props.short ? null : formatMessage(messages['badge_' + b]);\n const style = 'material-icons ' + b + '-color';\n badges.push({icon_mapping[b] || b} {comment}
);\n });\n return <>{badges}>;\n }\n return null;\n }\n};\n\nexport default injectIntl(BadgeList);\n","// Batch Forward Dialog: reached from multi-select mode (Ch.4 4.17-4.19). Distinct from\n// ForwardDialog (the single-message quick-forward from the message's own context menu, which\n// stays on the native Tinode pub/sub path) -- this one posts to the dedicated\n// POST /v1/im/messages/forward HTTP endpoint since it needs to fan out to several targets in\n// one call, matching docs/images/转发-单选.png / 转发-多选.png / 转发—逐条转发.png.\nimport React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from './contact-list.jsx';\nimport SearchContacts from './search-contacts.jsx';\n\nimport { forwardMessages } from '../lib/im-api.js';\nimport { topicDisplayName } from '../lib/utils.js';\nimport { readCachedData } from '../lib/use-cached-data.js';\n\n// 与服务端 im_http.go:3560 的硬限一致。目标数另有一层更严的产品限制,见 maxTargets()。\nconst MAX_FORWARD_SOURCES = 100;\nconst MAX_FORWARD_TARGETS = 20;\n\nexport default class BatchForwardDialog extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n query: null,\n multiSelect: false,\n selectedTargets: [],\n confirmTargets: null,\n comment: '',\n sending: false,\n error: null\n };\n\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClose = this.handleClose.bind(this);\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleContactSelected = this.handleContactSelected.bind(this);\n this.handleToggleMultiSelect = this.handleToggleMultiSelect.bind(this);\n this.handleConfirmTargets = this.handleConfirmTargets.bind(this);\n this.handleCancelConfirm = this.handleCancelConfirm.bind(this);\n this.handleSend = this.handleSend.bind(this);\n this.handleCommentChange = this.handleCommentChange.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n document.addEventListener('keyup', this.handleEscapeKey, false);\n }\n\n componentWillUnmount() {\n document.removeEventListener('keyup', this.handleEscapeKey, false);\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n this.props.hide();\n }\n }\n\n handleClose(e) {\n e.preventDefault();\n this.props.hide();\n }\n\n handleSearchContacts(query) {\n this.setState({query: Tinode.isNullValue(query) ? null : query});\n this.props.onSearchContacts(query);\n }\n\n handleToggleMultiSelect(e) {\n e.preventDefault();\n this.setState(s => ({multiSelect: !s.multiSelect, selectedTargets: []}));\n }\n\n // Single-select: picking a contact goes straight to the confirm sheet (docs/images/转发-单选.png).\n // Multi-select: toggles membership; \"确定\" (separate button below) advances to confirm.\n handleContactSelected(uid) {\n if (!this.state.multiSelect) {\n this.setState({confirmTargets: [uid]});\n return;\n }\n this.setState(s => {\n if (s.selectedTargets.includes(uid)) {\n return {selectedTargets: s.selectedTargets.filter(t => t != uid), error: null};\n }\n // 目标数上限:优先用 bootstrap 下发的 limits.max_forward_targets(服务端当前给 9),\n // 拿不到就退到服务端硬限 20(im_http.go:3560)。原来两个都不读,选到 21 个才会撞 400。\n const max = this.forwardTargetLimit();\n if (s.selectedTargets.length >= max) {\n return {error: `最多同时转发给 ${max} 个会话`};\n }\n return {selectedTargets: s.selectedTargets.concat(uid), error: null};\n });\n }\n\n forwardTargetLimit() {\n // 读各视图已经在写的同一份 bootstrap 缓存('bootstrap:'+myUserId),不额外发请求。\n const boot = this.props.myUserId ? readCachedData('bootstrap:' + this.props.myUserId) : null;\n const configured = boot && boot.limits && Number(boot.limits.max_forward_targets);\n return configured > 0 ? Math.min(configured, MAX_FORWARD_TARGETS) : MAX_FORWARD_TARGETS;\n }\n\n handleConfirmTargets(e) {\n e.preventDefault();\n if (this.state.selectedTargets.length) {\n this.setState({confirmTargets: this.state.selectedTargets.slice()});\n }\n }\n\n // 转发模式由\"用哪种方式选的目标\"决定,这是参考图给的规则:\n // 转发—逐条转发.png 右上\"多选\"未点,单选一个目标,占位写 [逐条转发]共2条消息\n // 转发—合并转发—多选状态.png 右上已切\"确定\",勾选多个目标,占位写 [合并转发]共16条消息\n // 服务端两种 mode 现在都支持了(bundle 此前返回 501,已实现)。\n forwardMode() {\n return this.state.multiSelect ? 'bundle' : 'separate';\n }\n\n handleCancelConfirm() {\n this.setState({confirmTargets: null, error: null});\n }\n\n handleCommentChange(e) {\n this.setState({comment: e.target.value});\n }\n\n handleSend() {\n // seq must be a JSON string (server struct tag is `json:\"seq,string\"`), same as favoriteMessages.\n const sources = this.props.seqs.map(seq => ({topic: this.props.topicName, seq: String(seq)}));\n // 服务端硬卡 sources ≤ 100、target_topics ≤ 20(im_http.go:3560),超了直接 400 MALFORMED_REQUEST,\n // 用户只会看到一句无从下手的\"转发失败\"。在本地先拦住并说清楚超了多少。\n if (sources.length > MAX_FORWARD_SOURCES) {\n this.setState({error: `一次最多转发 ${MAX_FORWARD_SOURCES} 条消息,当前已选 ${sources.length} 条`});\n return;\n }\n this.setState({sending: true, error: null});\n forwardMessages(this.forwardMode(), sources, this.state.confirmTargets, this.state.comment.trim()).then(result => {\n const failed = (result && result.failed) || [];\n if (failed.length) {\n this.setState({sending: false, error: `${failed.length} 条转发失败,请重试`});\n return;\n }\n this.props.hide(true);\n }).catch(err => {\n this.setState({sending: false, error: err.message || '转发失败'});\n });\n }\n\n render() {\n if (this.state.confirmTargets) {\n const targets = this.state.confirmTargets.map(uid => this.props.tinode.getTopic(uid) || {name: uid, public: null});\n return (\n \n
\n
发送给
\n
\n {targets.map(t => \n {Tinode.isSelfTopicName(t.name) ? '已保存的消息' : topicDisplayName(t.name, t.public, t.name)} \n chevron_right \n )}\n \n {/* 参考图这一栏是可输入的留言框,原来是个只读
,需求 4.19 与对接文档要求的\n \"附加留言\"根本没法填,comment 永远是空串。方括号那段是占位文案,不是内容。 */}\n
\n {this.state.error ?
{this.state.error}
: null}\n
\n 取消 \n \n {this.state.sending ? '发送中…' : '发送'}\n \n
\n
\n
\n );\n }\n\n let contacts = this.state.query != null ? this.props.searchResults : this.props.contacts;\n contacts = contacts.filter((c) => (c.name != this.props.topicSelected) && c.acs.isJoiner() && c.acs.isWriter());\n\n return (\n
\n
\n
\n
\n {this.state.error ?
{this.state.error}
: null}\n
\n
\n
\n );\n }\n}\n","// The <- button to be displayed in title bars.\nimport React from 'react';\n\nexport default class ButtonBack extends React.PureComponent {\n render() {\n return (\n
{e.preventDefault(); this.props.onBack();}}>\n arrow_back \n \n );\n }\n}\n","// IncomingCall: displays Accept & Reject buttons for incoming calls.\nimport React from 'react';\n\nimport BadgeList from './badge-list.jsx';\nimport LetterTile from './letter-tile.jsx';\n\nimport { MAX_TITLE_LENGTH, MAX_PEER_TITLE_LENGTH } from '../config.js';\nimport { CALL_STATE_INCOMING_RECEIVED } from '../constants.js';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { truncateString } from '../lib/strformat.js';\n\nconst RING_SOUND = new Audio('audio/call-in.m4a');\n\nexport default class CallIncoming extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n topic: null,\n fullName: undefined,\n avatar: null,\n trustedBadges: [],\n previousMetaDesc: undefined,\n };\n\n this.resetDesc = this.resetDesc.bind(this);\n this.onMetaDesc = this.onMetaDesc.bind(this);\n this.handleRejectCall = this.handleRejectCall.bind(this);\n this.handleAcceptCall = this.handleAcceptCall.bind(this);\n this.ringTimer = null;\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n\n this.resetDesc(topic);\n if (this.props.callState == CALL_STATE_INCOMING_RECEIVED) {\n // play() throws if the user did not click the app first: https://goo.gl/xX8pDD.\n RING_SOUND.play().catch(_ => {});\n this.ringTimer = setInterval(_ => {RING_SOUND.play().catch(_ => {})}, 2000);\n this.props.onRinging(this.props.topic, this.props.seq);\n }\n }\n\n // No need to separately handle component mount.\n componentDidUpdate(props) {\n const topic = this.props.tinode.getTopic(props.topic);\n if (!topic) {\n return;\n }\n\n if (this.onMetaDesc != topic.onMetaDesc) {\n this.previousMetaDesc = topic.onMetaDesc;\n topic.onMetaDesc = this.onMetaDesc;\n }\n\n if (this.state.topic != props.topic) {\n this.setState({topic: props.topic});\n this.resetDesc(topic, props);\n }\n }\n\n componentWillUnmount() {\n if (this.ringTimer != null) {\n clearInterval(this.ringTimer);\n RING_SOUND.pause();\n }\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.setState({topic: null});\n topic.onMetaDesc = this.previousMetaDesc;\n }\n\n resetDesc(topic) {\n const badges = [];\n if (topic.trusted) {\n for (const [key, val] of Object.entries(topic.trusted)) {\n if (val) {\n badges.push(key);\n }\n }\n }\n\n this.setState({\n fullName: truncateString(topic.public ? topic.public.fn : undefined, MAX_TITLE_LENGTH),\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n trustedBadges: badges,\n });\n }\n\n onMetaDesc(desc) {\n const topic = this.props.tinode.getTopic(this.props.topic);\n if (!topic) {\n return;\n }\n this.resetDesc(topic);\n\n if (this.previousMetaDesc && this.previousMetaDesc != this.onMetaDesc) {\n this.previousMetaDesc(desc);\n }\n }\n\n handleAcceptCall() {\n this.props.onAcceptCall(this.props.topic);\n }\n\n handleRejectCall() {\n this.props.onReject(this.props.topic, this.props.seq);\n this.props.onClose();\n }\n\n render() {\n const isAudioOnly = !!this.props.audioOnly;\n const ringing = this.props.callState == CALL_STATE_INCOMING_RECEIVED;\n const surfaceClass = isAudioOnly ? 'call-audio-surface' : 'call-video-surface';\n const photoStyle = this.state.avatar ? {'--incoming-call-photo': `url(${this.state.avatar})`} : null;\n return (\n
\n
\n {this.state.avatar &&\n
}\n
\n
\n \n
\n
{truncateString(this.state.fullName, MAX_PEER_TITLE_LENGTH)}\n \n
{isAudioOnly ? '对方邀请你语音通话...' : '对方邀请你视频通话...'}
\n {ringing &&
}\n
\n
\n {ringing ?\n <>\n \n call_end \n 拒绝 \n \n \n {isAudioOnly ? 'call' : 'videocam'} \n 接听 \n \n >\n :\n null\n }\n \n
\n );\n }\n};\n","// Chat message describing a video or voice call.\n\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\nexport default class CallMessage extends React.PureComponent {\n render() {\n const isCallDropped = ['busy', 'declined', 'disconnected', 'missed'].includes(this.props.callState);\n const successClass = 'material-icons medium ' + (isCallDropped ? 'red' : 'green');\n const callIcon = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n const title = this.props.incoming ?\n
:\n
;\n let duration;\n if (isCallDropped) {\n switch (this.props.callState) {\n case 'busy':\n duration =
;\n break;\n case 'declined':\n duration =
;\n break;\n case 'missed':\n duration = this.props.incoming ?\n
:\n
;\n break;\n default:\n duration =
;\n break;\n }\n } else if (['accepted', 'started'].includes(this.props.callState) && !this.props.duration) {\n // Mirrors call-status.jsx's identical branch (the conversation-list preview for the same\n // message) -- this chat-bubble sibling was missing it, so a call left running (the product\n // supports messaging while a call is minimized/in progress) showed \"0:00\" here instead of\n // \"in progress\" until the call actually ended and the message got its final duration.\n duration =
;\n } else {\n duration =
{secondsToTime(this.props.duration / 1000)} ;\n }\n return
\n
call
\n
\n
{title}
\n
{callIcon} {duration}
\n
\n
;\n }\n}\n","// The counter of unread messages in the topic.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { secondsToTime } from '../lib/strformat.js';\n\n// Props:\n// incoming: true | false.\n// callState: 'busy' | 'declined' | 'disconnected' | 'missed'.\n// duration:
(call duration in milliseconds).\nexport default class CallStatus extends React.PureComponent {\n render() {\n const isCallDropped = ['busy', 'declined', 'disconnected', 'missed'].includes(this.props.callState);\n const icon2 = this.props.incoming ?\n (isCallDropped ? 'call_missed' : 'call_received') :\n (isCallDropped ? 'call_missed_outgoing' : 'call_made');\n let duration;\n if (isCallDropped) {\n switch (this.props.callState) {\n case 'busy':\n duration = ;\n break;\n case 'declined':\n duration = ;\n break;\n case 'missed':\n duration = this.props.incoming ?\n :\n ;\n break;\n default:\n duration = ;\n break;\n }\n } else if (['accepted', 'started'].includes(this.props.callState) && !this.props.duration) {\n duration = \n } else {\n duration = {secondsToTime(this.props.duration / 1000)} ;\n }\n return (\n <>\n \n call {icon2} \n
{duration}\n >\n );\n }\n};\n","import React from 'react';\n\n/* CheckBox: styled three-state checkbox, either clickable or static */\nexport default class CheckBox extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleChange = this.handleChange.bind(this);\n }\n\n handleChange() {\n this.props.onChange(this.props.name, !this.props.checked);\n }\n\n render() {\n let classList = ['material-icons'];\n let iconName;\n if (Array.isArray(this.props.className)) {\n classList.push(...this.props.className);\n } else if (this.props.className) {\n classList.push(this.props.className);\n }\n if (this.props.onChange) {\n if (this.props.checked) {\n classList.push('blue', 'clickable');\n iconName = 'check_box';\n } else if (this.props.checked === false) {\n classList.push('blue', 'clickable');\n iconName = 'check_box_outline_blank';\n } else {\n classList.push('lt-blue');\n iconName = 'indeterminate_check_box';\n }\n } else {\n if (this.props.checked) {\n iconName = 'check_box';\n } else {\n iconName = 'check_box_outline_blank';\n }\n }\n let attrs = {\n className: classList.join(' '),\n id: this.props.id,\n };\n if (this.props.onChange) {\n attrs.onClick = this.handleChange;\n }\n return React.createElement('i', attrs, iconName);\n }\n}\n","import React from 'react';\n\nimport Chip from './chip.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\n/* BEGIN ChipInput: group membership widget */\nexport default class ChipInput extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = ChipInput.deriveStateFromProps(props);\n this.state.input = '';\n this.state.focused = false;\n\n this.handleTextInput = this.handleTextInput.bind(this);\n this.removeChipAt = this.removeChipAt.bind(this);\n this.handleChipCancel = this.handleChipCancel.bind(this);\n this.handleFocusGained = this.handleFocusGained.bind(this);\n this.handleFocusLost = this.handleFocusLost.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n static deriveStateFromProps(props) {\n return {\n sortedChips: ChipInput.sortChips(props.chips, props.staticMembers),\n chipIndex: ChipInput.indexChips(props.chips)\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.chips != this.props.chips ||\n prevProps.staticMembers != this.props.staticMembers ||\n prevProps.prompt != this.props.prompt) {\n this.setState(ChipInput.deriveStateFromProps(this.props));\n }\n if (!prevState || this.props.chips.length > prevState.sortedChips.length) {\n this.setState({input: ''});\n }\n }\n\n // Map chip index to user name\n static indexChips(chips) {\n const index = {};\n let count = 0;\n chips.forEach(item => {\n index[item.user] = count;\n count ++;\n });\n return index;\n }\n\n // Have non-removable chips appear before all other chips.\n static sortChips(chips, keep) {\n const required = [];\n const normal = [];\n chips.forEach(item => {\n if (keep && keep.includes(item.user)) {\n required.push(item);\n } else {\n normal.push(item);\n }\n });\n return required.concat(normal);\n }\n\n handleTextInput(e) {\n this.setState({input: e.target.value});\n if (this.props.filterFunc) {\n this.props.filterFunc(e.target.value);\n }\n }\n\n removeChipAt(idx) {\n const removed = this.state.sortedChips[idx];\n this.props.onChipRemoved(removed.user, this.state.chipIndex[removed.user]);\n }\n\n handleChipCancel(item, idx) {\n this.removeChipAt(idx);\n }\n\n handleFocusGained() {\n this.setState({focused: true});\n }\n\n handleFocusLost() {\n this.setState({focused: false});\n if (this.props.onFocusLost) {\n this.props.onFocusLost(this.state.input);\n }\n }\n\n handleKeyDown(e) {\n if (e.key === 'Backspace') {\n if (this.state.input.length == 0 && this.state.sortedChips.length > 0) {\n const at = this.state.sortedChips.length - 1;\n if (this.state.sortedChips[at].user !== this.props.staticMembers) {\n this.removeChipAt(at);\n }\n }\n } else if (e.key === 'Enter') {\n if (this.props.onEnter) {\n this.props.onEnter(this.state.input);\n }\n } else if (e.key === 'Escape') {\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n }\n\n render() {\n const chips = [];\n let count = 0;\n const staticMembers = this.props.staticMembers || [];\n this.state.sortedChips.forEach(item => {\n chips.push(\n \n );\n count++;\n });\n const className = \"chip-input\" + (this.state.focused ? ' focused' : '');\n const autoFocus = !(this.props.tabIndex > 0);\n return (\n \n {chips}\n \n
\n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\n\nexport default class Chip extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel(this.props.topic, this.props.index);\n }\n\n render() {\n const title = this.props.title || this.props.topic;\n const className = this.props.invalid ? 'chip invalid' : 'chip';\n return (\n \n {this.props.noAvatar ?\n
:\n
\n \n
\n }\n
{title} \n {this.props.onCancel && !this.props.required ?\n
× \n :
}\n
\n );\n }\n};\n","// A panel included into a list of contacts with an action text.\nimport React from 'react';\nimport { injectIntl } from 'react-intl';\n\nclass ContactAction extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.onAction(this.props.action);\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n return (\n \n {formatMessage(this.props.title, this.props.values)}
\n \n );\n }\n};\n\nexport default injectIntl(ContactAction);\n","import React from 'react';\n\nconst icon_mapping = {'muted': 'notifications_off', 'banned': 'block', 'staff': 'verified_user'};\n\n/* Contact's labels: [you], or icons [muted], [blocked] */\nexport default class ContactBadges extends React.PureComponent {\n render() {\n let badges = null;\n if (this.props.badges && this.props.badges.length > 0) {\n badges = [];\n this.props.badges.forEach(b => {\n const color = (b.color ? ' ' + b.color : '');\n if (b.icon) {\n badges.push({icon_mapping[b.icon] || b.icon} );\n } else {\n badges.push({b.name} );\n }\n });\n return <>{badges}>;\n }\n return null;\n }\n};\n","// ContactList: component for showing a list of contacts,\n// such as a list of group members in a group chat.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode } from 'tinode-sdk';\n\nimport Contact from './contact.jsx';\nimport ContactAction from './contact-action.jsx';\n\nimport { makeImageUrl } from '../lib/blob-helpers.js';\nimport { topicDisplayName } from '../lib/utils.js';\n\nimport { MESSAGE_PREVIEW_LENGTH } from '../config.js';\n\nconst messages = defineMessages({\n badge_you: {\n id: 'badge_you',\n defaultMessage: 'you',\n description: 'Badge for indicating the current user'\n },\n badge_owner: {\n id: 'badge_owner',\n defaultMessage: 'owner',\n description: 'Badge for indicating the owner'\n }\n});\n\nclass ContactList extends React.PureComponent {\n render() {\n const { formatMessage } = this.props.intl;\n const showCheckmark = Array.isArray(this.props.topicSelected);\n const contactNodes = [];\n\n // Count of contacts, excluding action items.\n let contactsCount = 0;\n if (this.props.showSelfTopic) {\n const selected = showCheckmark ?\n this.props.topicSelected.some(Tinode.isSelfTopicName) :\n Tinode.isSelfTopicName(this.props.topicSelected);\n contactNodes.push(\n \n );\n contactsCount ++;\n }\n if (this.props.contacts && this.props.contacts.length > 0) {\n // Used keys to prevent duplicates when the user comes both from the 'fnd' and the list of contacts.\n const usedKeys = {};\n this.props.contacts.forEach(c => {\n if (c.action) {\n // Action item\n contactNodes.push(\n );\n } else {\n // Normal contact\n const key = this.props.showMode ? c.user : (c.topic || c.user);\n if (usedKeys[key]) {\n return;\n }\n usedKeys[key] = true;\n // If filter function is provided, filter out the items\n // which don't satisfy the condition.\n if (this.props.filterFunc && this.props.filter) {\n const filterOn = [key];\n if (c.private && c.private.comment) {\n filterOn.push(('' + c.private.comment).toLowerCase());\n }\n const displayName = topicDisplayName(key, c.public, null);\n if (displayName) {\n filterOn.push(('' + displayName).toLowerCase());\n }\n if (!this.props.filterFunc(this.props.filter, filterOn)) {\n return;\n }\n }\n\n const isChannel = Tinode.isChannelTopicName(key);\n const isGroup = !isChannel && Tinode.isGroupTopicName(key);\n const selected = showCheckmark ?\n (this.props.topicSelected.indexOf(key) > -1) :\n (this.props.topicSelected === key);\n const badges = [];\n if (this.props.showMode) {\n if (key == this.props.myUserId) {\n badges.push({name: formatMessage(messages.badge_you), color: 'green'});\n }\n if (c.acs && c.acs.isOwner()) {\n badges.push({name: formatMessage(messages.badge_owner), color: 'blue'});\n }\n }\n\n const comment = Array.isArray(c.private) ?\n c.private.join(',') : (c.private ? c.private.comment : null);\n let preview;\n let forwarded;\n let previewIsResponse;\n let deliveryStatus;\n if (!this.props.showMode && c.latestMessage) {\n const msg = c.latestMessage();\n if (msg) {\n forwarded = msg.head ? msg.head.forwarded : null;\n deliveryStatus = msg._status || c.msgStatus(msg, true);\n previewIsResponse = msg.from != this.props.myUserId;\n if (msg.content) {\n preview = typeof msg.content == 'string' ?\n msg.content.substr(0, MESSAGE_PREVIEW_LENGTH) :\n Drafty.preview(msg.content, MESSAGE_PREVIEW_LENGTH);\n }\n }\n }\n\n contactNodes.push(\n \n );\n contactsCount ++;\n }\n }, this);\n }\n\n return (\n \n {contactsCount == 0 ?\n
\n {this.props.emptyListMessage}\n
\n :\n null\n }\n {contactNodes.length > 0 ?\n
\n :\n null\n }\n
\n );\n }\n};\n\nexport default injectIntl(ContactList);\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactBadges from './contact-badges.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport UnreadBadge from './unread-badge.jsx';\n\nimport { Drafty } from 'tinode-sdk';\n\nimport { previewFormatter } from '../lib/formatters.js';\nimport { deliveryMarker } from '../lib/utils.js';\nimport { truncateString } from '../lib/strformat.js';\n\nconst messages = defineMessages({\n self_topic_name: {\n id: 'self_topic_name',\n defaultMessage: 'Saved messages',\n description: 'Name of self topic for UI'\n },\n self_topic_comment: {\n id: 'self_topic_comment',\n defaultMessage: 'Notes, messages, links, files saved for posterity',\n description: 'Comment for self topic for UI'\n }\n});\n\nclass Contact extends React.Component {\n constructor(props) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.onSelected) {\n // Index this.props.index is used by GroupManager.\n this.props.onSelected(this.props.item, this.props.index);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({\n topicName: this.props.item,\n topicTitle: this.props.title,\n y: e.pageY,\n x: e.pageX\n });\n }\n\n render() {\n let title = this.props.title;\n const self = Tinode.isSelfTopicName(this.props.item);\n if (!title) {\n if (self) {\n title = this.props.intl.formatMessage(messages.self_topic_name);\n } else {\n title = ;\n }\n } else if (title.length > 30) {\n // Have to support RTL languages too.\n title = truncateString(title, 30);\n }\n const online = this.props.now ? 'online' : 'offline';\n const avatar = this.props.avatar ? this.props.avatar : true;\n const badges = this.props.badges ? this.props.badges.slice() : [];\n const icon_badges = [];\n if (this.props.isVerified) {\n icon_badges.push({icon: 'verified', color: 'verified-color'});\n }\n if (this.props.isStaff) {\n icon_badges.push({icon: 'staff', color: 'staff-color'});\n }\n if (this.props.isDangerous) {\n icon_badges.push({icon: 'dangerous', color: 'danger-color'});\n }\n if (this.props.acs) {\n if (this.props.showMode) {\n badges.push({name: this.props.acs.getMode(), key: 'mode'});\n }\n if (this.props.acs.isMuted()) {\n icon_badges.push({icon: 'muted'});\n }\n if (!this.props.acs.isJoiner()) {\n icon_badges.push({icon: 'banned'});\n }\n }\n\n // The this.props.preview contains alreay shortened Drafty or string.\n let preview;\n if (typeof this.props.preview == 'string') {\n preview = this.props.preview;\n } else if (Drafty.isValid(this.props.preview)) {\n preview = React.createElement(React.Fragment, null, Drafty.format(this.props.preview, previewFormatter,\n {formatMessage: this.props.intl.formatMessage, previewIsResponse: this.props.previewIsResponse}));\n } else if (this.props.preview) {\n preview =\n <>warning_amber \n \n >;\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n const titleClass = 'contact-title' + (this.props.deleted ? ' deleted' : '');\n\n const comment = preview || this.props.comment ||\n (self ? this.props.intl.formatMessage(messages.self_topic_comment) : '\\u00A0');\n const bgColor = this.props.showCheckmark ? null :\n (this.props.selected ? 'selected' : (this.props.pinned ? 'tpinned' : null));\n return (\n \n \n \n {this.props.deleted ? cancel :\n (!self && this.props.showOnline) ? :\n (this.props.showCheckmark && this.props.selected) ?\n check_circle \n : null}\n
\n \n
{title} \n {this.props.isGroup ? group : null}\n {this.props.isChannel ? podcasts : null}\n {!self ? : null}\n {!this.props.deleted ? : null}\n
\n {this.props.showMode ?\n
:\n this.props.small ? null :
{marker}{comment}
}\n
\n {this.props.showContextMenu ?\n \n \n expand_more \n \n : null}\n \n );\n }\n};\n\nexport default injectIntl(Contact);\n","// Context Menu: popup/dropdown menu.\nimport React from 'react';\nimport { injectIntl, defineMessages } from 'react-intl';\nimport { Drafty } from 'tinode-sdk';\n\nimport { REM_SIZE } from '../config.js';\nimport { favoriteMessages, getFavorites, deleteFavorite, recallMessage } from '../lib/im-api.js';\n\n// Session-local record of which (topic, seq) pairs are already favorited, and the favorite_id once\n// resolved. POST /favorites/batch's response only reports counts (created_count/existing_count/\n// failed), never the created id, so \"取消收藏\" (which needs a favorite_id, not a topic/seq) has\n// nothing to delete until a follow-up list lookup resolves it -- cached here so that only has to\n// happen once per message rather than on every menu open. A fresh ContextMenu instance is\n// constructed each time the menu opens (tinode-web.jsx conditionally mounts it), so reading this at\n// construction time is enough to pick the right title/action without any extra plumbing.\nconst favoriteState = new Map();\nfunction favoriteKey(topicName, seq) { return topicName + ':' + seq; }\nfunction findFavorite(topicName, seq) {\n return getFavorites({type: 'all'}).then(data => (data.items || [])\n .find(it => it.source && it.source.topic === topicName && String(it.source.seq) === String(seq)));\n}\n\nconst messages = defineMessages({\n info: {\n id: 'menu_item_info',\n defaultMessage: 'Info',\n description: 'Show extended topic information'\n },\n clear_messages: {\n id: 'menu_item_clear_messages',\n defaultMessage: 'Clear messages',\n description: 'Delete all messages'\n },\n clear_for_all: {\n id: 'menu_item_clear_messages_for_all',\n defaultMessage: 'Clear for All',\n description: 'Delete all message(s) for all members'\n },\n delete: {\n id: 'menu_item_delete',\n defaultMessage: 'Delete',\n description: 'Delete selected messages'\n },\n delete_for_all: {\n id: 'menu_item_delete_for_all',\n defaultMessage: 'Delete for All',\n description: 'Delete selected message(s) for all members'\n },\n send_retry: {\n id: 'menu_item_send_retry',\n defaultMessage: 'Retry',\n description: 'Retry sending message'\n },\n mute: {\n id: 'menu_item_mute',\n defaultMessage: 'Mute',\n description: 'Turn off notifications'\n },\n unmute: {\n id: 'menu_item_unmute',\n defaultMessage: 'Unmute',\n description: 'Turn notifications on'\n },\n reply: {\n id: 'menu_item_reply',\n defaultMessage: 'Reply',\n description: 'Reply to message'\n },\n forward: {\n id: 'menu_item_forward',\n defaultMessage: 'Forward',\n description: 'Forward message'\n },\n edit: {\n id: 'menu_item_edit',\n defaultMessage: 'Edit',\n description: 'Edit message'\n },\n topic_delete: {\n id: 'menu_item_delete_topic',\n defaultMessage: 'Delete',\n description: 'Delete entire topic'\n },\n topic_delete_warning: {\n id: 'topic_delete_warning',\n defaultMessage: 'Are you sure you want to delete this conversation? It cannot be undone.',\n description: 'Alert warning when deleting entire topic'\n },\n delete_messages_warning: {\n id: 'delete_messages_warning',\n defaultMessage: 'Are you sure you want to delete all messages for everyone? It cannot be undone.',\n description: 'Alert dialog warning when hard-deleting all messages.'\n },\n unblock: {\n id: 'menu_item_unblock',\n defaultMessage: 'Unblock',\n description: 'Unblock topic or user'\n },\n // Generic string suitable for either topic or user.\n block: {\n id: 'menu_item_block',\n defaultMessage: 'Block',\n description: 'Block topic or user'\n },\n topic_block_warning: {\n id: 'topic_block_warning',\n defaultMessage: 'Are you sure you want to block this conversation?',\n description: 'Alert warning when blocking a topic.'\n },\n member_delete: {\n id: 'menu_item_member_delete',\n defaultMessage: 'Remove',\n description: 'Remove user from topic'\n },\n archive: {\n id: 'menu_item_archive_topic',\n defaultMessage: 'Archive',\n description: 'Move topic from the list of active chats to archive'\n },\n unarchive: {\n id: 'menu_item_restore_topic',\n defaultMessage: 'Restore',\n description: 'Restore topic from archive'\n },\n edit_permissions: {\n id: 'menu_item_edit_permissions',\n defaultMessage: 'Edit permissions',\n description: 'Menu item [Edit permissions]'\n },\n clear_messages_warning: {\n id: 'clear_messages_warning',\n defaultMessage: 'Are you sure you want to clear all messages? It cannot be undone.',\n description: 'Alert dialog warning when deleting all messages.'\n },\n pin_message: {\n id: 'pin_message',\n defaultMessage: 'Pin',\n description: 'Menu item [Pin] for pinning message to the top.'\n },\n unpin_message: {\n id: 'unpin_message',\n defaultMessage: 'Unpin',\n description: 'Menu item [Unpin] for un-pinning the message.'\n },\n pin_chat: {\n id: 'pin_chat',\n defaultMessage: 'Pin',\n description: 'Menu item [Pin] for pinning chat to the top.'\n },\n unpin_chat: {\n id: 'unpin_chat',\n defaultMessage: 'Unpin',\n description: 'Menu item [Unpin] for un-pinning the chat.'\n },\n});\n\nclass ContextMenu extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n const {formatMessage} = props.intl;\n\n this.handlePageClick = this.handlePageClick.bind(this);\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClick = this.handleClick.bind(this);\n\n // Preconfigured menu items.\n this.MenuItems = {\n 'topic_info': {\n id: 'topic_info',\n title: formatMessage(messages.info),\n handler: null\n },\n 'messages_clear': {\n id: 'messages_clear',\n title: formatMessage(messages.clear_messages),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n params.topicTitle || formatMessage(messages.clear_messages), // title\n formatMessage(messages.clear_messages_warning), // content\n (_ => { this.deleteMessages(true, false, params, errorHandler); }), // onConfirm\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'messages_clear_hard': {\n id: 'messages_clear_hard',\n title: formatMessage(messages.clear_for_all),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n params.topicTitle || formatMessage(messages.clear_for_all), // title\n formatMessage(messages.delete_messages_warning), // content\n (_ => { return this.deleteMessages(true, true, params, errorHandler); }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'message_delete': {\n id: 'message_delete',\n title: formatMessage(messages.delete),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, false, params, errorHandler);\n }\n },\n 'message_delete_hard': {\n id: 'message_delete_hard',\n title: formatMessage(messages.delete_for_all),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, true, params, errorHandler);\n }\n },\n // Hard-delete but with just 'Delete' title.\n 'message_delete_generic': {\n id: 'message_delete_generic',\n title: formatMessage(messages.delete),\n handler: (params, errorHandler) => {\n return this.deleteMessages(false, true, params, errorHandler);\n }\n },\n 'menu_item_send_retry': {\n id: 'menu_item_send_retry',\n title: formatMessage(messages.send_retry),\n handler: (params, errorHandler) => {\n return this.retryMessage(params, errorHandler);\n }\n },\n 'menu_item_reply': {\n id: 'menu_item_reply',\n title: formatMessage(messages.reply),\n handler: (params, errorHandler) => {\n return this.replyToMessage(params, errorHandler);\n }\n },\n 'menu_item_forward': {\n id: 'menu_item_forward',\n title: formatMessage(messages.forward),\n handler: _ => {} /* the action is taken directly in tinode-web */\n },\n 'menu_item_copy': {\n id: 'menu_item_copy',\n title: '复制',\n handler: (params, errorHandler) => {\n return this.copyMessageText(params, errorHandler);\n }\n },\n 'menu_item_favorite': {\n id: 'menu_item_favorite',\n title: favoriteState.has(favoriteKey(props.params && props.params.topicName, props.params && props.params.seq)) ? '取消收藏' : '收藏',\n handler: (params, errorHandler) => {\n return favoriteState.has(favoriteKey(params.topicName, params.seq)) ?\n this.removeFavorite(params, errorHandler) : this.addFavorite(params, errorHandler);\n }\n },\n 'menu_item_recall': {\n id: 'menu_item_recall',\n title: '撤回',\n handler: (params, errorHandler) => {\n return this.recallOwnMessage(params, errorHandler);\n }\n },\n 'menu_item_select': {\n id: 'menu_item_select',\n title: '多选',\n handler: _ => {} /* the action is taken directly in tinode-web, like forward */\n },\n 'menu_item_edit': {\n id: 'menu_item_edit',\n title: formatMessage(messages.edit),\n handler: (params, errorHandler) => {\n return this.editMessage(params, errorHandler);\n }\n },\n 'menu_item_pin': {\n id: 'menu_item_pin',\n title: formatMessage(messages.pin_message),\n handler: (params, errorHandler) => {\n return this.pinMessage(true, params, errorHandler);\n }\n },\n 'menu_item_unpin': {\n id: 'menu_item_unpin',\n title: formatMessage(messages.unpin_message),\n handler: (params, errorHandler) => {\n return this.pinMessage(false, params, errorHandler);\n }\n },\n 'topic_unmute': {\n id: 'topic_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'topic_mute': {\n id: 'topic_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'topic_unblock': {\n id: 'topic_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n 'topic_block': {\n id: 'topic_block',\n title: formatMessage(messages.block),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n params.topicTitle || formatMessage(messages.block), // title\n formatMessage(messages.topic_block_warning), // content\n (_ => this.topicPermissionSetter('-JP', params, errorHandler).then(ctrl => {\n this.props.onTopicRemoved(params.topicName);\n return ctrl;\n })),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_delete': {\n id: 'topic_delete',\n title: formatMessage(messages.topic_delete),\n handler: (params, errorHandler) => {\n return props.onShowAlert(\n params.topicTitle || formatMessage(messages.topic_delete), // title\n formatMessage(messages.topic_delete_warning), // content\n (_ => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.delTopic(true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }),\n null, // \"OK\"\n true, // Show Reject button\n null // \"Cancel\"\n );\n }\n },\n 'topic_archive': {\n id: 'topic_archive',\n title: formatMessage(messages.archive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'topic_restore': {\n id: 'topic_restore',\n title: formatMessage(messages.unarchive),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n return topic.archive(false).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'topic_pin': {\n id: 'topic_pin',\n title: formatMessage(messages.pin_chat),\n handler: (params, errorHandler) => {\n const me = this.props.tinode.getMeTopic();\n if (!me) {\n console.warn(\"'me' topic not found\");\n return;\n }\n return me.pinTopic(params.topicName, true).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'topic_unpin': {\n id: 'topic_unpin',\n title: formatMessage(messages.unpin_chat),\n handler: (params, errorHandler) => {\n const me = this.props.tinode.getMeTopic();\n if (!me) {\n console.warn(\"'me' topic not found\");\n return;\n }\n return me.pinTopic(params.topicName, false).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n // menu_item_edit_permissions is defined elsewhere.\n 'permissions': {\n id: 'permissions',\n title: formatMessage(messages.edit_permissions),\n handler: null\n },\n 'member_delete': {\n id: 'member_delete',\n title: formatMessage(messages.member_delete),\n handler: (params, errorHandler) => {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic || !params.user) {\n console.warn(\"Topic or user not found: '\" + params.topicName + \"', '\" + params.user + \"'\");\n return;\n }\n return topic.delSubscription(params.user).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n },\n 'member_mute': {\n id: 'member_mute',\n title: formatMessage(messages.mute),\n handler: this.topicPermissionSetter.bind(this, '-P')\n },\n 'member_unmute': {\n id: 'member_unmute',\n title: formatMessage(messages.unmute),\n handler: this.topicPermissionSetter.bind(this, '+P')\n },\n 'member_block': {\n id: 'member_block',\n title: formatMessage(messages.block),\n handler: this.topicPermissionSetter.bind(this, '-JP')\n },\n 'member_unblock': {\n id: 'member_unblock',\n title: formatMessage(messages.unblock),\n handler: this.topicPermissionSetter.bind(this, '+JP')\n },\n };\n }\n\n componentDidMount() {\n document.addEventListener('mousedown', this.handlePageClick, false);\n document.addEventListener('keyup', this.handleEscapeKey, false);\n }\n\n componentWillUnmount() {\n document.removeEventListener('mousedown', this.handlePageClick, false);\n document.removeEventListener('keyup', this.handleEscapeKey, false);\n }\n\n handlePageClick(e) {\n if (this.selfRef.current.contains(e.target)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n this.props.hide();\n }\n }\n\n handleClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.hide();\n let item = this.props.items[e.currentTarget.dataset.id];\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n\n if (!item) {\n console.error(\"Invalid menu item ID\", e.currentTarget.dataset.id);\n } else {\n this.props.onAction(\n item.id,\n item.handler(this.props.params, this.props.onError),\n this.props.params);\n }\n }\n\n // Menu Actions\n\n deleteMessages(all, hard, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found: \", params.topicName);\n return;\n }\n\n // We don't know if the message is still pending (e.g. attachment is being uploaded),\n // so try cancelling first. No harm if we can't cancel.\n // The message can be cancelled if transmission to the server has not\n // started yet or if the message send has failed.\n if (!all && topic.cancelSend(params.seq)) {\n return;\n }\n\n const promise = all ?\n topic.delMessagesAll(hard) :\n params.replace > 0 ?\n topic.delMessagesEdits(params.replace, hard) :\n topic.delMessagesList([params.seq], hard);\n\n return promise.catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Copies the message's plain-text content to the clipboard.\n copyMessageText(params, errorHandler) {\n const text = typeof params.content == 'string' ? params.content : Drafty.toPlainText(params.content);\n return navigator.clipboard.writeText(text || '').catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n addFavorite(params, errorHandler) {\n return favoriteMessages([{topic: params.topicName, seq: params.seq}]).then(result => {\n // The request itself resolves 200 even when the specific message couldn't be favorited --\n // real per-item outcomes are only in this body (created_count/existing_count/failed), same\n // \"batch call succeeds at the transport level, item can still fail\" shape already handled for\n // forward/batch-delete elsewhere in this app. Left unchecked, a failed item here (e.g. the\n // backend's message-mirror table hasn't indexed this message yet) shows no error at all --\n // indistinguishable from success -- and silently never appears in 我的收藏.\n const failedItem = result && result.failed && result.failed[0];\n if (failedItem) {\n if (errorHandler) {\n errorHandler(failedItem.reason === 'NOT_FOUND' ? '收藏失败,该消息暂无法收藏,请稍后重试' : '收藏失败', 'err');\n }\n return;\n }\n const key = favoriteKey(params.topicName, params.seq);\n favoriteState.set(key, true);\n // Resolve the real favorite_id in the background so a later \"取消收藏\" has it ready -- see the\n // module-level comment on favoriteState for why this needs a separate lookup at all.\n findFavorite(params.topicName, params.seq).then(match => {\n if (match) favoriteState.set(key, match.favorite_id);\n }).catch(() => {});\n }).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n removeFavorite(params, errorHandler) {\n const key = favoriteKey(params.topicName, params.seq);\n const cached = favoriteState.get(key);\n const finish = favoriteId => deleteFavorite(favoriteId).then(() => favoriteState.delete(key));\n // A real favorite_id may not have resolved yet if this is opened right after addFavorite's own\n // background lookup started -- fall back to looking it up now rather than failing silently.\n const ready = (cached && cached !== true) ? Promise.resolve(cached) : findFavorite(params.topicName, params.seq).then(match => match && match.favorite_id);\n return ready.then(favoriteId => {\n if (!favoriteId) { if (errorHandler) errorHandler('未找到对应收藏', 'err'); return; }\n return finish(favoriteId);\n }).catch(err => {\n if (errorHandler) {\n errorHandler(err.message || '取消收藏失败', 'err');\n }\n });\n }\n\n // Recall (Ch.4): a dedicated backend action distinct from delete -- server-enforced short time\n // window, permission check, and a 'message.recalled' business event for the other party. It does\n // not touch Tinode's own message store, so once the server accepts it we also hard-delete locally\n // (same call the plain 'Delete for All' item uses) to reflect it in this client's live view.\n recallOwnMessage(params, errorHandler) {\n return recallMessage(params.topicName, params.seq).then(_ => {\n return this.deleteMessages(false, true, params, errorHandler);\n }).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Retries sending failed message.\n retryMessage(params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n // Remove the existing message entry.\n if (!topic || !topic.flushMessage(params.seq)) {\n return;\n }\n const msg = topic.createMessage(params.content, false);\n // createMessage only ever fills in head.mime for non-plain-text content -- the original\n // message's x-im-type/reply/mentions/mention_all live in params.head (set by\n // chat-message.jsx's handleContextClick from the props it was rendered with) and would\n // otherwise be silently dropped, unlike the auto-retry path (messages-view.jsx's retrySend)\n // which already forwards the original head. Same merge tinode-web.jsx's\n // sendMessageToTopic does for a fresh send.\n if (params.head) {\n msg.head = Object.assign(msg.head || {}, params.head);\n }\n return topic.publishDraft(msg).catch(err => {\n if (errorHandler) {\n errorHandler(err.message, 'err');\n }\n });\n }\n\n // Pin or unpin the message.\n pinMessage(pin, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n return;\n }\n topic.pinMessage(params.seq, pin)\n .catch(err => errorHandler ? errorHandler(err.message, 'err') : null);\n }\n\n // Function is used by context menu to set permissions.\n topicPermissionSetter(mode, params, errorHandler) {\n const topic = this.props.tinode.getTopic(params.topicName);\n if (!topic) {\n console.warn(\"Topic not found\", params.topicName);\n return;\n }\n\n let result = topic.updateMode(params.user, mode);\n if (errorHandler) {\n result = result.catch(err => errorHandler(err.message, 'err'));\n }\n return result;\n }\n\n replyToMessage(params, errorHandler) {\n params.pickReply(params.seq, params.content, params.userFrom, params.userName, errorHandler);\n }\n\n editMessage(params, errorHandler) {\n params.editMessage(params.replace || params.seq, params.content, errorHandler);\n }\n\n render() {\n const menu = [];\n let count = 0;\n this.props.items.forEach(item => {\n if (typeof item == 'string') {\n item = this.MenuItems[item];\n }\n if (item && item.title) {\n const className = item.disabled ? 'disabled' : undefined;\n menu.push(\n item.title == '-' ?\n \n :\n {item.title} \n );\n }\n count++;\n });\n\n // Ensure that menu is inside the app-container.\n const hSize = 12 * REM_SIZE;\n const vSize = REM_SIZE * (0.7 + menu.length * 2.5);\n const left = (this.props.bounds.right - this.props.clickAt.x < hSize) ?\n (this.props.clickAt.x - this.props.bounds.left - hSize) :\n (this.props.clickAt.x - this.props.bounds.left);\n const top = (this.props.bounds.bottom - this.props.clickAt.y < vSize) ?\n (this.props.clickAt.y - this.props.bounds.top - vSize) :\n (this.props.clickAt.y - this.props.bounds.top);\n\n const position = {\n left: left + 'px',\n top: top + 'px'\n };\n\n return (\n \n );\n }\n}\n\nexport default injectIntl(ContextMenu);\n","// Image zoom and crop widget.\n\nimport React from 'react';\n\nconst DEFAULT_MAX_ZOOM = 8;\n\nexport default class Cropper extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n // Coordinates of the top left corner of the image in bounding box (container) coordinates.\n panX: 0,\n panY: 0,\n // Origin of the zoom in image coordinates.\n originX: 0,\n originY: 0,\n // Zoom scale.\n zoom: 1,\n // Zoom min and max.\n minZoom: 0.001,\n maxZoom: DEFAULT_MAX_ZOOM,\n };\n\n // References to DOM elements for hooking up events and getting screen dimensions.\n // The transparent element which captures mouse moves (moves with the image).\n this.overlay = React.createRef();\n // The image cutout window or view port (static).\n this.cutout = React.createRef();\n // Scaled and translated image preview.\n this.preview = React.createRef();\n // The main container (static).\n this.boundingBox = React.createRef();\n\n // The original image width and height before any scaling (does not change).\n this.imageWidth = 0;\n this.imageHeight = 0;\n\n // Mouse position when dragging.\n this.mouseX = 0\n this.mouseY = 0;\n // Length of the previous mouse move when dragging.\n this.prevDistance = 0;\n\n // Bounding rectangles of static elements (does not change).\n this.cutoutRect = {};\n this.bBoxRect = {};\n // Center of the bounding box (does not change).\n this.originX = 0;\n this.originY = 0;\n\n this.initScaling = this.initScaling.bind(this);\n this.onZoom = this.onZoom.bind(this);\n this.handleZoom = this.handleZoom.bind(this);\n this.mouseDown = this.mouseDown.bind(this);\n this.mouseUp = this.mouseUp.bind(this);\n this.mouseMove = this.mouseMove.bind(this);\n this.mouseTouch = this.mouseTouch.bind(this);\n this.positionAll = this.positionAll.bind(this);\n this.translate = this.translate.bind(this);\n }\n\n componentDidMount() {\n this.overlay.current.addEventListener('mousedown', this.mouseDown, { passive: true });\n this.overlay.current.addEventListener('touchstart', this.mouseDown, { passive: true });\n\n // The rectangle position is in viewport coordinates.\n this.bBoxRect = this.boundingBox.current.getBoundingClientRect();\n // Center of the bounding box in container coordinates.\n this.originX = this.bBoxRect.width / 2;\n this.originY = this.bBoxRect.height / 2;\n\n // The cutout circle bounds in viewport coordinates.\n this.cutoutRect = this.cutout.current.getBoundingClientRect();\n }\n\n componentWillUnmount() {\n if (this.overlay.current) {\n this.overlay.current.removeEventListener('mousedown', this.mouseDown);\n this.overlay.current.removeEventListener('touchstart', this.mouseDown);\n }\n }\n\n // Position all elements.\n positionAll(panX, panY, zoom) {\n // Zoom origin in image preview coordinates.\n this.setState({\n panX: panX,\n panY: panY,\n zoom: zoom,\n originX: this.originX - panX,\n originY: this.originY - panY,\n });\n\n // Pass cut out coordinates to caller.\n const left = (this.originX - panX) * zoom - this.originX;\n const top = (this.originY - panY) * zoom - this.originY;\n this.props.onChange(\n (left + this.cutoutRect.left - this.bBoxRect.left) / zoom,\n (top + this.cutoutRect.top - this.bBoxRect.top) / zoom,\n this.cutoutRect.width / zoom,\n this.cutoutRect.height / zoom,\n zoom);\n }\n\n // Check if new location is within the limits.\n static checkBound(currPan, img, cutout, delta) {\n let nextDiff = Math.min(0, cutout[0] - img[0] - delta, img[1] - cutout[1] + delta);\n if (nextDiff == 0) {\n // Cutout is completely within the image.\n currPan += delta;\n } else if (Math.min(0, cutout[0] - img[0], img[1] - cutout[1]) < nextDiff) {\n // Cutout is outside of the range but closer to the bound.\n currPan += delta;\n }\n return currPan;\n }\n\n initScaling() {\n // Initialize components.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n this.imageWidth = imgRect.width;\n this.imageHeight = imgRect.height;\n\n // Set zoom slider's min and max values. Make sure the scaled image cannot be smaller than the cutout.\n const minZoom = Math.max(this.cutoutRect.width / imgRect.width, this.cutoutRect.height / imgRect.height);\n this.setState({\n minZoom: minZoom,\n maxZoom: minZoom * DEFAULT_MAX_ZOOM\n });\n\n // Initial zoom level fills the bounding box at the smallest image dimension and overflows the largest, i.e. \"fill\" not \"fit\".\n const zoom = Math.max(this.bBoxRect.width / imgRect.width, this.bBoxRect.height / imgRect.height);\n // Converting from viewport coordinates to container, then panning.\n const panX = this.cutoutRect.left - this.bBoxRect.left -\n (imgRect.width - this.cutoutRect.width) / 2;\n const panY = this.cutoutRect.top - this.bBoxRect.top -\n (imgRect.height - this.cutoutRect.height) / 2;\n\n this.positionAll(panX, panY, zoom);\n }\n\n onZoom(e) {\n this.handleZoom(e.target.value);\n }\n\n handleZoom(zoom) {\n let panX = this.state.panX;\n let panY = this.state.panY;\n\n // Ensure that the image at the new zoom is not outside of the cutout boundaries.\n\n // Calculate image coordinates at the new zoom.\n const imgLeft = this.originX - (this.originX - panX) * zoom;\n const imgRight = imgLeft + this.imageWidth * zoom;\n const imgTop = this.originY - (this.originY - panY) * zoom;\n const imgBottom = imgTop + this.imageHeight * zoom;\n\n // Cutout in the same coordinates as the image.\n const coLeft = this.cutoutRect.left - this.bBoxRect.left;\n const coRight = coLeft + this.cutoutRect.width;\n const coTop = this.cutoutRect.top - this.bBoxRect.top;\n const coBottom = coTop + this.cutoutRect.height;\n\n if (coLeft < imgLeft) {\n panX -= (imgLeft - coLeft) / zoom;\n } else if (coRight > imgRight) {\n panX += (coRight - imgRight) / zoom;\n }\n\n if (coTop < imgTop) {\n panY -= (imgTop - coTop) / zoom;\n } else if (coBottom > imgBottom) {\n panY += (coBottom - imgBottom) /zoom;\n }\n\n this.positionAll(panX, panY, zoom);\n }\n\n mouseDown(e) {\n if (e.touches) {\n this.mouseX = e.touches[0].pageX;\n this.mouseY = e.touches[0].pageY;\n } else {\n this.mouseX = e.pageX;\n this.mouseY = e.pageY;\n }\n\n window.addEventListener('mousemove', this.mouseMove, { passive: false });\n window.addEventListener('touchmove', this.mouseTouch, { passive: false });\n window.addEventListener('mouseup', this.mouseUp, { passive: true });\n window.addEventListener('touchend', this.mouseUp, { passive: true });\n // Disable text selection in the entire document.\n document.body.style['userSelect'] = 'none';\n }\n\n // Perform image panning.\n translate(pageX, pageY) {\n const dX = (pageX - this.mouseX) / this.state.zoom;\n const dY = (pageY - this.mouseY) / this.state.zoom;\n\n this.mouseX = pageX;\n this.mouseY = pageY;\n\n // Make sure the image is within the cutout window.\n const imgRect = this.preview.current.getBoundingClientRect();\n\n // Check if the new position is within the boundaries, and if not if it's closer to them.\n const panX = Cropper.checkBound(this.state.panX, [imgRect.left, imgRect.right],\n [this.cutoutRect.left, this.cutoutRect.right], dX);\n const panY = Cropper.checkBound(this.state.panY, [imgRect.top, imgRect.bottom],\n [this.cutoutRect.top, this.cutoutRect.bottom], dY);\n\n this.positionAll(panX, panY, this.state.zoom);\n }\n\n // Image panning.\n mouseMove(e) {\n e.preventDefault();\n this.translate(e.pageX, e.pageY);\n }\n\n mouseTouch(e) {\n e.preventDefault();\n\n if (e.touches.length == 1) {\n this.translate(e.touches[0].pageX, e.touches[0].pageY);\n return;\n }\n\n // Image zooming by pinching.\n const [touch0, touch1] = e.touches;\n const distance = Math.sqrt((touch0.pageX - touch1.pageX) * (touch0.pageX - touch1.pageX) +\n (touch0.pageY - touch1.pageY) * (touch0.pageY - touch1.pageY));\n\n if (!this.prevDistance) {\n this.prevDistance = distance / this.state.zoom;\n }\n\n let scale = (distance / this.prevDistance);\n this.handleZoom(Math.max(this.minZoom, Math.min(this.maxZoom, scale)));\n }\n\n mouseUp(e) {\n window.removeEventListener('mousemove', this.mouseMove);\n window.removeEventListener('touchmove', this.mouseTouch);\n window.removeEventListener('mouseup', this.mouseUp);\n window.removeEventListener('touchend', this.mouseUp);\n // Re-enable text selection.\n document.body.style['userSelect'] = '';\n\n this.positionAll(this.state.panX, this.state.panY, this.state.zoom);\n }\n\n render() {\n // transform3d: position and scale.\n const t3d = `translate3d(${this.state.panX}px, ${this.state.panY}px, 0) scale(${this.state.zoom})`;\n // transformOrigin: zoom origin.\n const orig = `${this.state.originX}px ${this.state.originY}px`;\n\n // Overlay position and size are exactly equal to the position and size of the transformed image\n // except it uses different coordinates.\n const overlay = {\n top: `${this.originY - this.state.originY * this.state.zoom}px`,\n left: `${this.originX - this.state.originX * this.state.zoom}px`,\n width: `${this.imageWidth * this.state.zoom}px`,\n height: `${this.imageHeight * this.state.zoom}px`\n };\n return (\n \n
\n
\n
\n
\n
\n
\n \n
\n
\n );\n }\n}\n","import React from 'react';\n\nimport MenuCancel from './menu-cancel.jsx';\n\nexport default class ErrorPanel extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n show: false,\n };\n\n this.hide = this.hide.bind(this);\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.level !== this.props.level) {\n this.setState({\n show: !(!this.props.level)\n });\n }\n }\n\n hide() {\n this.setState({show: false});\n if (this.props.onClearError) {\n this.props.onClearError();\n }\n }\n\n render() {\n const icons = {err: 'error', warn: 'warning', info: 'info'}\n const level = icons[this.props.level] || '';\n const className = 'info-box ' + level;\n return (\n \n );\n }\n};\n","// File uload/download progress indicator with a cancel inside.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class FileProgress extends React.PureComponent {\n render() {\n return (\n \n );\n }\n}\n","// Forward Menu: message forwarding popup/dropdown menu.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport ContactList from './contact-list.jsx';\nimport SearchContacts from './search-contacts.jsx';\n\nexport default class ForwardDialog extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n query: null\n };\n\n this.handleEscapeKey = this.handleEscapeKey.bind(this);\n this.handleClose = this.handleClose.bind(this);\n\n this.handleSearchContacts = this.handleSearchContacts.bind(this);\n this.handleContactSelected = this.handleContactSelected.bind(this);\n }\n\n componentDidMount() {\n this.props.onInitFind();\n }\n\n handleEscapeKey(e) {\n if (e.keyCode === 27) {\n // Not forwarding the message.\n this.props.hide(false);\n }\n }\n\n handleClose(e) {\n e.preventDefault();\n this.props.hide(false);\n }\n\n handleSearchContacts(query) {\n this.setState({ query: Tinode.isNullValue(query) ? null : query });\n this.props.onSearchContacts(query);\n }\n\n handleContactSelected(uid) {\n this.props.onTopicSelected(uid);\n this.props.hide(true);\n }\n\n render() {\n let contacts = this.state.query != null ? this.props.searchResults : this.props.contacts;\n // Filter out contacts without a 'W' or 'J' permissions as well as the current topic.\n contacts = contacts.filter((c) => {\n return (c.name != this.props.topicSelected) && c.acs.isJoiner() && c.acs.isWriter();\n });\n\n return (\n \n
\n
\n
{\n (search_placeholder) => \n } \n
{\n (not_found_placeholder) => \n } \n
\n
\n );\n }\n}\n","import React from 'react';\n\nimport { KNOWN_HOSTS } from '../config.js';\n\n/* Combobox for selecting host name */\n\nexport default class HostSelector extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n hostName: props.serverAddress,\n changed: false\n };\n\n this.handleHostNameChange = this.handleHostNameChange.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n handleHostNameChange(e) {\n this.setState({hostName: e.target.value, changed: true});\n }\n\n handleEditingFinished() {\n if (this.state.changed) {\n this.setState({changed: false});\n this.props.onServerAddressChange(this.state.hostName.trim());\n }\n }\n\n handleKeyDown(e) {\n if (e.key == 'Enter') {\n this.handleEditingFinished();\n }\n }\n\n render() {\n const hostOptions = [];\n for (let key in KNOWN_HOSTS) {\n let item = KNOWN_HOSTS[key];\n hostOptions.push(\n \n );\n }\n return (\n \n \n \n {hostOptions}\n \n
\n );\n }\n}\n","// In-place text editor. Shows text with an icon which toggles it into an input field.\nimport React from 'react';\n\nimport VisiblePassword from './visible-password.jsx';\n\nexport default class InPlaceEdit extends React.Component {\n constructor(props) {\n super(props);\n\n this.selfRef = React.createRef();\n\n this.state = {\n active: props.active,\n initialValue: props.value || '',\n value: props.value || '',\n valid: true\n };\n\n this.handeTextChange = this.handeTextChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleStartEditing = this.handleStartEditing.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n this.handlePasswordFinished = this.handlePasswordFinished.bind(this);\n }\n\n componentDidUpdate(prevProps, prevState) {\n // If text has changed while in read mode, update text and discard changes.\n // Ignore update if in edit mode.\n const newValue = this.props.value || '';\n if (prevState.initialValue != newValue && !prevState.active) {\n this.setState({\n initialValue: newValue,\n value: newValue\n });\n }\n }\n\n handeTextChange(e) {\n this.setState({value: e.target.value || ''});\n if (this.props.validator) {\n Promise.resolve(this.props.validator(e.target.value))\n .then(valid => {\n this.setState({valid: valid});\n })\n .catch(err => {\n // If it's interrupted, then the err is undefined. Ignore it.\n if (err) {\n this.setState({valid: false});\n }\n });\n }\n }\n\n handleKeyDown(e) {\n if (e.keyCode === 27) {\n // Escape pressed\n this.setState({value: this.props.value, active: false});\n } else if (e.keyCode === 13) {\n // Enter pressed\n this.handleEditingFinished(e);\n }\n }\n\n handleStartEditing() {\n if (!this.props.readOnly) {\n this.setState({active: true}, _ => {\n if (this.selfRef.current) {\n this.selfRef.current.focus();\n }\n });\n }\n }\n\n handleEditingFinished(event) {\n const value = this.state.value.trim();\n if (this.props.required && (!event.target.checkValidity() || !value)) {\n // Empty input\n this.setState({value: this.props.value, active: false});\n return;\n }\n this.setState({active: false});\n if ((value || this.props.value) && (value !== this.props.value) && this.state.valid) {\n this.props.onFinished(value);\n }\n }\n\n handlePasswordFinished(value) {\n this.setState({active: false});\n if (value && (value !== this.props.value)) {\n this.props.onFinished(value);\n }\n }\n\n render() {\n if (!this.state.active) {\n let spanText = this.props.type == 'password' ? '••••••••' : this.state.value;\n let spanClass = 'in-place-edit' + (this.props.readOnly ? ' disabled' : '');\n if (!spanText) {\n spanText = this.props.placeholder;\n spanClass += ' placeholder';\n }\n if (!this.props.multiline || this.props.multiline == 1) {\n spanClass += ' short';\n }\n\n return (\n {this.props.iconLeft && {this.props.iconLeft} }\n {spanText} \n {this.props.iconRight && {this.props.iconRight} }\n );\n }\n\n let element;\n const attr = {};\n if (this.props.type == 'password') {\n element = VisiblePassword;\n attr.onFinished = this.handlePasswordFinished;\n } else {\n if (this.props.multiline > 1) {\n element = 'textarea';\n attr.rows = this.props.multiline;\n attr.className = 'in-place-edit';\n } else {\n element = 'input';\n attr.type = this.props.type || 'text';\n attr.className = 'in-place-edit' + (this.props.iconLeft ? ' with-icon-left'\n : this.props.iconRight ? ' with-icon-right' : '');\n if (this.props.maxLength) {\n attr.maxLength=this.props.maxLength;\n }\n }\n attr.value = this.state.value;\n attr.className += this.state.valid ? '' : ' invalid';\n attr.ref = this.selfRef;\n attr.onChange = this.handeTextChange;\n attr.onKeyDown = this.handleKeyDown;\n attr.onBlur = this.handleEditingFinished;\n }\n attr.placeholder = this.props.placeholder;\n attr.required = this.props.required ? 'required' : '';\n attr.autoComplete = this.props.autoComplete;\n attr.autoFocus = true;\n if (this.props.spellCheck !== undefined) {\n attr.spellCheck = this.props.spellCheck ? 'true' : 'false';\n }\n\n if (this.props.iconLeft || this.props.iconRight) {\n return (\n <>\n {this.props.iconLeft && {this.props.iconLeft} }\n {React.createElement(element, attr, null)}\n {this.props.iconRight && {this.props.iconRight} }\n >\n );\n }\n return React.createElement(element, attr, null);\n }\n};\n","// Element which shows static video preview:\n// an image with duration and a play button in the middle.\n\nimport React from 'react';\n\nimport { secondsToTime } from '../lib/strformat.js'\n\nexport default class InlineVideo extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.videoRef = React.createRef();\n\n this.handleClick = this.handleClick.bind(this);\n }\n\n handleClick(e) {\n if (this.props.onClick) {\n // the click target has to be the image element.\n this.props.onClick(e);\n }\n }\n\n render() {\n const duration = secondsToTime(this.props['data-duration'] / 1000);\n const className = 'inline-video' + (this.props.onClick ? ' image-clickable' : '');\n return (\n \n {React.createElement('img', this.props)}\n
\n {this.props.onClick ?\n
play_arrow \n :\n
}\n
\n {duration ?
{duration}
: null}\n
\n );\n }\n};\n","// Image with a placeholder which is replaced when the promise is resolved.\nimport React from 'react';\n\nexport default class LazyImage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n src: this.props.isvideo ? 'img/blankvid.png' : 'img/blankimg.png',\n style: Object.assign({padding: '4px'}, this.props.style),\n className: this.props.className,\n alt: this.props.alt,\n onClick: this.props.onClick,\n };\n }\n\n componentDidMount() {\n // whenDone is a wrapper around an actual promise to be able to cancel it.\n this.props.whenDone\n .promise\n .then(data => this.setState({src: data.src, style: {...this.state.style, padding: 0}}))\n .catch(_ => this.setState({src: this.props.isvideo ? 'img/broken_video.png' : 'img/broken_image.png'}));\n }\n\n componentWillUnmount() {\n this.props.whenDone.cancel();\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.whenDone != this.props.whenDone) {\n this.setState({src: this.props.isvideo ? 'img/blankvid.png' : 'img/blankimg.png', style: {...this.state.style, padding: '4px'}});\n this.props.whenDone\n .promise\n .then(data => this.setState({src: data.src, style: {...this.state.style, padding: 0}}))\n .catch(_ => this.setState({src: this.props.isvideo ? 'img/broken_video.png' : 'img/broken_image.png'}));\n }\n }\n\n render() {\n return React.createElement('img', this.state);\n }\n};\n","import React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { idToColorClass } from '../lib/strformat.js';\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nimport { SELF_AVATAR_URI } from '../config.js';\n\nexport default class LetterTile extends React.PureComponent {\n render() {\n let avatar;\n if (this.props.avatar === true) {\n if (Tinode.isSelfTopicName(this.props.topic)) {\n avatar = \n } else {\n const isGroup = Tinode.isGroupTopicName(this.props.topic);\n const iconColor = idToColorClass(this.props.topic, isGroup);\n\n if (this.props.topic && this.props.title && this.props.title.trim()) {\n const letter = this.props.title.trim().charAt(0);\n const className = 'lettertile ' + iconColor + (this.props.deleted ? ' disabled' : '');\n avatar = ()\n } else {\n const className = 'material-icons ' + iconColor + (this.props.deleted ? ' disabled' : '');\n avatar = isGroup ? group : person ;\n }\n }\n } else if (this.props.avatar) {\n const url = this.props.authorizeURL(sanitizeUrlForMime(this.props.avatar, 'image'));\n // If avatar image is invalid, show a placeholder.\n const className = 'avatar' + (this.props.deleted ? ' deleted' : '');\n avatar = {e.target.onerror = null; e.target.src=\"img/broken_image.png\"}} />;\n } else {\n avatar = null;\n }\n return avatar;\n }\n}\n","import React from 'react';\n\nexport default class LoadSpinner extends React.PureComponent {\n render() {\n const className = 'load-spinner-box' + (this.props.large ? ' large' : '')\n + (this.props.clear ? ' clear' : '') + (this.props.centered ? ' centered' : '');\n return (this.props.show ?\n : null);\n }\n}\n","// The X menu to be displayed in title bars.\nimport React from 'react';\n\nexport default class MenuCancel extends React.PureComponent {\n render() {\n return (\n {e.preventDefault(); this.props.onCancel();}}>\n close \n \n );\n }\n}\n","import React from 'react';\n\nexport default class MenuContacts extends React.PureComponent {\n render() {\n return (\n \n );\n }\n};\n","import React from 'react';\n\nexport default class MenuStart extends React.PureComponent {\n render() {\n return (\n \n );\n }\n};\n","import QRCode from 'qrcodejs';\nimport React from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { QRCODE_SIZE } from '../config';\n\nconst messages = defineMessages({\n invalid_id: {\n id: 'error_invalid_id',\n defaultMessage: 'Invalid ID',\n description: 'Error message'\n }\n});\n\nclass NewTopicById extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.qrCodeRef = React.createRef();\n\n this.state = {\n groupId: '',\n };\n\n this.handleChange = this.handleChange.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n componentDidMount() {\n new QRCode(this.qrCodeRef.current, {\n text: this.props.myURI,\n width: QRCODE_SIZE,\n height: QRCODE_SIZE,\n });\n }\n\n handleChange(e) {\n this.setState({groupId: e.target.value});\n }\n\n handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleSubmit(e);\n }\n }\n\n handleSubmit(e) {\n e.preventDefault();\n if (this.state.groupId) {\n const name = this.state.groupId.trim();\n const prefix = name.substring(0, 3);\n if (name.length > 3 && ['usr', 'grp', 'chn'].includes(prefix)) {\n this.props.onSubmit(name);\n } else {\n this.props.onError(this.props.intl.formatMessage(messages.invalid_id), 'err');\n }\n }\n }\n\n render() {\n return (\n \n
\n {\n (prompt) => \n } \n
\n
\n \n \n \n
\n
\n
\n
\n );\n }\n};\n\nexport default injectIntl(NewTopicById);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport AvatarCrop from './avatar-crop.jsx';\nimport AvatarUpload from './avatar-upload.jsx';\nimport CheckBox from './checkbox.jsx';\nimport TagManager from './tag-manager.jsx';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE, MAX_TITLE_LENGTH,\n MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\nimport { createChatUploader } from '../lib/im-api.js';\nimport { truncateString } from '../lib/strformat.js';\n\nexport default class NewTopicGroup extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.fullName = React.createRef();\n\n this.state = {\n fullName: '', // full/formatted name\n private: '',\n description: '',\n imageUrl: null,\n tags: [],\n isChannel: false,\n newAvatar: null,\n newAvatarMime: null\n };\n\n this.handleFieldEdit = this.handleFieldEdit.bind(this);\n this.handleImageChanged = this.handleImageChanged.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handleTagsChanged = this.handleTagsChanged.bind(this);\n this.handleChannelToggle = this.handleChannelToggle.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n componentDidMount() {\n // this.fullName.current.focus();\n }\n\n handleFieldEdit(name, e) {\n this.setState({[name]: e.target.value || ''});\n }\n\n handleImageChanged(mime, img) {\n this.setState({newAvatar: img, newAvatarMime: mime});\n }\n\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({imageUrl: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n // Same wrong-header bug messages-view.jsx's chat uploads had -- createChatUploader() is the\n // fixed-headers drop-in (see im-api.js for the full explanation).\n const uploader = createChatUploader(this.props.tinode);\n uploader.upload(blob)\n .then(url => this.setState({imageUrl: url}))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => this.setState({imageUrl: makeImageUrl({data: b64.bits, type: mime})}));\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n handleTagsChanged(tags) {\n this.setState({tags: tags});\n }\n\n handleChannelToggle() {\n this.setState({isChannel: !this.state.isChannel});\n }\n\n handleSubmit(e) {\n e.preventDefault();\n\n const fn = truncateString(this.state.fullName.trim(), MAX_TITLE_LENGTH);\n const comment = truncateString(this.state.private.trim(), MAX_TITLE_LENGTH);\n const description = truncateString(this.state.description.trim(), MAX_TOPIC_DESCRIPTION_LENGTH);\n if (fn) {\n this.props.onSubmit(fn, description, this.state.imageUrl, comment, this.state.tags, this.state.isChannel);\n }\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n let submitClasses = 'primary';\n if (this.props.disabled) {\n submitClasses += ' disabled';\n }\n return (\n \n \n \n \n \n
\n {\n (title) => \n } \n \n \n \n \n
\n \n );\n }\n};\n","// QR scanning (\"扫一扫\", entry points in message-center-view.jsx's quick menu and\n// contact-management-view.jsx's AddFriend page). Both entries used to just toast \"not implemented\n// yet\" -- this is the real camera capture + decode implementation, wired to `resolveQRCode` /\n// `createGroupJoinRequest` (im-api.js), which already existed but had zero call sites.\n//\n// No reference screenshot covers the scanning viewfinder itself -- docs/images/ only has the\n// generate-a-code screens (二维码.png, 群二维码页面.png). The full-screen dark camera view with a\n// bordered square cutout below follows this app's existing full-screen-overlay language (see\n// call-panel.jsx/call-incoming.jsx) rather than a specific design, since there is nothing to match.\nimport React from 'react';\n\nimport jsQR from 'jsqr';\n\nimport { getFileUrl } from '../lib/im-api.js';\n\nfunction Icon({children}) { return {children} ; }\n\n// Decoding a full-resolution camera frame (often 1080p+) with jsQR on every tick is unnecessarily\n// expensive -- a QR code large enough to matter in frame still decodes fine downscaled, and it\n// keeps the scan loop smooth on lower-end phones. 'dontInvert' skips jsQR's extra dark/light\n// inversion pass, which normal on-screen/printed codes (dark modules on a light quiet zone) never\n// need -- also just a perf win for a loop that runs several times a second.\nconst SCAN_INTERVAL_MS = 200;\nconst MAX_SCAN_EDGE = 480;\nconst JSQR_OPTIONS = {inversionAttempts: 'dontInvert'};\n\nexport default class QrScanner extends React.Component {\n constructor(props) {\n super(props);\n this.state = {status: 'starting', errorText: ''};\n this.videoRef = React.createRef();\n this.canvas = document.createElement('canvas');\n this.stream = null;\n this.timer = null;\n this.detected = false;\n\n this.start = this.start.bind(this);\n this.stopStream = this.stopStream.bind(this);\n this.tick = this.tick.bind(this);\n }\n\n componentDidMount() {\n this.start();\n }\n\n componentWillUnmount() {\n this.stopStream();\n }\n\n start() {\n if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {\n this.setState({status: 'error', errorText: '当前浏览器不支持摄像头访问'});\n return;\n }\n this.detected = false;\n this.setState({status: 'starting', errorText: ''});\n // `facingMode` here is a hint, not `{exact: 'environment'}` -- a desktop/laptop with only a\n // front camera still gets a stream instead of failing with OverconstrainedError.\n navigator.mediaDevices.getUserMedia({video: {facingMode: 'environment'}, audio: false}).then(stream => {\n this.stream = stream;\n const video = this.videoRef.current;\n if (!video) {\n // Unmounted while the permission prompt was pending.\n stream.getTracks().forEach(track => track.stop());\n return;\n }\n video.srcObject = stream;\n video.play().catch(() => {});\n this.setState({status: 'scanning'});\n this.timer = window.setInterval(this.tick, SCAN_INTERVAL_MS);\n }).catch(err => {\n const name = err && err.name;\n const text = name === 'NotAllowedError' ? '未获得摄像头权限,请在浏览器设置中允许访问摄像头' :\n name === 'NotFoundError' ? '未检测到可用摄像头' :\n name === 'NotReadableError' ? '摄像头正被其他程序占用' : '摄像头启动失败,请重试';\n this.setState({status: 'error', errorText: text});\n });\n }\n\n stopStream() {\n if (this.timer) {\n window.clearInterval(this.timer);\n this.timer = null;\n }\n if (this.stream) {\n this.stream.getTracks().forEach(track => track.stop());\n this.stream = null;\n }\n }\n\n tick() {\n if (this.detected) {\n return;\n }\n const video = this.videoRef.current;\n if (!video || video.readyState !== video.HAVE_ENOUGH_DATA) {\n return;\n }\n const vw = video.videoWidth;\n const vh = video.videoHeight;\n if (!vw || !vh) {\n return;\n }\n const scale = Math.min(1, MAX_SCAN_EDGE / Math.max(vw, vh));\n const w = Math.round(vw * scale);\n const h = Math.round(vh * scale);\n this.canvas.width = w;\n this.canvas.height = h;\n const ctx = this.canvas.getContext('2d', {willReadFrequently: true});\n ctx.drawImage(video, 0, 0, w, h);\n let frame;\n try {\n frame = ctx.getImageData(0, 0, w, h);\n } catch (err) {\n // A transient decode error (e.g. a tainted canvas mid-permission-change) -- try again on the\n // next tick rather than surfacing an error the user can't act on.\n return;\n }\n const code = jsQR(frame.data, w, h, JSQR_OPTIONS);\n if (code && code.data) {\n this.detected = true;\n this.setState({status: 'resolving'});\n this.stopStream();\n this.props.onDetect(code.data);\n }\n }\n\n render() {\n const {status, errorText} = this.state;\n return \n
\n
\n
\n arrow_back_ios_new \n 扫一扫 \n \n {status === 'starting' ?
正在启动摄像头…
: null}\n {status === 'scanning' ?
将二维码放入框内,即可自动扫描
: null}\n {status === 'resolving' ?
识别中…
: null}\n {status === 'error' ?
\n
error_outline {errorText}
\n
重试 \n
: null}\n
;\n }\n}\n\n// Shown after a \"join_group\" QR resolves to a group the scanner isn't a member of yet\n// (resolveQRCode's `status: \"can_request\"` -- see server/im_http.go's serveIMQRCodesResolve).\n// Joining always goes through the same pending-request/admin-approval pipeline as Ch.6's\n// JoinRequests, regardless of the group's `join_approval` governance toggle (CreateJoinRequest\n// never auto-accepts) -- so this never claims immediate membership, only that a request was sent.\nexport function GroupJoinPreview({group, onSubmit, onCancel}) {\n const [message, setMessage] = React.useState('');\n const [busy, setBusy] = React.useState(false);\n const [avatarUrl, setAvatarUrl] = React.useState(null);\n\n React.useEffect(() => {\n if (!group.avatar_file_id) {\n return undefined;\n }\n let live = true;\n getFileUrl(group.avatar_file_id).then(url => { if (live) setAvatarUrl(url); }).catch(() => {});\n return () => { live = false; };\n }, [group.avatar_file_id]);\n\n const submit = () => {\n setBusy(true);\n Promise.resolve(onSubmit(message.trim())).finally(() => setBusy(false));\n };\n\n return ;\n}\n","import React from 'react';\n\nimport { Tinode } from 'tinode-sdk';\n\nexport default class SearchContacts extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n edited: false,\n search: this.props.initialQuery || ''\n };\n\n this.handleSearchChange = this.handleSearchChange.bind(this);\n this.handleSearch = this.handleSearch.bind(this);\n this.handleClear = this.handleClear.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentWillUnmount() {\n if (this.state.edited) {\n this.setState({search: '', edited: false});\n this.props.onSearchContacts(Tinode.DEL_CHAR);\n }\n }\n\n handleSearchChange(e) {\n this.setState({search: e.target.value});\n }\n\n handleSearch(e) {\n e.preventDefault();\n const query = this.state.search.trim();\n this.setState({edited: (query.length > 0)});\n this.props.onSearchContacts(query.length > 0 ? query : Tinode.DEL_CHAR);\n }\n\n handleClear(e) {\n e.preventDefault();\n if (this.state.edited) {\n this.props.onSearchContacts(Tinode.DEL_CHAR);\n }\n this.setState({search: '', edited: false});\n }\n\n handleKeyDown(e) {\n if (e.key === 'Enter') {\n this.handleSearch(e);\n } else if (e.key === 'Escape') {\n e.stopPropagation();\n this.handleClear(e);\n }\n }\n\n render() {\n return (\n \n );\n }\n};\n","import React from 'react';\n\nimport LetterTile from './letter-tile.jsx';\nimport ButtonBack from './button-back.jsx';\nimport ContactBadges from './contact-badges.jsx';\nimport MenuContacts from './menu-contacts.jsx';\nimport MenuStart from './menu-start.jsx';\n\nimport { sanitizeUrlForMime } from '../lib/utils.js';\n\nexport default class SideNavbar extends React.PureComponent {\n render() {\n const icon_badges = [];\n if (this.props.trustedBadges) {\n this.props.trustedBadges.forEach(b => {\n icon_badges.push({icon: b, color: 'badge-inv'});\n });\n }\n let avatar = null;\n if (this.props.tinode) {\n avatar = this.props.tinode.authorizeURL(sanitizeUrlForMime(this.props.avatar, 'image'));\n }\n return (\n \n {this.props.onCancel ?
: null}\n {avatar ?\n
\n \n
\n :\n null}\n
{this.props.title}
\n {this.props.state === 'login' ?\n
:\n this.props.state === 'contacts' ?\n
:\n null}\n
\n );\n }\n};\n","// TagManager: edit topic or user tags.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport ChipInput from './chip-input.jsx';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { MAX_TAG_COUNT, MAX_TAG_LENGTH, MIN_TAG_LENGTH } from '../config.js';\nimport { arrayEqual } from '../lib/utils.js';\n\nexport default class TagManager extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n tags: this.props.tags || [],\n alias: Tinode.tagByPrefix(this.props.tags, Tinode.TAG_ALIAS) || '',\n tagInput: '',\n activated: this.props.activated\n };\n\n this.handleTagInput = this.handleTagInput.bind(this);\n this.handleAddTag = this.handleAddTag.bind(this);\n this.handleRemoveTag = this.handleRemoveTag.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n const tags = nextProps.tags || [];\n if (!arrayEqual(tags, prevState.tags) && !prevState.activated) {\n return {\n tags: tags || [],\n alias: Tinode.tagByPrefix(tags, Tinode.TAG_ALIAS) || '',\n };\n }\n return null;\n }\n\n handleTagInput(text) {\n this.setState({tagInput: text});\n if (text.length > 0) {\n const last = text[text.length-1];\n if (text[0] == '\"') {\n // This is a quoted string.\n if (text.length > 1 && last == '\"') {\n this.handleAddTag(text.substring(1, text.length-1));\n }\n } else if (last == ',' || last == ' ' || last == ';' || last == '\"') {\n // User entered ',', ' ' or ';'\n this.handleAddTag(text.substring(0, text.length-1).trim());\n }\n }\n }\n\n handleAddTag(tag) {\n const maxTagCount = this.props.tinode.getServerParam(Tinode.MAX_TAG_COUNT, MAX_TAG_COUNT);\n\n if (tag.length > 0 && this.state.tags.length < maxTagCount) {\n const tags = this.state.tags.slice(0);\n tags.push(tag);\n\n this.setState({tags: tags, tagInput: ''});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n return tags;\n }\n return this.state.tags;\n }\n\n handleRemoveTag(tag, index) {\n const tags = this.state.tags.slice(0);\n tags.splice(index, 1);\n this.setState({tags: tags});\n if (this.props.onTagsChanged) {\n this.props.onTagsChanged(tags);\n }\n }\n\n handleSubmit() {\n // Add unprocessed input to tags.\n let tags = this.handleAddTag(this.state.tagInput.trim());\n // Add back the alias (and overwrite one possibly added by hand).\n tags = Tinode.setUniqueTag(tags, this.state.alias);\n // Submit the updated list.\n this.props.onSubmit(tags);\n this.setState({activated: false, tags: this.props.tags || []});\n }\n\n handleCancel() {\n this.setState({activated: false, tagInput: '', tags: this.props.tags || []});\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n }\n\n render() {\n const minTagLength = this.props.tinode.getServerParam(Tinode.MIN_TAG_LENGTH, MIN_TAG_LENGTH);\n const maxTagLength = this.props.tinode.getServerParam(Tinode.MAX_TAG_LENGTH, MAX_TAG_LENGTH);\n\n let tags = [];\n if (this.state.activated) {\n this.state.tags.forEach(tag => {\n if (tag != this.state.alias) {\n tags.push({user: tag, invalid: (tag.length < minTagLength || tag.length > maxTagLength)});\n }\n });\n\n } else {\n this.state.tags.forEach(tag => {\n if (tag != this.state.alias) {\n tags.push({tag} );\n }\n });\n if (tags.length == 0) {\n tags = (\n \n \n \n );\n }\n }\n return (\n \n
\n {this.props.title} \n
\n {this.state.activated ?\n
\n
{\n (add_tags_prompt) => \n } \n {this.props.onSubmit || this.props.onCancel ?\n
\n \n \n \n \n \n \n
\n : null}\n
\n :\n
\n }\n
\n );\n }\n};\n","import React from 'react';\nimport { defineMessages, FormattedMessage, injectIntl } from 'react-intl';\nimport { TheCard } from 'tinode-sdk';\n\nimport LetterTile from './letter-tile.jsx';\n\nconst messages = defineMessages({\n unknown_name: {\n id: 'unknown_name',\n defaultMessage: 'Unknown',\n description: 'Name to show when the name is missing'\n }\n});\n\nclass TheCardMini extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleDownload = this.handleDownload.bind(this);\n this.handleMessage = this.handleMessage.bind(this);\n }\n\n handleDownload(e) {\n e.preventDefault();\n try {\n const vcard = TheCard.exportVCard(this.props.content);\n const blob = new Blob([vcard], { type: 'text/vcard' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.style.display = 'none';\n a.href = url;\n a.download = (this.props.content.fn || 'contact') + '.vcf';\n document.body.appendChild(a);\n a.click();\n window.URL.revokeObjectURL(url);\n document.body.removeChild(a);\n } catch (err) {\n console.error(\"Failed to download vcard\", err);\n if (this.props.onError) {\n this.props.onError(\"Failed to download vcard\", 'err');\n }\n }\n }\n\n handleMessage(e) {\n // This is handled by the parent component via props.onAction which expects a click event.\n }\n\n render() {\n const card = this.props.content;\n if (!card) {\n return null;\n }\n\n const uid = TheCard.getFirstTinodeID(card);\n const contacts = TheCard.getEmails(card).concat(TheCard.getPhones(card));\n const org = TheCard.getOrg(card);\n return (\n \n
\n
\n \n
\n
\n
{card.fn || }
\n {org &&
{org}
}\n
\n
\n
\n {uid ?\n <>\n
\n \n \n
\n >\n : contacts.length > 0 ?\n <>\n
\n \n \n
\n >\n : null\n }\n
\n \n \n
\n
\n );\n }\n};\n\nexport default injectIntl(TheCardMini);\n","// Widget for editing topic description.\n\nimport React from 'react';\nimport { defineMessages, FormattedMessage, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport AvatarCrop from './avatar-crop.jsx';\nimport AvatarUpload from './avatar-upload.jsx';\nimport InPlaceEdit from './in-place-edit.jsx';\nimport TagManager from './tag-manager.jsx';\n\nimport { AVATAR_SIZE, MAX_AVATAR_BYTES, MAX_EXTERN_ATTACHMENT_SIZE, MAX_TITLE_LENGTH,\n MAX_TOPIC_DESCRIPTION_LENGTH } from '../config.js';\nimport { imageScaled, blobToBase64, makeImageUrl } from '../lib/blob-helpers.js';\nimport { createChatUploader } from '../lib/im-api.js';\nimport { truncateString } from '../lib/strformat.js';\nimport { arrayEqual, theCard } from '../lib/utils.js';\n\nconst messages = defineMessages({\n alias_invalid: {\n id: 'alias_invalid',\n defaultMessage: '(invalid)',\n description: 'Error message for invalid alias'\n },\n alias_already_taken: {\n id: 'alias_already_taken',\n defaultMessage: '(already taken)',\n description: 'Error message for alias already taken'\n },\n self_topic_name: {\n id: 'self_topic_name',\n defaultMessage: 'Saved messages',\n description: 'Name of self topic for UI'\n },\n self_topic_comment: {\n id: 'self_topic_comment',\n defaultMessage: 'Notes, messages, links, files saved for posterity',\n description: 'Comment for self topic for UI'\n }\n});\n\nconst ALIAS_AVAILABILITY_CHECK_DELAY = 1000; // milliseconds\n\nclass TopicDescEdit extends React.Component {\n constructor(props) {\n super(props);\n\n const topic = this.props.tinode.getTopic(this.props.topic);\n const acs = topic.getAccessMode();\n const isSelf = Tinode.isSelfTopicName(this.props.topic);\n this.state = {\n isMe: Tinode.isMeTopicName(this.props.topic),\n isSelf: isSelf,\n owner: acs && acs.isOwner(),\n fullName: topic.public ? topic.public.fn :\n isSelf ? this.props.intl.formatMessage(messages.self_topic_name) : null,\n private: topic.private ? topic.private.comment : null,\n description: topic.public ? topic.public.note :\n isSelf ? this.props.intl.formatMessage(messages.self_topic_comment) : null,\n avatar: makeImageUrl(topic.public ? topic.public.photo : null),\n tags: topic.tags() || [],\n newAvatar: null,\n newAvatarMime: null,\n aliasError: ''\n };\n\n this.previousOnTags = null;\n this.aliasCheckTimer = null;\n this.aliasCheckPromise = null;\n\n this.tnNewTags = this.tnNewTags.bind(this);\n this.handleFullNameUpdate = this.handleFullNameUpdate.bind(this);\n this.handleImageUpdated = this.handleImageUpdated.bind(this);\n this.handleAvatarCropped = this.handleAvatarCropped.bind(this);\n this.handleAvatarCropCancel = this.handleAvatarCropCancel.bind(this);\n this.uploadAvatar = this.uploadAvatar.bind(this);\n this.handlePrivateUpdate = this.handlePrivateUpdate.bind(this);\n this.handleAliasUpdate = this.handleAliasUpdate.bind(this);\n this.handleDescriptionUpdate = this.handleDescriptionUpdate.bind(this);\n this.handleTagsUpdated = this.handleTagsUpdated.bind(this);\n this.validateAlias = this.validateAlias.bind(this);\n this.cancelValidator = this.cancelValidator.bind(this);\n }\n\n componentDidMount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n this.previousOnTags = topic.onTagsUpdated;\n topic.onTagsUpdated = this.tnNewTags;\n }\n\n componentWillUnmount() {\n const topic = this.props.tinode.getTopic(this.props.topic);\n topic.onTagsUpdated = this.previousOnTags;\n this.cancelValidator();\n }\n\n tnNewTags(tags) {\n this.setState({tags: tags});\n }\n\n handleFullNameUpdate(fn) {\n fn = truncateString(fn.trim(), MAX_TITLE_LENGTH);\n if (fn && this.state.fullName !== fn) {\n this.setState({fullName: fn});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(fn, null));\n }\n }\n\n handlePrivateUpdate(comment) {\n comment = comment.trim().substring(0, MAX_TITLE_LENGTH);\n if (this.state.private !== comment) {\n this.setState({private: comment});\n this.props.onUpdateTopicDesc(this.props.topic, null, comment || Tinode.DEL_CHAR);\n }\n }\n\n handleDescriptionUpdate(desc) {\n desc = desc.trim().substring(0, MAX_TOPIC_DESCRIPTION_LENGTH);\n if (desc) {\n this.setState({description: desc});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, null, null, desc));\n }\n }\n\n // AvatarUpload widget has changed the avatar: received a new file or deleted the avatar.\n handleImageUpdated(mime, img) {\n // This will show the AvatarCropView is img is not null.\n this.setState({newAvatar: img, newAvatarMime: mime});\n if (!img) {\n // Deleting the avatar.\n this.setState({avatar: null});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, Tinode.DEL_CHAR));\n }\n }\n\n // AvatarCropView calls this method when the user has cropped the image.\n handleAvatarCropped(mime, blob, width, height) {\n const url = blob ? URL.createObjectURL(blob) : null;\n this.setState({avatar: url, newAvatar: null, newAvatarMime: null});\n if (blob) {\n this.uploadAvatar(mime, blob, width, height);\n }\n }\n\n // Utility method for converting cropped avatar blob to bytes for sending inband or\n // for uploading it to the server out of band.\n uploadAvatar(mime, blob, width, height) {\n const readyToUpload = image => {\n let {mime, blob} = image;\n if (blob.size > MAX_AVATAR_BYTES) {\n // Too large to send inband - uploading out of band and sending as a link.\n // Same wrong-header bug messages-view.jsx's chat uploads had -- createChatUploader() is the\n // fixed-headers drop-in (see im-api.js for the full explanation).\n const uploader = createChatUploader(this.props.tinode);\n uploader.upload(blob)\n .then(url => this.props.onUpdateTopicDesc(this.props.topic, theCard(null, url)))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n // Convert blob to base64-encoded bits.\n blobToBase64(blob)\n .then(b64 => {\n const du = makeImageUrl({data: b64.bits, type: mime});\n this.setState({source: du});\n this.props.onUpdateTopicDesc(this.props.topic, theCard(null, du));\n });\n }\n };\n\n if (width > AVATAR_SIZE || height > AVATAR_SIZE || width != height) {\n // Avatar is not square or too large even after cropping. Shrink it and make square.\n imageScaled(blob, AVATAR_SIZE, AVATAR_SIZE, MAX_EXTERN_ATTACHMENT_SIZE, true)\n .then(scaled => readyToUpload(scaled))\n .catch(err => this.props.onError(err.message, 'err'));\n } else {\n readyToUpload({mime: mime, blob: blob, width: width, height: height});\n }\n }\n\n handleAvatarCropCancel() {\n this.setState({newAvatar: null, newAvatarMime: null});\n }\n\n handleAliasUpdate(alias) {\n alias = (alias || '').trim();\n const tags = alias ?\n Tinode.setUniqueTag(this.state.tags, Tinode.TAG_ALIAS + alias.toLowerCase()) :\n Tinode.clearTagPrefix(this.state.tags, Tinode.TAG_ALIAS);\n this.handleTagsUpdated(tags);\n }\n\n validateAlias(alias) {\n // Reset pending delayed check.\n this.cancelValidator();\n\n alias = alias.trim();\n if (!alias) {\n this.setState({aliasError: ''});\n return true;\n }\n\n const valid = Tinode.isValidTagValue(alias);\n if (!valid) {\n this.setState({aliasError: this.props.intl.formatMessage(messages.alias_invalid)});\n return false;\n }\n this.setState({aliasError: ''});\n\n // Setup a delayed check for alias availability.\n const fnd = this.props.tinode.getFndTopic();\n if (!fnd) {\n // Unable to check alias availability.\n this.setState({aliasError: ''});\n return true;\n }\n this.aliasCheckPromise = {};\n const validationPromise = new Promise((resolve, reject) => {\n this.aliasCheckPromise.resolve = resolve;\n this.aliasCheckPromise.reject = reject;\n });\n this.aliasCheckTimer = setTimeout(_ => {\n this.aliasCheckTimer = null;\n fnd.checkTagUniqueness(`${Tinode.TAG_ALIAS}${alias}`, this.props.topic)\n .then(ok => {\n this.aliasCheckPromise.resolve(ok)\n this.setState({aliasError: ok ? '' : this.props.intl.formatMessage(messages.alias_already_taken)});\n })\n .catch(err => {\n this.aliasCheckPromise.reject(err);\n this.setState({aliasError: err.message});\n });\n }, ALIAS_AVAILABILITY_CHECK_DELAY);\n return validationPromise;\n }\n\n cancelValidator() {\n // Reset pending delayed check.\n if (this.aliasCheckTimer) {\n clearTimeout(this.aliasCheckTimer);\n this.aliasCheckTimer = null;\n this.aliasCheckPromise.reject(null);\n }\n }\n\n handleTagsUpdated(tags) {\n // Check if tags have actually changed.\n if (arrayEqual(this.state.tags.slice(0), tags.slice(0))) {\n return;\n }\n this.props.onUpdateTags(tags);\n }\n\n render() {\n if (this.state.newAvatar) {\n return (\n \n );\n }\n\n const editable = this.state.isMe || (this.state.owner && !this.state.isSelf);\n let alias = this.state.tags && this.state.tags.find(t => t.startsWith('alias:'));\n if (alias) {\n // Remove 'alias:' prefix.\n alias = alias.substring(6);\n }\n\n return (\n <>\n \n
\n \n \n {this.state.isMe ?\n
\n
\n \n \n
\n {\n (full_name_placeholder) => \n } \n
\n
\n :\n <>\n
\n
\n \n
\n
\n {\n (group_name_placeholder) => \n } \n
\n
\n
\n
\n \n \n \n
\n
\n {\n (private_placeholder) => \n } \n
\n
\n >\n }\n {editable || alias ?\n
\n
\n {this.state.aliasError}\n
\n
\n {\n (private_placeholder) => \n } \n
\n
\n : null\n }\n {editable || this.state.description ?\n
\n
\n \n
\n
\n {\n (private_placeholder) => \n } \n
\n
\n : null\n }\n
\n {editable && !this.state.isMe ?\n <>\n
\n {\n (title_tag_manager) => \n } \n >\n : null\n }\n >\n );\n }\n};\n\nexport default injectIntl(TopicDescEdit);\n","// The counter of unread messages in the topic.\nimport React from 'react';\n\nexport default class UnreadBadge extends React.PureComponent {\n render() {\n return (this.props.count > 0 ?\n {this.props.count > 9 ? \"9+\" : this.props.count} \n : null);\n }\n};\n","// Image view with progress bar and a cancel button.\nimport React from 'react';\n\nimport FileProgress from './file-progress.jsx';\n\nexport default class UploadingImage extends React.PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n return (\n \n {React.createElement('img', this.props)}\n
\n \n
\n
\n );\n }\n};\n","// Password with a visiblity toggle.\nimport React from 'react';\n\nexport default class VisiblePassword extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.inputRef = React.createRef();\n\n this.state = {\n value: this.props.value || '',\n visible: false\n };\n\n this.handleVisibility = this.handleVisibility.bind(this);\n this.handeTextChange = this.handeTextChange.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleEditingFinished = this.handleEditingFinished.bind(this);\n }\n\n componentDidMount() {\n if (this.props.autoFocus) {\n this.inputRef.current.focus();\n }\n }\n\n handeTextChange(e) {\n this.setState({value: e.target.value});\n if (this.props.onChange) {\n this.props.onChange(e);\n }\n }\n\n handleVisibility(e) {\n e.preventDefault();\n this.setState({visible: !this.state.visible});\n }\n\n handleKeyDown(e) {\n if (e.keyCode == 27) {\n // Escape pressed\n this.setState({value: this.props.value || '', visible: false});\n if (this.props.onFinished) {\n this.props.onFinished();\n }\n } else if (e.keyCode == 13) {\n // Enter pressed\n this.handleEditingFinished();\n }\n }\n\n handleEditingFinished(e) {\n if (e) {\n let currentTarget = e.currentTarget;\n setTimeout(_ => {\n if (!currentTarget.contains(document.activeElement)) {\n if (this.props.onFinished) {\n this.props.onFinished(this.state.value);\n }\n }\n }, 0);\n } else if (this.props.onFinished) {\n this.props.onFinished(this.state.value.trim());\n }\n }\n\n render() {\n return (\n \n \n \n \n {this.state.visible ? 'visibility' : 'visibility_off'}\n \n \n
\n );\n }\n}\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"jsQR\"] = factory();\n\telse\n\t\troot[\"jsQR\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 3);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix = /** @class */ (function () {\n function BitMatrix(data, width) {\n this.width = width;\n this.height = data.length / width;\n this.data = data;\n }\n BitMatrix.createEmpty = function (width, height) {\n return new BitMatrix(new Uint8ClampedArray(width * height), width);\n };\n BitMatrix.prototype.get = function (x, y) {\n if (x < 0 || x >= this.width || y < 0 || y >= this.height) {\n return false;\n }\n return !!this.data[y * this.width + x];\n };\n BitMatrix.prototype.set = function (x, y, v) {\n this.data[y * this.width + x] = v ? 1 : 0;\n };\n BitMatrix.prototype.setRegion = function (left, top, width, height, v) {\n for (var y = top; y < top + height; y++) {\n for (var x = left; x < left + width; x++) {\n this.set(x, y, !!v);\n }\n }\n };\n return BitMatrix;\n}());\nexports.BitMatrix = BitMatrix;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar GenericGFPoly_1 = __webpack_require__(2);\nfunction addOrSubtractGF(a, b) {\n return a ^ b; // tslint:disable-line:no-bitwise\n}\nexports.addOrSubtractGF = addOrSubtractGF;\nvar GenericGF = /** @class */ (function () {\n function GenericGF(primitive, size, genBase) {\n this.primitive = primitive;\n this.size = size;\n this.generatorBase = genBase;\n this.expTable = new Array(this.size);\n this.logTable = new Array(this.size);\n var x = 1;\n for (var i = 0; i < this.size; i++) {\n this.expTable[i] = x;\n x = x * 2;\n if (x >= this.size) {\n x = (x ^ this.primitive) & (this.size - 1); // tslint:disable-line:no-bitwise\n }\n }\n for (var i = 0; i < this.size - 1; i++) {\n this.logTable[this.expTable[i]] = i;\n }\n this.zero = new GenericGFPoly_1.default(this, Uint8ClampedArray.from([0]));\n this.one = new GenericGFPoly_1.default(this, Uint8ClampedArray.from([1]));\n }\n GenericGF.prototype.multiply = function (a, b) {\n if (a === 0 || b === 0) {\n return 0;\n }\n return this.expTable[(this.logTable[a] + this.logTable[b]) % (this.size - 1)];\n };\n GenericGF.prototype.inverse = function (a) {\n if (a === 0) {\n throw new Error(\"Can't invert 0\");\n }\n return this.expTable[this.size - this.logTable[a] - 1];\n };\n GenericGF.prototype.buildMonomial = function (degree, coefficient) {\n if (degree < 0) {\n throw new Error(\"Invalid monomial degree less than 0\");\n }\n if (coefficient === 0) {\n return this.zero;\n }\n var coefficients = new Uint8ClampedArray(degree + 1);\n coefficients[0] = coefficient;\n return new GenericGFPoly_1.default(this, coefficients);\n };\n GenericGF.prototype.log = function (a) {\n if (a === 0) {\n throw new Error(\"Can't take log(0)\");\n }\n return this.logTable[a];\n };\n GenericGF.prototype.exp = function (a) {\n return this.expTable[a];\n };\n return GenericGF;\n}());\nexports.default = GenericGF;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar GenericGF_1 = __webpack_require__(1);\nvar GenericGFPoly = /** @class */ (function () {\n function GenericGFPoly(field, coefficients) {\n if (coefficients.length === 0) {\n throw new Error(\"No coefficients.\");\n }\n this.field = field;\n var coefficientsLength = coefficients.length;\n if (coefficientsLength > 1 && coefficients[0] === 0) {\n // Leading term must be non-zero for anything except the constant polynomial \"0\"\n var firstNonZero = 1;\n while (firstNonZero < coefficientsLength && coefficients[firstNonZero] === 0) {\n firstNonZero++;\n }\n if (firstNonZero === coefficientsLength) {\n this.coefficients = field.zero.coefficients;\n }\n else {\n this.coefficients = new Uint8ClampedArray(coefficientsLength - firstNonZero);\n for (var i = 0; i < this.coefficients.length; i++) {\n this.coefficients[i] = coefficients[firstNonZero + i];\n }\n }\n }\n else {\n this.coefficients = coefficients;\n }\n }\n GenericGFPoly.prototype.degree = function () {\n return this.coefficients.length - 1;\n };\n GenericGFPoly.prototype.isZero = function () {\n return this.coefficients[0] === 0;\n };\n GenericGFPoly.prototype.getCoefficient = function (degree) {\n return this.coefficients[this.coefficients.length - 1 - degree];\n };\n GenericGFPoly.prototype.addOrSubtract = function (other) {\n var _a;\n if (this.isZero()) {\n return other;\n }\n if (other.isZero()) {\n return this;\n }\n var smallerCoefficients = this.coefficients;\n var largerCoefficients = other.coefficients;\n if (smallerCoefficients.length > largerCoefficients.length) {\n _a = [largerCoefficients, smallerCoefficients], smallerCoefficients = _a[0], largerCoefficients = _a[1];\n }\n var sumDiff = new Uint8ClampedArray(largerCoefficients.length);\n var lengthDiff = largerCoefficients.length - smallerCoefficients.length;\n for (var i = 0; i < lengthDiff; i++) {\n sumDiff[i] = largerCoefficients[i];\n }\n for (var i = lengthDiff; i < largerCoefficients.length; i++) {\n sumDiff[i] = GenericGF_1.addOrSubtractGF(smallerCoefficients[i - lengthDiff], largerCoefficients[i]);\n }\n return new GenericGFPoly(this.field, sumDiff);\n };\n GenericGFPoly.prototype.multiply = function (scalar) {\n if (scalar === 0) {\n return this.field.zero;\n }\n if (scalar === 1) {\n return this;\n }\n var size = this.coefficients.length;\n var product = new Uint8ClampedArray(size);\n for (var i = 0; i < size; i++) {\n product[i] = this.field.multiply(this.coefficients[i], scalar);\n }\n return new GenericGFPoly(this.field, product);\n };\n GenericGFPoly.prototype.multiplyPoly = function (other) {\n if (this.isZero() || other.isZero()) {\n return this.field.zero;\n }\n var aCoefficients = this.coefficients;\n var aLength = aCoefficients.length;\n var bCoefficients = other.coefficients;\n var bLength = bCoefficients.length;\n var product = new Uint8ClampedArray(aLength + bLength - 1);\n for (var i = 0; i < aLength; i++) {\n var aCoeff = aCoefficients[i];\n for (var j = 0; j < bLength; j++) {\n product[i + j] = GenericGF_1.addOrSubtractGF(product[i + j], this.field.multiply(aCoeff, bCoefficients[j]));\n }\n }\n return new GenericGFPoly(this.field, product);\n };\n GenericGFPoly.prototype.multiplyByMonomial = function (degree, coefficient) {\n if (degree < 0) {\n throw new Error(\"Invalid degree less than 0\");\n }\n if (coefficient === 0) {\n return this.field.zero;\n }\n var size = this.coefficients.length;\n var product = new Uint8ClampedArray(size + degree);\n for (var i = 0; i < size; i++) {\n product[i] = this.field.multiply(this.coefficients[i], coefficient);\n }\n return new GenericGFPoly(this.field, product);\n };\n GenericGFPoly.prototype.evaluateAt = function (a) {\n var result = 0;\n if (a === 0) {\n // Just return the x^0 coefficient\n return this.getCoefficient(0);\n }\n var size = this.coefficients.length;\n if (a === 1) {\n // Just the sum of the coefficients\n this.coefficients.forEach(function (coefficient) {\n result = GenericGF_1.addOrSubtractGF(result, coefficient);\n });\n return result;\n }\n result = this.coefficients[0];\n for (var i = 1; i < size; i++) {\n result = GenericGF_1.addOrSubtractGF(this.field.multiply(a, result), this.coefficients[i]);\n }\n return result;\n };\n return GenericGFPoly;\n}());\nexports.default = GenericGFPoly;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar binarizer_1 = __webpack_require__(4);\nvar decoder_1 = __webpack_require__(5);\nvar extractor_1 = __webpack_require__(11);\nvar locator_1 = __webpack_require__(12);\nfunction scan(matrix) {\n var locations = locator_1.locate(matrix);\n if (!locations) {\n return null;\n }\n for (var _i = 0, locations_1 = locations; _i < locations_1.length; _i++) {\n var location_1 = locations_1[_i];\n var extracted = extractor_1.extract(matrix, location_1);\n var decoded = decoder_1.decode(extracted.matrix);\n if (decoded) {\n return {\n binaryData: decoded.bytes,\n data: decoded.text,\n chunks: decoded.chunks,\n version: decoded.version,\n location: {\n topRightCorner: extracted.mappingFunction(location_1.dimension, 0),\n topLeftCorner: extracted.mappingFunction(0, 0),\n bottomRightCorner: extracted.mappingFunction(location_1.dimension, location_1.dimension),\n bottomLeftCorner: extracted.mappingFunction(0, location_1.dimension),\n topRightFinderPattern: location_1.topRight,\n topLeftFinderPattern: location_1.topLeft,\n bottomLeftFinderPattern: location_1.bottomLeft,\n bottomRightAlignmentPattern: location_1.alignmentPattern,\n },\n };\n }\n }\n return null;\n}\nvar defaultOptions = {\n inversionAttempts: \"attemptBoth\",\n};\nfunction jsQR(data, width, height, providedOptions) {\n if (providedOptions === void 0) { providedOptions = {}; }\n var options = defaultOptions;\n Object.keys(options || {}).forEach(function (opt) {\n options[opt] = providedOptions[opt] || options[opt];\n });\n var shouldInvert = options.inversionAttempts === \"attemptBoth\" || options.inversionAttempts === \"invertFirst\";\n var tryInvertedFirst = options.inversionAttempts === \"onlyInvert\" || options.inversionAttempts === \"invertFirst\";\n var _a = binarizer_1.binarize(data, width, height, shouldInvert), binarized = _a.binarized, inverted = _a.inverted;\n var result = scan(tryInvertedFirst ? inverted : binarized);\n if (!result && (options.inversionAttempts === \"attemptBoth\" || options.inversionAttempts === \"invertFirst\")) {\n result = scan(tryInvertedFirst ? binarized : inverted);\n }\n return result;\n}\njsQR.default = jsQR;\nexports.default = jsQR;\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix_1 = __webpack_require__(0);\nvar REGION_SIZE = 8;\nvar MIN_DYNAMIC_RANGE = 24;\nfunction numBetween(value, min, max) {\n return value < min ? min : value > max ? max : value;\n}\n// Like BitMatrix but accepts arbitry Uint8 values\nvar Matrix = /** @class */ (function () {\n function Matrix(width, height) {\n this.width = width;\n this.data = new Uint8ClampedArray(width * height);\n }\n Matrix.prototype.get = function (x, y) {\n return this.data[y * this.width + x];\n };\n Matrix.prototype.set = function (x, y, value) {\n this.data[y * this.width + x] = value;\n };\n return Matrix;\n}());\nfunction binarize(data, width, height, returnInverted) {\n if (data.length !== width * height * 4) {\n throw new Error(\"Malformed data passed to binarizer.\");\n }\n // Convert image to greyscale\n var greyscalePixels = new Matrix(width, height);\n for (var x = 0; x < width; x++) {\n for (var y = 0; y < height; y++) {\n var r = data[((y * width + x) * 4) + 0];\n var g = data[((y * width + x) * 4) + 1];\n var b = data[((y * width + x) * 4) + 2];\n greyscalePixels.set(x, y, 0.2126 * r + 0.7152 * g + 0.0722 * b);\n }\n }\n var horizontalRegionCount = Math.ceil(width / REGION_SIZE);\n var verticalRegionCount = Math.ceil(height / REGION_SIZE);\n var blackPoints = new Matrix(horizontalRegionCount, verticalRegionCount);\n for (var verticalRegion = 0; verticalRegion < verticalRegionCount; verticalRegion++) {\n for (var hortizontalRegion = 0; hortizontalRegion < horizontalRegionCount; hortizontalRegion++) {\n var sum = 0;\n var min = Infinity;\n var max = 0;\n for (var y = 0; y < REGION_SIZE; y++) {\n for (var x = 0; x < REGION_SIZE; x++) {\n var pixelLumosity = greyscalePixels.get(hortizontalRegion * REGION_SIZE + x, verticalRegion * REGION_SIZE + y);\n sum += pixelLumosity;\n min = Math.min(min, pixelLumosity);\n max = Math.max(max, pixelLumosity);\n }\n }\n var average = sum / (Math.pow(REGION_SIZE, 2));\n if (max - min <= MIN_DYNAMIC_RANGE) {\n // If variation within the block is low, assume this is a block with only light or only\n // dark pixels. In that case we do not want to use the average, as it would divide this\n // low contrast area into black and white pixels, essentially creating data out of noise.\n //\n // Default the blackpoint for these blocks to be half the min - effectively white them out\n average = min / 2;\n if (verticalRegion > 0 && hortizontalRegion > 0) {\n // Correct the \"white background\" assumption for blocks that have neighbors by comparing\n // the pixels in this block to the previously calculated black points. This is based on\n // the fact that dark barcode symbology is always surrounded by some amount of light\n // background for which reasonable black point estimates were made. The bp estimated at\n // the boundaries is used for the interior.\n // The (min < bp) is arbitrary but works better than other heuristics that were tried.\n var averageNeighborBlackPoint = (blackPoints.get(hortizontalRegion, verticalRegion - 1) +\n (2 * blackPoints.get(hortizontalRegion - 1, verticalRegion)) +\n blackPoints.get(hortizontalRegion - 1, verticalRegion - 1)) / 4;\n if (min < averageNeighborBlackPoint) {\n average = averageNeighborBlackPoint;\n }\n }\n }\n blackPoints.set(hortizontalRegion, verticalRegion, average);\n }\n }\n var binarized = BitMatrix_1.BitMatrix.createEmpty(width, height);\n var inverted = null;\n if (returnInverted) {\n inverted = BitMatrix_1.BitMatrix.createEmpty(width, height);\n }\n for (var verticalRegion = 0; verticalRegion < verticalRegionCount; verticalRegion++) {\n for (var hortizontalRegion = 0; hortizontalRegion < horizontalRegionCount; hortizontalRegion++) {\n var left = numBetween(hortizontalRegion, 2, horizontalRegionCount - 3);\n var top_1 = numBetween(verticalRegion, 2, verticalRegionCount - 3);\n var sum = 0;\n for (var xRegion = -2; xRegion <= 2; xRegion++) {\n for (var yRegion = -2; yRegion <= 2; yRegion++) {\n sum += blackPoints.get(left + xRegion, top_1 + yRegion);\n }\n }\n var threshold = sum / 25;\n for (var xRegion = 0; xRegion < REGION_SIZE; xRegion++) {\n for (var yRegion = 0; yRegion < REGION_SIZE; yRegion++) {\n var x = hortizontalRegion * REGION_SIZE + xRegion;\n var y = verticalRegion * REGION_SIZE + yRegion;\n var lum = greyscalePixels.get(x, y);\n binarized.set(x, y, lum <= threshold);\n if (returnInverted) {\n inverted.set(x, y, !(lum <= threshold));\n }\n }\n }\n }\n }\n if (returnInverted) {\n return { binarized: binarized, inverted: inverted };\n }\n return { binarized: binarized };\n}\nexports.binarize = binarize;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix_1 = __webpack_require__(0);\nvar decodeData_1 = __webpack_require__(6);\nvar reedsolomon_1 = __webpack_require__(9);\nvar version_1 = __webpack_require__(10);\n// tslint:disable:no-bitwise\nfunction numBitsDiffering(x, y) {\n var z = x ^ y;\n var bitCount = 0;\n while (z) {\n bitCount++;\n z &= z - 1;\n }\n return bitCount;\n}\nfunction pushBit(bit, byte) {\n return (byte << 1) | bit;\n}\n// tslint:enable:no-bitwise\nvar FORMAT_INFO_TABLE = [\n { bits: 0x5412, formatInfo: { errorCorrectionLevel: 1, dataMask: 0 } },\n { bits: 0x5125, formatInfo: { errorCorrectionLevel: 1, dataMask: 1 } },\n { bits: 0x5E7C, formatInfo: { errorCorrectionLevel: 1, dataMask: 2 } },\n { bits: 0x5B4B, formatInfo: { errorCorrectionLevel: 1, dataMask: 3 } },\n { bits: 0x45F9, formatInfo: { errorCorrectionLevel: 1, dataMask: 4 } },\n { bits: 0x40CE, formatInfo: { errorCorrectionLevel: 1, dataMask: 5 } },\n { bits: 0x4F97, formatInfo: { errorCorrectionLevel: 1, dataMask: 6 } },\n { bits: 0x4AA0, formatInfo: { errorCorrectionLevel: 1, dataMask: 7 } },\n { bits: 0x77C4, formatInfo: { errorCorrectionLevel: 0, dataMask: 0 } },\n { bits: 0x72F3, formatInfo: { errorCorrectionLevel: 0, dataMask: 1 } },\n { bits: 0x7DAA, formatInfo: { errorCorrectionLevel: 0, dataMask: 2 } },\n { bits: 0x789D, formatInfo: { errorCorrectionLevel: 0, dataMask: 3 } },\n { bits: 0x662F, formatInfo: { errorCorrectionLevel: 0, dataMask: 4 } },\n { bits: 0x6318, formatInfo: { errorCorrectionLevel: 0, dataMask: 5 } },\n { bits: 0x6C41, formatInfo: { errorCorrectionLevel: 0, dataMask: 6 } },\n { bits: 0x6976, formatInfo: { errorCorrectionLevel: 0, dataMask: 7 } },\n { bits: 0x1689, formatInfo: { errorCorrectionLevel: 3, dataMask: 0 } },\n { bits: 0x13BE, formatInfo: { errorCorrectionLevel: 3, dataMask: 1 } },\n { bits: 0x1CE7, formatInfo: { errorCorrectionLevel: 3, dataMask: 2 } },\n { bits: 0x19D0, formatInfo: { errorCorrectionLevel: 3, dataMask: 3 } },\n { bits: 0x0762, formatInfo: { errorCorrectionLevel: 3, dataMask: 4 } },\n { bits: 0x0255, formatInfo: { errorCorrectionLevel: 3, dataMask: 5 } },\n { bits: 0x0D0C, formatInfo: { errorCorrectionLevel: 3, dataMask: 6 } },\n { bits: 0x083B, formatInfo: { errorCorrectionLevel: 3, dataMask: 7 } },\n { bits: 0x355F, formatInfo: { errorCorrectionLevel: 2, dataMask: 0 } },\n { bits: 0x3068, formatInfo: { errorCorrectionLevel: 2, dataMask: 1 } },\n { bits: 0x3F31, formatInfo: { errorCorrectionLevel: 2, dataMask: 2 } },\n { bits: 0x3A06, formatInfo: { errorCorrectionLevel: 2, dataMask: 3 } },\n { bits: 0x24B4, formatInfo: { errorCorrectionLevel: 2, dataMask: 4 } },\n { bits: 0x2183, formatInfo: { errorCorrectionLevel: 2, dataMask: 5 } },\n { bits: 0x2EDA, formatInfo: { errorCorrectionLevel: 2, dataMask: 6 } },\n { bits: 0x2BED, formatInfo: { errorCorrectionLevel: 2, dataMask: 7 } },\n];\nvar DATA_MASKS = [\n function (p) { return ((p.y + p.x) % 2) === 0; },\n function (p) { return (p.y % 2) === 0; },\n function (p) { return p.x % 3 === 0; },\n function (p) { return (p.y + p.x) % 3 === 0; },\n function (p) { return (Math.floor(p.y / 2) + Math.floor(p.x / 3)) % 2 === 0; },\n function (p) { return ((p.x * p.y) % 2) + ((p.x * p.y) % 3) === 0; },\n function (p) { return ((((p.y * p.x) % 2) + (p.y * p.x) % 3) % 2) === 0; },\n function (p) { return ((((p.y + p.x) % 2) + (p.y * p.x) % 3) % 2) === 0; },\n];\nfunction buildFunctionPatternMask(version) {\n var dimension = 17 + 4 * version.versionNumber;\n var matrix = BitMatrix_1.BitMatrix.createEmpty(dimension, dimension);\n matrix.setRegion(0, 0, 9, 9, true); // Top left finder pattern + separator + format\n matrix.setRegion(dimension - 8, 0, 8, 9, true); // Top right finder pattern + separator + format\n matrix.setRegion(0, dimension - 8, 9, 8, true); // Bottom left finder pattern + separator + format\n // Alignment patterns\n for (var _i = 0, _a = version.alignmentPatternCenters; _i < _a.length; _i++) {\n var x = _a[_i];\n for (var _b = 0, _c = version.alignmentPatternCenters; _b < _c.length; _b++) {\n var y = _c[_b];\n if (!(x === 6 && y === 6 || x === 6 && y === dimension - 7 || x === dimension - 7 && y === 6)) {\n matrix.setRegion(x - 2, y - 2, 5, 5, true);\n }\n }\n }\n matrix.setRegion(6, 9, 1, dimension - 17, true); // Vertical timing pattern\n matrix.setRegion(9, 6, dimension - 17, 1, true); // Horizontal timing pattern\n if (version.versionNumber > 6) {\n matrix.setRegion(dimension - 11, 0, 3, 6, true); // Version info, top right\n matrix.setRegion(0, dimension - 11, 6, 3, true); // Version info, bottom left\n }\n return matrix;\n}\nfunction readCodewords(matrix, version, formatInfo) {\n var dataMask = DATA_MASKS[formatInfo.dataMask];\n var dimension = matrix.height;\n var functionPatternMask = buildFunctionPatternMask(version);\n var codewords = [];\n var currentByte = 0;\n var bitsRead = 0;\n // Read columns in pairs, from right to left\n var readingUp = true;\n for (var columnIndex = dimension - 1; columnIndex > 0; columnIndex -= 2) {\n if (columnIndex === 6) { // Skip whole column with vertical alignment pattern;\n columnIndex--;\n }\n for (var i = 0; i < dimension; i++) {\n var y = readingUp ? dimension - 1 - i : i;\n for (var columnOffset = 0; columnOffset < 2; columnOffset++) {\n var x = columnIndex - columnOffset;\n if (!functionPatternMask.get(x, y)) {\n bitsRead++;\n var bit = matrix.get(x, y);\n if (dataMask({ y: y, x: x })) {\n bit = !bit;\n }\n currentByte = pushBit(bit, currentByte);\n if (bitsRead === 8) { // Whole bytes\n codewords.push(currentByte);\n bitsRead = 0;\n currentByte = 0;\n }\n }\n }\n }\n readingUp = !readingUp;\n }\n return codewords;\n}\nfunction readVersion(matrix) {\n var dimension = matrix.height;\n var provisionalVersion = Math.floor((dimension - 17) / 4);\n if (provisionalVersion <= 6) { // 6 and under dont have version info in the QR code\n return version_1.VERSIONS[provisionalVersion - 1];\n }\n var topRightVersionBits = 0;\n for (var y = 5; y >= 0; y--) {\n for (var x = dimension - 9; x >= dimension - 11; x--) {\n topRightVersionBits = pushBit(matrix.get(x, y), topRightVersionBits);\n }\n }\n var bottomLeftVersionBits = 0;\n for (var x = 5; x >= 0; x--) {\n for (var y = dimension - 9; y >= dimension - 11; y--) {\n bottomLeftVersionBits = pushBit(matrix.get(x, y), bottomLeftVersionBits);\n }\n }\n var bestDifference = Infinity;\n var bestVersion;\n for (var _i = 0, VERSIONS_1 = version_1.VERSIONS; _i < VERSIONS_1.length; _i++) {\n var version = VERSIONS_1[_i];\n if (version.infoBits === topRightVersionBits || version.infoBits === bottomLeftVersionBits) {\n return version;\n }\n var difference = numBitsDiffering(topRightVersionBits, version.infoBits);\n if (difference < bestDifference) {\n bestVersion = version;\n bestDifference = difference;\n }\n difference = numBitsDiffering(bottomLeftVersionBits, version.infoBits);\n if (difference < bestDifference) {\n bestVersion = version;\n bestDifference = difference;\n }\n }\n // We can tolerate up to 3 bits of error since no two version info codewords will\n // differ in less than 8 bits.\n if (bestDifference <= 3) {\n return bestVersion;\n }\n}\nfunction readFormatInformation(matrix) {\n var topLeftFormatInfoBits = 0;\n for (var x = 0; x <= 8; x++) {\n if (x !== 6) { // Skip timing pattern bit\n topLeftFormatInfoBits = pushBit(matrix.get(x, 8), topLeftFormatInfoBits);\n }\n }\n for (var y = 7; y >= 0; y--) {\n if (y !== 6) { // Skip timing pattern bit\n topLeftFormatInfoBits = pushBit(matrix.get(8, y), topLeftFormatInfoBits);\n }\n }\n var dimension = matrix.height;\n var topRightBottomRightFormatInfoBits = 0;\n for (var y = dimension - 1; y >= dimension - 7; y--) { // bottom left\n topRightBottomRightFormatInfoBits = pushBit(matrix.get(8, y), topRightBottomRightFormatInfoBits);\n }\n for (var x = dimension - 8; x < dimension; x++) { // top right\n topRightBottomRightFormatInfoBits = pushBit(matrix.get(x, 8), topRightBottomRightFormatInfoBits);\n }\n var bestDifference = Infinity;\n var bestFormatInfo = null;\n for (var _i = 0, FORMAT_INFO_TABLE_1 = FORMAT_INFO_TABLE; _i < FORMAT_INFO_TABLE_1.length; _i++) {\n var _a = FORMAT_INFO_TABLE_1[_i], bits = _a.bits, formatInfo = _a.formatInfo;\n if (bits === topLeftFormatInfoBits || bits === topRightBottomRightFormatInfoBits) {\n return formatInfo;\n }\n var difference = numBitsDiffering(topLeftFormatInfoBits, bits);\n if (difference < bestDifference) {\n bestFormatInfo = formatInfo;\n bestDifference = difference;\n }\n if (topLeftFormatInfoBits !== topRightBottomRightFormatInfoBits) { // also try the other option\n difference = numBitsDiffering(topRightBottomRightFormatInfoBits, bits);\n if (difference < bestDifference) {\n bestFormatInfo = formatInfo;\n bestDifference = difference;\n }\n }\n }\n // Hamming distance of the 32 masked codes is 7, by construction, so <= 3 bits differing means we found a match\n if (bestDifference <= 3) {\n return bestFormatInfo;\n }\n return null;\n}\nfunction getDataBlocks(codewords, version, ecLevel) {\n var ecInfo = version.errorCorrectionLevels[ecLevel];\n var dataBlocks = [];\n var totalCodewords = 0;\n ecInfo.ecBlocks.forEach(function (block) {\n for (var i = 0; i < block.numBlocks; i++) {\n dataBlocks.push({ numDataCodewords: block.dataCodewordsPerBlock, codewords: [] });\n totalCodewords += block.dataCodewordsPerBlock + ecInfo.ecCodewordsPerBlock;\n }\n });\n // In some cases the QR code will be malformed enough that we pull off more or less than we should.\n // If we pull off less there's nothing we can do.\n // If we pull off more we can safely truncate\n if (codewords.length < totalCodewords) {\n return null;\n }\n codewords = codewords.slice(0, totalCodewords);\n var shortBlockSize = ecInfo.ecBlocks[0].dataCodewordsPerBlock;\n // Pull codewords to fill the blocks up to the minimum size\n for (var i = 0; i < shortBlockSize; i++) {\n for (var _i = 0, dataBlocks_1 = dataBlocks; _i < dataBlocks_1.length; _i++) {\n var dataBlock = dataBlocks_1[_i];\n dataBlock.codewords.push(codewords.shift());\n }\n }\n // If there are any large blocks, pull codewords to fill the last element of those\n if (ecInfo.ecBlocks.length > 1) {\n var smallBlockCount = ecInfo.ecBlocks[0].numBlocks;\n var largeBlockCount = ecInfo.ecBlocks[1].numBlocks;\n for (var i = 0; i < largeBlockCount; i++) {\n dataBlocks[smallBlockCount + i].codewords.push(codewords.shift());\n }\n }\n // Add the rest of the codewords to the blocks. These are the error correction codewords.\n while (codewords.length > 0) {\n for (var _a = 0, dataBlocks_2 = dataBlocks; _a < dataBlocks_2.length; _a++) {\n var dataBlock = dataBlocks_2[_a];\n dataBlock.codewords.push(codewords.shift());\n }\n }\n return dataBlocks;\n}\nfunction decodeMatrix(matrix) {\n var version = readVersion(matrix);\n if (!version) {\n return null;\n }\n var formatInfo = readFormatInformation(matrix);\n if (!formatInfo) {\n return null;\n }\n var codewords = readCodewords(matrix, version, formatInfo);\n var dataBlocks = getDataBlocks(codewords, version, formatInfo.errorCorrectionLevel);\n if (!dataBlocks) {\n return null;\n }\n // Count total number of data bytes\n var totalBytes = dataBlocks.reduce(function (a, b) { return a + b.numDataCodewords; }, 0);\n var resultBytes = new Uint8ClampedArray(totalBytes);\n var resultIndex = 0;\n for (var _i = 0, dataBlocks_3 = dataBlocks; _i < dataBlocks_3.length; _i++) {\n var dataBlock = dataBlocks_3[_i];\n var correctedBytes = reedsolomon_1.decode(dataBlock.codewords, dataBlock.codewords.length - dataBlock.numDataCodewords);\n if (!correctedBytes) {\n return null;\n }\n for (var i = 0; i < dataBlock.numDataCodewords; i++) {\n resultBytes[resultIndex++] = correctedBytes[i];\n }\n }\n try {\n return decodeData_1.decode(resultBytes, version.versionNumber);\n }\n catch (_a) {\n return null;\n }\n}\nfunction decode(matrix) {\n if (matrix == null) {\n return null;\n }\n var result = decodeMatrix(matrix);\n if (result) {\n return result;\n }\n // Decoding didn't work, try mirroring the QR across the topLeft -> bottomRight line.\n for (var x = 0; x < matrix.width; x++) {\n for (var y = x + 1; y < matrix.height; y++) {\n if (matrix.get(x, y) !== matrix.get(y, x)) {\n matrix.set(x, y, !matrix.get(x, y));\n matrix.set(y, x, !matrix.get(y, x));\n }\n }\n }\n return decodeMatrix(matrix);\n}\nexports.decode = decode;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// tslint:disable:no-bitwise\nvar BitStream_1 = __webpack_require__(7);\nvar shiftJISTable_1 = __webpack_require__(8);\nvar Mode;\n(function (Mode) {\n Mode[\"Numeric\"] = \"numeric\";\n Mode[\"Alphanumeric\"] = \"alphanumeric\";\n Mode[\"Byte\"] = \"byte\";\n Mode[\"Kanji\"] = \"kanji\";\n Mode[\"ECI\"] = \"eci\";\n})(Mode = exports.Mode || (exports.Mode = {}));\nvar ModeByte;\n(function (ModeByte) {\n ModeByte[ModeByte[\"Terminator\"] = 0] = \"Terminator\";\n ModeByte[ModeByte[\"Numeric\"] = 1] = \"Numeric\";\n ModeByte[ModeByte[\"Alphanumeric\"] = 2] = \"Alphanumeric\";\n ModeByte[ModeByte[\"Byte\"] = 4] = \"Byte\";\n ModeByte[ModeByte[\"Kanji\"] = 8] = \"Kanji\";\n ModeByte[ModeByte[\"ECI\"] = 7] = \"ECI\";\n // StructuredAppend = 0x3,\n // FNC1FirstPosition = 0x5,\n // FNC1SecondPosition = 0x9,\n})(ModeByte || (ModeByte = {}));\nfunction decodeNumeric(stream, size) {\n var bytes = [];\n var text = \"\";\n var characterCountSize = [10, 12, 14][size];\n var length = stream.readBits(characterCountSize);\n // Read digits in groups of 3\n while (length >= 3) {\n var num = stream.readBits(10);\n if (num >= 1000) {\n throw new Error(\"Invalid numeric value above 999\");\n }\n var a = Math.floor(num / 100);\n var b = Math.floor(num / 10) % 10;\n var c = num % 10;\n bytes.push(48 + a, 48 + b, 48 + c);\n text += a.toString() + b.toString() + c.toString();\n length -= 3;\n }\n // If the number of digits aren't a multiple of 3, the remaining digits are special cased.\n if (length === 2) {\n var num = stream.readBits(7);\n if (num >= 100) {\n throw new Error(\"Invalid numeric value above 99\");\n }\n var a = Math.floor(num / 10);\n var b = num % 10;\n bytes.push(48 + a, 48 + b);\n text += a.toString() + b.toString();\n }\n else if (length === 1) {\n var num = stream.readBits(4);\n if (num >= 10) {\n throw new Error(\"Invalid numeric value above 9\");\n }\n bytes.push(48 + num);\n text += num.toString();\n }\n return { bytes: bytes, text: text };\n}\nvar AlphanumericCharacterCodes = [\n \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\",\n \"9\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\",\n \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\",\n \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\",\n \" \", \"$\", \"%\", \"*\", \"+\", \"-\", \".\", \"/\", \":\",\n];\nfunction decodeAlphanumeric(stream, size) {\n var bytes = [];\n var text = \"\";\n var characterCountSize = [9, 11, 13][size];\n var length = stream.readBits(characterCountSize);\n while (length >= 2) {\n var v = stream.readBits(11);\n var a = Math.floor(v / 45);\n var b = v % 45;\n bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0), AlphanumericCharacterCodes[b].charCodeAt(0));\n text += AlphanumericCharacterCodes[a] + AlphanumericCharacterCodes[b];\n length -= 2;\n }\n if (length === 1) {\n var a = stream.readBits(6);\n bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0));\n text += AlphanumericCharacterCodes[a];\n }\n return { bytes: bytes, text: text };\n}\nfunction decodeByte(stream, size) {\n var bytes = [];\n var text = \"\";\n var characterCountSize = [8, 16, 16][size];\n var length = stream.readBits(characterCountSize);\n for (var i = 0; i < length; i++) {\n var b = stream.readBits(8);\n bytes.push(b);\n }\n try {\n text += decodeURIComponent(bytes.map(function (b) { return \"%\" + (\"0\" + b.toString(16)).substr(-2); }).join(\"\"));\n }\n catch (_a) {\n // failed to decode\n }\n return { bytes: bytes, text: text };\n}\nfunction decodeKanji(stream, size) {\n var bytes = [];\n var text = \"\";\n var characterCountSize = [8, 10, 12][size];\n var length = stream.readBits(characterCountSize);\n for (var i = 0; i < length; i++) {\n var k = stream.readBits(13);\n var c = (Math.floor(k / 0xC0) << 8) | (k % 0xC0);\n if (c < 0x1F00) {\n c += 0x8140;\n }\n else {\n c += 0xC140;\n }\n bytes.push(c >> 8, c & 0xFF);\n text += String.fromCharCode(shiftJISTable_1.shiftJISTable[c]);\n }\n return { bytes: bytes, text: text };\n}\nfunction decode(data, version) {\n var _a, _b, _c, _d;\n var stream = new BitStream_1.BitStream(data);\n // There are 3 'sizes' based on the version. 1-9 is small (0), 10-26 is medium (1) and 27-40 is large (2).\n var size = version <= 9 ? 0 : version <= 26 ? 1 : 2;\n var result = {\n text: \"\",\n bytes: [],\n chunks: [],\n version: version,\n };\n while (stream.available() >= 4) {\n var mode = stream.readBits(4);\n if (mode === ModeByte.Terminator) {\n return result;\n }\n else if (mode === ModeByte.ECI) {\n if (stream.readBits(1) === 0) {\n result.chunks.push({\n type: Mode.ECI,\n assignmentNumber: stream.readBits(7),\n });\n }\n else if (stream.readBits(1) === 0) {\n result.chunks.push({\n type: Mode.ECI,\n assignmentNumber: stream.readBits(14),\n });\n }\n else if (stream.readBits(1) === 0) {\n result.chunks.push({\n type: Mode.ECI,\n assignmentNumber: stream.readBits(21),\n });\n }\n else {\n // ECI data seems corrupted\n result.chunks.push({\n type: Mode.ECI,\n assignmentNumber: -1,\n });\n }\n }\n else if (mode === ModeByte.Numeric) {\n var numericResult = decodeNumeric(stream, size);\n result.text += numericResult.text;\n (_a = result.bytes).push.apply(_a, numericResult.bytes);\n result.chunks.push({\n type: Mode.Numeric,\n text: numericResult.text,\n });\n }\n else if (mode === ModeByte.Alphanumeric) {\n var alphanumericResult = decodeAlphanumeric(stream, size);\n result.text += alphanumericResult.text;\n (_b = result.bytes).push.apply(_b, alphanumericResult.bytes);\n result.chunks.push({\n type: Mode.Alphanumeric,\n text: alphanumericResult.text,\n });\n }\n else if (mode === ModeByte.Byte) {\n var byteResult = decodeByte(stream, size);\n result.text += byteResult.text;\n (_c = result.bytes).push.apply(_c, byteResult.bytes);\n result.chunks.push({\n type: Mode.Byte,\n bytes: byteResult.bytes,\n text: byteResult.text,\n });\n }\n else if (mode === ModeByte.Kanji) {\n var kanjiResult = decodeKanji(stream, size);\n result.text += kanjiResult.text;\n (_d = result.bytes).push.apply(_d, kanjiResult.bytes);\n result.chunks.push({\n type: Mode.Kanji,\n bytes: kanjiResult.bytes,\n text: kanjiResult.text,\n });\n }\n }\n // If there is no data left, or the remaining bits are all 0, then that counts as a termination marker\n if (stream.available() === 0 || stream.readBits(stream.available()) === 0) {\n return result;\n }\n}\nexports.decode = decode;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// tslint:disable:no-bitwise\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitStream = /** @class */ (function () {\n function BitStream(bytes) {\n this.byteOffset = 0;\n this.bitOffset = 0;\n this.bytes = bytes;\n }\n BitStream.prototype.readBits = function (numBits) {\n if (numBits < 1 || numBits > 32 || numBits > this.available()) {\n throw new Error(\"Cannot read \" + numBits.toString() + \" bits\");\n }\n var result = 0;\n // First, read remainder from current byte\n if (this.bitOffset > 0) {\n var bitsLeft = 8 - this.bitOffset;\n var toRead = numBits < bitsLeft ? numBits : bitsLeft;\n var bitsToNotRead = bitsLeft - toRead;\n var mask = (0xFF >> (8 - toRead)) << bitsToNotRead;\n result = (this.bytes[this.byteOffset] & mask) >> bitsToNotRead;\n numBits -= toRead;\n this.bitOffset += toRead;\n if (this.bitOffset === 8) {\n this.bitOffset = 0;\n this.byteOffset++;\n }\n }\n // Next read whole bytes\n if (numBits > 0) {\n while (numBits >= 8) {\n result = (result << 8) | (this.bytes[this.byteOffset] & 0xFF);\n this.byteOffset++;\n numBits -= 8;\n }\n // Finally read a partial byte\n if (numBits > 0) {\n var bitsToNotRead = 8 - numBits;\n var mask = (0xFF >> bitsToNotRead) << bitsToNotRead;\n result = (result << numBits) | ((this.bytes[this.byteOffset] & mask) >> bitsToNotRead);\n this.bitOffset += numBits;\n }\n }\n return result;\n };\n BitStream.prototype.available = function () {\n return 8 * (this.bytes.length - this.byteOffset) - this.bitOffset;\n };\n return BitStream;\n}());\nexports.BitStream = BitStream;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.shiftJISTable = {\n 0x20: 0x0020,\n 0x21: 0x0021,\n 0x22: 0x0022,\n 0x23: 0x0023,\n 0x24: 0x0024,\n 0x25: 0x0025,\n 0x26: 0x0026,\n 0x27: 0x0027,\n 0x28: 0x0028,\n 0x29: 0x0029,\n 0x2A: 0x002A,\n 0x2B: 0x002B,\n 0x2C: 0x002C,\n 0x2D: 0x002D,\n 0x2E: 0x002E,\n 0x2F: 0x002F,\n 0x30: 0x0030,\n 0x31: 0x0031,\n 0x32: 0x0032,\n 0x33: 0x0033,\n 0x34: 0x0034,\n 0x35: 0x0035,\n 0x36: 0x0036,\n 0x37: 0x0037,\n 0x38: 0x0038,\n 0x39: 0x0039,\n 0x3A: 0x003A,\n 0x3B: 0x003B,\n 0x3C: 0x003C,\n 0x3D: 0x003D,\n 0x3E: 0x003E,\n 0x3F: 0x003F,\n 0x40: 0x0040,\n 0x41: 0x0041,\n 0x42: 0x0042,\n 0x43: 0x0043,\n 0x44: 0x0044,\n 0x45: 0x0045,\n 0x46: 0x0046,\n 0x47: 0x0047,\n 0x48: 0x0048,\n 0x49: 0x0049,\n 0x4A: 0x004A,\n 0x4B: 0x004B,\n 0x4C: 0x004C,\n 0x4D: 0x004D,\n 0x4E: 0x004E,\n 0x4F: 0x004F,\n 0x50: 0x0050,\n 0x51: 0x0051,\n 0x52: 0x0052,\n 0x53: 0x0053,\n 0x54: 0x0054,\n 0x55: 0x0055,\n 0x56: 0x0056,\n 0x57: 0x0057,\n 0x58: 0x0058,\n 0x59: 0x0059,\n 0x5A: 0x005A,\n 0x5B: 0x005B,\n 0x5C: 0x00A5,\n 0x5D: 0x005D,\n 0x5E: 0x005E,\n 0x5F: 0x005F,\n 0x60: 0x0060,\n 0x61: 0x0061,\n 0x62: 0x0062,\n 0x63: 0x0063,\n 0x64: 0x0064,\n 0x65: 0x0065,\n 0x66: 0x0066,\n 0x67: 0x0067,\n 0x68: 0x0068,\n 0x69: 0x0069,\n 0x6A: 0x006A,\n 0x6B: 0x006B,\n 0x6C: 0x006C,\n 0x6D: 0x006D,\n 0x6E: 0x006E,\n 0x6F: 0x006F,\n 0x70: 0x0070,\n 0x71: 0x0071,\n 0x72: 0x0072,\n 0x73: 0x0073,\n 0x74: 0x0074,\n 0x75: 0x0075,\n 0x76: 0x0076,\n 0x77: 0x0077,\n 0x78: 0x0078,\n 0x79: 0x0079,\n 0x7A: 0x007A,\n 0x7B: 0x007B,\n 0x7C: 0x007C,\n 0x7D: 0x007D,\n 0x7E: 0x203E,\n 0x8140: 0x3000,\n 0x8141: 0x3001,\n 0x8142: 0x3002,\n 0x8143: 0xFF0C,\n 0x8144: 0xFF0E,\n 0x8145: 0x30FB,\n 0x8146: 0xFF1A,\n 0x8147: 0xFF1B,\n 0x8148: 0xFF1F,\n 0x8149: 0xFF01,\n 0x814A: 0x309B,\n 0x814B: 0x309C,\n 0x814C: 0x00B4,\n 0x814D: 0xFF40,\n 0x814E: 0x00A8,\n 0x814F: 0xFF3E,\n 0x8150: 0xFFE3,\n 0x8151: 0xFF3F,\n 0x8152: 0x30FD,\n 0x8153: 0x30FE,\n 0x8154: 0x309D,\n 0x8155: 0x309E,\n 0x8156: 0x3003,\n 0x8157: 0x4EDD,\n 0x8158: 0x3005,\n 0x8159: 0x3006,\n 0x815A: 0x3007,\n 0x815B: 0x30FC,\n 0x815C: 0x2015,\n 0x815D: 0x2010,\n 0x815E: 0xFF0F,\n 0x815F: 0x005C,\n 0x8160: 0x301C,\n 0x8161: 0x2016,\n 0x8162: 0xFF5C,\n 0x8163: 0x2026,\n 0x8164: 0x2025,\n 0x8165: 0x2018,\n 0x8166: 0x2019,\n 0x8167: 0x201C,\n 0x8168: 0x201D,\n 0x8169: 0xFF08,\n 0x816A: 0xFF09,\n 0x816B: 0x3014,\n 0x816C: 0x3015,\n 0x816D: 0xFF3B,\n 0x816E: 0xFF3D,\n 0x816F: 0xFF5B,\n 0x8170: 0xFF5D,\n 0x8171: 0x3008,\n 0x8172: 0x3009,\n 0x8173: 0x300A,\n 0x8174: 0x300B,\n 0x8175: 0x300C,\n 0x8176: 0x300D,\n 0x8177: 0x300E,\n 0x8178: 0x300F,\n 0x8179: 0x3010,\n 0x817A: 0x3011,\n 0x817B: 0xFF0B,\n 0x817C: 0x2212,\n 0x817D: 0x00B1,\n 0x817E: 0x00D7,\n 0x8180: 0x00F7,\n 0x8181: 0xFF1D,\n 0x8182: 0x2260,\n 0x8183: 0xFF1C,\n 0x8184: 0xFF1E,\n 0x8185: 0x2266,\n 0x8186: 0x2267,\n 0x8187: 0x221E,\n 0x8188: 0x2234,\n 0x8189: 0x2642,\n 0x818A: 0x2640,\n 0x818B: 0x00B0,\n 0x818C: 0x2032,\n 0x818D: 0x2033,\n 0x818E: 0x2103,\n 0x818F: 0xFFE5,\n 0x8190: 0xFF04,\n 0x8191: 0x00A2,\n 0x8192: 0x00A3,\n 0x8193: 0xFF05,\n 0x8194: 0xFF03,\n 0x8195: 0xFF06,\n 0x8196: 0xFF0A,\n 0x8197: 0xFF20,\n 0x8198: 0x00A7,\n 0x8199: 0x2606,\n 0x819A: 0x2605,\n 0x819B: 0x25CB,\n 0x819C: 0x25CF,\n 0x819D: 0x25CE,\n 0x819E: 0x25C7,\n 0x819F: 0x25C6,\n 0x81A0: 0x25A1,\n 0x81A1: 0x25A0,\n 0x81A2: 0x25B3,\n 0x81A3: 0x25B2,\n 0x81A4: 0x25BD,\n 0x81A5: 0x25BC,\n 0x81A6: 0x203B,\n 0x81A7: 0x3012,\n 0x81A8: 0x2192,\n 0x81A9: 0x2190,\n 0x81AA: 0x2191,\n 0x81AB: 0x2193,\n 0x81AC: 0x3013,\n 0x81B8: 0x2208,\n 0x81B9: 0x220B,\n 0x81BA: 0x2286,\n 0x81BB: 0x2287,\n 0x81BC: 0x2282,\n 0x81BD: 0x2283,\n 0x81BE: 0x222A,\n 0x81BF: 0x2229,\n 0x81C8: 0x2227,\n 0x81C9: 0x2228,\n 0x81CA: 0x00AC,\n 0x81CB: 0x21D2,\n 0x81CC: 0x21D4,\n 0x81CD: 0x2200,\n 0x81CE: 0x2203,\n 0x81DA: 0x2220,\n 0x81DB: 0x22A5,\n 0x81DC: 0x2312,\n 0x81DD: 0x2202,\n 0x81DE: 0x2207,\n 0x81DF: 0x2261,\n 0x81E0: 0x2252,\n 0x81E1: 0x226A,\n 0x81E2: 0x226B,\n 0x81E3: 0x221A,\n 0x81E4: 0x223D,\n 0x81E5: 0x221D,\n 0x81E6: 0x2235,\n 0x81E7: 0x222B,\n 0x81E8: 0x222C,\n 0x81F0: 0x212B,\n 0x81F1: 0x2030,\n 0x81F2: 0x266F,\n 0x81F3: 0x266D,\n 0x81F4: 0x266A,\n 0x81F5: 0x2020,\n 0x81F6: 0x2021,\n 0x81F7: 0x00B6,\n 0x81FC: 0x25EF,\n 0x824F: 0xFF10,\n 0x8250: 0xFF11,\n 0x8251: 0xFF12,\n 0x8252: 0xFF13,\n 0x8253: 0xFF14,\n 0x8254: 0xFF15,\n 0x8255: 0xFF16,\n 0x8256: 0xFF17,\n 0x8257: 0xFF18,\n 0x8258: 0xFF19,\n 0x8260: 0xFF21,\n 0x8261: 0xFF22,\n 0x8262: 0xFF23,\n 0x8263: 0xFF24,\n 0x8264: 0xFF25,\n 0x8265: 0xFF26,\n 0x8266: 0xFF27,\n 0x8267: 0xFF28,\n 0x8268: 0xFF29,\n 0x8269: 0xFF2A,\n 0x826A: 0xFF2B,\n 0x826B: 0xFF2C,\n 0x826C: 0xFF2D,\n 0x826D: 0xFF2E,\n 0x826E: 0xFF2F,\n 0x826F: 0xFF30,\n 0x8270: 0xFF31,\n 0x8271: 0xFF32,\n 0x8272: 0xFF33,\n 0x8273: 0xFF34,\n 0x8274: 0xFF35,\n 0x8275: 0xFF36,\n 0x8276: 0xFF37,\n 0x8277: 0xFF38,\n 0x8278: 0xFF39,\n 0x8279: 0xFF3A,\n 0x8281: 0xFF41,\n 0x8282: 0xFF42,\n 0x8283: 0xFF43,\n 0x8284: 0xFF44,\n 0x8285: 0xFF45,\n 0x8286: 0xFF46,\n 0x8287: 0xFF47,\n 0x8288: 0xFF48,\n 0x8289: 0xFF49,\n 0x828A: 0xFF4A,\n 0x828B: 0xFF4B,\n 0x828C: 0xFF4C,\n 0x828D: 0xFF4D,\n 0x828E: 0xFF4E,\n 0x828F: 0xFF4F,\n 0x8290: 0xFF50,\n 0x8291: 0xFF51,\n 0x8292: 0xFF52,\n 0x8293: 0xFF53,\n 0x8294: 0xFF54,\n 0x8295: 0xFF55,\n 0x8296: 0xFF56,\n 0x8297: 0xFF57,\n 0x8298: 0xFF58,\n 0x8299: 0xFF59,\n 0x829A: 0xFF5A,\n 0x829F: 0x3041,\n 0x82A0: 0x3042,\n 0x82A1: 0x3043,\n 0x82A2: 0x3044,\n 0x82A3: 0x3045,\n 0x82A4: 0x3046,\n 0x82A5: 0x3047,\n 0x82A6: 0x3048,\n 0x82A7: 0x3049,\n 0x82A8: 0x304A,\n 0x82A9: 0x304B,\n 0x82AA: 0x304C,\n 0x82AB: 0x304D,\n 0x82AC: 0x304E,\n 0x82AD: 0x304F,\n 0x82AE: 0x3050,\n 0x82AF: 0x3051,\n 0x82B0: 0x3052,\n 0x82B1: 0x3053,\n 0x82B2: 0x3054,\n 0x82B3: 0x3055,\n 0x82B4: 0x3056,\n 0x82B5: 0x3057,\n 0x82B6: 0x3058,\n 0x82B7: 0x3059,\n 0x82B8: 0x305A,\n 0x82B9: 0x305B,\n 0x82BA: 0x305C,\n 0x82BB: 0x305D,\n 0x82BC: 0x305E,\n 0x82BD: 0x305F,\n 0x82BE: 0x3060,\n 0x82BF: 0x3061,\n 0x82C0: 0x3062,\n 0x82C1: 0x3063,\n 0x82C2: 0x3064,\n 0x82C3: 0x3065,\n 0x82C4: 0x3066,\n 0x82C5: 0x3067,\n 0x82C6: 0x3068,\n 0x82C7: 0x3069,\n 0x82C8: 0x306A,\n 0x82C9: 0x306B,\n 0x82CA: 0x306C,\n 0x82CB: 0x306D,\n 0x82CC: 0x306E,\n 0x82CD: 0x306F,\n 0x82CE: 0x3070,\n 0x82CF: 0x3071,\n 0x82D0: 0x3072,\n 0x82D1: 0x3073,\n 0x82D2: 0x3074,\n 0x82D3: 0x3075,\n 0x82D4: 0x3076,\n 0x82D5: 0x3077,\n 0x82D6: 0x3078,\n 0x82D7: 0x3079,\n 0x82D8: 0x307A,\n 0x82D9: 0x307B,\n 0x82DA: 0x307C,\n 0x82DB: 0x307D,\n 0x82DC: 0x307E,\n 0x82DD: 0x307F,\n 0x82DE: 0x3080,\n 0x82DF: 0x3081,\n 0x82E0: 0x3082,\n 0x82E1: 0x3083,\n 0x82E2: 0x3084,\n 0x82E3: 0x3085,\n 0x82E4: 0x3086,\n 0x82E5: 0x3087,\n 0x82E6: 0x3088,\n 0x82E7: 0x3089,\n 0x82E8: 0x308A,\n 0x82E9: 0x308B,\n 0x82EA: 0x308C,\n 0x82EB: 0x308D,\n 0x82EC: 0x308E,\n 0x82ED: 0x308F,\n 0x82EE: 0x3090,\n 0x82EF: 0x3091,\n 0x82F0: 0x3092,\n 0x82F1: 0x3093,\n 0x8340: 0x30A1,\n 0x8341: 0x30A2,\n 0x8342: 0x30A3,\n 0x8343: 0x30A4,\n 0x8344: 0x30A5,\n 0x8345: 0x30A6,\n 0x8346: 0x30A7,\n 0x8347: 0x30A8,\n 0x8348: 0x30A9,\n 0x8349: 0x30AA,\n 0x834A: 0x30AB,\n 0x834B: 0x30AC,\n 0x834C: 0x30AD,\n 0x834D: 0x30AE,\n 0x834E: 0x30AF,\n 0x834F: 0x30B0,\n 0x8350: 0x30B1,\n 0x8351: 0x30B2,\n 0x8352: 0x30B3,\n 0x8353: 0x30B4,\n 0x8354: 0x30B5,\n 0x8355: 0x30B6,\n 0x8356: 0x30B7,\n 0x8357: 0x30B8,\n 0x8358: 0x30B9,\n 0x8359: 0x30BA,\n 0x835A: 0x30BB,\n 0x835B: 0x30BC,\n 0x835C: 0x30BD,\n 0x835D: 0x30BE,\n 0x835E: 0x30BF,\n 0x835F: 0x30C0,\n 0x8360: 0x30C1,\n 0x8361: 0x30C2,\n 0x8362: 0x30C3,\n 0x8363: 0x30C4,\n 0x8364: 0x30C5,\n 0x8365: 0x30C6,\n 0x8366: 0x30C7,\n 0x8367: 0x30C8,\n 0x8368: 0x30C9,\n 0x8369: 0x30CA,\n 0x836A: 0x30CB,\n 0x836B: 0x30CC,\n 0x836C: 0x30CD,\n 0x836D: 0x30CE,\n 0x836E: 0x30CF,\n 0x836F: 0x30D0,\n 0x8370: 0x30D1,\n 0x8371: 0x30D2,\n 0x8372: 0x30D3,\n 0x8373: 0x30D4,\n 0x8374: 0x30D5,\n 0x8375: 0x30D6,\n 0x8376: 0x30D7,\n 0x8377: 0x30D8,\n 0x8378: 0x30D9,\n 0x8379: 0x30DA,\n 0x837A: 0x30DB,\n 0x837B: 0x30DC,\n 0x837C: 0x30DD,\n 0x837D: 0x30DE,\n 0x837E: 0x30DF,\n 0x8380: 0x30E0,\n 0x8381: 0x30E1,\n 0x8382: 0x30E2,\n 0x8383: 0x30E3,\n 0x8384: 0x30E4,\n 0x8385: 0x30E5,\n 0x8386: 0x30E6,\n 0x8387: 0x30E7,\n 0x8388: 0x30E8,\n 0x8389: 0x30E9,\n 0x838A: 0x30EA,\n 0x838B: 0x30EB,\n 0x838C: 0x30EC,\n 0x838D: 0x30ED,\n 0x838E: 0x30EE,\n 0x838F: 0x30EF,\n 0x8390: 0x30F0,\n 0x8391: 0x30F1,\n 0x8392: 0x30F2,\n 0x8393: 0x30F3,\n 0x8394: 0x30F4,\n 0x8395: 0x30F5,\n 0x8396: 0x30F6,\n 0x839F: 0x0391,\n 0x83A0: 0x0392,\n 0x83A1: 0x0393,\n 0x83A2: 0x0394,\n 0x83A3: 0x0395,\n 0x83A4: 0x0396,\n 0x83A5: 0x0397,\n 0x83A6: 0x0398,\n 0x83A7: 0x0399,\n 0x83A8: 0x039A,\n 0x83A9: 0x039B,\n 0x83AA: 0x039C,\n 0x83AB: 0x039D,\n 0x83AC: 0x039E,\n 0x83AD: 0x039F,\n 0x83AE: 0x03A0,\n 0x83AF: 0x03A1,\n 0x83B0: 0x03A3,\n 0x83B1: 0x03A4,\n 0x83B2: 0x03A5,\n 0x83B3: 0x03A6,\n 0x83B4: 0x03A7,\n 0x83B5: 0x03A8,\n 0x83B6: 0x03A9,\n 0x83BF: 0x03B1,\n 0x83C0: 0x03B2,\n 0x83C1: 0x03B3,\n 0x83C2: 0x03B4,\n 0x83C3: 0x03B5,\n 0x83C4: 0x03B6,\n 0x83C5: 0x03B7,\n 0x83C6: 0x03B8,\n 0x83C7: 0x03B9,\n 0x83C8: 0x03BA,\n 0x83C9: 0x03BB,\n 0x83CA: 0x03BC,\n 0x83CB: 0x03BD,\n 0x83CC: 0x03BE,\n 0x83CD: 0x03BF,\n 0x83CE: 0x03C0,\n 0x83CF: 0x03C1,\n 0x83D0: 0x03C3,\n 0x83D1: 0x03C4,\n 0x83D2: 0x03C5,\n 0x83D3: 0x03C6,\n 0x83D4: 0x03C7,\n 0x83D5: 0x03C8,\n 0x83D6: 0x03C9,\n 0x8440: 0x0410,\n 0x8441: 0x0411,\n 0x8442: 0x0412,\n 0x8443: 0x0413,\n 0x8444: 0x0414,\n 0x8445: 0x0415,\n 0x8446: 0x0401,\n 0x8447: 0x0416,\n 0x8448: 0x0417,\n 0x8449: 0x0418,\n 0x844A: 0x0419,\n 0x844B: 0x041A,\n 0x844C: 0x041B,\n 0x844D: 0x041C,\n 0x844E: 0x041D,\n 0x844F: 0x041E,\n 0x8450: 0x041F,\n 0x8451: 0x0420,\n 0x8452: 0x0421,\n 0x8453: 0x0422,\n 0x8454: 0x0423,\n 0x8455: 0x0424,\n 0x8456: 0x0425,\n 0x8457: 0x0426,\n 0x8458: 0x0427,\n 0x8459: 0x0428,\n 0x845A: 0x0429,\n 0x845B: 0x042A,\n 0x845C: 0x042B,\n 0x845D: 0x042C,\n 0x845E: 0x042D,\n 0x845F: 0x042E,\n 0x8460: 0x042F,\n 0x8470: 0x0430,\n 0x8471: 0x0431,\n 0x8472: 0x0432,\n 0x8473: 0x0433,\n 0x8474: 0x0434,\n 0x8475: 0x0435,\n 0x8476: 0x0451,\n 0x8477: 0x0436,\n 0x8478: 0x0437,\n 0x8479: 0x0438,\n 0x847A: 0x0439,\n 0x847B: 0x043A,\n 0x847C: 0x043B,\n 0x847D: 0x043C,\n 0x847E: 0x043D,\n 0x8480: 0x043E,\n 0x8481: 0x043F,\n 0x8482: 0x0440,\n 0x8483: 0x0441,\n 0x8484: 0x0442,\n 0x8485: 0x0443,\n 0x8486: 0x0444,\n 0x8487: 0x0445,\n 0x8488: 0x0446,\n 0x8489: 0x0447,\n 0x848A: 0x0448,\n 0x848B: 0x0449,\n 0x848C: 0x044A,\n 0x848D: 0x044B,\n 0x848E: 0x044C,\n 0x848F: 0x044D,\n 0x8490: 0x044E,\n 0x8491: 0x044F,\n 0x849F: 0x2500,\n 0x84A0: 0x2502,\n 0x84A1: 0x250C,\n 0x84A2: 0x2510,\n 0x84A3: 0x2518,\n 0x84A4: 0x2514,\n 0x84A5: 0x251C,\n 0x84A6: 0x252C,\n 0x84A7: 0x2524,\n 0x84A8: 0x2534,\n 0x84A9: 0x253C,\n 0x84AA: 0x2501,\n 0x84AB: 0x2503,\n 0x84AC: 0x250F,\n 0x84AD: 0x2513,\n 0x84AE: 0x251B,\n 0x84AF: 0x2517,\n 0x84B0: 0x2523,\n 0x84B1: 0x2533,\n 0x84B2: 0x252B,\n 0x84B3: 0x253B,\n 0x84B4: 0x254B,\n 0x84B5: 0x2520,\n 0x84B6: 0x252F,\n 0x84B7: 0x2528,\n 0x84B8: 0x2537,\n 0x84B9: 0x253F,\n 0x84BA: 0x251D,\n 0x84BB: 0x2530,\n 0x84BC: 0x2525,\n 0x84BD: 0x2538,\n 0x84BE: 0x2542,\n 0x889F: 0x4E9C,\n 0x88A0: 0x5516,\n 0x88A1: 0x5A03,\n 0x88A2: 0x963F,\n 0x88A3: 0x54C0,\n 0x88A4: 0x611B,\n 0x88A5: 0x6328,\n 0x88A6: 0x59F6,\n 0x88A7: 0x9022,\n 0x88A8: 0x8475,\n 0x88A9: 0x831C,\n 0x88AA: 0x7A50,\n 0x88AB: 0x60AA,\n 0x88AC: 0x63E1,\n 0x88AD: 0x6E25,\n 0x88AE: 0x65ED,\n 0x88AF: 0x8466,\n 0x88B0: 0x82A6,\n 0x88B1: 0x9BF5,\n 0x88B2: 0x6893,\n 0x88B3: 0x5727,\n 0x88B4: 0x65A1,\n 0x88B5: 0x6271,\n 0x88B6: 0x5B9B,\n 0x88B7: 0x59D0,\n 0x88B8: 0x867B,\n 0x88B9: 0x98F4,\n 0x88BA: 0x7D62,\n 0x88BB: 0x7DBE,\n 0x88BC: 0x9B8E,\n 0x88BD: 0x6216,\n 0x88BE: 0x7C9F,\n 0x88BF: 0x88B7,\n 0x88C0: 0x5B89,\n 0x88C1: 0x5EB5,\n 0x88C2: 0x6309,\n 0x88C3: 0x6697,\n 0x88C4: 0x6848,\n 0x88C5: 0x95C7,\n 0x88C6: 0x978D,\n 0x88C7: 0x674F,\n 0x88C8: 0x4EE5,\n 0x88C9: 0x4F0A,\n 0x88CA: 0x4F4D,\n 0x88CB: 0x4F9D,\n 0x88CC: 0x5049,\n 0x88CD: 0x56F2,\n 0x88CE: 0x5937,\n 0x88CF: 0x59D4,\n 0x88D0: 0x5A01,\n 0x88D1: 0x5C09,\n 0x88D2: 0x60DF,\n 0x88D3: 0x610F,\n 0x88D4: 0x6170,\n 0x88D5: 0x6613,\n 0x88D6: 0x6905,\n 0x88D7: 0x70BA,\n 0x88D8: 0x754F,\n 0x88D9: 0x7570,\n 0x88DA: 0x79FB,\n 0x88DB: 0x7DAD,\n 0x88DC: 0x7DEF,\n 0x88DD: 0x80C3,\n 0x88DE: 0x840E,\n 0x88DF: 0x8863,\n 0x88E0: 0x8B02,\n 0x88E1: 0x9055,\n 0x88E2: 0x907A,\n 0x88E3: 0x533B,\n 0x88E4: 0x4E95,\n 0x88E5: 0x4EA5,\n 0x88E6: 0x57DF,\n 0x88E7: 0x80B2,\n 0x88E8: 0x90C1,\n 0x88E9: 0x78EF,\n 0x88EA: 0x4E00,\n 0x88EB: 0x58F1,\n 0x88EC: 0x6EA2,\n 0x88ED: 0x9038,\n 0x88EE: 0x7A32,\n 0x88EF: 0x8328,\n 0x88F0: 0x828B,\n 0x88F1: 0x9C2F,\n 0x88F2: 0x5141,\n 0x88F3: 0x5370,\n 0x88F4: 0x54BD,\n 0x88F5: 0x54E1,\n 0x88F6: 0x56E0,\n 0x88F7: 0x59FB,\n 0x88F8: 0x5F15,\n 0x88F9: 0x98F2,\n 0x88FA: 0x6DEB,\n 0x88FB: 0x80E4,\n 0x88FC: 0x852D,\n 0x8940: 0x9662,\n 0x8941: 0x9670,\n 0x8942: 0x96A0,\n 0x8943: 0x97FB,\n 0x8944: 0x540B,\n 0x8945: 0x53F3,\n 0x8946: 0x5B87,\n 0x8947: 0x70CF,\n 0x8948: 0x7FBD,\n 0x8949: 0x8FC2,\n 0x894A: 0x96E8,\n 0x894B: 0x536F,\n 0x894C: 0x9D5C,\n 0x894D: 0x7ABA,\n 0x894E: 0x4E11,\n 0x894F: 0x7893,\n 0x8950: 0x81FC,\n 0x8951: 0x6E26,\n 0x8952: 0x5618,\n 0x8953: 0x5504,\n 0x8954: 0x6B1D,\n 0x8955: 0x851A,\n 0x8956: 0x9C3B,\n 0x8957: 0x59E5,\n 0x8958: 0x53A9,\n 0x8959: 0x6D66,\n 0x895A: 0x74DC,\n 0x895B: 0x958F,\n 0x895C: 0x5642,\n 0x895D: 0x4E91,\n 0x895E: 0x904B,\n 0x895F: 0x96F2,\n 0x8960: 0x834F,\n 0x8961: 0x990C,\n 0x8962: 0x53E1,\n 0x8963: 0x55B6,\n 0x8964: 0x5B30,\n 0x8965: 0x5F71,\n 0x8966: 0x6620,\n 0x8967: 0x66F3,\n 0x8968: 0x6804,\n 0x8969: 0x6C38,\n 0x896A: 0x6CF3,\n 0x896B: 0x6D29,\n 0x896C: 0x745B,\n 0x896D: 0x76C8,\n 0x896E: 0x7A4E,\n 0x896F: 0x9834,\n 0x8970: 0x82F1,\n 0x8971: 0x885B,\n 0x8972: 0x8A60,\n 0x8973: 0x92ED,\n 0x8974: 0x6DB2,\n 0x8975: 0x75AB,\n 0x8976: 0x76CA,\n 0x8977: 0x99C5,\n 0x8978: 0x60A6,\n 0x8979: 0x8B01,\n 0x897A: 0x8D8A,\n 0x897B: 0x95B2,\n 0x897C: 0x698E,\n 0x897D: 0x53AD,\n 0x897E: 0x5186,\n 0x8980: 0x5712,\n 0x8981: 0x5830,\n 0x8982: 0x5944,\n 0x8983: 0x5BB4,\n 0x8984: 0x5EF6,\n 0x8985: 0x6028,\n 0x8986: 0x63A9,\n 0x8987: 0x63F4,\n 0x8988: 0x6CBF,\n 0x8989: 0x6F14,\n 0x898A: 0x708E,\n 0x898B: 0x7114,\n 0x898C: 0x7159,\n 0x898D: 0x71D5,\n 0x898E: 0x733F,\n 0x898F: 0x7E01,\n 0x8990: 0x8276,\n 0x8991: 0x82D1,\n 0x8992: 0x8597,\n 0x8993: 0x9060,\n 0x8994: 0x925B,\n 0x8995: 0x9D1B,\n 0x8996: 0x5869,\n 0x8997: 0x65BC,\n 0x8998: 0x6C5A,\n 0x8999: 0x7525,\n 0x899A: 0x51F9,\n 0x899B: 0x592E,\n 0x899C: 0x5965,\n 0x899D: 0x5F80,\n 0x899E: 0x5FDC,\n 0x899F: 0x62BC,\n 0x89A0: 0x65FA,\n 0x89A1: 0x6A2A,\n 0x89A2: 0x6B27,\n 0x89A3: 0x6BB4,\n 0x89A4: 0x738B,\n 0x89A5: 0x7FC1,\n 0x89A6: 0x8956,\n 0x89A7: 0x9D2C,\n 0x89A8: 0x9D0E,\n 0x89A9: 0x9EC4,\n 0x89AA: 0x5CA1,\n 0x89AB: 0x6C96,\n 0x89AC: 0x837B,\n 0x89AD: 0x5104,\n 0x89AE: 0x5C4B,\n 0x89AF: 0x61B6,\n 0x89B0: 0x81C6,\n 0x89B1: 0x6876,\n 0x89B2: 0x7261,\n 0x89B3: 0x4E59,\n 0x89B4: 0x4FFA,\n 0x89B5: 0x5378,\n 0x89B6: 0x6069,\n 0x89B7: 0x6E29,\n 0x89B8: 0x7A4F,\n 0x89B9: 0x97F3,\n 0x89BA: 0x4E0B,\n 0x89BB: 0x5316,\n 0x89BC: 0x4EEE,\n 0x89BD: 0x4F55,\n 0x89BE: 0x4F3D,\n 0x89BF: 0x4FA1,\n 0x89C0: 0x4F73,\n 0x89C1: 0x52A0,\n 0x89C2: 0x53EF,\n 0x89C3: 0x5609,\n 0x89C4: 0x590F,\n 0x89C5: 0x5AC1,\n 0x89C6: 0x5BB6,\n 0x89C7: 0x5BE1,\n 0x89C8: 0x79D1,\n 0x89C9: 0x6687,\n 0x89CA: 0x679C,\n 0x89CB: 0x67B6,\n 0x89CC: 0x6B4C,\n 0x89CD: 0x6CB3,\n 0x89CE: 0x706B,\n 0x89CF: 0x73C2,\n 0x89D0: 0x798D,\n 0x89D1: 0x79BE,\n 0x89D2: 0x7A3C,\n 0x89D3: 0x7B87,\n 0x89D4: 0x82B1,\n 0x89D5: 0x82DB,\n 0x89D6: 0x8304,\n 0x89D7: 0x8377,\n 0x89D8: 0x83EF,\n 0x89D9: 0x83D3,\n 0x89DA: 0x8766,\n 0x89DB: 0x8AB2,\n 0x89DC: 0x5629,\n 0x89DD: 0x8CA8,\n 0x89DE: 0x8FE6,\n 0x89DF: 0x904E,\n 0x89E0: 0x971E,\n 0x89E1: 0x868A,\n 0x89E2: 0x4FC4,\n 0x89E3: 0x5CE8,\n 0x89E4: 0x6211,\n 0x89E5: 0x7259,\n 0x89E6: 0x753B,\n 0x89E7: 0x81E5,\n 0x89E8: 0x82BD,\n 0x89E9: 0x86FE,\n 0x89EA: 0x8CC0,\n 0x89EB: 0x96C5,\n 0x89EC: 0x9913,\n 0x89ED: 0x99D5,\n 0x89EE: 0x4ECB,\n 0x89EF: 0x4F1A,\n 0x89F0: 0x89E3,\n 0x89F1: 0x56DE,\n 0x89F2: 0x584A,\n 0x89F3: 0x58CA,\n 0x89F4: 0x5EFB,\n 0x89F5: 0x5FEB,\n 0x89F6: 0x602A,\n 0x89F7: 0x6094,\n 0x89F8: 0x6062,\n 0x89F9: 0x61D0,\n 0x89FA: 0x6212,\n 0x89FB: 0x62D0,\n 0x89FC: 0x6539,\n 0x8A40: 0x9B41,\n 0x8A41: 0x6666,\n 0x8A42: 0x68B0,\n 0x8A43: 0x6D77,\n 0x8A44: 0x7070,\n 0x8A45: 0x754C,\n 0x8A46: 0x7686,\n 0x8A47: 0x7D75,\n 0x8A48: 0x82A5,\n 0x8A49: 0x87F9,\n 0x8A4A: 0x958B,\n 0x8A4B: 0x968E,\n 0x8A4C: 0x8C9D,\n 0x8A4D: 0x51F1,\n 0x8A4E: 0x52BE,\n 0x8A4F: 0x5916,\n 0x8A50: 0x54B3,\n 0x8A51: 0x5BB3,\n 0x8A52: 0x5D16,\n 0x8A53: 0x6168,\n 0x8A54: 0x6982,\n 0x8A55: 0x6DAF,\n 0x8A56: 0x788D,\n 0x8A57: 0x84CB,\n 0x8A58: 0x8857,\n 0x8A59: 0x8A72,\n 0x8A5A: 0x93A7,\n 0x8A5B: 0x9AB8,\n 0x8A5C: 0x6D6C,\n 0x8A5D: 0x99A8,\n 0x8A5E: 0x86D9,\n 0x8A5F: 0x57A3,\n 0x8A60: 0x67FF,\n 0x8A61: 0x86CE,\n 0x8A62: 0x920E,\n 0x8A63: 0x5283,\n 0x8A64: 0x5687,\n 0x8A65: 0x5404,\n 0x8A66: 0x5ED3,\n 0x8A67: 0x62E1,\n 0x8A68: 0x64B9,\n 0x8A69: 0x683C,\n 0x8A6A: 0x6838,\n 0x8A6B: 0x6BBB,\n 0x8A6C: 0x7372,\n 0x8A6D: 0x78BA,\n 0x8A6E: 0x7A6B,\n 0x8A6F: 0x899A,\n 0x8A70: 0x89D2,\n 0x8A71: 0x8D6B,\n 0x8A72: 0x8F03,\n 0x8A73: 0x90ED,\n 0x8A74: 0x95A3,\n 0x8A75: 0x9694,\n 0x8A76: 0x9769,\n 0x8A77: 0x5B66,\n 0x8A78: 0x5CB3,\n 0x8A79: 0x697D,\n 0x8A7A: 0x984D,\n 0x8A7B: 0x984E,\n 0x8A7C: 0x639B,\n 0x8A7D: 0x7B20,\n 0x8A7E: 0x6A2B,\n 0x8A80: 0x6A7F,\n 0x8A81: 0x68B6,\n 0x8A82: 0x9C0D,\n 0x8A83: 0x6F5F,\n 0x8A84: 0x5272,\n 0x8A85: 0x559D,\n 0x8A86: 0x6070,\n 0x8A87: 0x62EC,\n 0x8A88: 0x6D3B,\n 0x8A89: 0x6E07,\n 0x8A8A: 0x6ED1,\n 0x8A8B: 0x845B,\n 0x8A8C: 0x8910,\n 0x8A8D: 0x8F44,\n 0x8A8E: 0x4E14,\n 0x8A8F: 0x9C39,\n 0x8A90: 0x53F6,\n 0x8A91: 0x691B,\n 0x8A92: 0x6A3A,\n 0x8A93: 0x9784,\n 0x8A94: 0x682A,\n 0x8A95: 0x515C,\n 0x8A96: 0x7AC3,\n 0x8A97: 0x84B2,\n 0x8A98: 0x91DC,\n 0x8A99: 0x938C,\n 0x8A9A: 0x565B,\n 0x8A9B: 0x9D28,\n 0x8A9C: 0x6822,\n 0x8A9D: 0x8305,\n 0x8A9E: 0x8431,\n 0x8A9F: 0x7CA5,\n 0x8AA0: 0x5208,\n 0x8AA1: 0x82C5,\n 0x8AA2: 0x74E6,\n 0x8AA3: 0x4E7E,\n 0x8AA4: 0x4F83,\n 0x8AA5: 0x51A0,\n 0x8AA6: 0x5BD2,\n 0x8AA7: 0x520A,\n 0x8AA8: 0x52D8,\n 0x8AA9: 0x52E7,\n 0x8AAA: 0x5DFB,\n 0x8AAB: 0x559A,\n 0x8AAC: 0x582A,\n 0x8AAD: 0x59E6,\n 0x8AAE: 0x5B8C,\n 0x8AAF: 0x5B98,\n 0x8AB0: 0x5BDB,\n 0x8AB1: 0x5E72,\n 0x8AB2: 0x5E79,\n 0x8AB3: 0x60A3,\n 0x8AB4: 0x611F,\n 0x8AB5: 0x6163,\n 0x8AB6: 0x61BE,\n 0x8AB7: 0x63DB,\n 0x8AB8: 0x6562,\n 0x8AB9: 0x67D1,\n 0x8ABA: 0x6853,\n 0x8ABB: 0x68FA,\n 0x8ABC: 0x6B3E,\n 0x8ABD: 0x6B53,\n 0x8ABE: 0x6C57,\n 0x8ABF: 0x6F22,\n 0x8AC0: 0x6F97,\n 0x8AC1: 0x6F45,\n 0x8AC2: 0x74B0,\n 0x8AC3: 0x7518,\n 0x8AC4: 0x76E3,\n 0x8AC5: 0x770B,\n 0x8AC6: 0x7AFF,\n 0x8AC7: 0x7BA1,\n 0x8AC8: 0x7C21,\n 0x8AC9: 0x7DE9,\n 0x8ACA: 0x7F36,\n 0x8ACB: 0x7FF0,\n 0x8ACC: 0x809D,\n 0x8ACD: 0x8266,\n 0x8ACE: 0x839E,\n 0x8ACF: 0x89B3,\n 0x8AD0: 0x8ACC,\n 0x8AD1: 0x8CAB,\n 0x8AD2: 0x9084,\n 0x8AD3: 0x9451,\n 0x8AD4: 0x9593,\n 0x8AD5: 0x9591,\n 0x8AD6: 0x95A2,\n 0x8AD7: 0x9665,\n 0x8AD8: 0x97D3,\n 0x8AD9: 0x9928,\n 0x8ADA: 0x8218,\n 0x8ADB: 0x4E38,\n 0x8ADC: 0x542B,\n 0x8ADD: 0x5CB8,\n 0x8ADE: 0x5DCC,\n 0x8ADF: 0x73A9,\n 0x8AE0: 0x764C,\n 0x8AE1: 0x773C,\n 0x8AE2: 0x5CA9,\n 0x8AE3: 0x7FEB,\n 0x8AE4: 0x8D0B,\n 0x8AE5: 0x96C1,\n 0x8AE6: 0x9811,\n 0x8AE7: 0x9854,\n 0x8AE8: 0x9858,\n 0x8AE9: 0x4F01,\n 0x8AEA: 0x4F0E,\n 0x8AEB: 0x5371,\n 0x8AEC: 0x559C,\n 0x8AED: 0x5668,\n 0x8AEE: 0x57FA,\n 0x8AEF: 0x5947,\n 0x8AF0: 0x5B09,\n 0x8AF1: 0x5BC4,\n 0x8AF2: 0x5C90,\n 0x8AF3: 0x5E0C,\n 0x8AF4: 0x5E7E,\n 0x8AF5: 0x5FCC,\n 0x8AF6: 0x63EE,\n 0x8AF7: 0x673A,\n 0x8AF8: 0x65D7,\n 0x8AF9: 0x65E2,\n 0x8AFA: 0x671F,\n 0x8AFB: 0x68CB,\n 0x8AFC: 0x68C4,\n 0x8B40: 0x6A5F,\n 0x8B41: 0x5E30,\n 0x8B42: 0x6BC5,\n 0x8B43: 0x6C17,\n 0x8B44: 0x6C7D,\n 0x8B45: 0x757F,\n 0x8B46: 0x7948,\n 0x8B47: 0x5B63,\n 0x8B48: 0x7A00,\n 0x8B49: 0x7D00,\n 0x8B4A: 0x5FBD,\n 0x8B4B: 0x898F,\n 0x8B4C: 0x8A18,\n 0x8B4D: 0x8CB4,\n 0x8B4E: 0x8D77,\n 0x8B4F: 0x8ECC,\n 0x8B50: 0x8F1D,\n 0x8B51: 0x98E2,\n 0x8B52: 0x9A0E,\n 0x8B53: 0x9B3C,\n 0x8B54: 0x4E80,\n 0x8B55: 0x507D,\n 0x8B56: 0x5100,\n 0x8B57: 0x5993,\n 0x8B58: 0x5B9C,\n 0x8B59: 0x622F,\n 0x8B5A: 0x6280,\n 0x8B5B: 0x64EC,\n 0x8B5C: 0x6B3A,\n 0x8B5D: 0x72A0,\n 0x8B5E: 0x7591,\n 0x8B5F: 0x7947,\n 0x8B60: 0x7FA9,\n 0x8B61: 0x87FB,\n 0x8B62: 0x8ABC,\n 0x8B63: 0x8B70,\n 0x8B64: 0x63AC,\n 0x8B65: 0x83CA,\n 0x8B66: 0x97A0,\n 0x8B67: 0x5409,\n 0x8B68: 0x5403,\n 0x8B69: 0x55AB,\n 0x8B6A: 0x6854,\n 0x8B6B: 0x6A58,\n 0x8B6C: 0x8A70,\n 0x8B6D: 0x7827,\n 0x8B6E: 0x6775,\n 0x8B6F: 0x9ECD,\n 0x8B70: 0x5374,\n 0x8B71: 0x5BA2,\n 0x8B72: 0x811A,\n 0x8B73: 0x8650,\n 0x8B74: 0x9006,\n 0x8B75: 0x4E18,\n 0x8B76: 0x4E45,\n 0x8B77: 0x4EC7,\n 0x8B78: 0x4F11,\n 0x8B79: 0x53CA,\n 0x8B7A: 0x5438,\n 0x8B7B: 0x5BAE,\n 0x8B7C: 0x5F13,\n 0x8B7D: 0x6025,\n 0x8B7E: 0x6551,\n 0x8B80: 0x673D,\n 0x8B81: 0x6C42,\n 0x8B82: 0x6C72,\n 0x8B83: 0x6CE3,\n 0x8B84: 0x7078,\n 0x8B85: 0x7403,\n 0x8B86: 0x7A76,\n 0x8B87: 0x7AAE,\n 0x8B88: 0x7B08,\n 0x8B89: 0x7D1A,\n 0x8B8A: 0x7CFE,\n 0x8B8B: 0x7D66,\n 0x8B8C: 0x65E7,\n 0x8B8D: 0x725B,\n 0x8B8E: 0x53BB,\n 0x8B8F: 0x5C45,\n 0x8B90: 0x5DE8,\n 0x8B91: 0x62D2,\n 0x8B92: 0x62E0,\n 0x8B93: 0x6319,\n 0x8B94: 0x6E20,\n 0x8B95: 0x865A,\n 0x8B96: 0x8A31,\n 0x8B97: 0x8DDD,\n 0x8B98: 0x92F8,\n 0x8B99: 0x6F01,\n 0x8B9A: 0x79A6,\n 0x8B9B: 0x9B5A,\n 0x8B9C: 0x4EA8,\n 0x8B9D: 0x4EAB,\n 0x8B9E: 0x4EAC,\n 0x8B9F: 0x4F9B,\n 0x8BA0: 0x4FA0,\n 0x8BA1: 0x50D1,\n 0x8BA2: 0x5147,\n 0x8BA3: 0x7AF6,\n 0x8BA4: 0x5171,\n 0x8BA5: 0x51F6,\n 0x8BA6: 0x5354,\n 0x8BA7: 0x5321,\n 0x8BA8: 0x537F,\n 0x8BA9: 0x53EB,\n 0x8BAA: 0x55AC,\n 0x8BAB: 0x5883,\n 0x8BAC: 0x5CE1,\n 0x8BAD: 0x5F37,\n 0x8BAE: 0x5F4A,\n 0x8BAF: 0x602F,\n 0x8BB0: 0x6050,\n 0x8BB1: 0x606D,\n 0x8BB2: 0x631F,\n 0x8BB3: 0x6559,\n 0x8BB4: 0x6A4B,\n 0x8BB5: 0x6CC1,\n 0x8BB6: 0x72C2,\n 0x8BB7: 0x72ED,\n 0x8BB8: 0x77EF,\n 0x8BB9: 0x80F8,\n 0x8BBA: 0x8105,\n 0x8BBB: 0x8208,\n 0x8BBC: 0x854E,\n 0x8BBD: 0x90F7,\n 0x8BBE: 0x93E1,\n 0x8BBF: 0x97FF,\n 0x8BC0: 0x9957,\n 0x8BC1: 0x9A5A,\n 0x8BC2: 0x4EF0,\n 0x8BC3: 0x51DD,\n 0x8BC4: 0x5C2D,\n 0x8BC5: 0x6681,\n 0x8BC6: 0x696D,\n 0x8BC7: 0x5C40,\n 0x8BC8: 0x66F2,\n 0x8BC9: 0x6975,\n 0x8BCA: 0x7389,\n 0x8BCB: 0x6850,\n 0x8BCC: 0x7C81,\n 0x8BCD: 0x50C5,\n 0x8BCE: 0x52E4,\n 0x8BCF: 0x5747,\n 0x8BD0: 0x5DFE,\n 0x8BD1: 0x9326,\n 0x8BD2: 0x65A4,\n 0x8BD3: 0x6B23,\n 0x8BD4: 0x6B3D,\n 0x8BD5: 0x7434,\n 0x8BD6: 0x7981,\n 0x8BD7: 0x79BD,\n 0x8BD8: 0x7B4B,\n 0x8BD9: 0x7DCA,\n 0x8BDA: 0x82B9,\n 0x8BDB: 0x83CC,\n 0x8BDC: 0x887F,\n 0x8BDD: 0x895F,\n 0x8BDE: 0x8B39,\n 0x8BDF: 0x8FD1,\n 0x8BE0: 0x91D1,\n 0x8BE1: 0x541F,\n 0x8BE2: 0x9280,\n 0x8BE3: 0x4E5D,\n 0x8BE4: 0x5036,\n 0x8BE5: 0x53E5,\n 0x8BE6: 0x533A,\n 0x8BE7: 0x72D7,\n 0x8BE8: 0x7396,\n 0x8BE9: 0x77E9,\n 0x8BEA: 0x82E6,\n 0x8BEB: 0x8EAF,\n 0x8BEC: 0x99C6,\n 0x8BED: 0x99C8,\n 0x8BEE: 0x99D2,\n 0x8BEF: 0x5177,\n 0x8BF0: 0x611A,\n 0x8BF1: 0x865E,\n 0x8BF2: 0x55B0,\n 0x8BF3: 0x7A7A,\n 0x8BF4: 0x5076,\n 0x8BF5: 0x5BD3,\n 0x8BF6: 0x9047,\n 0x8BF7: 0x9685,\n 0x8BF8: 0x4E32,\n 0x8BF9: 0x6ADB,\n 0x8BFA: 0x91E7,\n 0x8BFB: 0x5C51,\n 0x8BFC: 0x5C48,\n 0x8C40: 0x6398,\n 0x8C41: 0x7A9F,\n 0x8C42: 0x6C93,\n 0x8C43: 0x9774,\n 0x8C44: 0x8F61,\n 0x8C45: 0x7AAA,\n 0x8C46: 0x718A,\n 0x8C47: 0x9688,\n 0x8C48: 0x7C82,\n 0x8C49: 0x6817,\n 0x8C4A: 0x7E70,\n 0x8C4B: 0x6851,\n 0x8C4C: 0x936C,\n 0x8C4D: 0x52F2,\n 0x8C4E: 0x541B,\n 0x8C4F: 0x85AB,\n 0x8C50: 0x8A13,\n 0x8C51: 0x7FA4,\n 0x8C52: 0x8ECD,\n 0x8C53: 0x90E1,\n 0x8C54: 0x5366,\n 0x8C55: 0x8888,\n 0x8C56: 0x7941,\n 0x8C57: 0x4FC2,\n 0x8C58: 0x50BE,\n 0x8C59: 0x5211,\n 0x8C5A: 0x5144,\n 0x8C5B: 0x5553,\n 0x8C5C: 0x572D,\n 0x8C5D: 0x73EA,\n 0x8C5E: 0x578B,\n 0x8C5F: 0x5951,\n 0x8C60: 0x5F62,\n 0x8C61: 0x5F84,\n 0x8C62: 0x6075,\n 0x8C63: 0x6176,\n 0x8C64: 0x6167,\n 0x8C65: 0x61A9,\n 0x8C66: 0x63B2,\n 0x8C67: 0x643A,\n 0x8C68: 0x656C,\n 0x8C69: 0x666F,\n 0x8C6A: 0x6842,\n 0x8C6B: 0x6E13,\n 0x8C6C: 0x7566,\n 0x8C6D: 0x7A3D,\n 0x8C6E: 0x7CFB,\n 0x8C6F: 0x7D4C,\n 0x8C70: 0x7D99,\n 0x8C71: 0x7E4B,\n 0x8C72: 0x7F6B,\n 0x8C73: 0x830E,\n 0x8C74: 0x834A,\n 0x8C75: 0x86CD,\n 0x8C76: 0x8A08,\n 0x8C77: 0x8A63,\n 0x8C78: 0x8B66,\n 0x8C79: 0x8EFD,\n 0x8C7A: 0x981A,\n 0x8C7B: 0x9D8F,\n 0x8C7C: 0x82B8,\n 0x8C7D: 0x8FCE,\n 0x8C7E: 0x9BE8,\n 0x8C80: 0x5287,\n 0x8C81: 0x621F,\n 0x8C82: 0x6483,\n 0x8C83: 0x6FC0,\n 0x8C84: 0x9699,\n 0x8C85: 0x6841,\n 0x8C86: 0x5091,\n 0x8C87: 0x6B20,\n 0x8C88: 0x6C7A,\n 0x8C89: 0x6F54,\n 0x8C8A: 0x7A74,\n 0x8C8B: 0x7D50,\n 0x8C8C: 0x8840,\n 0x8C8D: 0x8A23,\n 0x8C8E: 0x6708,\n 0x8C8F: 0x4EF6,\n 0x8C90: 0x5039,\n 0x8C91: 0x5026,\n 0x8C92: 0x5065,\n 0x8C93: 0x517C,\n 0x8C94: 0x5238,\n 0x8C95: 0x5263,\n 0x8C96: 0x55A7,\n 0x8C97: 0x570F,\n 0x8C98: 0x5805,\n 0x8C99: 0x5ACC,\n 0x8C9A: 0x5EFA,\n 0x8C9B: 0x61B2,\n 0x8C9C: 0x61F8,\n 0x8C9D: 0x62F3,\n 0x8C9E: 0x6372,\n 0x8C9F: 0x691C,\n 0x8CA0: 0x6A29,\n 0x8CA1: 0x727D,\n 0x8CA2: 0x72AC,\n 0x8CA3: 0x732E,\n 0x8CA4: 0x7814,\n 0x8CA5: 0x786F,\n 0x8CA6: 0x7D79,\n 0x8CA7: 0x770C,\n 0x8CA8: 0x80A9,\n 0x8CA9: 0x898B,\n 0x8CAA: 0x8B19,\n 0x8CAB: 0x8CE2,\n 0x8CAC: 0x8ED2,\n 0x8CAD: 0x9063,\n 0x8CAE: 0x9375,\n 0x8CAF: 0x967A,\n 0x8CB0: 0x9855,\n 0x8CB1: 0x9A13,\n 0x8CB2: 0x9E78,\n 0x8CB3: 0x5143,\n 0x8CB4: 0x539F,\n 0x8CB5: 0x53B3,\n 0x8CB6: 0x5E7B,\n 0x8CB7: 0x5F26,\n 0x8CB8: 0x6E1B,\n 0x8CB9: 0x6E90,\n 0x8CBA: 0x7384,\n 0x8CBB: 0x73FE,\n 0x8CBC: 0x7D43,\n 0x8CBD: 0x8237,\n 0x8CBE: 0x8A00,\n 0x8CBF: 0x8AFA,\n 0x8CC0: 0x9650,\n 0x8CC1: 0x4E4E,\n 0x8CC2: 0x500B,\n 0x8CC3: 0x53E4,\n 0x8CC4: 0x547C,\n 0x8CC5: 0x56FA,\n 0x8CC6: 0x59D1,\n 0x8CC7: 0x5B64,\n 0x8CC8: 0x5DF1,\n 0x8CC9: 0x5EAB,\n 0x8CCA: 0x5F27,\n 0x8CCB: 0x6238,\n 0x8CCC: 0x6545,\n 0x8CCD: 0x67AF,\n 0x8CCE: 0x6E56,\n 0x8CCF: 0x72D0,\n 0x8CD0: 0x7CCA,\n 0x8CD1: 0x88B4,\n 0x8CD2: 0x80A1,\n 0x8CD3: 0x80E1,\n 0x8CD4: 0x83F0,\n 0x8CD5: 0x864E,\n 0x8CD6: 0x8A87,\n 0x8CD7: 0x8DE8,\n 0x8CD8: 0x9237,\n 0x8CD9: 0x96C7,\n 0x8CDA: 0x9867,\n 0x8CDB: 0x9F13,\n 0x8CDC: 0x4E94,\n 0x8CDD: 0x4E92,\n 0x8CDE: 0x4F0D,\n 0x8CDF: 0x5348,\n 0x8CE0: 0x5449,\n 0x8CE1: 0x543E,\n 0x8CE2: 0x5A2F,\n 0x8CE3: 0x5F8C,\n 0x8CE4: 0x5FA1,\n 0x8CE5: 0x609F,\n 0x8CE6: 0x68A7,\n 0x8CE7: 0x6A8E,\n 0x8CE8: 0x745A,\n 0x8CE9: 0x7881,\n 0x8CEA: 0x8A9E,\n 0x8CEB: 0x8AA4,\n 0x8CEC: 0x8B77,\n 0x8CED: 0x9190,\n 0x8CEE: 0x4E5E,\n 0x8CEF: 0x9BC9,\n 0x8CF0: 0x4EA4,\n 0x8CF1: 0x4F7C,\n 0x8CF2: 0x4FAF,\n 0x8CF3: 0x5019,\n 0x8CF4: 0x5016,\n 0x8CF5: 0x5149,\n 0x8CF6: 0x516C,\n 0x8CF7: 0x529F,\n 0x8CF8: 0x52B9,\n 0x8CF9: 0x52FE,\n 0x8CFA: 0x539A,\n 0x8CFB: 0x53E3,\n 0x8CFC: 0x5411,\n 0x8D40: 0x540E,\n 0x8D41: 0x5589,\n 0x8D42: 0x5751,\n 0x8D43: 0x57A2,\n 0x8D44: 0x597D,\n 0x8D45: 0x5B54,\n 0x8D46: 0x5B5D,\n 0x8D47: 0x5B8F,\n 0x8D48: 0x5DE5,\n 0x8D49: 0x5DE7,\n 0x8D4A: 0x5DF7,\n 0x8D4B: 0x5E78,\n 0x8D4C: 0x5E83,\n 0x8D4D: 0x5E9A,\n 0x8D4E: 0x5EB7,\n 0x8D4F: 0x5F18,\n 0x8D50: 0x6052,\n 0x8D51: 0x614C,\n 0x8D52: 0x6297,\n 0x8D53: 0x62D8,\n 0x8D54: 0x63A7,\n 0x8D55: 0x653B,\n 0x8D56: 0x6602,\n 0x8D57: 0x6643,\n 0x8D58: 0x66F4,\n 0x8D59: 0x676D,\n 0x8D5A: 0x6821,\n 0x8D5B: 0x6897,\n 0x8D5C: 0x69CB,\n 0x8D5D: 0x6C5F,\n 0x8D5E: 0x6D2A,\n 0x8D5F: 0x6D69,\n 0x8D60: 0x6E2F,\n 0x8D61: 0x6E9D,\n 0x8D62: 0x7532,\n 0x8D63: 0x7687,\n 0x8D64: 0x786C,\n 0x8D65: 0x7A3F,\n 0x8D66: 0x7CE0,\n 0x8D67: 0x7D05,\n 0x8D68: 0x7D18,\n 0x8D69: 0x7D5E,\n 0x8D6A: 0x7DB1,\n 0x8D6B: 0x8015,\n 0x8D6C: 0x8003,\n 0x8D6D: 0x80AF,\n 0x8D6E: 0x80B1,\n 0x8D6F: 0x8154,\n 0x8D70: 0x818F,\n 0x8D71: 0x822A,\n 0x8D72: 0x8352,\n 0x8D73: 0x884C,\n 0x8D74: 0x8861,\n 0x8D75: 0x8B1B,\n 0x8D76: 0x8CA2,\n 0x8D77: 0x8CFC,\n 0x8D78: 0x90CA,\n 0x8D79: 0x9175,\n 0x8D7A: 0x9271,\n 0x8D7B: 0x783F,\n 0x8D7C: 0x92FC,\n 0x8D7D: 0x95A4,\n 0x8D7E: 0x964D,\n 0x8D80: 0x9805,\n 0x8D81: 0x9999,\n 0x8D82: 0x9AD8,\n 0x8D83: 0x9D3B,\n 0x8D84: 0x525B,\n 0x8D85: 0x52AB,\n 0x8D86: 0x53F7,\n 0x8D87: 0x5408,\n 0x8D88: 0x58D5,\n 0x8D89: 0x62F7,\n 0x8D8A: 0x6FE0,\n 0x8D8B: 0x8C6A,\n 0x8D8C: 0x8F5F,\n 0x8D8D: 0x9EB9,\n 0x8D8E: 0x514B,\n 0x8D8F: 0x523B,\n 0x8D90: 0x544A,\n 0x8D91: 0x56FD,\n 0x8D92: 0x7A40,\n 0x8D93: 0x9177,\n 0x8D94: 0x9D60,\n 0x8D95: 0x9ED2,\n 0x8D96: 0x7344,\n 0x8D97: 0x6F09,\n 0x8D98: 0x8170,\n 0x8D99: 0x7511,\n 0x8D9A: 0x5FFD,\n 0x8D9B: 0x60DA,\n 0x8D9C: 0x9AA8,\n 0x8D9D: 0x72DB,\n 0x8D9E: 0x8FBC,\n 0x8D9F: 0x6B64,\n 0x8DA0: 0x9803,\n 0x8DA1: 0x4ECA,\n 0x8DA2: 0x56F0,\n 0x8DA3: 0x5764,\n 0x8DA4: 0x58BE,\n 0x8DA5: 0x5A5A,\n 0x8DA6: 0x6068,\n 0x8DA7: 0x61C7,\n 0x8DA8: 0x660F,\n 0x8DA9: 0x6606,\n 0x8DAA: 0x6839,\n 0x8DAB: 0x68B1,\n 0x8DAC: 0x6DF7,\n 0x8DAD: 0x75D5,\n 0x8DAE: 0x7D3A,\n 0x8DAF: 0x826E,\n 0x8DB0: 0x9B42,\n 0x8DB1: 0x4E9B,\n 0x8DB2: 0x4F50,\n 0x8DB3: 0x53C9,\n 0x8DB4: 0x5506,\n 0x8DB5: 0x5D6F,\n 0x8DB6: 0x5DE6,\n 0x8DB7: 0x5DEE,\n 0x8DB8: 0x67FB,\n 0x8DB9: 0x6C99,\n 0x8DBA: 0x7473,\n 0x8DBB: 0x7802,\n 0x8DBC: 0x8A50,\n 0x8DBD: 0x9396,\n 0x8DBE: 0x88DF,\n 0x8DBF: 0x5750,\n 0x8DC0: 0x5EA7,\n 0x8DC1: 0x632B,\n 0x8DC2: 0x50B5,\n 0x8DC3: 0x50AC,\n 0x8DC4: 0x518D,\n 0x8DC5: 0x6700,\n 0x8DC6: 0x54C9,\n 0x8DC7: 0x585E,\n 0x8DC8: 0x59BB,\n 0x8DC9: 0x5BB0,\n 0x8DCA: 0x5F69,\n 0x8DCB: 0x624D,\n 0x8DCC: 0x63A1,\n 0x8DCD: 0x683D,\n 0x8DCE: 0x6B73,\n 0x8DCF: 0x6E08,\n 0x8DD0: 0x707D,\n 0x8DD1: 0x91C7,\n 0x8DD2: 0x7280,\n 0x8DD3: 0x7815,\n 0x8DD4: 0x7826,\n 0x8DD5: 0x796D,\n 0x8DD6: 0x658E,\n 0x8DD7: 0x7D30,\n 0x8DD8: 0x83DC,\n 0x8DD9: 0x88C1,\n 0x8DDA: 0x8F09,\n 0x8DDB: 0x969B,\n 0x8DDC: 0x5264,\n 0x8DDD: 0x5728,\n 0x8DDE: 0x6750,\n 0x8DDF: 0x7F6A,\n 0x8DE0: 0x8CA1,\n 0x8DE1: 0x51B4,\n 0x8DE2: 0x5742,\n 0x8DE3: 0x962A,\n 0x8DE4: 0x583A,\n 0x8DE5: 0x698A,\n 0x8DE6: 0x80B4,\n 0x8DE7: 0x54B2,\n 0x8DE8: 0x5D0E,\n 0x8DE9: 0x57FC,\n 0x8DEA: 0x7895,\n 0x8DEB: 0x9DFA,\n 0x8DEC: 0x4F5C,\n 0x8DED: 0x524A,\n 0x8DEE: 0x548B,\n 0x8DEF: 0x643E,\n 0x8DF0: 0x6628,\n 0x8DF1: 0x6714,\n 0x8DF2: 0x67F5,\n 0x8DF3: 0x7A84,\n 0x8DF4: 0x7B56,\n 0x8DF5: 0x7D22,\n 0x8DF6: 0x932F,\n 0x8DF7: 0x685C,\n 0x8DF8: 0x9BAD,\n 0x8DF9: 0x7B39,\n 0x8DFA: 0x5319,\n 0x8DFB: 0x518A,\n 0x8DFC: 0x5237,\n 0x8E40: 0x5BDF,\n 0x8E41: 0x62F6,\n 0x8E42: 0x64AE,\n 0x8E43: 0x64E6,\n 0x8E44: 0x672D,\n 0x8E45: 0x6BBA,\n 0x8E46: 0x85A9,\n 0x8E47: 0x96D1,\n 0x8E48: 0x7690,\n 0x8E49: 0x9BD6,\n 0x8E4A: 0x634C,\n 0x8E4B: 0x9306,\n 0x8E4C: 0x9BAB,\n 0x8E4D: 0x76BF,\n 0x8E4E: 0x6652,\n 0x8E4F: 0x4E09,\n 0x8E50: 0x5098,\n 0x8E51: 0x53C2,\n 0x8E52: 0x5C71,\n 0x8E53: 0x60E8,\n 0x8E54: 0x6492,\n 0x8E55: 0x6563,\n 0x8E56: 0x685F,\n 0x8E57: 0x71E6,\n 0x8E58: 0x73CA,\n 0x8E59: 0x7523,\n 0x8E5A: 0x7B97,\n 0x8E5B: 0x7E82,\n 0x8E5C: 0x8695,\n 0x8E5D: 0x8B83,\n 0x8E5E: 0x8CDB,\n 0x8E5F: 0x9178,\n 0x8E60: 0x9910,\n 0x8E61: 0x65AC,\n 0x8E62: 0x66AB,\n 0x8E63: 0x6B8B,\n 0x8E64: 0x4ED5,\n 0x8E65: 0x4ED4,\n 0x8E66: 0x4F3A,\n 0x8E67: 0x4F7F,\n 0x8E68: 0x523A,\n 0x8E69: 0x53F8,\n 0x8E6A: 0x53F2,\n 0x8E6B: 0x55E3,\n 0x8E6C: 0x56DB,\n 0x8E6D: 0x58EB,\n 0x8E6E: 0x59CB,\n 0x8E6F: 0x59C9,\n 0x8E70: 0x59FF,\n 0x8E71: 0x5B50,\n 0x8E72: 0x5C4D,\n 0x8E73: 0x5E02,\n 0x8E74: 0x5E2B,\n 0x8E75: 0x5FD7,\n 0x8E76: 0x601D,\n 0x8E77: 0x6307,\n 0x8E78: 0x652F,\n 0x8E79: 0x5B5C,\n 0x8E7A: 0x65AF,\n 0x8E7B: 0x65BD,\n 0x8E7C: 0x65E8,\n 0x8E7D: 0x679D,\n 0x8E7E: 0x6B62,\n 0x8E80: 0x6B7B,\n 0x8E81: 0x6C0F,\n 0x8E82: 0x7345,\n 0x8E83: 0x7949,\n 0x8E84: 0x79C1,\n 0x8E85: 0x7CF8,\n 0x8E86: 0x7D19,\n 0x8E87: 0x7D2B,\n 0x8E88: 0x80A2,\n 0x8E89: 0x8102,\n 0x8E8A: 0x81F3,\n 0x8E8B: 0x8996,\n 0x8E8C: 0x8A5E,\n 0x8E8D: 0x8A69,\n 0x8E8E: 0x8A66,\n 0x8E8F: 0x8A8C,\n 0x8E90: 0x8AEE,\n 0x8E91: 0x8CC7,\n 0x8E92: 0x8CDC,\n 0x8E93: 0x96CC,\n 0x8E94: 0x98FC,\n 0x8E95: 0x6B6F,\n 0x8E96: 0x4E8B,\n 0x8E97: 0x4F3C,\n 0x8E98: 0x4F8D,\n 0x8E99: 0x5150,\n 0x8E9A: 0x5B57,\n 0x8E9B: 0x5BFA,\n 0x8E9C: 0x6148,\n 0x8E9D: 0x6301,\n 0x8E9E: 0x6642,\n 0x8E9F: 0x6B21,\n 0x8EA0: 0x6ECB,\n 0x8EA1: 0x6CBB,\n 0x8EA2: 0x723E,\n 0x8EA3: 0x74BD,\n 0x8EA4: 0x75D4,\n 0x8EA5: 0x78C1,\n 0x8EA6: 0x793A,\n 0x8EA7: 0x800C,\n 0x8EA8: 0x8033,\n 0x8EA9: 0x81EA,\n 0x8EAA: 0x8494,\n 0x8EAB: 0x8F9E,\n 0x8EAC: 0x6C50,\n 0x8EAD: 0x9E7F,\n 0x8EAE: 0x5F0F,\n 0x8EAF: 0x8B58,\n 0x8EB0: 0x9D2B,\n 0x8EB1: 0x7AFA,\n 0x8EB2: 0x8EF8,\n 0x8EB3: 0x5B8D,\n 0x8EB4: 0x96EB,\n 0x8EB5: 0x4E03,\n 0x8EB6: 0x53F1,\n 0x8EB7: 0x57F7,\n 0x8EB8: 0x5931,\n 0x8EB9: 0x5AC9,\n 0x8EBA: 0x5BA4,\n 0x8EBB: 0x6089,\n 0x8EBC: 0x6E7F,\n 0x8EBD: 0x6F06,\n 0x8EBE: 0x75BE,\n 0x8EBF: 0x8CEA,\n 0x8EC0: 0x5B9F,\n 0x8EC1: 0x8500,\n 0x8EC2: 0x7BE0,\n 0x8EC3: 0x5072,\n 0x8EC4: 0x67F4,\n 0x8EC5: 0x829D,\n 0x8EC6: 0x5C61,\n 0x8EC7: 0x854A,\n 0x8EC8: 0x7E1E,\n 0x8EC9: 0x820E,\n 0x8ECA: 0x5199,\n 0x8ECB: 0x5C04,\n 0x8ECC: 0x6368,\n 0x8ECD: 0x8D66,\n 0x8ECE: 0x659C,\n 0x8ECF: 0x716E,\n 0x8ED0: 0x793E,\n 0x8ED1: 0x7D17,\n 0x8ED2: 0x8005,\n 0x8ED3: 0x8B1D,\n 0x8ED4: 0x8ECA,\n 0x8ED5: 0x906E,\n 0x8ED6: 0x86C7,\n 0x8ED7: 0x90AA,\n 0x8ED8: 0x501F,\n 0x8ED9: 0x52FA,\n 0x8EDA: 0x5C3A,\n 0x8EDB: 0x6753,\n 0x8EDC: 0x707C,\n 0x8EDD: 0x7235,\n 0x8EDE: 0x914C,\n 0x8EDF: 0x91C8,\n 0x8EE0: 0x932B,\n 0x8EE1: 0x82E5,\n 0x8EE2: 0x5BC2,\n 0x8EE3: 0x5F31,\n 0x8EE4: 0x60F9,\n 0x8EE5: 0x4E3B,\n 0x8EE6: 0x53D6,\n 0x8EE7: 0x5B88,\n 0x8EE8: 0x624B,\n 0x8EE9: 0x6731,\n 0x8EEA: 0x6B8A,\n 0x8EEB: 0x72E9,\n 0x8EEC: 0x73E0,\n 0x8EED: 0x7A2E,\n 0x8EEE: 0x816B,\n 0x8EEF: 0x8DA3,\n 0x8EF0: 0x9152,\n 0x8EF1: 0x9996,\n 0x8EF2: 0x5112,\n 0x8EF3: 0x53D7,\n 0x8EF4: 0x546A,\n 0x8EF5: 0x5BFF,\n 0x8EF6: 0x6388,\n 0x8EF7: 0x6A39,\n 0x8EF8: 0x7DAC,\n 0x8EF9: 0x9700,\n 0x8EFA: 0x56DA,\n 0x8EFB: 0x53CE,\n 0x8EFC: 0x5468,\n 0x8F40: 0x5B97,\n 0x8F41: 0x5C31,\n 0x8F42: 0x5DDE,\n 0x8F43: 0x4FEE,\n 0x8F44: 0x6101,\n 0x8F45: 0x62FE,\n 0x8F46: 0x6D32,\n 0x8F47: 0x79C0,\n 0x8F48: 0x79CB,\n 0x8F49: 0x7D42,\n 0x8F4A: 0x7E4D,\n 0x8F4B: 0x7FD2,\n 0x8F4C: 0x81ED,\n 0x8F4D: 0x821F,\n 0x8F4E: 0x8490,\n 0x8F4F: 0x8846,\n 0x8F50: 0x8972,\n 0x8F51: 0x8B90,\n 0x8F52: 0x8E74,\n 0x8F53: 0x8F2F,\n 0x8F54: 0x9031,\n 0x8F55: 0x914B,\n 0x8F56: 0x916C,\n 0x8F57: 0x96C6,\n 0x8F58: 0x919C,\n 0x8F59: 0x4EC0,\n 0x8F5A: 0x4F4F,\n 0x8F5B: 0x5145,\n 0x8F5C: 0x5341,\n 0x8F5D: 0x5F93,\n 0x8F5E: 0x620E,\n 0x8F5F: 0x67D4,\n 0x8F60: 0x6C41,\n 0x8F61: 0x6E0B,\n 0x8F62: 0x7363,\n 0x8F63: 0x7E26,\n 0x8F64: 0x91CD,\n 0x8F65: 0x9283,\n 0x8F66: 0x53D4,\n 0x8F67: 0x5919,\n 0x8F68: 0x5BBF,\n 0x8F69: 0x6DD1,\n 0x8F6A: 0x795D,\n 0x8F6B: 0x7E2E,\n 0x8F6C: 0x7C9B,\n 0x8F6D: 0x587E,\n 0x8F6E: 0x719F,\n 0x8F6F: 0x51FA,\n 0x8F70: 0x8853,\n 0x8F71: 0x8FF0,\n 0x8F72: 0x4FCA,\n 0x8F73: 0x5CFB,\n 0x8F74: 0x6625,\n 0x8F75: 0x77AC,\n 0x8F76: 0x7AE3,\n 0x8F77: 0x821C,\n 0x8F78: 0x99FF,\n 0x8F79: 0x51C6,\n 0x8F7A: 0x5FAA,\n 0x8F7B: 0x65EC,\n 0x8F7C: 0x696F,\n 0x8F7D: 0x6B89,\n 0x8F7E: 0x6DF3,\n 0x8F80: 0x6E96,\n 0x8F81: 0x6F64,\n 0x8F82: 0x76FE,\n 0x8F83: 0x7D14,\n 0x8F84: 0x5DE1,\n 0x8F85: 0x9075,\n 0x8F86: 0x9187,\n 0x8F87: 0x9806,\n 0x8F88: 0x51E6,\n 0x8F89: 0x521D,\n 0x8F8A: 0x6240,\n 0x8F8B: 0x6691,\n 0x8F8C: 0x66D9,\n 0x8F8D: 0x6E1A,\n 0x8F8E: 0x5EB6,\n 0x8F8F: 0x7DD2,\n 0x8F90: 0x7F72,\n 0x8F91: 0x66F8,\n 0x8F92: 0x85AF,\n 0x8F93: 0x85F7,\n 0x8F94: 0x8AF8,\n 0x8F95: 0x52A9,\n 0x8F96: 0x53D9,\n 0x8F97: 0x5973,\n 0x8F98: 0x5E8F,\n 0x8F99: 0x5F90,\n 0x8F9A: 0x6055,\n 0x8F9B: 0x92E4,\n 0x8F9C: 0x9664,\n 0x8F9D: 0x50B7,\n 0x8F9E: 0x511F,\n 0x8F9F: 0x52DD,\n 0x8FA0: 0x5320,\n 0x8FA1: 0x5347,\n 0x8FA2: 0x53EC,\n 0x8FA3: 0x54E8,\n 0x8FA4: 0x5546,\n 0x8FA5: 0x5531,\n 0x8FA6: 0x5617,\n 0x8FA7: 0x5968,\n 0x8FA8: 0x59BE,\n 0x8FA9: 0x5A3C,\n 0x8FAA: 0x5BB5,\n 0x8FAB: 0x5C06,\n 0x8FAC: 0x5C0F,\n 0x8FAD: 0x5C11,\n 0x8FAE: 0x5C1A,\n 0x8FAF: 0x5E84,\n 0x8FB0: 0x5E8A,\n 0x8FB1: 0x5EE0,\n 0x8FB2: 0x5F70,\n 0x8FB3: 0x627F,\n 0x8FB4: 0x6284,\n 0x8FB5: 0x62DB,\n 0x8FB6: 0x638C,\n 0x8FB7: 0x6377,\n 0x8FB8: 0x6607,\n 0x8FB9: 0x660C,\n 0x8FBA: 0x662D,\n 0x8FBB: 0x6676,\n 0x8FBC: 0x677E,\n 0x8FBD: 0x68A2,\n 0x8FBE: 0x6A1F,\n 0x8FBF: 0x6A35,\n 0x8FC0: 0x6CBC,\n 0x8FC1: 0x6D88,\n 0x8FC2: 0x6E09,\n 0x8FC3: 0x6E58,\n 0x8FC4: 0x713C,\n 0x8FC5: 0x7126,\n 0x8FC6: 0x7167,\n 0x8FC7: 0x75C7,\n 0x8FC8: 0x7701,\n 0x8FC9: 0x785D,\n 0x8FCA: 0x7901,\n 0x8FCB: 0x7965,\n 0x8FCC: 0x79F0,\n 0x8FCD: 0x7AE0,\n 0x8FCE: 0x7B11,\n 0x8FCF: 0x7CA7,\n 0x8FD0: 0x7D39,\n 0x8FD1: 0x8096,\n 0x8FD2: 0x83D6,\n 0x8FD3: 0x848B,\n 0x8FD4: 0x8549,\n 0x8FD5: 0x885D,\n 0x8FD6: 0x88F3,\n 0x8FD7: 0x8A1F,\n 0x8FD8: 0x8A3C,\n 0x8FD9: 0x8A54,\n 0x8FDA: 0x8A73,\n 0x8FDB: 0x8C61,\n 0x8FDC: 0x8CDE,\n 0x8FDD: 0x91A4,\n 0x8FDE: 0x9266,\n 0x8FDF: 0x937E,\n 0x8FE0: 0x9418,\n 0x8FE1: 0x969C,\n 0x8FE2: 0x9798,\n 0x8FE3: 0x4E0A,\n 0x8FE4: 0x4E08,\n 0x8FE5: 0x4E1E,\n 0x8FE6: 0x4E57,\n 0x8FE7: 0x5197,\n 0x8FE8: 0x5270,\n 0x8FE9: 0x57CE,\n 0x8FEA: 0x5834,\n 0x8FEB: 0x58CC,\n 0x8FEC: 0x5B22,\n 0x8FED: 0x5E38,\n 0x8FEE: 0x60C5,\n 0x8FEF: 0x64FE,\n 0x8FF0: 0x6761,\n 0x8FF1: 0x6756,\n 0x8FF2: 0x6D44,\n 0x8FF3: 0x72B6,\n 0x8FF4: 0x7573,\n 0x8FF5: 0x7A63,\n 0x8FF6: 0x84B8,\n 0x8FF7: 0x8B72,\n 0x8FF8: 0x91B8,\n 0x8FF9: 0x9320,\n 0x8FFA: 0x5631,\n 0x8FFB: 0x57F4,\n 0x8FFC: 0x98FE,\n 0x9040: 0x62ED,\n 0x9041: 0x690D,\n 0x9042: 0x6B96,\n 0x9043: 0x71ED,\n 0x9044: 0x7E54,\n 0x9045: 0x8077,\n 0x9046: 0x8272,\n 0x9047: 0x89E6,\n 0x9048: 0x98DF,\n 0x9049: 0x8755,\n 0x904A: 0x8FB1,\n 0x904B: 0x5C3B,\n 0x904C: 0x4F38,\n 0x904D: 0x4FE1,\n 0x904E: 0x4FB5,\n 0x904F: 0x5507,\n 0x9050: 0x5A20,\n 0x9051: 0x5BDD,\n 0x9052: 0x5BE9,\n 0x9053: 0x5FC3,\n 0x9054: 0x614E,\n 0x9055: 0x632F,\n 0x9056: 0x65B0,\n 0x9057: 0x664B,\n 0x9058: 0x68EE,\n 0x9059: 0x699B,\n 0x905A: 0x6D78,\n 0x905B: 0x6DF1,\n 0x905C: 0x7533,\n 0x905D: 0x75B9,\n 0x905E: 0x771F,\n 0x905F: 0x795E,\n 0x9060: 0x79E6,\n 0x9061: 0x7D33,\n 0x9062: 0x81E3,\n 0x9063: 0x82AF,\n 0x9064: 0x85AA,\n 0x9065: 0x89AA,\n 0x9066: 0x8A3A,\n 0x9067: 0x8EAB,\n 0x9068: 0x8F9B,\n 0x9069: 0x9032,\n 0x906A: 0x91DD,\n 0x906B: 0x9707,\n 0x906C: 0x4EBA,\n 0x906D: 0x4EC1,\n 0x906E: 0x5203,\n 0x906F: 0x5875,\n 0x9070: 0x58EC,\n 0x9071: 0x5C0B,\n 0x9072: 0x751A,\n 0x9073: 0x5C3D,\n 0x9074: 0x814E,\n 0x9075: 0x8A0A,\n 0x9076: 0x8FC5,\n 0x9077: 0x9663,\n 0x9078: 0x976D,\n 0x9079: 0x7B25,\n 0x907A: 0x8ACF,\n 0x907B: 0x9808,\n 0x907C: 0x9162,\n 0x907D: 0x56F3,\n 0x907E: 0x53A8,\n 0x9080: 0x9017,\n 0x9081: 0x5439,\n 0x9082: 0x5782,\n 0x9083: 0x5E25,\n 0x9084: 0x63A8,\n 0x9085: 0x6C34,\n 0x9086: 0x708A,\n 0x9087: 0x7761,\n 0x9088: 0x7C8B,\n 0x9089: 0x7FE0,\n 0x908A: 0x8870,\n 0x908B: 0x9042,\n 0x908C: 0x9154,\n 0x908D: 0x9310,\n 0x908E: 0x9318,\n 0x908F: 0x968F,\n 0x9090: 0x745E,\n 0x9091: 0x9AC4,\n 0x9092: 0x5D07,\n 0x9093: 0x5D69,\n 0x9094: 0x6570,\n 0x9095: 0x67A2,\n 0x9096: 0x8DA8,\n 0x9097: 0x96DB,\n 0x9098: 0x636E,\n 0x9099: 0x6749,\n 0x909A: 0x6919,\n 0x909B: 0x83C5,\n 0x909C: 0x9817,\n 0x909D: 0x96C0,\n 0x909E: 0x88FE,\n 0x909F: 0x6F84,\n 0x90A0: 0x647A,\n 0x90A1: 0x5BF8,\n 0x90A2: 0x4E16,\n 0x90A3: 0x702C,\n 0x90A4: 0x755D,\n 0x90A5: 0x662F,\n 0x90A6: 0x51C4,\n 0x90A7: 0x5236,\n 0x90A8: 0x52E2,\n 0x90A9: 0x59D3,\n 0x90AA: 0x5F81,\n 0x90AB: 0x6027,\n 0x90AC: 0x6210,\n 0x90AD: 0x653F,\n 0x90AE: 0x6574,\n 0x90AF: 0x661F,\n 0x90B0: 0x6674,\n 0x90B1: 0x68F2,\n 0x90B2: 0x6816,\n 0x90B3: 0x6B63,\n 0x90B4: 0x6E05,\n 0x90B5: 0x7272,\n 0x90B6: 0x751F,\n 0x90B7: 0x76DB,\n 0x90B8: 0x7CBE,\n 0x90B9: 0x8056,\n 0x90BA: 0x58F0,\n 0x90BB: 0x88FD,\n 0x90BC: 0x897F,\n 0x90BD: 0x8AA0,\n 0x90BE: 0x8A93,\n 0x90BF: 0x8ACB,\n 0x90C0: 0x901D,\n 0x90C1: 0x9192,\n 0x90C2: 0x9752,\n 0x90C3: 0x9759,\n 0x90C4: 0x6589,\n 0x90C5: 0x7A0E,\n 0x90C6: 0x8106,\n 0x90C7: 0x96BB,\n 0x90C8: 0x5E2D,\n 0x90C9: 0x60DC,\n 0x90CA: 0x621A,\n 0x90CB: 0x65A5,\n 0x90CC: 0x6614,\n 0x90CD: 0x6790,\n 0x90CE: 0x77F3,\n 0x90CF: 0x7A4D,\n 0x90D0: 0x7C4D,\n 0x90D1: 0x7E3E,\n 0x90D2: 0x810A,\n 0x90D3: 0x8CAC,\n 0x90D4: 0x8D64,\n 0x90D5: 0x8DE1,\n 0x90D6: 0x8E5F,\n 0x90D7: 0x78A9,\n 0x90D8: 0x5207,\n 0x90D9: 0x62D9,\n 0x90DA: 0x63A5,\n 0x90DB: 0x6442,\n 0x90DC: 0x6298,\n 0x90DD: 0x8A2D,\n 0x90DE: 0x7A83,\n 0x90DF: 0x7BC0,\n 0x90E0: 0x8AAC,\n 0x90E1: 0x96EA,\n 0x90E2: 0x7D76,\n 0x90E3: 0x820C,\n 0x90E4: 0x8749,\n 0x90E5: 0x4ED9,\n 0x90E6: 0x5148,\n 0x90E7: 0x5343,\n 0x90E8: 0x5360,\n 0x90E9: 0x5BA3,\n 0x90EA: 0x5C02,\n 0x90EB: 0x5C16,\n 0x90EC: 0x5DDD,\n 0x90ED: 0x6226,\n 0x90EE: 0x6247,\n 0x90EF: 0x64B0,\n 0x90F0: 0x6813,\n 0x90F1: 0x6834,\n 0x90F2: 0x6CC9,\n 0x90F3: 0x6D45,\n 0x90F4: 0x6D17,\n 0x90F5: 0x67D3,\n 0x90F6: 0x6F5C,\n 0x90F7: 0x714E,\n 0x90F8: 0x717D,\n 0x90F9: 0x65CB,\n 0x90FA: 0x7A7F,\n 0x90FB: 0x7BAD,\n 0x90FC: 0x7DDA,\n 0x9140: 0x7E4A,\n 0x9141: 0x7FA8,\n 0x9142: 0x817A,\n 0x9143: 0x821B,\n 0x9144: 0x8239,\n 0x9145: 0x85A6,\n 0x9146: 0x8A6E,\n 0x9147: 0x8CCE,\n 0x9148: 0x8DF5,\n 0x9149: 0x9078,\n 0x914A: 0x9077,\n 0x914B: 0x92AD,\n 0x914C: 0x9291,\n 0x914D: 0x9583,\n 0x914E: 0x9BAE,\n 0x914F: 0x524D,\n 0x9150: 0x5584,\n 0x9151: 0x6F38,\n 0x9152: 0x7136,\n 0x9153: 0x5168,\n 0x9154: 0x7985,\n 0x9155: 0x7E55,\n 0x9156: 0x81B3,\n 0x9157: 0x7CCE,\n 0x9158: 0x564C,\n 0x9159: 0x5851,\n 0x915A: 0x5CA8,\n 0x915B: 0x63AA,\n 0x915C: 0x66FE,\n 0x915D: 0x66FD,\n 0x915E: 0x695A,\n 0x915F: 0x72D9,\n 0x9160: 0x758F,\n 0x9161: 0x758E,\n 0x9162: 0x790E,\n 0x9163: 0x7956,\n 0x9164: 0x79DF,\n 0x9165: 0x7C97,\n 0x9166: 0x7D20,\n 0x9167: 0x7D44,\n 0x9168: 0x8607,\n 0x9169: 0x8A34,\n 0x916A: 0x963B,\n 0x916B: 0x9061,\n 0x916C: 0x9F20,\n 0x916D: 0x50E7,\n 0x916E: 0x5275,\n 0x916F: 0x53CC,\n 0x9170: 0x53E2,\n 0x9171: 0x5009,\n 0x9172: 0x55AA,\n 0x9173: 0x58EE,\n 0x9174: 0x594F,\n 0x9175: 0x723D,\n 0x9176: 0x5B8B,\n 0x9177: 0x5C64,\n 0x9178: 0x531D,\n 0x9179: 0x60E3,\n 0x917A: 0x60F3,\n 0x917B: 0x635C,\n 0x917C: 0x6383,\n 0x917D: 0x633F,\n 0x917E: 0x63BB,\n 0x9180: 0x64CD,\n 0x9181: 0x65E9,\n 0x9182: 0x66F9,\n 0x9183: 0x5DE3,\n 0x9184: 0x69CD,\n 0x9185: 0x69FD,\n 0x9186: 0x6F15,\n 0x9187: 0x71E5,\n 0x9188: 0x4E89,\n 0x9189: 0x75E9,\n 0x918A: 0x76F8,\n 0x918B: 0x7A93,\n 0x918C: 0x7CDF,\n 0x918D: 0x7DCF,\n 0x918E: 0x7D9C,\n 0x918F: 0x8061,\n 0x9190: 0x8349,\n 0x9191: 0x8358,\n 0x9192: 0x846C,\n 0x9193: 0x84BC,\n 0x9194: 0x85FB,\n 0x9195: 0x88C5,\n 0x9196: 0x8D70,\n 0x9197: 0x9001,\n 0x9198: 0x906D,\n 0x9199: 0x9397,\n 0x919A: 0x971C,\n 0x919B: 0x9A12,\n 0x919C: 0x50CF,\n 0x919D: 0x5897,\n 0x919E: 0x618E,\n 0x919F: 0x81D3,\n 0x91A0: 0x8535,\n 0x91A1: 0x8D08,\n 0x91A2: 0x9020,\n 0x91A3: 0x4FC3,\n 0x91A4: 0x5074,\n 0x91A5: 0x5247,\n 0x91A6: 0x5373,\n 0x91A7: 0x606F,\n 0x91A8: 0x6349,\n 0x91A9: 0x675F,\n 0x91AA: 0x6E2C,\n 0x91AB: 0x8DB3,\n 0x91AC: 0x901F,\n 0x91AD: 0x4FD7,\n 0x91AE: 0x5C5E,\n 0x91AF: 0x8CCA,\n 0x91B0: 0x65CF,\n 0x91B1: 0x7D9A,\n 0x91B2: 0x5352,\n 0x91B3: 0x8896,\n 0x91B4: 0x5176,\n 0x91B5: 0x63C3,\n 0x91B6: 0x5B58,\n 0x91B7: 0x5B6B,\n 0x91B8: 0x5C0A,\n 0x91B9: 0x640D,\n 0x91BA: 0x6751,\n 0x91BB: 0x905C,\n 0x91BC: 0x4ED6,\n 0x91BD: 0x591A,\n 0x91BE: 0x592A,\n 0x91BF: 0x6C70,\n 0x91C0: 0x8A51,\n 0x91C1: 0x553E,\n 0x91C2: 0x5815,\n 0x91C3: 0x59A5,\n 0x91C4: 0x60F0,\n 0x91C5: 0x6253,\n 0x91C6: 0x67C1,\n 0x91C7: 0x8235,\n 0x91C8: 0x6955,\n 0x91C9: 0x9640,\n 0x91CA: 0x99C4,\n 0x91CB: 0x9A28,\n 0x91CC: 0x4F53,\n 0x91CD: 0x5806,\n 0x91CE: 0x5BFE,\n 0x91CF: 0x8010,\n 0x91D0: 0x5CB1,\n 0x91D1: 0x5E2F,\n 0x91D2: 0x5F85,\n 0x91D3: 0x6020,\n 0x91D4: 0x614B,\n 0x91D5: 0x6234,\n 0x91D6: 0x66FF,\n 0x91D7: 0x6CF0,\n 0x91D8: 0x6EDE,\n 0x91D9: 0x80CE,\n 0x91DA: 0x817F,\n 0x91DB: 0x82D4,\n 0x91DC: 0x888B,\n 0x91DD: 0x8CB8,\n 0x91DE: 0x9000,\n 0x91DF: 0x902E,\n 0x91E0: 0x968A,\n 0x91E1: 0x9EDB,\n 0x91E2: 0x9BDB,\n 0x91E3: 0x4EE3,\n 0x91E4: 0x53F0,\n 0x91E5: 0x5927,\n 0x91E6: 0x7B2C,\n 0x91E7: 0x918D,\n 0x91E8: 0x984C,\n 0x91E9: 0x9DF9,\n 0x91EA: 0x6EDD,\n 0x91EB: 0x7027,\n 0x91EC: 0x5353,\n 0x91ED: 0x5544,\n 0x91EE: 0x5B85,\n 0x91EF: 0x6258,\n 0x91F0: 0x629E,\n 0x91F1: 0x62D3,\n 0x91F2: 0x6CA2,\n 0x91F3: 0x6FEF,\n 0x91F4: 0x7422,\n 0x91F5: 0x8A17,\n 0x91F6: 0x9438,\n 0x91F7: 0x6FC1,\n 0x91F8: 0x8AFE,\n 0x91F9: 0x8338,\n 0x91FA: 0x51E7,\n 0x91FB: 0x86F8,\n 0x91FC: 0x53EA,\n 0x9240: 0x53E9,\n 0x9241: 0x4F46,\n 0x9242: 0x9054,\n 0x9243: 0x8FB0,\n 0x9244: 0x596A,\n 0x9245: 0x8131,\n 0x9246: 0x5DFD,\n 0x9247: 0x7AEA,\n 0x9248: 0x8FBF,\n 0x9249: 0x68DA,\n 0x924A: 0x8C37,\n 0x924B: 0x72F8,\n 0x924C: 0x9C48,\n 0x924D: 0x6A3D,\n 0x924E: 0x8AB0,\n 0x924F: 0x4E39,\n 0x9250: 0x5358,\n 0x9251: 0x5606,\n 0x9252: 0x5766,\n 0x9253: 0x62C5,\n 0x9254: 0x63A2,\n 0x9255: 0x65E6,\n 0x9256: 0x6B4E,\n 0x9257: 0x6DE1,\n 0x9258: 0x6E5B,\n 0x9259: 0x70AD,\n 0x925A: 0x77ED,\n 0x925B: 0x7AEF,\n 0x925C: 0x7BAA,\n 0x925D: 0x7DBB,\n 0x925E: 0x803D,\n 0x925F: 0x80C6,\n 0x9260: 0x86CB,\n 0x9261: 0x8A95,\n 0x9262: 0x935B,\n 0x9263: 0x56E3,\n 0x9264: 0x58C7,\n 0x9265: 0x5F3E,\n 0x9266: 0x65AD,\n 0x9267: 0x6696,\n 0x9268: 0x6A80,\n 0x9269: 0x6BB5,\n 0x926A: 0x7537,\n 0x926B: 0x8AC7,\n 0x926C: 0x5024,\n 0x926D: 0x77E5,\n 0x926E: 0x5730,\n 0x926F: 0x5F1B,\n 0x9270: 0x6065,\n 0x9271: 0x667A,\n 0x9272: 0x6C60,\n 0x9273: 0x75F4,\n 0x9274: 0x7A1A,\n 0x9275: 0x7F6E,\n 0x9276: 0x81F4,\n 0x9277: 0x8718,\n 0x9278: 0x9045,\n 0x9279: 0x99B3,\n 0x927A: 0x7BC9,\n 0x927B: 0x755C,\n 0x927C: 0x7AF9,\n 0x927D: 0x7B51,\n 0x927E: 0x84C4,\n 0x9280: 0x9010,\n 0x9281: 0x79E9,\n 0x9282: 0x7A92,\n 0x9283: 0x8336,\n 0x9284: 0x5AE1,\n 0x9285: 0x7740,\n 0x9286: 0x4E2D,\n 0x9287: 0x4EF2,\n 0x9288: 0x5B99,\n 0x9289: 0x5FE0,\n 0x928A: 0x62BD,\n 0x928B: 0x663C,\n 0x928C: 0x67F1,\n 0x928D: 0x6CE8,\n 0x928E: 0x866B,\n 0x928F: 0x8877,\n 0x9290: 0x8A3B,\n 0x9291: 0x914E,\n 0x9292: 0x92F3,\n 0x9293: 0x99D0,\n 0x9294: 0x6A17,\n 0x9295: 0x7026,\n 0x9296: 0x732A,\n 0x9297: 0x82E7,\n 0x9298: 0x8457,\n 0x9299: 0x8CAF,\n 0x929A: 0x4E01,\n 0x929B: 0x5146,\n 0x929C: 0x51CB,\n 0x929D: 0x558B,\n 0x929E: 0x5BF5,\n 0x929F: 0x5E16,\n 0x92A0: 0x5E33,\n 0x92A1: 0x5E81,\n 0x92A2: 0x5F14,\n 0x92A3: 0x5F35,\n 0x92A4: 0x5F6B,\n 0x92A5: 0x5FB4,\n 0x92A6: 0x61F2,\n 0x92A7: 0x6311,\n 0x92A8: 0x66A2,\n 0x92A9: 0x671D,\n 0x92AA: 0x6F6E,\n 0x92AB: 0x7252,\n 0x92AC: 0x753A,\n 0x92AD: 0x773A,\n 0x92AE: 0x8074,\n 0x92AF: 0x8139,\n 0x92B0: 0x8178,\n 0x92B1: 0x8776,\n 0x92B2: 0x8ABF,\n 0x92B3: 0x8ADC,\n 0x92B4: 0x8D85,\n 0x92B5: 0x8DF3,\n 0x92B6: 0x929A,\n 0x92B7: 0x9577,\n 0x92B8: 0x9802,\n 0x92B9: 0x9CE5,\n 0x92BA: 0x52C5,\n 0x92BB: 0x6357,\n 0x92BC: 0x76F4,\n 0x92BD: 0x6715,\n 0x92BE: 0x6C88,\n 0x92BF: 0x73CD,\n 0x92C0: 0x8CC3,\n 0x92C1: 0x93AE,\n 0x92C2: 0x9673,\n 0x92C3: 0x6D25,\n 0x92C4: 0x589C,\n 0x92C5: 0x690E,\n 0x92C6: 0x69CC,\n 0x92C7: 0x8FFD,\n 0x92C8: 0x939A,\n 0x92C9: 0x75DB,\n 0x92CA: 0x901A,\n 0x92CB: 0x585A,\n 0x92CC: 0x6802,\n 0x92CD: 0x63B4,\n 0x92CE: 0x69FB,\n 0x92CF: 0x4F43,\n 0x92D0: 0x6F2C,\n 0x92D1: 0x67D8,\n 0x92D2: 0x8FBB,\n 0x92D3: 0x8526,\n 0x92D4: 0x7DB4,\n 0x92D5: 0x9354,\n 0x92D6: 0x693F,\n 0x92D7: 0x6F70,\n 0x92D8: 0x576A,\n 0x92D9: 0x58F7,\n 0x92DA: 0x5B2C,\n 0x92DB: 0x7D2C,\n 0x92DC: 0x722A,\n 0x92DD: 0x540A,\n 0x92DE: 0x91E3,\n 0x92DF: 0x9DB4,\n 0x92E0: 0x4EAD,\n 0x92E1: 0x4F4E,\n 0x92E2: 0x505C,\n 0x92E3: 0x5075,\n 0x92E4: 0x5243,\n 0x92E5: 0x8C9E,\n 0x92E6: 0x5448,\n 0x92E7: 0x5824,\n 0x92E8: 0x5B9A,\n 0x92E9: 0x5E1D,\n 0x92EA: 0x5E95,\n 0x92EB: 0x5EAD,\n 0x92EC: 0x5EF7,\n 0x92ED: 0x5F1F,\n 0x92EE: 0x608C,\n 0x92EF: 0x62B5,\n 0x92F0: 0x633A,\n 0x92F1: 0x63D0,\n 0x92F2: 0x68AF,\n 0x92F3: 0x6C40,\n 0x92F4: 0x7887,\n 0x92F5: 0x798E,\n 0x92F6: 0x7A0B,\n 0x92F7: 0x7DE0,\n 0x92F8: 0x8247,\n 0x92F9: 0x8A02,\n 0x92FA: 0x8AE6,\n 0x92FB: 0x8E44,\n 0x92FC: 0x9013,\n 0x9340: 0x90B8,\n 0x9341: 0x912D,\n 0x9342: 0x91D8,\n 0x9343: 0x9F0E,\n 0x9344: 0x6CE5,\n 0x9345: 0x6458,\n 0x9346: 0x64E2,\n 0x9347: 0x6575,\n 0x9348: 0x6EF4,\n 0x9349: 0x7684,\n 0x934A: 0x7B1B,\n 0x934B: 0x9069,\n 0x934C: 0x93D1,\n 0x934D: 0x6EBA,\n 0x934E: 0x54F2,\n 0x934F: 0x5FB9,\n 0x9350: 0x64A4,\n 0x9351: 0x8F4D,\n 0x9352: 0x8FED,\n 0x9353: 0x9244,\n 0x9354: 0x5178,\n 0x9355: 0x586B,\n 0x9356: 0x5929,\n 0x9357: 0x5C55,\n 0x9358: 0x5E97,\n 0x9359: 0x6DFB,\n 0x935A: 0x7E8F,\n 0x935B: 0x751C,\n 0x935C: 0x8CBC,\n 0x935D: 0x8EE2,\n 0x935E: 0x985B,\n 0x935F: 0x70B9,\n 0x9360: 0x4F1D,\n 0x9361: 0x6BBF,\n 0x9362: 0x6FB1,\n 0x9363: 0x7530,\n 0x9364: 0x96FB,\n 0x9365: 0x514E,\n 0x9366: 0x5410,\n 0x9367: 0x5835,\n 0x9368: 0x5857,\n 0x9369: 0x59AC,\n 0x936A: 0x5C60,\n 0x936B: 0x5F92,\n 0x936C: 0x6597,\n 0x936D: 0x675C,\n 0x936E: 0x6E21,\n 0x936F: 0x767B,\n 0x9370: 0x83DF,\n 0x9371: 0x8CED,\n 0x9372: 0x9014,\n 0x9373: 0x90FD,\n 0x9374: 0x934D,\n 0x9375: 0x7825,\n 0x9376: 0x783A,\n 0x9377: 0x52AA,\n 0x9378: 0x5EA6,\n 0x9379: 0x571F,\n 0x937A: 0x5974,\n 0x937B: 0x6012,\n 0x937C: 0x5012,\n 0x937D: 0x515A,\n 0x937E: 0x51AC,\n 0x9380: 0x51CD,\n 0x9381: 0x5200,\n 0x9382: 0x5510,\n 0x9383: 0x5854,\n 0x9384: 0x5858,\n 0x9385: 0x5957,\n 0x9386: 0x5B95,\n 0x9387: 0x5CF6,\n 0x9388: 0x5D8B,\n 0x9389: 0x60BC,\n 0x938A: 0x6295,\n 0x938B: 0x642D,\n 0x938C: 0x6771,\n 0x938D: 0x6843,\n 0x938E: 0x68BC,\n 0x938F: 0x68DF,\n 0x9390: 0x76D7,\n 0x9391: 0x6DD8,\n 0x9392: 0x6E6F,\n 0x9393: 0x6D9B,\n 0x9394: 0x706F,\n 0x9395: 0x71C8,\n 0x9396: 0x5F53,\n 0x9397: 0x75D8,\n 0x9398: 0x7977,\n 0x9399: 0x7B49,\n 0x939A: 0x7B54,\n 0x939B: 0x7B52,\n 0x939C: 0x7CD6,\n 0x939D: 0x7D71,\n 0x939E: 0x5230,\n 0x939F: 0x8463,\n 0x93A0: 0x8569,\n 0x93A1: 0x85E4,\n 0x93A2: 0x8A0E,\n 0x93A3: 0x8B04,\n 0x93A4: 0x8C46,\n 0x93A5: 0x8E0F,\n 0x93A6: 0x9003,\n 0x93A7: 0x900F,\n 0x93A8: 0x9419,\n 0x93A9: 0x9676,\n 0x93AA: 0x982D,\n 0x93AB: 0x9A30,\n 0x93AC: 0x95D8,\n 0x93AD: 0x50CD,\n 0x93AE: 0x52D5,\n 0x93AF: 0x540C,\n 0x93B0: 0x5802,\n 0x93B1: 0x5C0E,\n 0x93B2: 0x61A7,\n 0x93B3: 0x649E,\n 0x93B4: 0x6D1E,\n 0x93B5: 0x77B3,\n 0x93B6: 0x7AE5,\n 0x93B7: 0x80F4,\n 0x93B8: 0x8404,\n 0x93B9: 0x9053,\n 0x93BA: 0x9285,\n 0x93BB: 0x5CE0,\n 0x93BC: 0x9D07,\n 0x93BD: 0x533F,\n 0x93BE: 0x5F97,\n 0x93BF: 0x5FB3,\n 0x93C0: 0x6D9C,\n 0x93C1: 0x7279,\n 0x93C2: 0x7763,\n 0x93C3: 0x79BF,\n 0x93C4: 0x7BE4,\n 0x93C5: 0x6BD2,\n 0x93C6: 0x72EC,\n 0x93C7: 0x8AAD,\n 0x93C8: 0x6803,\n 0x93C9: 0x6A61,\n 0x93CA: 0x51F8,\n 0x93CB: 0x7A81,\n 0x93CC: 0x6934,\n 0x93CD: 0x5C4A,\n 0x93CE: 0x9CF6,\n 0x93CF: 0x82EB,\n 0x93D0: 0x5BC5,\n 0x93D1: 0x9149,\n 0x93D2: 0x701E,\n 0x93D3: 0x5678,\n 0x93D4: 0x5C6F,\n 0x93D5: 0x60C7,\n 0x93D6: 0x6566,\n 0x93D7: 0x6C8C,\n 0x93D8: 0x8C5A,\n 0x93D9: 0x9041,\n 0x93DA: 0x9813,\n 0x93DB: 0x5451,\n 0x93DC: 0x66C7,\n 0x93DD: 0x920D,\n 0x93DE: 0x5948,\n 0x93DF: 0x90A3,\n 0x93E0: 0x5185,\n 0x93E1: 0x4E4D,\n 0x93E2: 0x51EA,\n 0x93E3: 0x8599,\n 0x93E4: 0x8B0E,\n 0x93E5: 0x7058,\n 0x93E6: 0x637A,\n 0x93E7: 0x934B,\n 0x93E8: 0x6962,\n 0x93E9: 0x99B4,\n 0x93EA: 0x7E04,\n 0x93EB: 0x7577,\n 0x93EC: 0x5357,\n 0x93ED: 0x6960,\n 0x93EE: 0x8EDF,\n 0x93EF: 0x96E3,\n 0x93F0: 0x6C5D,\n 0x93F1: 0x4E8C,\n 0x93F2: 0x5C3C,\n 0x93F3: 0x5F10,\n 0x93F4: 0x8FE9,\n 0x93F5: 0x5302,\n 0x93F6: 0x8CD1,\n 0x93F7: 0x8089,\n 0x93F8: 0x8679,\n 0x93F9: 0x5EFF,\n 0x93FA: 0x65E5,\n 0x93FB: 0x4E73,\n 0x93FC: 0x5165,\n 0x9440: 0x5982,\n 0x9441: 0x5C3F,\n 0x9442: 0x97EE,\n 0x9443: 0x4EFB,\n 0x9444: 0x598A,\n 0x9445: 0x5FCD,\n 0x9446: 0x8A8D,\n 0x9447: 0x6FE1,\n 0x9448: 0x79B0,\n 0x9449: 0x7962,\n 0x944A: 0x5BE7,\n 0x944B: 0x8471,\n 0x944C: 0x732B,\n 0x944D: 0x71B1,\n 0x944E: 0x5E74,\n 0x944F: 0x5FF5,\n 0x9450: 0x637B,\n 0x9451: 0x649A,\n 0x9452: 0x71C3,\n 0x9453: 0x7C98,\n 0x9454: 0x4E43,\n 0x9455: 0x5EFC,\n 0x9456: 0x4E4B,\n 0x9457: 0x57DC,\n 0x9458: 0x56A2,\n 0x9459: 0x60A9,\n 0x945A: 0x6FC3,\n 0x945B: 0x7D0D,\n 0x945C: 0x80FD,\n 0x945D: 0x8133,\n 0x945E: 0x81BF,\n 0x945F: 0x8FB2,\n 0x9460: 0x8997,\n 0x9461: 0x86A4,\n 0x9462: 0x5DF4,\n 0x9463: 0x628A,\n 0x9464: 0x64AD,\n 0x9465: 0x8987,\n 0x9466: 0x6777,\n 0x9467: 0x6CE2,\n 0x9468: 0x6D3E,\n 0x9469: 0x7436,\n 0x946A: 0x7834,\n 0x946B: 0x5A46,\n 0x946C: 0x7F75,\n 0x946D: 0x82AD,\n 0x946E: 0x99AC,\n 0x946F: 0x4FF3,\n 0x9470: 0x5EC3,\n 0x9471: 0x62DD,\n 0x9472: 0x6392,\n 0x9473: 0x6557,\n 0x9474: 0x676F,\n 0x9475: 0x76C3,\n 0x9476: 0x724C,\n 0x9477: 0x80CC,\n 0x9478: 0x80BA,\n 0x9479: 0x8F29,\n 0x947A: 0x914D,\n 0x947B: 0x500D,\n 0x947C: 0x57F9,\n 0x947D: 0x5A92,\n 0x947E: 0x6885,\n 0x9480: 0x6973,\n 0x9481: 0x7164,\n 0x9482: 0x72FD,\n 0x9483: 0x8CB7,\n 0x9484: 0x58F2,\n 0x9485: 0x8CE0,\n 0x9486: 0x966A,\n 0x9487: 0x9019,\n 0x9488: 0x877F,\n 0x9489: 0x79E4,\n 0x948A: 0x77E7,\n 0x948B: 0x8429,\n 0x948C: 0x4F2F,\n 0x948D: 0x5265,\n 0x948E: 0x535A,\n 0x948F: 0x62CD,\n 0x9490: 0x67CF,\n 0x9491: 0x6CCA,\n 0x9492: 0x767D,\n 0x9493: 0x7B94,\n 0x9494: 0x7C95,\n 0x9495: 0x8236,\n 0x9496: 0x8584,\n 0x9497: 0x8FEB,\n 0x9498: 0x66DD,\n 0x9499: 0x6F20,\n 0x949A: 0x7206,\n 0x949B: 0x7E1B,\n 0x949C: 0x83AB,\n 0x949D: 0x99C1,\n 0x949E: 0x9EA6,\n 0x949F: 0x51FD,\n 0x94A0: 0x7BB1,\n 0x94A1: 0x7872,\n 0x94A2: 0x7BB8,\n 0x94A3: 0x8087,\n 0x94A4: 0x7B48,\n 0x94A5: 0x6AE8,\n 0x94A6: 0x5E61,\n 0x94A7: 0x808C,\n 0x94A8: 0x7551,\n 0x94A9: 0x7560,\n 0x94AA: 0x516B,\n 0x94AB: 0x9262,\n 0x94AC: 0x6E8C,\n 0x94AD: 0x767A,\n 0x94AE: 0x9197,\n 0x94AF: 0x9AEA,\n 0x94B0: 0x4F10,\n 0x94B1: 0x7F70,\n 0x94B2: 0x629C,\n 0x94B3: 0x7B4F,\n 0x94B4: 0x95A5,\n 0x94B5: 0x9CE9,\n 0x94B6: 0x567A,\n 0x94B7: 0x5859,\n 0x94B8: 0x86E4,\n 0x94B9: 0x96BC,\n 0x94BA: 0x4F34,\n 0x94BB: 0x5224,\n 0x94BC: 0x534A,\n 0x94BD: 0x53CD,\n 0x94BE: 0x53DB,\n 0x94BF: 0x5E06,\n 0x94C0: 0x642C,\n 0x94C1: 0x6591,\n 0x94C2: 0x677F,\n 0x94C3: 0x6C3E,\n 0x94C4: 0x6C4E,\n 0x94C5: 0x7248,\n 0x94C6: 0x72AF,\n 0x94C7: 0x73ED,\n 0x94C8: 0x7554,\n 0x94C9: 0x7E41,\n 0x94CA: 0x822C,\n 0x94CB: 0x85E9,\n 0x94CC: 0x8CA9,\n 0x94CD: 0x7BC4,\n 0x94CE: 0x91C6,\n 0x94CF: 0x7169,\n 0x94D0: 0x9812,\n 0x94D1: 0x98EF,\n 0x94D2: 0x633D,\n 0x94D3: 0x6669,\n 0x94D4: 0x756A,\n 0x94D5: 0x76E4,\n 0x94D6: 0x78D0,\n 0x94D7: 0x8543,\n 0x94D8: 0x86EE,\n 0x94D9: 0x532A,\n 0x94DA: 0x5351,\n 0x94DB: 0x5426,\n 0x94DC: 0x5983,\n 0x94DD: 0x5E87,\n 0x94DE: 0x5F7C,\n 0x94DF: 0x60B2,\n 0x94E0: 0x6249,\n 0x94E1: 0x6279,\n 0x94E2: 0x62AB,\n 0x94E3: 0x6590,\n 0x94E4: 0x6BD4,\n 0x94E5: 0x6CCC,\n 0x94E6: 0x75B2,\n 0x94E7: 0x76AE,\n 0x94E8: 0x7891,\n 0x94E9: 0x79D8,\n 0x94EA: 0x7DCB,\n 0x94EB: 0x7F77,\n 0x94EC: 0x80A5,\n 0x94ED: 0x88AB,\n 0x94EE: 0x8AB9,\n 0x94EF: 0x8CBB,\n 0x94F0: 0x907F,\n 0x94F1: 0x975E,\n 0x94F2: 0x98DB,\n 0x94F3: 0x6A0B,\n 0x94F4: 0x7C38,\n 0x94F5: 0x5099,\n 0x94F6: 0x5C3E,\n 0x94F7: 0x5FAE,\n 0x94F8: 0x6787,\n 0x94F9: 0x6BD8,\n 0x94FA: 0x7435,\n 0x94FB: 0x7709,\n 0x94FC: 0x7F8E,\n 0x9540: 0x9F3B,\n 0x9541: 0x67CA,\n 0x9542: 0x7A17,\n 0x9543: 0x5339,\n 0x9544: 0x758B,\n 0x9545: 0x9AED,\n 0x9546: 0x5F66,\n 0x9547: 0x819D,\n 0x9548: 0x83F1,\n 0x9549: 0x8098,\n 0x954A: 0x5F3C,\n 0x954B: 0x5FC5,\n 0x954C: 0x7562,\n 0x954D: 0x7B46,\n 0x954E: 0x903C,\n 0x954F: 0x6867,\n 0x9550: 0x59EB,\n 0x9551: 0x5A9B,\n 0x9552: 0x7D10,\n 0x9553: 0x767E,\n 0x9554: 0x8B2C,\n 0x9555: 0x4FF5,\n 0x9556: 0x5F6A,\n 0x9557: 0x6A19,\n 0x9558: 0x6C37,\n 0x9559: 0x6F02,\n 0x955A: 0x74E2,\n 0x955B: 0x7968,\n 0x955C: 0x8868,\n 0x955D: 0x8A55,\n 0x955E: 0x8C79,\n 0x955F: 0x5EDF,\n 0x9560: 0x63CF,\n 0x9561: 0x75C5,\n 0x9562: 0x79D2,\n 0x9563: 0x82D7,\n 0x9564: 0x9328,\n 0x9565: 0x92F2,\n 0x9566: 0x849C,\n 0x9567: 0x86ED,\n 0x9568: 0x9C2D,\n 0x9569: 0x54C1,\n 0x956A: 0x5F6C,\n 0x956B: 0x658C,\n 0x956C: 0x6D5C,\n 0x956D: 0x7015,\n 0x956E: 0x8CA7,\n 0x956F: 0x8CD3,\n 0x9570: 0x983B,\n 0x9571: 0x654F,\n 0x9572: 0x74F6,\n 0x9573: 0x4E0D,\n 0x9574: 0x4ED8,\n 0x9575: 0x57E0,\n 0x9576: 0x592B,\n 0x9577: 0x5A66,\n 0x9578: 0x5BCC,\n 0x9579: 0x51A8,\n 0x957A: 0x5E03,\n 0x957B: 0x5E9C,\n 0x957C: 0x6016,\n 0x957D: 0x6276,\n 0x957E: 0x6577,\n 0x9580: 0x65A7,\n 0x9581: 0x666E,\n 0x9582: 0x6D6E,\n 0x9583: 0x7236,\n 0x9584: 0x7B26,\n 0x9585: 0x8150,\n 0x9586: 0x819A,\n 0x9587: 0x8299,\n 0x9588: 0x8B5C,\n 0x9589: 0x8CA0,\n 0x958A: 0x8CE6,\n 0x958B: 0x8D74,\n 0x958C: 0x961C,\n 0x958D: 0x9644,\n 0x958E: 0x4FAE,\n 0x958F: 0x64AB,\n 0x9590: 0x6B66,\n 0x9591: 0x821E,\n 0x9592: 0x8461,\n 0x9593: 0x856A,\n 0x9594: 0x90E8,\n 0x9595: 0x5C01,\n 0x9596: 0x6953,\n 0x9597: 0x98A8,\n 0x9598: 0x847A,\n 0x9599: 0x8557,\n 0x959A: 0x4F0F,\n 0x959B: 0x526F,\n 0x959C: 0x5FA9,\n 0x959D: 0x5E45,\n 0x959E: 0x670D,\n 0x959F: 0x798F,\n 0x95A0: 0x8179,\n 0x95A1: 0x8907,\n 0x95A2: 0x8986,\n 0x95A3: 0x6DF5,\n 0x95A4: 0x5F17,\n 0x95A5: 0x6255,\n 0x95A6: 0x6CB8,\n 0x95A7: 0x4ECF,\n 0x95A8: 0x7269,\n 0x95A9: 0x9B92,\n 0x95AA: 0x5206,\n 0x95AB: 0x543B,\n 0x95AC: 0x5674,\n 0x95AD: 0x58B3,\n 0x95AE: 0x61A4,\n 0x95AF: 0x626E,\n 0x95B0: 0x711A,\n 0x95B1: 0x596E,\n 0x95B2: 0x7C89,\n 0x95B3: 0x7CDE,\n 0x95B4: 0x7D1B,\n 0x95B5: 0x96F0,\n 0x95B6: 0x6587,\n 0x95B7: 0x805E,\n 0x95B8: 0x4E19,\n 0x95B9: 0x4F75,\n 0x95BA: 0x5175,\n 0x95BB: 0x5840,\n 0x95BC: 0x5E63,\n 0x95BD: 0x5E73,\n 0x95BE: 0x5F0A,\n 0x95BF: 0x67C4,\n 0x95C0: 0x4E26,\n 0x95C1: 0x853D,\n 0x95C2: 0x9589,\n 0x95C3: 0x965B,\n 0x95C4: 0x7C73,\n 0x95C5: 0x9801,\n 0x95C6: 0x50FB,\n 0x95C7: 0x58C1,\n 0x95C8: 0x7656,\n 0x95C9: 0x78A7,\n 0x95CA: 0x5225,\n 0x95CB: 0x77A5,\n 0x95CC: 0x8511,\n 0x95CD: 0x7B86,\n 0x95CE: 0x504F,\n 0x95CF: 0x5909,\n 0x95D0: 0x7247,\n 0x95D1: 0x7BC7,\n 0x95D2: 0x7DE8,\n 0x95D3: 0x8FBA,\n 0x95D4: 0x8FD4,\n 0x95D5: 0x904D,\n 0x95D6: 0x4FBF,\n 0x95D7: 0x52C9,\n 0x95D8: 0x5A29,\n 0x95D9: 0x5F01,\n 0x95DA: 0x97AD,\n 0x95DB: 0x4FDD,\n 0x95DC: 0x8217,\n 0x95DD: 0x92EA,\n 0x95DE: 0x5703,\n 0x95DF: 0x6355,\n 0x95E0: 0x6B69,\n 0x95E1: 0x752B,\n 0x95E2: 0x88DC,\n 0x95E3: 0x8F14,\n 0x95E4: 0x7A42,\n 0x95E5: 0x52DF,\n 0x95E6: 0x5893,\n 0x95E7: 0x6155,\n 0x95E8: 0x620A,\n 0x95E9: 0x66AE,\n 0x95EA: 0x6BCD,\n 0x95EB: 0x7C3F,\n 0x95EC: 0x83E9,\n 0x95ED: 0x5023,\n 0x95EE: 0x4FF8,\n 0x95EF: 0x5305,\n 0x95F0: 0x5446,\n 0x95F1: 0x5831,\n 0x95F2: 0x5949,\n 0x95F3: 0x5B9D,\n 0x95F4: 0x5CF0,\n 0x95F5: 0x5CEF,\n 0x95F6: 0x5D29,\n 0x95F7: 0x5E96,\n 0x95F8: 0x62B1,\n 0x95F9: 0x6367,\n 0x95FA: 0x653E,\n 0x95FB: 0x65B9,\n 0x95FC: 0x670B,\n 0x9640: 0x6CD5,\n 0x9641: 0x6CE1,\n 0x9642: 0x70F9,\n 0x9643: 0x7832,\n 0x9644: 0x7E2B,\n 0x9645: 0x80DE,\n 0x9646: 0x82B3,\n 0x9647: 0x840C,\n 0x9648: 0x84EC,\n 0x9649: 0x8702,\n 0x964A: 0x8912,\n 0x964B: 0x8A2A,\n 0x964C: 0x8C4A,\n 0x964D: 0x90A6,\n 0x964E: 0x92D2,\n 0x964F: 0x98FD,\n 0x9650: 0x9CF3,\n 0x9651: 0x9D6C,\n 0x9652: 0x4E4F,\n 0x9653: 0x4EA1,\n 0x9654: 0x508D,\n 0x9655: 0x5256,\n 0x9656: 0x574A,\n 0x9657: 0x59A8,\n 0x9658: 0x5E3D,\n 0x9659: 0x5FD8,\n 0x965A: 0x5FD9,\n 0x965B: 0x623F,\n 0x965C: 0x66B4,\n 0x965D: 0x671B,\n 0x965E: 0x67D0,\n 0x965F: 0x68D2,\n 0x9660: 0x5192,\n 0x9661: 0x7D21,\n 0x9662: 0x80AA,\n 0x9663: 0x81A8,\n 0x9664: 0x8B00,\n 0x9665: 0x8C8C,\n 0x9666: 0x8CBF,\n 0x9667: 0x927E,\n 0x9668: 0x9632,\n 0x9669: 0x5420,\n 0x966A: 0x982C,\n 0x966B: 0x5317,\n 0x966C: 0x50D5,\n 0x966D: 0x535C,\n 0x966E: 0x58A8,\n 0x966F: 0x64B2,\n 0x9670: 0x6734,\n 0x9671: 0x7267,\n 0x9672: 0x7766,\n 0x9673: 0x7A46,\n 0x9674: 0x91E6,\n 0x9675: 0x52C3,\n 0x9676: 0x6CA1,\n 0x9677: 0x6B86,\n 0x9678: 0x5800,\n 0x9679: 0x5E4C,\n 0x967A: 0x5954,\n 0x967B: 0x672C,\n 0x967C: 0x7FFB,\n 0x967D: 0x51E1,\n 0x967E: 0x76C6,\n 0x9680: 0x6469,\n 0x9681: 0x78E8,\n 0x9682: 0x9B54,\n 0x9683: 0x9EBB,\n 0x9684: 0x57CB,\n 0x9685: 0x59B9,\n 0x9686: 0x6627,\n 0x9687: 0x679A,\n 0x9688: 0x6BCE,\n 0x9689: 0x54E9,\n 0x968A: 0x69D9,\n 0x968B: 0x5E55,\n 0x968C: 0x819C,\n 0x968D: 0x6795,\n 0x968E: 0x9BAA,\n 0x968F: 0x67FE,\n 0x9690: 0x9C52,\n 0x9691: 0x685D,\n 0x9692: 0x4EA6,\n 0x9693: 0x4FE3,\n 0x9694: 0x53C8,\n 0x9695: 0x62B9,\n 0x9696: 0x672B,\n 0x9697: 0x6CAB,\n 0x9698: 0x8FC4,\n 0x9699: 0x4FAD,\n 0x969A: 0x7E6D,\n 0x969B: 0x9EBF,\n 0x969C: 0x4E07,\n 0x969D: 0x6162,\n 0x969E: 0x6E80,\n 0x969F: 0x6F2B,\n 0x96A0: 0x8513,\n 0x96A1: 0x5473,\n 0x96A2: 0x672A,\n 0x96A3: 0x9B45,\n 0x96A4: 0x5DF3,\n 0x96A5: 0x7B95,\n 0x96A6: 0x5CAC,\n 0x96A7: 0x5BC6,\n 0x96A8: 0x871C,\n 0x96A9: 0x6E4A,\n 0x96AA: 0x84D1,\n 0x96AB: 0x7A14,\n 0x96AC: 0x8108,\n 0x96AD: 0x5999,\n 0x96AE: 0x7C8D,\n 0x96AF: 0x6C11,\n 0x96B0: 0x7720,\n 0x96B1: 0x52D9,\n 0x96B2: 0x5922,\n 0x96B3: 0x7121,\n 0x96B4: 0x725F,\n 0x96B5: 0x77DB,\n 0x96B6: 0x9727,\n 0x96B7: 0x9D61,\n 0x96B8: 0x690B,\n 0x96B9: 0x5A7F,\n 0x96BA: 0x5A18,\n 0x96BB: 0x51A5,\n 0x96BC: 0x540D,\n 0x96BD: 0x547D,\n 0x96BE: 0x660E,\n 0x96BF: 0x76DF,\n 0x96C0: 0x8FF7,\n 0x96C1: 0x9298,\n 0x96C2: 0x9CF4,\n 0x96C3: 0x59EA,\n 0x96C4: 0x725D,\n 0x96C5: 0x6EC5,\n 0x96C6: 0x514D,\n 0x96C7: 0x68C9,\n 0x96C8: 0x7DBF,\n 0x96C9: 0x7DEC,\n 0x96CA: 0x9762,\n 0x96CB: 0x9EBA,\n 0x96CC: 0x6478,\n 0x96CD: 0x6A21,\n 0x96CE: 0x8302,\n 0x96CF: 0x5984,\n 0x96D0: 0x5B5F,\n 0x96D1: 0x6BDB,\n 0x96D2: 0x731B,\n 0x96D3: 0x76F2,\n 0x96D4: 0x7DB2,\n 0x96D5: 0x8017,\n 0x96D6: 0x8499,\n 0x96D7: 0x5132,\n 0x96D8: 0x6728,\n 0x96D9: 0x9ED9,\n 0x96DA: 0x76EE,\n 0x96DB: 0x6762,\n 0x96DC: 0x52FF,\n 0x96DD: 0x9905,\n 0x96DE: 0x5C24,\n 0x96DF: 0x623B,\n 0x96E0: 0x7C7E,\n 0x96E1: 0x8CB0,\n 0x96E2: 0x554F,\n 0x96E3: 0x60B6,\n 0x96E4: 0x7D0B,\n 0x96E5: 0x9580,\n 0x96E6: 0x5301,\n 0x96E7: 0x4E5F,\n 0x96E8: 0x51B6,\n 0x96E9: 0x591C,\n 0x96EA: 0x723A,\n 0x96EB: 0x8036,\n 0x96EC: 0x91CE,\n 0x96ED: 0x5F25,\n 0x96EE: 0x77E2,\n 0x96EF: 0x5384,\n 0x96F0: 0x5F79,\n 0x96F1: 0x7D04,\n 0x96F2: 0x85AC,\n 0x96F3: 0x8A33,\n 0x96F4: 0x8E8D,\n 0x96F5: 0x9756,\n 0x96F6: 0x67F3,\n 0x96F7: 0x85AE,\n 0x96F8: 0x9453,\n 0x96F9: 0x6109,\n 0x96FA: 0x6108,\n 0x96FB: 0x6CB9,\n 0x96FC: 0x7652,\n 0x9740: 0x8AED,\n 0x9741: 0x8F38,\n 0x9742: 0x552F,\n 0x9743: 0x4F51,\n 0x9744: 0x512A,\n 0x9745: 0x52C7,\n 0x9746: 0x53CB,\n 0x9747: 0x5BA5,\n 0x9748: 0x5E7D,\n 0x9749: 0x60A0,\n 0x974A: 0x6182,\n 0x974B: 0x63D6,\n 0x974C: 0x6709,\n 0x974D: 0x67DA,\n 0x974E: 0x6E67,\n 0x974F: 0x6D8C,\n 0x9750: 0x7336,\n 0x9751: 0x7337,\n 0x9752: 0x7531,\n 0x9753: 0x7950,\n 0x9754: 0x88D5,\n 0x9755: 0x8A98,\n 0x9756: 0x904A,\n 0x9757: 0x9091,\n 0x9758: 0x90F5,\n 0x9759: 0x96C4,\n 0x975A: 0x878D,\n 0x975B: 0x5915,\n 0x975C: 0x4E88,\n 0x975D: 0x4F59,\n 0x975E: 0x4E0E,\n 0x975F: 0x8A89,\n 0x9760: 0x8F3F,\n 0x9761: 0x9810,\n 0x9762: 0x50AD,\n 0x9763: 0x5E7C,\n 0x9764: 0x5996,\n 0x9765: 0x5BB9,\n 0x9766: 0x5EB8,\n 0x9767: 0x63DA,\n 0x9768: 0x63FA,\n 0x9769: 0x64C1,\n 0x976A: 0x66DC,\n 0x976B: 0x694A,\n 0x976C: 0x69D8,\n 0x976D: 0x6D0B,\n 0x976E: 0x6EB6,\n 0x976F: 0x7194,\n 0x9770: 0x7528,\n 0x9771: 0x7AAF,\n 0x9772: 0x7F8A,\n 0x9773: 0x8000,\n 0x9774: 0x8449,\n 0x9775: 0x84C9,\n 0x9776: 0x8981,\n 0x9777: 0x8B21,\n 0x9778: 0x8E0A,\n 0x9779: 0x9065,\n 0x977A: 0x967D,\n 0x977B: 0x990A,\n 0x977C: 0x617E,\n 0x977D: 0x6291,\n 0x977E: 0x6B32,\n 0x9780: 0x6C83,\n 0x9781: 0x6D74,\n 0x9782: 0x7FCC,\n 0x9783: 0x7FFC,\n 0x9784: 0x6DC0,\n 0x9785: 0x7F85,\n 0x9786: 0x87BA,\n 0x9787: 0x88F8,\n 0x9788: 0x6765,\n 0x9789: 0x83B1,\n 0x978A: 0x983C,\n 0x978B: 0x96F7,\n 0x978C: 0x6D1B,\n 0x978D: 0x7D61,\n 0x978E: 0x843D,\n 0x978F: 0x916A,\n 0x9790: 0x4E71,\n 0x9791: 0x5375,\n 0x9792: 0x5D50,\n 0x9793: 0x6B04,\n 0x9794: 0x6FEB,\n 0x9795: 0x85CD,\n 0x9796: 0x862D,\n 0x9797: 0x89A7,\n 0x9798: 0x5229,\n 0x9799: 0x540F,\n 0x979A: 0x5C65,\n 0x979B: 0x674E,\n 0x979C: 0x68A8,\n 0x979D: 0x7406,\n 0x979E: 0x7483,\n 0x979F: 0x75E2,\n 0x97A0: 0x88CF,\n 0x97A1: 0x88E1,\n 0x97A2: 0x91CC,\n 0x97A3: 0x96E2,\n 0x97A4: 0x9678,\n 0x97A5: 0x5F8B,\n 0x97A6: 0x7387,\n 0x97A7: 0x7ACB,\n 0x97A8: 0x844E,\n 0x97A9: 0x63A0,\n 0x97AA: 0x7565,\n 0x97AB: 0x5289,\n 0x97AC: 0x6D41,\n 0x97AD: 0x6E9C,\n 0x97AE: 0x7409,\n 0x97AF: 0x7559,\n 0x97B0: 0x786B,\n 0x97B1: 0x7C92,\n 0x97B2: 0x9686,\n 0x97B3: 0x7ADC,\n 0x97B4: 0x9F8D,\n 0x97B5: 0x4FB6,\n 0x97B6: 0x616E,\n 0x97B7: 0x65C5,\n 0x97B8: 0x865C,\n 0x97B9: 0x4E86,\n 0x97BA: 0x4EAE,\n 0x97BB: 0x50DA,\n 0x97BC: 0x4E21,\n 0x97BD: 0x51CC,\n 0x97BE: 0x5BEE,\n 0x97BF: 0x6599,\n 0x97C0: 0x6881,\n 0x97C1: 0x6DBC,\n 0x97C2: 0x731F,\n 0x97C3: 0x7642,\n 0x97C4: 0x77AD,\n 0x97C5: 0x7A1C,\n 0x97C6: 0x7CE7,\n 0x97C7: 0x826F,\n 0x97C8: 0x8AD2,\n 0x97C9: 0x907C,\n 0x97CA: 0x91CF,\n 0x97CB: 0x9675,\n 0x97CC: 0x9818,\n 0x97CD: 0x529B,\n 0x97CE: 0x7DD1,\n 0x97CF: 0x502B,\n 0x97D0: 0x5398,\n 0x97D1: 0x6797,\n 0x97D2: 0x6DCB,\n 0x97D3: 0x71D0,\n 0x97D4: 0x7433,\n 0x97D5: 0x81E8,\n 0x97D6: 0x8F2A,\n 0x97D7: 0x96A3,\n 0x97D8: 0x9C57,\n 0x97D9: 0x9E9F,\n 0x97DA: 0x7460,\n 0x97DB: 0x5841,\n 0x97DC: 0x6D99,\n 0x97DD: 0x7D2F,\n 0x97DE: 0x985E,\n 0x97DF: 0x4EE4,\n 0x97E0: 0x4F36,\n 0x97E1: 0x4F8B,\n 0x97E2: 0x51B7,\n 0x97E3: 0x52B1,\n 0x97E4: 0x5DBA,\n 0x97E5: 0x601C,\n 0x97E6: 0x73B2,\n 0x97E7: 0x793C,\n 0x97E8: 0x82D3,\n 0x97E9: 0x9234,\n 0x97EA: 0x96B7,\n 0x97EB: 0x96F6,\n 0x97EC: 0x970A,\n 0x97ED: 0x9E97,\n 0x97EE: 0x9F62,\n 0x97EF: 0x66A6,\n 0x97F0: 0x6B74,\n 0x97F1: 0x5217,\n 0x97F2: 0x52A3,\n 0x97F3: 0x70C8,\n 0x97F4: 0x88C2,\n 0x97F5: 0x5EC9,\n 0x97F6: 0x604B,\n 0x97F7: 0x6190,\n 0x97F8: 0x6F23,\n 0x97F9: 0x7149,\n 0x97FA: 0x7C3E,\n 0x97FB: 0x7DF4,\n 0x97FC: 0x806F,\n 0x9840: 0x84EE,\n 0x9841: 0x9023,\n 0x9842: 0x932C,\n 0x9843: 0x5442,\n 0x9844: 0x9B6F,\n 0x9845: 0x6AD3,\n 0x9846: 0x7089,\n 0x9847: 0x8CC2,\n 0x9848: 0x8DEF,\n 0x9849: 0x9732,\n 0x984A: 0x52B4,\n 0x984B: 0x5A41,\n 0x984C: 0x5ECA,\n 0x984D: 0x5F04,\n 0x984E: 0x6717,\n 0x984F: 0x697C,\n 0x9850: 0x6994,\n 0x9851: 0x6D6A,\n 0x9852: 0x6F0F,\n 0x9853: 0x7262,\n 0x9854: 0x72FC,\n 0x9855: 0x7BED,\n 0x9856: 0x8001,\n 0x9857: 0x807E,\n 0x9858: 0x874B,\n 0x9859: 0x90CE,\n 0x985A: 0x516D,\n 0x985B: 0x9E93,\n 0x985C: 0x7984,\n 0x985D: 0x808B,\n 0x985E: 0x9332,\n 0x985F: 0x8AD6,\n 0x9860: 0x502D,\n 0x9861: 0x548C,\n 0x9862: 0x8A71,\n 0x9863: 0x6B6A,\n 0x9864: 0x8CC4,\n 0x9865: 0x8107,\n 0x9866: 0x60D1,\n 0x9867: 0x67A0,\n 0x9868: 0x9DF2,\n 0x9869: 0x4E99,\n 0x986A: 0x4E98,\n 0x986B: 0x9C10,\n 0x986C: 0x8A6B,\n 0x986D: 0x85C1,\n 0x986E: 0x8568,\n 0x986F: 0x6900,\n 0x9870: 0x6E7E,\n 0x9871: 0x7897,\n 0x9872: 0x8155,\n 0x989F: 0x5F0C,\n 0x98A0: 0x4E10,\n 0x98A1: 0x4E15,\n 0x98A2: 0x4E2A,\n 0x98A3: 0x4E31,\n 0x98A4: 0x4E36,\n 0x98A5: 0x4E3C,\n 0x98A6: 0x4E3F,\n 0x98A7: 0x4E42,\n 0x98A8: 0x4E56,\n 0x98A9: 0x4E58,\n 0x98AA: 0x4E82,\n 0x98AB: 0x4E85,\n 0x98AC: 0x8C6B,\n 0x98AD: 0x4E8A,\n 0x98AE: 0x8212,\n 0x98AF: 0x5F0D,\n 0x98B0: 0x4E8E,\n 0x98B1: 0x4E9E,\n 0x98B2: 0x4E9F,\n 0x98B3: 0x4EA0,\n 0x98B4: 0x4EA2,\n 0x98B5: 0x4EB0,\n 0x98B6: 0x4EB3,\n 0x98B7: 0x4EB6,\n 0x98B8: 0x4ECE,\n 0x98B9: 0x4ECD,\n 0x98BA: 0x4EC4,\n 0x98BB: 0x4EC6,\n 0x98BC: 0x4EC2,\n 0x98BD: 0x4ED7,\n 0x98BE: 0x4EDE,\n 0x98BF: 0x4EED,\n 0x98C0: 0x4EDF,\n 0x98C1: 0x4EF7,\n 0x98C2: 0x4F09,\n 0x98C3: 0x4F5A,\n 0x98C4: 0x4F30,\n 0x98C5: 0x4F5B,\n 0x98C6: 0x4F5D,\n 0x98C7: 0x4F57,\n 0x98C8: 0x4F47,\n 0x98C9: 0x4F76,\n 0x98CA: 0x4F88,\n 0x98CB: 0x4F8F,\n 0x98CC: 0x4F98,\n 0x98CD: 0x4F7B,\n 0x98CE: 0x4F69,\n 0x98CF: 0x4F70,\n 0x98D0: 0x4F91,\n 0x98D1: 0x4F6F,\n 0x98D2: 0x4F86,\n 0x98D3: 0x4F96,\n 0x98D4: 0x5118,\n 0x98D5: 0x4FD4,\n 0x98D6: 0x4FDF,\n 0x98D7: 0x4FCE,\n 0x98D8: 0x4FD8,\n 0x98D9: 0x4FDB,\n 0x98DA: 0x4FD1,\n 0x98DB: 0x4FDA,\n 0x98DC: 0x4FD0,\n 0x98DD: 0x4FE4,\n 0x98DE: 0x4FE5,\n 0x98DF: 0x501A,\n 0x98E0: 0x5028,\n 0x98E1: 0x5014,\n 0x98E2: 0x502A,\n 0x98E3: 0x5025,\n 0x98E4: 0x5005,\n 0x98E5: 0x4F1C,\n 0x98E6: 0x4FF6,\n 0x98E7: 0x5021,\n 0x98E8: 0x5029,\n 0x98E9: 0x502C,\n 0x98EA: 0x4FFE,\n 0x98EB: 0x4FEF,\n 0x98EC: 0x5011,\n 0x98ED: 0x5006,\n 0x98EE: 0x5043,\n 0x98EF: 0x5047,\n 0x98F0: 0x6703,\n 0x98F1: 0x5055,\n 0x98F2: 0x5050,\n 0x98F3: 0x5048,\n 0x98F4: 0x505A,\n 0x98F5: 0x5056,\n 0x98F6: 0x506C,\n 0x98F7: 0x5078,\n 0x98F8: 0x5080,\n 0x98F9: 0x509A,\n 0x98FA: 0x5085,\n 0x98FB: 0x50B4,\n 0x98FC: 0x50B2,\n 0x9940: 0x50C9,\n 0x9941: 0x50CA,\n 0x9942: 0x50B3,\n 0x9943: 0x50C2,\n 0x9944: 0x50D6,\n 0x9945: 0x50DE,\n 0x9946: 0x50E5,\n 0x9947: 0x50ED,\n 0x9948: 0x50E3,\n 0x9949: 0x50EE,\n 0x994A: 0x50F9,\n 0x994B: 0x50F5,\n 0x994C: 0x5109,\n 0x994D: 0x5101,\n 0x994E: 0x5102,\n 0x994F: 0x5116,\n 0x9950: 0x5115,\n 0x9951: 0x5114,\n 0x9952: 0x511A,\n 0x9953: 0x5121,\n 0x9954: 0x513A,\n 0x9955: 0x5137,\n 0x9956: 0x513C,\n 0x9957: 0x513B,\n 0x9958: 0x513F,\n 0x9959: 0x5140,\n 0x995A: 0x5152,\n 0x995B: 0x514C,\n 0x995C: 0x5154,\n 0x995D: 0x5162,\n 0x995E: 0x7AF8,\n 0x995F: 0x5169,\n 0x9960: 0x516A,\n 0x9961: 0x516E,\n 0x9962: 0x5180,\n 0x9963: 0x5182,\n 0x9964: 0x56D8,\n 0x9965: 0x518C,\n 0x9966: 0x5189,\n 0x9967: 0x518F,\n 0x9968: 0x5191,\n 0x9969: 0x5193,\n 0x996A: 0x5195,\n 0x996B: 0x5196,\n 0x996C: 0x51A4,\n 0x996D: 0x51A6,\n 0x996E: 0x51A2,\n 0x996F: 0x51A9,\n 0x9970: 0x51AA,\n 0x9971: 0x51AB,\n 0x9972: 0x51B3,\n 0x9973: 0x51B1,\n 0x9974: 0x51B2,\n 0x9975: 0x51B0,\n 0x9976: 0x51B5,\n 0x9977: 0x51BD,\n 0x9978: 0x51C5,\n 0x9979: 0x51C9,\n 0x997A: 0x51DB,\n 0x997B: 0x51E0,\n 0x997C: 0x8655,\n 0x997D: 0x51E9,\n 0x997E: 0x51ED,\n 0x9980: 0x51F0,\n 0x9981: 0x51F5,\n 0x9982: 0x51FE,\n 0x9983: 0x5204,\n 0x9984: 0x520B,\n 0x9985: 0x5214,\n 0x9986: 0x520E,\n 0x9987: 0x5227,\n 0x9988: 0x522A,\n 0x9989: 0x522E,\n 0x998A: 0x5233,\n 0x998B: 0x5239,\n 0x998C: 0x524F,\n 0x998D: 0x5244,\n 0x998E: 0x524B,\n 0x998F: 0x524C,\n 0x9990: 0x525E,\n 0x9991: 0x5254,\n 0x9992: 0x526A,\n 0x9993: 0x5274,\n 0x9994: 0x5269,\n 0x9995: 0x5273,\n 0x9996: 0x527F,\n 0x9997: 0x527D,\n 0x9998: 0x528D,\n 0x9999: 0x5294,\n 0x999A: 0x5292,\n 0x999B: 0x5271,\n 0x999C: 0x5288,\n 0x999D: 0x5291,\n 0x999E: 0x8FA8,\n 0x999F: 0x8FA7,\n 0x99A0: 0x52AC,\n 0x99A1: 0x52AD,\n 0x99A2: 0x52BC,\n 0x99A3: 0x52B5,\n 0x99A4: 0x52C1,\n 0x99A5: 0x52CD,\n 0x99A6: 0x52D7,\n 0x99A7: 0x52DE,\n 0x99A8: 0x52E3,\n 0x99A9: 0x52E6,\n 0x99AA: 0x98ED,\n 0x99AB: 0x52E0,\n 0x99AC: 0x52F3,\n 0x99AD: 0x52F5,\n 0x99AE: 0x52F8,\n 0x99AF: 0x52F9,\n 0x99B0: 0x5306,\n 0x99B1: 0x5308,\n 0x99B2: 0x7538,\n 0x99B3: 0x530D,\n 0x99B4: 0x5310,\n 0x99B5: 0x530F,\n 0x99B6: 0x5315,\n 0x99B7: 0x531A,\n 0x99B8: 0x5323,\n 0x99B9: 0x532F,\n 0x99BA: 0x5331,\n 0x99BB: 0x5333,\n 0x99BC: 0x5338,\n 0x99BD: 0x5340,\n 0x99BE: 0x5346,\n 0x99BF: 0x5345,\n 0x99C0: 0x4E17,\n 0x99C1: 0x5349,\n 0x99C2: 0x534D,\n 0x99C3: 0x51D6,\n 0x99C4: 0x535E,\n 0x99C5: 0x5369,\n 0x99C6: 0x536E,\n 0x99C7: 0x5918,\n 0x99C8: 0x537B,\n 0x99C9: 0x5377,\n 0x99CA: 0x5382,\n 0x99CB: 0x5396,\n 0x99CC: 0x53A0,\n 0x99CD: 0x53A6,\n 0x99CE: 0x53A5,\n 0x99CF: 0x53AE,\n 0x99D0: 0x53B0,\n 0x99D1: 0x53B6,\n 0x99D2: 0x53C3,\n 0x99D3: 0x7C12,\n 0x99D4: 0x96D9,\n 0x99D5: 0x53DF,\n 0x99D6: 0x66FC,\n 0x99D7: 0x71EE,\n 0x99D8: 0x53EE,\n 0x99D9: 0x53E8,\n 0x99DA: 0x53ED,\n 0x99DB: 0x53FA,\n 0x99DC: 0x5401,\n 0x99DD: 0x543D,\n 0x99DE: 0x5440,\n 0x99DF: 0x542C,\n 0x99E0: 0x542D,\n 0x99E1: 0x543C,\n 0x99E2: 0x542E,\n 0x99E3: 0x5436,\n 0x99E4: 0x5429,\n 0x99E5: 0x541D,\n 0x99E6: 0x544E,\n 0x99E7: 0x548F,\n 0x99E8: 0x5475,\n 0x99E9: 0x548E,\n 0x99EA: 0x545F,\n 0x99EB: 0x5471,\n 0x99EC: 0x5477,\n 0x99ED: 0x5470,\n 0x99EE: 0x5492,\n 0x99EF: 0x547B,\n 0x99F0: 0x5480,\n 0x99F1: 0x5476,\n 0x99F2: 0x5484,\n 0x99F3: 0x5490,\n 0x99F4: 0x5486,\n 0x99F5: 0x54C7,\n 0x99F6: 0x54A2,\n 0x99F7: 0x54B8,\n 0x99F8: 0x54A5,\n 0x99F9: 0x54AC,\n 0x99FA: 0x54C4,\n 0x99FB: 0x54C8,\n 0x99FC: 0x54A8,\n 0x9A40: 0x54AB,\n 0x9A41: 0x54C2,\n 0x9A42: 0x54A4,\n 0x9A43: 0x54BE,\n 0x9A44: 0x54BC,\n 0x9A45: 0x54D8,\n 0x9A46: 0x54E5,\n 0x9A47: 0x54E6,\n 0x9A48: 0x550F,\n 0x9A49: 0x5514,\n 0x9A4A: 0x54FD,\n 0x9A4B: 0x54EE,\n 0x9A4C: 0x54ED,\n 0x9A4D: 0x54FA,\n 0x9A4E: 0x54E2,\n 0x9A4F: 0x5539,\n 0x9A50: 0x5540,\n 0x9A51: 0x5563,\n 0x9A52: 0x554C,\n 0x9A53: 0x552E,\n 0x9A54: 0x555C,\n 0x9A55: 0x5545,\n 0x9A56: 0x5556,\n 0x9A57: 0x5557,\n 0x9A58: 0x5538,\n 0x9A59: 0x5533,\n 0x9A5A: 0x555D,\n 0x9A5B: 0x5599,\n 0x9A5C: 0x5580,\n 0x9A5D: 0x54AF,\n 0x9A5E: 0x558A,\n 0x9A5F: 0x559F,\n 0x9A60: 0x557B,\n 0x9A61: 0x557E,\n 0x9A62: 0x5598,\n 0x9A63: 0x559E,\n 0x9A64: 0x55AE,\n 0x9A65: 0x557C,\n 0x9A66: 0x5583,\n 0x9A67: 0x55A9,\n 0x9A68: 0x5587,\n 0x9A69: 0x55A8,\n 0x9A6A: 0x55DA,\n 0x9A6B: 0x55C5,\n 0x9A6C: 0x55DF,\n 0x9A6D: 0x55C4,\n 0x9A6E: 0x55DC,\n 0x9A6F: 0x55E4,\n 0x9A70: 0x55D4,\n 0x9A71: 0x5614,\n 0x9A72: 0x55F7,\n 0x9A73: 0x5616,\n 0x9A74: 0x55FE,\n 0x9A75: 0x55FD,\n 0x9A76: 0x561B,\n 0x9A77: 0x55F9,\n 0x9A78: 0x564E,\n 0x9A79: 0x5650,\n 0x9A7A: 0x71DF,\n 0x9A7B: 0x5634,\n 0x9A7C: 0x5636,\n 0x9A7D: 0x5632,\n 0x9A7E: 0x5638,\n 0x9A80: 0x566B,\n 0x9A81: 0x5664,\n 0x9A82: 0x562F,\n 0x9A83: 0x566C,\n 0x9A84: 0x566A,\n 0x9A85: 0x5686,\n 0x9A86: 0x5680,\n 0x9A87: 0x568A,\n 0x9A88: 0x56A0,\n 0x9A89: 0x5694,\n 0x9A8A: 0x568F,\n 0x9A8B: 0x56A5,\n 0x9A8C: 0x56AE,\n 0x9A8D: 0x56B6,\n 0x9A8E: 0x56B4,\n 0x9A8F: 0x56C2,\n 0x9A90: 0x56BC,\n 0x9A91: 0x56C1,\n 0x9A92: 0x56C3,\n 0x9A93: 0x56C0,\n 0x9A94: 0x56C8,\n 0x9A95: 0x56CE,\n 0x9A96: 0x56D1,\n 0x9A97: 0x56D3,\n 0x9A98: 0x56D7,\n 0x9A99: 0x56EE,\n 0x9A9A: 0x56F9,\n 0x9A9B: 0x5700,\n 0x9A9C: 0x56FF,\n 0x9A9D: 0x5704,\n 0x9A9E: 0x5709,\n 0x9A9F: 0x5708,\n 0x9AA0: 0x570B,\n 0x9AA1: 0x570D,\n 0x9AA2: 0x5713,\n 0x9AA3: 0x5718,\n 0x9AA4: 0x5716,\n 0x9AA5: 0x55C7,\n 0x9AA6: 0x571C,\n 0x9AA7: 0x5726,\n 0x9AA8: 0x5737,\n 0x9AA9: 0x5738,\n 0x9AAA: 0x574E,\n 0x9AAB: 0x573B,\n 0x9AAC: 0x5740,\n 0x9AAD: 0x574F,\n 0x9AAE: 0x5769,\n 0x9AAF: 0x57C0,\n 0x9AB0: 0x5788,\n 0x9AB1: 0x5761,\n 0x9AB2: 0x577F,\n 0x9AB3: 0x5789,\n 0x9AB4: 0x5793,\n 0x9AB5: 0x57A0,\n 0x9AB6: 0x57B3,\n 0x9AB7: 0x57A4,\n 0x9AB8: 0x57AA,\n 0x9AB9: 0x57B0,\n 0x9ABA: 0x57C3,\n 0x9ABB: 0x57C6,\n 0x9ABC: 0x57D4,\n 0x9ABD: 0x57D2,\n 0x9ABE: 0x57D3,\n 0x9ABF: 0x580A,\n 0x9AC0: 0x57D6,\n 0x9AC1: 0x57E3,\n 0x9AC2: 0x580B,\n 0x9AC3: 0x5819,\n 0x9AC4: 0x581D,\n 0x9AC5: 0x5872,\n 0x9AC6: 0x5821,\n 0x9AC7: 0x5862,\n 0x9AC8: 0x584B,\n 0x9AC9: 0x5870,\n 0x9ACA: 0x6BC0,\n 0x9ACB: 0x5852,\n 0x9ACC: 0x583D,\n 0x9ACD: 0x5879,\n 0x9ACE: 0x5885,\n 0x9ACF: 0x58B9,\n 0x9AD0: 0x589F,\n 0x9AD1: 0x58AB,\n 0x9AD2: 0x58BA,\n 0x9AD3: 0x58DE,\n 0x9AD4: 0x58BB,\n 0x9AD5: 0x58B8,\n 0x9AD6: 0x58AE,\n 0x9AD7: 0x58C5,\n 0x9AD8: 0x58D3,\n 0x9AD9: 0x58D1,\n 0x9ADA: 0x58D7,\n 0x9ADB: 0x58D9,\n 0x9ADC: 0x58D8,\n 0x9ADD: 0x58E5,\n 0x9ADE: 0x58DC,\n 0x9ADF: 0x58E4,\n 0x9AE0: 0x58DF,\n 0x9AE1: 0x58EF,\n 0x9AE2: 0x58FA,\n 0x9AE3: 0x58F9,\n 0x9AE4: 0x58FB,\n 0x9AE5: 0x58FC,\n 0x9AE6: 0x58FD,\n 0x9AE7: 0x5902,\n 0x9AE8: 0x590A,\n 0x9AE9: 0x5910,\n 0x9AEA: 0x591B,\n 0x9AEB: 0x68A6,\n 0x9AEC: 0x5925,\n 0x9AED: 0x592C,\n 0x9AEE: 0x592D,\n 0x9AEF: 0x5932,\n 0x9AF0: 0x5938,\n 0x9AF1: 0x593E,\n 0x9AF2: 0x7AD2,\n 0x9AF3: 0x5955,\n 0x9AF4: 0x5950,\n 0x9AF5: 0x594E,\n 0x9AF6: 0x595A,\n 0x9AF7: 0x5958,\n 0x9AF8: 0x5962,\n 0x9AF9: 0x5960,\n 0x9AFA: 0x5967,\n 0x9AFB: 0x596C,\n 0x9AFC: 0x5969,\n 0x9B40: 0x5978,\n 0x9B41: 0x5981,\n 0x9B42: 0x599D,\n 0x9B43: 0x4F5E,\n 0x9B44: 0x4FAB,\n 0x9B45: 0x59A3,\n 0x9B46: 0x59B2,\n 0x9B47: 0x59C6,\n 0x9B48: 0x59E8,\n 0x9B49: 0x59DC,\n 0x9B4A: 0x598D,\n 0x9B4B: 0x59D9,\n 0x9B4C: 0x59DA,\n 0x9B4D: 0x5A25,\n 0x9B4E: 0x5A1F,\n 0x9B4F: 0x5A11,\n 0x9B50: 0x5A1C,\n 0x9B51: 0x5A09,\n 0x9B52: 0x5A1A,\n 0x9B53: 0x5A40,\n 0x9B54: 0x5A6C,\n 0x9B55: 0x5A49,\n 0x9B56: 0x5A35,\n 0x9B57: 0x5A36,\n 0x9B58: 0x5A62,\n 0x9B59: 0x5A6A,\n 0x9B5A: 0x5A9A,\n 0x9B5B: 0x5ABC,\n 0x9B5C: 0x5ABE,\n 0x9B5D: 0x5ACB,\n 0x9B5E: 0x5AC2,\n 0x9B5F: 0x5ABD,\n 0x9B60: 0x5AE3,\n 0x9B61: 0x5AD7,\n 0x9B62: 0x5AE6,\n 0x9B63: 0x5AE9,\n 0x9B64: 0x5AD6,\n 0x9B65: 0x5AFA,\n 0x9B66: 0x5AFB,\n 0x9B67: 0x5B0C,\n 0x9B68: 0x5B0B,\n 0x9B69: 0x5B16,\n 0x9B6A: 0x5B32,\n 0x9B6B: 0x5AD0,\n 0x9B6C: 0x5B2A,\n 0x9B6D: 0x5B36,\n 0x9B6E: 0x5B3E,\n 0x9B6F: 0x5B43,\n 0x9B70: 0x5B45,\n 0x9B71: 0x5B40,\n 0x9B72: 0x5B51,\n 0x9B73: 0x5B55,\n 0x9B74: 0x5B5A,\n 0x9B75: 0x5B5B,\n 0x9B76: 0x5B65,\n 0x9B77: 0x5B69,\n 0x9B78: 0x5B70,\n 0x9B79: 0x5B73,\n 0x9B7A: 0x5B75,\n 0x9B7B: 0x5B78,\n 0x9B7C: 0x6588,\n 0x9B7D: 0x5B7A,\n 0x9B7E: 0x5B80,\n 0x9B80: 0x5B83,\n 0x9B81: 0x5BA6,\n 0x9B82: 0x5BB8,\n 0x9B83: 0x5BC3,\n 0x9B84: 0x5BC7,\n 0x9B85: 0x5BC9,\n 0x9B86: 0x5BD4,\n 0x9B87: 0x5BD0,\n 0x9B88: 0x5BE4,\n 0x9B89: 0x5BE6,\n 0x9B8A: 0x5BE2,\n 0x9B8B: 0x5BDE,\n 0x9B8C: 0x5BE5,\n 0x9B8D: 0x5BEB,\n 0x9B8E: 0x5BF0,\n 0x9B8F: 0x5BF6,\n 0x9B90: 0x5BF3,\n 0x9B91: 0x5C05,\n 0x9B92: 0x5C07,\n 0x9B93: 0x5C08,\n 0x9B94: 0x5C0D,\n 0x9B95: 0x5C13,\n 0x9B96: 0x5C20,\n 0x9B97: 0x5C22,\n 0x9B98: 0x5C28,\n 0x9B99: 0x5C38,\n 0x9B9A: 0x5C39,\n 0x9B9B: 0x5C41,\n 0x9B9C: 0x5C46,\n 0x9B9D: 0x5C4E,\n 0x9B9E: 0x5C53,\n 0x9B9F: 0x5C50,\n 0x9BA0: 0x5C4F,\n 0x9BA1: 0x5B71,\n 0x9BA2: 0x5C6C,\n 0x9BA3: 0x5C6E,\n 0x9BA4: 0x4E62,\n 0x9BA5: 0x5C76,\n 0x9BA6: 0x5C79,\n 0x9BA7: 0x5C8C,\n 0x9BA8: 0x5C91,\n 0x9BA9: 0x5C94,\n 0x9BAA: 0x599B,\n 0x9BAB: 0x5CAB,\n 0x9BAC: 0x5CBB,\n 0x9BAD: 0x5CB6,\n 0x9BAE: 0x5CBC,\n 0x9BAF: 0x5CB7,\n 0x9BB0: 0x5CC5,\n 0x9BB1: 0x5CBE,\n 0x9BB2: 0x5CC7,\n 0x9BB3: 0x5CD9,\n 0x9BB4: 0x5CE9,\n 0x9BB5: 0x5CFD,\n 0x9BB6: 0x5CFA,\n 0x9BB7: 0x5CED,\n 0x9BB8: 0x5D8C,\n 0x9BB9: 0x5CEA,\n 0x9BBA: 0x5D0B,\n 0x9BBB: 0x5D15,\n 0x9BBC: 0x5D17,\n 0x9BBD: 0x5D5C,\n 0x9BBE: 0x5D1F,\n 0x9BBF: 0x5D1B,\n 0x9BC0: 0x5D11,\n 0x9BC1: 0x5D14,\n 0x9BC2: 0x5D22,\n 0x9BC3: 0x5D1A,\n 0x9BC4: 0x5D19,\n 0x9BC5: 0x5D18,\n 0x9BC6: 0x5D4C,\n 0x9BC7: 0x5D52,\n 0x9BC8: 0x5D4E,\n 0x9BC9: 0x5D4B,\n 0x9BCA: 0x5D6C,\n 0x9BCB: 0x5D73,\n 0x9BCC: 0x5D76,\n 0x9BCD: 0x5D87,\n 0x9BCE: 0x5D84,\n 0x9BCF: 0x5D82,\n 0x9BD0: 0x5DA2,\n 0x9BD1: 0x5D9D,\n 0x9BD2: 0x5DAC,\n 0x9BD3: 0x5DAE,\n 0x9BD4: 0x5DBD,\n 0x9BD5: 0x5D90,\n 0x9BD6: 0x5DB7,\n 0x9BD7: 0x5DBC,\n 0x9BD8: 0x5DC9,\n 0x9BD9: 0x5DCD,\n 0x9BDA: 0x5DD3,\n 0x9BDB: 0x5DD2,\n 0x9BDC: 0x5DD6,\n 0x9BDD: 0x5DDB,\n 0x9BDE: 0x5DEB,\n 0x9BDF: 0x5DF2,\n 0x9BE0: 0x5DF5,\n 0x9BE1: 0x5E0B,\n 0x9BE2: 0x5E1A,\n 0x9BE3: 0x5E19,\n 0x9BE4: 0x5E11,\n 0x9BE5: 0x5E1B,\n 0x9BE6: 0x5E36,\n 0x9BE7: 0x5E37,\n 0x9BE8: 0x5E44,\n 0x9BE9: 0x5E43,\n 0x9BEA: 0x5E40,\n 0x9BEB: 0x5E4E,\n 0x9BEC: 0x5E57,\n 0x9BED: 0x5E54,\n 0x9BEE: 0x5E5F,\n 0x9BEF: 0x5E62,\n 0x9BF0: 0x5E64,\n 0x9BF1: 0x5E47,\n 0x9BF2: 0x5E75,\n 0x9BF3: 0x5E76,\n 0x9BF4: 0x5E7A,\n 0x9BF5: 0x9EBC,\n 0x9BF6: 0x5E7F,\n 0x9BF7: 0x5EA0,\n 0x9BF8: 0x5EC1,\n 0x9BF9: 0x5EC2,\n 0x9BFA: 0x5EC8,\n 0x9BFB: 0x5ED0,\n 0x9BFC: 0x5ECF,\n 0x9C40: 0x5ED6,\n 0x9C41: 0x5EE3,\n 0x9C42: 0x5EDD,\n 0x9C43: 0x5EDA,\n 0x9C44: 0x5EDB,\n 0x9C45: 0x5EE2,\n 0x9C46: 0x5EE1,\n 0x9C47: 0x5EE8,\n 0x9C48: 0x5EE9,\n 0x9C49: 0x5EEC,\n 0x9C4A: 0x5EF1,\n 0x9C4B: 0x5EF3,\n 0x9C4C: 0x5EF0,\n 0x9C4D: 0x5EF4,\n 0x9C4E: 0x5EF8,\n 0x9C4F: 0x5EFE,\n 0x9C50: 0x5F03,\n 0x9C51: 0x5F09,\n 0x9C52: 0x5F5D,\n 0x9C53: 0x5F5C,\n 0x9C54: 0x5F0B,\n 0x9C55: 0x5F11,\n 0x9C56: 0x5F16,\n 0x9C57: 0x5F29,\n 0x9C58: 0x5F2D,\n 0x9C59: 0x5F38,\n 0x9C5A: 0x5F41,\n 0x9C5B: 0x5F48,\n 0x9C5C: 0x5F4C,\n 0x9C5D: 0x5F4E,\n 0x9C5E: 0x5F2F,\n 0x9C5F: 0x5F51,\n 0x9C60: 0x5F56,\n 0x9C61: 0x5F57,\n 0x9C62: 0x5F59,\n 0x9C63: 0x5F61,\n 0x9C64: 0x5F6D,\n 0x9C65: 0x5F73,\n 0x9C66: 0x5F77,\n 0x9C67: 0x5F83,\n 0x9C68: 0x5F82,\n 0x9C69: 0x5F7F,\n 0x9C6A: 0x5F8A,\n 0x9C6B: 0x5F88,\n 0x9C6C: 0x5F91,\n 0x9C6D: 0x5F87,\n 0x9C6E: 0x5F9E,\n 0x9C6F: 0x5F99,\n 0x9C70: 0x5F98,\n 0x9C71: 0x5FA0,\n 0x9C72: 0x5FA8,\n 0x9C73: 0x5FAD,\n 0x9C74: 0x5FBC,\n 0x9C75: 0x5FD6,\n 0x9C76: 0x5FFB,\n 0x9C77: 0x5FE4,\n 0x9C78: 0x5FF8,\n 0x9C79: 0x5FF1,\n 0x9C7A: 0x5FDD,\n 0x9C7B: 0x60B3,\n 0x9C7C: 0x5FFF,\n 0x9C7D: 0x6021,\n 0x9C7E: 0x6060,\n 0x9C80: 0x6019,\n 0x9C81: 0x6010,\n 0x9C82: 0x6029,\n 0x9C83: 0x600E,\n 0x9C84: 0x6031,\n 0x9C85: 0x601B,\n 0x9C86: 0x6015,\n 0x9C87: 0x602B,\n 0x9C88: 0x6026,\n 0x9C89: 0x600F,\n 0x9C8A: 0x603A,\n 0x9C8B: 0x605A,\n 0x9C8C: 0x6041,\n 0x9C8D: 0x606A,\n 0x9C8E: 0x6077,\n 0x9C8F: 0x605F,\n 0x9C90: 0x604A,\n 0x9C91: 0x6046,\n 0x9C92: 0x604D,\n 0x9C93: 0x6063,\n 0x9C94: 0x6043,\n 0x9C95: 0x6064,\n 0x9C96: 0x6042,\n 0x9C97: 0x606C,\n 0x9C98: 0x606B,\n 0x9C99: 0x6059,\n 0x9C9A: 0x6081,\n 0x9C9B: 0x608D,\n 0x9C9C: 0x60E7,\n 0x9C9D: 0x6083,\n 0x9C9E: 0x609A,\n 0x9C9F: 0x6084,\n 0x9CA0: 0x609B,\n 0x9CA1: 0x6096,\n 0x9CA2: 0x6097,\n 0x9CA3: 0x6092,\n 0x9CA4: 0x60A7,\n 0x9CA5: 0x608B,\n 0x9CA6: 0x60E1,\n 0x9CA7: 0x60B8,\n 0x9CA8: 0x60E0,\n 0x9CA9: 0x60D3,\n 0x9CAA: 0x60B4,\n 0x9CAB: 0x5FF0,\n 0x9CAC: 0x60BD,\n 0x9CAD: 0x60C6,\n 0x9CAE: 0x60B5,\n 0x9CAF: 0x60D8,\n 0x9CB0: 0x614D,\n 0x9CB1: 0x6115,\n 0x9CB2: 0x6106,\n 0x9CB3: 0x60F6,\n 0x9CB4: 0x60F7,\n 0x9CB5: 0x6100,\n 0x9CB6: 0x60F4,\n 0x9CB7: 0x60FA,\n 0x9CB8: 0x6103,\n 0x9CB9: 0x6121,\n 0x9CBA: 0x60FB,\n 0x9CBB: 0x60F1,\n 0x9CBC: 0x610D,\n 0x9CBD: 0x610E,\n 0x9CBE: 0x6147,\n 0x9CBF: 0x613E,\n 0x9CC0: 0x6128,\n 0x9CC1: 0x6127,\n 0x9CC2: 0x614A,\n 0x9CC3: 0x613F,\n 0x9CC4: 0x613C,\n 0x9CC5: 0x612C,\n 0x9CC6: 0x6134,\n 0x9CC7: 0x613D,\n 0x9CC8: 0x6142,\n 0x9CC9: 0x6144,\n 0x9CCA: 0x6173,\n 0x9CCB: 0x6177,\n 0x9CCC: 0x6158,\n 0x9CCD: 0x6159,\n 0x9CCE: 0x615A,\n 0x9CCF: 0x616B,\n 0x9CD0: 0x6174,\n 0x9CD1: 0x616F,\n 0x9CD2: 0x6165,\n 0x9CD3: 0x6171,\n 0x9CD4: 0x615F,\n 0x9CD5: 0x615D,\n 0x9CD6: 0x6153,\n 0x9CD7: 0x6175,\n 0x9CD8: 0x6199,\n 0x9CD9: 0x6196,\n 0x9CDA: 0x6187,\n 0x9CDB: 0x61AC,\n 0x9CDC: 0x6194,\n 0x9CDD: 0x619A,\n 0x9CDE: 0x618A,\n 0x9CDF: 0x6191,\n 0x9CE0: 0x61AB,\n 0x9CE1: 0x61AE,\n 0x9CE2: 0x61CC,\n 0x9CE3: 0x61CA,\n 0x9CE4: 0x61C9,\n 0x9CE5: 0x61F7,\n 0x9CE6: 0x61C8,\n 0x9CE7: 0x61C3,\n 0x9CE8: 0x61C6,\n 0x9CE9: 0x61BA,\n 0x9CEA: 0x61CB,\n 0x9CEB: 0x7F79,\n 0x9CEC: 0x61CD,\n 0x9CED: 0x61E6,\n 0x9CEE: 0x61E3,\n 0x9CEF: 0x61F6,\n 0x9CF0: 0x61FA,\n 0x9CF1: 0x61F4,\n 0x9CF2: 0x61FF,\n 0x9CF3: 0x61FD,\n 0x9CF4: 0x61FC,\n 0x9CF5: 0x61FE,\n 0x9CF6: 0x6200,\n 0x9CF7: 0x6208,\n 0x9CF8: 0x6209,\n 0x9CF9: 0x620D,\n 0x9CFA: 0x620C,\n 0x9CFB: 0x6214,\n 0x9CFC: 0x621B,\n 0x9D40: 0x621E,\n 0x9D41: 0x6221,\n 0x9D42: 0x622A,\n 0x9D43: 0x622E,\n 0x9D44: 0x6230,\n 0x9D45: 0x6232,\n 0x9D46: 0x6233,\n 0x9D47: 0x6241,\n 0x9D48: 0x624E,\n 0x9D49: 0x625E,\n 0x9D4A: 0x6263,\n 0x9D4B: 0x625B,\n 0x9D4C: 0x6260,\n 0x9D4D: 0x6268,\n 0x9D4E: 0x627C,\n 0x9D4F: 0x6282,\n 0x9D50: 0x6289,\n 0x9D51: 0x627E,\n 0x9D52: 0x6292,\n 0x9D53: 0x6293,\n 0x9D54: 0x6296,\n 0x9D55: 0x62D4,\n 0x9D56: 0x6283,\n 0x9D57: 0x6294,\n 0x9D58: 0x62D7,\n 0x9D59: 0x62D1,\n 0x9D5A: 0x62BB,\n 0x9D5B: 0x62CF,\n 0x9D5C: 0x62FF,\n 0x9D5D: 0x62C6,\n 0x9D5E: 0x64D4,\n 0x9D5F: 0x62C8,\n 0x9D60: 0x62DC,\n 0x9D61: 0x62CC,\n 0x9D62: 0x62CA,\n 0x9D63: 0x62C2,\n 0x9D64: 0x62C7,\n 0x9D65: 0x629B,\n 0x9D66: 0x62C9,\n 0x9D67: 0x630C,\n 0x9D68: 0x62EE,\n 0x9D69: 0x62F1,\n 0x9D6A: 0x6327,\n 0x9D6B: 0x6302,\n 0x9D6C: 0x6308,\n 0x9D6D: 0x62EF,\n 0x9D6E: 0x62F5,\n 0x9D6F: 0x6350,\n 0x9D70: 0x633E,\n 0x9D71: 0x634D,\n 0x9D72: 0x641C,\n 0x9D73: 0x634F,\n 0x9D74: 0x6396,\n 0x9D75: 0x638E,\n 0x9D76: 0x6380,\n 0x9D77: 0x63AB,\n 0x9D78: 0x6376,\n 0x9D79: 0x63A3,\n 0x9D7A: 0x638F,\n 0x9D7B: 0x6389,\n 0x9D7C: 0x639F,\n 0x9D7D: 0x63B5,\n 0x9D7E: 0x636B,\n 0x9D80: 0x6369,\n 0x9D81: 0x63BE,\n 0x9D82: 0x63E9,\n 0x9D83: 0x63C0,\n 0x9D84: 0x63C6,\n 0x9D85: 0x63E3,\n 0x9D86: 0x63C9,\n 0x9D87: 0x63D2,\n 0x9D88: 0x63F6,\n 0x9D89: 0x63C4,\n 0x9D8A: 0x6416,\n 0x9D8B: 0x6434,\n 0x9D8C: 0x6406,\n 0x9D8D: 0x6413,\n 0x9D8E: 0x6426,\n 0x9D8F: 0x6436,\n 0x9D90: 0x651D,\n 0x9D91: 0x6417,\n 0x9D92: 0x6428,\n 0x9D93: 0x640F,\n 0x9D94: 0x6467,\n 0x9D95: 0x646F,\n 0x9D96: 0x6476,\n 0x9D97: 0x644E,\n 0x9D98: 0x652A,\n 0x9D99: 0x6495,\n 0x9D9A: 0x6493,\n 0x9D9B: 0x64A5,\n 0x9D9C: 0x64A9,\n 0x9D9D: 0x6488,\n 0x9D9E: 0x64BC,\n 0x9D9F: 0x64DA,\n 0x9DA0: 0x64D2,\n 0x9DA1: 0x64C5,\n 0x9DA2: 0x64C7,\n 0x9DA3: 0x64BB,\n 0x9DA4: 0x64D8,\n 0x9DA5: 0x64C2,\n 0x9DA6: 0x64F1,\n 0x9DA7: 0x64E7,\n 0x9DA8: 0x8209,\n 0x9DA9: 0x64E0,\n 0x9DAA: 0x64E1,\n 0x9DAB: 0x62AC,\n 0x9DAC: 0x64E3,\n 0x9DAD: 0x64EF,\n 0x9DAE: 0x652C,\n 0x9DAF: 0x64F6,\n 0x9DB0: 0x64F4,\n 0x9DB1: 0x64F2,\n 0x9DB2: 0x64FA,\n 0x9DB3: 0x6500,\n 0x9DB4: 0x64FD,\n 0x9DB5: 0x6518,\n 0x9DB6: 0x651C,\n 0x9DB7: 0x6505,\n 0x9DB8: 0x6524,\n 0x9DB9: 0x6523,\n 0x9DBA: 0x652B,\n 0x9DBB: 0x6534,\n 0x9DBC: 0x6535,\n 0x9DBD: 0x6537,\n 0x9DBE: 0x6536,\n 0x9DBF: 0x6538,\n 0x9DC0: 0x754B,\n 0x9DC1: 0x6548,\n 0x9DC2: 0x6556,\n 0x9DC3: 0x6555,\n 0x9DC4: 0x654D,\n 0x9DC5: 0x6558,\n 0x9DC6: 0x655E,\n 0x9DC7: 0x655D,\n 0x9DC8: 0x6572,\n 0x9DC9: 0x6578,\n 0x9DCA: 0x6582,\n 0x9DCB: 0x6583,\n 0x9DCC: 0x8B8A,\n 0x9DCD: 0x659B,\n 0x9DCE: 0x659F,\n 0x9DCF: 0x65AB,\n 0x9DD0: 0x65B7,\n 0x9DD1: 0x65C3,\n 0x9DD2: 0x65C6,\n 0x9DD3: 0x65C1,\n 0x9DD4: 0x65C4,\n 0x9DD5: 0x65CC,\n 0x9DD6: 0x65D2,\n 0x9DD7: 0x65DB,\n 0x9DD8: 0x65D9,\n 0x9DD9: 0x65E0,\n 0x9DDA: 0x65E1,\n 0x9DDB: 0x65F1,\n 0x9DDC: 0x6772,\n 0x9DDD: 0x660A,\n 0x9DDE: 0x6603,\n 0x9DDF: 0x65FB,\n 0x9DE0: 0x6773,\n 0x9DE1: 0x6635,\n 0x9DE2: 0x6636,\n 0x9DE3: 0x6634,\n 0x9DE4: 0x661C,\n 0x9DE5: 0x664F,\n 0x9DE6: 0x6644,\n 0x9DE7: 0x6649,\n 0x9DE8: 0x6641,\n 0x9DE9: 0x665E,\n 0x9DEA: 0x665D,\n 0x9DEB: 0x6664,\n 0x9DEC: 0x6667,\n 0x9DED: 0x6668,\n 0x9DEE: 0x665F,\n 0x9DEF: 0x6662,\n 0x9DF0: 0x6670,\n 0x9DF1: 0x6683,\n 0x9DF2: 0x6688,\n 0x9DF3: 0x668E,\n 0x9DF4: 0x6689,\n 0x9DF5: 0x6684,\n 0x9DF6: 0x6698,\n 0x9DF7: 0x669D,\n 0x9DF8: 0x66C1,\n 0x9DF9: 0x66B9,\n 0x9DFA: 0x66C9,\n 0x9DFB: 0x66BE,\n 0x9DFC: 0x66BC,\n 0x9E40: 0x66C4,\n 0x9E41: 0x66B8,\n 0x9E42: 0x66D6,\n 0x9E43: 0x66DA,\n 0x9E44: 0x66E0,\n 0x9E45: 0x663F,\n 0x9E46: 0x66E6,\n 0x9E47: 0x66E9,\n 0x9E48: 0x66F0,\n 0x9E49: 0x66F5,\n 0x9E4A: 0x66F7,\n 0x9E4B: 0x670F,\n 0x9E4C: 0x6716,\n 0x9E4D: 0x671E,\n 0x9E4E: 0x6726,\n 0x9E4F: 0x6727,\n 0x9E50: 0x9738,\n 0x9E51: 0x672E,\n 0x9E52: 0x673F,\n 0x9E53: 0x6736,\n 0x9E54: 0x6741,\n 0x9E55: 0x6738,\n 0x9E56: 0x6737,\n 0x9E57: 0x6746,\n 0x9E58: 0x675E,\n 0x9E59: 0x6760,\n 0x9E5A: 0x6759,\n 0x9E5B: 0x6763,\n 0x9E5C: 0x6764,\n 0x9E5D: 0x6789,\n 0x9E5E: 0x6770,\n 0x9E5F: 0x67A9,\n 0x9E60: 0x677C,\n 0x9E61: 0x676A,\n 0x9E62: 0x678C,\n 0x9E63: 0x678B,\n 0x9E64: 0x67A6,\n 0x9E65: 0x67A1,\n 0x9E66: 0x6785,\n 0x9E67: 0x67B7,\n 0x9E68: 0x67EF,\n 0x9E69: 0x67B4,\n 0x9E6A: 0x67EC,\n 0x9E6B: 0x67B3,\n 0x9E6C: 0x67E9,\n 0x9E6D: 0x67B8,\n 0x9E6E: 0x67E4,\n 0x9E6F: 0x67DE,\n 0x9E70: 0x67DD,\n 0x9E71: 0x67E2,\n 0x9E72: 0x67EE,\n 0x9E73: 0x67B9,\n 0x9E74: 0x67CE,\n 0x9E75: 0x67C6,\n 0x9E76: 0x67E7,\n 0x9E77: 0x6A9C,\n 0x9E78: 0x681E,\n 0x9E79: 0x6846,\n 0x9E7A: 0x6829,\n 0x9E7B: 0x6840,\n 0x9E7C: 0x684D,\n 0x9E7D: 0x6832,\n 0x9E7E: 0x684E,\n 0x9E80: 0x68B3,\n 0x9E81: 0x682B,\n 0x9E82: 0x6859,\n 0x9E83: 0x6863,\n 0x9E84: 0x6877,\n 0x9E85: 0x687F,\n 0x9E86: 0x689F,\n 0x9E87: 0x688F,\n 0x9E88: 0x68AD,\n 0x9E89: 0x6894,\n 0x9E8A: 0x689D,\n 0x9E8B: 0x689B,\n 0x9E8C: 0x6883,\n 0x9E8D: 0x6AAE,\n 0x9E8E: 0x68B9,\n 0x9E8F: 0x6874,\n 0x9E90: 0x68B5,\n 0x9E91: 0x68A0,\n 0x9E92: 0x68BA,\n 0x9E93: 0x690F,\n 0x9E94: 0x688D,\n 0x9E95: 0x687E,\n 0x9E96: 0x6901,\n 0x9E97: 0x68CA,\n 0x9E98: 0x6908,\n 0x9E99: 0x68D8,\n 0x9E9A: 0x6922,\n 0x9E9B: 0x6926,\n 0x9E9C: 0x68E1,\n 0x9E9D: 0x690C,\n 0x9E9E: 0x68CD,\n 0x9E9F: 0x68D4,\n 0x9EA0: 0x68E7,\n 0x9EA1: 0x68D5,\n 0x9EA2: 0x6936,\n 0x9EA3: 0x6912,\n 0x9EA4: 0x6904,\n 0x9EA5: 0x68D7,\n 0x9EA6: 0x68E3,\n 0x9EA7: 0x6925,\n 0x9EA8: 0x68F9,\n 0x9EA9: 0x68E0,\n 0x9EAA: 0x68EF,\n 0x9EAB: 0x6928,\n 0x9EAC: 0x692A,\n 0x9EAD: 0x691A,\n 0x9EAE: 0x6923,\n 0x9EAF: 0x6921,\n 0x9EB0: 0x68C6,\n 0x9EB1: 0x6979,\n 0x9EB2: 0x6977,\n 0x9EB3: 0x695C,\n 0x9EB4: 0x6978,\n 0x9EB5: 0x696B,\n 0x9EB6: 0x6954,\n 0x9EB7: 0x697E,\n 0x9EB8: 0x696E,\n 0x9EB9: 0x6939,\n 0x9EBA: 0x6974,\n 0x9EBB: 0x693D,\n 0x9EBC: 0x6959,\n 0x9EBD: 0x6930,\n 0x9EBE: 0x6961,\n 0x9EBF: 0x695E,\n 0x9EC0: 0x695D,\n 0x9EC1: 0x6981,\n 0x9EC2: 0x696A,\n 0x9EC3: 0x69B2,\n 0x9EC4: 0x69AE,\n 0x9EC5: 0x69D0,\n 0x9EC6: 0x69BF,\n 0x9EC7: 0x69C1,\n 0x9EC8: 0x69D3,\n 0x9EC9: 0x69BE,\n 0x9ECA: 0x69CE,\n 0x9ECB: 0x5BE8,\n 0x9ECC: 0x69CA,\n 0x9ECD: 0x69DD,\n 0x9ECE: 0x69BB,\n 0x9ECF: 0x69C3,\n 0x9ED0: 0x69A7,\n 0x9ED1: 0x6A2E,\n 0x9ED2: 0x6991,\n 0x9ED3: 0x69A0,\n 0x9ED4: 0x699C,\n 0x9ED5: 0x6995,\n 0x9ED6: 0x69B4,\n 0x9ED7: 0x69DE,\n 0x9ED8: 0x69E8,\n 0x9ED9: 0x6A02,\n 0x9EDA: 0x6A1B,\n 0x9EDB: 0x69FF,\n 0x9EDC: 0x6B0A,\n 0x9EDD: 0x69F9,\n 0x9EDE: 0x69F2,\n 0x9EDF: 0x69E7,\n 0x9EE0: 0x6A05,\n 0x9EE1: 0x69B1,\n 0x9EE2: 0x6A1E,\n 0x9EE3: 0x69ED,\n 0x9EE4: 0x6A14,\n 0x9EE5: 0x69EB,\n 0x9EE6: 0x6A0A,\n 0x9EE7: 0x6A12,\n 0x9EE8: 0x6AC1,\n 0x9EE9: 0x6A23,\n 0x9EEA: 0x6A13,\n 0x9EEB: 0x6A44,\n 0x9EEC: 0x6A0C,\n 0x9EED: 0x6A72,\n 0x9EEE: 0x6A36,\n 0x9EEF: 0x6A78,\n 0x9EF0: 0x6A47,\n 0x9EF1: 0x6A62,\n 0x9EF2: 0x6A59,\n 0x9EF3: 0x6A66,\n 0x9EF4: 0x6A48,\n 0x9EF5: 0x6A38,\n 0x9EF6: 0x6A22,\n 0x9EF7: 0x6A90,\n 0x9EF8: 0x6A8D,\n 0x9EF9: 0x6AA0,\n 0x9EFA: 0x6A84,\n 0x9EFB: 0x6AA2,\n 0x9EFC: 0x6AA3,\n 0x9F40: 0x6A97,\n 0x9F41: 0x8617,\n 0x9F42: 0x6ABB,\n 0x9F43: 0x6AC3,\n 0x9F44: 0x6AC2,\n 0x9F45: 0x6AB8,\n 0x9F46: 0x6AB3,\n 0x9F47: 0x6AAC,\n 0x9F48: 0x6ADE,\n 0x9F49: 0x6AD1,\n 0x9F4A: 0x6ADF,\n 0x9F4B: 0x6AAA,\n 0x9F4C: 0x6ADA,\n 0x9F4D: 0x6AEA,\n 0x9F4E: 0x6AFB,\n 0x9F4F: 0x6B05,\n 0x9F50: 0x8616,\n 0x9F51: 0x6AFA,\n 0x9F52: 0x6B12,\n 0x9F53: 0x6B16,\n 0x9F54: 0x9B31,\n 0x9F55: 0x6B1F,\n 0x9F56: 0x6B38,\n 0x9F57: 0x6B37,\n 0x9F58: 0x76DC,\n 0x9F59: 0x6B39,\n 0x9F5A: 0x98EE,\n 0x9F5B: 0x6B47,\n 0x9F5C: 0x6B43,\n 0x9F5D: 0x6B49,\n 0x9F5E: 0x6B50,\n 0x9F5F: 0x6B59,\n 0x9F60: 0x6B54,\n 0x9F61: 0x6B5B,\n 0x9F62: 0x6B5F,\n 0x9F63: 0x6B61,\n 0x9F64: 0x6B78,\n 0x9F65: 0x6B79,\n 0x9F66: 0x6B7F,\n 0x9F67: 0x6B80,\n 0x9F68: 0x6B84,\n 0x9F69: 0x6B83,\n 0x9F6A: 0x6B8D,\n 0x9F6B: 0x6B98,\n 0x9F6C: 0x6B95,\n 0x9F6D: 0x6B9E,\n 0x9F6E: 0x6BA4,\n 0x9F6F: 0x6BAA,\n 0x9F70: 0x6BAB,\n 0x9F71: 0x6BAF,\n 0x9F72: 0x6BB2,\n 0x9F73: 0x6BB1,\n 0x9F74: 0x6BB3,\n 0x9F75: 0x6BB7,\n 0x9F76: 0x6BBC,\n 0x9F77: 0x6BC6,\n 0x9F78: 0x6BCB,\n 0x9F79: 0x6BD3,\n 0x9F7A: 0x6BDF,\n 0x9F7B: 0x6BEC,\n 0x9F7C: 0x6BEB,\n 0x9F7D: 0x6BF3,\n 0x9F7E: 0x6BEF,\n 0x9F80: 0x9EBE,\n 0x9F81: 0x6C08,\n 0x9F82: 0x6C13,\n 0x9F83: 0x6C14,\n 0x9F84: 0x6C1B,\n 0x9F85: 0x6C24,\n 0x9F86: 0x6C23,\n 0x9F87: 0x6C5E,\n 0x9F88: 0x6C55,\n 0x9F89: 0x6C62,\n 0x9F8A: 0x6C6A,\n 0x9F8B: 0x6C82,\n 0x9F8C: 0x6C8D,\n 0x9F8D: 0x6C9A,\n 0x9F8E: 0x6C81,\n 0x9F8F: 0x6C9B,\n 0x9F90: 0x6C7E,\n 0x9F91: 0x6C68,\n 0x9F92: 0x6C73,\n 0x9F93: 0x6C92,\n 0x9F94: 0x6C90,\n 0x9F95: 0x6CC4,\n 0x9F96: 0x6CF1,\n 0x9F97: 0x6CD3,\n 0x9F98: 0x6CBD,\n 0x9F99: 0x6CD7,\n 0x9F9A: 0x6CC5,\n 0x9F9B: 0x6CDD,\n 0x9F9C: 0x6CAE,\n 0x9F9D: 0x6CB1,\n 0x9F9E: 0x6CBE,\n 0x9F9F: 0x6CBA,\n 0x9FA0: 0x6CDB,\n 0x9FA1: 0x6CEF,\n 0x9FA2: 0x6CD9,\n 0x9FA3: 0x6CEA,\n 0x9FA4: 0x6D1F,\n 0x9FA5: 0x884D,\n 0x9FA6: 0x6D36,\n 0x9FA7: 0x6D2B,\n 0x9FA8: 0x6D3D,\n 0x9FA9: 0x6D38,\n 0x9FAA: 0x6D19,\n 0x9FAB: 0x6D35,\n 0x9FAC: 0x6D33,\n 0x9FAD: 0x6D12,\n 0x9FAE: 0x6D0C,\n 0x9FAF: 0x6D63,\n 0x9FB0: 0x6D93,\n 0x9FB1: 0x6D64,\n 0x9FB2: 0x6D5A,\n 0x9FB3: 0x6D79,\n 0x9FB4: 0x6D59,\n 0x9FB5: 0x6D8E,\n 0x9FB6: 0x6D95,\n 0x9FB7: 0x6FE4,\n 0x9FB8: 0x6D85,\n 0x9FB9: 0x6DF9,\n 0x9FBA: 0x6E15,\n 0x9FBB: 0x6E0A,\n 0x9FBC: 0x6DB5,\n 0x9FBD: 0x6DC7,\n 0x9FBE: 0x6DE6,\n 0x9FBF: 0x6DB8,\n 0x9FC0: 0x6DC6,\n 0x9FC1: 0x6DEC,\n 0x9FC2: 0x6DDE,\n 0x9FC3: 0x6DCC,\n 0x9FC4: 0x6DE8,\n 0x9FC5: 0x6DD2,\n 0x9FC6: 0x6DC5,\n 0x9FC7: 0x6DFA,\n 0x9FC8: 0x6DD9,\n 0x9FC9: 0x6DE4,\n 0x9FCA: 0x6DD5,\n 0x9FCB: 0x6DEA,\n 0x9FCC: 0x6DEE,\n 0x9FCD: 0x6E2D,\n 0x9FCE: 0x6E6E,\n 0x9FCF: 0x6E2E,\n 0x9FD0: 0x6E19,\n 0x9FD1: 0x6E72,\n 0x9FD2: 0x6E5F,\n 0x9FD3: 0x6E3E,\n 0x9FD4: 0x6E23,\n 0x9FD5: 0x6E6B,\n 0x9FD6: 0x6E2B,\n 0x9FD7: 0x6E76,\n 0x9FD8: 0x6E4D,\n 0x9FD9: 0x6E1F,\n 0x9FDA: 0x6E43,\n 0x9FDB: 0x6E3A,\n 0x9FDC: 0x6E4E,\n 0x9FDD: 0x6E24,\n 0x9FDE: 0x6EFF,\n 0x9FDF: 0x6E1D,\n 0x9FE0: 0x6E38,\n 0x9FE1: 0x6E82,\n 0x9FE2: 0x6EAA,\n 0x9FE3: 0x6E98,\n 0x9FE4: 0x6EC9,\n 0x9FE5: 0x6EB7,\n 0x9FE6: 0x6ED3,\n 0x9FE7: 0x6EBD,\n 0x9FE8: 0x6EAF,\n 0x9FE9: 0x6EC4,\n 0x9FEA: 0x6EB2,\n 0x9FEB: 0x6ED4,\n 0x9FEC: 0x6ED5,\n 0x9FED: 0x6E8F,\n 0x9FEE: 0x6EA5,\n 0x9FEF: 0x6EC2,\n 0x9FF0: 0x6E9F,\n 0x9FF1: 0x6F41,\n 0x9FF2: 0x6F11,\n 0x9FF3: 0x704C,\n 0x9FF4: 0x6EEC,\n 0x9FF5: 0x6EF8,\n 0x9FF6: 0x6EFE,\n 0x9FF7: 0x6F3F,\n 0x9FF8: 0x6EF2,\n 0x9FF9: 0x6F31,\n 0x9FFA: 0x6EEF,\n 0x9FFB: 0x6F32,\n 0x9FFC: 0x6ECC,\n 0xA1: 0xFF61,\n 0xA2: 0xFF62,\n 0xA3: 0xFF63,\n 0xA4: 0xFF64,\n 0xA5: 0xFF65,\n 0xA6: 0xFF66,\n 0xA7: 0xFF67,\n 0xA8: 0xFF68,\n 0xA9: 0xFF69,\n 0xAA: 0xFF6A,\n 0xAB: 0xFF6B,\n 0xAC: 0xFF6C,\n 0xAD: 0xFF6D,\n 0xAE: 0xFF6E,\n 0xAF: 0xFF6F,\n 0xB0: 0xFF70,\n 0xB1: 0xFF71,\n 0xB2: 0xFF72,\n 0xB3: 0xFF73,\n 0xB4: 0xFF74,\n 0xB5: 0xFF75,\n 0xB6: 0xFF76,\n 0xB7: 0xFF77,\n 0xB8: 0xFF78,\n 0xB9: 0xFF79,\n 0xBA: 0xFF7A,\n 0xBB: 0xFF7B,\n 0xBC: 0xFF7C,\n 0xBD: 0xFF7D,\n 0xBE: 0xFF7E,\n 0xBF: 0xFF7F,\n 0xC0: 0xFF80,\n 0xC1: 0xFF81,\n 0xC2: 0xFF82,\n 0xC3: 0xFF83,\n 0xC4: 0xFF84,\n 0xC5: 0xFF85,\n 0xC6: 0xFF86,\n 0xC7: 0xFF87,\n 0xC8: 0xFF88,\n 0xC9: 0xFF89,\n 0xCA: 0xFF8A,\n 0xCB: 0xFF8B,\n 0xCC: 0xFF8C,\n 0xCD: 0xFF8D,\n 0xCE: 0xFF8E,\n 0xCF: 0xFF8F,\n 0xD0: 0xFF90,\n 0xD1: 0xFF91,\n 0xD2: 0xFF92,\n 0xD3: 0xFF93,\n 0xD4: 0xFF94,\n 0xD5: 0xFF95,\n 0xD6: 0xFF96,\n 0xD7: 0xFF97,\n 0xD8: 0xFF98,\n 0xD9: 0xFF99,\n 0xDA: 0xFF9A,\n 0xDB: 0xFF9B,\n 0xDC: 0xFF9C,\n 0xDD: 0xFF9D,\n 0xDE: 0xFF9E,\n 0xDF: 0xFF9F,\n 0xE040: 0x6F3E,\n 0xE041: 0x6F13,\n 0xE042: 0x6EF7,\n 0xE043: 0x6F86,\n 0xE044: 0x6F7A,\n 0xE045: 0x6F78,\n 0xE046: 0x6F81,\n 0xE047: 0x6F80,\n 0xE048: 0x6F6F,\n 0xE049: 0x6F5B,\n 0xE04A: 0x6FF3,\n 0xE04B: 0x6F6D,\n 0xE04C: 0x6F82,\n 0xE04D: 0x6F7C,\n 0xE04E: 0x6F58,\n 0xE04F: 0x6F8E,\n 0xE050: 0x6F91,\n 0xE051: 0x6FC2,\n 0xE052: 0x6F66,\n 0xE053: 0x6FB3,\n 0xE054: 0x6FA3,\n 0xE055: 0x6FA1,\n 0xE056: 0x6FA4,\n 0xE057: 0x6FB9,\n 0xE058: 0x6FC6,\n 0xE059: 0x6FAA,\n 0xE05A: 0x6FDF,\n 0xE05B: 0x6FD5,\n 0xE05C: 0x6FEC,\n 0xE05D: 0x6FD4,\n 0xE05E: 0x6FD8,\n 0xE05F: 0x6FF1,\n 0xE060: 0x6FEE,\n 0xE061: 0x6FDB,\n 0xE062: 0x7009,\n 0xE063: 0x700B,\n 0xE064: 0x6FFA,\n 0xE065: 0x7011,\n 0xE066: 0x7001,\n 0xE067: 0x700F,\n 0xE068: 0x6FFE,\n 0xE069: 0x701B,\n 0xE06A: 0x701A,\n 0xE06B: 0x6F74,\n 0xE06C: 0x701D,\n 0xE06D: 0x7018,\n 0xE06E: 0x701F,\n 0xE06F: 0x7030,\n 0xE070: 0x703E,\n 0xE071: 0x7032,\n 0xE072: 0x7051,\n 0xE073: 0x7063,\n 0xE074: 0x7099,\n 0xE075: 0x7092,\n 0xE076: 0x70AF,\n 0xE077: 0x70F1,\n 0xE078: 0x70AC,\n 0xE079: 0x70B8,\n 0xE07A: 0x70B3,\n 0xE07B: 0x70AE,\n 0xE07C: 0x70DF,\n 0xE07D: 0x70CB,\n 0xE07E: 0x70DD,\n 0xE080: 0x70D9,\n 0xE081: 0x7109,\n 0xE082: 0x70FD,\n 0xE083: 0x711C,\n 0xE084: 0x7119,\n 0xE085: 0x7165,\n 0xE086: 0x7155,\n 0xE087: 0x7188,\n 0xE088: 0x7166,\n 0xE089: 0x7162,\n 0xE08A: 0x714C,\n 0xE08B: 0x7156,\n 0xE08C: 0x716C,\n 0xE08D: 0x718F,\n 0xE08E: 0x71FB,\n 0xE08F: 0x7184,\n 0xE090: 0x7195,\n 0xE091: 0x71A8,\n 0xE092: 0x71AC,\n 0xE093: 0x71D7,\n 0xE094: 0x71B9,\n 0xE095: 0x71BE,\n 0xE096: 0x71D2,\n 0xE097: 0x71C9,\n 0xE098: 0x71D4,\n 0xE099: 0x71CE,\n 0xE09A: 0x71E0,\n 0xE09B: 0x71EC,\n 0xE09C: 0x71E7,\n 0xE09D: 0x71F5,\n 0xE09E: 0x71FC,\n 0xE09F: 0x71F9,\n 0xE0A0: 0x71FF,\n 0xE0A1: 0x720D,\n 0xE0A2: 0x7210,\n 0xE0A3: 0x721B,\n 0xE0A4: 0x7228,\n 0xE0A5: 0x722D,\n 0xE0A6: 0x722C,\n 0xE0A7: 0x7230,\n 0xE0A8: 0x7232,\n 0xE0A9: 0x723B,\n 0xE0AA: 0x723C,\n 0xE0AB: 0x723F,\n 0xE0AC: 0x7240,\n 0xE0AD: 0x7246,\n 0xE0AE: 0x724B,\n 0xE0AF: 0x7258,\n 0xE0B0: 0x7274,\n 0xE0B1: 0x727E,\n 0xE0B2: 0x7282,\n 0xE0B3: 0x7281,\n 0xE0B4: 0x7287,\n 0xE0B5: 0x7292,\n 0xE0B6: 0x7296,\n 0xE0B7: 0x72A2,\n 0xE0B8: 0x72A7,\n 0xE0B9: 0x72B9,\n 0xE0BA: 0x72B2,\n 0xE0BB: 0x72C3,\n 0xE0BC: 0x72C6,\n 0xE0BD: 0x72C4,\n 0xE0BE: 0x72CE,\n 0xE0BF: 0x72D2,\n 0xE0C0: 0x72E2,\n 0xE0C1: 0x72E0,\n 0xE0C2: 0x72E1,\n 0xE0C3: 0x72F9,\n 0xE0C4: 0x72F7,\n 0xE0C5: 0x500F,\n 0xE0C6: 0x7317,\n 0xE0C7: 0x730A,\n 0xE0C8: 0x731C,\n 0xE0C9: 0x7316,\n 0xE0CA: 0x731D,\n 0xE0CB: 0x7334,\n 0xE0CC: 0x732F,\n 0xE0CD: 0x7329,\n 0xE0CE: 0x7325,\n 0xE0CF: 0x733E,\n 0xE0D0: 0x734E,\n 0xE0D1: 0x734F,\n 0xE0D2: 0x9ED8,\n 0xE0D3: 0x7357,\n 0xE0D4: 0x736A,\n 0xE0D5: 0x7368,\n 0xE0D6: 0x7370,\n 0xE0D7: 0x7378,\n 0xE0D8: 0x7375,\n 0xE0D9: 0x737B,\n 0xE0DA: 0x737A,\n 0xE0DB: 0x73C8,\n 0xE0DC: 0x73B3,\n 0xE0DD: 0x73CE,\n 0xE0DE: 0x73BB,\n 0xE0DF: 0x73C0,\n 0xE0E0: 0x73E5,\n 0xE0E1: 0x73EE,\n 0xE0E2: 0x73DE,\n 0xE0E3: 0x74A2,\n 0xE0E4: 0x7405,\n 0xE0E5: 0x746F,\n 0xE0E6: 0x7425,\n 0xE0E7: 0x73F8,\n 0xE0E8: 0x7432,\n 0xE0E9: 0x743A,\n 0xE0EA: 0x7455,\n 0xE0EB: 0x743F,\n 0xE0EC: 0x745F,\n 0xE0ED: 0x7459,\n 0xE0EE: 0x7441,\n 0xE0EF: 0x745C,\n 0xE0F0: 0x7469,\n 0xE0F1: 0x7470,\n 0xE0F2: 0x7463,\n 0xE0F3: 0x746A,\n 0xE0F4: 0x7476,\n 0xE0F5: 0x747E,\n 0xE0F6: 0x748B,\n 0xE0F7: 0x749E,\n 0xE0F8: 0x74A7,\n 0xE0F9: 0x74CA,\n 0xE0FA: 0x74CF,\n 0xE0FB: 0x74D4,\n 0xE0FC: 0x73F1,\n 0xE140: 0x74E0,\n 0xE141: 0x74E3,\n 0xE142: 0x74E7,\n 0xE143: 0x74E9,\n 0xE144: 0x74EE,\n 0xE145: 0x74F2,\n 0xE146: 0x74F0,\n 0xE147: 0x74F1,\n 0xE148: 0x74F8,\n 0xE149: 0x74F7,\n 0xE14A: 0x7504,\n 0xE14B: 0x7503,\n 0xE14C: 0x7505,\n 0xE14D: 0x750C,\n 0xE14E: 0x750E,\n 0xE14F: 0x750D,\n 0xE150: 0x7515,\n 0xE151: 0x7513,\n 0xE152: 0x751E,\n 0xE153: 0x7526,\n 0xE154: 0x752C,\n 0xE155: 0x753C,\n 0xE156: 0x7544,\n 0xE157: 0x754D,\n 0xE158: 0x754A,\n 0xE159: 0x7549,\n 0xE15A: 0x755B,\n 0xE15B: 0x7546,\n 0xE15C: 0x755A,\n 0xE15D: 0x7569,\n 0xE15E: 0x7564,\n 0xE15F: 0x7567,\n 0xE160: 0x756B,\n 0xE161: 0x756D,\n 0xE162: 0x7578,\n 0xE163: 0x7576,\n 0xE164: 0x7586,\n 0xE165: 0x7587,\n 0xE166: 0x7574,\n 0xE167: 0x758A,\n 0xE168: 0x7589,\n 0xE169: 0x7582,\n 0xE16A: 0x7594,\n 0xE16B: 0x759A,\n 0xE16C: 0x759D,\n 0xE16D: 0x75A5,\n 0xE16E: 0x75A3,\n 0xE16F: 0x75C2,\n 0xE170: 0x75B3,\n 0xE171: 0x75C3,\n 0xE172: 0x75B5,\n 0xE173: 0x75BD,\n 0xE174: 0x75B8,\n 0xE175: 0x75BC,\n 0xE176: 0x75B1,\n 0xE177: 0x75CD,\n 0xE178: 0x75CA,\n 0xE179: 0x75D2,\n 0xE17A: 0x75D9,\n 0xE17B: 0x75E3,\n 0xE17C: 0x75DE,\n 0xE17D: 0x75FE,\n 0xE17E: 0x75FF,\n 0xE180: 0x75FC,\n 0xE181: 0x7601,\n 0xE182: 0x75F0,\n 0xE183: 0x75FA,\n 0xE184: 0x75F2,\n 0xE185: 0x75F3,\n 0xE186: 0x760B,\n 0xE187: 0x760D,\n 0xE188: 0x7609,\n 0xE189: 0x761F,\n 0xE18A: 0x7627,\n 0xE18B: 0x7620,\n 0xE18C: 0x7621,\n 0xE18D: 0x7622,\n 0xE18E: 0x7624,\n 0xE18F: 0x7634,\n 0xE190: 0x7630,\n 0xE191: 0x763B,\n 0xE192: 0x7647,\n 0xE193: 0x7648,\n 0xE194: 0x7646,\n 0xE195: 0x765C,\n 0xE196: 0x7658,\n 0xE197: 0x7661,\n 0xE198: 0x7662,\n 0xE199: 0x7668,\n 0xE19A: 0x7669,\n 0xE19B: 0x766A,\n 0xE19C: 0x7667,\n 0xE19D: 0x766C,\n 0xE19E: 0x7670,\n 0xE19F: 0x7672,\n 0xE1A0: 0x7676,\n 0xE1A1: 0x7678,\n 0xE1A2: 0x767C,\n 0xE1A3: 0x7680,\n 0xE1A4: 0x7683,\n 0xE1A5: 0x7688,\n 0xE1A6: 0x768B,\n 0xE1A7: 0x768E,\n 0xE1A8: 0x7696,\n 0xE1A9: 0x7693,\n 0xE1AA: 0x7699,\n 0xE1AB: 0x769A,\n 0xE1AC: 0x76B0,\n 0xE1AD: 0x76B4,\n 0xE1AE: 0x76B8,\n 0xE1AF: 0x76B9,\n 0xE1B0: 0x76BA,\n 0xE1B1: 0x76C2,\n 0xE1B2: 0x76CD,\n 0xE1B3: 0x76D6,\n 0xE1B4: 0x76D2,\n 0xE1B5: 0x76DE,\n 0xE1B6: 0x76E1,\n 0xE1B7: 0x76E5,\n 0xE1B8: 0x76E7,\n 0xE1B9: 0x76EA,\n 0xE1BA: 0x862F,\n 0xE1BB: 0x76FB,\n 0xE1BC: 0x7708,\n 0xE1BD: 0x7707,\n 0xE1BE: 0x7704,\n 0xE1BF: 0x7729,\n 0xE1C0: 0x7724,\n 0xE1C1: 0x771E,\n 0xE1C2: 0x7725,\n 0xE1C3: 0x7726,\n 0xE1C4: 0x771B,\n 0xE1C5: 0x7737,\n 0xE1C6: 0x7738,\n 0xE1C7: 0x7747,\n 0xE1C8: 0x775A,\n 0xE1C9: 0x7768,\n 0xE1CA: 0x776B,\n 0xE1CB: 0x775B,\n 0xE1CC: 0x7765,\n 0xE1CD: 0x777F,\n 0xE1CE: 0x777E,\n 0xE1CF: 0x7779,\n 0xE1D0: 0x778E,\n 0xE1D1: 0x778B,\n 0xE1D2: 0x7791,\n 0xE1D3: 0x77A0,\n 0xE1D4: 0x779E,\n 0xE1D5: 0x77B0,\n 0xE1D6: 0x77B6,\n 0xE1D7: 0x77B9,\n 0xE1D8: 0x77BF,\n 0xE1D9: 0x77BC,\n 0xE1DA: 0x77BD,\n 0xE1DB: 0x77BB,\n 0xE1DC: 0x77C7,\n 0xE1DD: 0x77CD,\n 0xE1DE: 0x77D7,\n 0xE1DF: 0x77DA,\n 0xE1E0: 0x77DC,\n 0xE1E1: 0x77E3,\n 0xE1E2: 0x77EE,\n 0xE1E3: 0x77FC,\n 0xE1E4: 0x780C,\n 0xE1E5: 0x7812,\n 0xE1E6: 0x7926,\n 0xE1E7: 0x7820,\n 0xE1E8: 0x792A,\n 0xE1E9: 0x7845,\n 0xE1EA: 0x788E,\n 0xE1EB: 0x7874,\n 0xE1EC: 0x7886,\n 0xE1ED: 0x787C,\n 0xE1EE: 0x789A,\n 0xE1EF: 0x788C,\n 0xE1F0: 0x78A3,\n 0xE1F1: 0x78B5,\n 0xE1F2: 0x78AA,\n 0xE1F3: 0x78AF,\n 0xE1F4: 0x78D1,\n 0xE1F5: 0x78C6,\n 0xE1F6: 0x78CB,\n 0xE1F7: 0x78D4,\n 0xE1F8: 0x78BE,\n 0xE1F9: 0x78BC,\n 0xE1FA: 0x78C5,\n 0xE1FB: 0x78CA,\n 0xE1FC: 0x78EC,\n 0xE240: 0x78E7,\n 0xE241: 0x78DA,\n 0xE242: 0x78FD,\n 0xE243: 0x78F4,\n 0xE244: 0x7907,\n 0xE245: 0x7912,\n 0xE246: 0x7911,\n 0xE247: 0x7919,\n 0xE248: 0x792C,\n 0xE249: 0x792B,\n 0xE24A: 0x7940,\n 0xE24B: 0x7960,\n 0xE24C: 0x7957,\n 0xE24D: 0x795F,\n 0xE24E: 0x795A,\n 0xE24F: 0x7955,\n 0xE250: 0x7953,\n 0xE251: 0x797A,\n 0xE252: 0x797F,\n 0xE253: 0x798A,\n 0xE254: 0x799D,\n 0xE255: 0x79A7,\n 0xE256: 0x9F4B,\n 0xE257: 0x79AA,\n 0xE258: 0x79AE,\n 0xE259: 0x79B3,\n 0xE25A: 0x79B9,\n 0xE25B: 0x79BA,\n 0xE25C: 0x79C9,\n 0xE25D: 0x79D5,\n 0xE25E: 0x79E7,\n 0xE25F: 0x79EC,\n 0xE260: 0x79E1,\n 0xE261: 0x79E3,\n 0xE262: 0x7A08,\n 0xE263: 0x7A0D,\n 0xE264: 0x7A18,\n 0xE265: 0x7A19,\n 0xE266: 0x7A20,\n 0xE267: 0x7A1F,\n 0xE268: 0x7980,\n 0xE269: 0x7A31,\n 0xE26A: 0x7A3B,\n 0xE26B: 0x7A3E,\n 0xE26C: 0x7A37,\n 0xE26D: 0x7A43,\n 0xE26E: 0x7A57,\n 0xE26F: 0x7A49,\n 0xE270: 0x7A61,\n 0xE271: 0x7A62,\n 0xE272: 0x7A69,\n 0xE273: 0x9F9D,\n 0xE274: 0x7A70,\n 0xE275: 0x7A79,\n 0xE276: 0x7A7D,\n 0xE277: 0x7A88,\n 0xE278: 0x7A97,\n 0xE279: 0x7A95,\n 0xE27A: 0x7A98,\n 0xE27B: 0x7A96,\n 0xE27C: 0x7AA9,\n 0xE27D: 0x7AC8,\n 0xE27E: 0x7AB0,\n 0xE280: 0x7AB6,\n 0xE281: 0x7AC5,\n 0xE282: 0x7AC4,\n 0xE283: 0x7ABF,\n 0xE284: 0x9083,\n 0xE285: 0x7AC7,\n 0xE286: 0x7ACA,\n 0xE287: 0x7ACD,\n 0xE288: 0x7ACF,\n 0xE289: 0x7AD5,\n 0xE28A: 0x7AD3,\n 0xE28B: 0x7AD9,\n 0xE28C: 0x7ADA,\n 0xE28D: 0x7ADD,\n 0xE28E: 0x7AE1,\n 0xE28F: 0x7AE2,\n 0xE290: 0x7AE6,\n 0xE291: 0x7AED,\n 0xE292: 0x7AF0,\n 0xE293: 0x7B02,\n 0xE294: 0x7B0F,\n 0xE295: 0x7B0A,\n 0xE296: 0x7B06,\n 0xE297: 0x7B33,\n 0xE298: 0x7B18,\n 0xE299: 0x7B19,\n 0xE29A: 0x7B1E,\n 0xE29B: 0x7B35,\n 0xE29C: 0x7B28,\n 0xE29D: 0x7B36,\n 0xE29E: 0x7B50,\n 0xE29F: 0x7B7A,\n 0xE2A0: 0x7B04,\n 0xE2A1: 0x7B4D,\n 0xE2A2: 0x7B0B,\n 0xE2A3: 0x7B4C,\n 0xE2A4: 0x7B45,\n 0xE2A5: 0x7B75,\n 0xE2A6: 0x7B65,\n 0xE2A7: 0x7B74,\n 0xE2A8: 0x7B67,\n 0xE2A9: 0x7B70,\n 0xE2AA: 0x7B71,\n 0xE2AB: 0x7B6C,\n 0xE2AC: 0x7B6E,\n 0xE2AD: 0x7B9D,\n 0xE2AE: 0x7B98,\n 0xE2AF: 0x7B9F,\n 0xE2B0: 0x7B8D,\n 0xE2B1: 0x7B9C,\n 0xE2B2: 0x7B9A,\n 0xE2B3: 0x7B8B,\n 0xE2B4: 0x7B92,\n 0xE2B5: 0x7B8F,\n 0xE2B6: 0x7B5D,\n 0xE2B7: 0x7B99,\n 0xE2B8: 0x7BCB,\n 0xE2B9: 0x7BC1,\n 0xE2BA: 0x7BCC,\n 0xE2BB: 0x7BCF,\n 0xE2BC: 0x7BB4,\n 0xE2BD: 0x7BC6,\n 0xE2BE: 0x7BDD,\n 0xE2BF: 0x7BE9,\n 0xE2C0: 0x7C11,\n 0xE2C1: 0x7C14,\n 0xE2C2: 0x7BE6,\n 0xE2C3: 0x7BE5,\n 0xE2C4: 0x7C60,\n 0xE2C5: 0x7C00,\n 0xE2C6: 0x7C07,\n 0xE2C7: 0x7C13,\n 0xE2C8: 0x7BF3,\n 0xE2C9: 0x7BF7,\n 0xE2CA: 0x7C17,\n 0xE2CB: 0x7C0D,\n 0xE2CC: 0x7BF6,\n 0xE2CD: 0x7C23,\n 0xE2CE: 0x7C27,\n 0xE2CF: 0x7C2A,\n 0xE2D0: 0x7C1F,\n 0xE2D1: 0x7C37,\n 0xE2D2: 0x7C2B,\n 0xE2D3: 0x7C3D,\n 0xE2D4: 0x7C4C,\n 0xE2D5: 0x7C43,\n 0xE2D6: 0x7C54,\n 0xE2D7: 0x7C4F,\n 0xE2D8: 0x7C40,\n 0xE2D9: 0x7C50,\n 0xE2DA: 0x7C58,\n 0xE2DB: 0x7C5F,\n 0xE2DC: 0x7C64,\n 0xE2DD: 0x7C56,\n 0xE2DE: 0x7C65,\n 0xE2DF: 0x7C6C,\n 0xE2E0: 0x7C75,\n 0xE2E1: 0x7C83,\n 0xE2E2: 0x7C90,\n 0xE2E3: 0x7CA4,\n 0xE2E4: 0x7CAD,\n 0xE2E5: 0x7CA2,\n 0xE2E6: 0x7CAB,\n 0xE2E7: 0x7CA1,\n 0xE2E8: 0x7CA8,\n 0xE2E9: 0x7CB3,\n 0xE2EA: 0x7CB2,\n 0xE2EB: 0x7CB1,\n 0xE2EC: 0x7CAE,\n 0xE2ED: 0x7CB9,\n 0xE2EE: 0x7CBD,\n 0xE2EF: 0x7CC0,\n 0xE2F0: 0x7CC5,\n 0xE2F1: 0x7CC2,\n 0xE2F2: 0x7CD8,\n 0xE2F3: 0x7CD2,\n 0xE2F4: 0x7CDC,\n 0xE2F5: 0x7CE2,\n 0xE2F6: 0x9B3B,\n 0xE2F7: 0x7CEF,\n 0xE2F8: 0x7CF2,\n 0xE2F9: 0x7CF4,\n 0xE2FA: 0x7CF6,\n 0xE2FB: 0x7CFA,\n 0xE2FC: 0x7D06,\n 0xE340: 0x7D02,\n 0xE341: 0x7D1C,\n 0xE342: 0x7D15,\n 0xE343: 0x7D0A,\n 0xE344: 0x7D45,\n 0xE345: 0x7D4B,\n 0xE346: 0x7D2E,\n 0xE347: 0x7D32,\n 0xE348: 0x7D3F,\n 0xE349: 0x7D35,\n 0xE34A: 0x7D46,\n 0xE34B: 0x7D73,\n 0xE34C: 0x7D56,\n 0xE34D: 0x7D4E,\n 0xE34E: 0x7D72,\n 0xE34F: 0x7D68,\n 0xE350: 0x7D6E,\n 0xE351: 0x7D4F,\n 0xE352: 0x7D63,\n 0xE353: 0x7D93,\n 0xE354: 0x7D89,\n 0xE355: 0x7D5B,\n 0xE356: 0x7D8F,\n 0xE357: 0x7D7D,\n 0xE358: 0x7D9B,\n 0xE359: 0x7DBA,\n 0xE35A: 0x7DAE,\n 0xE35B: 0x7DA3,\n 0xE35C: 0x7DB5,\n 0xE35D: 0x7DC7,\n 0xE35E: 0x7DBD,\n 0xE35F: 0x7DAB,\n 0xE360: 0x7E3D,\n 0xE361: 0x7DA2,\n 0xE362: 0x7DAF,\n 0xE363: 0x7DDC,\n 0xE364: 0x7DB8,\n 0xE365: 0x7D9F,\n 0xE366: 0x7DB0,\n 0xE367: 0x7DD8,\n 0xE368: 0x7DDD,\n 0xE369: 0x7DE4,\n 0xE36A: 0x7DDE,\n 0xE36B: 0x7DFB,\n 0xE36C: 0x7DF2,\n 0xE36D: 0x7DE1,\n 0xE36E: 0x7E05,\n 0xE36F: 0x7E0A,\n 0xE370: 0x7E23,\n 0xE371: 0x7E21,\n 0xE372: 0x7E12,\n 0xE373: 0x7E31,\n 0xE374: 0x7E1F,\n 0xE375: 0x7E09,\n 0xE376: 0x7E0B,\n 0xE377: 0x7E22,\n 0xE378: 0x7E46,\n 0xE379: 0x7E66,\n 0xE37A: 0x7E3B,\n 0xE37B: 0x7E35,\n 0xE37C: 0x7E39,\n 0xE37D: 0x7E43,\n 0xE37E: 0x7E37,\n 0xE380: 0x7E32,\n 0xE381: 0x7E3A,\n 0xE382: 0x7E67,\n 0xE383: 0x7E5D,\n 0xE384: 0x7E56,\n 0xE385: 0x7E5E,\n 0xE386: 0x7E59,\n 0xE387: 0x7E5A,\n 0xE388: 0x7E79,\n 0xE389: 0x7E6A,\n 0xE38A: 0x7E69,\n 0xE38B: 0x7E7C,\n 0xE38C: 0x7E7B,\n 0xE38D: 0x7E83,\n 0xE38E: 0x7DD5,\n 0xE38F: 0x7E7D,\n 0xE390: 0x8FAE,\n 0xE391: 0x7E7F,\n 0xE392: 0x7E88,\n 0xE393: 0x7E89,\n 0xE394: 0x7E8C,\n 0xE395: 0x7E92,\n 0xE396: 0x7E90,\n 0xE397: 0x7E93,\n 0xE398: 0x7E94,\n 0xE399: 0x7E96,\n 0xE39A: 0x7E8E,\n 0xE39B: 0x7E9B,\n 0xE39C: 0x7E9C,\n 0xE39D: 0x7F38,\n 0xE39E: 0x7F3A,\n 0xE39F: 0x7F45,\n 0xE3A0: 0x7F4C,\n 0xE3A1: 0x7F4D,\n 0xE3A2: 0x7F4E,\n 0xE3A3: 0x7F50,\n 0xE3A4: 0x7F51,\n 0xE3A5: 0x7F55,\n 0xE3A6: 0x7F54,\n 0xE3A7: 0x7F58,\n 0xE3A8: 0x7F5F,\n 0xE3A9: 0x7F60,\n 0xE3AA: 0x7F68,\n 0xE3AB: 0x7F69,\n 0xE3AC: 0x7F67,\n 0xE3AD: 0x7F78,\n 0xE3AE: 0x7F82,\n 0xE3AF: 0x7F86,\n 0xE3B0: 0x7F83,\n 0xE3B1: 0x7F88,\n 0xE3B2: 0x7F87,\n 0xE3B3: 0x7F8C,\n 0xE3B4: 0x7F94,\n 0xE3B5: 0x7F9E,\n 0xE3B6: 0x7F9D,\n 0xE3B7: 0x7F9A,\n 0xE3B8: 0x7FA3,\n 0xE3B9: 0x7FAF,\n 0xE3BA: 0x7FB2,\n 0xE3BB: 0x7FB9,\n 0xE3BC: 0x7FAE,\n 0xE3BD: 0x7FB6,\n 0xE3BE: 0x7FB8,\n 0xE3BF: 0x8B71,\n 0xE3C0: 0x7FC5,\n 0xE3C1: 0x7FC6,\n 0xE3C2: 0x7FCA,\n 0xE3C3: 0x7FD5,\n 0xE3C4: 0x7FD4,\n 0xE3C5: 0x7FE1,\n 0xE3C6: 0x7FE6,\n 0xE3C7: 0x7FE9,\n 0xE3C8: 0x7FF3,\n 0xE3C9: 0x7FF9,\n 0xE3CA: 0x98DC,\n 0xE3CB: 0x8006,\n 0xE3CC: 0x8004,\n 0xE3CD: 0x800B,\n 0xE3CE: 0x8012,\n 0xE3CF: 0x8018,\n 0xE3D0: 0x8019,\n 0xE3D1: 0x801C,\n 0xE3D2: 0x8021,\n 0xE3D3: 0x8028,\n 0xE3D4: 0x803F,\n 0xE3D5: 0x803B,\n 0xE3D6: 0x804A,\n 0xE3D7: 0x8046,\n 0xE3D8: 0x8052,\n 0xE3D9: 0x8058,\n 0xE3DA: 0x805A,\n 0xE3DB: 0x805F,\n 0xE3DC: 0x8062,\n 0xE3DD: 0x8068,\n 0xE3DE: 0x8073,\n 0xE3DF: 0x8072,\n 0xE3E0: 0x8070,\n 0xE3E1: 0x8076,\n 0xE3E2: 0x8079,\n 0xE3E3: 0x807D,\n 0xE3E4: 0x807F,\n 0xE3E5: 0x8084,\n 0xE3E6: 0x8086,\n 0xE3E7: 0x8085,\n 0xE3E8: 0x809B,\n 0xE3E9: 0x8093,\n 0xE3EA: 0x809A,\n 0xE3EB: 0x80AD,\n 0xE3EC: 0x5190,\n 0xE3ED: 0x80AC,\n 0xE3EE: 0x80DB,\n 0xE3EF: 0x80E5,\n 0xE3F0: 0x80D9,\n 0xE3F1: 0x80DD,\n 0xE3F2: 0x80C4,\n 0xE3F3: 0x80DA,\n 0xE3F4: 0x80D6,\n 0xE3F5: 0x8109,\n 0xE3F6: 0x80EF,\n 0xE3F7: 0x80F1,\n 0xE3F8: 0x811B,\n 0xE3F9: 0x8129,\n 0xE3FA: 0x8123,\n 0xE3FB: 0x812F,\n 0xE3FC: 0x814B,\n 0xE440: 0x968B,\n 0xE441: 0x8146,\n 0xE442: 0x813E,\n 0xE443: 0x8153,\n 0xE444: 0x8151,\n 0xE445: 0x80FC,\n 0xE446: 0x8171,\n 0xE447: 0x816E,\n 0xE448: 0x8165,\n 0xE449: 0x8166,\n 0xE44A: 0x8174,\n 0xE44B: 0x8183,\n 0xE44C: 0x8188,\n 0xE44D: 0x818A,\n 0xE44E: 0x8180,\n 0xE44F: 0x8182,\n 0xE450: 0x81A0,\n 0xE451: 0x8195,\n 0xE452: 0x81A4,\n 0xE453: 0x81A3,\n 0xE454: 0x815F,\n 0xE455: 0x8193,\n 0xE456: 0x81A9,\n 0xE457: 0x81B0,\n 0xE458: 0x81B5,\n 0xE459: 0x81BE,\n 0xE45A: 0x81B8,\n 0xE45B: 0x81BD,\n 0xE45C: 0x81C0,\n 0xE45D: 0x81C2,\n 0xE45E: 0x81BA,\n 0xE45F: 0x81C9,\n 0xE460: 0x81CD,\n 0xE461: 0x81D1,\n 0xE462: 0x81D9,\n 0xE463: 0x81D8,\n 0xE464: 0x81C8,\n 0xE465: 0x81DA,\n 0xE466: 0x81DF,\n 0xE467: 0x81E0,\n 0xE468: 0x81E7,\n 0xE469: 0x81FA,\n 0xE46A: 0x81FB,\n 0xE46B: 0x81FE,\n 0xE46C: 0x8201,\n 0xE46D: 0x8202,\n 0xE46E: 0x8205,\n 0xE46F: 0x8207,\n 0xE470: 0x820A,\n 0xE471: 0x820D,\n 0xE472: 0x8210,\n 0xE473: 0x8216,\n 0xE474: 0x8229,\n 0xE475: 0x822B,\n 0xE476: 0x8238,\n 0xE477: 0x8233,\n 0xE478: 0x8240,\n 0xE479: 0x8259,\n 0xE47A: 0x8258,\n 0xE47B: 0x825D,\n 0xE47C: 0x825A,\n 0xE47D: 0x825F,\n 0xE47E: 0x8264,\n 0xE480: 0x8262,\n 0xE481: 0x8268,\n 0xE482: 0x826A,\n 0xE483: 0x826B,\n 0xE484: 0x822E,\n 0xE485: 0x8271,\n 0xE486: 0x8277,\n 0xE487: 0x8278,\n 0xE488: 0x827E,\n 0xE489: 0x828D,\n 0xE48A: 0x8292,\n 0xE48B: 0x82AB,\n 0xE48C: 0x829F,\n 0xE48D: 0x82BB,\n 0xE48E: 0x82AC,\n 0xE48F: 0x82E1,\n 0xE490: 0x82E3,\n 0xE491: 0x82DF,\n 0xE492: 0x82D2,\n 0xE493: 0x82F4,\n 0xE494: 0x82F3,\n 0xE495: 0x82FA,\n 0xE496: 0x8393,\n 0xE497: 0x8303,\n 0xE498: 0x82FB,\n 0xE499: 0x82F9,\n 0xE49A: 0x82DE,\n 0xE49B: 0x8306,\n 0xE49C: 0x82DC,\n 0xE49D: 0x8309,\n 0xE49E: 0x82D9,\n 0xE49F: 0x8335,\n 0xE4A0: 0x8334,\n 0xE4A1: 0x8316,\n 0xE4A2: 0x8332,\n 0xE4A3: 0x8331,\n 0xE4A4: 0x8340,\n 0xE4A5: 0x8339,\n 0xE4A6: 0x8350,\n 0xE4A7: 0x8345,\n 0xE4A8: 0x832F,\n 0xE4A9: 0x832B,\n 0xE4AA: 0x8317,\n 0xE4AB: 0x8318,\n 0xE4AC: 0x8385,\n 0xE4AD: 0x839A,\n 0xE4AE: 0x83AA,\n 0xE4AF: 0x839F,\n 0xE4B0: 0x83A2,\n 0xE4B1: 0x8396,\n 0xE4B2: 0x8323,\n 0xE4B3: 0x838E,\n 0xE4B4: 0x8387,\n 0xE4B5: 0x838A,\n 0xE4B6: 0x837C,\n 0xE4B7: 0x83B5,\n 0xE4B8: 0x8373,\n 0xE4B9: 0x8375,\n 0xE4BA: 0x83A0,\n 0xE4BB: 0x8389,\n 0xE4BC: 0x83A8,\n 0xE4BD: 0x83F4,\n 0xE4BE: 0x8413,\n 0xE4BF: 0x83EB,\n 0xE4C0: 0x83CE,\n 0xE4C1: 0x83FD,\n 0xE4C2: 0x8403,\n 0xE4C3: 0x83D8,\n 0xE4C4: 0x840B,\n 0xE4C5: 0x83C1,\n 0xE4C6: 0x83F7,\n 0xE4C7: 0x8407,\n 0xE4C8: 0x83E0,\n 0xE4C9: 0x83F2,\n 0xE4CA: 0x840D,\n 0xE4CB: 0x8422,\n 0xE4CC: 0x8420,\n 0xE4CD: 0x83BD,\n 0xE4CE: 0x8438,\n 0xE4CF: 0x8506,\n 0xE4D0: 0x83FB,\n 0xE4D1: 0x846D,\n 0xE4D2: 0x842A,\n 0xE4D3: 0x843C,\n 0xE4D4: 0x855A,\n 0xE4D5: 0x8484,\n 0xE4D6: 0x8477,\n 0xE4D7: 0x846B,\n 0xE4D8: 0x84AD,\n 0xE4D9: 0x846E,\n 0xE4DA: 0x8482,\n 0xE4DB: 0x8469,\n 0xE4DC: 0x8446,\n 0xE4DD: 0x842C,\n 0xE4DE: 0x846F,\n 0xE4DF: 0x8479,\n 0xE4E0: 0x8435,\n 0xE4E1: 0x84CA,\n 0xE4E2: 0x8462,\n 0xE4E3: 0x84B9,\n 0xE4E4: 0x84BF,\n 0xE4E5: 0x849F,\n 0xE4E6: 0x84D9,\n 0xE4E7: 0x84CD,\n 0xE4E8: 0x84BB,\n 0xE4E9: 0x84DA,\n 0xE4EA: 0x84D0,\n 0xE4EB: 0x84C1,\n 0xE4EC: 0x84C6,\n 0xE4ED: 0x84D6,\n 0xE4EE: 0x84A1,\n 0xE4EF: 0x8521,\n 0xE4F0: 0x84FF,\n 0xE4F1: 0x84F4,\n 0xE4F2: 0x8517,\n 0xE4F3: 0x8518,\n 0xE4F4: 0x852C,\n 0xE4F5: 0x851F,\n 0xE4F6: 0x8515,\n 0xE4F7: 0x8514,\n 0xE4F8: 0x84FC,\n 0xE4F9: 0x8540,\n 0xE4FA: 0x8563,\n 0xE4FB: 0x8558,\n 0xE4FC: 0x8548,\n 0xE540: 0x8541,\n 0xE541: 0x8602,\n 0xE542: 0x854B,\n 0xE543: 0x8555,\n 0xE544: 0x8580,\n 0xE545: 0x85A4,\n 0xE546: 0x8588,\n 0xE547: 0x8591,\n 0xE548: 0x858A,\n 0xE549: 0x85A8,\n 0xE54A: 0x856D,\n 0xE54B: 0x8594,\n 0xE54C: 0x859B,\n 0xE54D: 0x85EA,\n 0xE54E: 0x8587,\n 0xE54F: 0x859C,\n 0xE550: 0x8577,\n 0xE551: 0x857E,\n 0xE552: 0x8590,\n 0xE553: 0x85C9,\n 0xE554: 0x85BA,\n 0xE555: 0x85CF,\n 0xE556: 0x85B9,\n 0xE557: 0x85D0,\n 0xE558: 0x85D5,\n 0xE559: 0x85DD,\n 0xE55A: 0x85E5,\n 0xE55B: 0x85DC,\n 0xE55C: 0x85F9,\n 0xE55D: 0x860A,\n 0xE55E: 0x8613,\n 0xE55F: 0x860B,\n 0xE560: 0x85FE,\n 0xE561: 0x85FA,\n 0xE562: 0x8606,\n 0xE563: 0x8622,\n 0xE564: 0x861A,\n 0xE565: 0x8630,\n 0xE566: 0x863F,\n 0xE567: 0x864D,\n 0xE568: 0x4E55,\n 0xE569: 0x8654,\n 0xE56A: 0x865F,\n 0xE56B: 0x8667,\n 0xE56C: 0x8671,\n 0xE56D: 0x8693,\n 0xE56E: 0x86A3,\n 0xE56F: 0x86A9,\n 0xE570: 0x86AA,\n 0xE571: 0x868B,\n 0xE572: 0x868C,\n 0xE573: 0x86B6,\n 0xE574: 0x86AF,\n 0xE575: 0x86C4,\n 0xE576: 0x86C6,\n 0xE577: 0x86B0,\n 0xE578: 0x86C9,\n 0xE579: 0x8823,\n 0xE57A: 0x86AB,\n 0xE57B: 0x86D4,\n 0xE57C: 0x86DE,\n 0xE57D: 0x86E9,\n 0xE57E: 0x86EC,\n 0xE580: 0x86DF,\n 0xE581: 0x86DB,\n 0xE582: 0x86EF,\n 0xE583: 0x8712,\n 0xE584: 0x8706,\n 0xE585: 0x8708,\n 0xE586: 0x8700,\n 0xE587: 0x8703,\n 0xE588: 0x86FB,\n 0xE589: 0x8711,\n 0xE58A: 0x8709,\n 0xE58B: 0x870D,\n 0xE58C: 0x86F9,\n 0xE58D: 0x870A,\n 0xE58E: 0x8734,\n 0xE58F: 0x873F,\n 0xE590: 0x8737,\n 0xE591: 0x873B,\n 0xE592: 0x8725,\n 0xE593: 0x8729,\n 0xE594: 0x871A,\n 0xE595: 0x8760,\n 0xE596: 0x875F,\n 0xE597: 0x8778,\n 0xE598: 0x874C,\n 0xE599: 0x874E,\n 0xE59A: 0x8774,\n 0xE59B: 0x8757,\n 0xE59C: 0x8768,\n 0xE59D: 0x876E,\n 0xE59E: 0x8759,\n 0xE59F: 0x8753,\n 0xE5A0: 0x8763,\n 0xE5A1: 0x876A,\n 0xE5A2: 0x8805,\n 0xE5A3: 0x87A2,\n 0xE5A4: 0x879F,\n 0xE5A5: 0x8782,\n 0xE5A6: 0x87AF,\n 0xE5A7: 0x87CB,\n 0xE5A8: 0x87BD,\n 0xE5A9: 0x87C0,\n 0xE5AA: 0x87D0,\n 0xE5AB: 0x96D6,\n 0xE5AC: 0x87AB,\n 0xE5AD: 0x87C4,\n 0xE5AE: 0x87B3,\n 0xE5AF: 0x87C7,\n 0xE5B0: 0x87C6,\n 0xE5B1: 0x87BB,\n 0xE5B2: 0x87EF,\n 0xE5B3: 0x87F2,\n 0xE5B4: 0x87E0,\n 0xE5B5: 0x880F,\n 0xE5B6: 0x880D,\n 0xE5B7: 0x87FE,\n 0xE5B8: 0x87F6,\n 0xE5B9: 0x87F7,\n 0xE5BA: 0x880E,\n 0xE5BB: 0x87D2,\n 0xE5BC: 0x8811,\n 0xE5BD: 0x8816,\n 0xE5BE: 0x8815,\n 0xE5BF: 0x8822,\n 0xE5C0: 0x8821,\n 0xE5C1: 0x8831,\n 0xE5C2: 0x8836,\n 0xE5C3: 0x8839,\n 0xE5C4: 0x8827,\n 0xE5C5: 0x883B,\n 0xE5C6: 0x8844,\n 0xE5C7: 0x8842,\n 0xE5C8: 0x8852,\n 0xE5C9: 0x8859,\n 0xE5CA: 0x885E,\n 0xE5CB: 0x8862,\n 0xE5CC: 0x886B,\n 0xE5CD: 0x8881,\n 0xE5CE: 0x887E,\n 0xE5CF: 0x889E,\n 0xE5D0: 0x8875,\n 0xE5D1: 0x887D,\n 0xE5D2: 0x88B5,\n 0xE5D3: 0x8872,\n 0xE5D4: 0x8882,\n 0xE5D5: 0x8897,\n 0xE5D6: 0x8892,\n 0xE5D7: 0x88AE,\n 0xE5D8: 0x8899,\n 0xE5D9: 0x88A2,\n 0xE5DA: 0x888D,\n 0xE5DB: 0x88A4,\n 0xE5DC: 0x88B0,\n 0xE5DD: 0x88BF,\n 0xE5DE: 0x88B1,\n 0xE5DF: 0x88C3,\n 0xE5E0: 0x88C4,\n 0xE5E1: 0x88D4,\n 0xE5E2: 0x88D8,\n 0xE5E3: 0x88D9,\n 0xE5E4: 0x88DD,\n 0xE5E5: 0x88F9,\n 0xE5E6: 0x8902,\n 0xE5E7: 0x88FC,\n 0xE5E8: 0x88F4,\n 0xE5E9: 0x88E8,\n 0xE5EA: 0x88F2,\n 0xE5EB: 0x8904,\n 0xE5EC: 0x890C,\n 0xE5ED: 0x890A,\n 0xE5EE: 0x8913,\n 0xE5EF: 0x8943,\n 0xE5F0: 0x891E,\n 0xE5F1: 0x8925,\n 0xE5F2: 0x892A,\n 0xE5F3: 0x892B,\n 0xE5F4: 0x8941,\n 0xE5F5: 0x8944,\n 0xE5F6: 0x893B,\n 0xE5F7: 0x8936,\n 0xE5F8: 0x8938,\n 0xE5F9: 0x894C,\n 0xE5FA: 0x891D,\n 0xE5FB: 0x8960,\n 0xE5FC: 0x895E,\n 0xE640: 0x8966,\n 0xE641: 0x8964,\n 0xE642: 0x896D,\n 0xE643: 0x896A,\n 0xE644: 0x896F,\n 0xE645: 0x8974,\n 0xE646: 0x8977,\n 0xE647: 0x897E,\n 0xE648: 0x8983,\n 0xE649: 0x8988,\n 0xE64A: 0x898A,\n 0xE64B: 0x8993,\n 0xE64C: 0x8998,\n 0xE64D: 0x89A1,\n 0xE64E: 0x89A9,\n 0xE64F: 0x89A6,\n 0xE650: 0x89AC,\n 0xE651: 0x89AF,\n 0xE652: 0x89B2,\n 0xE653: 0x89BA,\n 0xE654: 0x89BD,\n 0xE655: 0x89BF,\n 0xE656: 0x89C0,\n 0xE657: 0x89DA,\n 0xE658: 0x89DC,\n 0xE659: 0x89DD,\n 0xE65A: 0x89E7,\n 0xE65B: 0x89F4,\n 0xE65C: 0x89F8,\n 0xE65D: 0x8A03,\n 0xE65E: 0x8A16,\n 0xE65F: 0x8A10,\n 0xE660: 0x8A0C,\n 0xE661: 0x8A1B,\n 0xE662: 0x8A1D,\n 0xE663: 0x8A25,\n 0xE664: 0x8A36,\n 0xE665: 0x8A41,\n 0xE666: 0x8A5B,\n 0xE667: 0x8A52,\n 0xE668: 0x8A46,\n 0xE669: 0x8A48,\n 0xE66A: 0x8A7C,\n 0xE66B: 0x8A6D,\n 0xE66C: 0x8A6C,\n 0xE66D: 0x8A62,\n 0xE66E: 0x8A85,\n 0xE66F: 0x8A82,\n 0xE670: 0x8A84,\n 0xE671: 0x8AA8,\n 0xE672: 0x8AA1,\n 0xE673: 0x8A91,\n 0xE674: 0x8AA5,\n 0xE675: 0x8AA6,\n 0xE676: 0x8A9A,\n 0xE677: 0x8AA3,\n 0xE678: 0x8AC4,\n 0xE679: 0x8ACD,\n 0xE67A: 0x8AC2,\n 0xE67B: 0x8ADA,\n 0xE67C: 0x8AEB,\n 0xE67D: 0x8AF3,\n 0xE67E: 0x8AE7,\n 0xE680: 0x8AE4,\n 0xE681: 0x8AF1,\n 0xE682: 0x8B14,\n 0xE683: 0x8AE0,\n 0xE684: 0x8AE2,\n 0xE685: 0x8AF7,\n 0xE686: 0x8ADE,\n 0xE687: 0x8ADB,\n 0xE688: 0x8B0C,\n 0xE689: 0x8B07,\n 0xE68A: 0x8B1A,\n 0xE68B: 0x8AE1,\n 0xE68C: 0x8B16,\n 0xE68D: 0x8B10,\n 0xE68E: 0x8B17,\n 0xE68F: 0x8B20,\n 0xE690: 0x8B33,\n 0xE691: 0x97AB,\n 0xE692: 0x8B26,\n 0xE693: 0x8B2B,\n 0xE694: 0x8B3E,\n 0xE695: 0x8B28,\n 0xE696: 0x8B41,\n 0xE697: 0x8B4C,\n 0xE698: 0x8B4F,\n 0xE699: 0x8B4E,\n 0xE69A: 0x8B49,\n 0xE69B: 0x8B56,\n 0xE69C: 0x8B5B,\n 0xE69D: 0x8B5A,\n 0xE69E: 0x8B6B,\n 0xE69F: 0x8B5F,\n 0xE6A0: 0x8B6C,\n 0xE6A1: 0x8B6F,\n 0xE6A2: 0x8B74,\n 0xE6A3: 0x8B7D,\n 0xE6A4: 0x8B80,\n 0xE6A5: 0x8B8C,\n 0xE6A6: 0x8B8E,\n 0xE6A7: 0x8B92,\n 0xE6A8: 0x8B93,\n 0xE6A9: 0x8B96,\n 0xE6AA: 0x8B99,\n 0xE6AB: 0x8B9A,\n 0xE6AC: 0x8C3A,\n 0xE6AD: 0x8C41,\n 0xE6AE: 0x8C3F,\n 0xE6AF: 0x8C48,\n 0xE6B0: 0x8C4C,\n 0xE6B1: 0x8C4E,\n 0xE6B2: 0x8C50,\n 0xE6B3: 0x8C55,\n 0xE6B4: 0x8C62,\n 0xE6B5: 0x8C6C,\n 0xE6B6: 0x8C78,\n 0xE6B7: 0x8C7A,\n 0xE6B8: 0x8C82,\n 0xE6B9: 0x8C89,\n 0xE6BA: 0x8C85,\n 0xE6BB: 0x8C8A,\n 0xE6BC: 0x8C8D,\n 0xE6BD: 0x8C8E,\n 0xE6BE: 0x8C94,\n 0xE6BF: 0x8C7C,\n 0xE6C0: 0x8C98,\n 0xE6C1: 0x621D,\n 0xE6C2: 0x8CAD,\n 0xE6C3: 0x8CAA,\n 0xE6C4: 0x8CBD,\n 0xE6C5: 0x8CB2,\n 0xE6C6: 0x8CB3,\n 0xE6C7: 0x8CAE,\n 0xE6C8: 0x8CB6,\n 0xE6C9: 0x8CC8,\n 0xE6CA: 0x8CC1,\n 0xE6CB: 0x8CE4,\n 0xE6CC: 0x8CE3,\n 0xE6CD: 0x8CDA,\n 0xE6CE: 0x8CFD,\n 0xE6CF: 0x8CFA,\n 0xE6D0: 0x8CFB,\n 0xE6D1: 0x8D04,\n 0xE6D2: 0x8D05,\n 0xE6D3: 0x8D0A,\n 0xE6D4: 0x8D07,\n 0xE6D5: 0x8D0F,\n 0xE6D6: 0x8D0D,\n 0xE6D7: 0x8D10,\n 0xE6D8: 0x9F4E,\n 0xE6D9: 0x8D13,\n 0xE6DA: 0x8CCD,\n 0xE6DB: 0x8D14,\n 0xE6DC: 0x8D16,\n 0xE6DD: 0x8D67,\n 0xE6DE: 0x8D6D,\n 0xE6DF: 0x8D71,\n 0xE6E0: 0x8D73,\n 0xE6E1: 0x8D81,\n 0xE6E2: 0x8D99,\n 0xE6E3: 0x8DC2,\n 0xE6E4: 0x8DBE,\n 0xE6E5: 0x8DBA,\n 0xE6E6: 0x8DCF,\n 0xE6E7: 0x8DDA,\n 0xE6E8: 0x8DD6,\n 0xE6E9: 0x8DCC,\n 0xE6EA: 0x8DDB,\n 0xE6EB: 0x8DCB,\n 0xE6EC: 0x8DEA,\n 0xE6ED: 0x8DEB,\n 0xE6EE: 0x8DDF,\n 0xE6EF: 0x8DE3,\n 0xE6F0: 0x8DFC,\n 0xE6F1: 0x8E08,\n 0xE6F2: 0x8E09,\n 0xE6F3: 0x8DFF,\n 0xE6F4: 0x8E1D,\n 0xE6F5: 0x8E1E,\n 0xE6F6: 0x8E10,\n 0xE6F7: 0x8E1F,\n 0xE6F8: 0x8E42,\n 0xE6F9: 0x8E35,\n 0xE6FA: 0x8E30,\n 0xE6FB: 0x8E34,\n 0xE6FC: 0x8E4A,\n 0xE740: 0x8E47,\n 0xE741: 0x8E49,\n 0xE742: 0x8E4C,\n 0xE743: 0x8E50,\n 0xE744: 0x8E48,\n 0xE745: 0x8E59,\n 0xE746: 0x8E64,\n 0xE747: 0x8E60,\n 0xE748: 0x8E2A,\n 0xE749: 0x8E63,\n 0xE74A: 0x8E55,\n 0xE74B: 0x8E76,\n 0xE74C: 0x8E72,\n 0xE74D: 0x8E7C,\n 0xE74E: 0x8E81,\n 0xE74F: 0x8E87,\n 0xE750: 0x8E85,\n 0xE751: 0x8E84,\n 0xE752: 0x8E8B,\n 0xE753: 0x8E8A,\n 0xE754: 0x8E93,\n 0xE755: 0x8E91,\n 0xE756: 0x8E94,\n 0xE757: 0x8E99,\n 0xE758: 0x8EAA,\n 0xE759: 0x8EA1,\n 0xE75A: 0x8EAC,\n 0xE75B: 0x8EB0,\n 0xE75C: 0x8EC6,\n 0xE75D: 0x8EB1,\n 0xE75E: 0x8EBE,\n 0xE75F: 0x8EC5,\n 0xE760: 0x8EC8,\n 0xE761: 0x8ECB,\n 0xE762: 0x8EDB,\n 0xE763: 0x8EE3,\n 0xE764: 0x8EFC,\n 0xE765: 0x8EFB,\n 0xE766: 0x8EEB,\n 0xE767: 0x8EFE,\n 0xE768: 0x8F0A,\n 0xE769: 0x8F05,\n 0xE76A: 0x8F15,\n 0xE76B: 0x8F12,\n 0xE76C: 0x8F19,\n 0xE76D: 0x8F13,\n 0xE76E: 0x8F1C,\n 0xE76F: 0x8F1F,\n 0xE770: 0x8F1B,\n 0xE771: 0x8F0C,\n 0xE772: 0x8F26,\n 0xE773: 0x8F33,\n 0xE774: 0x8F3B,\n 0xE775: 0x8F39,\n 0xE776: 0x8F45,\n 0xE777: 0x8F42,\n 0xE778: 0x8F3E,\n 0xE779: 0x8F4C,\n 0xE77A: 0x8F49,\n 0xE77B: 0x8F46,\n 0xE77C: 0x8F4E,\n 0xE77D: 0x8F57,\n 0xE77E: 0x8F5C,\n 0xE780: 0x8F62,\n 0xE781: 0x8F63,\n 0xE782: 0x8F64,\n 0xE783: 0x8F9C,\n 0xE784: 0x8F9F,\n 0xE785: 0x8FA3,\n 0xE786: 0x8FAD,\n 0xE787: 0x8FAF,\n 0xE788: 0x8FB7,\n 0xE789: 0x8FDA,\n 0xE78A: 0x8FE5,\n 0xE78B: 0x8FE2,\n 0xE78C: 0x8FEA,\n 0xE78D: 0x8FEF,\n 0xE78E: 0x9087,\n 0xE78F: 0x8FF4,\n 0xE790: 0x9005,\n 0xE791: 0x8FF9,\n 0xE792: 0x8FFA,\n 0xE793: 0x9011,\n 0xE794: 0x9015,\n 0xE795: 0x9021,\n 0xE796: 0x900D,\n 0xE797: 0x901E,\n 0xE798: 0x9016,\n 0xE799: 0x900B,\n 0xE79A: 0x9027,\n 0xE79B: 0x9036,\n 0xE79C: 0x9035,\n 0xE79D: 0x9039,\n 0xE79E: 0x8FF8,\n 0xE79F: 0x904F,\n 0xE7A0: 0x9050,\n 0xE7A1: 0x9051,\n 0xE7A2: 0x9052,\n 0xE7A3: 0x900E,\n 0xE7A4: 0x9049,\n 0xE7A5: 0x903E,\n 0xE7A6: 0x9056,\n 0xE7A7: 0x9058,\n 0xE7A8: 0x905E,\n 0xE7A9: 0x9068,\n 0xE7AA: 0x906F,\n 0xE7AB: 0x9076,\n 0xE7AC: 0x96A8,\n 0xE7AD: 0x9072,\n 0xE7AE: 0x9082,\n 0xE7AF: 0x907D,\n 0xE7B0: 0x9081,\n 0xE7B1: 0x9080,\n 0xE7B2: 0x908A,\n 0xE7B3: 0x9089,\n 0xE7B4: 0x908F,\n 0xE7B5: 0x90A8,\n 0xE7B6: 0x90AF,\n 0xE7B7: 0x90B1,\n 0xE7B8: 0x90B5,\n 0xE7B9: 0x90E2,\n 0xE7BA: 0x90E4,\n 0xE7BB: 0x6248,\n 0xE7BC: 0x90DB,\n 0xE7BD: 0x9102,\n 0xE7BE: 0x9112,\n 0xE7BF: 0x9119,\n 0xE7C0: 0x9132,\n 0xE7C1: 0x9130,\n 0xE7C2: 0x914A,\n 0xE7C3: 0x9156,\n 0xE7C4: 0x9158,\n 0xE7C5: 0x9163,\n 0xE7C6: 0x9165,\n 0xE7C7: 0x9169,\n 0xE7C8: 0x9173,\n 0xE7C9: 0x9172,\n 0xE7CA: 0x918B,\n 0xE7CB: 0x9189,\n 0xE7CC: 0x9182,\n 0xE7CD: 0x91A2,\n 0xE7CE: 0x91AB,\n 0xE7CF: 0x91AF,\n 0xE7D0: 0x91AA,\n 0xE7D1: 0x91B5,\n 0xE7D2: 0x91B4,\n 0xE7D3: 0x91BA,\n 0xE7D4: 0x91C0,\n 0xE7D5: 0x91C1,\n 0xE7D6: 0x91C9,\n 0xE7D7: 0x91CB,\n 0xE7D8: 0x91D0,\n 0xE7D9: 0x91D6,\n 0xE7DA: 0x91DF,\n 0xE7DB: 0x91E1,\n 0xE7DC: 0x91DB,\n 0xE7DD: 0x91FC,\n 0xE7DE: 0x91F5,\n 0xE7DF: 0x91F6,\n 0xE7E0: 0x921E,\n 0xE7E1: 0x91FF,\n 0xE7E2: 0x9214,\n 0xE7E3: 0x922C,\n 0xE7E4: 0x9215,\n 0xE7E5: 0x9211,\n 0xE7E6: 0x925E,\n 0xE7E7: 0x9257,\n 0xE7E8: 0x9245,\n 0xE7E9: 0x9249,\n 0xE7EA: 0x9264,\n 0xE7EB: 0x9248,\n 0xE7EC: 0x9295,\n 0xE7ED: 0x923F,\n 0xE7EE: 0x924B,\n 0xE7EF: 0x9250,\n 0xE7F0: 0x929C,\n 0xE7F1: 0x9296,\n 0xE7F2: 0x9293,\n 0xE7F3: 0x929B,\n 0xE7F4: 0x925A,\n 0xE7F5: 0x92CF,\n 0xE7F6: 0x92B9,\n 0xE7F7: 0x92B7,\n 0xE7F8: 0x92E9,\n 0xE7F9: 0x930F,\n 0xE7FA: 0x92FA,\n 0xE7FB: 0x9344,\n 0xE7FC: 0x932E,\n 0xE840: 0x9319,\n 0xE841: 0x9322,\n 0xE842: 0x931A,\n 0xE843: 0x9323,\n 0xE844: 0x933A,\n 0xE845: 0x9335,\n 0xE846: 0x933B,\n 0xE847: 0x935C,\n 0xE848: 0x9360,\n 0xE849: 0x937C,\n 0xE84A: 0x936E,\n 0xE84B: 0x9356,\n 0xE84C: 0x93B0,\n 0xE84D: 0x93AC,\n 0xE84E: 0x93AD,\n 0xE84F: 0x9394,\n 0xE850: 0x93B9,\n 0xE851: 0x93D6,\n 0xE852: 0x93D7,\n 0xE853: 0x93E8,\n 0xE854: 0x93E5,\n 0xE855: 0x93D8,\n 0xE856: 0x93C3,\n 0xE857: 0x93DD,\n 0xE858: 0x93D0,\n 0xE859: 0x93C8,\n 0xE85A: 0x93E4,\n 0xE85B: 0x941A,\n 0xE85C: 0x9414,\n 0xE85D: 0x9413,\n 0xE85E: 0x9403,\n 0xE85F: 0x9407,\n 0xE860: 0x9410,\n 0xE861: 0x9436,\n 0xE862: 0x942B,\n 0xE863: 0x9435,\n 0xE864: 0x9421,\n 0xE865: 0x943A,\n 0xE866: 0x9441,\n 0xE867: 0x9452,\n 0xE868: 0x9444,\n 0xE869: 0x945B,\n 0xE86A: 0x9460,\n 0xE86B: 0x9462,\n 0xE86C: 0x945E,\n 0xE86D: 0x946A,\n 0xE86E: 0x9229,\n 0xE86F: 0x9470,\n 0xE870: 0x9475,\n 0xE871: 0x9477,\n 0xE872: 0x947D,\n 0xE873: 0x945A,\n 0xE874: 0x947C,\n 0xE875: 0x947E,\n 0xE876: 0x9481,\n 0xE877: 0x947F,\n 0xE878: 0x9582,\n 0xE879: 0x9587,\n 0xE87A: 0x958A,\n 0xE87B: 0x9594,\n 0xE87C: 0x9596,\n 0xE87D: 0x9598,\n 0xE87E: 0x9599,\n 0xE880: 0x95A0,\n 0xE881: 0x95A8,\n 0xE882: 0x95A7,\n 0xE883: 0x95AD,\n 0xE884: 0x95BC,\n 0xE885: 0x95BB,\n 0xE886: 0x95B9,\n 0xE887: 0x95BE,\n 0xE888: 0x95CA,\n 0xE889: 0x6FF6,\n 0xE88A: 0x95C3,\n 0xE88B: 0x95CD,\n 0xE88C: 0x95CC,\n 0xE88D: 0x95D5,\n 0xE88E: 0x95D4,\n 0xE88F: 0x95D6,\n 0xE890: 0x95DC,\n 0xE891: 0x95E1,\n 0xE892: 0x95E5,\n 0xE893: 0x95E2,\n 0xE894: 0x9621,\n 0xE895: 0x9628,\n 0xE896: 0x962E,\n 0xE897: 0x962F,\n 0xE898: 0x9642,\n 0xE899: 0x964C,\n 0xE89A: 0x964F,\n 0xE89B: 0x964B,\n 0xE89C: 0x9677,\n 0xE89D: 0x965C,\n 0xE89E: 0x965E,\n 0xE89F: 0x965D,\n 0xE8A0: 0x965F,\n 0xE8A1: 0x9666,\n 0xE8A2: 0x9672,\n 0xE8A3: 0x966C,\n 0xE8A4: 0x968D,\n 0xE8A5: 0x9698,\n 0xE8A6: 0x9695,\n 0xE8A7: 0x9697,\n 0xE8A8: 0x96AA,\n 0xE8A9: 0x96A7,\n 0xE8AA: 0x96B1,\n 0xE8AB: 0x96B2,\n 0xE8AC: 0x96B0,\n 0xE8AD: 0x96B4,\n 0xE8AE: 0x96B6,\n 0xE8AF: 0x96B8,\n 0xE8B0: 0x96B9,\n 0xE8B1: 0x96CE,\n 0xE8B2: 0x96CB,\n 0xE8B3: 0x96C9,\n 0xE8B4: 0x96CD,\n 0xE8B5: 0x894D,\n 0xE8B6: 0x96DC,\n 0xE8B7: 0x970D,\n 0xE8B8: 0x96D5,\n 0xE8B9: 0x96F9,\n 0xE8BA: 0x9704,\n 0xE8BB: 0x9706,\n 0xE8BC: 0x9708,\n 0xE8BD: 0x9713,\n 0xE8BE: 0x970E,\n 0xE8BF: 0x9711,\n 0xE8C0: 0x970F,\n 0xE8C1: 0x9716,\n 0xE8C2: 0x9719,\n 0xE8C3: 0x9724,\n 0xE8C4: 0x972A,\n 0xE8C5: 0x9730,\n 0xE8C6: 0x9739,\n 0xE8C7: 0x973D,\n 0xE8C8: 0x973E,\n 0xE8C9: 0x9744,\n 0xE8CA: 0x9746,\n 0xE8CB: 0x9748,\n 0xE8CC: 0x9742,\n 0xE8CD: 0x9749,\n 0xE8CE: 0x975C,\n 0xE8CF: 0x9760,\n 0xE8D0: 0x9764,\n 0xE8D1: 0x9766,\n 0xE8D2: 0x9768,\n 0xE8D3: 0x52D2,\n 0xE8D4: 0x976B,\n 0xE8D5: 0x9771,\n 0xE8D6: 0x9779,\n 0xE8D7: 0x9785,\n 0xE8D8: 0x977C,\n 0xE8D9: 0x9781,\n 0xE8DA: 0x977A,\n 0xE8DB: 0x9786,\n 0xE8DC: 0x978B,\n 0xE8DD: 0x978F,\n 0xE8DE: 0x9790,\n 0xE8DF: 0x979C,\n 0xE8E0: 0x97A8,\n 0xE8E1: 0x97A6,\n 0xE8E2: 0x97A3,\n 0xE8E3: 0x97B3,\n 0xE8E4: 0x97B4,\n 0xE8E5: 0x97C3,\n 0xE8E6: 0x97C6,\n 0xE8E7: 0x97C8,\n 0xE8E8: 0x97CB,\n 0xE8E9: 0x97DC,\n 0xE8EA: 0x97ED,\n 0xE8EB: 0x9F4F,\n 0xE8EC: 0x97F2,\n 0xE8ED: 0x7ADF,\n 0xE8EE: 0x97F6,\n 0xE8EF: 0x97F5,\n 0xE8F0: 0x980F,\n 0xE8F1: 0x980C,\n 0xE8F2: 0x9838,\n 0xE8F3: 0x9824,\n 0xE8F4: 0x9821,\n 0xE8F5: 0x9837,\n 0xE8F6: 0x983D,\n 0xE8F7: 0x9846,\n 0xE8F8: 0x984F,\n 0xE8F9: 0x984B,\n 0xE8FA: 0x986B,\n 0xE8FB: 0x986F,\n 0xE8FC: 0x9870,\n 0xE940: 0x9871,\n 0xE941: 0x9874,\n 0xE942: 0x9873,\n 0xE943: 0x98AA,\n 0xE944: 0x98AF,\n 0xE945: 0x98B1,\n 0xE946: 0x98B6,\n 0xE947: 0x98C4,\n 0xE948: 0x98C3,\n 0xE949: 0x98C6,\n 0xE94A: 0x98E9,\n 0xE94B: 0x98EB,\n 0xE94C: 0x9903,\n 0xE94D: 0x9909,\n 0xE94E: 0x9912,\n 0xE94F: 0x9914,\n 0xE950: 0x9918,\n 0xE951: 0x9921,\n 0xE952: 0x991D,\n 0xE953: 0x991E,\n 0xE954: 0x9924,\n 0xE955: 0x9920,\n 0xE956: 0x992C,\n 0xE957: 0x992E,\n 0xE958: 0x993D,\n 0xE959: 0x993E,\n 0xE95A: 0x9942,\n 0xE95B: 0x9949,\n 0xE95C: 0x9945,\n 0xE95D: 0x9950,\n 0xE95E: 0x994B,\n 0xE95F: 0x9951,\n 0xE960: 0x9952,\n 0xE961: 0x994C,\n 0xE962: 0x9955,\n 0xE963: 0x9997,\n 0xE964: 0x9998,\n 0xE965: 0x99A5,\n 0xE966: 0x99AD,\n 0xE967: 0x99AE,\n 0xE968: 0x99BC,\n 0xE969: 0x99DF,\n 0xE96A: 0x99DB,\n 0xE96B: 0x99DD,\n 0xE96C: 0x99D8,\n 0xE96D: 0x99D1,\n 0xE96E: 0x99ED,\n 0xE96F: 0x99EE,\n 0xE970: 0x99F1,\n 0xE971: 0x99F2,\n 0xE972: 0x99FB,\n 0xE973: 0x99F8,\n 0xE974: 0x9A01,\n 0xE975: 0x9A0F,\n 0xE976: 0x9A05,\n 0xE977: 0x99E2,\n 0xE978: 0x9A19,\n 0xE979: 0x9A2B,\n 0xE97A: 0x9A37,\n 0xE97B: 0x9A45,\n 0xE97C: 0x9A42,\n 0xE97D: 0x9A40,\n 0xE97E: 0x9A43,\n 0xE980: 0x9A3E,\n 0xE981: 0x9A55,\n 0xE982: 0x9A4D,\n 0xE983: 0x9A5B,\n 0xE984: 0x9A57,\n 0xE985: 0x9A5F,\n 0xE986: 0x9A62,\n 0xE987: 0x9A65,\n 0xE988: 0x9A64,\n 0xE989: 0x9A69,\n 0xE98A: 0x9A6B,\n 0xE98B: 0x9A6A,\n 0xE98C: 0x9AAD,\n 0xE98D: 0x9AB0,\n 0xE98E: 0x9ABC,\n 0xE98F: 0x9AC0,\n 0xE990: 0x9ACF,\n 0xE991: 0x9AD1,\n 0xE992: 0x9AD3,\n 0xE993: 0x9AD4,\n 0xE994: 0x9ADE,\n 0xE995: 0x9ADF,\n 0xE996: 0x9AE2,\n 0xE997: 0x9AE3,\n 0xE998: 0x9AE6,\n 0xE999: 0x9AEF,\n 0xE99A: 0x9AEB,\n 0xE99B: 0x9AEE,\n 0xE99C: 0x9AF4,\n 0xE99D: 0x9AF1,\n 0xE99E: 0x9AF7,\n 0xE99F: 0x9AFB,\n 0xE9A0: 0x9B06,\n 0xE9A1: 0x9B18,\n 0xE9A2: 0x9B1A,\n 0xE9A3: 0x9B1F,\n 0xE9A4: 0x9B22,\n 0xE9A5: 0x9B23,\n 0xE9A6: 0x9B25,\n 0xE9A7: 0x9B27,\n 0xE9A8: 0x9B28,\n 0xE9A9: 0x9B29,\n 0xE9AA: 0x9B2A,\n 0xE9AB: 0x9B2E,\n 0xE9AC: 0x9B2F,\n 0xE9AD: 0x9B32,\n 0xE9AE: 0x9B44,\n 0xE9AF: 0x9B43,\n 0xE9B0: 0x9B4F,\n 0xE9B1: 0x9B4D,\n 0xE9B2: 0x9B4E,\n 0xE9B3: 0x9B51,\n 0xE9B4: 0x9B58,\n 0xE9B5: 0x9B74,\n 0xE9B6: 0x9B93,\n 0xE9B7: 0x9B83,\n 0xE9B8: 0x9B91,\n 0xE9B9: 0x9B96,\n 0xE9BA: 0x9B97,\n 0xE9BB: 0x9B9F,\n 0xE9BC: 0x9BA0,\n 0xE9BD: 0x9BA8,\n 0xE9BE: 0x9BB4,\n 0xE9BF: 0x9BC0,\n 0xE9C0: 0x9BCA,\n 0xE9C1: 0x9BB9,\n 0xE9C2: 0x9BC6,\n 0xE9C3: 0x9BCF,\n 0xE9C4: 0x9BD1,\n 0xE9C5: 0x9BD2,\n 0xE9C6: 0x9BE3,\n 0xE9C7: 0x9BE2,\n 0xE9C8: 0x9BE4,\n 0xE9C9: 0x9BD4,\n 0xE9CA: 0x9BE1,\n 0xE9CB: 0x9C3A,\n 0xE9CC: 0x9BF2,\n 0xE9CD: 0x9BF1,\n 0xE9CE: 0x9BF0,\n 0xE9CF: 0x9C15,\n 0xE9D0: 0x9C14,\n 0xE9D1: 0x9C09,\n 0xE9D2: 0x9C13,\n 0xE9D3: 0x9C0C,\n 0xE9D4: 0x9C06,\n 0xE9D5: 0x9C08,\n 0xE9D6: 0x9C12,\n 0xE9D7: 0x9C0A,\n 0xE9D8: 0x9C04,\n 0xE9D9: 0x9C2E,\n 0xE9DA: 0x9C1B,\n 0xE9DB: 0x9C25,\n 0xE9DC: 0x9C24,\n 0xE9DD: 0x9C21,\n 0xE9DE: 0x9C30,\n 0xE9DF: 0x9C47,\n 0xE9E0: 0x9C32,\n 0xE9E1: 0x9C46,\n 0xE9E2: 0x9C3E,\n 0xE9E3: 0x9C5A,\n 0xE9E4: 0x9C60,\n 0xE9E5: 0x9C67,\n 0xE9E6: 0x9C76,\n 0xE9E7: 0x9C78,\n 0xE9E8: 0x9CE7,\n 0xE9E9: 0x9CEC,\n 0xE9EA: 0x9CF0,\n 0xE9EB: 0x9D09,\n 0xE9EC: 0x9D08,\n 0xE9ED: 0x9CEB,\n 0xE9EE: 0x9D03,\n 0xE9EF: 0x9D06,\n 0xE9F0: 0x9D2A,\n 0xE9F1: 0x9D26,\n 0xE9F2: 0x9DAF,\n 0xE9F3: 0x9D23,\n 0xE9F4: 0x9D1F,\n 0xE9F5: 0x9D44,\n 0xE9F6: 0x9D15,\n 0xE9F7: 0x9D12,\n 0xE9F8: 0x9D41,\n 0xE9F9: 0x9D3F,\n 0xE9FA: 0x9D3E,\n 0xE9FB: 0x9D46,\n 0xE9FC: 0x9D48,\n 0xEA40: 0x9D5D,\n 0xEA41: 0x9D5E,\n 0xEA42: 0x9D64,\n 0xEA43: 0x9D51,\n 0xEA44: 0x9D50,\n 0xEA45: 0x9D59,\n 0xEA46: 0x9D72,\n 0xEA47: 0x9D89,\n 0xEA48: 0x9D87,\n 0xEA49: 0x9DAB,\n 0xEA4A: 0x9D6F,\n 0xEA4B: 0x9D7A,\n 0xEA4C: 0x9D9A,\n 0xEA4D: 0x9DA4,\n 0xEA4E: 0x9DA9,\n 0xEA4F: 0x9DB2,\n 0xEA50: 0x9DC4,\n 0xEA51: 0x9DC1,\n 0xEA52: 0x9DBB,\n 0xEA53: 0x9DB8,\n 0xEA54: 0x9DBA,\n 0xEA55: 0x9DC6,\n 0xEA56: 0x9DCF,\n 0xEA57: 0x9DC2,\n 0xEA58: 0x9DD9,\n 0xEA59: 0x9DD3,\n 0xEA5A: 0x9DF8,\n 0xEA5B: 0x9DE6,\n 0xEA5C: 0x9DED,\n 0xEA5D: 0x9DEF,\n 0xEA5E: 0x9DFD,\n 0xEA5F: 0x9E1A,\n 0xEA60: 0x9E1B,\n 0xEA61: 0x9E1E,\n 0xEA62: 0x9E75,\n 0xEA63: 0x9E79,\n 0xEA64: 0x9E7D,\n 0xEA65: 0x9E81,\n 0xEA66: 0x9E88,\n 0xEA67: 0x9E8B,\n 0xEA68: 0x9E8C,\n 0xEA69: 0x9E92,\n 0xEA6A: 0x9E95,\n 0xEA6B: 0x9E91,\n 0xEA6C: 0x9E9D,\n 0xEA6D: 0x9EA5,\n 0xEA6E: 0x9EA9,\n 0xEA6F: 0x9EB8,\n 0xEA70: 0x9EAA,\n 0xEA71: 0x9EAD,\n 0xEA72: 0x9761,\n 0xEA73: 0x9ECC,\n 0xEA74: 0x9ECE,\n 0xEA75: 0x9ECF,\n 0xEA76: 0x9ED0,\n 0xEA77: 0x9ED4,\n 0xEA78: 0x9EDC,\n 0xEA79: 0x9EDE,\n 0xEA7A: 0x9EDD,\n 0xEA7B: 0x9EE0,\n 0xEA7C: 0x9EE5,\n 0xEA7D: 0x9EE8,\n 0xEA7E: 0x9EEF,\n 0xEA80: 0x9EF4,\n 0xEA81: 0x9EF6,\n 0xEA82: 0x9EF7,\n 0xEA83: 0x9EF9,\n 0xEA84: 0x9EFB,\n 0xEA85: 0x9EFC,\n 0xEA86: 0x9EFD,\n 0xEA87: 0x9F07,\n 0xEA88: 0x9F08,\n 0xEA89: 0x76B7,\n 0xEA8A: 0x9F15,\n 0xEA8B: 0x9F21,\n 0xEA8C: 0x9F2C,\n 0xEA8D: 0x9F3E,\n 0xEA8E: 0x9F4A,\n 0xEA8F: 0x9F52,\n 0xEA90: 0x9F54,\n 0xEA91: 0x9F63,\n 0xEA92: 0x9F5F,\n 0xEA93: 0x9F60,\n 0xEA94: 0x9F61,\n 0xEA95: 0x9F66,\n 0xEA96: 0x9F67,\n 0xEA97: 0x9F6C,\n 0xEA98: 0x9F6A,\n 0xEA99: 0x9F77,\n 0xEA9A: 0x9F72,\n 0xEA9B: 0x9F76,\n 0xEA9C: 0x9F95,\n 0xEA9D: 0x9F9C,\n 0xEA9E: 0x9FA0,\n 0xEA9F: 0x582F,\n 0xEAA0: 0x69C7,\n 0xEAA1: 0x9059,\n 0xEAA2: 0x7464,\n 0xEAA3: 0x51DC,\n 0xEAA4: 0x7199,\n};\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar GenericGF_1 = __webpack_require__(1);\nvar GenericGFPoly_1 = __webpack_require__(2);\nfunction runEuclideanAlgorithm(field, a, b, R) {\n var _a;\n // Assume a's degree is >= b's\n if (a.degree() < b.degree()) {\n _a = [b, a], a = _a[0], b = _a[1];\n }\n var rLast = a;\n var r = b;\n var tLast = field.zero;\n var t = field.one;\n // Run Euclidean algorithm until r's degree is less than R/2\n while (r.degree() >= R / 2) {\n var rLastLast = rLast;\n var tLastLast = tLast;\n rLast = r;\n tLast = t;\n // Divide rLastLast by rLast, with quotient in q and remainder in r\n if (rLast.isZero()) {\n // Euclidean algorithm already terminated?\n return null;\n }\n r = rLastLast;\n var q = field.zero;\n var denominatorLeadingTerm = rLast.getCoefficient(rLast.degree());\n var dltInverse = field.inverse(denominatorLeadingTerm);\n while (r.degree() >= rLast.degree() && !r.isZero()) {\n var degreeDiff = r.degree() - rLast.degree();\n var scale = field.multiply(r.getCoefficient(r.degree()), dltInverse);\n q = q.addOrSubtract(field.buildMonomial(degreeDiff, scale));\n r = r.addOrSubtract(rLast.multiplyByMonomial(degreeDiff, scale));\n }\n t = q.multiplyPoly(tLast).addOrSubtract(tLastLast);\n if (r.degree() >= rLast.degree()) {\n return null;\n }\n }\n var sigmaTildeAtZero = t.getCoefficient(0);\n if (sigmaTildeAtZero === 0) {\n return null;\n }\n var inverse = field.inverse(sigmaTildeAtZero);\n return [t.multiply(inverse), r.multiply(inverse)];\n}\nfunction findErrorLocations(field, errorLocator) {\n // This is a direct application of Chien's search\n var numErrors = errorLocator.degree();\n if (numErrors === 1) {\n return [errorLocator.getCoefficient(1)];\n }\n var result = new Array(numErrors);\n var errorCount = 0;\n for (var i = 1; i < field.size && errorCount < numErrors; i++) {\n if (errorLocator.evaluateAt(i) === 0) {\n result[errorCount] = field.inverse(i);\n errorCount++;\n }\n }\n if (errorCount !== numErrors) {\n return null;\n }\n return result;\n}\nfunction findErrorMagnitudes(field, errorEvaluator, errorLocations) {\n // This is directly applying Forney's Formula\n var s = errorLocations.length;\n var result = new Array(s);\n for (var i = 0; i < s; i++) {\n var xiInverse = field.inverse(errorLocations[i]);\n var denominator = 1;\n for (var j = 0; j < s; j++) {\n if (i !== j) {\n denominator = field.multiply(denominator, GenericGF_1.addOrSubtractGF(1, field.multiply(errorLocations[j], xiInverse)));\n }\n }\n result[i] = field.multiply(errorEvaluator.evaluateAt(xiInverse), field.inverse(denominator));\n if (field.generatorBase !== 0) {\n result[i] = field.multiply(result[i], xiInverse);\n }\n }\n return result;\n}\nfunction decode(bytes, twoS) {\n var outputBytes = new Uint8ClampedArray(bytes.length);\n outputBytes.set(bytes);\n var field = new GenericGF_1.default(0x011D, 256, 0); // x^8 + x^4 + x^3 + x^2 + 1\n var poly = new GenericGFPoly_1.default(field, outputBytes);\n var syndromeCoefficients = new Uint8ClampedArray(twoS);\n var error = false;\n for (var s = 0; s < twoS; s++) {\n var evaluation = poly.evaluateAt(field.exp(s + field.generatorBase));\n syndromeCoefficients[syndromeCoefficients.length - 1 - s] = evaluation;\n if (evaluation !== 0) {\n error = true;\n }\n }\n if (!error) {\n return outputBytes;\n }\n var syndrome = new GenericGFPoly_1.default(field, syndromeCoefficients);\n var sigmaOmega = runEuclideanAlgorithm(field, field.buildMonomial(twoS, 1), syndrome, twoS);\n if (sigmaOmega === null) {\n return null;\n }\n var errorLocations = findErrorLocations(field, sigmaOmega[0]);\n if (errorLocations == null) {\n return null;\n }\n var errorMagnitudes = findErrorMagnitudes(field, sigmaOmega[1], errorLocations);\n for (var i = 0; i < errorLocations.length; i++) {\n var position = outputBytes.length - 1 - field.log(errorLocations[i]);\n if (position < 0) {\n return null;\n }\n outputBytes[position] = GenericGF_1.addOrSubtractGF(outputBytes[position], errorMagnitudes[i]);\n }\n return outputBytes;\n}\nexports.decode = decode;\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VERSIONS = [\n {\n infoBits: null,\n versionNumber: 1,\n alignmentPatternCenters: [],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 7,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 19 }],\n },\n {\n ecCodewordsPerBlock: 10,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 16 }],\n },\n {\n ecCodewordsPerBlock: 13,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 13 }],\n },\n {\n ecCodewordsPerBlock: 17,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 9 }],\n },\n ],\n },\n {\n infoBits: null,\n versionNumber: 2,\n alignmentPatternCenters: [6, 18],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 10,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 34 }],\n },\n {\n ecCodewordsPerBlock: 16,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 28 }],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 22 }],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 16 }],\n },\n ],\n },\n {\n infoBits: null,\n versionNumber: 3,\n alignmentPatternCenters: [6, 22],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 15,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 55 }],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 44 }],\n },\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 17 }],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 13 }],\n },\n ],\n },\n {\n infoBits: null,\n versionNumber: 4,\n alignmentPatternCenters: [6, 26],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 20,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 80 }],\n },\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 32 }],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 24 }],\n },\n {\n ecCodewordsPerBlock: 16,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 9 }],\n },\n ],\n },\n {\n infoBits: null,\n versionNumber: 5,\n alignmentPatternCenters: [6, 30],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 108 }],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 43 }],\n },\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 15 },\n { numBlocks: 2, dataCodewordsPerBlock: 16 },\n ],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 11 },\n { numBlocks: 2, dataCodewordsPerBlock: 12 },\n ],\n },\n ],\n },\n {\n infoBits: null,\n versionNumber: 6,\n alignmentPatternCenters: [6, 34],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 68 }],\n },\n {\n ecCodewordsPerBlock: 16,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 27 }],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 19 }],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 15 }],\n },\n ],\n },\n {\n infoBits: 0x07C94,\n versionNumber: 7,\n alignmentPatternCenters: [6, 22, 38],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 20,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 78 }],\n },\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 31 }],\n },\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 14 },\n { numBlocks: 4, dataCodewordsPerBlock: 15 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 13 },\n { numBlocks: 1, dataCodewordsPerBlock: 14 },\n ],\n },\n ],\n },\n {\n infoBits: 0x085BC,\n versionNumber: 8,\n alignmentPatternCenters: [6, 24, 42],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 97 }],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 38 },\n { numBlocks: 2, dataCodewordsPerBlock: 39 },\n ],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 18 },\n { numBlocks: 2, dataCodewordsPerBlock: 19 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 14 },\n { numBlocks: 2, dataCodewordsPerBlock: 15 },\n ],\n },\n ],\n },\n {\n infoBits: 0x09A99,\n versionNumber: 9,\n alignmentPatternCenters: [6, 26, 46],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 116 }],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 36 },\n { numBlocks: 2, dataCodewordsPerBlock: 37 },\n ],\n },\n {\n ecCodewordsPerBlock: 20,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 16 },\n { numBlocks: 4, dataCodewordsPerBlock: 17 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 12 },\n { numBlocks: 4, dataCodewordsPerBlock: 13 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0A4D3,\n versionNumber: 10,\n alignmentPatternCenters: [6, 28, 50],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 18,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 68 },\n { numBlocks: 2, dataCodewordsPerBlock: 69 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 43 },\n { numBlocks: 1, dataCodewordsPerBlock: 44 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 19 },\n { numBlocks: 2, dataCodewordsPerBlock: 20 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 15 },\n { numBlocks: 2, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0BBF6,\n versionNumber: 11,\n alignmentPatternCenters: [6, 30, 54],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 20,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 81 }],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 1, dataCodewordsPerBlock: 50 },\n { numBlocks: 4, dataCodewordsPerBlock: 51 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 22 },\n { numBlocks: 4, dataCodewordsPerBlock: 23 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 12 },\n { numBlocks: 8, dataCodewordsPerBlock: 13 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0C762,\n versionNumber: 12,\n alignmentPatternCenters: [6, 32, 58],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 92 },\n { numBlocks: 2, dataCodewordsPerBlock: 93 },\n ],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 36 },\n { numBlocks: 2, dataCodewordsPerBlock: 37 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 20 },\n { numBlocks: 6, dataCodewordsPerBlock: 21 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 7, dataCodewordsPerBlock: 14 },\n { numBlocks: 4, dataCodewordsPerBlock: 15 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0D847,\n versionNumber: 13,\n alignmentPatternCenters: [6, 34, 62],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 107 }],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 37 },\n { numBlocks: 1, dataCodewordsPerBlock: 38 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 20 },\n { numBlocks: 4, dataCodewordsPerBlock: 21 },\n ],\n },\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 12, dataCodewordsPerBlock: 11 },\n { numBlocks: 4, dataCodewordsPerBlock: 12 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0E60D,\n versionNumber: 14,\n alignmentPatternCenters: [6, 26, 46, 66],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 115 },\n { numBlocks: 1, dataCodewordsPerBlock: 116 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 40 },\n { numBlocks: 5, dataCodewordsPerBlock: 41 },\n ],\n },\n {\n ecCodewordsPerBlock: 20,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 16 },\n { numBlocks: 5, dataCodewordsPerBlock: 17 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 12 },\n { numBlocks: 5, dataCodewordsPerBlock: 13 },\n ],\n },\n ],\n },\n {\n infoBits: 0x0F928,\n versionNumber: 15,\n alignmentPatternCenters: [6, 26, 48, 70],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 22,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 87 },\n { numBlocks: 1, dataCodewordsPerBlock: 88 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 41 },\n { numBlocks: 5, dataCodewordsPerBlock: 42 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 24 },\n { numBlocks: 7, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 12 },\n { numBlocks: 7, dataCodewordsPerBlock: 13 },\n ],\n },\n ],\n },\n {\n infoBits: 0x10B78,\n versionNumber: 16,\n alignmentPatternCenters: [6, 26, 50, 74],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 98 },\n { numBlocks: 1, dataCodewordsPerBlock: 99 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 7, dataCodewordsPerBlock: 45 },\n { numBlocks: 3, dataCodewordsPerBlock: 46 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [\n { numBlocks: 15, dataCodewordsPerBlock: 19 },\n { numBlocks: 2, dataCodewordsPerBlock: 20 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 15 },\n { numBlocks: 13, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1145D,\n versionNumber: 17,\n alignmentPatternCenters: [6, 30, 54, 78],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 1, dataCodewordsPerBlock: 107 },\n { numBlocks: 5, dataCodewordsPerBlock: 108 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 10, dataCodewordsPerBlock: 46 },\n { numBlocks: 1, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 1, dataCodewordsPerBlock: 22 },\n { numBlocks: 15, dataCodewordsPerBlock: 23 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 14 },\n { numBlocks: 17, dataCodewordsPerBlock: 15 },\n ],\n },\n ],\n },\n {\n infoBits: 0x12A17,\n versionNumber: 18,\n alignmentPatternCenters: [6, 30, 56, 82],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 120 },\n { numBlocks: 1, dataCodewordsPerBlock: 121 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 9, dataCodewordsPerBlock: 43 },\n { numBlocks: 4, dataCodewordsPerBlock: 44 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 17, dataCodewordsPerBlock: 22 },\n { numBlocks: 1, dataCodewordsPerBlock: 23 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 14 },\n { numBlocks: 19, dataCodewordsPerBlock: 15 },\n ],\n },\n ],\n },\n {\n infoBits: 0x13532,\n versionNumber: 19,\n alignmentPatternCenters: [6, 30, 58, 86],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 113 },\n { numBlocks: 4, dataCodewordsPerBlock: 114 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 44 },\n { numBlocks: 11, dataCodewordsPerBlock: 45 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 17, dataCodewordsPerBlock: 21 },\n { numBlocks: 4, dataCodewordsPerBlock: 22 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 9, dataCodewordsPerBlock: 13 },\n { numBlocks: 16, dataCodewordsPerBlock: 14 },\n ],\n },\n ],\n },\n {\n infoBits: 0x149A6,\n versionNumber: 20,\n alignmentPatternCenters: [6, 34, 62, 90],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 107 },\n { numBlocks: 5, dataCodewordsPerBlock: 108 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 41 },\n { numBlocks: 13, dataCodewordsPerBlock: 42 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 15, dataCodewordsPerBlock: 24 },\n { numBlocks: 5, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 15, dataCodewordsPerBlock: 15 },\n { numBlocks: 10, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x15683,\n versionNumber: 21,\n alignmentPatternCenters: [6, 28, 50, 72, 94],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 116 },\n { numBlocks: 4, dataCodewordsPerBlock: 117 },\n ],\n },\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 42 }],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 17, dataCodewordsPerBlock: 22 },\n { numBlocks: 6, dataCodewordsPerBlock: 23 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 16 },\n { numBlocks: 6, dataCodewordsPerBlock: 17 },\n ],\n },\n ],\n },\n {\n infoBits: 0x168C9,\n versionNumber: 22,\n alignmentPatternCenters: [6, 26, 50, 74, 98],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 111 },\n { numBlocks: 7, dataCodewordsPerBlock: 112 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 46 }],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 7, dataCodewordsPerBlock: 24 },\n { numBlocks: 16, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 24,\n ecBlocks: [{ numBlocks: 34, dataCodewordsPerBlock: 13 }],\n },\n ],\n },\n {\n infoBits: 0x177EC,\n versionNumber: 23,\n alignmentPatternCenters: [6, 30, 54, 74, 102],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 121 },\n { numBlocks: 5, dataCodewordsPerBlock: 122 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 47 },\n { numBlocks: 14, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 24 },\n { numBlocks: 14, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 16, dataCodewordsPerBlock: 15 },\n { numBlocks: 14, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x18EC4,\n versionNumber: 24,\n alignmentPatternCenters: [6, 28, 54, 80, 106],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 117 },\n { numBlocks: 4, dataCodewordsPerBlock: 118 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 45 },\n { numBlocks: 14, dataCodewordsPerBlock: 46 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 24 },\n { numBlocks: 16, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 30, dataCodewordsPerBlock: 16 },\n { numBlocks: 2, dataCodewordsPerBlock: 17 },\n ],\n },\n ],\n },\n {\n infoBits: 0x191E1,\n versionNumber: 25,\n alignmentPatternCenters: [6, 32, 58, 84, 110],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 26,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 106 },\n { numBlocks: 4, dataCodewordsPerBlock: 107 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 47 },\n { numBlocks: 13, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 7, dataCodewordsPerBlock: 24 },\n { numBlocks: 22, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 22, dataCodewordsPerBlock: 15 },\n { numBlocks: 13, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1AFAB,\n versionNumber: 26,\n alignmentPatternCenters: [6, 30, 58, 86, 114],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 10, dataCodewordsPerBlock: 114 },\n { numBlocks: 2, dataCodewordsPerBlock: 115 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 46 },\n { numBlocks: 4, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 28, dataCodewordsPerBlock: 22 },\n { numBlocks: 6, dataCodewordsPerBlock: 23 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 33, dataCodewordsPerBlock: 16 },\n { numBlocks: 4, dataCodewordsPerBlock: 17 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1B08E,\n versionNumber: 27,\n alignmentPatternCenters: [6, 34, 62, 90, 118],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 122 },\n { numBlocks: 4, dataCodewordsPerBlock: 123 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 22, dataCodewordsPerBlock: 45 },\n { numBlocks: 3, dataCodewordsPerBlock: 46 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 8, dataCodewordsPerBlock: 23 },\n { numBlocks: 26, dataCodewordsPerBlock: 24 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 12, dataCodewordsPerBlock: 15 },\n { numBlocks: 28, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1CC1A,\n versionNumber: 28,\n alignmentPatternCenters: [6, 26, 50, 74, 98, 122],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 117 },\n { numBlocks: 10, dataCodewordsPerBlock: 118 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 3, dataCodewordsPerBlock: 45 },\n { numBlocks: 23, dataCodewordsPerBlock: 46 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 24 },\n { numBlocks: 31, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 15 },\n { numBlocks: 31, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1D33F,\n versionNumber: 29,\n alignmentPatternCenters: [6, 30, 54, 78, 102, 126],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 7, dataCodewordsPerBlock: 116 },\n { numBlocks: 7, dataCodewordsPerBlock: 117 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 21, dataCodewordsPerBlock: 45 },\n { numBlocks: 7, dataCodewordsPerBlock: 46 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 1, dataCodewordsPerBlock: 23 },\n { numBlocks: 37, dataCodewordsPerBlock: 24 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 15 },\n { numBlocks: 26, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1ED75,\n versionNumber: 30,\n alignmentPatternCenters: [6, 26, 52, 78, 104, 130],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 5, dataCodewordsPerBlock: 115 },\n { numBlocks: 10, dataCodewordsPerBlock: 116 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 47 },\n { numBlocks: 10, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 15, dataCodewordsPerBlock: 24 },\n { numBlocks: 25, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 23, dataCodewordsPerBlock: 15 },\n { numBlocks: 25, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x1F250,\n versionNumber: 31,\n alignmentPatternCenters: [6, 30, 56, 82, 108, 134],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 13, dataCodewordsPerBlock: 115 },\n { numBlocks: 3, dataCodewordsPerBlock: 116 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 46 },\n { numBlocks: 29, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 42, dataCodewordsPerBlock: 24 },\n { numBlocks: 1, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 23, dataCodewordsPerBlock: 15 },\n { numBlocks: 28, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x209D5,\n versionNumber: 32,\n alignmentPatternCenters: [6, 34, 60, 86, 112, 138],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 115 }],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 10, dataCodewordsPerBlock: 46 },\n { numBlocks: 23, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 10, dataCodewordsPerBlock: 24 },\n { numBlocks: 35, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 15 },\n { numBlocks: 35, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x216F0,\n versionNumber: 33,\n alignmentPatternCenters: [6, 30, 58, 86, 114, 142],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 17, dataCodewordsPerBlock: 115 },\n { numBlocks: 1, dataCodewordsPerBlock: 116 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 14, dataCodewordsPerBlock: 46 },\n { numBlocks: 21, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 29, dataCodewordsPerBlock: 24 },\n { numBlocks: 19, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 11, dataCodewordsPerBlock: 15 },\n { numBlocks: 46, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x228BA,\n versionNumber: 34,\n alignmentPatternCenters: [6, 34, 62, 90, 118, 146],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 13, dataCodewordsPerBlock: 115 },\n { numBlocks: 6, dataCodewordsPerBlock: 116 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 14, dataCodewordsPerBlock: 46 },\n { numBlocks: 23, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 44, dataCodewordsPerBlock: 24 },\n { numBlocks: 7, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 59, dataCodewordsPerBlock: 16 },\n { numBlocks: 1, dataCodewordsPerBlock: 17 },\n ],\n },\n ],\n },\n {\n infoBits: 0x2379F,\n versionNumber: 35,\n alignmentPatternCenters: [6, 30, 54, 78, 102, 126, 150],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 12, dataCodewordsPerBlock: 121 },\n { numBlocks: 7, dataCodewordsPerBlock: 122 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 12, dataCodewordsPerBlock: 47 },\n { numBlocks: 26, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 39, dataCodewordsPerBlock: 24 },\n { numBlocks: 14, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 22, dataCodewordsPerBlock: 15 },\n { numBlocks: 41, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x24B0B,\n versionNumber: 36,\n alignmentPatternCenters: [6, 24, 50, 76, 102, 128, 154],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 121 },\n { numBlocks: 14, dataCodewordsPerBlock: 122 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 6, dataCodewordsPerBlock: 47 },\n { numBlocks: 34, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 46, dataCodewordsPerBlock: 24 },\n { numBlocks: 10, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 2, dataCodewordsPerBlock: 15 },\n { numBlocks: 64, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x2542E,\n versionNumber: 37,\n alignmentPatternCenters: [6, 28, 54, 80, 106, 132, 158],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 17, dataCodewordsPerBlock: 122 },\n { numBlocks: 4, dataCodewordsPerBlock: 123 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 29, dataCodewordsPerBlock: 46 },\n { numBlocks: 14, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 49, dataCodewordsPerBlock: 24 },\n { numBlocks: 10, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 24, dataCodewordsPerBlock: 15 },\n { numBlocks: 46, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x26A64,\n versionNumber: 38,\n alignmentPatternCenters: [6, 32, 58, 84, 110, 136, 162],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 4, dataCodewordsPerBlock: 122 },\n { numBlocks: 18, dataCodewordsPerBlock: 123 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 13, dataCodewordsPerBlock: 46 },\n { numBlocks: 32, dataCodewordsPerBlock: 47 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 48, dataCodewordsPerBlock: 24 },\n { numBlocks: 14, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 42, dataCodewordsPerBlock: 15 },\n { numBlocks: 32, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x27541,\n versionNumber: 39,\n alignmentPatternCenters: [6, 26, 54, 82, 110, 138, 166],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 20, dataCodewordsPerBlock: 117 },\n { numBlocks: 4, dataCodewordsPerBlock: 118 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 40, dataCodewordsPerBlock: 47 },\n { numBlocks: 7, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 43, dataCodewordsPerBlock: 24 },\n { numBlocks: 22, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 10, dataCodewordsPerBlock: 15 },\n { numBlocks: 67, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n {\n infoBits: 0x28C69,\n versionNumber: 40,\n alignmentPatternCenters: [6, 30, 58, 86, 114, 142, 170],\n errorCorrectionLevels: [\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 19, dataCodewordsPerBlock: 118 },\n { numBlocks: 6, dataCodewordsPerBlock: 119 },\n ],\n },\n {\n ecCodewordsPerBlock: 28,\n ecBlocks: [\n { numBlocks: 18, dataCodewordsPerBlock: 47 },\n { numBlocks: 31, dataCodewordsPerBlock: 48 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 34, dataCodewordsPerBlock: 24 },\n { numBlocks: 34, dataCodewordsPerBlock: 25 },\n ],\n },\n {\n ecCodewordsPerBlock: 30,\n ecBlocks: [\n { numBlocks: 20, dataCodewordsPerBlock: 15 },\n { numBlocks: 61, dataCodewordsPerBlock: 16 },\n ],\n },\n ],\n },\n];\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix_1 = __webpack_require__(0);\nfunction squareToQuadrilateral(p1, p2, p3, p4) {\n var dx3 = p1.x - p2.x + p3.x - p4.x;\n var dy3 = p1.y - p2.y + p3.y - p4.y;\n if (dx3 === 0 && dy3 === 0) { // Affine\n return {\n a11: p2.x - p1.x,\n a12: p2.y - p1.y,\n a13: 0,\n a21: p3.x - p2.x,\n a22: p3.y - p2.y,\n a23: 0,\n a31: p1.x,\n a32: p1.y,\n a33: 1,\n };\n }\n else {\n var dx1 = p2.x - p3.x;\n var dx2 = p4.x - p3.x;\n var dy1 = p2.y - p3.y;\n var dy2 = p4.y - p3.y;\n var denominator = dx1 * dy2 - dx2 * dy1;\n var a13 = (dx3 * dy2 - dx2 * dy3) / denominator;\n var a23 = (dx1 * dy3 - dx3 * dy1) / denominator;\n return {\n a11: p2.x - p1.x + a13 * p2.x,\n a12: p2.y - p1.y + a13 * p2.y,\n a13: a13,\n a21: p4.x - p1.x + a23 * p4.x,\n a22: p4.y - p1.y + a23 * p4.y,\n a23: a23,\n a31: p1.x,\n a32: p1.y,\n a33: 1,\n };\n }\n}\nfunction quadrilateralToSquare(p1, p2, p3, p4) {\n // Here, the adjoint serves as the inverse:\n var sToQ = squareToQuadrilateral(p1, p2, p3, p4);\n return {\n a11: sToQ.a22 * sToQ.a33 - sToQ.a23 * sToQ.a32,\n a12: sToQ.a13 * sToQ.a32 - sToQ.a12 * sToQ.a33,\n a13: sToQ.a12 * sToQ.a23 - sToQ.a13 * sToQ.a22,\n a21: sToQ.a23 * sToQ.a31 - sToQ.a21 * sToQ.a33,\n a22: sToQ.a11 * sToQ.a33 - sToQ.a13 * sToQ.a31,\n a23: sToQ.a13 * sToQ.a21 - sToQ.a11 * sToQ.a23,\n a31: sToQ.a21 * sToQ.a32 - sToQ.a22 * sToQ.a31,\n a32: sToQ.a12 * sToQ.a31 - sToQ.a11 * sToQ.a32,\n a33: sToQ.a11 * sToQ.a22 - sToQ.a12 * sToQ.a21,\n };\n}\nfunction times(a, b) {\n return {\n a11: a.a11 * b.a11 + a.a21 * b.a12 + a.a31 * b.a13,\n a12: a.a12 * b.a11 + a.a22 * b.a12 + a.a32 * b.a13,\n a13: a.a13 * b.a11 + a.a23 * b.a12 + a.a33 * b.a13,\n a21: a.a11 * b.a21 + a.a21 * b.a22 + a.a31 * b.a23,\n a22: a.a12 * b.a21 + a.a22 * b.a22 + a.a32 * b.a23,\n a23: a.a13 * b.a21 + a.a23 * b.a22 + a.a33 * b.a23,\n a31: a.a11 * b.a31 + a.a21 * b.a32 + a.a31 * b.a33,\n a32: a.a12 * b.a31 + a.a22 * b.a32 + a.a32 * b.a33,\n a33: a.a13 * b.a31 + a.a23 * b.a32 + a.a33 * b.a33,\n };\n}\nfunction extract(image, location) {\n var qToS = quadrilateralToSquare({ x: 3.5, y: 3.5 }, { x: location.dimension - 3.5, y: 3.5 }, { x: location.dimension - 6.5, y: location.dimension - 6.5 }, { x: 3.5, y: location.dimension - 3.5 });\n var sToQ = squareToQuadrilateral(location.topLeft, location.topRight, location.alignmentPattern, location.bottomLeft);\n var transform = times(sToQ, qToS);\n var matrix = BitMatrix_1.BitMatrix.createEmpty(location.dimension, location.dimension);\n var mappingFunction = function (x, y) {\n var denominator = transform.a13 * x + transform.a23 * y + transform.a33;\n return {\n x: (transform.a11 * x + transform.a21 * y + transform.a31) / denominator,\n y: (transform.a12 * x + transform.a22 * y + transform.a32) / denominator,\n };\n };\n for (var y = 0; y < location.dimension; y++) {\n for (var x = 0; x < location.dimension; x++) {\n var xValue = x + 0.5;\n var yValue = y + 0.5;\n var sourcePixel = mappingFunction(xValue, yValue);\n matrix.set(x, y, image.get(Math.floor(sourcePixel.x), Math.floor(sourcePixel.y)));\n }\n }\n return {\n matrix: matrix,\n mappingFunction: mappingFunction,\n };\n}\nexports.extract = extract;\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MAX_FINDERPATTERNS_TO_SEARCH = 4;\nvar MIN_QUAD_RATIO = 0.5;\nvar MAX_QUAD_RATIO = 1.5;\nvar distance = function (a, b) { return Math.sqrt(Math.pow((b.x - a.x), 2) + Math.pow((b.y - a.y), 2)); };\nfunction sum(values) {\n return values.reduce(function (a, b) { return a + b; });\n}\n// Takes three finder patterns and organizes them into topLeft, topRight, etc\nfunction reorderFinderPatterns(pattern1, pattern2, pattern3) {\n var _a, _b, _c, _d;\n // Find distances between pattern centers\n var oneTwoDistance = distance(pattern1, pattern2);\n var twoThreeDistance = distance(pattern2, pattern3);\n var oneThreeDistance = distance(pattern1, pattern3);\n var bottomLeft;\n var topLeft;\n var topRight;\n // Assume one closest to other two is B; A and C will just be guesses at first\n if (twoThreeDistance >= oneTwoDistance && twoThreeDistance >= oneThreeDistance) {\n _a = [pattern2, pattern1, pattern3], bottomLeft = _a[0], topLeft = _a[1], topRight = _a[2];\n }\n else if (oneThreeDistance >= twoThreeDistance && oneThreeDistance >= oneTwoDistance) {\n _b = [pattern1, pattern2, pattern3], bottomLeft = _b[0], topLeft = _b[1], topRight = _b[2];\n }\n else {\n _c = [pattern1, pattern3, pattern2], bottomLeft = _c[0], topLeft = _c[1], topRight = _c[2];\n }\n // Use cross product to figure out whether bottomLeft (A) and topRight (C) are correct or flipped in relation to topLeft (B)\n // This asks whether BC x BA has a positive z component, which is the arrangement we want. If it's negative, then\n // we've got it flipped around and should swap topRight and bottomLeft.\n if (((topRight.x - topLeft.x) * (bottomLeft.y - topLeft.y)) - ((topRight.y - topLeft.y) * (bottomLeft.x - topLeft.x)) < 0) {\n _d = [topRight, bottomLeft], bottomLeft = _d[0], topRight = _d[1];\n }\n return { bottomLeft: bottomLeft, topLeft: topLeft, topRight: topRight };\n}\n// Computes the dimension (number of modules on a side) of the QR Code based on the position of the finder patterns\nfunction computeDimension(topLeft, topRight, bottomLeft, matrix) {\n var moduleSize = (sum(countBlackWhiteRun(topLeft, bottomLeft, matrix, 5)) / 7 + // Divide by 7 since the ratio is 1:1:3:1:1\n sum(countBlackWhiteRun(topLeft, topRight, matrix, 5)) / 7 +\n sum(countBlackWhiteRun(bottomLeft, topLeft, matrix, 5)) / 7 +\n sum(countBlackWhiteRun(topRight, topLeft, matrix, 5)) / 7) / 4;\n if (moduleSize < 1) {\n throw new Error(\"Invalid module size\");\n }\n var topDimension = Math.round(distance(topLeft, topRight) / moduleSize);\n var sideDimension = Math.round(distance(topLeft, bottomLeft) / moduleSize);\n var dimension = Math.floor((topDimension + sideDimension) / 2) + 7;\n switch (dimension % 4) {\n case 0:\n dimension++;\n break;\n case 2:\n dimension--;\n break;\n }\n return { dimension: dimension, moduleSize: moduleSize };\n}\n// Takes an origin point and an end point and counts the sizes of the black white run from the origin towards the end point.\n// Returns an array of elements, representing the pixel size of the black white run.\n// Uses a variant of http://en.wikipedia.org/wiki/Bresenham's_line_algorithm\nfunction countBlackWhiteRunTowardsPoint(origin, end, matrix, length) {\n var switchPoints = [{ x: Math.floor(origin.x), y: Math.floor(origin.y) }];\n var steep = Math.abs(end.y - origin.y) > Math.abs(end.x - origin.x);\n var fromX;\n var fromY;\n var toX;\n var toY;\n if (steep) {\n fromX = Math.floor(origin.y);\n fromY = Math.floor(origin.x);\n toX = Math.floor(end.y);\n toY = Math.floor(end.x);\n }\n else {\n fromX = Math.floor(origin.x);\n fromY = Math.floor(origin.y);\n toX = Math.floor(end.x);\n toY = Math.floor(end.y);\n }\n var dx = Math.abs(toX - fromX);\n var dy = Math.abs(toY - fromY);\n var error = Math.floor(-dx / 2);\n var xStep = fromX < toX ? 1 : -1;\n var yStep = fromY < toY ? 1 : -1;\n var currentPixel = true;\n // Loop up until x == toX, but not beyond\n for (var x = fromX, y = fromY; x !== toX + xStep; x += xStep) {\n // Does current pixel mean we have moved white to black or vice versa?\n // Scanning black in state 0,2 and white in state 1, so if we find the wrong\n // color, advance to next state or end if we are in state 2 already\n var realX = steep ? y : x;\n var realY = steep ? x : y;\n if (matrix.get(realX, realY) !== currentPixel) {\n currentPixel = !currentPixel;\n switchPoints.push({ x: realX, y: realY });\n if (switchPoints.length === length + 1) {\n break;\n }\n }\n error += dy;\n if (error > 0) {\n if (y === toY) {\n break;\n }\n y += yStep;\n error -= dx;\n }\n }\n var distances = [];\n for (var i = 0; i < length; i++) {\n if (switchPoints[i] && switchPoints[i + 1]) {\n distances.push(distance(switchPoints[i], switchPoints[i + 1]));\n }\n else {\n distances.push(0);\n }\n }\n return distances;\n}\n// Takes an origin point and an end point and counts the sizes of the black white run in the origin point\n// along the line that intersects with the end point. Returns an array of elements, representing the pixel sizes\n// of the black white run. Takes a length which represents the number of switches from black to white to look for.\nfunction countBlackWhiteRun(origin, end, matrix, length) {\n var _a;\n var rise = end.y - origin.y;\n var run = end.x - origin.x;\n var towardsEnd = countBlackWhiteRunTowardsPoint(origin, end, matrix, Math.ceil(length / 2));\n var awayFromEnd = countBlackWhiteRunTowardsPoint(origin, { x: origin.x - run, y: origin.y - rise }, matrix, Math.ceil(length / 2));\n var middleValue = towardsEnd.shift() + awayFromEnd.shift() - 1; // Substract one so we don't double count a pixel\n return (_a = awayFromEnd.concat(middleValue)).concat.apply(_a, towardsEnd);\n}\n// Takes in a black white run and an array of expected ratios. Returns the average size of the run as well as the \"error\" -\n// that is the amount the run diverges from the expected ratio\nfunction scoreBlackWhiteRun(sequence, ratios) {\n var averageSize = sum(sequence) / sum(ratios);\n var error = 0;\n ratios.forEach(function (ratio, i) {\n error += Math.pow((sequence[i] - ratio * averageSize), 2);\n });\n return { averageSize: averageSize, error: error };\n}\n// Takes an X,Y point and an array of sizes and scores the point against those ratios.\n// For example for a finder pattern takes the ratio list of 1:1:3:1:1 and checks horizontal, vertical and diagonal ratios\n// against that.\nfunction scorePattern(point, ratios, matrix) {\n try {\n var horizontalRun = countBlackWhiteRun(point, { x: -1, y: point.y }, matrix, ratios.length);\n var verticalRun = countBlackWhiteRun(point, { x: point.x, y: -1 }, matrix, ratios.length);\n var topLeftPoint = {\n x: Math.max(0, point.x - point.y) - 1,\n y: Math.max(0, point.y - point.x) - 1,\n };\n var topLeftBottomRightRun = countBlackWhiteRun(point, topLeftPoint, matrix, ratios.length);\n var bottomLeftPoint = {\n x: Math.min(matrix.width, point.x + point.y) + 1,\n y: Math.min(matrix.height, point.y + point.x) + 1,\n };\n var bottomLeftTopRightRun = countBlackWhiteRun(point, bottomLeftPoint, matrix, ratios.length);\n var horzError = scoreBlackWhiteRun(horizontalRun, ratios);\n var vertError = scoreBlackWhiteRun(verticalRun, ratios);\n var diagDownError = scoreBlackWhiteRun(topLeftBottomRightRun, ratios);\n var diagUpError = scoreBlackWhiteRun(bottomLeftTopRightRun, ratios);\n var ratioError = Math.sqrt(horzError.error * horzError.error +\n vertError.error * vertError.error +\n diagDownError.error * diagDownError.error +\n diagUpError.error * diagUpError.error);\n var avgSize = (horzError.averageSize + vertError.averageSize + diagDownError.averageSize + diagUpError.averageSize) / 4;\n var sizeError = (Math.pow((horzError.averageSize - avgSize), 2) +\n Math.pow((vertError.averageSize - avgSize), 2) +\n Math.pow((diagDownError.averageSize - avgSize), 2) +\n Math.pow((diagUpError.averageSize - avgSize), 2)) / avgSize;\n return ratioError + sizeError;\n }\n catch (_a) {\n return Infinity;\n }\n}\nfunction recenterLocation(matrix, p) {\n var leftX = Math.round(p.x);\n while (matrix.get(leftX, Math.round(p.y))) {\n leftX--;\n }\n var rightX = Math.round(p.x);\n while (matrix.get(rightX, Math.round(p.y))) {\n rightX++;\n }\n var x = (leftX + rightX) / 2;\n var topY = Math.round(p.y);\n while (matrix.get(Math.round(x), topY)) {\n topY--;\n }\n var bottomY = Math.round(p.y);\n while (matrix.get(Math.round(x), bottomY)) {\n bottomY++;\n }\n var y = (topY + bottomY) / 2;\n return { x: x, y: y };\n}\nfunction locate(matrix) {\n var finderPatternQuads = [];\n var activeFinderPatternQuads = [];\n var alignmentPatternQuads = [];\n var activeAlignmentPatternQuads = [];\n var _loop_1 = function (y) {\n var length_1 = 0;\n var lastBit = false;\n var scans = [0, 0, 0, 0, 0];\n var _loop_2 = function (x) {\n var v = matrix.get(x, y);\n if (v === lastBit) {\n length_1++;\n }\n else {\n scans = [scans[1], scans[2], scans[3], scans[4], length_1];\n length_1 = 1;\n lastBit = v;\n // Do the last 5 color changes ~ match the expected ratio for a finder pattern? 1:1:3:1:1 of b:w:b:w:b\n var averageFinderPatternBlocksize = sum(scans) / 7;\n var validFinderPattern = Math.abs(scans[0] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n Math.abs(scans[1] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n Math.abs(scans[2] - 3 * averageFinderPatternBlocksize) < 3 * averageFinderPatternBlocksize &&\n Math.abs(scans[3] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n Math.abs(scans[4] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n !v; // And make sure the current pixel is white since finder patterns are bordered in white\n // Do the last 3 color changes ~ match the expected ratio for an alignment pattern? 1:1:1 of w:b:w\n var averageAlignmentPatternBlocksize = sum(scans.slice(-3)) / 3;\n var validAlignmentPattern = Math.abs(scans[2] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize &&\n Math.abs(scans[3] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize &&\n Math.abs(scans[4] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize &&\n v; // Is the current pixel black since alignment patterns are bordered in black\n if (validFinderPattern) {\n // Compute the start and end x values of the large center black square\n var endX_1 = x - scans[3] - scans[4];\n var startX_1 = endX_1 - scans[2];\n var line = { startX: startX_1, endX: endX_1, y: y };\n // Is there a quad directly above the current spot? If so, extend it with the new line. Otherwise, create a new quad with\n // that line as the starting point.\n var matchingQuads = activeFinderPatternQuads.filter(function (q) {\n return (startX_1 >= q.bottom.startX && startX_1 <= q.bottom.endX) ||\n (endX_1 >= q.bottom.startX && startX_1 <= q.bottom.endX) ||\n (startX_1 <= q.bottom.startX && endX_1 >= q.bottom.endX && ((scans[2] / (q.bottom.endX - q.bottom.startX)) < MAX_QUAD_RATIO &&\n (scans[2] / (q.bottom.endX - q.bottom.startX)) > MIN_QUAD_RATIO));\n });\n if (matchingQuads.length > 0) {\n matchingQuads[0].bottom = line;\n }\n else {\n activeFinderPatternQuads.push({ top: line, bottom: line });\n }\n }\n if (validAlignmentPattern) {\n // Compute the start and end x values of the center black square\n var endX_2 = x - scans[4];\n var startX_2 = endX_2 - scans[3];\n var line = { startX: startX_2, y: y, endX: endX_2 };\n // Is there a quad directly above the current spot? If so, extend it with the new line. Otherwise, create a new quad with\n // that line as the starting point.\n var matchingQuads = activeAlignmentPatternQuads.filter(function (q) {\n return (startX_2 >= q.bottom.startX && startX_2 <= q.bottom.endX) ||\n (endX_2 >= q.bottom.startX && startX_2 <= q.bottom.endX) ||\n (startX_2 <= q.bottom.startX && endX_2 >= q.bottom.endX && ((scans[2] / (q.bottom.endX - q.bottom.startX)) < MAX_QUAD_RATIO &&\n (scans[2] / (q.bottom.endX - q.bottom.startX)) > MIN_QUAD_RATIO));\n });\n if (matchingQuads.length > 0) {\n matchingQuads[0].bottom = line;\n }\n else {\n activeAlignmentPatternQuads.push({ top: line, bottom: line });\n }\n }\n }\n };\n for (var x = -1; x <= matrix.width; x++) {\n _loop_2(x);\n }\n finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) { return q.bottom.y !== y && q.bottom.y - q.top.y >= 2; }));\n activeFinderPatternQuads = activeFinderPatternQuads.filter(function (q) { return q.bottom.y === y; });\n alignmentPatternQuads.push.apply(alignmentPatternQuads, activeAlignmentPatternQuads.filter(function (q) { return q.bottom.y !== y; }));\n activeAlignmentPatternQuads = activeAlignmentPatternQuads.filter(function (q) { return q.bottom.y === y; });\n };\n for (var y = 0; y <= matrix.height; y++) {\n _loop_1(y);\n }\n finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) { return q.bottom.y - q.top.y >= 2; }));\n alignmentPatternQuads.push.apply(alignmentPatternQuads, activeAlignmentPatternQuads);\n var finderPatternGroups = finderPatternQuads\n .filter(function (q) { return q.bottom.y - q.top.y >= 2; }) // All quads must be at least 2px tall since the center square is larger than a block\n .map(function (q) {\n var x = (q.top.startX + q.top.endX + q.bottom.startX + q.bottom.endX) / 4;\n var y = (q.top.y + q.bottom.y + 1) / 2;\n if (!matrix.get(Math.round(x), Math.round(y))) {\n return;\n }\n var lengths = [q.top.endX - q.top.startX, q.bottom.endX - q.bottom.startX, q.bottom.y - q.top.y + 1];\n var size = sum(lengths) / lengths.length;\n var score = scorePattern({ x: Math.round(x), y: Math.round(y) }, [1, 1, 3, 1, 1], matrix);\n return { score: score, x: x, y: y, size: size };\n })\n .filter(function (q) { return !!q; }) // Filter out any rejected quads from above\n .sort(function (a, b) { return a.score - b.score; })\n // Now take the top finder pattern options and try to find 2 other options with a similar size.\n .map(function (point, i, finderPatterns) {\n if (i > MAX_FINDERPATTERNS_TO_SEARCH) {\n return null;\n }\n var otherPoints = finderPatterns\n .filter(function (p, ii) { return i !== ii; })\n .map(function (p) { return ({ x: p.x, y: p.y, score: p.score + (Math.pow((p.size - point.size), 2)) / point.size, size: p.size }); })\n .sort(function (a, b) { return a.score - b.score; });\n if (otherPoints.length < 2) {\n return null;\n }\n var score = point.score + otherPoints[0].score + otherPoints[1].score;\n return { points: [point].concat(otherPoints.slice(0, 2)), score: score };\n })\n .filter(function (q) { return !!q; }) // Filter out any rejected finder patterns from above\n .sort(function (a, b) { return a.score - b.score; });\n if (finderPatternGroups.length === 0) {\n return null;\n }\n var _a = reorderFinderPatterns(finderPatternGroups[0].points[0], finderPatternGroups[0].points[1], finderPatternGroups[0].points[2]), topRight = _a.topRight, topLeft = _a.topLeft, bottomLeft = _a.bottomLeft;\n var alignment = findAlignmentPattern(matrix, alignmentPatternQuads, topRight, topLeft, bottomLeft);\n var result = [];\n if (alignment) {\n result.push({\n alignmentPattern: { x: alignment.alignmentPattern.x, y: alignment.alignmentPattern.y },\n bottomLeft: { x: bottomLeft.x, y: bottomLeft.y },\n dimension: alignment.dimension,\n topLeft: { x: topLeft.x, y: topLeft.y },\n topRight: { x: topRight.x, y: topRight.y },\n });\n }\n // We normally use the center of the quads as the location of the tracking points, which is optimal for most cases and will account\n // for a skew in the image. However, In some cases, a slight skew might not be real and instead be caused by image compression\n // errors and/or low resolution. For those cases, we'd be better off centering the point exactly in the middle of the black area. We\n // compute and return the location data for the naively centered points as it is little additional work and allows for multiple\n // attempts at decoding harder images.\n var midTopRight = recenterLocation(matrix, topRight);\n var midTopLeft = recenterLocation(matrix, topLeft);\n var midBottomLeft = recenterLocation(matrix, bottomLeft);\n var centeredAlignment = findAlignmentPattern(matrix, alignmentPatternQuads, midTopRight, midTopLeft, midBottomLeft);\n if (centeredAlignment) {\n result.push({\n alignmentPattern: { x: centeredAlignment.alignmentPattern.x, y: centeredAlignment.alignmentPattern.y },\n bottomLeft: { x: midBottomLeft.x, y: midBottomLeft.y },\n topLeft: { x: midTopLeft.x, y: midTopLeft.y },\n topRight: { x: midTopRight.x, y: midTopRight.y },\n dimension: centeredAlignment.dimension,\n });\n }\n if (result.length === 0) {\n return null;\n }\n return result;\n}\nexports.locate = locate;\nfunction findAlignmentPattern(matrix, alignmentPatternQuads, topRight, topLeft, bottomLeft) {\n var _a;\n // Now that we've found the three finder patterns we can determine the blockSize and the size of the QR code.\n // We'll use these to help find the alignment pattern but also later when we do the extraction.\n var dimension;\n var moduleSize;\n try {\n (_a = computeDimension(topLeft, topRight, bottomLeft, matrix), dimension = _a.dimension, moduleSize = _a.moduleSize);\n }\n catch (e) {\n return null;\n }\n // Now find the alignment pattern\n var bottomRightFinderPattern = {\n x: topRight.x - topLeft.x + bottomLeft.x,\n y: topRight.y - topLeft.y + bottomLeft.y,\n };\n var modulesBetweenFinderPatterns = ((distance(topLeft, bottomLeft) + distance(topLeft, topRight)) / 2 / moduleSize);\n var correctionToTopLeft = 1 - (3 / modulesBetweenFinderPatterns);\n var expectedAlignmentPattern = {\n x: topLeft.x + correctionToTopLeft * (bottomRightFinderPattern.x - topLeft.x),\n y: topLeft.y + correctionToTopLeft * (bottomRightFinderPattern.y - topLeft.y),\n };\n var alignmentPatterns = alignmentPatternQuads\n .map(function (q) {\n var x = (q.top.startX + q.top.endX + q.bottom.startX + q.bottom.endX) / 4;\n var y = (q.top.y + q.bottom.y + 1) / 2;\n if (!matrix.get(Math.floor(x), Math.floor(y))) {\n return;\n }\n var lengths = [q.top.endX - q.top.startX, q.bottom.endX - q.bottom.startX, (q.bottom.y - q.top.y + 1)];\n var size = sum(lengths) / lengths.length;\n var sizeScore = scorePattern({ x: Math.floor(x), y: Math.floor(y) }, [1, 1, 1], matrix);\n var score = sizeScore + distance({ x: x, y: y }, expectedAlignmentPattern);\n return { x: x, y: y, score: score };\n })\n .filter(function (v) { return !!v; })\n .sort(function (a, b) { return a.score - b.score; });\n // If there are less than 15 modules between finder patterns it's a version 1 QR code and as such has no alignmemnt pattern\n // so we can only use our best guess.\n var alignmentPattern = modulesBetweenFinderPatterns >= 15 && alignmentPatterns.length ? alignmentPatterns[0] : expectedAlignmentPattern;\n return { alignmentPattern: alignmentPattern, dimension: dimension };\n}\n\n\n/***/ })\n/******/ ])[\"default\"];\n});","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","/**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\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\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types.\nvar REACT_ELEMENT_TYPE = Symbol.for('react.element');\nvar REACT_PORTAL_TYPE = Symbol.for('react.portal');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\nvar REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');\nvar REACT_PROFILER_TYPE = Symbol.for('react.profiler');\nvar REACT_PROVIDER_TYPE = Symbol.for('react.provider');\nvar REACT_CONTEXT_TYPE = Symbol.for('react.context');\nvar REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');\nvar REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');\nvar REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');\nvar REACT_MEMO_TYPE = Symbol.for('react.memo');\nvar REACT_LAZY_TYPE = Symbol.for('react.lazy');\nvar REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nfunction error(format) {\n {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n } // eslint-disable-next-line react-internal/safe-string-coercion\n\n\n var argsWithFormat = args.map(function (item) {\n return String(item);\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\n// -----------------------------------------------------------------------------\n\nvar enableScopeAPI = false; // Experimental Create Event Handle API.\nvar enableCacheElement = false;\nvar enableTransitionTracing = false; // No known bugs, but needs performance testing\n\nvar enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber\n// stuff. Intended to enable React core members to more easily debug scheduling\n// issues in DEV builds.\n\nvar enableDebugTracing = false; // Track which Fiber(s) schedule render work.\n\nvar REACT_MODULE_REFERENCE;\n\n{\n REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');\n}\n\nfunction isValidElementType(type) {\n if (typeof type === 'string' || typeof type === 'function') {\n return true;\n } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).\n\n\n if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing ) {\n return true;\n }\n\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || // This needs to include all possible module reference object\n // types supported by any Flight configuration anywhere since\n // we don't know which Flight build this will end up being used\n // with.\n type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var displayName = outerType.displayName;\n\n if (displayName) {\n return displayName;\n }\n\n var functionName = innerType.displayName || innerType.name || '';\n return functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName;\n} // Keep in sync with react-reconciler/getComponentNameFromFiber\n\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.\n\n\nfunction getComponentNameFromType(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n var outerName = type.displayName || null;\n\n if (outerName !== null) {\n return outerName;\n }\n\n return getComponentNameFromType(type.type) || 'Memo';\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentNameFromType(init(payload));\n } catch (x) {\n return null;\n }\n }\n\n // eslint-disable-next-line no-fallthrough\n }\n }\n\n return null;\n}\n\nvar assign = Object.assign;\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: assign({}, props, {\n value: prevLog\n }),\n info: assign({}, props, {\n value: prevInfo\n }),\n warn: assign({}, props, {\n value: prevWarn\n }),\n error: assign({}, props, {\n value: prevError\n }),\n group: assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if ( !fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled \"\"\n // but we have a user-provided \"displayName\"\n // splice it in to make the stack more readable.\n\n\n if (fn.displayName && _frame.includes('')) {\n _frame = _frame.replace('', fn.displayName);\n }\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar loggedTypeFailures = {};\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame.setExtraStackFrame(null);\n }\n }\n}\n\nfunction checkPropTypes(typeSpecs, values, location, componentName, element) {\n {\n // $FlowFixMe This is okay but Flow doesn't know it.\n var has = Function.call.bind(hasOwnProperty);\n\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n // eslint-disable-next-line react-internal/prod-error-codes\n var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');\n err.name = 'Invariant Violation';\n throw err;\n }\n\n error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');\n } catch (ex) {\n error$1 = ex;\n }\n\n if (error$1 && !(error$1 instanceof Error)) {\n setCurrentlyValidatingElement(element);\n\n error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);\n\n setCurrentlyValidatingElement(null);\n }\n\n if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error$1.message] = true;\n setCurrentlyValidatingElement(element);\n\n error('Failed %s type: %s', location, error$1.message);\n\n setCurrentlyValidatingElement(null);\n }\n }\n }\n }\n}\n\nvar isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare\n\nfunction isArray(a) {\n return isArrayImpl(a);\n}\n\n/*\n * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol\n * and Temporal.* types. See https://github.com/facebook/react/pull/22064.\n *\n * The functions in this module will throw an easier-to-understand,\n * easier-to-debug exception with a clear errors message message explaining the\n * problem. (Instead of a confusing exception thrown inside the implementation\n * of the `value` object).\n */\n// $FlowFixMe only called in DEV, so void return is not possible.\nfunction typeName(value) {\n {\n // toStringTag is needed for namespaced types like Temporal.Instant\n var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;\n var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';\n return type;\n }\n} // $FlowFixMe only called in DEV, so void return is not possible.\n\n\nfunction willCoercionThrow(value) {\n {\n try {\n testStringCoercion(value);\n return false;\n } catch (e) {\n return true;\n }\n }\n}\n\nfunction testStringCoercion(value) {\n // If you ended up here by following an exception call stack, here's what's\n // happened: you supplied an object or symbol value to React (as a prop, key,\n // DOM attribute, CSS property, string ref, etc.) and when React tried to\n // coerce it to a string using `'' + value`, an exception was thrown.\n //\n // The most common types that will cause this exception are `Symbol` instances\n // and Temporal objects like `Temporal.Instant`. But any object that has a\n // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this\n // exception. (Library authors do this to prevent users from using built-in\n // numeric operators like `+` or comparison operators like `>=` because custom\n // methods are needed to perform accurate arithmetic or comparison.)\n //\n // To fix the problem, coerce this object or symbol value to a string before\n // passing it to React. The most reliable way is usually `String(value)`.\n //\n // To find which value is throwing, check the browser or debugger console.\n // Before this exception was thrown, there should be `console.error` output\n // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the\n // problem and how that type was used: key, atrribute, input value prop, etc.\n // In most cases, this console output also shows the component and its\n // ancestor components where the exception happened.\n //\n // eslint-disable-next-line react-internal/safe-string-coercion\n return '' + value;\n}\nfunction checkKeyStringCoercion(value) {\n {\n if (willCoercionThrow(value)) {\n error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));\n\n return testStringCoercion(value); // throw (to help callers find troubleshooting comments)\n }\n }\n}\n\nvar ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\nvar didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config, self) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) {\n var componentName = getComponentNameFromType(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n }\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName);\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * https://github.com/reactjs/rfcs/pull/107\n * @param {*} type\n * @param {object} props\n * @param {string} key\n */\n\nfunction jsxDEV(type, config, maybeKey, source, self) {\n {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null; // Currently, key can be spread in as a prop. This causes a potential\n // issue if key is also explicitly declared (ie.
\n // or
). We want to deprecate key spread,\n // but as an intermediary step, we will use jsxDEV for everything except\n //
, because we aren't currently able to tell if\n // key is explicitly declared to be undefined or not.\n\n if (maybeKey !== undefined) {\n {\n checkKeyStringCoercion(maybeKey);\n }\n\n key = '' + maybeKey;\n }\n\n if (hasValidKey(config)) {\n {\n checkKeyStringCoercion(config.key);\n }\n\n key = '' + config.key;\n }\n\n if (hasValidRef(config)) {\n ref = config.ref;\n warnIfStringRefCannotBeAutoConverted(config, self);\n } // Remaining properties are added to a new props object\n\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n }\n}\n\nvar ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\nfunction setCurrentlyValidatingElement$1(element) {\n {\n if (element) {\n var owner = element._owner;\n var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);\n ReactDebugCurrentFrame$1.setExtraStackFrame(stack);\n } else {\n ReactDebugCurrentFrame$1.setExtraStackFrame(null);\n }\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\n\nfunction isValidElement(object) {\n {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n }\n}\n\nfunction getDeclarationErrorAddendum() {\n {\n if (ReactCurrentOwner$1.current) {\n var name = getComponentNameFromType(ReactCurrentOwner$1.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n }\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n }\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n }\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentNameFromType(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement$1(element);\n\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner);\n\n setCurrentlyValidatingElement$1(null);\n }\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n {\n if (typeof node !== 'object') {\n return;\n }\n\n if (isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n // Intentionally inside to avoid triggering lazy initializers:\n var name = getComponentNameFromType(type);\n checkPropTypes(propTypes, element.props, 'prop', name, element);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers:\n\n var _name = getComponentNameFromType(type);\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n setCurrentlyValidatingElement$1(null);\n break;\n }\n }\n\n if (fragment.ref !== null) {\n setCurrentlyValidatingElement$1(fragment);\n\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n\n setCurrentlyValidatingElement$1(null);\n }\n }\n}\n\nvar didWarnAboutKeySpread = {};\nfunction jsxWithValidation(type, props, key, isStaticChildren, source, self) {\n {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(source);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentNameFromType(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n\n var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n var children = props.children;\n\n if (children !== undefined) {\n if (isStaticChildren) {\n if (isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n validateChildKeys(children[i], type);\n }\n\n if (Object.freeze) {\n Object.freeze(children);\n }\n } else {\n error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.');\n }\n } else {\n validateChildKeys(children, type);\n }\n }\n }\n\n {\n if (hasOwnProperty.call(props, 'key')) {\n var componentName = getComponentNameFromType(type);\n var keys = Object.keys(props).filter(function (k) {\n return k !== 'key';\n });\n var beforeExample = keys.length > 0 ? '{key: someKey, ' + keys.join(': ..., ') + ': ...}' : '{key: someKey}';\n\n if (!didWarnAboutKeySpread[componentName + beforeExample]) {\n var afterExample = keys.length > 0 ? '{' + keys.join(': ..., ') + ': ...}' : '{}';\n\n error('A props object containing a \"key\" prop is being spread into JSX:\\n' + ' let props = %s;\\n' + ' <%s {...props} />\\n' + 'React keys must be passed directly to JSX without using spread:\\n' + ' let props = %s;\\n' + ' <%s key={someKey} {...props} />', beforeExample, componentName, afterExample, componentName);\n\n didWarnAboutKeySpread[componentName + beforeExample] = true;\n }\n }\n }\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n }\n} // These two functions exist to still get child warnings in dev\n\nvar jsxDEV$1 = jsxWithValidation ;\n\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsxDEV = jsxDEV$1;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-dev-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-dev-runtime.development.js');\n}\n","module.exports = QRCode;","module.exports = React;","module.exports = ReactDOM;","module.exports = ReactIntl;","module.exports = tinode;","import { Component, ComponentContainer } from '@firebase/component';\nimport { Logger, setUserLogHandler, setLogLevel as setLogLevel$1 } from '@firebase/logger';\nimport { ErrorFactory, base64Decode, getDefaultAppConfig, deepEqual, isBrowser, isWebWorker, FirebaseError, base64urlEncodeWithoutPadding, isIndexedDBAvailable, validateIndexedDBOpenable } from '@firebase/util';\nexport { FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nclass PlatformLoggerServiceImpl {\n constructor(container) {\n this.container = container;\n }\n // In initial implementation, this will be called by installations on\n // auth token refresh, and installations will send this string.\n getPlatformInfoString() {\n const providers = this.container.getProviders();\n // Loop through providers and get library/version pairs from any that are\n // version components.\n return providers\n .map(provider => {\n if (isVersionServiceProvider(provider)) {\n const service = provider.getImmediate();\n return `${service.library}/${service.version}`;\n }\n else {\n return null;\n }\n })\n .filter(logString => logString)\n .join(' ');\n }\n}\n/**\n *\n * @param provider check if this provider provides a VersionService\n *\n * NOTE: Using Provider<'app-version'> is a hack to indicate that the provider\n * provides VersionService. The provider is not necessarily a 'app-version'\n * provider.\n */\nfunction isVersionServiceProvider(provider) {\n const component = provider.getComponent();\n return component?.type === \"VERSION\" /* ComponentType.VERSION */;\n}\n\nconst name$q = \"@firebase/app\";\nconst version$1 = \"0.15.0\";\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst logger = new Logger('@firebase/app');\n\nconst name$p = \"@firebase/app-compat\";\n\nconst name$o = \"@firebase/analytics-compat\";\n\nconst name$n = \"@firebase/analytics\";\n\nconst name$m = \"@firebase/app-check-compat\";\n\nconst name$l = \"@firebase/app-check\";\n\nconst name$k = \"@firebase/auth\";\n\nconst name$j = \"@firebase/auth-compat\";\n\nconst name$i = \"@firebase/database\";\n\nconst name$h = \"@firebase/data-connect\";\n\nconst name$g = \"@firebase/database-compat\";\n\nconst name$f = \"@firebase/functions\";\n\nconst name$e = \"@firebase/functions-compat\";\n\nconst name$d = \"@firebase/installations\";\n\nconst name$c = \"@firebase/installations-compat\";\n\nconst name$b = \"@firebase/messaging\";\n\nconst name$a = \"@firebase/messaging-compat\";\n\nconst name$9 = \"@firebase/performance\";\n\nconst name$8 = \"@firebase/performance-compat\";\n\nconst name$7 = \"@firebase/remote-config\";\n\nconst name$6 = \"@firebase/remote-config-compat\";\n\nconst name$5 = \"@firebase/storage\";\n\nconst name$4 = \"@firebase/storage-compat\";\n\nconst name$3 = \"@firebase/firestore\";\n\nconst name$2 = \"@firebase/ai\";\n\nconst name$1 = \"@firebase/firestore-compat\";\n\nconst name = \"firebase\";\nconst version = \"12.15.0\";\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The default app name\n *\n * @internal\n */\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\nconst PLATFORM_LOG_STRING = {\n [name$q]: 'fire-core',\n [name$p]: 'fire-core-compat',\n [name$n]: 'fire-analytics',\n [name$o]: 'fire-analytics-compat',\n [name$l]: 'fire-app-check',\n [name$m]: 'fire-app-check-compat',\n [name$k]: 'fire-auth',\n [name$j]: 'fire-auth-compat',\n [name$i]: 'fire-rtdb',\n [name$h]: 'fire-data-connect',\n [name$g]: 'fire-rtdb-compat',\n [name$f]: 'fire-fn',\n [name$e]: 'fire-fn-compat',\n [name$d]: 'fire-iid',\n [name$c]: 'fire-iid-compat',\n [name$b]: 'fire-fcm',\n [name$a]: 'fire-fcm-compat',\n [name$9]: 'fire-perf',\n [name$8]: 'fire-perf-compat',\n [name$7]: 'fire-rc',\n [name$6]: 'fire-rc-compat',\n [name$5]: 'fire-gcs',\n [name$4]: 'fire-gcs-compat',\n [name$3]: 'fire-fst',\n [name$1]: 'fire-fst-compat',\n [name$2]: 'fire-vertex',\n 'fire-js': 'fire-js', // Platform identifier for JS SDK.\n [name]: 'fire-js-all'\n};\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @internal\n */\nconst _apps = new Map();\n/**\n * @internal\n */\nconst _serverApps = new Map();\n/**\n * Registered components.\n *\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _components = new Map();\n/**\n * @param component - the component being added to this app's container\n *\n * @internal\n */\nfunction _addComponent(app, component) {\n try {\n app.container.addComponent(component);\n }\n catch (e) {\n logger.debug(`Component ${component.name} failed to register with FirebaseApp ${app.name}`, e);\n }\n}\n/**\n *\n * @internal\n */\nfunction _addOrOverwriteComponent(app, component) {\n app.container.addOrOverwriteComponent(component);\n}\n/**\n *\n * @param component - the component to register\n * @returns whether or not the component is registered successfully\n *\n * @internal\n */\nfunction _registerComponent(component) {\n const componentName = component.name;\n if (_components.has(componentName)) {\n logger.debug(`There were multiple attempts to register component ${componentName}.`);\n return false;\n }\n _components.set(componentName, component);\n // add the component to existing app instances\n for (const app of _apps.values()) {\n _addComponent(app, component);\n }\n for (const serverApp of _serverApps.values()) {\n _addComponent(serverApp, component);\n }\n return true;\n}\n/**\n *\n * @param app - FirebaseApp instance\n * @param name - service name\n *\n * @returns the provider for the service with the matching name\n *\n * @internal\n */\nfunction _getProvider(app, name) {\n const heartbeatController = app.container\n .getProvider('heartbeat')\n .getImmediate({ optional: true });\n if (heartbeatController) {\n void heartbeatController.triggerHeartbeat();\n }\n return app.container.getProvider(name);\n}\n/**\n *\n * @param app - FirebaseApp instance\n * @param name - service name\n * @param instanceIdentifier - service instance identifier in case the service supports multiple instances\n *\n * @internal\n */\nfunction _removeServiceInstance(app, name, instanceIdentifier = DEFAULT_ENTRY_NAME) {\n _getProvider(app, name).clearInstance(instanceIdentifier);\n}\n/**\n *\n * @param obj - an object of type FirebaseApp, FirebaseOptions or FirebaseAppSettings.\n *\n * @returns true if the provide object is of type FirebaseApp.\n *\n * @internal\n */\nfunction _isFirebaseApp(obj) {\n return obj.options !== undefined;\n}\n/**\n *\n * @param obj - an object of type FirebaseApp, FirebaseOptions or FirebaseAppSettings.\n *\n * @returns true if the provided object is of type FirebaseServerAppImpl.\n *\n * @internal\n */\nfunction _isFirebaseServerAppSettings(obj) {\n if (_isFirebaseApp(obj)) {\n return false;\n }\n return ('authIdToken' in obj ||\n 'appCheckToken' in obj ||\n 'releaseOnDeref' in obj ||\n 'automaticDataCollectionEnabled' in obj);\n}\n/**\n *\n * @param obj - an object of type FirebaseApp.\n *\n * @returns true if the provided object is of type FirebaseServerAppImpl.\n *\n * @internal\n */\nfunction _isFirebaseServerApp(obj) {\n if (obj === null || obj === undefined) {\n return false;\n }\n return obj.settings !== undefined;\n}\n/**\n * Test only\n *\n * @internal\n */\nfunction _clearComponents() {\n _components.clear();\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst ERRORS = {\n [\"no-app\" /* AppError.NO_APP */]: \"No Firebase App '{$appName}' has been created - \" +\n 'call initializeApp() first',\n [\"bad-app-name\" /* AppError.BAD_APP_NAME */]: \"Illegal App name: '{$appName}'\",\n [\"duplicate-app\" /* AppError.DUPLICATE_APP */]: \"Firebase App named '{$appName}' already exists with different options or config\",\n [\"app-deleted\" /* AppError.APP_DELETED */]: \"Firebase App named '{$appName}' already deleted\",\n [\"server-app-deleted\" /* AppError.SERVER_APP_DELETED */]: 'Firebase Server App has been deleted',\n [\"no-options\" /* AppError.NO_OPTIONS */]: 'Need to provide options, when not being deployed to hosting via source.',\n [\"invalid-app-argument\" /* AppError.INVALID_APP_ARGUMENT */]: 'firebase.{$appName}() takes either no argument or a ' +\n 'Firebase App instance.',\n [\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */]: 'First argument to `onLog` must be null or a function.',\n [\"idb-open\" /* AppError.IDB_OPEN */]: 'Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.',\n [\"idb-get\" /* AppError.IDB_GET */]: 'Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.',\n [\"idb-set\" /* AppError.IDB_WRITE */]: 'Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.',\n [\"idb-delete\" /* AppError.IDB_DELETE */]: 'Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.',\n [\"finalization-registry-not-supported\" /* AppError.FINALIZATION_REGISTRY_NOT_SUPPORTED */]: 'FirebaseServerApp deleteOnDeref field defined but the JS runtime does not support FinalizationRegistry.',\n [\"invalid-server-app-environment\" /* AppError.INVALID_SERVER_APP_ENVIRONMENT */]: 'FirebaseServerApp is not for use in browser environments.'\n};\nconst ERROR_FACTORY = new ErrorFactory('app', 'Firebase', ERRORS);\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nclass FirebaseAppImpl {\n constructor(options, config, container) {\n this._isDeleted = false;\n this._options = { ...options };\n this._config = { ...config };\n this._name = config.name;\n this._automaticDataCollectionEnabled =\n config.automaticDataCollectionEnabled;\n this._container = container;\n this.container.addComponent(new Component('app', () => this, \"PUBLIC\" /* ComponentType.PUBLIC */));\n }\n get automaticDataCollectionEnabled() {\n this.checkDestroyed();\n return this._automaticDataCollectionEnabled;\n }\n set automaticDataCollectionEnabled(val) {\n this.checkDestroyed();\n this._automaticDataCollectionEnabled = val;\n }\n get name() {\n this.checkDestroyed();\n return this._name;\n }\n get options() {\n this.checkDestroyed();\n return this._options;\n }\n get config() {\n this.checkDestroyed();\n return this._config;\n }\n get container() {\n return this._container;\n }\n get isDeleted() {\n return this._isDeleted;\n }\n set isDeleted(val) {\n this._isDeleted = val;\n }\n /**\n * This function will throw an Error if the App has already been deleted -\n * use before performing API actions on the App.\n */\n checkDestroyed() {\n if (this.isDeleted) {\n throw ERROR_FACTORY.create(\"app-deleted\" /* AppError.APP_DELETED */, { appName: this._name });\n }\n }\n}\n\n/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// Parse the token and check to see if the `exp` claim is in the future.\n// Reports an error to the console if the token or claim could not be parsed, or if `exp` is in\n// the past.\nfunction validateTokenTTL(base64Token, tokenName) {\n const secondPart = base64Decode(base64Token.split('.')[1]);\n if (secondPart === null) {\n console.error(`FirebaseServerApp ${tokenName} is invalid: second part could not be parsed.`);\n return;\n }\n const expClaim = JSON.parse(secondPart).exp;\n if (expClaim === undefined) {\n console.error(`FirebaseServerApp ${tokenName} is invalid: expiration claim could not be parsed`);\n return;\n }\n const exp = JSON.parse(secondPart).exp * 1000;\n const now = new Date().getTime();\n const diff = exp - now;\n if (diff <= 0) {\n console.error(`FirebaseServerApp ${tokenName} is invalid: the token has expired.`);\n }\n}\nclass FirebaseServerAppImpl extends FirebaseAppImpl {\n constructor(options, serverConfig, name, container) {\n // Build configuration parameters for the FirebaseAppImpl base class.\n const automaticDataCollectionEnabled = serverConfig.automaticDataCollectionEnabled !== undefined\n ? serverConfig.automaticDataCollectionEnabled\n : true;\n // Create the FirebaseAppSettings object for the FirebaseAppImp constructor.\n const config = {\n name,\n automaticDataCollectionEnabled\n };\n if (options.apiKey !== undefined) {\n // Construct the parent FirebaseAppImp object.\n super(options, config, container);\n }\n else {\n const appImpl = options;\n super(appImpl.options, config, container);\n }\n // Now construct the data for the FirebaseServerAppImpl.\n this._serverConfig = {\n automaticDataCollectionEnabled,\n ...serverConfig\n };\n // Ensure that the current time is within the `authIdtoken` window of validity.\n if (this._serverConfig.authIdToken) {\n validateTokenTTL(this._serverConfig.authIdToken, 'authIdToken');\n }\n // Ensure that the current time is within the `appCheckToken` window of validity.\n if (this._serverConfig.appCheckToken) {\n validateTokenTTL(this._serverConfig.appCheckToken, 'appCheckToken');\n }\n this._finalizationRegistry = null;\n if (typeof FinalizationRegistry !== 'undefined') {\n this._finalizationRegistry = new FinalizationRegistry(() => {\n this.automaticCleanup();\n });\n }\n this._refCount = 0;\n this.incRefCount(this._serverConfig.releaseOnDeref);\n // Do not retain a hard reference to the dref object, otherwise the FinalizationRegistry\n // will never trigger.\n this._serverConfig.releaseOnDeref = undefined;\n serverConfig.releaseOnDeref = undefined;\n registerVersion(name$q, version$1, 'serverapp');\n }\n toJSON() {\n return undefined;\n }\n get refCount() {\n return this._refCount;\n }\n // Increment the reference count of this server app. If an object is provided, register it\n // with the finalization registry.\n incRefCount(obj) {\n if (this.isDeleted) {\n return;\n }\n this._refCount++;\n if (obj !== undefined && this._finalizationRegistry !== null) {\n this._finalizationRegistry.register(obj, this);\n }\n }\n // Decrement the reference count.\n decRefCount() {\n if (this.isDeleted) {\n return 0;\n }\n return --this._refCount;\n }\n // Invoked by the FinalizationRegistry callback to note that this app should go through its\n // reference counts and delete itself if no reference count remain. The coordinating logic that\n // handles this is in deleteApp(...).\n automaticCleanup() {\n void deleteApp(this);\n }\n get settings() {\n this.checkDestroyed();\n return this._serverConfig;\n }\n /**\n * This function will throw an Error if the App has already been deleted -\n * use before performing API actions on the App.\n */\n checkDestroyed() {\n if (this.isDeleted) {\n throw ERROR_FACTORY.create(\"server-app-deleted\" /* AppError.SERVER_APP_DELETED */);\n }\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * The current SDK version.\n *\n * @public\n */\nconst SDK_VERSION = version;\nfunction initializeApp(_options, rawConfig = {}) {\n let options = _options;\n if (typeof rawConfig !== 'object') {\n const name = rawConfig;\n rawConfig = { name };\n }\n const config = {\n name: DEFAULT_ENTRY_NAME,\n automaticDataCollectionEnabled: true,\n ...rawConfig\n };\n const name = config.name;\n if (typeof name !== 'string' || !name) {\n throw ERROR_FACTORY.create(\"bad-app-name\" /* AppError.BAD_APP_NAME */, {\n appName: String(name)\n });\n }\n options || (options = getDefaultAppConfig());\n if (!options) {\n throw ERROR_FACTORY.create(\"no-options\" /* AppError.NO_OPTIONS */);\n }\n const existingApp = _apps.get(name);\n if (existingApp) {\n // return the existing app if options and config deep equal the ones in the existing app.\n if (deepEqual(options, existingApp.options) &&\n deepEqual(config, existingApp.config)) {\n return existingApp;\n }\n else {\n throw ERROR_FACTORY.create(\"duplicate-app\" /* AppError.DUPLICATE_APP */, { appName: name });\n }\n }\n const container = new ComponentContainer(name);\n for (const component of _components.values()) {\n container.addComponent(component);\n }\n const newApp = new FirebaseAppImpl(options, config, container);\n _apps.set(name, newApp);\n return newApp;\n}\nfunction initializeServerApp(_options, _serverAppConfig = {}) {\n if (isBrowser() && !isWebWorker()) {\n // FirebaseServerApp isn't designed to be run in browsers.\n throw ERROR_FACTORY.create(\"invalid-server-app-environment\" /* AppError.INVALID_SERVER_APP_ENVIRONMENT */);\n }\n let firebaseOptions;\n let serverAppSettings = _serverAppConfig || {};\n if (_options) {\n if (_isFirebaseApp(_options)) {\n firebaseOptions = _options.options;\n }\n else if (_isFirebaseServerAppSettings(_options)) {\n serverAppSettings = _options;\n }\n else {\n firebaseOptions = _options;\n }\n }\n if (serverAppSettings.automaticDataCollectionEnabled === undefined) {\n serverAppSettings.automaticDataCollectionEnabled = true;\n }\n firebaseOptions || (firebaseOptions = getDefaultAppConfig());\n if (!firebaseOptions) {\n throw ERROR_FACTORY.create(\"no-options\" /* AppError.NO_OPTIONS */);\n }\n // Build an app name based on a hash of the configuration options.\n const nameObj = {\n ...serverAppSettings,\n ...firebaseOptions\n };\n // However, Do not mangle the name based on releaseOnDeref, since it will vary between the\n // construction of FirebaseServerApp instances. For example, if the object is the request headers.\n if (nameObj.releaseOnDeref !== undefined) {\n delete nameObj.releaseOnDeref;\n }\n const hashCode = (s) => {\n return [...s].reduce((hash, c) => (Math.imul(31, hash) + c.charCodeAt(0)) | 0, 0);\n };\n if (serverAppSettings.releaseOnDeref !== undefined) {\n if (typeof FinalizationRegistry === 'undefined') {\n throw ERROR_FACTORY.create(\"finalization-registry-not-supported\" /* AppError.FINALIZATION_REGISTRY_NOT_SUPPORTED */, {});\n }\n }\n const nameString = '' + hashCode(JSON.stringify(nameObj));\n const existingApp = _serverApps.get(nameString);\n if (existingApp) {\n existingApp.incRefCount(serverAppSettings.releaseOnDeref);\n return existingApp;\n }\n const container = new ComponentContainer(nameString);\n for (const component of _components.values()) {\n container.addComponent(component);\n }\n const newApp = new FirebaseServerAppImpl(firebaseOptions, serverAppSettings, nameString, container);\n _serverApps.set(nameString, newApp);\n return newApp;\n}\n/**\n * Retrieves a {@link @firebase/app#FirebaseApp} instance.\n *\n * When called with no arguments, the default app is returned. When an app name\n * is provided, the app corresponding to that name is returned.\n *\n * An exception is thrown if the app being retrieved has not yet been\n * initialized.\n *\n * @example\n * ```javascript\n * // Return the default app\n * const app = getApp();\n * ```\n *\n * @example\n * ```javascript\n * // Return a named app\n * const otherApp = getApp(\"otherApp\");\n * ```\n *\n * @param name - Optional name of the app to return. If no name is\n * provided, the default is `\"[DEFAULT]\"`.\n *\n * @returns The app corresponding to the provided app name.\n * If no app name is provided, the default app is returned.\n *\n * @public\n */\nfunction getApp(name = DEFAULT_ENTRY_NAME) {\n const app = _apps.get(name);\n if (!app && name === DEFAULT_ENTRY_NAME && getDefaultAppConfig()) {\n return initializeApp();\n }\n if (!app) {\n throw ERROR_FACTORY.create(\"no-app\" /* AppError.NO_APP */, { appName: name });\n }\n return app;\n}\n/**\n * A (read-only) array of all initialized apps.\n * @public\n */\nfunction getApps() {\n return Array.from(_apps.values());\n}\n/**\n * Renders this app unusable and frees the resources of all associated\n * services.\n *\n * @example\n * ```javascript\n * deleteApp(app)\n * .then(function() {\n * console.log(\"App deleted successfully\");\n * })\n * .catch(function(error) {\n * console.log(\"Error deleting app:\", error);\n * });\n * ```\n *\n * @public\n */\nasync function deleteApp(app) {\n let cleanupProviders = false;\n const name = app.name;\n if (_apps.has(name)) {\n cleanupProviders = true;\n _apps.delete(name);\n }\n else if (_serverApps.has(name)) {\n const firebaseServerApp = app;\n if (firebaseServerApp.decRefCount() <= 0) {\n _serverApps.delete(name);\n cleanupProviders = true;\n }\n }\n if (cleanupProviders) {\n await Promise.all(app.container\n .getProviders()\n .map(provider => provider.delete()));\n app.isDeleted = true;\n }\n}\n/**\n * Registers a library's name and version for platform logging purposes.\n * @param library - Name of 1p or 3p library (e.g. firestore, angularfire)\n * @param version - Current version of that library.\n * @param variant - Bundle variant, e.g., node, rn, etc.\n *\n * @public\n */\nfunction registerVersion(libraryKeyOrName, version, variant) {\n // TODO: We can use this check to whitelist strings when/if we set up\n // a good whitelist system.\n let library = PLATFORM_LOG_STRING[libraryKeyOrName] ?? libraryKeyOrName;\n if (variant) {\n library += `-${variant}`;\n }\n const libraryMismatch = library.match(/\\s|\\//);\n const versionMismatch = version.match(/\\s|\\//);\n if (libraryMismatch || versionMismatch) {\n const warning = [\n `Unable to register library \"${library}\" with version \"${version}\":`\n ];\n if (libraryMismatch) {\n warning.push(`library name \"${library}\" contains illegal characters (whitespace or \"/\")`);\n }\n if (libraryMismatch && versionMismatch) {\n warning.push('and');\n }\n if (versionMismatch) {\n warning.push(`version name \"${version}\" contains illegal characters (whitespace or \"/\")`);\n }\n logger.warn(warning.join(' '));\n return;\n }\n _registerComponent(new Component(`${library}-version`, () => ({ library, version }), \"VERSION\" /* ComponentType.VERSION */));\n}\n/**\n * Sets log handler for all Firebase SDKs.\n * @param logCallback - An optional custom log handler that executes user code whenever\n * the Firebase SDK makes a logging call.\n *\n * @public\n */\nfunction onLog(logCallback, options) {\n if (logCallback !== null && typeof logCallback !== 'function') {\n throw ERROR_FACTORY.create(\"invalid-log-argument\" /* AppError.INVALID_LOG_ARGUMENT */);\n }\n setUserLogHandler(logCallback, options);\n}\n/**\n * Sets log level for all Firebase SDKs.\n *\n * All of the log types above the current log level are captured (i.e. if\n * you set the log level to `info`, errors are logged, but `debug` and\n * `verbose` logs are not).\n *\n * @public\n */\nfunction setLogLevel(logLevel) {\n setLogLevel$1(logLevel);\n}\n\n/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst DB_NAME = 'firebase-heartbeat-database';\nconst DB_VERSION = 1;\nconst STORE_NAME = 'firebase-heartbeat-store';\nlet dbPromise = null;\nfunction getDbPromise() {\n if (!dbPromise) {\n dbPromise = openDB(DB_NAME, DB_VERSION, {\n upgrade: (db, oldVersion) => {\n // We don't use 'break' in this switch statement, the fall-through\n // behavior is what we want, because if there are multiple versions between\n // the old version and the current version, we want ALL the migrations\n // that correspond to those versions to run, not only the last one.\n // eslint-disable-next-line default-case\n switch (oldVersion) {\n case 0:\n try {\n db.createObjectStore(STORE_NAME);\n }\n catch (e) {\n // Safari/iOS browsers throw occasional exceptions on\n // db.createObjectStore() that may be a bug. Avoid blocking\n // the rest of the app functionality.\n console.warn(e);\n }\n }\n }\n }).catch(e => {\n throw ERROR_FACTORY.create(\"idb-open\" /* AppError.IDB_OPEN */, {\n originalErrorMessage: e.message\n });\n });\n }\n return dbPromise;\n}\nasync function readHeartbeatsFromIndexedDB(app) {\n try {\n const db = await getDbPromise();\n const tx = db.transaction(STORE_NAME);\n const result = await tx.objectStore(STORE_NAME).get(computeKey(app));\n // We already have the value but tx.done can throw,\n // so we need to await it here to catch errors\n await tx.done;\n return result;\n }\n catch (e) {\n if (e instanceof FirebaseError) {\n logger.warn(e.message);\n }\n else {\n const idbGetError = ERROR_FACTORY.create(\"idb-get\" /* AppError.IDB_GET */, {\n originalErrorMessage: e?.message\n });\n logger.warn(idbGetError.message);\n }\n }\n}\nasync function writeHeartbeatsToIndexedDB(app, heartbeatObject) {\n try {\n const db = await getDbPromise();\n const tx = db.transaction(STORE_NAME, 'readwrite');\n const objectStore = tx.objectStore(STORE_NAME);\n await objectStore.put(heartbeatObject, computeKey(app));\n await tx.done;\n }\n catch (e) {\n if (e instanceof FirebaseError) {\n logger.warn(e.message);\n }\n else {\n const idbGetError = ERROR_FACTORY.create(\"idb-set\" /* AppError.IDB_WRITE */, {\n originalErrorMessage: e?.message\n });\n logger.warn(idbGetError.message);\n }\n }\n}\nfunction computeKey(app) {\n return `${app.name}!${app.options.appId}`;\n}\n\n/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst MAX_HEADER_BYTES = 1024;\nconst MAX_NUM_STORED_HEARTBEATS = 30;\nclass HeartbeatServiceImpl {\n constructor(container) {\n this.container = container;\n /**\n * In-memory cache for heartbeats, used by getHeartbeatsHeader() to generate\n * the header string.\n * Stores one record per date. This will be consolidated into the standard\n * format of one record per user agent string before being sent as a header.\n * Populated from indexedDB when the controller is instantiated and should\n * be kept in sync with indexedDB.\n * Leave public for easier testing.\n */\n this._heartbeatsCache = null;\n const app = this.container.getProvider('app').getImmediate();\n this._storage = new HeartbeatStorageImpl(app);\n this._heartbeatsCachePromise = this._storage.read().then(result => {\n this._heartbeatsCache = result;\n return result;\n });\n }\n /**\n * Called to report a heartbeat. The function will generate\n * a HeartbeatsByUserAgent object, update heartbeatsCache, and persist it\n * to IndexedDB.\n * Note that we only store one heartbeat per day. So if a heartbeat for today is\n * already logged, subsequent calls to this function in the same day will be ignored.\n */\n async triggerHeartbeat() {\n try {\n const platformLogger = this.container\n .getProvider('platform-logger')\n .getImmediate();\n // This is the \"Firebase user agent\" string from the platform logger\n // service, not the browser user agent.\n const agent = platformLogger.getPlatformInfoString();\n const date = getUTCDateString();\n if (this._heartbeatsCache?.heartbeats == null) {\n this._heartbeatsCache = await this._heartbeatsCachePromise;\n // If we failed to construct a heartbeats cache, then return immediately.\n if (this._heartbeatsCache?.heartbeats == null) {\n return;\n }\n }\n // Do not store a heartbeat if one is already stored for this day\n // or if a header has already been sent today.\n if (this._heartbeatsCache.lastSentHeartbeatDate === date ||\n this._heartbeatsCache.heartbeats.some(singleDateHeartbeat => singleDateHeartbeat.date === date)) {\n return;\n }\n else {\n // There is no entry for this date. Create one.\n this._heartbeatsCache.heartbeats.push({ date, agent });\n // If the number of stored heartbeats exceeds the maximum number of stored heartbeats, remove the heartbeat with the earliest date.\n // Since this is executed each time a heartbeat is pushed, the limit can only be exceeded by one, so only one needs to be removed.\n if (this._heartbeatsCache.heartbeats.length > MAX_NUM_STORED_HEARTBEATS) {\n const earliestHeartbeatIdx = getEarliestHeartbeatIdx(this._heartbeatsCache.heartbeats);\n this._heartbeatsCache.heartbeats.splice(earliestHeartbeatIdx, 1);\n }\n }\n return this._storage.overwrite(this._heartbeatsCache);\n }\n catch (e) {\n logger.warn(e);\n }\n }\n /**\n * Returns a base64 encoded string which can be attached to the heartbeat-specific header directly.\n * It also clears all heartbeats from memory as well as in IndexedDB.\n *\n * NOTE: Consuming product SDKs should not send the header if this method\n * returns an empty string.\n */\n async getHeartbeatsHeader() {\n try {\n if (this._heartbeatsCache === null) {\n await this._heartbeatsCachePromise;\n }\n // If it's still null or the array is empty, there is no data to send.\n if (this._heartbeatsCache?.heartbeats == null ||\n this._heartbeatsCache.heartbeats.length === 0) {\n return '';\n }\n const date = getUTCDateString();\n // Extract as many heartbeats from the cache as will fit under the size limit.\n const { heartbeatsToSend, unsentEntries } = extractHeartbeatsForHeader(this._heartbeatsCache.heartbeats);\n const headerString = base64urlEncodeWithoutPadding(JSON.stringify({ version: 2, heartbeats: heartbeatsToSend }));\n // Store last sent date to prevent another being logged/sent for the same day.\n this._heartbeatsCache.lastSentHeartbeatDate = date;\n if (unsentEntries.length > 0) {\n // Store any unsent entries if they exist.\n this._heartbeatsCache.heartbeats = unsentEntries;\n // This seems more likely than emptying the array (below) to lead to some odd state\n // since the cache isn't empty and this will be called again on the next request,\n // and is probably safest if we await it.\n await this._storage.overwrite(this._heartbeatsCache);\n }\n else {\n this._heartbeatsCache.heartbeats = [];\n // Do not wait for this, to reduce latency.\n void this._storage.overwrite(this._heartbeatsCache);\n }\n return headerString;\n }\n catch (e) {\n logger.warn(e);\n return '';\n }\n }\n}\nfunction getUTCDateString() {\n const today = new Date();\n // Returns date format 'YYYY-MM-DD'\n return today.toISOString().substring(0, 10);\n}\nfunction extractHeartbeatsForHeader(heartbeatsCache, maxSize = MAX_HEADER_BYTES) {\n // Heartbeats grouped by user agent in the standard format to be sent in\n // the header.\n const heartbeatsToSend = [];\n // Single date format heartbeats that are not sent.\n let unsentEntries = heartbeatsCache.slice();\n for (const singleDateHeartbeat of heartbeatsCache) {\n // Look for an existing entry with the same user agent.\n const heartbeatEntry = heartbeatsToSend.find(hb => hb.agent === singleDateHeartbeat.agent);\n if (!heartbeatEntry) {\n // If no entry for this user agent exists, create one.\n heartbeatsToSend.push({\n agent: singleDateHeartbeat.agent,\n dates: [singleDateHeartbeat.date]\n });\n if (countBytes(heartbeatsToSend) > maxSize) {\n // If the header would exceed max size, remove the added heartbeat\n // entry and stop adding to the header.\n heartbeatsToSend.pop();\n break;\n }\n }\n else {\n heartbeatEntry.dates.push(singleDateHeartbeat.date);\n // If the header would exceed max size, remove the added date\n // and stop adding to the header.\n if (countBytes(heartbeatsToSend) > maxSize) {\n heartbeatEntry.dates.pop();\n break;\n }\n }\n // Pop unsent entry from queue. (Skipped if adding the entry exceeded\n // quota and the loop breaks early.)\n unsentEntries = unsentEntries.slice(1);\n }\n return {\n heartbeatsToSend,\n unsentEntries\n };\n}\nclass HeartbeatStorageImpl {\n constructor(app) {\n this.app = app;\n this._canUseIndexedDBPromise = this.runIndexedDBEnvironmentCheck();\n }\n async runIndexedDBEnvironmentCheck() {\n if (!isIndexedDBAvailable()) {\n return false;\n }\n else {\n return validateIndexedDBOpenable()\n .then(() => true)\n .catch(() => false);\n }\n }\n /**\n * Read all heartbeats.\n */\n async read() {\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\n if (!canUseIndexedDB) {\n return { heartbeats: [] };\n }\n else {\n const idbHeartbeatObject = await readHeartbeatsFromIndexedDB(this.app);\n if (idbHeartbeatObject?.heartbeats) {\n return idbHeartbeatObject;\n }\n else {\n return { heartbeats: [] };\n }\n }\n }\n // overwrite the storage with the provided heartbeats\n async overwrite(heartbeatsObject) {\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\n if (!canUseIndexedDB) {\n return;\n }\n else {\n const existingHeartbeatsObject = await this.read();\n return writeHeartbeatsToIndexedDB(this.app, {\n lastSentHeartbeatDate: heartbeatsObject.lastSentHeartbeatDate ??\n existingHeartbeatsObject.lastSentHeartbeatDate,\n heartbeats: heartbeatsObject.heartbeats\n });\n }\n }\n // add heartbeats\n async add(heartbeatsObject) {\n const canUseIndexedDB = await this._canUseIndexedDBPromise;\n if (!canUseIndexedDB) {\n return;\n }\n else {\n const existingHeartbeatsObject = await this.read();\n return writeHeartbeatsToIndexedDB(this.app, {\n lastSentHeartbeatDate: heartbeatsObject.lastSentHeartbeatDate ??\n existingHeartbeatsObject.lastSentHeartbeatDate,\n heartbeats: [\n ...existingHeartbeatsObject.heartbeats,\n ...heartbeatsObject.heartbeats\n ]\n });\n }\n }\n}\n/**\n * Calculate bytes of a HeartbeatsByUserAgent array after being wrapped\n * in a platform logging header JSON object, stringified, and converted\n * to base 64.\n */\nfunction countBytes(heartbeatsCache) {\n // base64 has a restricted set of characters, all of which should be 1 byte.\n return base64urlEncodeWithoutPadding(\n // heartbeatsCache wrapper properties\n JSON.stringify({ version: 2, heartbeats: heartbeatsCache })).length;\n}\n/**\n * Returns the index of the heartbeat with the earliest date.\n * If the heartbeats array is empty, -1 is returned.\n */\nfunction getEarliestHeartbeatIdx(heartbeats) {\n if (heartbeats.length === 0) {\n return -1;\n }\n let earliestHeartbeatIdx = 0;\n let earliestHeartbeatDate = heartbeats[0].date;\n for (let i = 1; i < heartbeats.length; i++) {\n if (heartbeats[i].date < earliestHeartbeatDate) {\n earliestHeartbeatDate = heartbeats[i].date;\n earliestHeartbeatIdx = i;\n }\n }\n return earliestHeartbeatIdx;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction registerCoreComponents(variant) {\n _registerComponent(new Component('platform-logger', container => new PlatformLoggerServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\n _registerComponent(new Component('heartbeat', container => new HeartbeatServiceImpl(container), \"PRIVATE\" /* ComponentType.PRIVATE */));\n // Register `app` package.\n registerVersion(name$q, version$1, variant);\n // BUILD_TARGET will be replaced by values like esm, cjs, etc during the compilation\n registerVersion(name$q, version$1, 'esm2020');\n // Register platform SDK identifier (no version).\n registerVersion('fire-js', '');\n}\n\n/**\n * Firebase App\n *\n * @remarks This package coordinates the communication between the different Firebase components\n * @packageDocumentation\n */\nregisterCoreComponents('');\n\nexport { SDK_VERSION, DEFAULT_ENTRY_NAME as _DEFAULT_ENTRY_NAME, _addComponent, _addOrOverwriteComponent, _apps, _clearComponents, _components, _getProvider, _isFirebaseApp, _isFirebaseServerApp, _isFirebaseServerAppSettings, _registerComponent, _removeServiceInstance, _serverApps, deleteApp, getApp, getApps, initializeApp, initializeServerApp, onLog, registerVersion, setLogLevel };\n//# sourceMappingURL=index.esm.js.map\n","import { Deferred } from '@firebase/util';\n\n/**\n * Component for service name T, e.g. `auth`, `auth-internal`\n */\nclass Component {\n /**\n *\n * @param name The public service name, e.g. app, auth, firestore, database\n * @param instanceFactory Service factory responsible for creating the public interface\n * @param type whether the service provided by the component is public or private\n */\n constructor(name, instanceFactory, type) {\n this.name = name;\n this.instanceFactory = instanceFactory;\n this.type = type;\n this.multipleInstances = false;\n /**\n * Properties to be added to the service namespace\n */\n this.serviceProps = {};\n this.instantiationMode = \"LAZY\" /* InstantiationMode.LAZY */;\n this.onInstanceCreated = null;\n }\n setInstantiationMode(mode) {\n this.instantiationMode = mode;\n return this;\n }\n setMultipleInstances(multipleInstances) {\n this.multipleInstances = multipleInstances;\n return this;\n }\n setServiceProps(props) {\n this.serviceProps = props;\n return this;\n }\n setInstanceCreatedCallback(callback) {\n this.onInstanceCreated = callback;\n return this;\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst DEFAULT_ENTRY_NAME = '[DEFAULT]';\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Provider for instance for service name T, e.g. 'auth', 'auth-internal'\n * NameServiceMapping[T] is an alias for the type of the instance\n */\nclass Provider {\n constructor(name, container) {\n this.name = name;\n this.container = container;\n this.component = null;\n this.instances = new Map();\n this.instancesDeferred = new Map();\n this.instancesOptions = new Map();\n this.onInitCallbacks = new Map();\n }\n /**\n * @param identifier A provider can provide multiple instances of a service\n * if this.component.multipleInstances is true.\n */\n get(identifier) {\n // if multipleInstances is not supported, use the default name\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\n if (!this.instancesDeferred.has(normalizedIdentifier)) {\n const deferred = new Deferred();\n this.instancesDeferred.set(normalizedIdentifier, deferred);\n if (this.isInitialized(normalizedIdentifier) ||\n this.shouldAutoInitialize()) {\n // initialize the service if it can be auto-initialized\n try {\n const instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n });\n if (instance) {\n deferred.resolve(instance);\n }\n }\n catch (e) {\n // when the instance factory throws an exception during get(), it should not cause\n // a fatal error. We just return the unresolved promise in this case.\n }\n }\n }\n return this.instancesDeferred.get(normalizedIdentifier).promise;\n }\n getImmediate(options) {\n // if multipleInstances is not supported, use the default name\n const normalizedIdentifier = this.normalizeInstanceIdentifier(options?.identifier);\n const optional = options?.optional ?? false;\n if (this.isInitialized(normalizedIdentifier) ||\n this.shouldAutoInitialize()) {\n try {\n return this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n });\n }\n catch (e) {\n if (optional) {\n return null;\n }\n else {\n throw e;\n }\n }\n }\n else {\n // In case a component is not initialized and should/cannot be auto-initialized at the moment, return null if the optional flag is set, or throw\n if (optional) {\n return null;\n }\n else {\n throw Error(`Service ${this.name} is not available`);\n }\n }\n }\n getComponent() {\n return this.component;\n }\n setComponent(component) {\n if (component.name !== this.name) {\n throw Error(`Mismatching Component ${component.name} for Provider ${this.name}.`);\n }\n if (this.component) {\n throw Error(`Component for ${this.name} has already been provided`);\n }\n this.component = component;\n // return early without attempting to initialize the component if the component requires explicit initialization (calling `Provider.initialize()`)\n if (!this.shouldAutoInitialize()) {\n return;\n }\n // if the service is eager, initialize the default instance\n if (isComponentEager(component)) {\n try {\n this.getOrInitializeService({ instanceIdentifier: DEFAULT_ENTRY_NAME });\n }\n catch (e) {\n // when the instance factory for an eager Component throws an exception during the eager\n // initialization, it should not cause a fatal error.\n // TODO: Investigate if we need to make it configurable, because some component may want to cause\n // a fatal error in this case?\n }\n }\n // Create service instances for the pending promises and resolve them\n // NOTE: if this.multipleInstances is false, only the default instance will be created\n // and all promises with resolve with it regardless of the identifier.\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\n const normalizedIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\n try {\n // `getOrInitializeService()` should always return a valid instance since a component is guaranteed. use ! to make typescript happy.\n const instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier\n });\n instanceDeferred.resolve(instance);\n }\n catch (e) {\n // when the instance factory throws an exception, it should not cause\n // a fatal error. We just leave the promise unresolved.\n }\n }\n }\n clearInstance(identifier = DEFAULT_ENTRY_NAME) {\n this.instancesDeferred.delete(identifier);\n this.instancesOptions.delete(identifier);\n this.instances.delete(identifier);\n }\n // app.delete() will call this method on every provider to delete the services\n // TODO: should we mark the provider as deleted?\n async delete() {\n const services = Array.from(this.instances.values());\n await Promise.all([\n ...services\n .filter(service => 'INTERNAL' in service) // legacy services\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map(service => service.INTERNAL.delete()),\n ...services\n .filter(service => '_delete' in service) // modularized services\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map(service => service._delete())\n ]);\n }\n isComponentSet() {\n return this.component != null;\n }\n isInitialized(identifier = DEFAULT_ENTRY_NAME) {\n return this.instances.has(identifier);\n }\n getOptions(identifier = DEFAULT_ENTRY_NAME) {\n return this.instancesOptions.get(identifier) || {};\n }\n initialize(opts = {}) {\n const { options = {} } = opts;\n const normalizedIdentifier = this.normalizeInstanceIdentifier(opts.instanceIdentifier);\n if (this.isInitialized(normalizedIdentifier)) {\n throw Error(`${this.name}(${normalizedIdentifier}) has already been initialized`);\n }\n if (!this.isComponentSet()) {\n throw Error(`Component ${this.name} has not been registered yet`);\n }\n const instance = this.getOrInitializeService({\n instanceIdentifier: normalizedIdentifier,\n options\n });\n // resolve any pending promise waiting for the service instance\n for (const [instanceIdentifier, instanceDeferred] of this.instancesDeferred.entries()) {\n const normalizedDeferredIdentifier = this.normalizeInstanceIdentifier(instanceIdentifier);\n if (normalizedIdentifier === normalizedDeferredIdentifier) {\n instanceDeferred.resolve(instance);\n }\n }\n return instance;\n }\n /**\n *\n * @param callback - a function that will be invoked after the provider has been initialized by calling provider.initialize().\n * The function is invoked SYNCHRONOUSLY, so it should not execute any longrunning tasks in order to not block the program.\n *\n * @param identifier An optional instance identifier\n * @returns a function to unregister the callback\n */\n onInit(callback, identifier) {\n const normalizedIdentifier = this.normalizeInstanceIdentifier(identifier);\n const existingCallbacks = this.onInitCallbacks.get(normalizedIdentifier) ??\n new Set();\n existingCallbacks.add(callback);\n this.onInitCallbacks.set(normalizedIdentifier, existingCallbacks);\n const existingInstance = this.instances.get(normalizedIdentifier);\n if (existingInstance) {\n callback(existingInstance, normalizedIdentifier);\n }\n return () => {\n existingCallbacks.delete(callback);\n };\n }\n /**\n * Invoke onInit callbacks synchronously\n * @param instance the service instance`\n */\n invokeOnInitCallbacks(instance, identifier) {\n const callbacks = this.onInitCallbacks.get(identifier);\n if (!callbacks) {\n return;\n }\n for (const callback of callbacks) {\n try {\n callback(instance, identifier);\n }\n catch {\n // ignore errors in the onInit callback\n }\n }\n }\n getOrInitializeService({ instanceIdentifier, options = {} }) {\n let instance = this.instances.get(instanceIdentifier);\n if (!instance && this.component) {\n instance = this.component.instanceFactory(this.container, {\n instanceIdentifier: normalizeIdentifierForFactory(instanceIdentifier),\n options\n });\n this.instances.set(instanceIdentifier, instance);\n this.instancesOptions.set(instanceIdentifier, options);\n /**\n * Invoke onInit listeners.\n * Note this.component.onInstanceCreated is different, which is used by the component creator,\n * while onInit listeners are registered by consumers of the provider.\n */\n this.invokeOnInitCallbacks(instance, instanceIdentifier);\n /**\n * Order is important\n * onInstanceCreated() should be called after this.instances.set(instanceIdentifier, instance); which\n * makes `isInitialized()` return true.\n */\n if (this.component.onInstanceCreated) {\n try {\n this.component.onInstanceCreated(this.container, instanceIdentifier, instance);\n }\n catch {\n // ignore errors in the onInstanceCreatedCallback\n }\n }\n }\n return instance || null;\n }\n normalizeInstanceIdentifier(identifier = DEFAULT_ENTRY_NAME) {\n if (this.component) {\n return this.component.multipleInstances ? identifier : DEFAULT_ENTRY_NAME;\n }\n else {\n return identifier; // assume multiple instances are supported before the component is provided.\n }\n }\n shouldAutoInitialize() {\n return (!!this.component &&\n this.component.instantiationMode !== \"EXPLICIT\" /* InstantiationMode.EXPLICIT */);\n }\n}\n// undefined should be passed to the service factory for the default instance\nfunction normalizeIdentifierForFactory(identifier) {\n return identifier === DEFAULT_ENTRY_NAME ? undefined : identifier;\n}\nfunction isComponentEager(component) {\n return component.instantiationMode === \"EAGER\" /* InstantiationMode.EAGER */;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * ComponentContainer that provides Providers for service name T, e.g. `auth`, `auth-internal`\n */\nclass ComponentContainer {\n constructor(name) {\n this.name = name;\n this.providers = new Map();\n }\n /**\n *\n * @param component Component being added\n * @param overwrite When a component with the same name has already been registered,\n * if overwrite is true: overwrite the existing component with the new component and create a new\n * provider with the new component. It can be useful in tests where you want to use different mocks\n * for different tests.\n * if overwrite is false: throw an exception\n */\n addComponent(component) {\n const provider = this.getProvider(component.name);\n if (provider.isComponentSet()) {\n throw new Error(`Component ${component.name} has already been registered with ${this.name}`);\n }\n provider.setComponent(component);\n }\n addOrOverwriteComponent(component) {\n const provider = this.getProvider(component.name);\n if (provider.isComponentSet()) {\n // delete the existing provider from the container, so we can register the new component\n this.providers.delete(component.name);\n }\n this.addComponent(component);\n }\n /**\n * getProvider provides a type safe interface where it can only be called with a field name\n * present in NameServiceMapping interface.\n *\n * Firebase SDKs providing services should extend NameServiceMapping interface to register\n * themselves.\n */\n getProvider(name) {\n if (this.providers.has(name)) {\n return this.providers.get(name);\n }\n // create a Provider for a service that hasn't registered with Firebase\n const provider = new Provider(name, this);\n this.providers.set(name, provider);\n return provider;\n }\n getProviders() {\n return Array.from(this.providers.values());\n }\n}\n\nexport { Component, ComponentContainer, Provider };\n//# sourceMappingURL=index.esm.js.map\n","import { _getProvider, getApp, _registerComponent, registerVersion } from '@firebase/app';\nimport { Component } from '@firebase/component';\nimport { ErrorFactory, FirebaseError } from '@firebase/util';\nimport { openDB } from 'idb';\n\nconst name = \"@firebase/installations\";\nconst version = \"0.6.22\";\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst PENDING_TIMEOUT_MS = 10000;\nconst PACKAGE_VERSION = `w:${version}`;\nconst INTERNAL_AUTH_VERSION = 'FIS_v2';\nconst INSTALLATIONS_API_URL = 'https://firebaseinstallations.googleapis.com/v1';\nconst TOKEN_EXPIRATION_BUFFER = 60 * 60 * 1000; // One hour\nconst SERVICE = 'installations';\nconst SERVICE_NAME = 'Installations';\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst ERROR_DESCRIPTION_MAP = {\n [\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */]: 'Missing App configuration value: \"{$valueName}\"',\n [\"not-registered\" /* ErrorCode.NOT_REGISTERED */]: 'Firebase Installation is not registered.',\n [\"installation-not-found\" /* ErrorCode.INSTALLATION_NOT_FOUND */]: 'Firebase Installation not found.',\n [\"request-failed\" /* ErrorCode.REQUEST_FAILED */]: '{$requestName} request failed with error \"{$serverCode} {$serverStatus}: {$serverMessage}\"',\n [\"app-offline\" /* ErrorCode.APP_OFFLINE */]: 'Could not process request. Application offline.',\n [\"delete-pending-registration\" /* ErrorCode.DELETE_PENDING_REGISTRATION */]: \"Can't delete installation while there is a pending registration request.\"\n};\nconst ERROR_FACTORY = new ErrorFactory(SERVICE, SERVICE_NAME, ERROR_DESCRIPTION_MAP);\n/** Returns true if error is a FirebaseError that is based on an error from the server. */\nfunction isServerError(error) {\n return (error instanceof FirebaseError &&\n error.code.includes(\"request-failed\" /* ErrorCode.REQUEST_FAILED */));\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction getInstallationsEndpoint({ projectId }) {\n return `${INSTALLATIONS_API_URL}/projects/${projectId}/installations`;\n}\nfunction extractAuthTokenInfoFromResponse(response) {\n return {\n token: response.token,\n requestStatus: 2 /* RequestStatus.COMPLETED */,\n expiresIn: getExpiresInFromResponseExpiresIn(response.expiresIn),\n creationTime: Date.now()\n };\n}\nasync function getErrorFromResponse(requestName, response) {\n const responseJson = await response.json();\n const errorData = responseJson.error;\n return ERROR_FACTORY.create(\"request-failed\" /* ErrorCode.REQUEST_FAILED */, {\n requestName,\n serverCode: errorData.code,\n serverMessage: errorData.message,\n serverStatus: errorData.status\n });\n}\nfunction getHeaders({ apiKey }) {\n return new Headers({\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-goog-api-key': apiKey\n });\n}\nfunction getHeadersWithAuth(appConfig, { refreshToken }) {\n const headers = getHeaders(appConfig);\n headers.append('Authorization', getAuthorizationHeader(refreshToken));\n return headers;\n}\n/**\n * Calls the passed in fetch wrapper and returns the response.\n * If the returned response has a status of 5xx, re-runs the function once and\n * returns the response.\n */\nasync function retryIfServerError(fn) {\n const result = await fn();\n if (result.status >= 500 && result.status < 600) {\n // Internal Server Error. Retry request.\n return fn();\n }\n return result;\n}\nfunction getExpiresInFromResponseExpiresIn(responseExpiresIn) {\n // This works because the server will never respond with fractions of a second.\n return Number(responseExpiresIn.replace('s', '000'));\n}\nfunction getAuthorizationHeader(refreshToken) {\n return `${INTERNAL_AUTH_VERSION} ${refreshToken}`;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function createInstallationRequest({ appConfig, heartbeatServiceProvider }, { fid }) {\n const endpoint = getInstallationsEndpoint(appConfig);\n const headers = getHeaders(appConfig);\n // If heartbeat service exists, add the heartbeat string to the header.\n const heartbeatService = heartbeatServiceProvider.getImmediate({\n optional: true\n });\n if (heartbeatService) {\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\n if (heartbeatsHeader) {\n headers.append('x-firebase-client', heartbeatsHeader);\n }\n }\n const body = {\n fid,\n authVersion: INTERNAL_AUTH_VERSION,\n appId: appConfig.appId,\n sdkVersion: PACKAGE_VERSION\n };\n const request = {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n };\n const response = await retryIfServerError(() => fetch(endpoint, request));\n if (response.ok) {\n const responseValue = await response.json();\n const registeredInstallationEntry = {\n fid: responseValue.fid || fid,\n registrationStatus: 2 /* RequestStatus.COMPLETED */,\n refreshToken: responseValue.refreshToken,\n authToken: extractAuthTokenInfoFromResponse(responseValue.authToken)\n };\n return registeredInstallationEntry;\n }\n else {\n throw await getErrorFromResponse('Create Installation', response);\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Returns a promise that resolves after given time passes. */\nfunction sleep(ms) {\n return new Promise(resolve => {\n setTimeout(resolve, ms);\n });\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction bufferToBase64UrlSafe(array) {\n const b64 = btoa(String.fromCharCode(...array));\n return b64.replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst VALID_FID_PATTERN = /^[cdef][\\w-]{21}$/;\nconst INVALID_FID = '';\n/**\n * Generates a new FID using random values from Web Crypto API.\n * Returns an empty string if FID generation fails for any reason.\n */\nfunction generateFid() {\n try {\n // A valid FID has exactly 22 base64 characters, which is 132 bits, or 16.5\n // bytes. our implementation generates a 17 byte array instead.\n const fidByteArray = new Uint8Array(17);\n const crypto = self.crypto || self.msCrypto;\n crypto.getRandomValues(fidByteArray);\n // Replace the first 4 random bits with the constant FID header of 0b0111.\n fidByteArray[0] = 0b01110000 + (fidByteArray[0] % 0b00010000);\n const fid = encode(fidByteArray);\n return VALID_FID_PATTERN.test(fid) ? fid : INVALID_FID;\n }\n catch {\n // FID generation errored\n return INVALID_FID;\n }\n}\n/** Converts a FID Uint8Array to a base64 string representation. */\nfunction encode(fidByteArray) {\n const b64String = bufferToBase64UrlSafe(fidByteArray);\n // Remove the 23rd character that was added because of the extra 4 bits at the\n // end of our 17 byte array, and the '=' padding.\n return b64String.substr(0, 22);\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Returns a string key that can be used to identify the app. */\nfunction getKey(appConfig) {\n return `${appConfig.appName}!${appConfig.appId}`;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst fidChangeCallbacks = new Map();\n/**\n * Calls the onIdChange callbacks with the new FID value, and broadcasts the\n * change to other tabs.\n */\nfunction fidChanged(appConfig, fid) {\n const key = getKey(appConfig);\n callFidChangeCallbacks(key, fid);\n broadcastFidChange(key, fid);\n}\nfunction addCallback(appConfig, callback) {\n // Open the broadcast channel if it's not already open,\n // to be able to listen to change events from other tabs.\n getBroadcastChannel();\n const key = getKey(appConfig);\n let callbackSet = fidChangeCallbacks.get(key);\n if (!callbackSet) {\n callbackSet = new Set();\n fidChangeCallbacks.set(key, callbackSet);\n }\n callbackSet.add(callback);\n}\nfunction removeCallback(appConfig, callback) {\n const key = getKey(appConfig);\n const callbackSet = fidChangeCallbacks.get(key);\n if (!callbackSet) {\n return;\n }\n callbackSet.delete(callback);\n if (callbackSet.size === 0) {\n fidChangeCallbacks.delete(key);\n }\n // Close broadcast channel if there are no more callbacks.\n closeBroadcastChannel();\n}\nfunction callFidChangeCallbacks(key, fid) {\n const callbacks = fidChangeCallbacks.get(key);\n if (!callbacks) {\n return;\n }\n for (const callback of callbacks) {\n callback(fid);\n }\n}\nfunction broadcastFidChange(key, fid) {\n const channel = getBroadcastChannel();\n if (channel) {\n channel.postMessage({ key, fid });\n }\n closeBroadcastChannel();\n}\nlet broadcastChannel = null;\n/** Opens and returns a BroadcastChannel if it is supported by the browser. */\nfunction getBroadcastChannel() {\n if (!broadcastChannel && 'BroadcastChannel' in self) {\n broadcastChannel = new BroadcastChannel('[Firebase] FID Change');\n broadcastChannel.onmessage = e => {\n callFidChangeCallbacks(e.data.key, e.data.fid);\n };\n }\n return broadcastChannel;\n}\nfunction closeBroadcastChannel() {\n if (fidChangeCallbacks.size === 0 && broadcastChannel) {\n broadcastChannel.close();\n broadcastChannel = null;\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst DATABASE_NAME = 'firebase-installations-database';\nconst DATABASE_VERSION = 1;\nconst OBJECT_STORE_NAME = 'firebase-installations-store';\nlet dbPromise = null;\nfunction getDbPromise() {\n if (!dbPromise) {\n dbPromise = openDB(DATABASE_NAME, DATABASE_VERSION, {\n upgrade: (db, oldVersion) => {\n // We don't use 'break' in this switch statement, the fall-through\n // behavior is what we want, because if there are multiple versions between\n // the old version and the current version, we want ALL the migrations\n // that correspond to those versions to run, not only the last one.\n // eslint-disable-next-line default-case\n switch (oldVersion) {\n case 0:\n db.createObjectStore(OBJECT_STORE_NAME);\n }\n }\n });\n }\n return dbPromise;\n}\n/** Assigns or overwrites the record for the given key with the given value. */\nasync function set(appConfig, value) {\n const key = getKey(appConfig);\n const db = await getDbPromise();\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\n const objectStore = tx.objectStore(OBJECT_STORE_NAME);\n const oldValue = (await objectStore.get(key));\n await objectStore.put(value, key);\n await tx.done;\n if (!oldValue || oldValue.fid !== value.fid) {\n fidChanged(appConfig, value.fid);\n }\n return value;\n}\n/** Removes record(s) from the objectStore that match the given key. */\nasync function remove(appConfig) {\n const key = getKey(appConfig);\n const db = await getDbPromise();\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\n await tx.objectStore(OBJECT_STORE_NAME).delete(key);\n await tx.done;\n}\n/**\n * Atomically updates a record with the result of updateFn, which gets\n * called with the current value. If newValue is undefined, the record is\n * deleted instead.\n * @return Updated value\n */\nasync function update(appConfig, updateFn) {\n const key = getKey(appConfig);\n const db = await getDbPromise();\n const tx = db.transaction(OBJECT_STORE_NAME, 'readwrite');\n const store = tx.objectStore(OBJECT_STORE_NAME);\n const oldValue = (await store.get(key));\n const newValue = updateFn(oldValue);\n if (newValue === undefined) {\n await store.delete(key);\n }\n else {\n await store.put(newValue, key);\n }\n await tx.done;\n if (newValue && (!oldValue || oldValue.fid !== newValue.fid)) {\n fidChanged(appConfig, newValue.fid);\n }\n return newValue;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Updates and returns the InstallationEntry from the database.\n * Also triggers a registration request if it is necessary and possible.\n */\nasync function getInstallationEntry(installations) {\n let registrationPromise;\n const installationEntry = await update(installations.appConfig, oldEntry => {\n const installationEntry = updateOrCreateInstallationEntry(oldEntry);\n const entryWithPromise = triggerRegistrationIfNecessary(installations, installationEntry);\n registrationPromise = entryWithPromise.registrationPromise;\n return entryWithPromise.installationEntry;\n });\n if (installationEntry.fid === INVALID_FID) {\n // FID generation failed. Waiting for the FID from the server.\n return { installationEntry: await registrationPromise };\n }\n return {\n installationEntry,\n registrationPromise\n };\n}\n/**\n * Creates a new Installation Entry if one does not exist.\n * Also clears timed out pending requests.\n */\nfunction updateOrCreateInstallationEntry(oldEntry) {\n const entry = oldEntry || {\n fid: generateFid(),\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\n };\n return clearTimedOutRequest(entry);\n}\n/**\n * If the Firebase Installation is not registered yet, this will trigger the\n * registration and return an InProgressInstallationEntry.\n *\n * If registrationPromise does not exist, the installationEntry is guaranteed\n * to be registered.\n */\nfunction triggerRegistrationIfNecessary(installations, installationEntry) {\n if (installationEntry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\n if (!navigator.onLine) {\n // Registration required but app is offline.\n const registrationPromiseWithError = Promise.reject(ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */));\n return {\n installationEntry,\n registrationPromise: registrationPromiseWithError\n };\n }\n // Try registering. Change status to IN_PROGRESS.\n const inProgressEntry = {\n fid: installationEntry.fid,\n registrationStatus: 1 /* RequestStatus.IN_PROGRESS */,\n registrationTime: Date.now()\n };\n const registrationPromise = registerInstallation(installations, inProgressEntry);\n return { installationEntry: inProgressEntry, registrationPromise };\n }\n else if (installationEntry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\n return {\n installationEntry,\n registrationPromise: waitUntilFidRegistration(installations)\n };\n }\n else {\n return { installationEntry };\n }\n}\n/** This will be executed only once for each new Firebase Installation. */\nasync function registerInstallation(installations, installationEntry) {\n try {\n const registeredInstallationEntry = await createInstallationRequest(installations, installationEntry);\n return set(installations.appConfig, registeredInstallationEntry);\n }\n catch (e) {\n if (isServerError(e) && e.customData.serverCode === 409) {\n // Server returned a \"FID cannot be used\" error.\n // Generate a new ID next time.\n await remove(installations.appConfig);\n }\n else {\n // Registration failed. Set FID as not registered.\n await set(installations.appConfig, {\n fid: installationEntry.fid,\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\n });\n }\n throw e;\n }\n}\n/** Call if FID registration is pending in another request. */\nasync function waitUntilFidRegistration(installations) {\n // Unfortunately, there is no way of reliably observing when a value in\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\n // so we need to poll.\n let entry = await updateInstallationRequest(installations.appConfig);\n while (entry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\n // createInstallation request still in progress.\n await sleep(100);\n entry = await updateInstallationRequest(installations.appConfig);\n }\n if (entry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\n // The request timed out or failed in a different call. Try again.\n const { installationEntry, registrationPromise } = await getInstallationEntry(installations);\n if (registrationPromise) {\n return registrationPromise;\n }\n else {\n // if there is no registrationPromise, entry is registered.\n return installationEntry;\n }\n }\n return entry;\n}\n/**\n * Called only if there is a CreateInstallation request in progress.\n *\n * Updates the InstallationEntry in the DB based on the status of the\n * CreateInstallation request.\n *\n * Returns the updated InstallationEntry.\n */\nfunction updateInstallationRequest(appConfig) {\n return update(appConfig, oldEntry => {\n if (!oldEntry) {\n throw ERROR_FACTORY.create(\"installation-not-found\" /* ErrorCode.INSTALLATION_NOT_FOUND */);\n }\n return clearTimedOutRequest(oldEntry);\n });\n}\nfunction clearTimedOutRequest(entry) {\n if (hasInstallationRequestTimedOut(entry)) {\n return {\n fid: entry.fid,\n registrationStatus: 0 /* RequestStatus.NOT_STARTED */\n };\n }\n return entry;\n}\nfunction hasInstallationRequestTimedOut(installationEntry) {\n return (installationEntry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */ &&\n installationEntry.registrationTime + PENDING_TIMEOUT_MS < Date.now());\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function generateAuthTokenRequest({ appConfig, heartbeatServiceProvider }, installationEntry) {\n const endpoint = getGenerateAuthTokenEndpoint(appConfig, installationEntry);\n const headers = getHeadersWithAuth(appConfig, installationEntry);\n // If heartbeat service exists, add the heartbeat string to the header.\n const heartbeatService = heartbeatServiceProvider.getImmediate({\n optional: true\n });\n if (heartbeatService) {\n const heartbeatsHeader = await heartbeatService.getHeartbeatsHeader();\n if (heartbeatsHeader) {\n headers.append('x-firebase-client', heartbeatsHeader);\n }\n }\n const body = {\n installation: {\n sdkVersion: PACKAGE_VERSION,\n appId: appConfig.appId\n }\n };\n const request = {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n };\n const response = await retryIfServerError(() => fetch(endpoint, request));\n if (response.ok) {\n const responseValue = await response.json();\n const completedAuthToken = extractAuthTokenInfoFromResponse(responseValue);\n return completedAuthToken;\n }\n else {\n throw await getErrorFromResponse('Generate Auth Token', response);\n }\n}\nfunction getGenerateAuthTokenEndpoint(appConfig, { fid }) {\n return `${getInstallationsEndpoint(appConfig)}/${fid}/authTokens:generate`;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Returns a valid authentication token for the installation. Generates a new\n * token if one doesn't exist, is expired or about to expire.\n *\n * Should only be called if the Firebase Installation is registered.\n */\nasync function refreshAuthToken(installations, forceRefresh = false) {\n let tokenPromise;\n const entry = await update(installations.appConfig, oldEntry => {\n if (!isEntryRegistered(oldEntry)) {\n throw ERROR_FACTORY.create(\"not-registered\" /* ErrorCode.NOT_REGISTERED */);\n }\n const oldAuthToken = oldEntry.authToken;\n if (!forceRefresh && isAuthTokenValid(oldAuthToken)) {\n // There is a valid token in the DB.\n return oldEntry;\n }\n else if (oldAuthToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */) {\n // There already is a token request in progress.\n tokenPromise = waitUntilAuthTokenRequest(installations, forceRefresh);\n return oldEntry;\n }\n else {\n // No token or token expired.\n if (!navigator.onLine) {\n throw ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */);\n }\n const inProgressEntry = makeAuthTokenRequestInProgressEntry(oldEntry);\n tokenPromise = fetchAuthTokenFromServer(installations, inProgressEntry);\n return inProgressEntry;\n }\n });\n const authToken = tokenPromise\n ? await tokenPromise\n : entry.authToken;\n return authToken;\n}\n/**\n * Call only if FID is registered and Auth Token request is in progress.\n *\n * Waits until the current pending request finishes. If the request times out,\n * tries once in this thread as well.\n */\nasync function waitUntilAuthTokenRequest(installations, forceRefresh) {\n // Unfortunately, there is no way of reliably observing when a value in\n // IndexedDB changes (yet, see https://github.com/WICG/indexed-db-observers),\n // so we need to poll.\n let entry = await updateAuthTokenRequest(installations.appConfig);\n while (entry.authToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */) {\n // generateAuthToken still in progress.\n await sleep(100);\n entry = await updateAuthTokenRequest(installations.appConfig);\n }\n const authToken = entry.authToken;\n if (authToken.requestStatus === 0 /* RequestStatus.NOT_STARTED */) {\n // The request timed out or failed in a different call. Try again.\n return refreshAuthToken(installations, forceRefresh);\n }\n else {\n return authToken;\n }\n}\n/**\n * Called only if there is a GenerateAuthToken request in progress.\n *\n * Updates the InstallationEntry in the DB based on the status of the\n * GenerateAuthToken request.\n *\n * Returns the updated InstallationEntry.\n */\nfunction updateAuthTokenRequest(appConfig) {\n return update(appConfig, oldEntry => {\n if (!isEntryRegistered(oldEntry)) {\n throw ERROR_FACTORY.create(\"not-registered\" /* ErrorCode.NOT_REGISTERED */);\n }\n const oldAuthToken = oldEntry.authToken;\n if (hasAuthTokenRequestTimedOut(oldAuthToken)) {\n return {\n ...oldEntry,\n authToken: { requestStatus: 0 /* RequestStatus.NOT_STARTED */ }\n };\n }\n return oldEntry;\n });\n}\nasync function fetchAuthTokenFromServer(installations, installationEntry) {\n try {\n const authToken = await generateAuthTokenRequest(installations, installationEntry);\n const updatedInstallationEntry = {\n ...installationEntry,\n authToken\n };\n await set(installations.appConfig, updatedInstallationEntry);\n return authToken;\n }\n catch (e) {\n if (isServerError(e) &&\n (e.customData.serverCode === 401 || e.customData.serverCode === 404)) {\n // Server returned a \"FID not found\" or a \"Invalid authentication\" error.\n // Generate a new ID next time.\n await remove(installations.appConfig);\n }\n else {\n const updatedInstallationEntry = {\n ...installationEntry,\n authToken: { requestStatus: 0 /* RequestStatus.NOT_STARTED */ }\n };\n await set(installations.appConfig, updatedInstallationEntry);\n }\n throw e;\n }\n}\nfunction isEntryRegistered(installationEntry) {\n return (installationEntry !== undefined &&\n installationEntry.registrationStatus === 2 /* RequestStatus.COMPLETED */);\n}\nfunction isAuthTokenValid(authToken) {\n return (authToken.requestStatus === 2 /* RequestStatus.COMPLETED */ &&\n !isAuthTokenExpired(authToken));\n}\nfunction isAuthTokenExpired(authToken) {\n const now = Date.now();\n return (now < authToken.creationTime ||\n authToken.creationTime + authToken.expiresIn < now + TOKEN_EXPIRATION_BUFFER);\n}\n/** Returns an updated InstallationEntry with an InProgressAuthToken. */\nfunction makeAuthTokenRequestInProgressEntry(oldEntry) {\n const inProgressAuthToken = {\n requestStatus: 1 /* RequestStatus.IN_PROGRESS */,\n requestTime: Date.now()\n };\n return {\n ...oldEntry,\n authToken: inProgressAuthToken\n };\n}\nfunction hasAuthTokenRequestTimedOut(authToken) {\n return (authToken.requestStatus === 1 /* RequestStatus.IN_PROGRESS */ &&\n authToken.requestTime + PENDING_TIMEOUT_MS < Date.now());\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Creates a Firebase Installation if there isn't one for the app and\n * returns the Installation ID.\n * @param installations - The `Installations` instance.\n *\n * @public\n */\nasync function getId(installations) {\n const installationsImpl = installations;\n const { installationEntry, registrationPromise } = await getInstallationEntry(installationsImpl);\n if (registrationPromise) {\n registrationPromise.catch(console.error);\n }\n else {\n // If the installation is already registered, update the authentication\n // token if needed.\n refreshAuthToken(installationsImpl).catch(console.error);\n }\n return installationEntry.fid;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Returns a Firebase Installations auth token, identifying the current\n * Firebase Installation.\n * @param installations - The `Installations` instance.\n * @param forceRefresh - Force refresh regardless of token expiration.\n *\n * @public\n */\nasync function getToken(installations, forceRefresh = false) {\n const installationsImpl = installations;\n await completeInstallationRegistration(installationsImpl);\n // At this point we either have a Registered Installation in the DB, or we've\n // already thrown an error.\n const authToken = await refreshAuthToken(installationsImpl, forceRefresh);\n return authToken.token;\n}\nasync function completeInstallationRegistration(installations) {\n const { registrationPromise } = await getInstallationEntry(installations);\n if (registrationPromise) {\n // A createInstallation request is in progress. Wait until it finishes.\n await registrationPromise;\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function deleteInstallationRequest(appConfig, installationEntry) {\n const endpoint = getDeleteEndpoint(appConfig, installationEntry);\n const headers = getHeadersWithAuth(appConfig, installationEntry);\n const request = {\n method: 'DELETE',\n headers\n };\n const response = await retryIfServerError(() => fetch(endpoint, request));\n if (!response.ok) {\n throw await getErrorFromResponse('Delete Installation', response);\n }\n}\nfunction getDeleteEndpoint(appConfig, { fid }) {\n return `${getInstallationsEndpoint(appConfig)}/${fid}`;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Deletes the Firebase Installation and all associated data.\n * @param installations - The `Installations` instance.\n *\n * @public\n */\nasync function deleteInstallations(installations) {\n const { appConfig } = installations;\n const entry = await update(appConfig, oldEntry => {\n if (oldEntry && oldEntry.registrationStatus === 0 /* RequestStatus.NOT_STARTED */) {\n // Delete the unregistered entry without sending a deleteInstallation request.\n return undefined;\n }\n return oldEntry;\n });\n if (entry) {\n if (entry.registrationStatus === 1 /* RequestStatus.IN_PROGRESS */) {\n // Can't delete while trying to register.\n throw ERROR_FACTORY.create(\"delete-pending-registration\" /* ErrorCode.DELETE_PENDING_REGISTRATION */);\n }\n else if (entry.registrationStatus === 2 /* RequestStatus.COMPLETED */) {\n if (!navigator.onLine) {\n throw ERROR_FACTORY.create(\"app-offline\" /* ErrorCode.APP_OFFLINE */);\n }\n else {\n await deleteInstallationRequest(appConfig, entry);\n await remove(appConfig);\n }\n }\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Sets a new callback that will get called when Installation ID changes.\n * Returns an unsubscribe function that will remove the callback when called.\n * @param installations - The `Installations` instance.\n * @param callback - The callback function that is invoked when FID changes.\n * @returns A function that can be called to unsubscribe.\n *\n * @public\n */\nfunction onIdChange(installations, callback) {\n const { appConfig } = installations;\n addCallback(appConfig, callback);\n return () => {\n removeCallback(appConfig, callback);\n };\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Returns an instance of {@link Installations} associated with the given\n * {@link @firebase/app#FirebaseApp} instance.\n * @param app - The {@link @firebase/app#FirebaseApp} instance.\n *\n * @public\n */\nfunction getInstallations(app = getApp()) {\n const installationsImpl = _getProvider(app, 'installations').getImmediate();\n return installationsImpl;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction extractAppConfig(app) {\n if (!app || !app.options) {\n throw getMissingValueError('App Configuration');\n }\n if (!app.name) {\n throw getMissingValueError('App Name');\n }\n // Required app config keys\n const configKeys = [\n 'projectId',\n 'apiKey',\n 'appId'\n ];\n for (const keyName of configKeys) {\n if (!app.options[keyName]) {\n throw getMissingValueError(keyName);\n }\n }\n return {\n appName: app.name,\n projectId: app.options.projectId,\n apiKey: app.options.apiKey,\n appId: app.options.appId\n };\n}\nfunction getMissingValueError(valueName) {\n return ERROR_FACTORY.create(\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */, {\n valueName\n });\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst INSTALLATIONS_NAME = 'installations';\nconst INSTALLATIONS_NAME_INTERNAL = 'installations-internal';\nconst publicFactory = (container) => {\n const app = container.getProvider('app').getImmediate();\n // Throws if app isn't configured properly.\n const appConfig = extractAppConfig(app);\n const heartbeatServiceProvider = _getProvider(app, 'heartbeat');\n const installationsImpl = {\n app,\n appConfig,\n heartbeatServiceProvider,\n _delete: () => Promise.resolve()\n };\n return installationsImpl;\n};\nconst internalFactory = (container) => {\n const app = container.getProvider('app').getImmediate();\n // Internal FIS instance relies on public FIS instance.\n const installations = _getProvider(app, INSTALLATIONS_NAME).getImmediate();\n const installationsInternal = {\n getId: () => getId(installations),\n getToken: (forceRefresh) => getToken(installations, forceRefresh)\n };\n return installationsInternal;\n};\nfunction registerInstallations() {\n _registerComponent(new Component(INSTALLATIONS_NAME, publicFactory, \"PUBLIC\" /* ComponentType.PUBLIC */));\n _registerComponent(new Component(INSTALLATIONS_NAME_INTERNAL, internalFactory, \"PRIVATE\" /* ComponentType.PRIVATE */));\n}\n\n/**\n * The Firebase Installations Web SDK.\n * This SDK does not work in a Node.js environment.\n *\n * @packageDocumentation\n */\nregisterInstallations();\nregisterVersion(name, version);\n// BUILD_TARGET will be replaced by values like esm, cjs, etc during the compilation\nregisterVersion(name, version, 'esm2020');\n\nexport { deleteInstallations, getId, getInstallations, getToken, onIdChange };\n//# sourceMappingURL=index.esm.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * A container for all of the Logger instances\n */\nconst instances = [];\n/**\n * The JS SDK supports 5 log levels and also allows a user the ability to\n * silence the logs altogether.\n *\n * The order is a follows:\n * DEBUG < VERBOSE < INFO < WARN < ERROR\n *\n * All of the log types above the current log level will be captured (i.e. if\n * you set the log level to `INFO`, errors will still be logged, but `DEBUG` and\n * `VERBOSE` logs will not)\n */\nvar LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"DEBUG\"] = 0] = \"DEBUG\";\n LogLevel[LogLevel[\"VERBOSE\"] = 1] = \"VERBOSE\";\n LogLevel[LogLevel[\"INFO\"] = 2] = \"INFO\";\n LogLevel[LogLevel[\"WARN\"] = 3] = \"WARN\";\n LogLevel[LogLevel[\"ERROR\"] = 4] = \"ERROR\";\n LogLevel[LogLevel[\"SILENT\"] = 5] = \"SILENT\";\n})(LogLevel || (LogLevel = {}));\nconst levelStringToEnum = {\n 'debug': LogLevel.DEBUG,\n 'verbose': LogLevel.VERBOSE,\n 'info': LogLevel.INFO,\n 'warn': LogLevel.WARN,\n 'error': LogLevel.ERROR,\n 'silent': LogLevel.SILENT\n};\n/**\n * The default log level\n */\nconst defaultLogLevel = LogLevel.INFO;\n/**\n * By default, `console.debug` is not displayed in the developer console (in\n * chrome). To avoid forcing users to have to opt-in to these logs twice\n * (i.e. once for firebase, and once in the console), we are sending `DEBUG`\n * logs to the `console.log` function.\n */\nconst ConsoleMethod = {\n [LogLevel.DEBUG]: 'log',\n [LogLevel.VERBOSE]: 'log',\n [LogLevel.INFO]: 'info',\n [LogLevel.WARN]: 'warn',\n [LogLevel.ERROR]: 'error'\n};\n/**\n * The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR\n * messages on to their corresponding console counterparts (if the log method\n * is supported by the current log level)\n */\nconst defaultLogHandler = (instance, logType, ...args) => {\n if (logType < instance.logLevel) {\n return;\n }\n const now = new Date().toISOString();\n const method = ConsoleMethod[logType];\n if (method) {\n console[method](`[${now}] ${instance.name}:`, ...args);\n }\n else {\n throw new Error(`Attempted to log a message with an invalid logType (value: ${logType})`);\n }\n};\nclass Logger {\n /**\n * Gives you an instance of a Logger to capture messages according to\n * Firebase's logging scheme.\n *\n * @param name The name that the logs will be associated with\n */\n constructor(name) {\n this.name = name;\n /**\n * The log level of the given Logger instance.\n */\n this._logLevel = defaultLogLevel;\n /**\n * The main (internal) log handler for the Logger instance.\n * Can be set to a new function in internal package code but not by user.\n */\n this._logHandler = defaultLogHandler;\n /**\n * The optional, additional, user-defined log handler for the Logger instance.\n */\n this._userLogHandler = null;\n /**\n * Capture the current instance for later use\n */\n instances.push(this);\n }\n get logLevel() {\n return this._logLevel;\n }\n set logLevel(val) {\n if (!(val in LogLevel)) {\n throw new TypeError(`Invalid value \"${val}\" assigned to \\`logLevel\\``);\n }\n this._logLevel = val;\n }\n // Workaround for setter/getter having to be the same type.\n setLogLevel(val) {\n this._logLevel = typeof val === 'string' ? levelStringToEnum[val] : val;\n }\n get logHandler() {\n return this._logHandler;\n }\n set logHandler(val) {\n if (typeof val !== 'function') {\n throw new TypeError('Value assigned to `logHandler` must be a function');\n }\n this._logHandler = val;\n }\n get userLogHandler() {\n return this._userLogHandler;\n }\n set userLogHandler(val) {\n this._userLogHandler = val;\n }\n /**\n * The functions below are all based on the `console` interface\n */\n debug(...args) {\n this._userLogHandler && this._userLogHandler(this, LogLevel.DEBUG, ...args);\n this._logHandler(this, LogLevel.DEBUG, ...args);\n }\n log(...args) {\n this._userLogHandler &&\n this._userLogHandler(this, LogLevel.VERBOSE, ...args);\n this._logHandler(this, LogLevel.VERBOSE, ...args);\n }\n info(...args) {\n this._userLogHandler && this._userLogHandler(this, LogLevel.INFO, ...args);\n this._logHandler(this, LogLevel.INFO, ...args);\n }\n warn(...args) {\n this._userLogHandler && this._userLogHandler(this, LogLevel.WARN, ...args);\n this._logHandler(this, LogLevel.WARN, ...args);\n }\n error(...args) {\n this._userLogHandler && this._userLogHandler(this, LogLevel.ERROR, ...args);\n this._logHandler(this, LogLevel.ERROR, ...args);\n }\n}\nfunction setLogLevel(level) {\n instances.forEach(inst => {\n inst.setLogLevel(level);\n });\n}\nfunction setUserLogHandler(logCallback, options) {\n for (const instance of instances) {\n let customLogLevel = null;\n if (options && options.level) {\n customLogLevel = levelStringToEnum[options.level];\n }\n if (logCallback === null) {\n instance.userLogHandler = null;\n }\n else {\n instance.userLogHandler = (instance, level, ...args) => {\n const message = args\n .map(arg => {\n if (arg == null) {\n return null;\n }\n else if (typeof arg === 'string') {\n return arg;\n }\n else if (typeof arg === 'number' || typeof arg === 'boolean') {\n return arg.toString();\n }\n else if (arg instanceof Error) {\n return arg.message;\n }\n else {\n try {\n return JSON.stringify(arg);\n }\n catch (ignored) {\n return null;\n }\n }\n })\n .filter(arg => arg)\n .join(' ');\n if (level >= (customLogLevel ?? instance.logLevel)) {\n logCallback({\n level: LogLevel[level].toLowerCase(),\n message,\n args,\n type: instance.name\n });\n }\n };\n }\n }\n}\n\nexport { LogLevel, Logger, setLogLevel, setUserLogHandler };\n//# sourceMappingURL=index.esm.js.map\n","import { onIdChange } from '@firebase/installations';\nimport { Component } from '@firebase/component';\nimport { openDB, deleteDB } from 'idb';\nimport { ErrorFactory, validateIndexedDBOpenable, isIndexedDBAvailable, areCookiesEnabled, getModularInstance } from '@firebase/util';\nimport { _registerComponent, registerVersion, _getProvider, getApp } from '@firebase/app';\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst DEFAULT_SW_PATH = '/firebase-messaging-sw.js';\nconst DEFAULT_SW_SCOPE = '/firebase-cloud-messaging-push-scope';\nconst DEFAULT_VAPID_KEY = 'BDOU99-h67HcA6JeFXHbSNMu7e2yNNu3RzoMj8TM4W88jITfq7ZmPvIM1Iv-4_l2LxQcYwhqby2xGpWwzjfAnG4';\nconst ENDPOINT = 'https://fcmregistrations.googleapis.com/v1';\nconst CONSOLE_CAMPAIGN_ID = 'google.c.a.c_id';\nconst CONSOLE_CAMPAIGN_NAME = 'google.c.a.c_l';\nconst CONSOLE_CAMPAIGN_TIME = 'google.c.a.ts';\n/** Set to '1' if Analytics is enabled for the campaign */\nconst CONSOLE_CAMPAIGN_ANALYTICS_ENABLED = 'google.c.a.e';\nconst DEFAULT_REGISTRATION_TIMEOUT = 10000;\nvar MessageType$1;\n(function (MessageType) {\n MessageType[MessageType[\"DATA_MESSAGE\"] = 1] = \"DATA_MESSAGE\";\n MessageType[MessageType[\"DISPLAY_NOTIFICATION\"] = 3] = \"DISPLAY_NOTIFICATION\";\n})(MessageType$1 || (MessageType$1 = {}));\n\n/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except\n * in compliance with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under the License\n * is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\n * or implied. See the License for the specific language governing permissions and limitations under\n * the License.\n */\nvar MessageType;\n(function (MessageType) {\n MessageType[\"PUSH_RECEIVED\"] = \"push-received\";\n MessageType[\"NOTIFICATION_CLICKED\"] = \"notification-clicked\";\n MessageType[\"FID_REGISTERED\"] = \"fid-registered\";\n})(MessageType || (MessageType = {}));\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction arrayToBase64(array) {\n const uint8Array = new Uint8Array(array);\n const base64String = btoa(String.fromCharCode(...uint8Array));\n return base64String.replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n}\nfunction base64ToArray(base64String) {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding)\n .replace(/\\-/g, '+')\n .replace(/_/g, '/');\n const rawData = atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst OLD_DB_NAME = 'fcm_token_details_db';\n/**\n * The last DB version of 'fcm_token_details_db' was 4. This is one higher, so that the upgrade\n * callback is called for all versions of the old DB.\n */\nconst OLD_DB_VERSION = 5;\nconst OLD_OBJECT_STORE_NAME = 'fcm_token_object_Store';\nasync function migrateOldDatabase(senderId) {\n if ('databases' in indexedDB) {\n // indexedDb.databases() is an IndexedDB v3 API and does not exist in all browsers. TODO: Remove\n // typecast when it lands in TS types.\n const databases = await indexedDB.databases();\n const dbNames = databases.map(db => db.name);\n if (!dbNames.includes(OLD_DB_NAME)) {\n // old DB didn't exist, no need to open.\n return null;\n }\n }\n let tokenDetails = null;\n const db = await openDB(OLD_DB_NAME, OLD_DB_VERSION, {\n upgrade: async (db, oldVersion, newVersion, upgradeTransaction) => {\n if (oldVersion < 2) {\n // Database too old, skip migration.\n return;\n }\n if (!db.objectStoreNames.contains(OLD_OBJECT_STORE_NAME)) {\n // Database did not exist. Nothing to do.\n return;\n }\n const objectStore = upgradeTransaction.objectStore(OLD_OBJECT_STORE_NAME);\n const value = await objectStore.index('fcmSenderId').get(senderId);\n await objectStore.clear();\n if (!value) {\n // No entry in the database, nothing to migrate.\n return;\n }\n if (oldVersion === 2) {\n const oldDetails = value;\n if (!oldDetails.auth || !oldDetails.p256dh || !oldDetails.endpoint) {\n return;\n }\n tokenDetails = {\n token: oldDetails.fcmToken,\n createTime: oldDetails.createTime ?? Date.now(),\n subscriptionOptions: {\n auth: oldDetails.auth,\n p256dh: oldDetails.p256dh,\n endpoint: oldDetails.endpoint,\n swScope: oldDetails.swScope,\n vapidKey: typeof oldDetails.vapidKey === 'string'\n ? oldDetails.vapidKey\n : arrayToBase64(oldDetails.vapidKey)\n }\n };\n }\n else if (oldVersion === 3) {\n const oldDetails = value;\n tokenDetails = {\n token: oldDetails.fcmToken,\n createTime: oldDetails.createTime,\n subscriptionOptions: {\n auth: arrayToBase64(oldDetails.auth),\n p256dh: arrayToBase64(oldDetails.p256dh),\n endpoint: oldDetails.endpoint,\n swScope: oldDetails.swScope,\n vapidKey: arrayToBase64(oldDetails.vapidKey)\n }\n };\n }\n else if (oldVersion === 4) {\n const oldDetails = value;\n tokenDetails = {\n token: oldDetails.fcmToken,\n createTime: oldDetails.createTime,\n subscriptionOptions: {\n auth: arrayToBase64(oldDetails.auth),\n p256dh: arrayToBase64(oldDetails.p256dh),\n endpoint: oldDetails.endpoint,\n swScope: oldDetails.swScope,\n vapidKey: arrayToBase64(oldDetails.vapidKey)\n }\n };\n }\n }\n });\n db.close();\n // Delete all old databases.\n await deleteDB(OLD_DB_NAME);\n await deleteDB('fcm_vapid_details_db');\n await deleteDB('undefined');\n return checkTokenDetails(tokenDetails) ? tokenDetails : null;\n}\nfunction checkTokenDetails(tokenDetails) {\n if (!tokenDetails || !tokenDetails.subscriptionOptions) {\n return false;\n }\n const { subscriptionOptions } = tokenDetails;\n return (typeof tokenDetails.createTime === 'number' &&\n tokenDetails.createTime > 0 &&\n typeof tokenDetails.token === 'string' &&\n tokenDetails.token.length > 0 &&\n typeof subscriptionOptions.auth === 'string' &&\n subscriptionOptions.auth.length > 0 &&\n typeof subscriptionOptions.p256dh === 'string' &&\n subscriptionOptions.p256dh.length > 0 &&\n typeof subscriptionOptions.endpoint === 'string' &&\n subscriptionOptions.endpoint.length > 0 &&\n typeof subscriptionOptions.swScope === 'string' &&\n subscriptionOptions.swScope.length > 0 &&\n typeof subscriptionOptions.vapidKey === 'string' &&\n subscriptionOptions.vapidKey.length > 0);\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst ERROR_MAP = {\n [\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */]: 'Missing App configuration value: \"{$valueName}\"',\n [\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */]: 'This method is available in a Window context.',\n [\"only-available-in-sw\" /* ErrorCode.AVAILABLE_IN_SW */]: 'This method is available in a service worker context.',\n [\"permission-default\" /* ErrorCode.PERMISSION_DEFAULT */]: 'The notification permission was not granted and dismissed instead.',\n [\"permission-blocked\" /* ErrorCode.PERMISSION_BLOCKED */]: 'The notification permission was not granted and blocked instead.',\n [\"unsupported-browser\" /* ErrorCode.UNSUPPORTED_BROWSER */]: \"This browser doesn't support the API's required to use the Firebase SDK.\",\n [\"indexed-db-unsupported\" /* ErrorCode.INDEXED_DB_UNSUPPORTED */]: \"This browser doesn't support indexedDb.open() (ex. Safari iFrame, Firefox Private Browsing, etc)\",\n [\"failed-service-worker-registration\" /* ErrorCode.FAILED_DEFAULT_REGISTRATION */]: 'We are unable to register the default service worker. {$browserErrorMessage}',\n [\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */]: 'A problem occurred while subscribing the user to FCM: {$errorInfo}',\n [\"token-subscribe-no-token\" /* ErrorCode.TOKEN_SUBSCRIBE_NO_TOKEN */]: 'FCM returned no token when subscribing the user to push.',\n [\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */]: 'A problem occurred while creating an FCM registration via FID: {$errorInfo}',\n [\"fid-unregister-failed\" /* ErrorCode.FID_UNREGISTER_FAILED */]: 'A problem occurred while unregistering the FCM registration via FID: {$errorInfo}',\n [\"fid-registration-idb-schema-unavailable\" /* ErrorCode.FID_REGISTRATION_IDB_SCHEMA_UNAVAILABLE */]: 'Unable to read or persist FID registration metadata because the messaging ' +\n 'IndexedDB schema is unavailable (for example, the database could not be ' +\n 'upgraded to the latest version).',\n [\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */]: 'A problem occurred while unsubscribing the ' +\n 'user from FCM: {$errorInfo}',\n [\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */]: 'A problem occurred while updating the user from FCM: {$errorInfo}',\n [\"token-update-no-token\" /* ErrorCode.TOKEN_UPDATE_NO_TOKEN */]: 'FCM returned no token when updating the user to push.',\n [\"use-sw-after-get-token\" /* ErrorCode.USE_SW_AFTER_GET_TOKEN */]: 'The useServiceWorker() method may only be called once and must be ' +\n 'called before calling getToken() to ensure your service worker is used.',\n [\"invalid-sw-registration\" /* ErrorCode.INVALID_SW_REGISTRATION */]: 'The input to useServiceWorker() must be a ServiceWorkerRegistration.',\n [\"invalid-bg-handler\" /* ErrorCode.INVALID_BG_HANDLER */]: 'The input to setBackgroundMessageHandler() must be a function.',\n [\"invalid-vapid-key\" /* ErrorCode.INVALID_VAPID_KEY */]: 'The public VAPID key must be a string.',\n [\"use-vapid-key-after-get-token\" /* ErrorCode.USE_VAPID_KEY_AFTER_GET_TOKEN */]: 'The usePublicVapidKey() method may only be called once and must be ' +\n 'called before calling getToken() to ensure your VAPID key is used.',\n [\"invalid-on-registered-handler\" /* ErrorCode.INVALID_ON_REGISTERED_HANDLER */]: 'No onRegistered callback handler was provided or registered. Implement onRegistered() before register().'\n};\nconst ERROR_FACTORY = new ErrorFactory('messaging', 'Messaging', ERROR_MAP);\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst DATABASE_NAME = 'firebase-messaging-database';\nconst DATABASE_VERSION = 2;\nconst TOKEN_OBJECT_STORE_NAME = 'firebase-messaging-store';\nconst FID_REGISTRATION_OBJECT_STORE_NAME = 'firebase-messaging-fid-registration-store';\nconst defaultIdb = { openDB, deleteDB };\nlet idbImpl = defaultIdb;\n// Open v2, but fall back to v1 if upgrade/open fails. Cache as `unknown` and guard store access.\nlet dbPromise = null;\nfunction migrateMessagingDb(upgradeDb, oldVersion, targetSchemaVersion) {\n // Intentional fall-through for v2: run all intermediate migrations.\n // eslint-disable-next-line default-case\n switch (oldVersion) {\n case 0:\n upgradeDb.createObjectStore(TOKEN_OBJECT_STORE_NAME);\n if (targetSchemaVersion === 1) {\n break;\n }\n // fall through\n case 1:\n if (targetSchemaVersion === 2) {\n upgradeDb.createObjectStore(FID_REGISTRATION_OBJECT_STORE_NAME);\n }\n }\n}\nfunction createOpenDbOptions(targetSchemaVersion) {\n return {\n upgrade: (upgradeDb, oldVersion) => {\n migrateMessagingDb(upgradeDb, oldVersion, targetSchemaVersion);\n },\n blocked: () => {\n /* no-op */\n },\n blocking: (_currentVersion, _blockedVersion, event) => {\n dbPromise = null;\n event.target?.close();\n },\n terminated: () => {\n dbPromise = null;\n }\n };\n}\nfunction getDbPromise() {\n if (!dbPromise) {\n const openLatest = idbImpl.openDB(DATABASE_NAME, DATABASE_VERSION, createOpenDbOptions(2));\n // Assign synchronously to avoid concurrent openDB() calls.\n dbPromise = openLatest.catch(() => idbImpl.openDB(DATABASE_NAME, DATABASE_VERSION - 1, createOpenDbOptions(1)));\n }\n return dbPromise;\n}\nfunction hasObjectStore(db, storeName) {\n return db.objectStoreNames.contains(storeName);\n}\nfunction assertFidRegistrationObjectStore(db) {\n if (!hasObjectStore(db, FID_REGISTRATION_OBJECT_STORE_NAME)) {\n throw ERROR_FACTORY.create(\"fid-registration-idb-schema-unavailable\" /* ErrorCode.FID_REGISTRATION_IDB_SCHEMA_UNAVAILABLE */);\n }\n}\nasync function dbGet(firebaseDependencies) {\n const key = getKey(firebaseDependencies);\n const db = await getDbPromise();\n const tokenDetails = (await db\n .transaction(TOKEN_OBJECT_STORE_NAME)\n .objectStore(TOKEN_OBJECT_STORE_NAME)\n .get(key));\n if (tokenDetails) {\n return tokenDetails;\n }\n else {\n const oldTokenDetails = await migrateOldDatabase(firebaseDependencies.appConfig.senderId);\n if (oldTokenDetails) {\n await dbSet(firebaseDependencies, oldTokenDetails);\n return oldTokenDetails;\n }\n }\n}\nasync function dbSet(firebaseDependencies, tokenDetails) {\n const key = getKey(firebaseDependencies);\n const db = await getDbPromise();\n const stores = [TOKEN_OBJECT_STORE_NAME];\n const hasFidStore = hasObjectStore(db, FID_REGISTRATION_OBJECT_STORE_NAME);\n if (hasFidStore) {\n stores.push(FID_REGISTRATION_OBJECT_STORE_NAME);\n }\n const tx = db.transaction(stores, 'readwrite');\n await tx.objectStore(TOKEN_OBJECT_STORE_NAME).put(tokenDetails, key);\n if (hasFidStore) {\n await tx.objectStore(FID_REGISTRATION_OBJECT_STORE_NAME).delete(key);\n }\n await tx.done;\n return tokenDetails;\n}\nasync function dbRemove(firebaseDependencies) {\n const key = getKey(firebaseDependencies);\n const db = await getDbPromise();\n const tx = db.transaction(TOKEN_OBJECT_STORE_NAME, 'readwrite');\n await tx.objectStore(TOKEN_OBJECT_STORE_NAME).delete(key);\n await tx.done;\n}\nasync function dbGetFidRegistration(firebaseDependencies) {\n const key = getKey(firebaseDependencies);\n const db = await getDbPromise();\n assertFidRegistrationObjectStore(db);\n return (await db\n .transaction(FID_REGISTRATION_OBJECT_STORE_NAME)\n .objectStore(FID_REGISTRATION_OBJECT_STORE_NAME)\n .get(key));\n}\nasync function dbSetFidRegistration(firebaseDependencies, details) {\n const key = getKey(firebaseDependencies);\n const db = await getDbPromise();\n assertFidRegistrationObjectStore(db);\n const tx = db.transaction([TOKEN_OBJECT_STORE_NAME, FID_REGISTRATION_OBJECT_STORE_NAME], 'readwrite');\n await tx.objectStore(FID_REGISTRATION_OBJECT_STORE_NAME).put(details, key);\n await tx.objectStore(TOKEN_OBJECT_STORE_NAME).delete(key);\n await tx.done;\n return details;\n}\nasync function dbRemoveFidRegistration(firebaseDependencies) {\n const key = getKey(firebaseDependencies);\n const db = await getDbPromise();\n assertFidRegistrationObjectStore(db);\n const tx = db.transaction(FID_REGISTRATION_OBJECT_STORE_NAME, 'readwrite');\n await tx.objectStore(FID_REGISTRATION_OBJECT_STORE_NAME).delete(key);\n await tx.done;\n}\nfunction getKey({ appConfig }) {\n return appConfig.appId;\n}\n\nconst name = \"@firebase/messaging\";\nconst version = \"0.13.0\";\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Max attempts (initial fetch + retries) when CreateRegistration `fetch()` throws. */\nconst FID_REGISTRATION_FETCH_MAX_ATTEMPTS = 3;\n/** Base delay in ms; backoff is `BASE * 2^attempt` after each failed attempt. */\nconst FID_REGISTRATION_FETCH_BASE_BACKOFF_MS = 1000;\nasync function requestGetToken(firebaseDependencies, subscriptionOptions) {\n const headers = await getHeaders(firebaseDependencies);\n const body = getBody(subscriptionOptions, firebaseDependencies.appConfig.appName, \n /* includeSdkVersion= */ false);\n const subscribeOptions = {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n };\n let responseData;\n try {\n const response = await fetch(getEndpoint(firebaseDependencies.appConfig), subscribeOptions);\n responseData = await response.json();\n }\n catch (err) {\n throw ERROR_FACTORY.create(\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */, {\n errorInfo: err?.toString()\n });\n }\n if (responseData.error) {\n const message = responseData.error.message;\n throw ERROR_FACTORY.create(\"token-subscribe-failed\" /* ErrorCode.TOKEN_SUBSCRIBE_FAILED */, {\n errorInfo: message\n });\n }\n if (!responseData.token) {\n throw ERROR_FACTORY.create(\"token-subscribe-no-token\" /* ErrorCode.TOKEN_SUBSCRIBE_NO_TOKEN */);\n }\n return responseData.token;\n}\nasync function requestCreateRegistration(firebaseDependencies, subscriptionOptions) {\n const headers = await getHeaders(firebaseDependencies);\n const body = getBody(subscriptionOptions, firebaseDependencies.appConfig.appName, \n /* includeSdkVersion= */ true);\n const subscribeOptions = {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n };\n let response;\n try {\n response = await fetchWithExponentialRetry(() => fetch(getEndpoint(firebaseDependencies.appConfig), subscribeOptions), FID_REGISTRATION_FETCH_MAX_ATTEMPTS, FID_REGISTRATION_FETCH_BASE_BACKOFF_MS);\n }\n catch (err) {\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: err?.toString()\n });\n }\n if (response.ok) {\n const responseFid = await parseCreateRegistrationSuccessFid(response);\n return { responseFid };\n }\n // `fetch()` succeeded, but the backend returned a non-2xx response.\n // Best-effort parse the body to extract `error.message`, but always fail with\n // `FID_REGISTRATION_FAILED` to keep the error surface uniform.\n // Best-effort extraction of error details; the main signal is response.ok / status.\n let responseData;\n try {\n responseData = (await response.json());\n }\n catch (err) {\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: response.statusText\n });\n }\n const message = responseData.error?.message ?? response.statusText;\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: message\n });\n}\n/**\n * Deletes an FCM Web registration via DeleteRegistration using the Firebase Installation ID (FID).\n */\nasync function requestDeleteRegistration(firebaseDependencies, fid) {\n const headers = await getHeaders(firebaseDependencies);\n const options = {\n method: 'DELETE',\n headers\n };\n let response;\n try {\n response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${fid}`, options);\n }\n catch (err) {\n throw ERROR_FACTORY.create(\"fid-unregister-failed\" /* ErrorCode.FID_UNREGISTER_FAILED */, {\n errorInfo: err?.toString()\n });\n }\n if (response.ok) {\n return;\n }\n // Best-effort parse error details; surface uniform error code.\n try {\n const responseData = (await response.json());\n const message = responseData.error?.message ?? response.statusText;\n throw message;\n }\n catch (err) {\n // If parsing failed, fall back to status text.\n throw ERROR_FACTORY.create(\"fid-unregister-failed\" /* ErrorCode.FID_UNREGISTER_FAILED */, {\n errorInfo: (typeof err === 'string' && err) ||\n response.statusText ||\n err?.toString()\n });\n }\n}\n/**\n * Parses a successful CreateRegistration body. The backend must return JSON with a non-empty\n * string `name`: a resource name `projects/{projectId}/registrations/{fid}`\n */\nasync function parseCreateRegistrationSuccessFid(response) {\n const text = await response.text();\n if (!text.trim()) {\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: 'CreateRegistration succeeded but response body is empty'\n });\n }\n let data;\n try {\n data = JSON.parse(text);\n }\n catch {\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: 'CreateRegistration succeeded but response body is not valid JSON'\n });\n }\n const name = data.name;\n if (typeof name !== 'string' || name.length === 0) {\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: 'CreateRegistration succeeded but response did not include a non-empty name'\n });\n }\n return parseFidFromRegistrationResourceName(name);\n}\nconst REGISTRATIONS_NAME_SEGMENT = '/registrations/';\n/** Extracts the Firebase Installation ID from CreateRegistration `name` (resource path). */\nfunction parseFidFromRegistrationResourceName(name) {\n const segmentIndex = name.indexOf(REGISTRATIONS_NAME_SEGMENT);\n if (segmentIndex !== -1) {\n const fid = name.slice(segmentIndex + REGISTRATIONS_NAME_SEGMENT.length);\n if (fid.length > 0) {\n return fid;\n }\n }\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: 'CreateRegistration succeeded but response name is not a valid registration resource name'\n });\n}\nasync function requestUpdateToken(firebaseDependencies, tokenDetails) {\n const headers = await getHeaders(firebaseDependencies);\n const body = getBody(tokenDetails.subscriptionOptions, firebaseDependencies.appConfig.appName, \n /* includeSdkVersion= */ false);\n const updateOptions = {\n method: 'PATCH',\n headers,\n body: JSON.stringify(body)\n };\n let responseData;\n try {\n const response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${tokenDetails.token}`, updateOptions);\n responseData = await response.json();\n }\n catch (err) {\n throw ERROR_FACTORY.create(\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */, {\n errorInfo: err?.toString()\n });\n }\n if (responseData.error) {\n const message = responseData.error.message;\n throw ERROR_FACTORY.create(\"token-update-failed\" /* ErrorCode.TOKEN_UPDATE_FAILED */, {\n errorInfo: message\n });\n }\n if (!responseData.token) {\n throw ERROR_FACTORY.create(\"token-update-no-token\" /* ErrorCode.TOKEN_UPDATE_NO_TOKEN */);\n }\n return responseData.token;\n}\nasync function requestDeleteToken(firebaseDependencies, token) {\n const headers = await getHeaders(firebaseDependencies);\n const unsubscribeOptions = {\n method: 'DELETE',\n headers\n };\n try {\n const response = await fetch(`${getEndpoint(firebaseDependencies.appConfig)}/${token}`, unsubscribeOptions);\n const responseData = await response.json();\n if (responseData.error) {\n const message = responseData.error.message;\n throw ERROR_FACTORY.create(\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */, {\n errorInfo: message\n });\n }\n }\n catch (err) {\n throw ERROR_FACTORY.create(\"token-unsubscribe-failed\" /* ErrorCode.TOKEN_UNSUBSCRIBE_FAILED */, {\n errorInfo: err?.toString()\n });\n }\n}\n/**\n * Re-runs `operation` when it throws, with exponential backoff between attempts.\n * Rethrows the last error if all attempts fail.\n */\nasync function fetchWithExponentialRetry(operation, maxAttempts, baseBackoffMs) {\n let lastError;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await operation();\n }\n catch (err) {\n lastError = err;\n if (attempt < maxAttempts - 1) {\n const delayMs = baseBackoffMs * Math.pow(2, attempt);\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n }\n }\n throw lastError;\n}\nfunction getEndpoint({ projectId }) {\n return `${ENDPOINT}/projects/${projectId}/registrations`;\n}\nasync function getHeaders({ appConfig, installations }) {\n const authToken = await installations.getToken();\n return new Headers({\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'x-goog-api-key': appConfig.apiKey,\n 'x-goog-firebase-installations-auth': `FIS ${authToken}`\n });\n}\n/**\n * Hostname for the registering web client (e.g. `www.example.com`), or the app name\n * (`appNameFallback`) when the scope cannot be resolved (e.g. some test environments).\n */\nfunction getRegistrationOrigin(swScope, appNameFallback) {\n try {\n if (/^[a-zA-Z][a-zA-Z\\d+\\-.]*:/.test(swScope)) {\n return new URL(swScope).host;\n }\n }\n catch {\n // Fall through to relative-scope handling.\n }\n try {\n if (typeof self !== 'undefined' && self.location?.href) {\n return new URL(swScope, self.location.origin).host;\n }\n }\n catch {\n // Fall through.\n }\n if (typeof self !== 'undefined' && self.location?.host) {\n return self.location.host;\n }\n return appNameFallback;\n}\nfunction getBody({ p256dh, auth, endpoint, vapidKey, swScope }, appNameFallback, includeSdkVersion) {\n const body = {\n web: {\n origin: getRegistrationOrigin(swScope, appNameFallback),\n endpoint,\n auth,\n p256dh\n }\n };\n if (includeSdkVersion) {\n // eslint-disable-next-line camelcase\n body.fcm_sdk_version = version;\n }\n if (vapidKey !== DEFAULT_VAPID_KEY) {\n body.web.applicationPubKey = vapidKey;\n }\n return body;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// UpdateRegistration will be called once every week.\nconst TOKEN_EXPIRATION_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\nasync function getTokenInternal(messaging) {\n const pushSubscription = await getPushSubscription$1(messaging.swRegistration, messaging.vapidKey);\n const subscriptionOptions = {\n vapidKey: messaging.vapidKey,\n swScope: messaging.swRegistration.scope,\n endpoint: pushSubscription.endpoint,\n auth: arrayToBase64(pushSubscription.getKey('auth')),\n p256dh: arrayToBase64(pushSubscription.getKey('p256dh'))\n };\n const tokenDetails = await dbGet(messaging.firebaseDependencies);\n if (!tokenDetails) {\n // No token, get a new one.\n return getNewToken(messaging.firebaseDependencies, subscriptionOptions);\n }\n else if (!isTokenValid(tokenDetails.subscriptionOptions, subscriptionOptions)) {\n // Invalid token, get a new one.\n try {\n await requestDeleteToken(messaging.firebaseDependencies, tokenDetails.token);\n }\n catch (e) {\n // Suppress errors because of #2364\n console.warn(e);\n }\n return getNewToken(messaging.firebaseDependencies, subscriptionOptions);\n }\n else if (Date.now() >= tokenDetails.createTime + TOKEN_EXPIRATION_MS) {\n // Weekly token refresh\n return updateToken(messaging, {\n token: tokenDetails.token,\n createTime: Date.now(),\n subscriptionOptions\n });\n }\n else {\n // Valid token, nothing to do.\n return tokenDetails.token;\n }\n}\n/**\n * Legacy getToken() path: there is a token row in IndexedDB. Revoke it with FCM, drop the row, and\n * clear any leftover FID registration metadata (apps may mix APIs).\n */\nasync function revokeLegacyFcmTokenAndClearCaches(messaging, tokenDetails) {\n await requestDeleteToken(messaging.firebaseDependencies, tokenDetails.token);\n await dbRemove(messaging.firebaseDependencies);\n await removeFidRegistrationBestEffort(messaging.firebaseDependencies);\n}\n/**\n * No legacy token row: the client may only have FID-based registration (register() flow). If so,\n * delete that registration on the server, always scrub local FID metadata, then surface\n * onUnregistered when we actually had an FID.\n */\nasync function revokeFidRegistrationIfStored(messaging) {\n const stored = await dbGetFidRegistration(messaging.firebaseDependencies).catch(() => undefined);\n const fid = stored?.fid;\n if (fid) {\n await requestDeleteRegistration(messaging.firebaseDependencies, fid);\n }\n await removeFidRegistrationBestEffort(messaging.firebaseDependencies);\n if (fid) {\n notifyOnUnregistered(messaging, fid);\n }\n}\n/**\n * Revokes the app's FCM registration: legacy token (getToken/deleteToken) and/or FID-based\n * registration (register/unregister), clears local caches, notifies onUnregistered when a stored\n * FID existed, then unsubscribes the push subscription when present.\n */\nasync function revokeRegistrationInternal(messaging) {\n const tokenDetails = await dbGet(messaging.firebaseDependencies);\n if (tokenDetails) {\n await revokeLegacyFcmTokenAndClearCaches(messaging, tokenDetails);\n }\n else {\n await revokeFidRegistrationIfStored(messaging);\n }\n // Unsubscribe from the push subscription.\n const pushSubscription = await messaging.swRegistration.pushManager.getSubscription();\n if (pushSubscription) {\n return pushSubscription.unsubscribe();\n }\n // If there's no SW, consider it a success.\n return true;\n}\nasync function updateToken(messaging, tokenDetails) {\n try {\n const updatedToken = await requestUpdateToken(messaging.firebaseDependencies, tokenDetails);\n const updatedTokenDetails = {\n ...tokenDetails,\n token: updatedToken,\n createTime: Date.now()\n };\n await dbSet(messaging.firebaseDependencies, updatedTokenDetails);\n return updatedToken;\n }\n catch (e) {\n throw e;\n }\n}\nasync function getNewToken(firebaseDependencies, subscriptionOptions) {\n const token = await requestGetToken(firebaseDependencies, subscriptionOptions);\n const tokenDetails = {\n token,\n createTime: Date.now(),\n subscriptionOptions\n };\n await dbSet(firebaseDependencies, tokenDetails);\n return tokenDetails.token;\n}\n/**\n * Gets a PushSubscription for the current user.\n */\nasync function getPushSubscription$1(swRegistration, vapidKey) {\n const subscription = await swRegistration.pushManager.getSubscription();\n if (subscription) {\n return subscription;\n }\n return swRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n // Chrome <= 75 doesn't support base64-encoded VAPID key. For backward compatibility, VAPID key\n // submitted to pushManager#subscribe must be of type Uint8Array.\n applicationServerKey: base64ToArray(vapidKey)\n });\n}\n/**\n * Checks if the saved tokenDetails object matches the configuration provided.\n */\nfunction isTokenValid(dbOptions, currentOptions) {\n const isVapidKeyEqual = currentOptions.vapidKey === dbOptions.vapidKey;\n const isEndpointEqual = currentOptions.endpoint === dbOptions.endpoint;\n const isAuthEqual = currentOptions.auth === dbOptions.auth;\n const isP256dhEqual = currentOptions.p256dh === dbOptions.p256dh;\n return isVapidKeyEqual && isEndpointEqual && isAuthEqual && isP256dhEqual;\n}\n/** Clears FID registration metadata; apps may mix legacy getToken() with FID register/unregister. */\nasync function removeFidRegistrationBestEffort(firebaseDependencies) {\n try {\n await dbRemoveFidRegistration(firebaseDependencies);\n }\n catch {\n // Ignore.\n }\n}\nfunction notifyOnRegistered(messaging, fid) {\n const handler = messaging.onRegisteredHandler;\n if (!handler) {\n return;\n }\n if (typeof handler === 'function') {\n handler(fid);\n }\n else {\n handler.next(fid);\n }\n}\nfunction notifyOnUnregistered(messaging, fid) {\n const handler = messaging.onUnregisteredHandler;\n if (!handler) {\n return;\n }\n if (typeof handler === 'function') {\n handler(fid);\n }\n else {\n handler.next(fid);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function registerDefaultSw(messaging) {\n try {\n messaging.swRegistration = await navigator.serviceWorker.register(DEFAULT_SW_PATH, {\n scope: DEFAULT_SW_SCOPE\n });\n // The timing when browser updates sw when sw has an update is unreliable from experiment. It\n // leads to version conflict when the SDK upgrades to a newer version in the main page, but sw\n // is stuck with the old version. For example,\n // https://github.com/firebase/firebase-js-sdk/issues/2590 The following line reliably updates\n // sw if there was an update.\n messaging.swRegistration.update().catch(() => {\n /* it is non blocking and we don't care if it failed */\n });\n await waitForRegistrationActive(messaging.swRegistration);\n }\n catch (e) {\n throw ERROR_FACTORY.create(\"failed-service-worker-registration\" /* ErrorCode.FAILED_DEFAULT_REGISTRATION */, {\n browserErrorMessage: e?.message\n });\n }\n}\n/**\n * Waits for registration to become active. MDN documentation claims that\n * a service worker registration should be ready to use after awaiting\n * navigator.serviceWorker.register() but that doesn't seem to be the case in\n * practice, causing the SDK to throw errors when calling\n * swRegistration.pushManager.subscribe() too soon after register(). The only\n * solution seems to be waiting for the service worker registration `state`\n * to become \"active\".\n */\nasync function waitForRegistrationActive(registration) {\n return new Promise((resolve, reject) => {\n const rejectTimeout = setTimeout(() => reject(new Error(`Service worker not registered after ${DEFAULT_REGISTRATION_TIMEOUT} ms`)), DEFAULT_REGISTRATION_TIMEOUT);\n const incomingSw = registration.installing || registration.waiting;\n if (registration.active) {\n clearTimeout(rejectTimeout);\n resolve();\n }\n else if (incomingSw) {\n incomingSw.onstatechange = ev => {\n if (ev.target?.state === 'activated') {\n incomingSw.onstatechange = null;\n clearTimeout(rejectTimeout);\n resolve();\n }\n };\n }\n else {\n clearTimeout(rejectTimeout);\n reject(new Error('No incoming service worker found.'));\n }\n });\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function updateSwReg(messaging, swRegistration) {\n if (!swRegistration && !messaging.swRegistration) {\n await registerDefaultSw(messaging);\n }\n if (!swRegistration && !!messaging.swRegistration) {\n return;\n }\n if (!(swRegistration instanceof ServiceWorkerRegistration)) {\n throw ERROR_FACTORY.create(\"invalid-sw-registration\" /* ErrorCode.INVALID_SW_REGISTRATION */);\n }\n messaging.swRegistration = swRegistration;\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function updateVapidKey(messaging, vapidKey) {\n if (!!vapidKey) {\n messaging.vapidKey = vapidKey;\n }\n else if (!messaging.vapidKey) {\n messaging.vapidKey = DEFAULT_VAPID_KEY;\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Retries when CreateRegistration echoes an FID that does not match Installations.getId(). */\nconst FID_REGISTRATION_FID_MATCH_MAX_ATTEMPTS = 3;\n/**\n * For the new FID-based register path:\n * - Create (or refresh) an FCM Web registration in the backend via CreateRegistration.\n * - Use the FIS auth token produced by the installations instance (implicitly associated with FID).\n * - CreateRegistration must echo the installation in `name` (e.g.\n * `projects/{projectId}/registrations/{fid}`); it must match `expectedFid` from\n * Installations.getId(). On mismatch we refresh the auth token and retry, then fail with\n * `fid-registration-failed`.\n */\nasync function registerFcmRegistrationWithFid(messaging, expectedFid) {\n const pushSubscription = await getPushSubscription(messaging.swRegistration, messaging.vapidKey);\n const subscriptionOptions = {\n vapidKey: messaging.vapidKey,\n swScope: messaging.swRegistration.scope,\n endpoint: pushSubscription.endpoint,\n auth: arrayToBase64(pushSubscription.getKey('auth')),\n p256dh: arrayToBase64(pushSubscription.getKey('p256dh'))\n };\n const installations = messaging.firebaseDependencies.installations;\n for (let attempt = 0; attempt < FID_REGISTRATION_FID_MATCH_MAX_ATTEMPTS; attempt++) {\n const { responseFid } = await requestCreateRegistration(messaging.firebaseDependencies, subscriptionOptions);\n if (responseFid === expectedFid) {\n return;\n }\n // If CreateRegistration echoes an unexpected FID, the FIS auth token used for the request may\n // be stale relative to the installation the backend associates with the call. Force-refresh\n // the token before retrying so the next attempt uses credentials aligned with Installations.\n if (attempt < FID_REGISTRATION_FID_MATCH_MAX_ATTEMPTS - 1) {\n await installations.getToken(true);\n }\n }\n throw ERROR_FACTORY.create(\"fid-registration-failed\" /* ErrorCode.FID_REGISTRATION_FAILED */, {\n errorInfo: 'CreateRegistration response FID does not match Firebase Installation ID'\n });\n}\nasync function getPushSubscription(swRegistration, vapidKey) {\n const subscription = await swRegistration.pushManager.getSubscription();\n if (subscription) {\n return subscription;\n }\n // Chrome/Firefox require applicationServerKey to be of type Uint8Array.\n return swRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n // `PushManager.subscribe` expects a `BufferSource`; `base64ToArray` produces a typed array.\n // Cast to satisfy the lib typing differences across TS DOM versions.\n applicationServerKey: base64ToArray(vapidKey)\n });\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst FID_REGISTRATION_REFRESH_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\n/**\n * Registers the app instance with FCM using its Firebase Installation ID (FID). The FID is\n * delivered via the `onRegistered` callback. Call this to establish an FID-based identity.\n * Once `onRegistered` provides an FID, instruct your backend to remove any legacy token\n * previously associated with this instance. The backend send API supports FID as a target.\n *\n * When called multiple times, `onRegistered` is invoked on each call with the current FID.\n * Backend registration sync runs on first register, when the FID changes, or on weekly refresh.\n *\n * @param messaging - The MessagingService instance.\n * @param options - Optional. Same options as getToken (vapidKey, serviceWorkerRegistration).\n */\nasync function register$1(messaging, options) {\n if (!navigator) {\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\n }\n if (Notification.permission === 'default') {\n await Notification.requestPermission();\n }\n if (Notification.permission !== 'granted') {\n throw ERROR_FACTORY.create(\"permission-blocked\" /* ErrorCode.PERMISSION_BLOCKED */);\n }\n if (!messaging.onRegisteredHandler) {\n throw ERROR_FACTORY.create(\"invalid-on-registered-handler\" /* ErrorCode.INVALID_ON_REGISTERED_HANDLER */);\n }\n await updateVapidKey(messaging, options?.vapidKey);\n await updateSwReg(messaging, options?.serviceWorkerRegistration);\n // Keep the queue alive after a failed register() so future calls can retry.\n const prev = messaging._registerNotifyChain.catch(() => { });\n messaging._registerNotifyChain = prev.then(async () => {\n const fid = await messaging.firebaseDependencies.installations.getId();\n const stored = await dbGetFidRegistration(messaging.firebaseDependencies);\n const now = Date.now();\n const shouldRefresh = !stored ||\n stored.fid !== fid ||\n now >= stored.lastRegisterTime + FID_REGISTRATION_REFRESH_MS;\n if (shouldRefresh) {\n await registerFcmRegistrationWithFid(messaging, fid);\n await dbSetFidRegistration(messaging.firebaseDependencies, {\n fid,\n lastRegisterTime: now,\n vapidKey: messaging.vapidKey\n });\n }\n const handler = messaging.onRegisteredHandler;\n if (!handler) {\n throw ERROR_FACTORY.create(\"invalid-on-registered-handler\" /* ErrorCode.INVALID_ON_REGISTERED_HANDLER */);\n }\n notifyOnRegistered(messaging, fid);\n });\n return messaging._registerNotifyChain;\n}\n\n/**\n * @license\n * Copyright 2026 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * When the Firebase Installation ID changes, re-run `register()` so FCM registration and\n * onRegistered run for the new FID. No-op if no onRegistered handler is set or the app\n * instance was never registered with FCM.\n */\nfunction subscribeFidChangeRegistration(messaging, installations) {\n return onIdChange(installations, () => {\n void (async () => {\n if (!messaging.onRegisteredHandler) {\n return;\n }\n const stored = await dbGetFidRegistration(messaging.firebaseDependencies);\n if (!stored) {\n return;\n }\n await register$1(messaging).catch(() => {\n // Best-effort: permission may be revoked or SW unavailable after FID rotation.\n });\n })();\n });\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction externalizePayload(internalPayload) {\n const payload = {\n from: internalPayload.from,\n // eslint-disable-next-line camelcase\n collapseKey: internalPayload.collapse_key,\n // eslint-disable-next-line camelcase\n messageId: internalPayload.fcmMessageId\n };\n propagateNotificationPayload(payload, internalPayload);\n propagateDataPayload(payload, internalPayload);\n propagateFcmOptions(payload, internalPayload);\n return payload;\n}\nfunction propagateNotificationPayload(payload, messagePayloadInternal) {\n if (!messagePayloadInternal.notification) {\n return;\n }\n payload.notification = {};\n const title = messagePayloadInternal.notification.title;\n if (!!title) {\n payload.notification.title = title;\n }\n const body = messagePayloadInternal.notification.body;\n if (!!body) {\n payload.notification.body = body;\n }\n const image = messagePayloadInternal.notification.image;\n if (!!image) {\n payload.notification.image = image;\n }\n const icon = messagePayloadInternal.notification.icon;\n if (!!icon) {\n payload.notification.icon = icon;\n }\n}\nfunction propagateDataPayload(payload, messagePayloadInternal) {\n if (!messagePayloadInternal.data) {\n return;\n }\n payload.data = messagePayloadInternal.data;\n}\nfunction propagateFcmOptions(payload, messagePayloadInternal) {\n // fcmOptions.link value is written into notification.click_action. see more in b/232072111\n if (!messagePayloadInternal.fcmOptions &&\n !messagePayloadInternal.notification?.click_action) {\n return;\n }\n payload.fcmOptions = {};\n const link = messagePayloadInternal.fcmOptions?.link ??\n messagePayloadInternal.notification?.click_action;\n if (!!link) {\n payload.fcmOptions.link = link;\n }\n // eslint-disable-next-line camelcase\n const analyticsLabel = messagePayloadInternal.fcmOptions?.analytics_label;\n if (!!analyticsLabel) {\n payload.fcmOptions.analyticsLabel = analyticsLabel;\n }\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction isConsoleMessage(data) {\n // This message has a campaign ID, meaning it was sent using the Firebase Console.\n return typeof data === 'object' && !!data && CONSOLE_CAMPAIGN_ID in data;\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n_mergeStrings('AzSCbw63g1R0nCw85jG8', 'Iaya3yLKwmgvh7cF0q4');\nfunction _mergeStrings(s1, s2) {\n const resultArray = [];\n for (let i = 0; i < s1.length; i++) {\n resultArray.push(s1.charAt(i));\n if (i < s2.length) {\n resultArray.push(s2.charAt(i));\n }\n }\n return resultArray.join('');\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction extractAppConfig(app) {\n if (!app || !app.options) {\n throw getMissingValueError('App Configuration Object');\n }\n if (!app.name) {\n throw getMissingValueError('App Name');\n }\n // Required app config keys\n const configKeys = [\n 'projectId',\n 'apiKey',\n 'appId',\n 'messagingSenderId'\n ];\n const { options } = app;\n for (const keyName of configKeys) {\n if (!options[keyName]) {\n throw getMissingValueError(keyName);\n }\n }\n return {\n appName: app.name,\n projectId: options.projectId,\n apiKey: options.apiKey,\n appId: options.appId,\n senderId: options.messagingSenderId\n };\n}\nfunction getMissingValueError(valueName) {\n return ERROR_FACTORY.create(\"missing-app-config-values\" /* ErrorCode.MISSING_APP_CONFIG_VALUES */, {\n valueName\n });\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nclass MessagingService {\n constructor(app, installations, analyticsProvider) {\n // logging is only done with end user consent. Default to false.\n this.deliveryMetricsExportedToBigQueryEnabled = false;\n this.onBackgroundMessageHandler = null;\n this.onMessageHandler = null;\n /** Observer for the event that the app instance is registered with FCM via Firebase Installation ID (FID). */\n this.onRegisteredHandler = null;\n /** Observer for the event that the app instance is unregistered from FCM (FID no longer active). */\n this.onUnregisteredHandler = null;\n /**\n * Serializes the FID get + compare + notify step so concurrent register() calls\n * do not race each other.\n */\n this._registerNotifyChain = Promise.resolve();\n /** Unsubscribe from Installations `onIdChange` when messaging is deleted. */\n this._fidChangeUnsubscribe = null;\n this.logEvents = [];\n /**\n * Single source of truth for the logging loop lifecycle.\n *\n * `scheduled` holds the active timer id; `flushing` indicates an async dispatch\n * is in progress (prevents duplicate starts); `stopped` means idle.\n */\n this.logQueue = { state: 'stopped' };\n const appConfig = extractAppConfig(app);\n this.firebaseDependencies = {\n app,\n appConfig,\n installations,\n analyticsProvider\n };\n }\n _delete() {\n if (this._fidChangeUnsubscribe) {\n this._fidChangeUnsubscribe();\n this._fidChangeUnsubscribe = null;\n }\n if (this.logQueue.state === 'scheduled') {\n clearTimeout(this.logQueue.timerId);\n }\n this.logQueue = { state: 'stopped' };\n return Promise.resolve();\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function getToken$1(messaging, options) {\n if (!navigator) {\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\n }\n if (Notification.permission === 'default') {\n await Notification.requestPermission();\n }\n if (Notification.permission !== 'granted') {\n throw ERROR_FACTORY.create(\"permission-blocked\" /* ErrorCode.PERMISSION_BLOCKED */);\n }\n await updateVapidKey(messaging, options?.vapidKey);\n await updateSwReg(messaging, options?.serviceWorkerRegistration);\n return getTokenInternal(messaging);\n}\n\n/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function logToScion(messaging, messageType, data) {\n const eventType = getEventType(messageType);\n const analytics = await messaging.firebaseDependencies.analyticsProvider.get();\n analytics.logEvent(eventType, {\n /* eslint-disable camelcase */\n message_id: data[CONSOLE_CAMPAIGN_ID],\n message_name: data[CONSOLE_CAMPAIGN_NAME],\n message_time: data[CONSOLE_CAMPAIGN_TIME],\n message_device_time: Math.floor(Date.now() / 1000)\n /* eslint-enable camelcase */\n });\n}\nfunction getEventType(messageType) {\n switch (messageType) {\n case MessageType.NOTIFICATION_CLICKED:\n return 'notification_open';\n case MessageType.PUSH_RECEIVED:\n return 'notification_foreground';\n default:\n throw new Error();\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function messageEventListener(messaging, event) {\n const internalPayload = event.data;\n if (!internalPayload.isFirebaseMessaging) {\n return;\n }\n if (messaging.onMessageHandler &&\n internalPayload.messageType === MessageType.PUSH_RECEIVED) {\n if (typeof messaging.onMessageHandler === 'function') {\n messaging.onMessageHandler(externalizePayload(internalPayload));\n }\n else {\n messaging.onMessageHandler.next(externalizePayload(internalPayload));\n }\n }\n if (messaging.onRegisteredHandler &&\n internalPayload.messageType === MessageType.FID_REGISTERED) {\n const fid = internalPayload.fid;\n if (typeof messaging.onRegisteredHandler === 'function') {\n messaging.onRegisteredHandler(fid);\n }\n else {\n messaging.onRegisteredHandler.next(fid);\n }\n }\n // Log to Scion if applicable\n const dataPayload = internalPayload.data;\n if (isConsoleMessage(dataPayload) &&\n dataPayload[CONSOLE_CAMPAIGN_ANALYTICS_ENABLED] === '1') {\n await logToScion(messaging, internalPayload.messageType, dataPayload);\n }\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst WindowMessagingFactory = (container) => {\n const messaging = new MessagingService(container.getProvider('app').getImmediate(), container.getProvider('installations-internal').getImmediate(), container.getProvider('analytics-internal'));\n navigator.serviceWorker.addEventListener('message', e => messageEventListener(messaging, e));\n messaging._fidChangeUnsubscribe = subscribeFidChangeRegistration(messaging, container.getProvider('installations').getImmediate());\n return messaging;\n};\nconst WindowMessagingInternalFactory = (container) => {\n const messaging = container\n .getProvider('messaging')\n .getImmediate();\n const messagingInternal = {\n getToken: (options) => getToken$1(messaging, options),\n register: (options) => register$1(messaging, options)\n };\n return messagingInternal;\n};\nfunction registerMessagingInWindow() {\n _registerComponent(new Component('messaging', WindowMessagingFactory, \"PUBLIC\" /* ComponentType.PUBLIC */));\n _registerComponent(new Component('messaging-internal', WindowMessagingInternalFactory, \"PRIVATE\" /* ComponentType.PRIVATE */));\n registerVersion(name, version);\n // BUILD_TARGET will be replaced by values like esm, cjs, etc during the compilation\n registerVersion(name, version, 'esm2020');\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Checks if all required APIs exist in the browser.\n * @returns a Promise that resolves to a boolean.\n *\n * @public\n */\nasync function isWindowSupported() {\n try {\n // This throws if open() is unsupported, so adding it to the conditional\n // statement below can cause an uncaught error.\n await validateIndexedDBOpenable();\n }\n catch (e) {\n return false;\n }\n // firebase-js-sdk/issues/2393 reveals that idb#open in Safari iframe and Firefox private browsing\n // might be prohibited to run. In these contexts, an error would be thrown during the messaging\n // instantiating phase, informing the developers to import/call isSupported for special handling.\n return (typeof window !== 'undefined' &&\n isIndexedDBAvailable() &&\n areCookiesEnabled() &&\n 'serviceWorker' in navigator &&\n 'PushManager' in window &&\n 'Notification' in window &&\n 'fetch' in window &&\n ServiceWorkerRegistration.prototype.hasOwnProperty('showNotification') &&\n PushSubscription.prototype.hasOwnProperty('getKey'));\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nasync function deleteToken$1(messaging) {\n if (!navigator) {\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\n }\n if (!messaging.swRegistration) {\n await registerDefaultSw(messaging);\n }\n return revokeRegistrationInternal(messaging);\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction onMessage$1(messaging, nextOrObserver) {\n if (!navigator) {\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\n }\n messaging.onMessageHandler = nextOrObserver;\n return () => {\n messaging.onMessageHandler = null;\n };\n}\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Subscribes to an event that the app instance is registered with FCM via Firebase Installation ID (FID).\n * Use the FID passed to the callback to upload it to your application server.\n *\n * @param messaging - The {@link MessagingService} instance.\n * @param nextOrObserver - A function or observer object called when an FID is registered.\n * @returns Unsubscribe function to stop listening.\n */\nfunction onRegistered$1(messaging, nextOrObserver) {\n messaging.onRegisteredHandler = nextOrObserver;\n return () => {\n if (messaging.onRegisteredHandler === nextOrObserver) {\n messaging.onRegisteredHandler = null;\n }\n };\n}\n\n/**\n * @license\n * Copyright 2026 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Subscribes to an event that the app instance is unregistered from FCM so the FID is no longer active.\n * Use this to notify your backend to remove this FID to prevent 404 errors on send.\n *\n * @param messaging - The {@link MessagingService} instance.\n * @param nextOrObserver - A function or observer object called with the unregistered FID.\n * @returns Unsubscribe function to stop listening.\n */\nfunction onUnregistered$1(messaging, nextOrObserver) {\n messaging.onUnregisteredHandler = nextOrObserver;\n return () => {\n if (messaging.onUnregisteredHandler === nextOrObserver) {\n messaging.onUnregisteredHandler = null;\n }\n };\n}\n\n/**\n * @license\n * Copyright 2026 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Unregisters the app instance from FCM by deleting its FID-based registration.\n *\n * On success, triggers the `onUnregistered` callback (if set) with the unregistered FID.\n *\n * @param messaging - The MessagingService instance.\n */\nasync function unregister$1(messaging) {\n if (!navigator) {\n throw ERROR_FACTORY.create(\"only-available-in-window\" /* ErrorCode.AVAILABLE_IN_WINDOW */);\n }\n // Prefer the last successfully registered FID from local metadata when available.\n const stored = await dbGetFidRegistration(messaging.firebaseDependencies).catch(() => undefined);\n const fid = stored?.fid ?? (await messaging.firebaseDependencies.installations.getId());\n await requestDeleteRegistration(messaging.firebaseDependencies, fid);\n // Best-effort local cleanup; still resolve even if schema is unavailable.\n try {\n await dbRemoveFidRegistration(messaging.firebaseDependencies);\n }\n catch {\n // Ignore.\n }\n // Best-effort cleanup of legacy token details created via getToken().\n try {\n await dbRemove(messaging.firebaseDependencies);\n }\n catch {\n // Ignore.\n }\n const handler = messaging.onUnregisteredHandler;\n if (!handler) {\n return;\n }\n if (typeof handler === 'function') {\n handler(fid);\n }\n else {\n handler.next(fid);\n }\n}\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Retrieves a Firebase Cloud Messaging instance.\n *\n * @returns The Firebase Cloud Messaging instance associated with the provided firebase app.\n *\n * @public\n */\nfunction getMessagingInWindow(app = getApp()) {\n // Conscious decision to make this async check non-blocking during the messaging instance\n // initialization phase for performance consideration. An error would be thrown latter for\n // developer's information. Developers can then choose to import and call `isSupported` for\n // special handling.\n isWindowSupported().then(isSupported => {\n // If `isWindowSupported()` resolved, but returned false.\n if (!isSupported) {\n throw ERROR_FACTORY.create(\"unsupported-browser\" /* ErrorCode.UNSUPPORTED_BROWSER */);\n }\n }, _ => {\n // If `isWindowSupported()` rejected.\n throw ERROR_FACTORY.create(\"indexed-db-unsupported\" /* ErrorCode.INDEXED_DB_UNSUPPORTED */);\n });\n return _getProvider(getModularInstance(app), 'messaging').getImmediate();\n}\n/**\n * Subscribes the {@link Messaging} instance to push notifications. Returns a Firebase Cloud\n * Messaging registration token that can be used to send push messages to that {@link Messaging}\n * instance.\n *\n * If notification permission isn't already granted, this method asks the user for permission. The\n * returned promise rejects if the user does not allow the app to show notifications.\n *\n * @param messaging - The {@link Messaging} instance.\n * @param options - Provides an optional vapid key and an optional service worker registration.\n *\n * @returns The promise resolves with an FCM registration token.\n *\n * @deprecated Use {@link register} together with {@link onRegistered} for Firebase\n * Installation ID-based messaging instead of retrieving an FCM registration token with this API.\n *\n * @public\n */\nasync function getToken(messaging, options) {\n messaging = getModularInstance(messaging);\n return getToken$1(messaging, options);\n}\n/**\n * Deletes the registration token associated with this {@link Messaging} instance and unsubscribes\n * the {@link Messaging} instance from the push subscription.\n *\n * If there is no legacy registration token but the client has FID-based registration metadata\n * (from {@link register}), this deletes that registration on the server, clears local metadata, and\n * invokes {@link onUnregistered} with the removed FID when successful.\n *\n * @param messaging - The {@link Messaging} instance.\n *\n * @returns The promise resolves when the token has been successfully deleted.\n *\n * @deprecated Use {@link onUnregistered} to observe when the client is no longer\n * registered and update your backend accordingly, instead of explicitly deleting the\n * registration token with this API.\n *\n * @public\n */\nfunction deleteToken(messaging) {\n messaging = getModularInstance(messaging);\n return deleteToken$1(messaging);\n}\n/**\n * When a push message is received and the user is currently on a page for your origin, the\n * message is passed to the page and an `onMessage()` event is dispatched with the payload of\n * the push message.\n *\n *\n * @param messaging - The {@link Messaging} instance.\n * @param nextOrObserver - This function, or observer object with `next` defined,\n * is called when a message is received and the user is currently viewing your page.\n * @returns To stop listening for messages execute this returned function.\n *\n * @public\n */\nfunction onMessage(messaging, nextOrObserver) {\n messaging = getModularInstance(messaging);\n return onMessage$1(messaging, nextOrObserver);\n}\n/**\n * Registers the app instance with FCM using its Firebase Installation ID (FID). The FID is\n * delivered via the {@link onRegistered} callback, not as a return value. Call this to establish\n * an FID-based identity; once {@link onRegistered} provides an FID, instruct your backend to\n * remove any legacy token previously associated with this instance. The backend send API\n * supports FID as a target.\n *\n * @param messaging - The {@link Messaging} instance.\n * @param options - Optional. VAPID key and/or service worker registration (same as getToken).\n * @returns Promise that resolves when registration has been initiated; FID is delivered via onRegistered.\n *\n * @public\n */\nasync function register(messaging, options) {\n messaging = getModularInstance(messaging);\n return register$1(messaging, options);\n}\n/**\n * Unregisters the app instance from FCM by deleting its FID-based registration.\n * On success, triggers {@link onUnregistered} (if registered) with the unregistered FID.\n *\n * @param messaging - The {@link Messaging} instance.\n *\n * @public\n */\nasync function unregister(messaging) {\n messaging = getModularInstance(messaging);\n return unregister$1(messaging);\n}\n/**\n * Subscribes to an event that the app instance is registered with FCM via Firebase Installation ID (FID).\n * Use the FID passed to the callback to upload it to your application server. When you receive an FID\n * after calling {@link register}, instruct your backend to remove any legacy token for this instance.\n *\n * @param messaging - The {@link Messaging} instance.\n * @param nextOrObserver - A function or observer object called when an FID is registered.\n * @returns Unsubscribe function to stop listening.\n *\n * @public\n */\nfunction onRegistered(messaging, nextOrObserver) {\n messaging = getModularInstance(messaging);\n return onRegistered$1(messaging, nextOrObserver);\n}\n/**\n * Subscribes to an event that the app instance is unregistered from FCM (FID no longer active).\n * Use this to notify your backend to remove this FID to prevent 404 errors on send.\n *\n * @param messaging - The {@link Messaging} instance.\n * @param nextOrObserver - A function or observer object called with the unregistered FID.\n * @returns Unsubscribe function to stop listening.\n *\n * @public\n */\nfunction onUnregistered(messaging, nextOrObserver) {\n messaging = getModularInstance(messaging);\n return onUnregistered$1(messaging, nextOrObserver);\n}\n\n/**\n * The Firebase Cloud Messaging Web SDK.\n * This SDK does not work in a Node.js environment.\n *\n * @packageDocumentation\n */\nregisterMessagingInWindow();\n\nexport { deleteToken, getMessagingInWindow as getMessaging, getToken, isWindowSupported as isSupported, onMessage, onRegistered, onUnregistered, register, unregister };\n//# sourceMappingURL=index.esm.js.map\n","const getDefaultsFromPostinstall = () => (undefined);\nexport { getDefaultsFromPostinstall };","import { registerVersion } from '@firebase/app';\nexport * from '@firebase/app';\n\nvar name = \"firebase\";\nvar version = \"12.15.0\";\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nregisterVersion(name, version, 'app');\n//# sourceMappingURL=index.esm.js.map\n","export * from '@firebase/messaging';\n//# sourceMappingURL=index.esm.js.map\n","import { w as wrap, r as replaceTraps } from './wrap-idb-value.js';\nexport { u as unwrap, w as wrap } from './wrap-idb-value.js';\n\n/**\n * Open a database.\n *\n * @param name Name of the database.\n * @param version Schema version.\n * @param callbacks Additional callbacks.\n */\nfunction openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {\n const request = indexedDB.open(name, version);\n const openPromise = wrap(request);\n if (upgrade) {\n request.addEventListener('upgradeneeded', (event) => {\n upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction), event);\n });\n }\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event.newVersion, event));\n }\n openPromise\n .then((db) => {\n if (terminated)\n db.addEventListener('close', () => terminated());\n if (blocking) {\n db.addEventListener('versionchange', (event) => blocking(event.oldVersion, event.newVersion, event));\n }\n })\n .catch(() => { });\n return openPromise;\n}\n/**\n * Delete a database.\n *\n * @param name Name of the database.\n */\nfunction deleteDB(name, { blocked } = {}) {\n const request = indexedDB.deleteDatabase(name);\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event));\n }\n return wrap(request).then(() => undefined);\n}\n\nconst readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'];\nconst writeMethods = ['put', 'add', 'delete', 'clear'];\nconst cachedMethods = new Map();\nfunction getMethod(target, prop) {\n if (!(target instanceof IDBDatabase &&\n !(prop in target) &&\n typeof prop === 'string')) {\n return;\n }\n if (cachedMethods.get(prop))\n return cachedMethods.get(prop);\n const targetFuncName = prop.replace(/FromIndex$/, '');\n const useIndex = prop !== targetFuncName;\n const isWrite = writeMethods.includes(targetFuncName);\n if (\n // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.\n !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) ||\n !(isWrite || readMethods.includes(targetFuncName))) {\n return;\n }\n const method = async function (storeName, ...args) {\n // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :(\n const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly');\n let target = tx.store;\n if (useIndex)\n target = target.index(args.shift());\n // Must reject if op rejects.\n // If it's a write operation, must reject if tx.done rejects.\n // Must reject with op rejection first.\n // Must resolve with op value.\n // Must handle both promises (no unhandled rejections)\n return (await Promise.all([\n target[targetFuncName](...args),\n isWrite && tx.done,\n ]))[0];\n };\n cachedMethods.set(prop, method);\n return method;\n}\nreplaceTraps((oldTraps) => ({\n ...oldTraps,\n get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),\n has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop),\n}));\n\nexport { deleteDB, openDB };\n","const instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);\n\nlet idbProxyableTypes;\nlet cursorAdvanceMethods;\n// This is a function to prevent it throwing up in node environments.\nfunction getIdbProxyableTypes() {\n return (idbProxyableTypes ||\n (idbProxyableTypes = [\n IDBDatabase,\n IDBObjectStore,\n IDBIndex,\n IDBCursor,\n IDBTransaction,\n ]));\n}\n// This is a function to prevent it throwing up in node environments.\nfunction getCursorAdvanceMethods() {\n return (cursorAdvanceMethods ||\n (cursorAdvanceMethods = [\n IDBCursor.prototype.advance,\n IDBCursor.prototype.continue,\n IDBCursor.prototype.continuePrimaryKey,\n ]));\n}\nconst cursorRequestMap = new WeakMap();\nconst transactionDoneMap = new WeakMap();\nconst transactionStoreNamesMap = new WeakMap();\nconst transformCache = new WeakMap();\nconst reverseTransformCache = new WeakMap();\nfunction promisifyRequest(request) {\n const promise = new Promise((resolve, reject) => {\n const unlisten = () => {\n request.removeEventListener('success', success);\n request.removeEventListener('error', error);\n };\n const success = () => {\n resolve(wrap(request.result));\n unlisten();\n };\n const error = () => {\n reject(request.error);\n unlisten();\n };\n request.addEventListener('success', success);\n request.addEventListener('error', error);\n });\n promise\n .then((value) => {\n // Since cursoring reuses the IDBRequest (*sigh*), we cache it for later retrieval\n // (see wrapFunction).\n if (value instanceof IDBCursor) {\n cursorRequestMap.set(value, request);\n }\n // Catching to avoid \"Uncaught Promise exceptions\"\n })\n .catch(() => { });\n // This mapping exists in reverseTransformCache but doesn't doesn't exist in transformCache. This\n // is because we create many promises from a single IDBRequest.\n reverseTransformCache.set(promise, request);\n return promise;\n}\nfunction cacheDonePromiseForTransaction(tx) {\n // Early bail if we've already created a done promise for this transaction.\n if (transactionDoneMap.has(tx))\n return;\n const done = new Promise((resolve, reject) => {\n const unlisten = () => {\n tx.removeEventListener('complete', complete);\n tx.removeEventListener('error', error);\n tx.removeEventListener('abort', error);\n };\n const complete = () => {\n resolve();\n unlisten();\n };\n const error = () => {\n reject(tx.error || new DOMException('AbortError', 'AbortError'));\n unlisten();\n };\n tx.addEventListener('complete', complete);\n tx.addEventListener('error', error);\n tx.addEventListener('abort', error);\n });\n // Cache it for later retrieval.\n transactionDoneMap.set(tx, done);\n}\nlet idbProxyTraps = {\n get(target, prop, receiver) {\n if (target instanceof IDBTransaction) {\n // Special handling for transaction.done.\n if (prop === 'done')\n return transactionDoneMap.get(target);\n // Polyfill for objectStoreNames because of Edge.\n if (prop === 'objectStoreNames') {\n return target.objectStoreNames || transactionStoreNamesMap.get(target);\n }\n // Make tx.store return the only store in the transaction, or undefined if there are many.\n if (prop === 'store') {\n return receiver.objectStoreNames[1]\n ? undefined\n : receiver.objectStore(receiver.objectStoreNames[0]);\n }\n }\n // Else transform whatever we get back.\n return wrap(target[prop]);\n },\n set(target, prop, value) {\n target[prop] = value;\n return true;\n },\n has(target, prop) {\n if (target instanceof IDBTransaction &&\n (prop === 'done' || prop === 'store')) {\n return true;\n }\n return prop in target;\n },\n};\nfunction replaceTraps(callback) {\n idbProxyTraps = callback(idbProxyTraps);\n}\nfunction wrapFunction(func) {\n // Due to expected object equality (which is enforced by the caching in `wrap`), we\n // only create one new func per func.\n // Edge doesn't support objectStoreNames (booo), so we polyfill it here.\n if (func === IDBDatabase.prototype.transaction &&\n !('objectStoreNames' in IDBTransaction.prototype)) {\n return function (storeNames, ...args) {\n const tx = func.call(unwrap(this), storeNames, ...args);\n transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);\n return wrap(tx);\n };\n }\n // Cursor methods are special, as the behaviour is a little more different to standard IDB. In\n // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the\n // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense\n // with real promises, so each advance methods returns a new promise for the cursor object, or\n // undefined if the end of the cursor has been reached.\n if (getCursorAdvanceMethods().includes(func)) {\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n func.apply(unwrap(this), args);\n return wrap(cursorRequestMap.get(this));\n };\n }\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n return wrap(func.apply(unwrap(this), args));\n };\n}\nfunction transformCachableValue(value) {\n if (typeof value === 'function')\n return wrapFunction(value);\n // This doesn't return, it just creates a 'done' promise for the transaction,\n // which is later returned for transaction.done (see idbObjectHandler).\n if (value instanceof IDBTransaction)\n cacheDonePromiseForTransaction(value);\n if (instanceOfAny(value, getIdbProxyableTypes()))\n return new Proxy(value, idbProxyTraps);\n // Return the same value back if we're not going to transform it.\n return value;\n}\nfunction wrap(value) {\n // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because\n // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached.\n if (value instanceof IDBRequest)\n return promisifyRequest(value);\n // If we've already transformed this value before, reuse the transformed value.\n // This is faster, but it also provides object equality.\n if (transformCache.has(value))\n return transformCache.get(value);\n const newValue = transformCachableValue(value);\n // Not all types are transformed.\n // These may be primitive types, so they can't be WeakMap keys.\n if (newValue !== value) {\n transformCache.set(value, newValue);\n reverseTransformCache.set(newValue, value);\n }\n return newValue;\n}\nconst unwrap = (value) => reverseTransformCache.get(value);\n\nexport { reverseTransformCache as a, instanceOfAny as i, replaceTraps as r, unwrap as u, wrap as w };\n","const DoubleUnicodePrefixReg = /^[\\uD800-\\uDBFF]$/;\r\nconst DoubleUnicodeSuffixReg = /^[\\uDC00-\\uDFFF]$/;\r\nconst DoubleUnicodeReg = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\r\nvar Probability;\r\n(function (Probability) {\r\n Probability[Probability[\"Unknown\"] = 1e-13] = \"Unknown\";\r\n Probability[Probability[\"Rule\"] = 1e-12] = \"Rule\";\r\n Probability[Probability[\"DICT\"] = 2e-8] = \"DICT\";\r\n Probability[Probability[\"Surname\"] = 1] = \"Surname\";\r\n Probability[Probability[\"Custom\"] = 1] = \"Custom\";\r\n})(Probability || (Probability = {}));\r\nconst Priority = {\r\n Normal: 1,\r\n Surname: 10,\r\n Custom: 100,\r\n};\n\nexport { DoubleUnicodePrefixReg, DoubleUnicodeReg, DoubleUnicodeSuffixReg, Priority, Probability };\n","import { PatternsNormal } from '../../data/patterns.mjs';\nexport { PatternsNormal } from '../../data/patterns.mjs';\nimport { maxProbability } from './max-probability.mjs';\nimport { minTokenization } from './min-tokenization.mjs';\nimport { reverseMaxMatch } from './reverse-max-match.mjs';\nimport { Priority } from '../constant.mjs';\nimport { splitString } from '../utils.mjs';\n\nvar TokenizationAlgorithm;\r\n(function (TokenizationAlgorithm) {\r\n TokenizationAlgorithm[TokenizationAlgorithm[\"ReverseMaxMatch\"] = 1] = \"ReverseMaxMatch\";\r\n TokenizationAlgorithm[TokenizationAlgorithm[\"MaxProbability\"] = 2] = \"MaxProbability\";\r\n TokenizationAlgorithm[TokenizationAlgorithm[\"MinTokenization\"] = 3] = \"MinTokenization\";\r\n})(TokenizationAlgorithm || (TokenizationAlgorithm = {}));\r\nclass TrieNode {\r\n constructor(parent, key = \"\") {\r\n this.children = new Map();\r\n this.fail = null;\r\n this.patterns = [];\r\n this.parent = parent;\r\n this.key = key;\r\n }\r\n}\r\nclass AC {\r\n constructor() {\r\n this.dictMap = new Map();\r\n this.queues = [];\r\n this.root = new TrieNode(null);\r\n }\r\n build(patternList) {\r\n this.buildTrie(patternList);\r\n this.buildFailPointer();\r\n }\r\n // 构建 trie 树\r\n buildTrie(patternList) {\r\n for (let pattern of patternList) {\r\n const zhChars = splitString(pattern.zh);\r\n let cur = this.root;\r\n for (let i = 0; i < zhChars.length; i++) {\r\n let c = zhChars[i];\r\n if (!cur.children.has(c)) {\r\n const trieNode = new TrieNode(cur, c);\r\n cur.children.set(c, trieNode);\r\n this.addNodeToQueues(trieNode, i + 1);\r\n }\r\n cur = cur.children.get(c);\r\n }\r\n this.insertPattern(cur.patterns, pattern);\r\n pattern.node = cur;\r\n this.addPatternToDictMap(pattern);\r\n }\r\n }\r\n // 构建失败指针\r\n buildFailPointer() {\r\n let queue = [];\r\n let queueIndex = 0;\r\n this.queues.forEach((_queue) => {\r\n queue = queue.concat(_queue);\r\n });\r\n this.queues = [];\r\n while (queue.length > queueIndex) {\r\n let node = queue[queueIndex++];\r\n let failNode = node.parent && node.parent.fail;\r\n let key = node.key;\r\n while (failNode && !failNode.children.has(key)) {\r\n failNode = failNode.fail;\r\n }\r\n if (!failNode) {\r\n node.fail = this.root;\r\n }\r\n else {\r\n node.fail = failNode.children.get(key);\r\n }\r\n }\r\n }\r\n // 将 pattern 添加到 dictMap 中\r\n addPatternToDictMap(pattern) {\r\n if (!this.dictMap.has(pattern.dict)) {\r\n this.dictMap.set(pattern.dict, new Set());\r\n }\r\n this.dictMap.get(pattern.dict).add(pattern);\r\n }\r\n addNodeToQueues(trieNode, depth) {\r\n if (!this.queues[depth]) {\r\n this.queues[depth] = [];\r\n }\r\n this.queues[depth].push(trieNode);\r\n }\r\n // 按照优先级插入 pattern\r\n insertPattern(patterns, pattern) {\r\n for (let i = patterns.length - 1; i >= 0; i--) {\r\n const _pattern = patterns[i];\r\n if (pattern.priority === _pattern.priority &&\r\n pattern.probability >= _pattern.probability) {\r\n patterns[i + 1] = _pattern;\r\n }\r\n else if (pattern.priority > _pattern.priority) {\r\n patterns[i + 1] = _pattern;\r\n }\r\n else {\r\n patterns[i + 1] = pattern;\r\n return;\r\n }\r\n }\r\n patterns[0] = pattern;\r\n }\r\n removeDict(dictName) {\r\n if (this.dictMap.has(dictName)) {\r\n const set = this.dictMap.get(dictName);\r\n set.forEach((pattern) => {\r\n pattern.node.patterns = pattern.node.patterns.filter((_pattern) => _pattern !== pattern);\r\n });\r\n this.dictMap.delete(dictName);\r\n }\r\n }\r\n // 搜索字符串返回匹配的模式串\r\n match(text, surname, zhChars = splitString(text)) {\r\n let cur = this.root;\r\n let result = [];\r\n for (let i = 0; i < zhChars.length; i++) {\r\n let c = zhChars[i];\r\n let next = cur.children.size ? cur.children.get(c) : undefined;\r\n while (!next && cur !== this.root) {\r\n if (!cur.fail) {\r\n cur = this.root;\r\n break;\r\n }\r\n cur = cur.fail;\r\n next = cur.children.size ? cur.children.get(c) : undefined;\r\n }\r\n if (next) {\r\n cur = next;\r\n const pattern = cur.patterns.find((item) => {\r\n if (surname === \"off\") {\r\n return item.priority !== Priority.Surname;\r\n }\r\n else if (surname === \"head\") {\r\n return item.length - 1 - i === 0;\r\n }\r\n else {\r\n return true;\r\n }\r\n });\r\n if (pattern) {\r\n result.push(Object.assign(Object.assign({}, pattern), { index: i - pattern.length + 1 }));\r\n }\r\n let failNode = cur.fail;\r\n while (failNode !== null) {\r\n const pattern = failNode.patterns.find((item) => {\r\n if (surname === \"off\") {\r\n return item.priority !== Priority.Surname;\r\n }\r\n else if (surname === \"head\") {\r\n return item.length - 1 - i === 0;\r\n }\r\n else {\r\n return true;\r\n }\r\n });\r\n if (pattern) {\r\n result.push(Object.assign(Object.assign({}, pattern), { index: i - pattern.length + 1 }));\r\n }\r\n failNode = failNode.fail;\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n search(text, surname, algorithm = 2 /* TokenizationAlgorithm.MaxProbability */, zhChars = splitString(text)) {\r\n const patterns = this.match(text, surname, zhChars);\r\n if (algorithm === 1 /* TokenizationAlgorithm.ReverseMaxMatch */) {\r\n return reverseMaxMatch(patterns);\r\n }\r\n else if (algorithm === 3 /* TokenizationAlgorithm.MinTokenization */) {\r\n return minTokenization(patterns, zhChars.length);\r\n }\r\n return maxProbability(patterns, zhChars.length);\r\n }\r\n}\r\nlet acBuilt = false;\r\nconst acTree = new AC();\r\nfunction ensureAcBuilt() {\r\n if (!acBuilt) {\r\n acTree.build(PatternsNormal);\r\n acBuilt = true;\r\n }\r\n}\r\nfunction scheduleAcBuild() {\r\n if (typeof requestIdleCallback === \"function\") {\r\n requestIdleCallback(() => ensureAcBuilt());\r\n }\r\n else {\r\n setTimeout(ensureAcBuilt, 0);\r\n }\r\n}\r\nscheduleAcBuild();\n\nexport { AC, TokenizationAlgorithm, acTree, ensureAcBuilt, scheduleAcBuild };\n","import { Priority } from '../constant.mjs';\n\n// 根据 probability 和 decimal 获取两个概率中最大的\r\nfunction getMaxProbability(a, b) {\r\n if (!a) {\r\n return b;\r\n }\r\n if (a.decimal < b.decimal) {\r\n return a;\r\n }\r\n else if (a.decimal === b.decimal) {\r\n return a.probability > b.probability ? a : b;\r\n }\r\n else {\r\n return b;\r\n }\r\n}\r\n// probability 小于 1e-300 时,为防止小数溢出需要进位\r\nfunction checkDecimal(prob) {\r\n if (prob.probability < 1e-300) {\r\n prob.probability *= 1e300;\r\n prob.decimal += 1;\r\n }\r\n}\r\nfunction getPatternDecimal(pattern) {\r\n if (pattern.priority === Priority.Custom) {\r\n return -(pattern.length * pattern.length * 100);\r\n }\r\n if (pattern.priority === Priority.Surname) {\r\n return -(pattern.length * pattern.length * 10);\r\n }\r\n return 0;\r\n}\r\n// 最大概率算法\r\nfunction maxProbability(patterns, length) {\r\n const dp = [];\r\n const terminalDP = {\r\n probability: 1,\r\n decimal: 0,\r\n nextIndex: length,\r\n };\r\n let patternIndex = patterns.length - 1;\r\n let pattern = patterns[patternIndex];\r\n // 按照长度去除重叠词\r\n for (let i = length - 1; i >= 0; i--) {\r\n // suffix\r\n const suffixDP = i + 1 >= length ? terminalDP : dp[i + 1];\r\n const nextIndex = suffixDP.pattern ? i + 1 : suffixDP.nextIndex;\r\n while (pattern && pattern.index + pattern.length - 1 === i) {\r\n const startIndex = pattern.index;\r\n const curDP = {\r\n probability: pattern.probability * suffixDP.probability,\r\n decimal: suffixDP.decimal + getPatternDecimal(pattern),\r\n pattern,\r\n nextIndex,\r\n };\r\n checkDecimal(curDP);\r\n dp[startIndex] = getMaxProbability(dp[startIndex], curDP);\r\n pattern = patterns[--patternIndex];\r\n }\r\n // dp[i]\r\n const iDP = {\r\n probability: 1e-13 /* Probability.Unknown */ * suffixDP.probability,\r\n decimal: 0,\r\n nextIndex,\r\n };\r\n checkDecimal(iDP);\r\n dp[i] = getMaxProbability(dp[i], iDP);\r\n }\r\n const result = [];\r\n let index = 0;\r\n while (index < length) {\r\n const item = dp[index];\r\n if (item.pattern) {\r\n result.push(item.pattern);\r\n }\r\n index = item.nextIndex;\r\n }\r\n return result;\r\n}\n\nexport { maxProbability };\n","import { Priority } from '../constant.mjs';\n\n// 取最少分词数\r\nfunction getMinCount(a, b) {\r\n if (!a) {\r\n return b;\r\n }\r\n return a.count <= b.count ? a : b;\r\n}\r\nfunction getPatternCount(pattern) {\r\n if (pattern.priority === Priority.Custom) {\r\n return -(pattern.length * pattern.length * 100000);\r\n }\r\n if (pattern.priority === Priority.Surname) {\r\n return -(pattern.length * pattern.length * 100);\r\n }\r\n return 1;\r\n}\r\n// 最少分词算法\r\nfunction minTokenization(patterns, length) {\r\n const dp = [];\r\n let patternIndex = patterns.length - 1;\r\n let pattern = patterns[patternIndex];\r\n // 按照长度去除重叠词\r\n for (let i = length - 1; i >= 0; i--) {\r\n // suffix\r\n const suffixDP = i + 1 >= length\r\n ? { count: 0, patterns: [] }\r\n : dp[i + 1];\r\n while (pattern && pattern.index + pattern.length - 1 === i) {\r\n const startIndex = pattern.index;\r\n const curDP = {\r\n count: getPatternCount(pattern) + suffixDP.count,\r\n patterns: suffixDP.patterns,\r\n concatPattern: pattern\r\n };\r\n dp[startIndex] = getMinCount(dp[startIndex], curDP);\r\n pattern = patterns[--patternIndex];\r\n }\r\n // dp[i]\r\n const iDP = {\r\n count: 1 + suffixDP.count,\r\n patterns: suffixDP.patterns,\r\n };\r\n dp[i] = getMinCount(dp[i], iDP);\r\n if (dp[i].concatPattern) {\r\n dp[i].patterns = dp[i].patterns.concat(dp[i].concatPattern);\r\n dp[i].concatPattern = undefined;\r\n delete dp[i + 1];\r\n }\r\n }\r\n return dp[0].patterns.reverse();\r\n}\n\nexport { minTokenization };\n","// 判断 pre 是否可以被忽略的重叠词\r\nfunction isIgnorablePattern(cur, pre) {\r\n // 未重叠\r\n if (pre.index + pre.length <= cur.index) {\r\n return false;\r\n }\r\n if (pre.priority > cur.priority) {\r\n return false;\r\n }\r\n if (pre.priority === cur.priority && pre.length > cur.length) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n// 逆向最大匹配算法\r\nfunction reverseMaxMatch(patterns) {\r\n const filteredArr = [];\r\n // 按照长度去除重叠词\r\n for (let i = patterns.length - 1; i >= 0;) {\r\n const { index } = patterns[i];\r\n let j = i - 1;\r\n while (j >= 0 && isIgnorablePattern(patterns[i], patterns[j])) {\r\n j--;\r\n }\r\n if (j < 0 || patterns[j].index + patterns[j].length <= index) {\r\n filteredArr.push(patterns[i]);\r\n }\r\n i = j;\r\n }\r\n return filteredArr.reverse();\r\n}\n\nexport { reverseMaxMatch };\n","import { DoubleUnicodeReg, DoubleUnicodePrefixReg, DoubleUnicodeSuffixReg } from './constant.mjs';\n\nfunction stringLength(text) {\r\n var _a;\r\n return text.length - (((_a = text.match(DoubleUnicodeReg)) === null || _a === void 0 ? void 0 : _a.length) || 0);\r\n}\r\n// 双音节字符处理\r\nfunction splitString(text) {\r\n DoubleUnicodeReg.lastIndex = 0;\r\n if (!DoubleUnicodeReg.test(text)) {\r\n return text.split(\"\");\r\n }\r\n const result = [];\r\n let i = 0;\r\n while (i < text.length) {\r\n const char = text[i];\r\n if (DoubleUnicodePrefixReg.test(char) &&\r\n DoubleUnicodeSuffixReg.test(text[i + 1])) {\r\n result.push(text.substring(i, i + 2));\r\n i += 2;\r\n }\r\n else {\r\n result.push(char);\r\n i += 1;\r\n }\r\n }\r\n return result;\r\n}\r\nclass FastDictFactory {\r\n constructor() {\r\n this.NumberDICT = [];\r\n this.StringDICT = new Map();\r\n }\r\n get(word) {\r\n if (word.length > 1) {\r\n return this.StringDICT.get(word);\r\n }\r\n else {\r\n const code = word.charCodeAt(0);\r\n return this.NumberDICT[code];\r\n }\r\n }\r\n set(word, pinyin) {\r\n if (word.length > 1) {\r\n this.StringDICT.set(word, pinyin);\r\n }\r\n else {\r\n const code = word.charCodeAt(0);\r\n this.NumberDICT[code] = pinyin;\r\n }\r\n }\r\n clear() {\r\n this.NumberDICT = [];\r\n this.StringDICT.clear();\r\n }\r\n}\n\nexport { FastDictFactory, splitString, stringLength };\n","import { FastDictFactory } from '../../common/utils.mjs';\n\nconst customMultipleDict = new FastDictFactory();\r\nconst customPolyphonicDict = new FastDictFactory();\n\nexport { customMultipleDict, customPolyphonicDict };\n","import DICT1 from '../../data/dict1.mjs';\nimport { customMultipleDict } from '../custom/state.mjs';\nimport Surnames from '../../data/surname.mjs';\n\n/** 获取单字的全部拼音,供 pinyin、polyphonic 和 match 复用。 */\r\nconst getAllPinyin = (char, surname = \"off\") => {\r\n let pinyin = DICT1.get(char) ? DICT1.get(char).split(\" \") : [];\r\n if (customMultipleDict.get(char)) {\r\n pinyin = customMultipleDict.get(char).split(\" \");\r\n }\r\n else if (surname !== \"off\") {\r\n const surnamePinyin = Surnames[char];\r\n if (surnamePinyin) {\r\n pinyin = [surnamePinyin].concat(pinyin.filter((py) => py !== surnamePinyin));\r\n }\r\n }\r\n return pinyin;\r\n};\n\nexport { getAllPinyin };\n","import { InitialList, doubleFinalList, SpecialInitialList, SpecialFinalList, SpecialFinalMap, toneSandhiList, toneSandhiIgnoreSuffix, toneSandhiMap } from '../../data/special.mjs';\nimport DICT1 from '../../data/dict1.mjs';\nimport { getAllPinyin } from './all.mjs';\nexport { getAllPinyin } from './all.mjs';\nimport { ensureAcBuilt, acTree } from '../../common/segmentit/index.mjs';\nimport { Priority } from '../../common/constant.mjs';\nimport { splitString } from '../../common/utils.mjs';\nimport { getTraditionalDict } from '../traditional/index.mjs';\n\nconst getSingleWordPinyin = (char) => {\r\n const pinyin = DICT1.get(char);\r\n // 若查到, 则返回第一个拼音; 若未查到, 返回原字符\r\n if (!pinyin)\r\n return char;\r\n const index = pinyin.indexOf(\" \");\r\n return index === -1 ? pinyin : pinyin.slice(0, index);\r\n};\r\nconst getTraditionalWords = (word) => {\r\n const traditionalWords = [];\r\n const traditionalDict = getTraditionalDict();\r\n for (let i = 0; i < word.length; i++) {\r\n const key = word[i];\r\n const code = key.charCodeAt(0);\r\n if (traditionalDict[code]) {\r\n traditionalWords[i] = traditionalDict[code];\r\n }\r\n else {\r\n traditionalWords[i] = key;\r\n }\r\n }\r\n return traditionalWords.join(\"\");\r\n};\r\nconst getPinyin = (word, list, surname, segmentit, traditional, zhChars = splitString(word)) => {\r\n ensureAcBuilt();\r\n const searchWord = traditional ? getTraditionalWords(word) : word;\r\n const searchChars = traditional ? splitString(searchWord) : zhChars;\r\n const matches = acTree.search(searchWord, surname, segmentit, searchChars);\r\n let matchIndex = 0;\r\n const processFuncs = getProcessFuncs(word);\r\n for (let i = 0; i < zhChars.length;) {\r\n const match = matches[matchIndex];\r\n if (match && i === match.index) {\r\n if (match.length === 1 && match.priority <= Priority.Normal) {\r\n const char = zhChars[i];\r\n match.zh = char;\r\n let pinyin = \"\";\r\n pinyin = processSepecialPinyin(char, zhChars[i - 1], zhChars[i + 1], processFuncs);\r\n list[i] = {\r\n origin: char,\r\n result: pinyin,\r\n isZh: pinyin !== char,\r\n originPinyin: pinyin,\r\n };\r\n i++;\r\n matchIndex++;\r\n continue;\r\n }\r\n const pinyins = match.pinyin.split(\" \");\r\n let pinyinIndex = 0;\r\n if (traditional) {\r\n match.zh = zhChars\r\n .slice(match.index, match.index + match.length)\r\n .join(\"\");\r\n }\r\n for (let j = 0; j < match.length; j++) {\r\n list[i + j] = {\r\n origin: zhChars[j + match.index],\r\n result: pinyins[pinyinIndex] || \"\",\r\n isZh: true,\r\n originPinyin: pinyins[pinyinIndex] || \"\",\r\n };\r\n pinyinIndex++;\r\n }\r\n i += match.length;\r\n matchIndex++;\r\n }\r\n else {\r\n const char = zhChars[i];\r\n let pinyin = \"\";\r\n pinyin = processSepecialPinyin(char, zhChars[i - 1], zhChars[i + 1], processFuncs);\r\n list[i] = {\r\n origin: char,\r\n result: pinyin,\r\n isZh: pinyin !== char,\r\n originPinyin: pinyin,\r\n };\r\n i++;\r\n }\r\n }\r\n return { list, matches };\r\n};\r\nconst getPinyinWithoutTone = (pinyin) => {\r\n return pinyin\r\n .replace(/(ā|á|ǎ|à)/g, \"a\")\r\n .replace(/(ō|ó|ǒ|ò)/g, \"o\")\r\n .replace(/(ē|é|ě|è)/g, \"e\")\r\n .replace(/(ī|í|ǐ|ì)/g, \"i\")\r\n .replace(/(ū|ú|ǔ|ù)/g, \"u\")\r\n .replace(/(ǖ|ǘ|ǚ|ǜ)/g, \"ü\")\r\n .replace(/(n̄|ń|ň|ǹ)/g, \"n\")\r\n .replace(/(m̄|ḿ|m̌|m̀)/g, \"m\")\r\n .replace(/(ê̄|ế|ê̌|ề)/g, \"ê\");\r\n};\r\nconst getMultiplePinyin = (word, surname = \"off\") => {\r\n let pinyin = getAllPinyin(word, surname);\r\n if (pinyin.length > 0) {\r\n return pinyin.map((value) => ({\r\n origin: word,\r\n result: value,\r\n isZh: true,\r\n originPinyin: value,\r\n }));\r\n }\r\n else {\r\n return [\r\n {\r\n origin: word,\r\n result: word,\r\n isZh: false,\r\n originPinyin: word,\r\n },\r\n ];\r\n }\r\n};\r\nconst getInitialAndFinal = (pinyin, initialPattern) => {\r\n const pinyin_arr = pinyin.split(\" \");\r\n const initial_arr = [];\r\n const final_arr = [];\r\n for (let _pinyin of pinyin_arr) {\r\n for (let _initial of InitialList) {\r\n if (_pinyin.startsWith(_initial)) {\r\n let _final = _pinyin.slice(_initial.length);\r\n if (SpecialInitialList.indexOf(_initial) !== -1 &&\r\n SpecialFinalList.indexOf(_final) !== -1) {\r\n // 针对 jqx 的 u 特殊处理\r\n _final = SpecialFinalMap[_final];\r\n }\r\n initial_arr.push(_initial);\r\n final_arr.push(_final);\r\n break;\r\n }\r\n }\r\n }\r\n if (initialPattern === \"standard\") {\r\n initial_arr.forEach((initial, index) => {\r\n if (initial === \"y\" || initial === \"w\") {\r\n initial_arr[index] = \"\";\r\n }\r\n });\r\n }\r\n return {\r\n final: final_arr.join(\" \"),\r\n initial: initial_arr.join(\" \"), // 声母\r\n };\r\n};\r\nfunction getFinalPartsFromFinal(final) {\r\n let head = \"\", body = \"\", tail = \"\";\r\n if (doubleFinalList.indexOf(getPinyinWithoutTone(final)) !== -1) {\r\n head = final[0];\r\n body = final[1];\r\n tail = final.slice(2);\r\n }\r\n else {\r\n body = final[0] || \"\";\r\n tail = final.slice(1) || \"\";\r\n }\r\n return { head, body, tail };\r\n}\r\nconst getFinalParts = (pinyin) => {\r\n const { final } = getInitialAndFinal(pinyin);\r\n return getFinalPartsFromFinal(final);\r\n};\r\nconst getNumOfTone = (pinyin) => {\r\n const reg_tone1 = /(ā|ō|ē|ī|ū|ǖ|n̄|m̄|ê̄)/;\r\n const reg_tone2 = /(á|ó|é|í|ú|ǘ|ń|ḿ|ế)/;\r\n const reg_tone3 = /(ǎ|ǒ|ě|ǐ|ǔ|ǚ|ň|m̌|ê̌)/;\r\n const reg_tone4 = /(à|ò|è|ì|ù|ǜ|ǹ|m̀|ề)/;\r\n const reg_tone0 = /(a|o|e|i|u|ü|ê)/;\r\n const special_tone = /(n|m)$/;\r\n const tone_num_arr = [];\r\n const pinyin_arr = pinyin.split(\" \");\r\n pinyin_arr.forEach((_pinyin) => {\r\n if (reg_tone1.test(_pinyin)) {\r\n tone_num_arr.push(\"1\");\r\n }\r\n else if (reg_tone2.test(_pinyin)) {\r\n tone_num_arr.push(\"2\");\r\n }\r\n else if (reg_tone3.test(_pinyin)) {\r\n tone_num_arr.push(\"3\");\r\n }\r\n else if (reg_tone4.test(_pinyin)) {\r\n tone_num_arr.push(\"4\");\r\n }\r\n else if (reg_tone0.test(_pinyin)) {\r\n tone_num_arr.push(\"0\");\r\n }\r\n else if (special_tone.test(_pinyin)) {\r\n tone_num_arr.push(\"0\");\r\n }\r\n else {\r\n tone_num_arr.push(\"\");\r\n }\r\n });\r\n return tone_num_arr.join(\" \");\r\n};\r\nconst getPinyinWithNum = (pinyin, originPinyin) => {\r\n const pinyin_arr = getPinyinWithoutTone(pinyin).split(\" \");\r\n const tone_num_arr = getNumOfTone(originPinyin).split(\" \");\r\n const res_arr = [];\r\n pinyin_arr.forEach((item, index) => {\r\n res_arr.push(`${item}${tone_num_arr[index]}`);\r\n });\r\n return res_arr.join(\" \");\r\n};\r\nconst getFirstLetter = (pinyin, isZh) => {\r\n const first_letter_arr = [];\r\n const pinyin_arr = pinyin.split(\" \");\r\n pinyin_arr.forEach((pinyin) => {\r\n first_letter_arr.push(isZh ? pinyin[0] : pinyin);\r\n });\r\n return first_letter_arr.join(\" \");\r\n};\r\n// 处理「一」和 「不」字的变调\r\nfunction processToneSandhi(cur, pre, next) {\r\n if (toneSandhiList.indexOf(cur) === -1) {\r\n return getSingleWordPinyin(cur);\r\n }\r\n // 轻声变调:说不说,说一说,叠词之间发音为轻声\r\n if (pre === next && pre && getSingleWordPinyin(pre) !== pre) {\r\n return getPinyinWithoutTone(getSingleWordPinyin(cur));\r\n }\r\n // 「一」和 「不」字变调处理\r\n if (next &&\r\n !toneSandhiIgnoreSuffix[cur].includes(next)) {\r\n const nextPinyin = getSingleWordPinyin(next);\r\n if (nextPinyin !== next) {\r\n const nextTone = getNumOfTone(nextPinyin);\r\n const pinyinMap = toneSandhiMap[cur];\r\n for (let pinyin in pinyinMap) {\r\n const tones = pinyinMap[pinyin];\r\n if (tones.indexOf(Number(nextTone)) !== -1) {\r\n return pinyin;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n// 处理「了」字的变调\r\nfunction processToneSandhiLiao(cur, pre, _) {\r\n if (cur === \"了\" && (!pre || !DICT1.get(pre))) {\r\n return \"liǎo\";\r\n }\r\n}\r\n// 处理叠字符[々]\r\nfunction processReduplicationChar(cur, pre, _) {\r\n if (cur === \"々\") {\r\n if (!pre || !DICT1.get(pre)) {\r\n return \"tóng\";\r\n }\r\n else {\r\n return DICT1.get(pre).split(\" \")[0];\r\n }\r\n }\r\n}\r\nfunction getProcessFuncs(text) {\r\n const processes = [];\r\n if (text.includes(\"々\")) {\r\n processes.push(processReduplicationChar);\r\n }\r\n processes.push(processToneSandhiLiao);\r\n processes.push(processToneSandhi);\r\n return processes;\r\n}\r\nfunction processSepecialPinyin(cur, pre, next, funcs) {\r\n for (let func of funcs) {\r\n const res = func(cur, pre, next);\r\n if (res) {\r\n return res;\r\n }\r\n }\r\n return getSingleWordPinyin(cur);\r\n}\n\nexport { getFinalParts, getFinalPartsFromFinal, getFirstLetter, getInitialAndFinal, getMultiplePinyin, getNumOfTone, getPinyin, getPinyinWithNum, getPinyinWithoutTone, getSingleWordPinyin, processToneSandhi };\n","import { splitString } from '../../common/utils.mjs';\nimport { getPinyin } from './handle.mjs';\nimport { validateType, middlewareToneSandhi, middleWareNonZh, middlewareMultiple, middlewarePattern, middlewareToneType, middlewareV, middlewareType } from './middlewares.mjs';\n\nconst DEFAULT_OPTIONS = {\r\n pattern: \"pinyin\",\r\n toneType: \"symbol\",\r\n type: \"string\",\r\n multiple: false,\r\n mode: \"normal\",\r\n removeNonZh: false,\r\n nonZh: \"spaced\",\r\n v: false,\r\n separator: \" \",\r\n toneSandhi: true,\r\n segmentit: 2 /* TokenizationAlgorithm.MaxProbability */,\r\n};\r\n/**\r\n * @description: 获取汉语字符串的拼音\r\n * @param {string} word 要转换的汉语字符串\r\n * @param {CompleteOptions=} options 配置项\r\n * @return {string | string[] | AllData[]} options.type 为 string 时,返回字符串,中间用空格隔开;为 array 时,返回拼音字符串数组;为 all 时返回全部信息的数组\r\n */\r\nfunction pinyin(word, options) {\r\n options = Object.assign(Object.assign({}, DEFAULT_OPTIONS), (options || {}));\r\n // 校验 word 类型是否正确\r\n const legal = validateType(word);\r\n if (!legal) {\r\n return word;\r\n }\r\n // 传入空字符串\r\n if (word === \"\") {\r\n return options.type === \"array\" || options.type === \"all\" ? [] : \"\";\r\n }\r\n if (options.surname === undefined) {\r\n if (options.mode === \"surname\") {\r\n options.surname = \"all\";\r\n }\r\n else {\r\n options.surname = \"off\";\r\n }\r\n }\r\n if (options.type === \"all\") {\r\n options.pattern = \"pinyin\";\r\n }\r\n if (options.pattern === \"num\") {\r\n options.toneType = \"none\";\r\n }\r\n if (options.removeNonZh) {\r\n options.nonZh = \"removed\";\r\n }\r\n const zhChars = splitString(word);\r\n let _list = Array(zhChars.length);\r\n let { list } = getPinyin(word, _list, options.surname, options.segmentit, options.traditional, zhChars);\r\n // 一和不变调处理\r\n list = middlewareToneSandhi(list, options.toneSandhi);\r\n // nonZh 参数及 removeNonZh 参数\r\n list = middleWareNonZh(list, options);\r\n // multiple 参数\r\n const multipleList = middlewareMultiple(word, options);\r\n if (multipleList) {\r\n list = multipleList;\r\n }\r\n // pattern 参数\r\n middlewarePattern(list, options);\r\n // toneType参数处理\r\n middlewareToneType(list, options);\r\n // v参数处理\r\n middlewareV(list, options);\r\n // type 参数处理\r\n return middlewareType(list, options, word);\r\n}\n\nexport { pinyin };\n","import { stringLength } from '../../common/utils.mjs';\nimport { getMultiplePinyin, getFinalParts, getFirstLetter, getInitialAndFinal, getNumOfTone, getPinyinWithNum, getPinyinWithoutTone, getFinalPartsFromFinal } from './handle.mjs';\nimport DICT1 from '../../data/dict1.mjs';\nimport { getAllPinyin } from './all.mjs';\n\n// 验证输入是否为字符串\r\nconst validateType = (word) => {\r\n if (typeof word !== \"string\") {\r\n console.error(\"The first param of pinyin is error: \" +\r\n word +\r\n ' is not assignable to type \"string\".');\r\n return false;\r\n }\r\n else {\r\n return true;\r\n }\r\n};\r\nfunction isNonZhScope(char, scope) {\r\n if (scope instanceof RegExp) {\r\n // Global and sticky regexes retain lastIndex between calls.\r\n if (scope.global || scope.sticky) {\r\n scope.lastIndex = 0;\r\n }\r\n return scope.test(char);\r\n }\r\n return true;\r\n}\r\n// nonZh 属性处理\r\nconst middleWareNonZh = (list, options) => {\r\n let nonZh = options.nonZh;\r\n if (nonZh === \"removed\") {\r\n return list.filter((item) => item.isZh || !isNonZhScope(item.origin, options.nonZhScope));\r\n }\r\n else if (nonZh === \"consecutive\") {\r\n for (let i = list.length - 2; i >= 0; i--) {\r\n const cur = list[i];\r\n const pre = list[i + 1];\r\n if (!cur.isZh &&\r\n !pre.isZh &&\r\n isNonZhScope(cur.origin, options.nonZhScope) &&\r\n isNonZhScope(pre.origin, options.nonZhScope)) {\r\n cur.origin += pre.origin;\r\n cur.result += pre.result;\r\n pre.delete = true;\r\n }\r\n }\r\n return list.filter((item) => !item.delete);\r\n }\r\n else {\r\n return list;\r\n }\r\n};\r\n// multiple 属性处理\r\nconst middlewareMultiple = (word, options) => {\r\n if (options.multiple && stringLength(word) === 1) {\r\n return getMultiplePinyin(word, options.surname);\r\n }\r\n else {\r\n return false;\r\n }\r\n};\r\n// pattern 属性处理\r\nconst middlewarePattern = (list, options) => {\r\n switch (options.pattern) {\r\n case \"pinyin\":\r\n break;\r\n case \"num\":\r\n list.forEach((item) => {\r\n item.result = item.isZh ? getNumOfTone(item.result) : \"\";\r\n });\r\n break;\r\n case \"initial\":\r\n list.forEach((item) => {\r\n item.result = item.isZh\r\n ? getInitialAndFinal(item.result, options.initialPattern).initial\r\n : \"\";\r\n });\r\n break;\r\n case \"final\":\r\n list.forEach((item) => {\r\n item.result = item.isZh\r\n ? getInitialAndFinal(item.result, options.initialPattern).final\r\n : \"\";\r\n });\r\n break;\r\n case \"first\":\r\n list.forEach((item) => {\r\n item.result = getFirstLetter(item.result, item.isZh);\r\n });\r\n break;\r\n case \"finalHead\":\r\n list.forEach((item) => {\r\n item.result = item.isZh ? getFinalParts(item.result).head : \"\";\r\n });\r\n break;\r\n case \"finalBody\":\r\n list.forEach((item) => {\r\n item.result = item.isZh ? getFinalParts(item.result).body : \"\";\r\n });\r\n break;\r\n case \"finalTail\":\r\n list.forEach((item) => {\r\n item.result = item.isZh ? getFinalParts(item.result).tail : \"\";\r\n });\r\n break;\r\n }\r\n};\r\n// toneType 属性处理\r\nconst middlewareToneType = (list, options) => {\r\n switch (options.toneType) {\r\n case \"symbol\":\r\n break;\r\n case \"none\":\r\n list.forEach((item) => {\r\n if (item.isZh) {\r\n item.result = getPinyinWithoutTone(item.result);\r\n }\r\n });\r\n break;\r\n case \"num\": {\r\n list.forEach((item) => {\r\n if (item.isZh) {\r\n item.result = getPinyinWithNum(item.result, item.originPinyin);\r\n }\r\n });\r\n break;\r\n }\r\n }\r\n};\r\n// v 属性处理\r\nconst middlewareV = (list, options) => {\r\n if (options.v) {\r\n list.forEach((item) => {\r\n if (item.isZh) {\r\n item.result = item.result.replace(/ü/g, typeof options.v === \"string\" ? options.v : \"v\");\r\n }\r\n });\r\n }\r\n};\r\n// type 属性处理\r\nconst middlewareType = (list, options, word) => {\r\n if (options.multiple && stringLength(word) === 1) {\r\n let last = \"\";\r\n list = list.filter((item) => {\r\n const res = item.result !== last;\r\n last = item.result;\r\n return res;\r\n });\r\n }\r\n if (options.type === \"array\") {\r\n return list.map((item) => item.result);\r\n }\r\n if (options.type === \"all\") {\r\n return list.map((item) => {\r\n const pinyin = item.isZh ? item.result : \"\";\r\n const { initial, final } = getInitialAndFinal(pinyin, options.initialPattern);\r\n const { head, body, tail } = getFinalPartsFromFinal(final);\r\n let polyphonic = [];\r\n if (pinyin !== \"\") {\r\n polyphonic = [pinyin].concat(getAllPinyin(item.origin, options.surname).filter((item) => item !== pinyin));\r\n }\r\n return {\r\n origin: item.origin,\r\n pinyin,\r\n initial,\r\n final,\r\n first: getFirstLetter(item.result, item.isZh),\r\n finalHead: head,\r\n finalBody: body,\r\n finalTail: tail,\r\n num: Number(getNumOfTone(item.originPinyin)),\r\n isZh: item.isZh,\r\n polyphonic,\r\n inZhRange: !!DICT1.get(item.origin),\r\n result: item.result,\r\n };\r\n });\r\n }\r\n return list.map((item) => item.result).join(options.separator);\r\n};\r\n// 是否开启变调\r\nconst middlewareToneSandhi = (list, toneSandhi) => {\r\n if (toneSandhi === false) {\r\n list.forEach((item) => {\r\n if (item.origin === \"一\") {\r\n item.result = item.originPinyin = \"yī\";\r\n }\r\n else if (item.origin === \"不\") {\r\n item.result = item.originPinyin = \"bù\";\r\n }\r\n });\r\n }\r\n return list;\r\n};\n\nexport { isNonZhScope, middleWareNonZh, middlewareMultiple, middlewarePattern, middlewareToneSandhi, middlewareToneType, middlewareType, middlewareV, validateType };\n","const traditionalDict = [];\r\nfunction addTraditionalDict(dict) {\r\n for (let key in dict) {\r\n const value = dict[key];\r\n const code = key.charCodeAt(0);\r\n traditionalDict[code] = value;\r\n }\r\n}\r\nfunction getTraditionalDict() {\r\n return traditionalDict;\r\n}\n\nexport { addTraditionalDict, getTraditionalDict };\n","import { FastDictFactory } from '../common/utils.mjs';\n\nconst map = {\r\n 'bǎng páng pāng': ['膀'],\r\n líng: [\r\n '〇',\r\n '伶',\r\n '凌',\r\n '刢',\r\n '囹',\r\n '坽',\r\n '夌',\r\n '姈',\r\n '婈',\r\n '孁',\r\n '岺',\r\n '彾',\r\n '掕',\r\n '昤',\r\n '朎',\r\n '柃',\r\n '棂',\r\n '櫺',\r\n '欞',\r\n '泠',\r\n '淩',\r\n '澪',\r\n '灵',\r\n '燯',\r\n '爧',\r\n '狑',\r\n '玲',\r\n '琌',\r\n '瓴',\r\n '皊',\r\n '砱',\r\n '祾',\r\n '秢',\r\n '竛',\r\n '笭',\r\n '紷',\r\n '綾',\r\n '绫',\r\n '羐',\r\n '羚',\r\n '翎',\r\n '聆',\r\n '舲',\r\n '苓',\r\n '菱',\r\n '蓤',\r\n '蔆',\r\n '蕶',\r\n '蛉',\r\n '衑',\r\n '裬',\r\n '詅',\r\n '跉',\r\n '軨',\r\n '輘',\r\n '酃',\r\n '醽',\r\n '鈴',\r\n '錂',\r\n '铃',\r\n '閝',\r\n '陵',\r\n '零',\r\n '霊',\r\n '霗',\r\n '霛',\r\n '霝',\r\n '靈',\r\n '駖',\r\n '魿',\r\n '鯪',\r\n '鲮',\r\n '鴒',\r\n '鸰',\r\n '鹷',\r\n '麢',\r\n '齡',\r\n '齢',\r\n '龄',\r\n '龗',\r\n '㥄',\r\n ],\r\n yī: [\r\n '一',\r\n '乊',\r\n '伊',\r\n '依',\r\n '医',\r\n '吚',\r\n '咿',\r\n '噫',\r\n '壱',\r\n '壹',\r\n '夁',\r\n '嫛',\r\n '嬄',\r\n '弌',\r\n '揖',\r\n '撎',\r\n '檹',\r\n '毉',\r\n '洢',\r\n '渏',\r\n '漪',\r\n '瑿',\r\n '畩',\r\n '祎',\r\n '禕',\r\n '稦',\r\n '繄',\r\n '蛜',\r\n '衤',\r\n '譩',\r\n '辷',\r\n '郼',\r\n '醫',\r\n '銥',\r\n '铱',\r\n '鷖',\r\n '鹥',\r\n '黟',\r\n '黳',\r\n ],\r\n 'dīng zhēng': ['丁'],\r\n 'kǎo qiǎo yú': ['丂'],\r\n qī: [\r\n '七',\r\n '倛',\r\n '僛',\r\n '凄',\r\n '嘁',\r\n '墄',\r\n '娸',\r\n '悽',\r\n '慼',\r\n '慽',\r\n '戚',\r\n '捿',\r\n '柒',\r\n '桤',\r\n '桼',\r\n '棲',\r\n '榿',\r\n '欺',\r\n '沏',\r\n '淒',\r\n '漆',\r\n '紪',\r\n '緀',\r\n '萋',\r\n '褄',\r\n '諆',\r\n '迉',\r\n '郪',\r\n '鏚',\r\n '霋',\r\n '魌',\r\n '鶈',\r\n ],\r\n shàng: ['丄', '尙', '尚', '恦', '緔', '绱'],\r\n xià: [\r\n '丅',\r\n '下',\r\n '乤',\r\n '圷',\r\n '夏',\r\n '夓',\r\n '懗',\r\n '梺',\r\n '疜',\r\n '睱',\r\n '罅',\r\n '鎼',\r\n '鏬',\r\n ],\r\n hǎn: ['丆', '喊', '浫', '罕', '豃', '㘎'],\r\n 'wàn mò': ['万'],\r\n zhàng: [\r\n '丈',\r\n '仗',\r\n '墇',\r\n '嶂',\r\n '帐',\r\n '帳',\r\n '幛',\r\n '扙',\r\n '杖',\r\n '涱',\r\n '痮',\r\n '瘬',\r\n '瘴',\r\n '瞕',\r\n '粀',\r\n '胀',\r\n '脹',\r\n '賬',\r\n '账',\r\n '障',\r\n ],\r\n sān: ['三', '厁', '叁', '弎', '毵', '毶', '毿', '犙', '鬖'],\r\n 'shàng shǎng shang': ['上'],\r\n 'qí jī': ['丌', '其', '奇'],\r\n 'bù fǒu': ['不'],\r\n 'yǔ yù yú': ['与'],\r\n miǎn: [\r\n '丏',\r\n '偭',\r\n '免',\r\n '冕',\r\n '勉',\r\n '勔',\r\n '喕',\r\n '娩',\r\n '愐',\r\n '汅',\r\n '沔',\r\n '湎',\r\n '睌',\r\n '緬',\r\n '缅',\r\n '腼',\r\n '葂',\r\n '靦',\r\n '鮸',\r\n '𩾃',\r\n ],\r\n gài: [\r\n '丐',\r\n '乢',\r\n '匃',\r\n '匄',\r\n '戤',\r\n '概',\r\n '槩',\r\n '槪',\r\n '溉',\r\n '漑',\r\n '瓂',\r\n '葢',\r\n '鈣',\r\n '钙',\r\n '𬮿',\r\n ],\r\n chǒu: ['丑', '丒', '侴', '吜', '杽', '瞅', '矁', '醜', '魗'],\r\n zhuān: [\r\n '专',\r\n '叀',\r\n '嫥',\r\n '専',\r\n '專',\r\n '瑼',\r\n '甎',\r\n '砖',\r\n '磗',\r\n '磚',\r\n '蟤',\r\n '諯',\r\n '鄟',\r\n '顓',\r\n '颛',\r\n '鱄',\r\n '䏝',\r\n ],\r\n 'qiě jū': ['且'],\r\n pī: [\r\n '丕',\r\n '伓',\r\n '伾',\r\n '噼',\r\n '坯',\r\n '岯',\r\n '憵',\r\n '批',\r\n '披',\r\n '炋',\r\n '狉',\r\n '狓',\r\n '砒',\r\n '磇',\r\n '礔',\r\n '礕',\r\n '秛',\r\n '秠',\r\n '耚',\r\n '豾',\r\n '邳',\r\n '鈚',\r\n '鉟',\r\n '銔',\r\n '錃',\r\n '錍',\r\n '霹',\r\n '駓',\r\n '髬',\r\n '魾',\r\n '𬳵',\r\n ],\r\n shì: [\r\n '世',\r\n '丗',\r\n '亊',\r\n '事',\r\n '仕',\r\n '侍',\r\n '冟',\r\n '势',\r\n '勢',\r\n '卋',\r\n '呩',\r\n '嗜',\r\n '噬',\r\n '士',\r\n '奭',\r\n '嬕',\r\n '室',\r\n '市',\r\n '式',\r\n '弑',\r\n '弒',\r\n '恀',\r\n '恃',\r\n '戺',\r\n '拭',\r\n '揓',\r\n '是',\r\n '昰',\r\n '枾',\r\n '柿',\r\n '栻',\r\n '澨',\r\n '烒',\r\n '煶',\r\n '眂',\r\n '眎',\r\n '眡',\r\n '睗',\r\n '示',\r\n '礻',\r\n '筮',\r\n '簭',\r\n '舐',\r\n '舓',\r\n '襫',\r\n '視',\r\n '视',\r\n '觢',\r\n '試',\r\n '誓',\r\n '諡',\r\n '謚',\r\n '试',\r\n '谥',\r\n '貰',\r\n '贳',\r\n '軾',\r\n '轼',\r\n '逝',\r\n '遾',\r\n '釈',\r\n '释',\r\n '釋',\r\n '鈰',\r\n '鉃',\r\n '鉽',\r\n '铈',\r\n '飾',\r\n '餙',\r\n '餝',\r\n '饰',\r\n '鰘',\r\n '䏡',\r\n '𬤊',\r\n ],\r\n qiū: [\r\n '丘',\r\n '丠',\r\n '坵',\r\n '媝',\r\n '恘',\r\n '恷',\r\n '楸',\r\n '秋',\r\n '秌',\r\n '穐',\r\n '篍',\r\n '緧',\r\n '萩',\r\n '蘒',\r\n '蚯',\r\n '蝵',\r\n '蟗',\r\n '蠤',\r\n '趥',\r\n '邱',\r\n '鞦',\r\n '鞧',\r\n '鰌',\r\n '鰍',\r\n '鳅',\r\n '鶖',\r\n '鹙',\r\n '龝',\r\n ],\r\n bǐng: [\r\n '丙',\r\n '屛',\r\n '怲',\r\n '抦',\r\n '昞',\r\n '昺',\r\n '柄',\r\n '棅',\r\n '炳',\r\n '禀',\r\n '秉',\r\n '稟',\r\n '苪',\r\n '蛃',\r\n '邴',\r\n '鈵',\r\n '陃',\r\n '鞆',\r\n '餅',\r\n '餠',\r\n '饼',\r\n ],\r\n yè: [\r\n '业',\r\n '亱',\r\n '僷',\r\n '墷',\r\n '夜',\r\n '嶪',\r\n '嶫',\r\n '抴',\r\n '捙',\r\n '擛',\r\n '擪',\r\n '擫',\r\n '晔',\r\n '曄',\r\n '曅',\r\n '曗',\r\n '曳',\r\n '曵',\r\n '枼',\r\n '枽',\r\n '業',\r\n '洂',\r\n '液',\r\n '澲',\r\n '烨',\r\n '燁',\r\n '爗',\r\n '璍',\r\n '皣',\r\n '瞱',\r\n '瞸',\r\n '礏',\r\n '腋',\r\n '葉',\r\n '謁',\r\n '谒',\r\n '邺',\r\n '鄴',\r\n '鍱',\r\n '鐷',\r\n '靥',\r\n '靨',\r\n '頁',\r\n '页',\r\n '餣',\r\n '饁',\r\n '馌',\r\n '驜',\r\n '鵺',\r\n '鸈',\r\n ],\r\n cóng: [\r\n '丛',\r\n '从',\r\n '叢',\r\n '婃',\r\n '孮',\r\n '従',\r\n '徔',\r\n '徖',\r\n '悰',\r\n '樷',\r\n '欉',\r\n '淙',\r\n '灇',\r\n '爜',\r\n '琮',\r\n '藂',\r\n '誴',\r\n '賨',\r\n '賩',\r\n '錝',\r\n ],\r\n dōng: [\r\n '东',\r\n '倲',\r\n '冬',\r\n '咚',\r\n '埬',\r\n '岽',\r\n '崬',\r\n '徚',\r\n '昸',\r\n '東',\r\n '氡',\r\n '氭',\r\n '涷',\r\n '笗',\r\n '苳',\r\n '菄',\r\n '蝀',\r\n '鮗',\r\n '鯟',\r\n '鶇',\r\n '鶫',\r\n '鸫',\r\n '鼕',\r\n '𬟽',\r\n ],\r\n sī: [\r\n '丝',\r\n '俬',\r\n '凘',\r\n '厮',\r\n '司',\r\n '咝',\r\n '嘶',\r\n '噝',\r\n '媤',\r\n '廝',\r\n '恖',\r\n '撕',\r\n '斯',\r\n '楒',\r\n '泀',\r\n '澌',\r\n '燍',\r\n '禗',\r\n '禠',\r\n '私',\r\n '糹',\r\n '絲',\r\n '緦',\r\n '纟',\r\n '缌',\r\n '罳',\r\n '蕬',\r\n '虒',\r\n '蛳',\r\n '蜤',\r\n '螄',\r\n '蟖',\r\n '蟴',\r\n '鉰',\r\n '銯',\r\n '鍶',\r\n '鐁',\r\n '锶',\r\n '颸',\r\n '飔',\r\n '騦',\r\n '鷥',\r\n '鸶',\r\n '鼶',\r\n '㟃',\r\n ],\r\n chéng: [\r\n '丞',\r\n '呈',\r\n '城',\r\n '埕',\r\n '堘',\r\n '塍',\r\n '塖',\r\n '宬',\r\n '峸',\r\n '惩',\r\n '懲',\r\n '成',\r\n '承',\r\n '挰',\r\n '掁',\r\n '揨',\r\n '枨',\r\n '棖',\r\n '橙',\r\n '檙',\r\n '洆',\r\n '溗',\r\n '澂',\r\n '珵',\r\n '珹',\r\n '畻',\r\n '程',\r\n '窚',\r\n '筬',\r\n '絾',\r\n '脭',\r\n '荿',\r\n '誠',\r\n '诚',\r\n '郕',\r\n '酲',\r\n '鋮',\r\n '铖',\r\n '騬',\r\n '鯎',\r\n ],\r\n diū: ['丟', '丢', '銩', '铥'],\r\n liǎng: [\r\n '両',\r\n '两',\r\n '兩',\r\n '唡',\r\n '啢',\r\n '掚',\r\n '緉',\r\n '脼',\r\n '蜽',\r\n '裲',\r\n '魉',\r\n '魎',\r\n '𬜯',\r\n ],\r\n yǒu: [\r\n '丣',\r\n '卣',\r\n '友',\r\n '梄',\r\n '湵',\r\n '牖',\r\n '禉',\r\n '羑',\r\n '聈',\r\n '苃',\r\n '莠',\r\n '蜏',\r\n '酉',\r\n '銪',\r\n '铕',\r\n '黝',\r\n ],\r\n yán: [\r\n '严',\r\n '厳',\r\n '啱',\r\n '喦',\r\n '嚴',\r\n '塩',\r\n '壛',\r\n '壧',\r\n '妍',\r\n '姸',\r\n '娫',\r\n '娮',\r\n '岩',\r\n '嵒',\r\n '嵓',\r\n '巌',\r\n '巖',\r\n '巗',\r\n '延',\r\n '揅',\r\n '昖',\r\n '楌',\r\n '檐',\r\n '櫩',\r\n '欕',\r\n '沿',\r\n '炎',\r\n '炏',\r\n '狿',\r\n '琂',\r\n '盐',\r\n '碞',\r\n '筵',\r\n '簷',\r\n '莚',\r\n '蔅',\r\n '虤',\r\n '蜒',\r\n '言',\r\n '訁',\r\n '訮',\r\n '詽',\r\n '讠',\r\n '郔',\r\n '閆',\r\n '閻',\r\n '闫',\r\n '阎',\r\n '顏',\r\n '顔',\r\n '颜',\r\n '鹽',\r\n '麣',\r\n '𫄧',\r\n ],\r\n bìng: [\r\n '並',\r\n '併',\r\n '倂',\r\n '傡',\r\n '垪',\r\n '摒',\r\n '栤',\r\n '病',\r\n '窉',\r\n '竝',\r\n '誁',\r\n '靐',\r\n '鮩',\r\n ],\r\n 'sàng sāng': ['丧'],\r\n gǔn: [\r\n '丨',\r\n '惃',\r\n '滚',\r\n '滾',\r\n '磙',\r\n '緄',\r\n '绲',\r\n '蓘',\r\n '蔉',\r\n '衮',\r\n '袞',\r\n '輥',\r\n '辊',\r\n '鮌',\r\n '鯀',\r\n '鲧',\r\n ],\r\n jiū: [\r\n '丩',\r\n '勼',\r\n '啾',\r\n '揪',\r\n '揫',\r\n '朻',\r\n '究',\r\n '糾',\r\n '纠',\r\n '萛',\r\n '赳',\r\n '阄',\r\n '鬏',\r\n '鬮',\r\n '鳩',\r\n '鸠',\r\n ],\r\n 'gè gě': ['个', '個', '各'],\r\n yā: [\r\n '丫',\r\n '圧',\r\n '孲',\r\n '庘',\r\n '押',\r\n '枒',\r\n '桠',\r\n '椏',\r\n '錏',\r\n '鐚',\r\n '鴉',\r\n '鴨',\r\n '鵶',\r\n '鸦',\r\n '鸭',\r\n ],\r\n pán: [\r\n '丬',\r\n '媻',\r\n '幋',\r\n '槃',\r\n '洀',\r\n '瀊',\r\n '爿',\r\n '盘',\r\n '盤',\r\n '磐',\r\n '縏',\r\n '蒰',\r\n '蟠',\r\n '蹒',\r\n '蹣',\r\n '鎜',\r\n '鞶',\r\n ],\r\n 'zhōng zhòng': ['中'],\r\n jǐ: [\r\n '丮',\r\n '妀',\r\n '己',\r\n '戟',\r\n '挤',\r\n '掎',\r\n '撠',\r\n '擠',\r\n '橶',\r\n '泲',\r\n '犱',\r\n '脊',\r\n '虮',\r\n '蟣',\r\n '魢',\r\n '鱾',\r\n '麂',\r\n ],\r\n jiè: [\r\n '丯',\r\n '介',\r\n '借',\r\n '唶',\r\n '堺',\r\n '屆',\r\n '届',\r\n '岕',\r\n '庎',\r\n '徣',\r\n '戒',\r\n '楐',\r\n '犗',\r\n '玠',\r\n '琾',\r\n '界',\r\n '畍',\r\n '疥',\r\n '砎',\r\n '蚧',\r\n '蛶',\r\n '衸',\r\n '褯',\r\n '誡',\r\n '诫',\r\n '鎅',\r\n '骱',\r\n '魪',\r\n ],\r\n fēng: [\r\n '丰',\r\n '仹',\r\n '偑',\r\n '僼',\r\n '凨',\r\n '凬',\r\n '凮',\r\n '妦',\r\n '寷',\r\n '封',\r\n '峯',\r\n '峰',\r\n '崶',\r\n '枫',\r\n '楓',\r\n '檒',\r\n '沣',\r\n '沨',\r\n '渢',\r\n '灃',\r\n '烽',\r\n '犎',\r\n '猦',\r\n '琒',\r\n '疯',\r\n '瘋',\r\n '盽',\r\n '砜',\r\n '碸',\r\n '篈',\r\n '蘴',\r\n '蜂',\r\n '蠭',\r\n '豐',\r\n '鄷',\r\n '酆',\r\n '鋒',\r\n '鎽',\r\n '鏠',\r\n '锋',\r\n '霻',\r\n '靊',\r\n '飌',\r\n '麷',\r\n ],\r\n 'guàn kuàng': ['丱'],\r\n chuàn: ['串', '汌', '玔', '賗', '釧', '钏'],\r\n chǎn: [\r\n '丳',\r\n '产',\r\n '冁',\r\n '剷',\r\n '囅',\r\n '嵼',\r\n '旵',\r\n '浐',\r\n '滻',\r\n '灛',\r\n '產',\r\n '産',\r\n '簅',\r\n '蒇',\r\n '蕆',\r\n '諂',\r\n '譂',\r\n '讇',\r\n '谄',\r\n '鏟',\r\n '铲',\r\n '閳',\r\n '闡',\r\n '阐',\r\n '骣',\r\n '𬊤',\r\n ],\r\n lín: [\r\n '临',\r\n '冧',\r\n '壣',\r\n '崊',\r\n '嶙',\r\n '斴',\r\n '晽',\r\n '暽',\r\n '林',\r\n '潾',\r\n '瀶',\r\n '燐',\r\n '琳',\r\n '璘',\r\n '瞵',\r\n '碄',\r\n '磷',\r\n '粦',\r\n '粼',\r\n '繗',\r\n '翷',\r\n '臨',\r\n '轔',\r\n '辚',\r\n '遴',\r\n '邻',\r\n '鄰',\r\n '鏻',\r\n '阾',\r\n '隣',\r\n '霖',\r\n '驎',\r\n '鱗',\r\n '鳞',\r\n '麐',\r\n '麟',\r\n '𬴊',\r\n '𬭸',\r\n ],\r\n zhuó: [\r\n '丵',\r\n '劅',\r\n '卓',\r\n '啄',\r\n '圴',\r\n '妰',\r\n '娺',\r\n '撯',\r\n '擆',\r\n '擢',\r\n '斫',\r\n '斮',\r\n '斱',\r\n '斲',\r\n '斵',\r\n '晫',\r\n '椓',\r\n '浊',\r\n '浞',\r\n '濁',\r\n '灼',\r\n '烵',\r\n '琸',\r\n '硺',\r\n '禚',\r\n '窡',\r\n '籗',\r\n '籱',\r\n '罬',\r\n '茁',\r\n '蠗',\r\n '蠿',\r\n '諁',\r\n '諑',\r\n '謶',\r\n '诼',\r\n '酌',\r\n '鐲',\r\n '镯',\r\n '鵫',\r\n '鷟',\r\n '䓬',\r\n '𬸦',\r\n ],\r\n zhǔ: [\r\n '丶',\r\n '主',\r\n '劯',\r\n '嘱',\r\n '囑',\r\n '宔',\r\n '帾',\r\n '拄',\r\n '渚',\r\n '濐',\r\n '煑',\r\n '煮',\r\n '燝',\r\n '瞩',\r\n '矚',\r\n '罜',\r\n '詝',\r\n '陼',\r\n '鸀',\r\n '麈',\r\n '𬣞',\r\n ],\r\n bā: [\r\n '丷',\r\n '仈',\r\n '八',\r\n '叭',\r\n '哵',\r\n '夿',\r\n '岜',\r\n '巴',\r\n '捌',\r\n '朳',\r\n '玐',\r\n '疤',\r\n '笆',\r\n '粑',\r\n '羓',\r\n '芭',\r\n '蚆',\r\n '豝',\r\n '釟',\r\n ],\r\n wán: [\r\n '丸',\r\n '刓',\r\n '完',\r\n '岏',\r\n '抏',\r\n '捖',\r\n '汍',\r\n '烷',\r\n '玩',\r\n '琓',\r\n '笂',\r\n '紈',\r\n '纨',\r\n '翫',\r\n '芄',\r\n '貦',\r\n '頑',\r\n '顽',\r\n ],\r\n dān: [\r\n '丹',\r\n '勯',\r\n '匰',\r\n '単',\r\n '妉',\r\n '媅',\r\n '殚',\r\n '殫',\r\n '甔',\r\n '眈',\r\n '砃',\r\n '箪',\r\n '簞',\r\n '耼',\r\n '耽',\r\n '聃',\r\n '聸',\r\n '褝',\r\n '襌',\r\n '躭',\r\n '郸',\r\n '鄲',\r\n '酖',\r\n '頕',\r\n ],\r\n 'wèi wéi': ['为'],\r\n 'jǐng dǎn': ['丼'],\r\n 'lì lí': ['丽'],\r\n jǔ: [\r\n '举',\r\n '弆',\r\n '挙',\r\n '擧',\r\n '椇',\r\n '榉',\r\n '榘',\r\n '櫸',\r\n '欅',\r\n '矩',\r\n '筥',\r\n '聥',\r\n '舉',\r\n '莒',\r\n '蒟',\r\n '襷',\r\n '踽',\r\n '齟',\r\n '龃',\r\n ],\r\n piě: ['丿', '苤', '鐅', '𬭯'],\r\n fú: [\r\n '乀',\r\n '伏',\r\n '俘',\r\n '凫',\r\n '刜',\r\n '匐',\r\n '咈',\r\n '哹',\r\n '垘',\r\n '孚',\r\n '岪',\r\n '巿',\r\n '帗',\r\n '幅',\r\n '幞',\r\n '弗',\r\n '彿',\r\n '怫',\r\n '扶',\r\n '柫',\r\n '栿',\r\n '桴',\r\n '氟',\r\n '泭',\r\n '浮',\r\n '涪',\r\n '澓',\r\n '炥',\r\n '玸',\r\n '甶',\r\n '畉',\r\n '癁',\r\n '祓',\r\n '福',\r\n '稪',\r\n '符',\r\n '箙',\r\n '紱',\r\n '紼',\r\n '絥',\r\n '綍',\r\n '绂',\r\n '绋',\r\n '罘',\r\n '罦',\r\n '翇',\r\n '艀',\r\n '芙',\r\n '芣',\r\n '苻',\r\n '茀',\r\n '茯',\r\n '菔',\r\n '葍',\r\n '虙',\r\n '蚨',\r\n '蜉',\r\n '蝠',\r\n '袚',\r\n '袱',\r\n '襆',\r\n '襥',\r\n '諨',\r\n '豧',\r\n '踾',\r\n '輻',\r\n '辐',\r\n '郛',\r\n '鉘',\r\n '鉜',\r\n '韍',\r\n '韨',\r\n '颫',\r\n '髴',\r\n '鮄',\r\n '鮲',\r\n '鳧',\r\n '鳬',\r\n '鴔',\r\n '鵩',\r\n '黻',\r\n ],\r\n 'yí jí': ['乁'],\r\n yì: [\r\n '乂',\r\n '义',\r\n '亄',\r\n '亦',\r\n '亿',\r\n '伇',\r\n '伿',\r\n '佾',\r\n '俋',\r\n '億',\r\n '兿',\r\n '刈',\r\n '劓',\r\n '劮',\r\n '勚',\r\n '勩',\r\n '匇',\r\n '呓',\r\n '呭',\r\n '呹',\r\n '唈',\r\n '囈',\r\n '圛',\r\n '坄',\r\n '垼',\r\n '埸',\r\n '奕',\r\n '嫕',\r\n '嬑',\r\n '寱',\r\n '屹',\r\n '峄',\r\n '嶧',\r\n '帟',\r\n '帠',\r\n '幆',\r\n '廙',\r\n '异',\r\n '弈',\r\n '弋',\r\n '役',\r\n '忆',\r\n '怈',\r\n '怿',\r\n '悒',\r\n '意',\r\n '憶',\r\n '懌',\r\n '懿',\r\n '抑',\r\n '挹',\r\n '敡',\r\n '易',\r\n '晹',\r\n '曀',\r\n '曎',\r\n '杙',\r\n '枍',\r\n '棭',\r\n '榏',\r\n '槸',\r\n '檍',\r\n '歝',\r\n '殔',\r\n '殪',\r\n '殹',\r\n '毅',\r\n '浂',\r\n '浥',\r\n '浳',\r\n '湙',\r\n '溢',\r\n '潩',\r\n '澺',\r\n '瀷',\r\n '炈',\r\n '焲',\r\n '熠',\r\n '熤',\r\n '熼',\r\n '燚',\r\n '燡',\r\n '燱',\r\n '獈',\r\n '玴',\r\n '異',\r\n '疫',\r\n '痬',\r\n '瘗',\r\n '瘞',\r\n '瘱',\r\n '癔',\r\n '益',\r\n '瞖',\r\n '穓',\r\n '竩',\r\n '篒',\r\n '縊',\r\n '繶',\r\n '繹',\r\n '绎',\r\n '缢',\r\n '義',\r\n '羿',\r\n '翊',\r\n '翌',\r\n '翳',\r\n '翼',\r\n '耴',\r\n '肄',\r\n '肊',\r\n '膉',\r\n '臆',\r\n '艗',\r\n '艺',\r\n '芅',\r\n '苅',\r\n '萟',\r\n '蓺',\r\n '薏',\r\n '藙',\r\n '藝',\r\n '蘙',\r\n '虉',\r\n '蜴',\r\n '螠',\r\n '衪',\r\n '袣',\r\n '裔',\r\n '裛',\r\n '褹',\r\n '襼',\r\n '訲',\r\n '訳',\r\n '詍',\r\n '詣',\r\n '誼',\r\n '譯',\r\n '議',\r\n '讛',\r\n '议',\r\n '译',\r\n '诣',\r\n '谊',\r\n '豙',\r\n '豛',\r\n '豷',\r\n '貖',\r\n '贀',\r\n '跇',\r\n '轶',\r\n '逸',\r\n '邑',\r\n '鄓',\r\n '醷',\r\n '釴',\r\n '鈠',\r\n '鎰',\r\n '鐿',\r\n '镒',\r\n '镱',\r\n '阣',\r\n '隿',\r\n '霬',\r\n '饐',\r\n '駅',\r\n '驛',\r\n '驿',\r\n '骮',\r\n '鮨',\r\n '鶂',\r\n '鶃',\r\n '鶍',\r\n '鷁',\r\n '鷊',\r\n '鷧',\r\n '鷾',\r\n '鸃',\r\n '鹝',\r\n '鹢',\r\n '黓',\r\n '齸',\r\n '𬬩',\r\n '㑊',\r\n '𫄷',\r\n '𬟁',\r\n ],\r\n nǎi: ['乃', '倷', '奶', '嬭', '廼', '氖', '疓', '艿', '迺', '釢'],\r\n wǔ: [\r\n '乄',\r\n '五',\r\n '仵',\r\n '伍',\r\n '侮',\r\n '倵',\r\n '儛',\r\n '午',\r\n '啎',\r\n '妩',\r\n '娬',\r\n '嫵',\r\n '庑',\r\n '廡',\r\n '忤',\r\n '怃',\r\n '憮',\r\n '摀',\r\n '武',\r\n '潕',\r\n '熓',\r\n '牾',\r\n '玝',\r\n '珷',\r\n '瑦',\r\n '甒',\r\n '碔',\r\n '舞',\r\n '躌',\r\n '迕',\r\n '逜',\r\n '陚',\r\n '鵡',\r\n '鹉',\r\n '𣲘',\r\n ],\r\n jiǔ: [\r\n '久',\r\n '乆',\r\n '九',\r\n '乣',\r\n '奺',\r\n '杦',\r\n '汣',\r\n '灸',\r\n '玖',\r\n '紤',\r\n '舏',\r\n '酒',\r\n '镹',\r\n '韭',\r\n '韮',\r\n ],\r\n 'tuō zhé': ['乇', '杔', '馲'],\r\n 'me mó ma yāo': ['么'],\r\n zhī: [\r\n '之',\r\n '倁',\r\n '卮',\r\n '巵',\r\n '搘',\r\n '支',\r\n '栀',\r\n '梔',\r\n '椥',\r\n '榰',\r\n '汁',\r\n '泜',\r\n '疷',\r\n '祗',\r\n '祬',\r\n '秓',\r\n '稙',\r\n '綕',\r\n '肢',\r\n '胑',\r\n '胝',\r\n '脂',\r\n '芝',\r\n '蘵',\r\n '蜘',\r\n '衼',\r\n '隻',\r\n '鳷',\r\n '鴲',\r\n '鼅',\r\n '𦭜',\r\n ],\r\n 'wū wù': ['乌'],\r\n zhà: [\r\n '乍',\r\n '咤',\r\n '宱',\r\n '搾',\r\n '榨',\r\n '溠',\r\n '痄',\r\n '蚱',\r\n '詐',\r\n '诈',\r\n '醡',\r\n '霅',\r\n '䃎',\r\n ],\r\n hū: [\r\n '乎',\r\n '乯',\r\n '匢',\r\n '匫',\r\n '呼',\r\n '唿',\r\n '嘑',\r\n '垀',\r\n '寣',\r\n '幠',\r\n '忽',\r\n '惚',\r\n '昒',\r\n '歑',\r\n '泘',\r\n '淴',\r\n '滹',\r\n '烀',\r\n '苸',\r\n '虍',\r\n '虖',\r\n '謼',\r\n '軤',\r\n '轷',\r\n '雐',\r\n ],\r\n fá: [\r\n '乏',\r\n '伐',\r\n '傠',\r\n '坺',\r\n '垡',\r\n '墢',\r\n '姂',\r\n '栰',\r\n '浌',\r\n '瞂',\r\n '笩',\r\n '筏',\r\n '罚',\r\n '罰',\r\n '罸',\r\n '藅',\r\n '閥',\r\n '阀',\r\n ],\r\n 'lè yuè yào lào': ['乐', '樂'],\r\n yín: [\r\n '乑',\r\n '吟',\r\n '噖',\r\n '嚚',\r\n '圁',\r\n '垠',\r\n '夤',\r\n '婬',\r\n '寅',\r\n '峾',\r\n '崟',\r\n '崯',\r\n '檭',\r\n '殥',\r\n '泿',\r\n '淫',\r\n '滛',\r\n '烎',\r\n '犾',\r\n '狺',\r\n '璌',\r\n '硍',\r\n '碒',\r\n '荶',\r\n '蔩',\r\n '訔',\r\n '訚',\r\n '訡',\r\n '誾',\r\n '鄞',\r\n '鈝',\r\n '銀',\r\n '银',\r\n '霪',\r\n '鷣',\r\n '齦',\r\n ],\r\n pīng: ['乒', '俜', '娉', '涄', '甹', '砯', '聠', '艵', '頩'],\r\n pāng: ['乓', '滂', '胮', '膖', '雱', '霶'],\r\n qiáo: [\r\n '乔',\r\n '侨',\r\n '僑',\r\n '嫶',\r\n '憔',\r\n '桥',\r\n '槗',\r\n '樵',\r\n '橋',\r\n '櫵',\r\n '犞',\r\n '瞧',\r\n '硚',\r\n '礄',\r\n '荍',\r\n '荞',\r\n '蕎',\r\n '藮',\r\n '譙',\r\n '趫',\r\n '鐈',\r\n '鞒',\r\n '鞽',\r\n '顦',\r\n ],\r\n hǔ: ['乕', '琥', '萀', '虎', '虝', '錿', '鯱'],\r\n guāi: ['乖'],\r\n 'chéng shèng': ['乗', '乘', '娍'],\r\n yǐ: [\r\n '乙',\r\n '乛',\r\n '以',\r\n '倚',\r\n '偯',\r\n '嬟',\r\n '崺',\r\n '已',\r\n '庡',\r\n '扆',\r\n '攺',\r\n '敼',\r\n '旑',\r\n '旖',\r\n '檥',\r\n '矣',\r\n '礒',\r\n '笖',\r\n '舣',\r\n '艤',\r\n '苡',\r\n '苢',\r\n '蚁',\r\n '螘',\r\n '蟻',\r\n '裿',\r\n '踦',\r\n '輢',\r\n '轙',\r\n '逘',\r\n '酏',\r\n '釔',\r\n '鈘',\r\n '鉯',\r\n '钇',\r\n '顗',\r\n '鳦',\r\n '齮',\r\n '𫖮',\r\n '𬺈',\r\n ],\r\n 'háo yǐ': ['乚'],\r\n 'niè miē': ['乜'],\r\n qǐ: [\r\n '乞',\r\n '企',\r\n '启',\r\n '唘',\r\n '啓',\r\n '啔',\r\n '啟',\r\n '婍',\r\n '屺',\r\n '杞',\r\n '棨',\r\n '玘',\r\n '盀',\r\n '綺',\r\n '绮',\r\n '芑',\r\n '諬',\r\n '起',\r\n '邔',\r\n '闙',\r\n ],\r\n yě: ['也', '冶', '嘢', '埜', '壄', '漜', '野'],\r\n xí: [\r\n '习',\r\n '喺',\r\n '媳',\r\n '嶍',\r\n '席',\r\n '椺',\r\n '檄',\r\n '漝',\r\n '習',\r\n '蓆',\r\n '袭',\r\n '襲',\r\n '覡',\r\n '觋',\r\n '謵',\r\n '趘',\r\n '郋',\r\n '鎴',\r\n '隰',\r\n '霫',\r\n '飁',\r\n '騱',\r\n '騽',\r\n '驨',\r\n '鰼',\r\n '鳛',\r\n '𠅤',\r\n '𫘬',\r\n ],\r\n xiāng: [\r\n '乡',\r\n '厢',\r\n '廂',\r\n '忀',\r\n '楿',\r\n '欀',\r\n '湘',\r\n '瓖',\r\n '稥',\r\n '箱',\r\n '緗',\r\n '缃',\r\n '膷',\r\n '芗',\r\n '萫',\r\n '葙',\r\n '薌',\r\n '襄',\r\n '郷',\r\n '鄉',\r\n '鄊',\r\n '鄕',\r\n '鑲',\r\n '镶',\r\n '香',\r\n '驤',\r\n '骧',\r\n '鱜',\r\n '麘',\r\n '𬙋',\r\n ],\r\n shū: [\r\n '书',\r\n '倏',\r\n '倐',\r\n '儵',\r\n '叔',\r\n '姝',\r\n '尗',\r\n '抒',\r\n '掓',\r\n '摅',\r\n '攄',\r\n '書',\r\n '枢',\r\n '梳',\r\n '樞',\r\n '殊',\r\n '殳',\r\n '毹',\r\n '毺',\r\n '淑',\r\n '瀭',\r\n '焂',\r\n '疎',\r\n '疏',\r\n '紓',\r\n '綀',\r\n '纾',\r\n '舒',\r\n '菽',\r\n '蔬',\r\n '踈',\r\n '軗',\r\n '輸',\r\n '输',\r\n '鄃',\r\n '陎',\r\n '鮛',\r\n '鵨',\r\n ],\r\n dǒu: ['乧', '抖', '枓', '蚪', '鈄', '阧', '陡'],\r\n shǐ: [\r\n '乨',\r\n '使',\r\n '兘',\r\n '史',\r\n '始',\r\n '宩',\r\n '屎',\r\n '榁',\r\n '矢',\r\n '笶',\r\n '豕',\r\n '鉂',\r\n '駛',\r\n '驶',\r\n ],\r\n jī: [\r\n '乩',\r\n '僟',\r\n '击',\r\n '刉',\r\n '刏',\r\n '剞',\r\n '叽',\r\n '唧',\r\n '喞',\r\n '嗘',\r\n '嘰',\r\n '圾',\r\n '基',\r\n '墼',\r\n '姬',\r\n '屐',\r\n '嵆',\r\n '嵇',\r\n '撃',\r\n '擊',\r\n '朞',\r\n '机',\r\n '枅',\r\n '樭',\r\n '機',\r\n '毄',\r\n '激',\r\n '犄',\r\n '玑',\r\n '璣',\r\n '畸',\r\n '畿',\r\n '癪',\r\n '矶',\r\n '磯',\r\n '积',\r\n '積',\r\n '笄',\r\n '筓',\r\n '箕',\r\n '簊',\r\n '緁',\r\n '羁',\r\n '羇',\r\n '羈',\r\n '耭',\r\n '肌',\r\n '芨',\r\n '虀',\r\n '覉',\r\n '覊',\r\n '譏',\r\n '譤',\r\n '讥',\r\n '賫',\r\n '賷',\r\n '赍',\r\n '跻',\r\n '踑',\r\n '躋',\r\n '躸',\r\n '銈',\r\n '錤',\r\n '鐖',\r\n '鑇',\r\n '鑙',\r\n '隮',\r\n '雞',\r\n '鞿',\r\n '韲',\r\n '飢',\r\n '饑',\r\n '饥',\r\n '魕',\r\n '鳮',\r\n '鶏',\r\n '鶺',\r\n '鷄',\r\n '鸄',\r\n '鸡',\r\n '齎',\r\n '齏',\r\n '齑',\r\n '𬯀',\r\n '𫓯',\r\n '𫓹',\r\n '𫌀',\r\n ],\r\n náng: ['乪', '嚢', '欜', '蠰', '饢'],\r\n jiā: [\r\n '乫',\r\n '佳',\r\n '傢',\r\n '加',\r\n '嘉',\r\n '抸',\r\n '枷',\r\n '梜',\r\n '毠',\r\n '泇',\r\n '浃',\r\n '浹',\r\n '犌',\r\n '猳',\r\n '珈',\r\n '痂',\r\n '笳',\r\n '糘',\r\n '耞',\r\n '腵',\r\n '葭',\r\n '袈',\r\n '豭',\r\n '貑',\r\n '跏',\r\n '迦',\r\n '鉫',\r\n '鎵',\r\n '镓',\r\n '鴐',\r\n '麚',\r\n '𬂩',\r\n ],\r\n jù: [\r\n '乬',\r\n '倨',\r\n '倶',\r\n '具',\r\n '剧',\r\n '劇',\r\n '勮',\r\n '埧',\r\n '埾',\r\n '壉',\r\n '姖',\r\n '屦',\r\n '屨',\r\n '岠',\r\n '巨',\r\n '巪',\r\n '怇',\r\n '惧',\r\n '愳',\r\n '懅',\r\n '懼',\r\n '拒',\r\n '拠',\r\n '昛',\r\n '歫',\r\n '洰',\r\n '澽',\r\n '炬',\r\n '烥',\r\n '犋',\r\n '秬',\r\n '窭',\r\n '窶',\r\n '簴',\r\n '粔',\r\n '耟',\r\n '聚',\r\n '虡',\r\n '蚷',\r\n '詎',\r\n '讵',\r\n '豦',\r\n '距',\r\n '踞',\r\n '躆',\r\n '遽',\r\n '邭',\r\n '醵',\r\n '鉅',\r\n '鐻',\r\n '钜',\r\n '颶',\r\n '飓',\r\n '駏',\r\n '鮔',\r\n ],\r\n shí: [\r\n '乭',\r\n '十',\r\n '埘',\r\n '塒',\r\n '姼',\r\n '实',\r\n '実',\r\n '寔',\r\n '實',\r\n '峕',\r\n '嵵',\r\n '时',\r\n '旹',\r\n '時',\r\n '榯',\r\n '湜',\r\n '溡',\r\n '炻',\r\n '祏',\r\n '竍',\r\n '蚀',\r\n '蝕',\r\n '辻',\r\n '遈',\r\n '鉐',\r\n '飠',\r\n '饣',\r\n '鮖',\r\n '鰣',\r\n '鲥',\r\n '鼫',\r\n '鼭',\r\n ],\r\n mǎo: ['乮', '冇', '卯', '峁', '戼', '昴', '泖', '笷', '蓩', '鉚', '铆'],\r\n mǎi: ['买', '嘪', '荬', '蕒', '買', '鷶'],\r\n luàn: ['乱', '亂', '釠'],\r\n rǔ: ['乳', '擩', '汝', '肗', '辱', '鄏'],\r\n xué: [\r\n '乴',\r\n '学',\r\n '學',\r\n '峃',\r\n '嶨',\r\n '斈',\r\n '泶',\r\n '澩',\r\n '燢',\r\n '穴',\r\n '茓',\r\n '袕',\r\n '踅',\r\n '鷽',\r\n '鸴',\r\n ],\r\n yǎn: [\r\n '䶮',\r\n '乵',\r\n '俨',\r\n '偃',\r\n '儼',\r\n '兖',\r\n '兗',\r\n '厣',\r\n '厴',\r\n '噞',\r\n '孍',\r\n '嵃',\r\n '巘',\r\n '巚',\r\n '弇',\r\n '愝',\r\n '戭',\r\n '扊',\r\n '抁',\r\n '掩',\r\n '揜',\r\n '曮',\r\n '椼',\r\n '檿',\r\n '沇',\r\n '渷',\r\n '演',\r\n '琰',\r\n '甗',\r\n '眼',\r\n '罨',\r\n '萒',\r\n '蝘',\r\n '衍',\r\n '褗',\r\n '躽',\r\n '遃',\r\n '郾',\r\n '隒',\r\n '顩',\r\n '魇',\r\n '魘',\r\n '鰋',\r\n '鶠',\r\n '黡',\r\n '黤',\r\n '黬',\r\n '黭',\r\n '黶',\r\n '鼴',\r\n '鼹',\r\n '齴',\r\n '龑',\r\n '𬸘',\r\n '𬙂',\r\n '𪩘',\r\n ],\r\n fǔ: [\r\n '乶',\r\n '俌',\r\n '俛',\r\n '俯',\r\n '府',\r\n '弣',\r\n '抚',\r\n '拊',\r\n '撫',\r\n '斧',\r\n '椨',\r\n '滏',\r\n '焤',\r\n '甫',\r\n '盙',\r\n '簠',\r\n '腐',\r\n '腑',\r\n '蜅',\r\n '輔',\r\n '辅',\r\n '郙',\r\n '釜',\r\n '釡',\r\n '阝',\r\n '頫',\r\n '鬴',\r\n '黼',\r\n '㕮',\r\n '𫖯',\r\n ],\r\n shā: [\r\n '乷',\r\n '唦',\r\n '杀',\r\n '桬',\r\n '殺',\r\n '毮',\r\n '猀',\r\n '痧',\r\n '砂',\r\n '硰',\r\n '紗',\r\n '繺',\r\n '纱',\r\n '蔱',\r\n '裟',\r\n '鎩',\r\n '铩',\r\n '閷',\r\n '髿',\r\n '魦',\r\n '鯊',\r\n '鯋',\r\n '鲨',\r\n ],\r\n nǎ: ['乸', '雫'],\r\n qián: [\r\n '乹',\r\n '亁',\r\n '仱',\r\n '偂',\r\n '前',\r\n '墘',\r\n '媊',\r\n '岒',\r\n '拑',\r\n '掮',\r\n '榩',\r\n '橬',\r\n '歬',\r\n '潛',\r\n '潜',\r\n '濳',\r\n '灊',\r\n '箝',\r\n '葥',\r\n '虔',\r\n '軡',\r\n '鈐',\r\n '鉗',\r\n '銭',\r\n '錢',\r\n '鎆',\r\n '钤',\r\n '钱',\r\n '钳',\r\n '靬',\r\n '騚',\r\n '騝',\r\n '鰬',\r\n '黔',\r\n '黚',\r\n ],\r\n suǒ: [\r\n '乺',\r\n '唢',\r\n '嗩',\r\n '所',\r\n '暛',\r\n '溑',\r\n '溹',\r\n '琐',\r\n '琑',\r\n '瑣',\r\n '索',\r\n '褨',\r\n '鎖',\r\n '鎻',\r\n '鏁',\r\n '锁',\r\n ],\r\n yú: [\r\n '乻',\r\n '于',\r\n '亐',\r\n '伃',\r\n '余',\r\n '堣',\r\n '堬',\r\n '妤',\r\n '娛',\r\n '娯',\r\n '娱',\r\n '嬩',\r\n '崳',\r\n '嵎',\r\n '嵛',\r\n '愚',\r\n '扵',\r\n '揄',\r\n '旟',\r\n '楡',\r\n '楰',\r\n '榆',\r\n '欤',\r\n '歈',\r\n '歟',\r\n '歶',\r\n '渔',\r\n '渝',\r\n '湡',\r\n '漁',\r\n '澞',\r\n '牏',\r\n '狳',\r\n '玗',\r\n '玙',\r\n '瑜',\r\n '璵',\r\n '盂',\r\n '睮',\r\n '窬',\r\n '竽',\r\n '籅',\r\n '羭',\r\n '腴',\r\n '臾',\r\n '舁',\r\n '舆',\r\n '艅',\r\n '茰',\r\n '萮',\r\n '萸',\r\n '蕍',\r\n '蘛',\r\n '虞',\r\n '虶',\r\n '蝓',\r\n '螸',\r\n '衧',\r\n '褕',\r\n '覦',\r\n '觎',\r\n '諛',\r\n '謣',\r\n '谀',\r\n '踰',\r\n '輿',\r\n '轝',\r\n '逾',\r\n '邘',\r\n '酑',\r\n '鍝',\r\n '隅',\r\n '雓',\r\n '雩',\r\n '餘',\r\n '馀',\r\n '騟',\r\n '骬',\r\n '髃',\r\n '魚',\r\n '魣',\r\n '鮽',\r\n '鯲',\r\n '鰅',\r\n '鱼',\r\n '鷠',\r\n '鸆',\r\n '齵',\r\n ],\r\n zhù: [\r\n '乼',\r\n '伫',\r\n '佇',\r\n '住',\r\n '坾',\r\n '墸',\r\n '壴',\r\n '嵀',\r\n '拀',\r\n '杼',\r\n '柱',\r\n '樦',\r\n '殶',\r\n '注',\r\n '炷',\r\n '疰',\r\n '眝',\r\n '祝',\r\n '祩',\r\n '竚',\r\n '筯',\r\n '箸',\r\n '篫',\r\n '簗',\r\n '紵',\r\n '紸',\r\n '纻',\r\n '羜',\r\n '翥',\r\n '苎',\r\n '莇',\r\n '蛀',\r\n '註',\r\n '貯',\r\n '贮',\r\n '跓',\r\n '軴',\r\n '鉒',\r\n '鋳',\r\n '鑄',\r\n '铸',\r\n '馵',\r\n '駐',\r\n '驻',\r\n ],\r\n zhě: ['乽', '者', '褶', '襵', '赭', '踷', '鍺', '锗'],\r\n 'qián gān': ['乾'],\r\n 'zhì luàn': ['乿'],\r\n guī: [\r\n '亀',\r\n '圭',\r\n '妫',\r\n '媯',\r\n '嫢',\r\n '嬀',\r\n '帰',\r\n '归',\r\n '摫',\r\n '椝',\r\n '槻',\r\n '槼',\r\n '櫷',\r\n '歸',\r\n '珪',\r\n '瑰',\r\n '璝',\r\n '瓌',\r\n '皈',\r\n '瞡',\r\n '硅',\r\n '茥',\r\n '蘬',\r\n '規',\r\n '规',\r\n '邽',\r\n '郌',\r\n '閨',\r\n '闺',\r\n '騩',\r\n '鬶',\r\n '鬹',\r\n ],\r\n 'lǐn lìn': ['亃'],\r\n jué: [\r\n '亅',\r\n '决',\r\n '刔',\r\n '劂',\r\n '匷',\r\n '厥',\r\n '噊',\r\n '孒',\r\n '孓',\r\n '崛',\r\n '崫',\r\n '嶥',\r\n '彏',\r\n '憠',\r\n '憰',\r\n '戄',\r\n '抉',\r\n '挗',\r\n '掘',\r\n '攫',\r\n '桷',\r\n '橛',\r\n '橜',\r\n '欮',\r\n '氒',\r\n '決',\r\n '灍',\r\n '焳',\r\n '熦',\r\n '爑',\r\n '爴',\r\n '爵',\r\n '獗',\r\n '玃',\r\n '玦',\r\n '玨',\r\n '珏',\r\n '瑴',\r\n '瘚',\r\n '矍',\r\n '矡',\r\n '砄',\r\n '絕',\r\n '絶',\r\n '绝',\r\n '臄',\r\n '芵',\r\n '蕝',\r\n '蕨',\r\n '虳',\r\n '蟨',\r\n '蟩',\r\n '觖',\r\n '觮',\r\n '觼',\r\n '訣',\r\n '譎',\r\n '诀',\r\n '谲',\r\n '貜',\r\n '赽',\r\n '趉',\r\n '蹷',\r\n '躩',\r\n '鈌',\r\n '鐍',\r\n '鐝',\r\n '钁',\r\n '镢',\r\n '鴂',\r\n '鴃',\r\n '鷢',\r\n '𫘝',\r\n '㵐',\r\n '𫔎',\r\n ],\r\n 'le liǎo': ['了'],\r\n 'gè mā': ['亇'],\r\n 'yǔ yú': ['予', '懙'],\r\n zhēng: [\r\n '争',\r\n '佂',\r\n '凧',\r\n '姃',\r\n '媜',\r\n '峥',\r\n '崝',\r\n '崢',\r\n '征',\r\n '徰',\r\n '炡',\r\n '烝',\r\n '爭',\r\n '狰',\r\n '猙',\r\n '癥',\r\n '眐',\r\n '睁',\r\n '睜',\r\n '筝',\r\n '箏',\r\n '篜',\r\n '聇',\r\n '脀',\r\n '蒸',\r\n '踭',\r\n '鉦',\r\n '錚',\r\n '鏳',\r\n '鬇',\r\n ],\r\n èr: ['二', '刵', '咡', '弍', '弐', '樲', '誀', '貮', '貳', '贰', '髶'],\r\n chù: [\r\n '亍',\r\n '傗',\r\n '儊',\r\n '怵',\r\n '憷',\r\n '搐',\r\n '斶',\r\n '歜',\r\n '珿',\r\n '琡',\r\n '矗',\r\n '竌',\r\n '絀',\r\n '绌',\r\n '臅',\r\n '触',\r\n '觸',\r\n '豖',\r\n '鄐',\r\n '閦',\r\n '黜',\r\n ],\r\n kuī: ['亏', '刲', '岿', '巋', '盔', '窥', '窺', '聧', '虧', '闚', '顝'],\r\n yún: [\r\n '云',\r\n '伝',\r\n '勻',\r\n '匀',\r\n '囩',\r\n '妘',\r\n '愪',\r\n '抣',\r\n '昀',\r\n '橒',\r\n '沄',\r\n '涢',\r\n '溳',\r\n '澐',\r\n '熉',\r\n '畇',\r\n '秐',\r\n '筼',\r\n '篔',\r\n '紜',\r\n '縜',\r\n '纭',\r\n '耘',\r\n '芸',\r\n '蒷',\r\n '蕓',\r\n '郧',\r\n '鄖',\r\n '鋆',\r\n '雲',\r\n ],\r\n hù: [\r\n '互',\r\n '冱',\r\n '嗀',\r\n '嚛',\r\n '婟',\r\n '嫭',\r\n '嫮',\r\n '岵',\r\n '帍',\r\n '弖',\r\n '怙',\r\n '戶',\r\n '户',\r\n '戸',\r\n '戽',\r\n '扈',\r\n '护',\r\n '昈',\r\n '槴',\r\n '沍',\r\n '沪',\r\n '滬',\r\n '熩',\r\n '瓠',\r\n '祜',\r\n '笏',\r\n '簄',\r\n '粐',\r\n '綔',\r\n '蔰',\r\n '護',\r\n '豰',\r\n '鄠',\r\n '鍙',\r\n '頀',\r\n '鱯',\r\n '鳠',\r\n '鳸',\r\n '鸌',\r\n '鹱',\r\n ],\r\n qí: [\r\n '亓',\r\n '剘',\r\n '埼',\r\n '岐',\r\n '岓',\r\n '崎',\r\n '嵜',\r\n '愭',\r\n '掑',\r\n '斉',\r\n '斊',\r\n '旂',\r\n '旗',\r\n '棊',\r\n '棋',\r\n '檱',\r\n '櫀',\r\n '歧',\r\n '淇',\r\n '濝',\r\n '猉',\r\n '玂',\r\n '琦',\r\n '琪',\r\n '璂',\r\n '畦',\r\n '疧',\r\n '碁',\r\n '碕',\r\n '祁',\r\n '祈',\r\n '祺',\r\n '禥',\r\n '竒',\r\n '簯',\r\n '簱',\r\n '籏',\r\n '粸',\r\n '綥',\r\n '綦',\r\n '肵',\r\n '脐',\r\n '臍',\r\n '艩',\r\n '芪',\r\n '萁',\r\n '萕',\r\n '蕲',\r\n '藄',\r\n '蘄',\r\n '蚑',\r\n '蚚',\r\n '蛴',\r\n '蜝',\r\n '蜞',\r\n '螧',\r\n '蠐',\r\n '褀',\r\n '軝',\r\n '鄿',\r\n '釮',\r\n '錡',\r\n '锜',\r\n '陭',\r\n '頎',\r\n '颀',\r\n '騎',\r\n '騏',\r\n '騹',\r\n '骐',\r\n '骑',\r\n '鬐',\r\n '鬿',\r\n '鯕',\r\n '鰭',\r\n '鲯',\r\n '鳍',\r\n '鵸',\r\n '鶀',\r\n '麒',\r\n '麡',\r\n '𨙸',\r\n '𬨂',\r\n '䓫',\r\n ],\r\n jǐng: [\r\n '井',\r\n '儆',\r\n '刭',\r\n '剄',\r\n '坓',\r\n '宑',\r\n '幜',\r\n '憬',\r\n '暻',\r\n '殌',\r\n '汫',\r\n '汬',\r\n '澋',\r\n '璄',\r\n '璟',\r\n '璥',\r\n '穽',\r\n '肼',\r\n '蟼',\r\n '警',\r\n '阱',\r\n '頚',\r\n '頸',\r\n ],\r\n sì: [\r\n '亖',\r\n '佀',\r\n '価',\r\n '儩',\r\n '兕',\r\n '嗣',\r\n '四',\r\n '姒',\r\n '娰',\r\n '孠',\r\n '寺',\r\n '巳',\r\n '柶',\r\n '榹',\r\n '汜',\r\n '泗',\r\n '泤',\r\n '洍',\r\n '洠',\r\n '涘',\r\n '瀃',\r\n '牭',\r\n '祀',\r\n '禩',\r\n '竢',\r\n '笥',\r\n '耜',\r\n '肂',\r\n '肆',\r\n '蕼',\r\n '覗',\r\n '貄',\r\n '釲',\r\n '鈶',\r\n '鈻',\r\n '飤',\r\n '飼',\r\n '饲',\r\n '駟',\r\n '騃',\r\n '驷',\r\n ],\r\n suì: [\r\n '亗',\r\n '嬘',\r\n '岁',\r\n '嵗',\r\n '旞',\r\n '檖',\r\n '歲',\r\n '歳',\r\n '澻',\r\n '煫',\r\n '燧',\r\n '璲',\r\n '砕',\r\n '碎',\r\n '祟',\r\n '禭',\r\n '穂',\r\n '穗',\r\n '穟',\r\n '繀',\r\n '繐',\r\n '繸',\r\n '襚',\r\n '誶',\r\n '譢',\r\n '谇',\r\n '賥',\r\n '邃',\r\n '鐆',\r\n '鐩',\r\n '隧',\r\n '韢',\r\n '𫟦',\r\n '𬭼',\r\n ],\r\n gèn: ['亘', '亙', '揯', '搄', '茛'],\r\n yà: [\r\n '亚',\r\n '亜',\r\n '俹',\r\n '冴',\r\n '劜',\r\n '圔',\r\n '圠',\r\n '埡',\r\n '娅',\r\n '婭',\r\n '揠',\r\n '氩',\r\n '氬',\r\n '犽',\r\n '砑',\r\n '稏',\r\n '聐',\r\n '襾',\r\n '覀',\r\n '訝',\r\n '讶',\r\n '迓',\r\n '齾',\r\n ],\r\n 'xiē suò': ['些'],\r\n 'qí zhāi': ['亝', '齊'],\r\n 'yā yà': ['亞', '压', '垭', '壓', '铔'],\r\n 'jí qì': ['亟', '焏'],\r\n tóu: ['亠', '投', '頭', '骰'],\r\n 'wáng wú': ['亡'],\r\n 'kàng háng gāng': ['亢'],\r\n dà: ['亣', '眔'],\r\n jiāo: [\r\n '交',\r\n '僬',\r\n '娇',\r\n '嬌',\r\n '峧',\r\n '嶕',\r\n '嶣',\r\n '憍',\r\n '椒',\r\n '浇',\r\n '澆',\r\n '焦',\r\n '礁',\r\n '穚',\r\n '簥',\r\n '胶',\r\n '膠',\r\n '膲',\r\n '茭',\r\n '茮',\r\n '蕉',\r\n '虠',\r\n '蛟',\r\n '蟭',\r\n '跤',\r\n '轇',\r\n '郊',\r\n '鐎',\r\n '驕',\r\n '骄',\r\n '鮫',\r\n '鲛',\r\n '鵁',\r\n '鷦',\r\n '鷮',\r\n '鹪',\r\n '䴔',\r\n ],\r\n hài: ['亥', '嗐', '害', '氦', '餀', '饚', '駭', '駴', '骇'],\r\n 'hēng pēng': ['亨'],\r\n mǔ: [\r\n '亩',\r\n '姆',\r\n '峔',\r\n '拇',\r\n '母',\r\n '牡',\r\n '牳',\r\n '畂',\r\n '畆',\r\n '畒',\r\n '畝',\r\n '畞',\r\n '畮',\r\n '砪',\r\n '胟',\r\n '踇',\r\n '鉧',\r\n '𬭁',\r\n '𧿹',\r\n ],\r\n ye: ['亪'],\r\n xiǎng: [\r\n '享',\r\n '亯',\r\n '响',\r\n '想',\r\n '晑',\r\n '蚃',\r\n '蠁',\r\n '響',\r\n '飨',\r\n '餉',\r\n '饗',\r\n '饷',\r\n '鮝',\r\n '鯗',\r\n '鱶',\r\n '鲞',\r\n ],\r\n jīng: [\r\n '京',\r\n '亰',\r\n '兢',\r\n '坕',\r\n '坙',\r\n '婛',\r\n '惊',\r\n '旌',\r\n '旍',\r\n '晶',\r\n '橸',\r\n '泾',\r\n '涇',\r\n '猄',\r\n '睛',\r\n '秔',\r\n '稉',\r\n '粳',\r\n '精',\r\n '経',\r\n '經',\r\n '綡',\r\n '聙',\r\n '腈',\r\n '茎',\r\n '荆',\r\n '荊',\r\n '菁',\r\n '葏',\r\n '驚',\r\n '鯨',\r\n '鲸',\r\n '鶁',\r\n '鶄',\r\n '麖',\r\n '麠',\r\n '鼱',\r\n '䴖',\r\n ],\r\n tíng: [\r\n '亭',\r\n '停',\r\n '婷',\r\n '嵉',\r\n '庭',\r\n '廷',\r\n '楟',\r\n '榳',\r\n '筳',\r\n '聤',\r\n '莛',\r\n '葶',\r\n '蜓',\r\n '蝏',\r\n '諪',\r\n '邒',\r\n '霆',\r\n '鼮',\r\n '䗴',\r\n ],\r\n liàng: ['亮', '喨', '悢', '晾', '湸', '諒', '谅', '輌', '輛', '辆', '鍄'],\r\n 'qīn qìng': ['亲', '親'],\r\n bó: [\r\n '亳',\r\n '仢',\r\n '侼',\r\n '僰',\r\n '博',\r\n '帛',\r\n '愽',\r\n '懪',\r\n '挬',\r\n '搏',\r\n '欂',\r\n '浡',\r\n '淿',\r\n '渤',\r\n '煿',\r\n '牔',\r\n '狛',\r\n '瓝',\r\n '礴',\r\n '秡',\r\n '箔',\r\n '簙',\r\n '糪',\r\n '胉',\r\n '脖',\r\n '膊',\r\n '舶',\r\n '艊',\r\n '萡',\r\n '葧',\r\n '袯',\r\n '襏',\r\n '襮',\r\n '謈',\r\n '踣',\r\n '郣',\r\n '鈸',\r\n '鉑',\r\n '鋍',\r\n '鎛',\r\n '鑮',\r\n '钹',\r\n '铂',\r\n '镈',\r\n '餺',\r\n '馎',\r\n '馛',\r\n '馞',\r\n '駁',\r\n '駮',\r\n '驳',\r\n '髆',\r\n '鵓',\r\n '鹁',\r\n ],\r\n yòu: [\r\n '亴',\r\n '佑',\r\n '佦',\r\n '侑',\r\n '又',\r\n '右',\r\n '哊',\r\n '唀',\r\n '囿',\r\n '姷',\r\n '宥',\r\n '峟',\r\n '幼',\r\n '狖',\r\n '祐',\r\n '蚴',\r\n '誘',\r\n '诱',\r\n '貁',\r\n '迶',\r\n '酭',\r\n '釉',\r\n '鼬',\r\n ],\r\n xiè: [\r\n '亵',\r\n '伳',\r\n '偞',\r\n '偰',\r\n '僁',\r\n '卨',\r\n '卸',\r\n '噧',\r\n '塮',\r\n '夑',\r\n '媟',\r\n '屑',\r\n '屧',\r\n '廨',\r\n '徢',\r\n '懈',\r\n '暬',\r\n '械',\r\n '榍',\r\n '榭',\r\n '泻',\r\n '洩',\r\n '渫',\r\n '澥',\r\n '瀉',\r\n '瀣',\r\n '灺',\r\n '炧',\r\n '炨',\r\n '燮',\r\n '爕',\r\n '獬',\r\n '祄',\r\n '禼',\r\n '糏',\r\n '紲',\r\n '絏',\r\n '絬',\r\n '繲',\r\n '纈',\r\n '绁',\r\n '缷',\r\n '薢',\r\n '薤',\r\n '蟹',\r\n '蠏',\r\n '褉',\r\n '褻',\r\n '謝',\r\n '谢',\r\n '躞',\r\n '邂',\r\n '靾',\r\n '韰',\r\n '齂',\r\n '齘',\r\n '齛',\r\n '齥',\r\n '𬹼',\r\n '𤫉',\r\n ],\r\n 'dǎn dàn': ['亶', '馾'],\r\n lián: [\r\n '亷',\r\n '劆',\r\n '匲',\r\n '匳',\r\n '嗹',\r\n '噒',\r\n '奁',\r\n '奩',\r\n '嫾',\r\n '帘',\r\n '廉',\r\n '怜',\r\n '憐',\r\n '涟',\r\n '漣',\r\n '濂',\r\n '濓',\r\n '瀮',\r\n '熑',\r\n '燫',\r\n '簾',\r\n '籢',\r\n '籨',\r\n '縺',\r\n '翴',\r\n '联',\r\n '聨',\r\n '聫',\r\n '聮',\r\n '聯',\r\n '臁',\r\n '莲',\r\n '蓮',\r\n '薕',\r\n '螊',\r\n '蠊',\r\n '裢',\r\n '褳',\r\n '覝',\r\n '謰',\r\n '蹥',\r\n '连',\r\n '連',\r\n '鎌',\r\n '鐮',\r\n '镰',\r\n '鬑',\r\n '鰱',\r\n '鲢',\r\n ],\r\n duǒ: [\r\n '亸',\r\n '哚',\r\n '嚲',\r\n '埵',\r\n '崜',\r\n '朵',\r\n '朶',\r\n '綞',\r\n '缍',\r\n '趓',\r\n '躱',\r\n '躲',\r\n '軃',\r\n ],\r\n 'wěi mén': ['亹', '斖'],\r\n rén: ['人', '亻', '仁', '壬', '忈', '忎', '朲', '秂', '芢', '魜', '鵀'],\r\n jí: [\r\n '亼',\r\n '亽',\r\n '伋',\r\n '佶',\r\n '偮',\r\n '卙',\r\n '即',\r\n '卽',\r\n '及',\r\n '叝',\r\n '吉',\r\n '堲',\r\n '塉',\r\n '姞',\r\n '嫉',\r\n '岌',\r\n '嵴',\r\n '嶯',\r\n '彶',\r\n '忣',\r\n '急',\r\n '愱',\r\n '戢',\r\n '揤',\r\n '极',\r\n '棘',\r\n '楫',\r\n '極',\r\n '槉',\r\n '檝',\r\n '殛',\r\n '汲',\r\n '湒',\r\n '潗',\r\n '疾',\r\n '瘠',\r\n '皍',\r\n '笈',\r\n '箿',\r\n '籍',\r\n '級',\r\n '级',\r\n '膌',\r\n '艥',\r\n '蒺',\r\n '蕀',\r\n '蕺',\r\n '蝍',\r\n '螏',\r\n '襋',\r\n '觙',\r\n '谻',\r\n '踖',\r\n '蹐',\r\n '躤',\r\n '輯',\r\n '轚',\r\n '辑',\r\n '郆',\r\n '銡',\r\n '鍓',\r\n '鏶',\r\n '集',\r\n '雧',\r\n '霵',\r\n '鹡',\r\n '㴔',\r\n ],\r\n wáng: ['亾', '仼', '兦', '莣', '蚟'],\r\n 'shén shí': ['什'],\r\n lè: [\r\n '仂',\r\n '叻',\r\n '忇',\r\n '氻',\r\n '泐',\r\n '玏',\r\n '砳',\r\n '簕',\r\n '艻',\r\n '阞',\r\n '韷',\r\n '餎',\r\n '鰳',\r\n '鱳',\r\n '鳓',\r\n ],\r\n dīng: ['仃', '叮', '帄', '玎', '疔', '盯', '耵', '虰', '靪'],\r\n zè: ['仄', '崱', '庂', '捑', '昃', '昗', '汄'],\r\n 'jǐn jìn': ['仅', '僅', '嫤'],\r\n 'pú pū': ['仆'],\r\n 'chóu qiú': ['仇'],\r\n zhǎng: ['仉', '幥', '掌', '礃'],\r\n jīn: [\r\n '今',\r\n '堻',\r\n '巾',\r\n '惍',\r\n '斤',\r\n '津',\r\n '珒',\r\n '琻',\r\n '璡',\r\n '砛',\r\n '筋',\r\n '荕',\r\n '衿',\r\n '襟',\r\n '觔',\r\n '金',\r\n '釒',\r\n '釿',\r\n '钅',\r\n '鹶',\r\n '黅',\r\n '𬬱',\r\n ],\r\n bīng: ['仌', '仒', '兵', '冫', '冰', '掤', '氷', '鋲'],\r\n réng: ['仍', '礽', '芿', '辸', '陾'],\r\n fó: ['仏', '坲', '梻'],\r\n 'jīn sǎn': ['仐'],\r\n lún: [\r\n '仑',\r\n '伦',\r\n '侖',\r\n '倫',\r\n '囵',\r\n '圇',\r\n '婨',\r\n '崘',\r\n '崙',\r\n '棆',\r\n '沦',\r\n '淪',\r\n '磮',\r\n '腀',\r\n '菕',\r\n '蜦',\r\n '踚',\r\n '輪',\r\n '轮',\r\n '錀',\r\n '陯',\r\n '鯩',\r\n '𬬭',\r\n ],\r\n cāng: [\r\n '仓',\r\n '仺',\r\n '倉',\r\n '凔',\r\n '嵢',\r\n '沧',\r\n '滄',\r\n '濸',\r\n '獊',\r\n '舱',\r\n '艙',\r\n '苍',\r\n '蒼',\r\n '螥',\r\n '鸧',\r\n ],\r\n 'zǎi zǐ zī': ['仔'],\r\n tā: ['他', '塌', '它', '榙', '溻', '牠', '祂', '褟', '趿', '遢', '闧'],\r\n fù: [\r\n '付',\r\n '偩',\r\n '傅',\r\n '冨',\r\n '副',\r\n '咐',\r\n '坿',\r\n '复',\r\n '妇',\r\n '婦',\r\n '媍',\r\n '嬔',\r\n '富',\r\n '復',\r\n '椱',\r\n '祔',\r\n '禣',\r\n '竎',\r\n '緮',\r\n '縛',\r\n '缚',\r\n '腹',\r\n '萯',\r\n '蕧',\r\n '蚹',\r\n '蛗',\r\n '蝜',\r\n '蝮',\r\n '袝',\r\n '複',\r\n '覄',\r\n '覆',\r\n '訃',\r\n '詂',\r\n '讣',\r\n '負',\r\n '賦',\r\n '賻',\r\n '负',\r\n '赋',\r\n '赙',\r\n '赴',\r\n '輹',\r\n '鍑',\r\n '鍢',\r\n '阜',\r\n '附',\r\n '馥',\r\n '駙',\r\n '驸',\r\n '鮒',\r\n '鰒',\r\n '鲋',\r\n '鳆',\r\n '㳇',\r\n ],\r\n xiān: [\r\n '仙',\r\n '仚',\r\n '佡',\r\n '僊',\r\n '僲',\r\n '先',\r\n '嘕',\r\n '奾',\r\n '屳',\r\n '廯',\r\n '忺',\r\n '憸',\r\n '掀',\r\n '暹',\r\n '杴',\r\n '氙',\r\n '珗',\r\n '祆',\r\n '秈',\r\n '籼',\r\n '繊',\r\n '纎',\r\n '纖',\r\n '苮',\r\n '褼',\r\n '襳',\r\n '跹',\r\n '蹮',\r\n '躚',\r\n '酰',\r\n '鍁',\r\n '锨',\r\n '韯',\r\n '韱',\r\n '馦',\r\n '鱻',\r\n '鶱',\r\n '𬸣',\r\n ],\r\n 'tuō chà duó': ['仛'],\r\n hóng: [\r\n '仜',\r\n '吰',\r\n '垬',\r\n '妅',\r\n '娂',\r\n '宏',\r\n '宖',\r\n '弘',\r\n '彋',\r\n '汯',\r\n '泓',\r\n '洪',\r\n '浤',\r\n '渱',\r\n '潂',\r\n '玒',\r\n '玜',\r\n '竑',\r\n '竤',\r\n '篊',\r\n '粠',\r\n '紘',\r\n '紭',\r\n '綋',\r\n '纮',\r\n '翃',\r\n '翝',\r\n '耾',\r\n '苰',\r\n '荭',\r\n '葒',\r\n '葓',\r\n '谹',\r\n '谼',\r\n '鈜',\r\n '鉷',\r\n '鋐',\r\n '閎',\r\n '闳',\r\n '霐',\r\n '霟',\r\n '鞃',\r\n '魟',\r\n '鴻',\r\n '鸿',\r\n '黉',\r\n '黌',\r\n '𫟹',\r\n '𬭎',\r\n ],\r\n tóng: [\r\n '仝',\r\n '佟',\r\n '哃',\r\n '峂',\r\n '峝',\r\n '庝',\r\n '彤',\r\n '晍',\r\n '曈',\r\n '桐',\r\n '氃',\r\n '浵',\r\n '潼',\r\n '犝',\r\n '獞',\r\n '眮',\r\n '瞳',\r\n '砼',\r\n '秱',\r\n '童',\r\n '粡',\r\n '膧',\r\n '茼',\r\n '蚒',\r\n '詷',\r\n '赨',\r\n '酮',\r\n '鉖',\r\n '鉵',\r\n '銅',\r\n '铜',\r\n '餇',\r\n '鮦',\r\n '鲖',\r\n '𫍣',\r\n '𦒍',\r\n ],\r\n rèn: [\r\n '仞',\r\n '仭',\r\n '刃',\r\n '刄',\r\n '妊',\r\n '姙',\r\n '屻',\r\n '岃',\r\n '扨',\r\n '牣',\r\n '祍',\r\n '紉',\r\n '紝',\r\n '絍',\r\n '纫',\r\n '纴',\r\n '肕',\r\n '腍',\r\n '衽',\r\n '袵',\r\n '訒',\r\n '認',\r\n '认',\r\n '讱',\r\n '軔',\r\n '轫',\r\n '鈓',\r\n '靭',\r\n '靱',\r\n '韌',\r\n '韧',\r\n '飪',\r\n '餁',\r\n '饪',\r\n ],\r\n qiān: [\r\n '仟',\r\n '佥',\r\n '僉',\r\n '千',\r\n '圲',\r\n '奷',\r\n '孯',\r\n '岍',\r\n '悭',\r\n '愆',\r\n '慳',\r\n '扦',\r\n '拪',\r\n '搴',\r\n '撁',\r\n '攐',\r\n '攑',\r\n '攓',\r\n '杄',\r\n '櫏',\r\n '汘',\r\n '汧',\r\n '牵',\r\n '牽',\r\n '竏',\r\n '签',\r\n '簽',\r\n '籖',\r\n '籤',\r\n '粁',\r\n '芊',\r\n '茾',\r\n '蚈',\r\n '褰',\r\n '諐',\r\n '謙',\r\n '谦',\r\n '谸',\r\n '迁',\r\n '遷',\r\n '釺',\r\n '鈆',\r\n '鉛',\r\n '鏲',\r\n '钎',\r\n '阡',\r\n '韆',\r\n '顅',\r\n '騫',\r\n '骞',\r\n '鬜',\r\n '鬝',\r\n '鵮',\r\n '鹐',\r\n ],\r\n 'gǎn hàn': ['仠'],\r\n 'yì gē': ['仡'],\r\n dài: [\r\n '代',\r\n '侢',\r\n '叇',\r\n '垈',\r\n '埭',\r\n '岱',\r\n '帒',\r\n '带',\r\n '帯',\r\n '帶',\r\n '廗',\r\n '怠',\r\n '戴',\r\n '曃',\r\n '柋',\r\n '殆',\r\n '瀻',\r\n '玳',\r\n '瑇',\r\n '甙',\r\n '簤',\r\n '紿',\r\n '緿',\r\n '绐',\r\n '艜',\r\n '蝳',\r\n '袋',\r\n '襶',\r\n '貣',\r\n '贷',\r\n '蹛',\r\n '軑',\r\n '軚',\r\n '軩',\r\n '轪',\r\n '迨',\r\n '霴',\r\n '靆',\r\n '鴏',\r\n '黛',\r\n '黱',\r\n ],\r\n 'lìng líng lǐng': ['令'],\r\n chào: ['仦', '耖', '觘'],\r\n 'cháng zhǎng': ['仧', '兏', '長', '长'],\r\n sā: ['仨'],\r\n cháng: [\r\n '仩',\r\n '偿',\r\n '償',\r\n '嘗',\r\n '嚐',\r\n '嫦',\r\n '尝',\r\n '常',\r\n '徜',\r\n '瑺',\r\n '瓺',\r\n '甞',\r\n '肠',\r\n '腸',\r\n '膓',\r\n '苌',\r\n '萇',\r\n '镸',\r\n '鱨',\r\n '鲿',\r\n ],\r\n yí: [\r\n '仪',\r\n '侇',\r\n '儀',\r\n '冝',\r\n '匜',\r\n '咦',\r\n '圯',\r\n '夷',\r\n '姨',\r\n '宐',\r\n '宜',\r\n '宧',\r\n '寲',\r\n '峓',\r\n '嶬',\r\n '嶷',\r\n '巸',\r\n '彛',\r\n '彜',\r\n '彝',\r\n '彞',\r\n '怡',\r\n '恞',\r\n '扅',\r\n '暆',\r\n '栘',\r\n '椬',\r\n '椸',\r\n '沂',\r\n '洟',\r\n '熪',\r\n '瓵',\r\n '痍',\r\n '移',\r\n '簃',\r\n '籎',\r\n '羠',\r\n '胰',\r\n '萓',\r\n '蛦',\r\n '螔',\r\n '觺',\r\n '謻',\r\n '貽',\r\n '贻',\r\n '跠',\r\n '迻',\r\n '遺',\r\n '鏔',\r\n '頉',\r\n '頤',\r\n '頥',\r\n '顊',\r\n '颐',\r\n '饴',\r\n '鮧',\r\n '鴺',\r\n ],\r\n mù: [\r\n '仫',\r\n '凩',\r\n '募',\r\n '墓',\r\n '幕',\r\n '幙',\r\n '慔',\r\n '慕',\r\n '暮',\r\n '暯',\r\n '木',\r\n '楘',\r\n '毣',\r\n '沐',\r\n '炑',\r\n '牧',\r\n '狇',\r\n '目',\r\n '睦',\r\n '穆',\r\n '艒',\r\n '苜',\r\n '莯',\r\n '蚞',\r\n '鉬',\r\n '钼',\r\n '雮',\r\n '霂',\r\n ],\r\n 'men mén': ['们'],\r\n fǎn: ['仮', '反', '橎', '返'],\r\n 'chào miǎo': ['仯'],\r\n 'yǎng áng': ['仰'],\r\n zhòng: [\r\n '仲',\r\n '众',\r\n '堹',\r\n '妕',\r\n '媑',\r\n '狆',\r\n '眾',\r\n '祌',\r\n '筗',\r\n '茽',\r\n '蚛',\r\n '衆',\r\n '衶',\r\n '諥',\r\n ],\r\n 'pǐ pí': ['仳'],\r\n wò: [\r\n '仴',\r\n '偓',\r\n '卧',\r\n '媉',\r\n '幄',\r\n '握',\r\n '楃',\r\n '沃',\r\n '渥',\r\n '濣',\r\n '瓁',\r\n '瞃',\r\n '硪',\r\n '肟',\r\n '腛',\r\n '臥',\r\n '齷',\r\n '龌',\r\n ],\r\n jiàn: [\r\n '件',\r\n '俴',\r\n '健',\r\n '僭',\r\n '剑',\r\n '剣',\r\n '剱',\r\n '劍',\r\n '劎',\r\n '劒',\r\n '劔',\r\n '墹',\r\n '寋',\r\n '建',\r\n '徤',\r\n '擶',\r\n '旔',\r\n '楗',\r\n '毽',\r\n '洊',\r\n '涧',\r\n '澗',\r\n '牮',\r\n '珔',\r\n '瞷',\r\n '磵',\r\n '礀',\r\n '箭',\r\n '糋',\r\n '繝',\r\n '腱',\r\n '臶',\r\n '舰',\r\n '艦',\r\n '荐',\r\n '薦',\r\n '覸',\r\n '諓',\r\n '諫',\r\n '譛',\r\n '谏',\r\n '賎',\r\n '賤',\r\n '贱',\r\n '趝',\r\n '践',\r\n '踐',\r\n '踺',\r\n '轞',\r\n '鉴',\r\n '鍳',\r\n '鍵',\r\n '鐱',\r\n '鑑',\r\n '鑒',\r\n '鑬',\r\n '鑳',\r\n '键',\r\n '間',\r\n '餞',\r\n '饯',\r\n '𬣡',\r\n ],\r\n 'jià jiè jie': ['价'],\r\n 'yǎo fó': ['仸'],\r\n 'rèn rén': ['任'],\r\n 'fèn bīn': ['份'],\r\n dī: [\r\n '仾',\r\n '低',\r\n '啲',\r\n '埞',\r\n '堤',\r\n '岻',\r\n '彽',\r\n '樀',\r\n '滴',\r\n '磾',\r\n '秪',\r\n '羝',\r\n '袛',\r\n '趆',\r\n '隄',\r\n '鞮',\r\n '䃅',\r\n ],\r\n fǎng: [\r\n '仿',\r\n '倣',\r\n '旊',\r\n '昉',\r\n '昘',\r\n '瓬',\r\n '眆',\r\n '紡',\r\n '纺',\r\n '舫',\r\n '訪',\r\n '访',\r\n '髣',\r\n '鶭',\r\n ],\r\n zhōng: [\r\n '伀',\r\n '刣',\r\n '妐',\r\n '幒',\r\n '彸',\r\n '忠',\r\n '柊',\r\n '汷',\r\n '泈',\r\n '炂',\r\n '盅',\r\n '籦',\r\n '終',\r\n '终',\r\n '舯',\r\n '蔠',\r\n '蜙',\r\n '螤',\r\n '螽',\r\n '衳',\r\n '衷',\r\n '蹱',\r\n '鈡',\r\n '鍾',\r\n '鐘',\r\n '钟',\r\n '锺',\r\n '鴤',\r\n '鼨',\r\n ],\r\n pèi: [\r\n '伂',\r\n '佩',\r\n '姵',\r\n '帔',\r\n '斾',\r\n '旆',\r\n '沛',\r\n '浿',\r\n '珮',\r\n '蓜',\r\n '轡',\r\n '辔',\r\n '配',\r\n '霈',\r\n '馷',\r\n ],\r\n diào: [\r\n '伄',\r\n '吊',\r\n '弔',\r\n '掉',\r\n '瘹',\r\n '盄',\r\n '窎',\r\n '窵',\r\n '竨',\r\n '訋',\r\n '釣',\r\n '鈟',\r\n '銱',\r\n '鋽',\r\n '鑃',\r\n '钓',\r\n '铞',\r\n '雿',\r\n '魡',\r\n ],\r\n dùn: [\r\n '伅',\r\n '潡',\r\n '炖',\r\n '燉',\r\n '盾',\r\n '砘',\r\n '碷',\r\n '踲',\r\n '逇',\r\n '遁',\r\n '遯',\r\n '鈍',\r\n '钝',\r\n ],\r\n wěn: ['伆', '刎', '吻', '呅', '抆', '桽', '稳', '穏', '穩', '紊', '肳', '脗'],\r\n xǐn: ['伈'],\r\n kàng: ['伉', '匟', '囥', '抗', '炕', '鈧', '钪'],\r\n ài: [\r\n '伌',\r\n '僾',\r\n '塧',\r\n '壒',\r\n '嫒',\r\n '嬡',\r\n '愛',\r\n '懓',\r\n '暧',\r\n '曖',\r\n '爱',\r\n '瑷',\r\n '璦',\r\n '皧',\r\n '瞹',\r\n '砹',\r\n '硋',\r\n '碍',\r\n '礙',\r\n '薆',\r\n '譺',\r\n '賹',\r\n '鑀',\r\n '隘',\r\n '靉',\r\n '餲',\r\n '馤',\r\n '鱫',\r\n '鴱',\r\n ],\r\n 'jì qí': ['伎', '薺'],\r\n 'xiū xǔ': ['休'],\r\n 'jìn yín': ['伒'],\r\n dǎn: [\r\n '伔',\r\n '刐',\r\n '撢',\r\n '玬',\r\n '瓭',\r\n '紞',\r\n '胆',\r\n '膽',\r\n '衴',\r\n '賧',\r\n '赕',\r\n '黕',\r\n '𬘘',\r\n ],\r\n fū: [\r\n '伕',\r\n '呋',\r\n '娐',\r\n '孵',\r\n '尃',\r\n '怤',\r\n '懯',\r\n '敷',\r\n '旉',\r\n '玞',\r\n '砆',\r\n '稃',\r\n '筟',\r\n '糐',\r\n '綒',\r\n '肤',\r\n '膚',\r\n '荂',\r\n '荴',\r\n '衭',\r\n '趺',\r\n '跗',\r\n '邞',\r\n '鄜',\r\n '酜',\r\n '鈇',\r\n '麩',\r\n '麬',\r\n '麱',\r\n '麸',\r\n '𫓧',\r\n ],\r\n tǎng: [\r\n '伖',\r\n '傥',\r\n '儻',\r\n '埫',\r\n '戃',\r\n '曭',\r\n '爣',\r\n '矘',\r\n '躺',\r\n '鎲',\r\n '钂',\r\n '镋',\r\n ],\r\n yōu: [\r\n '优',\r\n '優',\r\n '呦',\r\n '嚘',\r\n '峳',\r\n '幽',\r\n '忧',\r\n '悠',\r\n '憂',\r\n '攸',\r\n '櫌',\r\n '滺',\r\n '瀀',\r\n '纋',\r\n '羪',\r\n '耰',\r\n '逌',\r\n '鄾',\r\n '麀',\r\n ],\r\n huǒ: ['伙', '夥', '火', '煷', '邩', '鈥', '钬'],\r\n 'huì kuài': ['会', '會', '浍', '璯'],\r\n yǔ: [\r\n '伛',\r\n '俁',\r\n '俣',\r\n '偊',\r\n '傴',\r\n '匬',\r\n '噳',\r\n '圄',\r\n '圉',\r\n '宇',\r\n '寙',\r\n '屿',\r\n '嶼',\r\n '庾',\r\n '挧',\r\n '敔',\r\n '斞',\r\n '楀',\r\n '瑀',\r\n '瘐',\r\n '祤',\r\n '禹',\r\n '穥',\r\n '窳',\r\n '羽',\r\n '與',\r\n '萭',\r\n '貐',\r\n '鄅',\r\n '頨',\r\n '麌',\r\n '齬',\r\n '龉',\r\n '㺄',\r\n ],\r\n cuì: [\r\n '伜',\r\n '啛',\r\n '忰',\r\n '悴',\r\n '毳',\r\n '淬',\r\n '焠',\r\n '疩',\r\n '瘁',\r\n '竁',\r\n '粋',\r\n '粹',\r\n '紣',\r\n '綷',\r\n '翆',\r\n '翠',\r\n '脃',\r\n '脆',\r\n '脺',\r\n '膬',\r\n '膵',\r\n '臎',\r\n '萃',\r\n '襊',\r\n '顇',\r\n ],\r\n sǎn: ['伞', '傘', '糤', '繖', '饊', '馓'],\r\n wěi: [\r\n '伟',\r\n '伪',\r\n '偉',\r\n '偽',\r\n '僞',\r\n '儰',\r\n '娓',\r\n '寪',\r\n '屗',\r\n '崣',\r\n '嶉',\r\n '徫',\r\n '愇',\r\n '捤',\r\n '暐',\r\n '梶',\r\n '洧',\r\n '浘',\r\n '渨',\r\n '炜',\r\n '煒',\r\n '猥',\r\n '玮',\r\n '瑋',\r\n '痿',\r\n '緯',\r\n '纬',\r\n '腲',\r\n '艉',\r\n '芛',\r\n '苇',\r\n '荱',\r\n '萎',\r\n '葦',\r\n '蒍',\r\n '蔿',\r\n '蜼',\r\n '諉',\r\n '诿',\r\n '踓',\r\n '鍡',\r\n '韑',\r\n '韙',\r\n '韡',\r\n '韪',\r\n '頠',\r\n '颹',\r\n '骩',\r\n '骪',\r\n '骫',\r\n '鮪',\r\n '鲔',\r\n '𫇭',\r\n '𬀩',\r\n '𬱟',\r\n ],\r\n 'chuán zhuàn': ['传', '傳'],\r\n 'chē jū': ['伡', '俥', '车'],\r\n 'jū chē': ['車'],\r\n yá: [\r\n '伢',\r\n '厑',\r\n '厓',\r\n '堐',\r\n '岈',\r\n '崕',\r\n '崖',\r\n '涯',\r\n '漄',\r\n '牙',\r\n '玡',\r\n '琊',\r\n '睚',\r\n '笌',\r\n '芽',\r\n '蚜',\r\n '衙',\r\n '齖',\r\n ],\r\n qiàn: [\r\n '伣',\r\n '俔',\r\n '倩',\r\n '儙',\r\n '刋',\r\n '壍',\r\n '嬱',\r\n '悓',\r\n '棈',\r\n '椠',\r\n '槧',\r\n '欠',\r\n '歉',\r\n '皘',\r\n '篏',\r\n '篟',\r\n '縴',\r\n '芡',\r\n '蒨',\r\n '蔳',\r\n '輤',\r\n '𬘬',\r\n ],\r\n shāng: [\r\n '伤',\r\n '傷',\r\n '商',\r\n '墒',\r\n '慯',\r\n '殇',\r\n '殤',\r\n '滳',\r\n '漡',\r\n '熵',\r\n '蔏',\r\n '螪',\r\n '觞',\r\n '觴',\r\n '謪',\r\n '鬺',\r\n ],\r\n chāng: [\r\n '伥',\r\n '倀',\r\n '娼',\r\n '昌',\r\n '椙',\r\n '淐',\r\n '猖',\r\n '琩',\r\n '菖',\r\n '裮',\r\n '錩',\r\n '锠',\r\n '閶',\r\n '阊',\r\n '鯧',\r\n '鲳',\r\n '鼚',\r\n ],\r\n 'chen cāng': ['伧'],\r\n xùn: [\r\n '伨',\r\n '侚',\r\n '卂',\r\n '噀',\r\n '巺',\r\n '巽',\r\n '徇',\r\n '愻',\r\n '殉',\r\n '殾',\r\n '汛',\r\n '潠',\r\n '狥',\r\n '蕈',\r\n '訊',\r\n '訓',\r\n '訙',\r\n '训',\r\n '讯',\r\n '迅',\r\n '迿',\r\n '逊',\r\n '遜',\r\n '鑂',\r\n '顨',\r\n '馴',\r\n '驯',\r\n ],\r\n xìn: ['伩', '囟', '孞', '脪', '舋', '衅', '訫', '釁', '阠', '顖'],\r\n chǐ: [\r\n '伬',\r\n '侈',\r\n '卶',\r\n '叺',\r\n '呎',\r\n '垑',\r\n '恥',\r\n '歯',\r\n '耻',\r\n '肔',\r\n '胣',\r\n '蚇',\r\n '裭',\r\n '褫',\r\n '豉',\r\n '鉹',\r\n '齒',\r\n '齿',\r\n ],\r\n 'xián xuán': ['伭'],\r\n 'nú nǔ': ['伮'],\r\n 'bó bǎi': ['伯'],\r\n 'gū gù': ['估'],\r\n nǐ: ['伱', '你', '儞', '孴', '拟', '擬', '旎', '晲', '狔', '苨', '薿', '隬'],\r\n 'nì ní': ['伲'],\r\n bàn: [\r\n '伴',\r\n '办',\r\n '半',\r\n '姅',\r\n '怑',\r\n '扮',\r\n '瓣',\r\n '秚',\r\n '絆',\r\n '绊',\r\n '辦',\r\n '鉡',\r\n '靽',\r\n ],\r\n xù: [\r\n '伵',\r\n '侐',\r\n '勖',\r\n '勗',\r\n '卹',\r\n '叙',\r\n '垿',\r\n '壻',\r\n '婿',\r\n '序',\r\n '恤',\r\n '敍',\r\n '敘',\r\n '旭',\r\n '昫',\r\n '朂',\r\n '槒',\r\n '欰',\r\n '殈',\r\n '汿',\r\n '沀',\r\n '洫',\r\n '溆',\r\n '漵',\r\n '潊',\r\n '烅',\r\n '烼',\r\n '煦',\r\n '獝',\r\n '珬',\r\n '盢',\r\n '瞁',\r\n '稸',\r\n '絮',\r\n '続',\r\n '緒',\r\n '緖',\r\n '續',\r\n '绪',\r\n '续',\r\n '聓',\r\n '聟',\r\n '蓄',\r\n '藚',\r\n '訹',\r\n '賉',\r\n '酗',\r\n '頊',\r\n '鱮',\r\n '㳚',\r\n ],\r\n zhòu: [\r\n '伷',\r\n '僽',\r\n '冑',\r\n '呪',\r\n '咒',\r\n '咮',\r\n '宙',\r\n '昼',\r\n '晝',\r\n '甃',\r\n '皱',\r\n '皺',\r\n '籀',\r\n '籒',\r\n '籕',\r\n '粙',\r\n '紂',\r\n '縐',\r\n '纣',\r\n '绉',\r\n '胄',\r\n '荮',\r\n '葤',\r\n '詋',\r\n '酎',\r\n '駎',\r\n '驟',\r\n '骤',\r\n '㤘',\r\n '㑇',\r\n ],\r\n shēn: [\r\n '伸',\r\n '侁',\r\n '兟',\r\n '呻',\r\n '堔',\r\n '妽',\r\n '娠',\r\n '屾',\r\n '峷',\r\n '扟',\r\n '敒',\r\n '曑',\r\n '柛',\r\n '氠',\r\n '深',\r\n '燊',\r\n '珅',\r\n '甡',\r\n '甧',\r\n '申',\r\n '眒',\r\n '砷',\r\n '穼',\r\n '籶',\r\n '籸',\r\n '糂',\r\n '紳',\r\n '绅',\r\n '罙',\r\n '罧',\r\n '葠',\r\n '蓡',\r\n '蔘',\r\n '薓',\r\n '裑',\r\n '訷',\r\n '詵',\r\n '诜',\r\n '身',\r\n '駪',\r\n '鯓',\r\n '鯵',\r\n '鰺',\r\n '鲹',\r\n '鵢',\r\n '𬳽',\r\n ],\r\n qū: [\r\n '伹',\r\n '佉',\r\n '匤',\r\n '呿',\r\n '坥',\r\n '屈',\r\n '岖',\r\n '岴',\r\n '嶇',\r\n '憈',\r\n '抾',\r\n '敺',\r\n '浀',\r\n '煀',\r\n '祛',\r\n '筁',\r\n '粬',\r\n '胠',\r\n '蛆',\r\n '蛐',\r\n '袪',\r\n '覻',\r\n '詘',\r\n '诎',\r\n '趍',\r\n '躯',\r\n '軀',\r\n '阹',\r\n '駆',\r\n '駈',\r\n '驅',\r\n '驱',\r\n '髷',\r\n '魼',\r\n '鰸',\r\n '鱋',\r\n '鶌',\r\n '麯',\r\n '麴',\r\n '麹',\r\n '黢',\r\n '㭕',\r\n '𪨰',\r\n '䓛',\r\n ],\r\n 'sì cì': ['伺'],\r\n bēng: ['伻', '嘣', '奟', '崩', '嵭', '閍'],\r\n 'sì shì': ['似'],\r\n 'jiā qié gā': ['伽'],\r\n 'yǐ chì': ['佁'],\r\n 'diàn tián': ['佃', '钿'],\r\n 'hān gàn': ['佄'],\r\n mài: [\r\n '佅',\r\n '劢',\r\n '勱',\r\n '卖',\r\n '唛',\r\n '売',\r\n '脈',\r\n '衇',\r\n '賣',\r\n '迈',\r\n '邁',\r\n '霡',\r\n '霢',\r\n '麥',\r\n '麦',\r\n '鿏',\r\n ],\r\n dàn: [\r\n '但',\r\n '僤',\r\n '啖',\r\n '啗',\r\n '啿',\r\n '噉',\r\n '嚪',\r\n '帎',\r\n '憺',\r\n '旦',\r\n '柦',\r\n '氮',\r\n '沊',\r\n '泹',\r\n '淡',\r\n '狚',\r\n '疍',\r\n '癚',\r\n '禫',\r\n '窞',\r\n '腅',\r\n '萏',\r\n '蓞',\r\n '蛋',\r\n '蜑',\r\n '觛',\r\n '訑',\r\n '誕',\r\n '诞',\r\n '贉',\r\n '霮',\r\n '餤',\r\n '饏',\r\n '駳',\r\n '髧',\r\n '鴠',\r\n '𫢸',\r\n ],\r\n bù: [\r\n '佈',\r\n '勏',\r\n '吥',\r\n '咘',\r\n '埗',\r\n '埠',\r\n '布',\r\n '廍',\r\n '怖',\r\n '悑',\r\n '步',\r\n '歨',\r\n '歩',\r\n '瓿',\r\n '篰',\r\n '荹',\r\n '蔀',\r\n '踄',\r\n '部',\r\n '郶',\r\n '鈈',\r\n '钚',\r\n '餢',\r\n ],\r\n bǐ: [\r\n '佊',\r\n '俾',\r\n '匕',\r\n '夶',\r\n '妣',\r\n '彼',\r\n '朼',\r\n '柀',\r\n '比',\r\n '毞',\r\n '沘',\r\n '疕',\r\n '秕',\r\n '笔',\r\n '筆',\r\n '粃',\r\n '聛',\r\n '舭',\r\n '貏',\r\n '鄙',\r\n ],\r\n 'zhāo shào': ['佋'],\r\n cǐ: ['佌', '此', '泚', '皉', '𫚖'],\r\n wèi: [\r\n '位',\r\n '卫',\r\n '味',\r\n '喂',\r\n '墛',\r\n '媦',\r\n '慰',\r\n '懀',\r\n '未',\r\n '渭',\r\n '煟',\r\n '熭',\r\n '犚',\r\n '猬',\r\n '畏',\r\n '緭',\r\n '罻',\r\n '胃',\r\n '苿',\r\n '菋',\r\n '藯',\r\n '蘶',\r\n '蝟',\r\n '螱',\r\n '衛',\r\n '衞',\r\n '褽',\r\n '謂',\r\n '讆',\r\n '讏',\r\n '谓',\r\n '躗',\r\n '躛',\r\n '軎',\r\n '轊',\r\n '鏏',\r\n '霨',\r\n '餧',\r\n '餵',\r\n '饖',\r\n '魏',\r\n '鮇',\r\n '鳚',\r\n ],\r\n zuǒ: ['佐', '左', '繓'],\r\n yǎng: [\r\n '佒',\r\n '傟',\r\n '养',\r\n '坱',\r\n '岟',\r\n '慃',\r\n '懩',\r\n '攁',\r\n '氧',\r\n '氱',\r\n '炴',\r\n '痒',\r\n '癢',\r\n '礢',\r\n '紻',\r\n '蝆',\r\n '軮',\r\n '養',\r\n '駚',\r\n ],\r\n 'tǐ tī': ['体', '體'],\r\n zhàn: [\r\n '佔',\r\n '偡',\r\n '嶘',\r\n '战',\r\n '戦',\r\n '戰',\r\n '栈',\r\n '桟',\r\n '棧',\r\n '湛',\r\n '站',\r\n '綻',\r\n '绽',\r\n '菚',\r\n '蘸',\r\n '虥',\r\n '虦',\r\n '譧',\r\n '轏',\r\n '驏',\r\n ],\r\n 'hé hē hè': ['何'],\r\n bì: [\r\n '佖',\r\n '咇',\r\n '哔',\r\n '嗶',\r\n '坒',\r\n '堛',\r\n '壁',\r\n '奰',\r\n '妼',\r\n '婢',\r\n '嬖',\r\n '币',\r\n '幣',\r\n '幤',\r\n '庇',\r\n '庳',\r\n '廦',\r\n '弊',\r\n '弻',\r\n '弼',\r\n '彃',\r\n '必',\r\n '怭',\r\n '愊',\r\n '愎',\r\n '敝',\r\n '斃',\r\n '梐',\r\n '毕',\r\n '毖',\r\n '毙',\r\n '湢',\r\n '滗',\r\n '滭',\r\n '潷',\r\n '煏',\r\n '熚',\r\n '狴',\r\n '獘',\r\n '獙',\r\n '珌',\r\n '璧',\r\n '畀',\r\n '畢',\r\n '疪',\r\n '痹',\r\n '痺',\r\n '皕',\r\n '睤',\r\n '碧',\r\n '筚',\r\n '箅',\r\n '箆',\r\n '篦',\r\n '篳',\r\n '粊',\r\n '綼',\r\n '縪',\r\n '繴',\r\n '罼',\r\n '腷',\r\n '苾',\r\n '荜',\r\n '萆',\r\n '萞',\r\n '蓖',\r\n '蓽',\r\n '蔽',\r\n '薜',\r\n '蜌',\r\n '袐',\r\n '襅',\r\n '襞',\r\n '襣',\r\n '觱',\r\n '詖',\r\n '诐',\r\n '貱',\r\n '贔',\r\n '赑',\r\n '跸',\r\n '蹕',\r\n '躃',\r\n '躄',\r\n '避',\r\n '邲',\r\n '鄨',\r\n '鄪',\r\n '鉍',\r\n '鏎',\r\n '鐴',\r\n '铋',\r\n '閇',\r\n '閉',\r\n '閟',\r\n '闭',\r\n '陛',\r\n '韠',\r\n '飶',\r\n '饆',\r\n '馝',\r\n '駜',\r\n '驆',\r\n '髀',\r\n '魓',\r\n '鮅',\r\n '鷝',\r\n '鷩',\r\n '鼊',\r\n ],\r\n tuó: [\r\n '佗',\r\n '坨',\r\n '堶',\r\n '岮',\r\n '槖',\r\n '橐',\r\n '沱',\r\n '砣',\r\n '砤',\r\n '碢',\r\n '紽',\r\n '詑',\r\n '跎',\r\n '酡',\r\n '阤',\r\n '陀',\r\n '陁',\r\n '駝',\r\n '駞',\r\n '騨',\r\n '驒',\r\n '驝',\r\n '驼',\r\n '鮀',\r\n '鴕',\r\n '鸵',\r\n '鼉',\r\n '鼍',\r\n '鼧',\r\n '𬶍',\r\n ],\r\n shé: ['佘', '舌', '虵', '蛥'],\r\n 'yì dié': ['佚', '昳', '泆', '軼'],\r\n 'fó fú bì bó': ['佛'],\r\n 'zuò zuō': ['作'],\r\n gōu: [\r\n '佝',\r\n '沟',\r\n '溝',\r\n '痀',\r\n '篝',\r\n '簼',\r\n '緱',\r\n '缑',\r\n '袧',\r\n '褠',\r\n '鈎',\r\n '鉤',\r\n '钩',\r\n '鞲',\r\n '韝',\r\n ],\r\n nìng: ['佞', '侫', '倿', '寕', '泞', '澝', '濘'],\r\n qú: [\r\n '佢',\r\n '劬',\r\n '戵',\r\n '斪',\r\n '欋',\r\n '欔',\r\n '氍',\r\n '淭',\r\n '灈',\r\n '爠',\r\n '璖',\r\n '璩',\r\n '癯',\r\n '磲',\r\n '籧',\r\n '絇',\r\n '胊',\r\n '臞',\r\n '菃',\r\n '葋',\r\n '蕖',\r\n '蘧',\r\n '蟝',\r\n '蠷',\r\n '蠼',\r\n '衐',\r\n '衢',\r\n '躣',\r\n '軥',\r\n '鑺',\r\n '鴝',\r\n '鸜',\r\n '鸲',\r\n '鼩',\r\n ],\r\n 'yōng yòng': ['佣'],\r\n wǎ: ['佤', '咓', '砙', '邷'],\r\n kǎ: ['佧', '垰', '胩', '裃', '鉲'],\r\n bāo: [\r\n '佨',\r\n '勹',\r\n '包',\r\n '孢',\r\n '煲',\r\n '笣',\r\n '胞',\r\n '苞',\r\n '蕔',\r\n '裦',\r\n '褒',\r\n '襃',\r\n '闁',\r\n '齙',\r\n '龅',\r\n ],\r\n 'huái huí': ['佪'],\r\n 'gé hè': ['佫'],\r\n lǎo: [\r\n '佬',\r\n '咾',\r\n '恅',\r\n '栳',\r\n '狫',\r\n '珯',\r\n '硓',\r\n '老',\r\n '耂',\r\n '荖',\r\n '蛯',\r\n '轑',\r\n '銠',\r\n '铑',\r\n '鮱',\r\n ],\r\n xiáng: ['佭', '庠', '栙', '祥', '絴', '翔', '詳', '跭'],\r\n gé: [\r\n '佮',\r\n '匌',\r\n '呄',\r\n '嗝',\r\n '塥',\r\n '愅',\r\n '挌',\r\n '搿',\r\n '槅',\r\n '櫊',\r\n '滆',\r\n '膈',\r\n '臵',\r\n '茖',\r\n '觡',\r\n '諽',\r\n '輵',\r\n '轕',\r\n '閣',\r\n '阁',\r\n '隔',\r\n '鞷',\r\n '韐',\r\n '韚',\r\n '騔',\r\n '骼',\r\n '鮯',\r\n ],\r\n yáng: [\r\n '佯',\r\n '劷',\r\n '垟',\r\n '崸',\r\n '徉',\r\n '扬',\r\n '揚',\r\n '敭',\r\n '旸',\r\n '昜',\r\n '暘',\r\n '杨',\r\n '楊',\r\n '洋',\r\n '炀',\r\n '珜',\r\n '疡',\r\n '瘍',\r\n '眻',\r\n '蛘',\r\n '諹',\r\n '輰',\r\n '鍚',\r\n '钖',\r\n '阦',\r\n '阳',\r\n '陽',\r\n '霷',\r\n '颺',\r\n '飏',\r\n '鰑',\r\n '鴹',\r\n '鸉',\r\n ],\r\n bǎi: ['佰', '捭', '摆', '擺', '栢', '百', '竡', '粨', '襬'],\r\n fǎ: ['佱', '峜', '法', '灋', '砝', '鍅'],\r\n mǐng: ['佲', '凕', '姳', '慏', '酩'],\r\n 'èr nài': ['佴'],\r\n hěn: ['佷', '很', '狠', '詪', '𬣳'],\r\n huó: ['佸', '活'],\r\n guǐ: [\r\n '佹',\r\n '匦',\r\n '匭',\r\n '厬',\r\n '垝',\r\n '姽',\r\n '宄',\r\n '庋',\r\n '庪',\r\n '恑',\r\n '晷',\r\n '湀',\r\n '癸',\r\n '祪',\r\n '簋',\r\n '蛫',\r\n '蟡',\r\n '觤',\r\n '詭',\r\n '诡',\r\n '軌',\r\n '轨',\r\n '陒',\r\n '鬼',\r\n ],\r\n quán: [\r\n '佺',\r\n '全',\r\n '啳',\r\n '埢',\r\n '姾',\r\n '峑',\r\n '巏',\r\n '拳',\r\n '搼',\r\n '权',\r\n '楾',\r\n '権',\r\n '權',\r\n '泉',\r\n '洤',\r\n '湶',\r\n '牷',\r\n '犈',\r\n '瑔',\r\n '痊',\r\n '硂',\r\n '筌',\r\n '縓',\r\n '荃',\r\n '葲',\r\n '蜷',\r\n '蠸',\r\n '觠',\r\n '詮',\r\n '诠',\r\n '跧',\r\n '踡',\r\n '輇',\r\n '辁',\r\n '醛',\r\n '銓',\r\n '铨',\r\n '闎',\r\n '顴',\r\n '颧',\r\n '駩',\r\n '騡',\r\n '鬈',\r\n '鰁',\r\n '鳈',\r\n '齤',\r\n ],\r\n tiāo: ['佻', '庣', '旫', '祧', '聎'],\r\n jiǎo: [\r\n '佼',\r\n '儌',\r\n '孂',\r\n '挢',\r\n '搅',\r\n '撟',\r\n '撹',\r\n '攪',\r\n '敫',\r\n '敽',\r\n '敿',\r\n '晈',\r\n '暞',\r\n '曒',\r\n '灚',\r\n '燞',\r\n '狡',\r\n '璬',\r\n '皎',\r\n '皦',\r\n '絞',\r\n '纐',\r\n '绞',\r\n '腳',\r\n '臫',\r\n '蟜',\r\n '譑',\r\n '賋',\r\n '踋',\r\n '鉸',\r\n '铰',\r\n '餃',\r\n '饺',\r\n '鱎',\r\n '龣',\r\n ],\r\n cì: [\r\n '佽',\r\n '刾',\r\n '庛',\r\n '朿',\r\n '栨',\r\n '次',\r\n '絘',\r\n '茦',\r\n '莿',\r\n '蛓',\r\n '螆',\r\n '賜',\r\n '赐',\r\n ],\r\n xíng: [\r\n '侀',\r\n '刑',\r\n '哘',\r\n '型',\r\n '娙',\r\n '形',\r\n '洐',\r\n '硎',\r\n '蛵',\r\n '邢',\r\n '郉',\r\n '鈃',\r\n '鉶',\r\n '銒',\r\n '钘',\r\n '铏',\r\n '陉',\r\n '陘',\r\n '餳',\r\n '𫰛',\r\n ],\r\n tuō: [\r\n '侂',\r\n '咃',\r\n '咜',\r\n '圫',\r\n '托',\r\n '拕',\r\n '拖',\r\n '汑',\r\n '脫',\r\n '脱',\r\n '莌',\r\n '袥',\r\n '託',\r\n '讬',\r\n '飥',\r\n '饦',\r\n '魠',\r\n '鮵',\r\n ],\r\n kǎn: ['侃', '偘', '冚', '坎', '惂', '砍', '莰', '輡', '轗', '顑'],\r\n zhí: [\r\n '侄',\r\n '値',\r\n '值',\r\n '埴',\r\n '執',\r\n '姪',\r\n '嬂',\r\n '戠',\r\n '执',\r\n '摭',\r\n '植',\r\n '樴',\r\n '淔',\r\n '漐',\r\n '直',\r\n '禃',\r\n '絷',\r\n '縶',\r\n '聀',\r\n '职',\r\n '職',\r\n '膱',\r\n '蟙',\r\n '跖',\r\n '踯',\r\n '蹠',\r\n '躑',\r\n '軄',\r\n '釞',\r\n '馽',\r\n ],\r\n gāi: [\r\n '侅',\r\n '垓',\r\n '姟',\r\n '峐',\r\n '晐',\r\n '畡',\r\n '祴',\r\n '荄',\r\n '該',\r\n '该',\r\n '豥',\r\n '賅',\r\n '賌',\r\n '赅',\r\n '陔',\r\n ],\r\n lái: [\r\n '來',\r\n '俫',\r\n '倈',\r\n '崃',\r\n '崍',\r\n '庲',\r\n '来',\r\n '梾',\r\n '棶',\r\n '涞',\r\n '淶',\r\n '猍',\r\n '琜',\r\n '筙',\r\n '箂',\r\n '莱',\r\n '萊',\r\n '逨',\r\n '郲',\r\n '錸',\r\n '铼',\r\n '騋',\r\n '鯠',\r\n '鶆',\r\n '麳',\r\n ],\r\n kuǎ: ['侉', '咵', '垮', '銙'],\r\n gōng: [\r\n '侊',\r\n '公',\r\n '功',\r\n '匑',\r\n '匔',\r\n '塨',\r\n '宫',\r\n '宮',\r\n '工',\r\n '幊',\r\n '弓',\r\n '恭',\r\n '攻',\r\n '杛',\r\n '碽',\r\n '糼',\r\n '糿',\r\n '肱',\r\n '觥',\r\n '觵',\r\n '躬',\r\n '躳',\r\n '髸',\r\n '龔',\r\n '龚',\r\n '䢼',\r\n ],\r\n lì: [\r\n '例',\r\n '俐',\r\n '俪',\r\n '傈',\r\n '儮',\r\n '儷',\r\n '凓',\r\n '利',\r\n '力',\r\n '励',\r\n '勵',\r\n '历',\r\n '厉',\r\n '厤',\r\n '厯',\r\n '厲',\r\n '叓',\r\n '吏',\r\n '呖',\r\n '唎',\r\n '唳',\r\n '嚦',\r\n '囇',\r\n '坜',\r\n '塛',\r\n '壢',\r\n '娳',\r\n '婯',\r\n '屴',\r\n '岦',\r\n '悧',\r\n '悷',\r\n '慄',\r\n '戾',\r\n '搮',\r\n '暦',\r\n '曆',\r\n '曞',\r\n '朸',\r\n '枥',\r\n '栃',\r\n '栗',\r\n '栛',\r\n '檪',\r\n '櫔',\r\n '櫪',\r\n '欐',\r\n '歴',\r\n '歷',\r\n '沥',\r\n '沴',\r\n '涖',\r\n '溧',\r\n '濿',\r\n '瀝',\r\n '爏',\r\n '犡',\r\n '猁',\r\n '珕',\r\n '瑮',\r\n '瓅',\r\n '瓑',\r\n '瓥',\r\n '疬',\r\n '痢',\r\n '癧',\r\n '盭',\r\n '睙',\r\n '砅',\r\n '砺',\r\n '砾',\r\n '磿',\r\n '礪',\r\n '礫',\r\n '礰',\r\n '禲',\r\n '秝',\r\n '立',\r\n '笠',\r\n '篥',\r\n '粒',\r\n '粝',\r\n '糲',\r\n '脷',\r\n '苈',\r\n '茘',\r\n '荔',\r\n '莅',\r\n '莉',\r\n '蒚',\r\n '蒞',\r\n '藶',\r\n '蚸',\r\n '蛎',\r\n '蛠',\r\n '蜧',\r\n '蝷',\r\n '蠇',\r\n '蠣',\r\n '詈',\r\n '讈',\r\n '赲',\r\n '轢',\r\n '轣',\r\n '轹',\r\n '酈',\r\n '鉝',\r\n '隶',\r\n '隷',\r\n '雳',\r\n '靂',\r\n '靋',\r\n '鬁',\r\n '鳨',\r\n '鴗',\r\n '鷅',\r\n '麜',\r\n '𫵷',\r\n '𬍛',\r\n ],\r\n yīn: [\r\n '侌',\r\n '凐',\r\n '喑',\r\n '噾',\r\n '囙',\r\n '因',\r\n '垔',\r\n '堙',\r\n '姻',\r\n '婣',\r\n '愔',\r\n '慇',\r\n '栶',\r\n '氤',\r\n '洇',\r\n '溵',\r\n '濦',\r\n '瘖',\r\n '禋',\r\n '秵',\r\n '筃',\r\n '絪',\r\n '緸',\r\n '茵',\r\n '蒑',\r\n '蔭',\r\n '裀',\r\n '諲',\r\n '銦',\r\n '铟',\r\n '闉',\r\n '阥',\r\n '阴',\r\n '陰',\r\n '陻',\r\n '隂',\r\n '霒',\r\n '霠',\r\n '鞇',\r\n '音',\r\n '韾',\r\n '駰',\r\n '骃',\r\n '齗',\r\n '𬘡',\r\n '𬤇',\r\n '𬮱',\r\n ],\r\n mǐ: [\r\n '侎',\r\n '孊',\r\n '弭',\r\n '敉',\r\n '洣',\r\n '渳',\r\n '灖',\r\n '米',\r\n '粎',\r\n '羋',\r\n '脒',\r\n '芈',\r\n '葞',\r\n '蔝',\r\n '銤',\r\n ],\r\n zhū: [\r\n '侏',\r\n '株',\r\n '槠',\r\n '橥',\r\n '櫧',\r\n '櫫',\r\n '洙',\r\n '潴',\r\n '瀦',\r\n '猪',\r\n '珠',\r\n '硃',\r\n '秼',\r\n '絑',\r\n '茱',\r\n '蕏',\r\n '蛛',\r\n '蝫',\r\n '蠩',\r\n '袾',\r\n '誅',\r\n '諸',\r\n '诛',\r\n '诸',\r\n '豬',\r\n '跦',\r\n '邾',\r\n '銖',\r\n '铢',\r\n '駯',\r\n '鮢',\r\n '鯺',\r\n '鴸',\r\n '鼄',\r\n ],\r\n ān: [\r\n '侒',\r\n '偣',\r\n '媕',\r\n '安',\r\n '峖',\r\n '庵',\r\n '桉',\r\n '氨',\r\n '盦',\r\n '盫',\r\n '腤',\r\n '菴',\r\n '萻',\r\n '葊',\r\n '蓭',\r\n '誝',\r\n '諳',\r\n '谙',\r\n '鞌',\r\n '鞍',\r\n '韽',\r\n '馣',\r\n '鮟',\r\n '鵪',\r\n '鶕',\r\n '鹌',\r\n '𩽾',\r\n ],\r\n lù: [\r\n '侓',\r\n '僇',\r\n '勎',\r\n '勠',\r\n '圥',\r\n '坴',\r\n '塶',\r\n '娽',\r\n '峍',\r\n '廘',\r\n '彔',\r\n '录',\r\n '戮',\r\n '摝',\r\n '椂',\r\n '樚',\r\n '淕',\r\n '淥',\r\n '渌',\r\n '漉',\r\n '潞',\r\n '琭',\r\n '璐',\r\n '甪',\r\n '盝',\r\n '睩',\r\n '硉',\r\n '祿',\r\n '禄',\r\n '稑',\r\n '穋',\r\n '箓',\r\n '簏',\r\n '簬',\r\n '簵',\r\n '簶',\r\n '籙',\r\n '粶',\r\n '蔍',\r\n '蕗',\r\n '虂',\r\n '螰',\r\n '賂',\r\n '赂',\r\n '趢',\r\n '路',\r\n '踛',\r\n '蹗',\r\n '輅',\r\n '轆',\r\n '辂',\r\n '辘',\r\n '逯',\r\n '醁',\r\n '錄',\r\n '録',\r\n '錴',\r\n '鏴',\r\n '陸',\r\n '騄',\r\n '騼',\r\n '鯥',\r\n '鴼',\r\n '鵦',\r\n '鵱',\r\n '鷺',\r\n '鹭',\r\n '鹿',\r\n '麓',\r\n '𫘧',\r\n ],\r\n móu: ['侔', '劺', '恈', '眸', '蛑', '謀', '谋', '踎', '鍪', '鴾', '麰'],\r\n ér: [\r\n '侕',\r\n '儿',\r\n '児',\r\n '兒',\r\n '峏',\r\n '栭',\r\n '洏',\r\n '粫',\r\n '而',\r\n '胹',\r\n '荋',\r\n '袻',\r\n '輀',\r\n '轜',\r\n '陑',\r\n '隭',\r\n '髵',\r\n '鮞',\r\n '鲕',\r\n '鴯',\r\n '鸸',\r\n ],\r\n 'dòng tǒng tóng': ['侗'],\r\n chà: ['侘', '奼', '姹', '岔', '汊', '詫', '诧'],\r\n chì: [\r\n '侙',\r\n '傺',\r\n '勅',\r\n '勑',\r\n '叱',\r\n '啻',\r\n '彳',\r\n '恜',\r\n '慗',\r\n '憏',\r\n '懘',\r\n '抶',\r\n '敕',\r\n '斥',\r\n '杘',\r\n '湁',\r\n '灻',\r\n '炽',\r\n '烾',\r\n '熾',\r\n '痓',\r\n '痸',\r\n '瘛',\r\n '翄',\r\n '翅',\r\n '翤',\r\n '翨',\r\n '腟',\r\n '赤',\r\n '趩',\r\n '遫',\r\n '鉓',\r\n '雴',\r\n '飭',\r\n '饬',\r\n '鶒',\r\n '鷘',\r\n ],\r\n 'gòng gōng': ['供', '共'],\r\n zhōu: [\r\n '侜',\r\n '周',\r\n '喌',\r\n '州',\r\n '徟',\r\n '洲',\r\n '淍',\r\n '炿',\r\n '烐',\r\n '珘',\r\n '矪',\r\n '舟',\r\n '謅',\r\n '譸',\r\n '诌',\r\n '賙',\r\n '赒',\r\n '輈',\r\n '輖',\r\n '辀',\r\n '週',\r\n '郮',\r\n '銂',\r\n '霌',\r\n '駲',\r\n '騆',\r\n '鵃',\r\n '鸼',\r\n ],\r\n rú: [\r\n '侞',\r\n '儒',\r\n '嚅',\r\n '如',\r\n '嬬',\r\n '孺',\r\n '帤',\r\n '曘',\r\n '桇',\r\n '渪',\r\n '濡',\r\n '筎',\r\n '茹',\r\n '蕠',\r\n '薷',\r\n '蝡',\r\n '蠕',\r\n '袽',\r\n '襦',\r\n '邚',\r\n '醹',\r\n '銣',\r\n '铷',\r\n '顬',\r\n '颥',\r\n '鱬',\r\n '鴑',\r\n '鴽',\r\n ],\r\n 'jiàn cún': ['侟'],\r\n xiá: [\r\n '侠',\r\n '俠',\r\n '匣',\r\n '峡',\r\n '峽',\r\n '敮',\r\n '暇',\r\n '柙',\r\n '炠',\r\n '烚',\r\n '狎',\r\n '狭',\r\n '狹',\r\n '珨',\r\n '瑕',\r\n '硖',\r\n '硤',\r\n '碬',\r\n '祫',\r\n '筪',\r\n '縖',\r\n '翈',\r\n '舝',\r\n '舺',\r\n '蕸',\r\n '赮',\r\n '轄',\r\n '辖',\r\n '遐',\r\n '鍜',\r\n '鎋',\r\n '陜',\r\n '陿',\r\n '霞',\r\n '騢',\r\n '魻',\r\n '鶷',\r\n '黠',\r\n ],\r\n lǚ: [\r\n '侣',\r\n '侶',\r\n '儢',\r\n '吕',\r\n '呂',\r\n '屡',\r\n '屢',\r\n '履',\r\n '挔',\r\n '捛',\r\n '旅',\r\n '梠',\r\n '焒',\r\n '祣',\r\n '稆',\r\n '穭',\r\n '絽',\r\n '縷',\r\n '缕',\r\n '膂',\r\n '膐',\r\n '褛',\r\n '褸',\r\n '郘',\r\n '鋁',\r\n '铝',\r\n ],\r\n ta: ['侤'],\r\n 'jiǎo yáo': ['侥', '僥', '徺'],\r\n zhēn: [\r\n '侦',\r\n '偵',\r\n '寊',\r\n '帧',\r\n '帪',\r\n '幀',\r\n '搸',\r\n '斟',\r\n '桢',\r\n '楨',\r\n '榛',\r\n '樼',\r\n '殝',\r\n '浈',\r\n '湞',\r\n '潧',\r\n '澵',\r\n '獉',\r\n '珍',\r\n '珎',\r\n '瑧',\r\n '甄',\r\n '眞',\r\n '真',\r\n '砧',\r\n '碪',\r\n '祯',\r\n '禎',\r\n '禛',\r\n '箴',\r\n '胗',\r\n '臻',\r\n '葴',\r\n '蒖',\r\n '蓁',\r\n '薽',\r\n '貞',\r\n '贞',\r\n '轃',\r\n '遉',\r\n '酙',\r\n '針',\r\n '鉁',\r\n '錱',\r\n '鍼',\r\n '针',\r\n '鱵',\r\n ],\r\n 'cè zè zhāi': ['侧', '側'],\r\n kuài: [\r\n '侩',\r\n '儈',\r\n '凷',\r\n '哙',\r\n '噲',\r\n '圦',\r\n '块',\r\n '塊',\r\n '巜',\r\n '廥',\r\n '快',\r\n '旝',\r\n '欳',\r\n '狯',\r\n '獪',\r\n '筷',\r\n '糩',\r\n '脍',\r\n '膾',\r\n '郐',\r\n '鄶',\r\n '鱠',\r\n '鲙',\r\n ],\r\n chái: ['侪', '儕', '喍', '柴', '犲', '祡', '豺'],\r\n nóng: [\r\n '侬',\r\n '儂',\r\n '农',\r\n '哝',\r\n '噥',\r\n '檂',\r\n '欁',\r\n '浓',\r\n '濃',\r\n '燶',\r\n '禯',\r\n '秾',\r\n '穠',\r\n '脓',\r\n '膿',\r\n '蕽',\r\n '襛',\r\n '譨',\r\n '農',\r\n '辳',\r\n '醲',\r\n '鬞',\r\n '𬪩',\r\n ],\r\n jǐn: [\r\n '侭',\r\n '儘',\r\n '卺',\r\n '厪',\r\n '巹',\r\n '槿',\r\n '漌',\r\n '瑾',\r\n '紧',\r\n '緊',\r\n '菫',\r\n '蓳',\r\n '謹',\r\n '谨',\r\n '錦',\r\n '锦',\r\n '饉',\r\n '馑',\r\n ],\r\n 'hóu hòu': ['侯', '矦'],\r\n jiǒng: [\r\n '侰',\r\n '僒',\r\n '冏',\r\n '囧',\r\n '泂',\r\n '澃',\r\n '炯',\r\n '烱',\r\n '煚',\r\n '煛',\r\n '熲',\r\n '燛',\r\n '窘',\r\n '綗',\r\n '褧',\r\n '迥',\r\n '逈',\r\n '顈',\r\n '颎',\r\n '䌹',\r\n ],\r\n 'chěng tǐng': ['侱'],\r\n 'zhèn zhēn': ['侲', '揕'],\r\n zuò: [\r\n '侳',\r\n '做',\r\n '唑',\r\n '坐',\r\n '岝',\r\n '岞',\r\n '座',\r\n '祚',\r\n '糳',\r\n '胙',\r\n '葃',\r\n '葄',\r\n '蓙',\r\n '袏',\r\n '阼',\r\n ],\r\n qīn: [\r\n '侵',\r\n '兓',\r\n '媇',\r\n '嵚',\r\n '嶔',\r\n '欽',\r\n '衾',\r\n '誛',\r\n '钦',\r\n '顉',\r\n '駸',\r\n '骎',\r\n '鮼',\r\n ],\r\n jú: [\r\n '侷',\r\n '啹',\r\n '婅',\r\n '局',\r\n '巈',\r\n '椈',\r\n '橘',\r\n '泦',\r\n '淗',\r\n '湨',\r\n '焗',\r\n '犑',\r\n '狊',\r\n '粷',\r\n '菊',\r\n '蘜',\r\n '趜',\r\n '跼',\r\n '蹫',\r\n '輂',\r\n '郹',\r\n '閰',\r\n '駶',\r\n '驧',\r\n '鵙',\r\n '鵴',\r\n '鶪',\r\n '鼰',\r\n '鼳',\r\n '䴗',\r\n ],\r\n 'shù dōu': ['侸'],\r\n tǐng: [\r\n '侹',\r\n '圢',\r\n '娗',\r\n '挺',\r\n '涏',\r\n '烶',\r\n '珽',\r\n '脡',\r\n '艇',\r\n '誔',\r\n '頲',\r\n '颋',\r\n ],\r\n shèn: [\r\n '侺',\r\n '愼',\r\n '慎',\r\n '昚',\r\n '涁',\r\n '渗',\r\n '滲',\r\n '瘆',\r\n '瘮',\r\n '眘',\r\n '祳',\r\n '肾',\r\n '胂',\r\n '脤',\r\n '腎',\r\n '蜃',\r\n '蜄',\r\n '鋠',\r\n ],\r\n 'tuì tuó': ['侻'],\r\n nán: [\r\n '侽',\r\n '喃',\r\n '娚',\r\n '抩',\r\n '暔',\r\n '枏',\r\n '柟',\r\n '楠',\r\n '男',\r\n '畘',\r\n '莮',\r\n '萳',\r\n '遖',\r\n ],\r\n xiāo: [\r\n '侾',\r\n '哓',\r\n '嘵',\r\n '嚻',\r\n '囂',\r\n '婋',\r\n '宯',\r\n '宵',\r\n '庨',\r\n '彇',\r\n '揱',\r\n '枭',\r\n '枵',\r\n '梟',\r\n '櫹',\r\n '歊',\r\n '毊',\r\n '消',\r\n '潇',\r\n '瀟',\r\n '灱',\r\n '灲',\r\n '烋',\r\n '焇',\r\n '猇',\r\n '獢',\r\n '痚',\r\n '痟',\r\n '硝',\r\n '硣',\r\n '窙',\r\n '箫',\r\n '簘',\r\n '簫',\r\n '綃',\r\n '绡',\r\n '翛',\r\n '膮',\r\n '萧',\r\n '蕭',\r\n '虈',\r\n '虓',\r\n '蟂',\r\n '蟏',\r\n '蟰',\r\n '蠨',\r\n '踃',\r\n '逍',\r\n '銷',\r\n '销',\r\n '霄',\r\n '颵',\r\n '驍',\r\n '骁',\r\n '髇',\r\n '髐',\r\n '魈',\r\n '鴞',\r\n '鴵',\r\n '鷍',\r\n '鸮',\r\n ],\r\n 'biàn pián': ['便', '緶', '缏'],\r\n tuǐ: ['俀', '腿', '蹆', '骽'],\r\n xì: [\r\n '係',\r\n '匸',\r\n '卌',\r\n '呬',\r\n '墍',\r\n '屃',\r\n '屓',\r\n '屭',\r\n '忥',\r\n '怬',\r\n '恄',\r\n '椞',\r\n '潝',\r\n '潟',\r\n '澙',\r\n '熂',\r\n '犔',\r\n '磶',\r\n '禊',\r\n '細',\r\n '綌',\r\n '縘',\r\n '细',\r\n '绤',\r\n '舃',\r\n '舄',\r\n '蕮',\r\n '虩',\r\n '衋',\r\n '覤',\r\n '赩',\r\n '趇',\r\n '郤',\r\n '釳',\r\n '阋',\r\n '隙',\r\n '隟',\r\n '霼',\r\n '餼',\r\n '饩',\r\n '鬩',\r\n '黖',\r\n ],\r\n cù: [\r\n '促',\r\n '媨',\r\n '憱',\r\n '猝',\r\n '瘄',\r\n '瘯',\r\n '簇',\r\n '縬',\r\n '脨',\r\n '蔟',\r\n '誎',\r\n '趗',\r\n '踧',\r\n '踿',\r\n '蹙',\r\n '蹴',\r\n '蹵',\r\n '醋',\r\n '顣',\r\n '鼀',\r\n ],\r\n é: [\r\n '俄',\r\n '囮',\r\n '娥',\r\n '峉',\r\n '峨',\r\n '峩',\r\n '涐',\r\n '珴',\r\n '皒',\r\n '睋',\r\n '磀',\r\n '莪',\r\n '訛',\r\n '誐',\r\n '譌',\r\n '讹',\r\n '迗',\r\n '鈋',\r\n '鋨',\r\n '锇',\r\n '頟',\r\n '額',\r\n '额',\r\n '魤',\r\n '鵝',\r\n '鵞',\r\n '鹅',\r\n ],\r\n qiú: [\r\n '俅',\r\n '叴',\r\n '唒',\r\n '囚',\r\n '崷',\r\n '巯',\r\n '巰',\r\n '扏',\r\n '梂',\r\n '殏',\r\n '毬',\r\n '求',\r\n '汓',\r\n '泅',\r\n '浗',\r\n '湭',\r\n '煪',\r\n '犰',\r\n '玌',\r\n '球',\r\n '璆',\r\n '皳',\r\n '盚',\r\n '紌',\r\n '絿',\r\n '肍',\r\n '芁',\r\n '莍',\r\n '虬',\r\n '虯',\r\n '蛷',\r\n '裘',\r\n '觓',\r\n '觩',\r\n '訄',\r\n '訅',\r\n '賕',\r\n '赇',\r\n '逎',\r\n '逑',\r\n '遒',\r\n '酋',\r\n '釚',\r\n '釻',\r\n '銶',\r\n '頄',\r\n '鮂',\r\n '鯄',\r\n '鰽',\r\n '鼽',\r\n '𨱇',\r\n ],\r\n xú: ['俆', '徐', '禑'],\r\n 'guàng kuāng': ['俇'],\r\n kù: [\r\n '俈',\r\n '喾',\r\n '嚳',\r\n '库',\r\n '庫',\r\n '廤',\r\n '瘔',\r\n '絝',\r\n '绔',\r\n '袴',\r\n '裤',\r\n '褲',\r\n '酷',\r\n ],\r\n wù: [\r\n '俉',\r\n '务',\r\n '務',\r\n '勿',\r\n '卼',\r\n '坞',\r\n '塢',\r\n '奦',\r\n '婺',\r\n '寤',\r\n '屼',\r\n '岉',\r\n '嵨',\r\n '忢',\r\n '悞',\r\n '悟',\r\n '悮',\r\n '戊',\r\n '扤',\r\n '晤',\r\n '杌',\r\n '溩',\r\n '焐',\r\n '熃',\r\n '物',\r\n '痦',\r\n '矹',\r\n '窹',\r\n '粅',\r\n '蘁',\r\n '誤',\r\n '误',\r\n '鋈',\r\n '阢',\r\n '隖',\r\n '雾',\r\n '霚',\r\n '霧',\r\n '靰',\r\n '騖',\r\n '骛',\r\n '鶩',\r\n '鹜',\r\n '鼿',\r\n '齀',\r\n ],\r\n jùn: [\r\n '俊',\r\n '儁',\r\n '呁',\r\n '埈',\r\n '寯',\r\n '峻',\r\n '懏',\r\n '捃',\r\n '攟',\r\n '晙',\r\n '棞',\r\n '燇',\r\n '珺',\r\n '畯',\r\n '竣',\r\n '箟',\r\n '蜠',\r\n '賐',\r\n '郡',\r\n '陖',\r\n '餕',\r\n '馂',\r\n '駿',\r\n '骏',\r\n '鵔',\r\n '鵕',\r\n '鵘',\r\n '䐃',\r\n ],\r\n liáng: [\r\n '俍',\r\n '墚',\r\n '梁',\r\n '椋',\r\n '樑',\r\n '粮',\r\n '粱',\r\n '糧',\r\n '良',\r\n '輬',\r\n '辌',\r\n '𫟅',\r\n ],\r\n zǔ: ['俎', '唨', '爼', '祖', '組', '组', '詛', '诅', '鎺', '阻', '靻'],\r\n 'qiào xiào': ['俏'],\r\n yǒng: [\r\n '俑',\r\n '勇',\r\n '勈',\r\n '咏',\r\n '埇',\r\n '塎',\r\n '嵱',\r\n '彮',\r\n '怺',\r\n '恿',\r\n '悀',\r\n '惥',\r\n '愑',\r\n '愹',\r\n '慂',\r\n '柡',\r\n '栐',\r\n '永',\r\n '泳',\r\n '湧',\r\n '甬',\r\n '蛹',\r\n '詠',\r\n '踊',\r\n '踴',\r\n '鯒',\r\n '鲬',\r\n ],\r\n hùn: ['俒', '倱', '圂', '尡', '慁', '掍', '溷', '焝', '睴', '觨', '諢', '诨'],\r\n jìng: [\r\n '俓',\r\n '傹',\r\n '境',\r\n '妌',\r\n '婙',\r\n '婧',\r\n '弪',\r\n '弳',\r\n '径',\r\n '徑',\r\n '敬',\r\n '曔',\r\n '桱',\r\n '梷',\r\n '浄',\r\n '瀞',\r\n '獍',\r\n '痉',\r\n '痙',\r\n '竞',\r\n '竟',\r\n '竫',\r\n '競',\r\n '竸',\r\n '胫',\r\n '脛',\r\n '莖',\r\n '誩',\r\n '踁',\r\n '迳',\r\n '逕',\r\n '鏡',\r\n '镜',\r\n '靖',\r\n '静',\r\n '靜',\r\n '鵛',\r\n ],\r\n sàn: ['俕', '閐'],\r\n pěi: ['俖'],\r\n sú: ['俗'],\r\n xī: [\r\n '俙',\r\n '僖',\r\n '兮',\r\n '凞',\r\n '卥',\r\n '厀',\r\n '吸',\r\n '唏',\r\n '唽',\r\n '嘻',\r\n '噏',\r\n '嚱',\r\n '夕',\r\n '奚',\r\n '嬆',\r\n '嬉',\r\n '屖',\r\n '嵠',\r\n '巇',\r\n '希',\r\n '徆',\r\n '徯',\r\n '息',\r\n '悉',\r\n '悕',\r\n '惁',\r\n '惜',\r\n '昔',\r\n '晞',\r\n '晰',\r\n '晳',\r\n '曦',\r\n '析',\r\n '桸',\r\n '榽',\r\n '樨',\r\n '橀',\r\n '欷',\r\n '氥',\r\n '汐',\r\n '浠',\r\n '淅',\r\n '渓',\r\n '溪',\r\n '烯',\r\n '焁',\r\n '焈',\r\n '焟',\r\n '熄',\r\n '熈',\r\n '熙',\r\n '熹',\r\n '熺',\r\n '熻',\r\n '燨',\r\n '爔',\r\n '牺',\r\n '犀',\r\n '犠',\r\n '犧',\r\n '琋',\r\n '瘜',\r\n '皙',\r\n '睎',\r\n '瞦',\r\n '矽',\r\n '硒',\r\n '磎',\r\n '礂',\r\n '稀',\r\n '穸',\r\n '窸',\r\n '粞',\r\n '糦',\r\n '緆',\r\n '繥',\r\n '羲',\r\n '翕',\r\n '翖',\r\n '肸',\r\n '肹',\r\n '膝',\r\n '舾',\r\n '莃',\r\n '菥',\r\n '蒠',\r\n '蜥',\r\n '螅',\r\n '蟋',\r\n '蠵',\r\n '西',\r\n '觹',\r\n '觽',\r\n '觿',\r\n '譆',\r\n '谿',\r\n '豀',\r\n '豨',\r\n '豯',\r\n '貕',\r\n '赥',\r\n '邜',\r\n '鄎',\r\n '酅',\r\n '醯',\r\n '釸',\r\n '錫',\r\n '鏭',\r\n '鐊',\r\n '鑴',\r\n '锡',\r\n '隵',\r\n '餏',\r\n '饎',\r\n '饻',\r\n '鯑',\r\n '鵗',\r\n '鸂',\r\n '鼷',\r\n ],\r\n lǐ: [\r\n '俚',\r\n '娌',\r\n '峢',\r\n '峲',\r\n '李',\r\n '欚',\r\n '浬',\r\n '澧',\r\n '理',\r\n '礼',\r\n '禮',\r\n '粴',\r\n '裏',\r\n '裡',\r\n '豊',\r\n '逦',\r\n '邐',\r\n '醴',\r\n '鋰',\r\n '锂',\r\n '鯉',\r\n '鱧',\r\n '鱱',\r\n '鲤',\r\n '鳢',\r\n ],\r\n bǎo: [\r\n '保',\r\n '堢',\r\n '媬',\r\n '宝',\r\n '寚',\r\n '寳',\r\n '寶',\r\n '珤',\r\n '緥',\r\n '葆',\r\n '藵',\r\n '褓',\r\n '賲',\r\n '靌',\r\n '飹',\r\n '飽',\r\n '饱',\r\n '駂',\r\n '鳵',\r\n '鴇',\r\n '鸨',\r\n ],\r\n 'yú shù yù': ['俞'],\r\n 'sì qí': ['俟'],\r\n 'xìn shēn': ['信'],\r\n xiū: [\r\n '俢',\r\n '修',\r\n '咻',\r\n '庥',\r\n '樇',\r\n '烌',\r\n '羞',\r\n '脙',\r\n '脩',\r\n '臹',\r\n '貅',\r\n '銝',\r\n '鎀',\r\n '飍',\r\n '饈',\r\n '馐',\r\n '髤',\r\n '髹',\r\n '鮴',\r\n '鱃',\r\n '鵂',\r\n '鸺',\r\n '䗛',\r\n ],\r\n dì: [\r\n '俤',\r\n '偙',\r\n '僀',\r\n '埊',\r\n '墑',\r\n '墬',\r\n '娣',\r\n '帝',\r\n '怟',\r\n '旳',\r\n '梊',\r\n '焍',\r\n '玓',\r\n '甋',\r\n '眱',\r\n '睇',\r\n '碲',\r\n '祶',\r\n '禘',\r\n '第',\r\n '締',\r\n '缔',\r\n '腣',\r\n '菂',\r\n '蒂',\r\n '蔕',\r\n '蝃',\r\n '蝭',\r\n '螮',\r\n '諦',\r\n '谛',\r\n '踶',\r\n '递',\r\n '逓',\r\n '遞',\r\n '遰',\r\n '鉪',\r\n '𤧛',\r\n '䗖',\r\n ],\r\n chóu: [\r\n '俦',\r\n '儔',\r\n '嬦',\r\n '惆',\r\n '愁',\r\n '懤',\r\n '栦',\r\n '燽',\r\n '畴',\r\n '疇',\r\n '皗',\r\n '稠',\r\n '筹',\r\n '籌',\r\n '絒',\r\n '綢',\r\n '绸',\r\n '菗',\r\n '詶',\r\n '讎',\r\n '讐',\r\n '踌',\r\n '躊',\r\n '酧',\r\n '酬',\r\n '醻',\r\n '雔',\r\n '雠',\r\n '雦',\r\n ],\r\n zhì: [\r\n '俧',\r\n '偫',\r\n '儨',\r\n '制',\r\n '劕',\r\n '垁',\r\n '娡',\r\n '寘',\r\n '帙',\r\n '帜',\r\n '幟',\r\n '庢',\r\n '庤',\r\n '廌',\r\n '彘',\r\n '徏',\r\n '徝',\r\n '志',\r\n '忮',\r\n '懥',\r\n '懫',\r\n '挃',\r\n '挚',\r\n '掷',\r\n '摯',\r\n '擲',\r\n '旘',\r\n '晊',\r\n '智',\r\n '栉',\r\n '桎',\r\n '梽',\r\n '櫍',\r\n '櫛',\r\n '治',\r\n '洷',\r\n '滍',\r\n '滞',\r\n '滯',\r\n '潌',\r\n '瀄',\r\n '炙',\r\n '熫',\r\n '狾',\r\n '猘',\r\n '璏',\r\n '瓆',\r\n '痔',\r\n '痣',\r\n '礩',\r\n '祑',\r\n '秩',\r\n '秷',\r\n '稚',\r\n '稺',\r\n '穉',\r\n '窒',\r\n '紩',\r\n '緻',\r\n '置',\r\n '翐',\r\n '膣',\r\n '至',\r\n '致',\r\n '芖',\r\n '蛭',\r\n '袟',\r\n '袠',\r\n '製',\r\n '覟',\r\n '觗',\r\n '觯',\r\n '觶',\r\n '誌',\r\n '豑',\r\n '豒',\r\n '貭',\r\n '質',\r\n '贄',\r\n '质',\r\n '贽',\r\n '跱',\r\n '踬',\r\n '躓',\r\n '輊',\r\n '轾',\r\n '郅',\r\n '銍',\r\n '鋕',\r\n '鑕',\r\n '铚',\r\n '锧',\r\n '陟',\r\n '隲',\r\n '雉',\r\n '駤',\r\n '騭',\r\n '騺',\r\n '驇',\r\n '骘',\r\n '鯯',\r\n '鴙',\r\n '鷙',\r\n '鸷',\r\n '𬃊',\r\n ],\r\n 'liǎ liǎng': ['俩'],\r\n jiǎn: [\r\n '俭',\r\n '倹',\r\n '儉',\r\n '减',\r\n '剪',\r\n '堿',\r\n '弿',\r\n '彅',\r\n '戩',\r\n '戬',\r\n '拣',\r\n '挸',\r\n '捡',\r\n '揀',\r\n '撿',\r\n '枧',\r\n '柬',\r\n '梘',\r\n '检',\r\n '検',\r\n '檢',\r\n '減',\r\n '湕',\r\n '瀽',\r\n '瑐',\r\n '睑',\r\n '瞼',\r\n '硷',\r\n '碱',\r\n '礆',\r\n '笕',\r\n '筧',\r\n '简',\r\n '簡',\r\n '絸',\r\n '繭',\r\n '翦',\r\n '茧',\r\n '藆',\r\n '蠒',\r\n '裥',\r\n '襇',\r\n '襉',\r\n '襺',\r\n '詃',\r\n '謇',\r\n '謭',\r\n '譾',\r\n '谫',\r\n '趼',\r\n '蹇',\r\n '鐗',\r\n '鬋',\r\n '鰎',\r\n '鹸',\r\n '鹻',\r\n '鹼',\r\n ],\r\n huò: [\r\n '俰',\r\n '咟',\r\n '嚯',\r\n '嚿',\r\n '奯',\r\n '彠',\r\n '惑',\r\n '或',\r\n '擭',\r\n '旤',\r\n '曤',\r\n '檴',\r\n '沎',\r\n '湱',\r\n '瀖',\r\n '獲',\r\n '癨',\r\n '眓',\r\n '矐',\r\n '祸',\r\n '禍',\r\n '穫',\r\n '窢',\r\n '耯',\r\n '臛',\r\n '艧',\r\n '获',\r\n '蒦',\r\n '藿',\r\n '蠖',\r\n '謋',\r\n '貨',\r\n '货',\r\n '鍃',\r\n '鑊',\r\n '镬',\r\n '雘',\r\n '霍',\r\n '靃',\r\n '韄',\r\n '㸌',\r\n ],\r\n 'jù jū': ['俱', '据', '鋸', '锯'],\r\n xiào: [\r\n '俲',\r\n '傚',\r\n '効',\r\n '咲',\r\n '哮',\r\n '啸',\r\n '嘋',\r\n '嘨',\r\n '嘯',\r\n '孝',\r\n '效',\r\n '斅',\r\n '斆',\r\n '歗',\r\n '涍',\r\n '熽',\r\n '笑',\r\n '詨',\r\n '誟',\r\n ],\r\n pái: ['俳', '徘', '牌', '犤', '猅', '簰', '簲', '輫'],\r\n biào: ['俵', '鰾', '鳔'],\r\n 'chù tì': ['俶'],\r\n fèi: [\r\n '俷',\r\n '剕',\r\n '厞',\r\n '吠',\r\n '屝',\r\n '废',\r\n '廃',\r\n '廢',\r\n '昲',\r\n '曊',\r\n '櫠',\r\n '沸',\r\n '濷',\r\n '狒',\r\n '癈',\r\n '肺',\r\n '萉',\r\n '費',\r\n '费',\r\n '鐨',\r\n '镄',\r\n '陫',\r\n '靅',\r\n '鼣',\r\n ],\r\n fèng: ['俸', '凤', '奉', '湗', '焨', '煈', '賵', '赗', '鳯', '鳳', '鴌'],\r\n ǎn: ['俺', '唵', '埯', '揞', '罯', '銨', '铵'],\r\n bèi: [\r\n '俻',\r\n '倍',\r\n '偝',\r\n '偹',\r\n '備',\r\n '僃',\r\n '备',\r\n '悖',\r\n '惫',\r\n '愂',\r\n '憊',\r\n '昁',\r\n '梖',\r\n '焙',\r\n '牬',\r\n '犕',\r\n '狈',\r\n '狽',\r\n '珼',\r\n '琲',\r\n '碚',\r\n '禙',\r\n '糒',\r\n '苝',\r\n '蓓',\r\n '蛽',\r\n '褙',\r\n '貝',\r\n '贝',\r\n '軰',\r\n '輩',\r\n '辈',\r\n '邶',\r\n '郥',\r\n '鄁',\r\n '鋇',\r\n '鐾',\r\n '钡',\r\n '鞁',\r\n '鞴',\r\n '𬇙',\r\n ],\r\n yù: [\r\n '俼',\r\n '儥',\r\n '喅',\r\n '喩',\r\n '喻',\r\n '域',\r\n '堉',\r\n '妪',\r\n '嫗',\r\n '寓',\r\n '峪',\r\n '嶎',\r\n '庽',\r\n '彧',\r\n '御',\r\n '愈',\r\n '慾',\r\n '戫',\r\n '昱',\r\n '棛',\r\n '棜',\r\n '棫',\r\n '櫲',\r\n '欎',\r\n '欝',\r\n '欲',\r\n '毓',\r\n '浴',\r\n '淯',\r\n '滪',\r\n '潏',\r\n '澦',\r\n '灪',\r\n '焴',\r\n '煜',\r\n '燏',\r\n '燠',\r\n '爩',\r\n '狱',\r\n '獄',\r\n '玉',\r\n '琙',\r\n '瘉',\r\n '癒',\r\n '砡',\r\n '硢',\r\n '硲',\r\n '礇',\r\n '礖',\r\n '礜',\r\n '禦',\r\n '秗',\r\n '稢',\r\n '稶',\r\n '篽',\r\n '籞',\r\n '籲',\r\n '粖',\r\n '緎',\r\n '罭',\r\n '聿',\r\n '肀',\r\n '艈',\r\n '芋',\r\n '芌',\r\n '茟',\r\n '蒮',\r\n '蓣',\r\n '蓹',\r\n '蕷',\r\n '蘌',\r\n '蜟',\r\n '蜮',\r\n '袬',\r\n '裕',\r\n '誉',\r\n '諭',\r\n '譽',\r\n '谕',\r\n '豫',\r\n '軉',\r\n '輍',\r\n '逳',\r\n '遇',\r\n '遹',\r\n '郁',\r\n '醧',\r\n '鈺',\r\n '鋊',\r\n '錥',\r\n '鐭',\r\n '钰',\r\n '閾',\r\n '阈',\r\n '雤',\r\n '霱',\r\n '預',\r\n '预',\r\n '飫',\r\n '饇',\r\n '饫',\r\n '馭',\r\n '驈',\r\n '驭',\r\n '鬰',\r\n '鬱',\r\n '鬻',\r\n '魊',\r\n '鱊',\r\n '鳿',\r\n '鴥',\r\n '鴧',\r\n '鴪',\r\n '鵒',\r\n '鷸',\r\n '鸒',\r\n '鹆',\r\n '鹬',\r\n ],\r\n xīn: [\r\n '俽',\r\n '噺',\r\n '妡',\r\n '嬜',\r\n '廞',\r\n '心',\r\n '忄',\r\n '忻',\r\n '惞',\r\n '新',\r\n '昕',\r\n '杺',\r\n '欣',\r\n '歆',\r\n '炘',\r\n '盺',\r\n '薪',\r\n '訢',\r\n '辛',\r\n '邤',\r\n '鈊',\r\n '鋅',\r\n '鑫',\r\n '锌',\r\n '馨',\r\n '馫',\r\n '䜣',\r\n '𫷷',\r\n ],\r\n 'hǔ chí': ['俿'],\r\n jiù: [\r\n '倃',\r\n '僦',\r\n '匓',\r\n '匛',\r\n '匶',\r\n '厩',\r\n '咎',\r\n '就',\r\n '廄',\r\n '廏',\r\n '廐',\r\n '慦',\r\n '捄',\r\n '救',\r\n '旧',\r\n '柩',\r\n '柾',\r\n '桕',\r\n '欍',\r\n '殧',\r\n '疚',\r\n '臼',\r\n '舅',\r\n '舊',\r\n '鯦',\r\n '鷲',\r\n '鹫',\r\n '麔',\r\n '齨',\r\n '㠇',\r\n ],\r\n yáo: [\r\n '倄',\r\n '傜',\r\n '嗂',\r\n '垚',\r\n '堯',\r\n '姚',\r\n '媱',\r\n '尧',\r\n '尭',\r\n '峣',\r\n '嶢',\r\n '嶤',\r\n '徭',\r\n '揺',\r\n '搖',\r\n '摇',\r\n '摿',\r\n '暚',\r\n '榣',\r\n '烑',\r\n '爻',\r\n '猺',\r\n '珧',\r\n '瑤',\r\n '瑶',\r\n '磘',\r\n '窑',\r\n '窯',\r\n '窰',\r\n '肴',\r\n '蘨',\r\n '謠',\r\n '謡',\r\n '谣',\r\n '軺',\r\n '轺',\r\n '遙',\r\n '遥',\r\n '邎',\r\n '顤',\r\n '颻',\r\n '飖',\r\n '餆',\r\n '餚',\r\n '鰩',\r\n '鱙',\r\n '鳐',\r\n ],\r\n 'cuì zú': ['倅'],\r\n 'liǎng liǎ': ['倆'],\r\n wǎn: [\r\n '倇',\r\n '唍',\r\n '婉',\r\n '惋',\r\n '挽',\r\n '晚',\r\n '晥',\r\n '晩',\r\n '晼',\r\n '梚',\r\n '椀',\r\n '琬',\r\n '畹',\r\n '皖',\r\n '盌',\r\n '碗',\r\n '綩',\r\n '綰',\r\n '绾',\r\n '脘',\r\n '萖',\r\n '踠',\r\n '輓',\r\n '鋔',\r\n ],\r\n zǒng: [\r\n '倊',\r\n '偬',\r\n '傯',\r\n '嵸',\r\n '总',\r\n '惣',\r\n '捴',\r\n '搃',\r\n '摠',\r\n '燪',\r\n '総',\r\n '緫',\r\n '縂',\r\n '總',\r\n '蓗',\r\n ],\r\n guān: [\r\n '倌',\r\n '关',\r\n '官',\r\n '棺',\r\n '瘝',\r\n '癏',\r\n '窤',\r\n '蒄',\r\n '関',\r\n '闗',\r\n '關',\r\n '鰥',\r\n '鱞',\r\n '鳏',\r\n ],\r\n tiǎn: [\r\n '倎',\r\n '唺',\r\n '忝',\r\n '悿',\r\n '晪',\r\n '殄',\r\n '淟',\r\n '睓',\r\n '腆',\r\n '舔',\r\n '覥',\r\n '觍',\r\n '賟',\r\n '錪',\r\n '餂',\r\n ],\r\n mén: ['們', '扪', '捫', '璊', '菛', '虋', '鍆', '钔', '門', '閅', '门', '𫞩'],\r\n 'dǎo dào': ['倒'],\r\n 'tán tàn': ['倓', '埮'],\r\n 'juè jué': ['倔'],\r\n chuí: [\r\n '倕',\r\n '垂',\r\n '埀',\r\n '捶',\r\n '搥',\r\n '桘',\r\n '棰',\r\n '槌',\r\n '箠',\r\n '腄',\r\n '菙',\r\n '錘',\r\n '鎚',\r\n '锤',\r\n '陲',\r\n '顀',\r\n ],\r\n xìng: [\r\n '倖',\r\n '姓',\r\n '婞',\r\n '嬹',\r\n '幸',\r\n '性',\r\n '悻',\r\n '杏',\r\n '涬',\r\n '緈',\r\n '臖',\r\n '荇',\r\n '莕',\r\n '葕',\r\n ],\r\n péng: [\r\n '倗',\r\n '傰',\r\n '塜',\r\n '塳',\r\n '弸',\r\n '憉',\r\n '捀',\r\n '朋',\r\n '棚',\r\n '椖',\r\n '樥',\r\n '硼',\r\n '稝',\r\n '竼',\r\n '篷',\r\n '纄',\r\n '膨',\r\n '芃',\r\n '蓬',\r\n '蘕',\r\n '蟚',\r\n '蟛',\r\n '袶',\r\n '輣',\r\n '錋',\r\n '鑝',\r\n '韸',\r\n '韼',\r\n '騯',\r\n '髼',\r\n '鬅',\r\n '鬔',\r\n '鵬',\r\n '鹏',\r\n ],\r\n 'tǎng cháng': ['倘'],\r\n hòu: [\r\n '候',\r\n '厚',\r\n '后',\r\n '垕',\r\n '堠',\r\n '後',\r\n '洉',\r\n '茩',\r\n '豞',\r\n '逅',\r\n '郈',\r\n '鮜',\r\n '鱟',\r\n '鲎',\r\n '鲘',\r\n ],\r\n tì: [\r\n '倜',\r\n '剃',\r\n '嚏',\r\n '嚔',\r\n '屉',\r\n '屜',\r\n '悌',\r\n '悐',\r\n '惕',\r\n '惖',\r\n '戻',\r\n '掦',\r\n '替',\r\n '朑',\r\n '歒',\r\n '殢',\r\n '涕',\r\n '瓋',\r\n '笹',\r\n '籊',\r\n '薙',\r\n '褅',\r\n '逖',\r\n '逷',\r\n '髰',\r\n '鬀',\r\n '鬄',\r\n ],\r\n gàn: [\r\n '倝',\r\n '凎',\r\n '幹',\r\n '榦',\r\n '檊',\r\n '淦',\r\n '灨',\r\n '盰',\r\n '紺',\r\n '绀',\r\n '詌',\r\n '贑',\r\n '赣',\r\n '骭',\r\n '㽏',\r\n ],\r\n 'liàng jìng': ['倞', '靓'],\r\n suī: [\r\n '倠',\r\n '哸',\r\n '夊',\r\n '滖',\r\n '濉',\r\n '眭',\r\n '睢',\r\n '芕',\r\n '荽',\r\n '荾',\r\n '虽',\r\n '雖',\r\n '鞖',\r\n ],\r\n 'chàng chāng': ['倡'],\r\n jié: [\r\n '倢',\r\n '偼',\r\n '傑',\r\n '刦',\r\n '刧',\r\n '刼',\r\n '劫',\r\n '劼',\r\n '卩',\r\n '卪',\r\n '婕',\r\n '媫',\r\n '孑',\r\n '岊',\r\n '崨',\r\n '嵥',\r\n '嶻',\r\n '巀',\r\n '幯',\r\n '截',\r\n '捷',\r\n '掶',\r\n '擮',\r\n '昅',\r\n '杢',\r\n '杰',\r\n '桀',\r\n '桝',\r\n '楬',\r\n '楶',\r\n '榤',\r\n '洁',\r\n '滐',\r\n '潔',\r\n '狤',\r\n '睫',\r\n '礍',\r\n '竭',\r\n '節',\r\n '羯',\r\n '莭',\r\n '蓵',\r\n '蛣',\r\n '蜐',\r\n '蠘',\r\n '蠞',\r\n '蠽',\r\n '衱',\r\n '袺',\r\n '訐',\r\n '詰',\r\n '誱',\r\n '讦',\r\n '踕',\r\n '迼',\r\n '鉣',\r\n '鍻',\r\n '镼',\r\n '頡',\r\n '鮚',\r\n '鲒',\r\n '㛃',\r\n ],\r\n 'kǒng kōng': ['倥'],\r\n juàn: [\r\n '倦',\r\n '劵',\r\n '奆',\r\n '慻',\r\n '桊',\r\n '淃',\r\n '狷',\r\n '獧',\r\n '眷',\r\n '睊',\r\n '睠',\r\n '絭',\r\n '絹',\r\n '绢',\r\n '罥',\r\n '羂',\r\n '腃',\r\n '蔨',\r\n '鄄',\r\n '餋',\r\n ],\r\n zōng: [\r\n '倧',\r\n '堫',\r\n '宗',\r\n '嵏',\r\n '嵕',\r\n '惾',\r\n '朡',\r\n '棕',\r\n '椶',\r\n '熧',\r\n '猣',\r\n '磫',\r\n '緃',\r\n '翪',\r\n '腙',\r\n '葼',\r\n '蝬',\r\n '豵',\r\n '踨',\r\n '踪',\r\n '蹤',\r\n '鍐',\r\n '鑁',\r\n '騌',\r\n '騣',\r\n '骔',\r\n '鬃',\r\n '鬉',\r\n '鬷',\r\n '鯮',\r\n '鯼',\r\n ],\r\n ní: [\r\n '倪',\r\n '坭',\r\n '埿',\r\n '尼',\r\n '屔',\r\n '怩',\r\n '淣',\r\n '猊',\r\n '籾',\r\n '聣',\r\n '蚭',\r\n '蜺',\r\n '觬',\r\n '貎',\r\n '跜',\r\n '輗',\r\n '郳',\r\n '鈮',\r\n '铌',\r\n '霓',\r\n '馜',\r\n '鯢',\r\n '鲵',\r\n '麑',\r\n '齯',\r\n '𫐐',\r\n '𫠜',\r\n ],\r\n zhuō: [\r\n '倬',\r\n '拙',\r\n '捉',\r\n '桌',\r\n '梲',\r\n '棁',\r\n '棳',\r\n '槕',\r\n '涿',\r\n '窧',\r\n '鐯',\r\n '䦃',\r\n ],\r\n 'wō wēi': ['倭'],\r\n luǒ: ['倮', '剆', '曪', '瘰', '癳', '臝', '蓏', '蠃', '裸', '躶'],\r\n sōng: [\r\n '倯',\r\n '凇',\r\n '娀',\r\n '崧',\r\n '嵩',\r\n '庺',\r\n '憽',\r\n '松',\r\n '枀',\r\n '枩',\r\n '柗',\r\n '梥',\r\n '檧',\r\n '淞',\r\n '濍',\r\n '硹',\r\n '菘',\r\n '鬆',\r\n ],\r\n lèng: ['倰', '堎', '愣', '睖', '踜'],\r\n zì: [\r\n '倳',\r\n '剚',\r\n '字',\r\n '恣',\r\n '渍',\r\n '漬',\r\n '牸',\r\n '眥',\r\n '眦',\r\n '胔',\r\n '胾',\r\n '自',\r\n '茡',\r\n '荢',\r\n ],\r\n bèn: ['倴', '坌', '捹', '撪', '渀', '笨', '逩'],\r\n cǎi: ['倸', '啋', '婇', '彩', '採', '棌', '毝', '睬', '綵', '跴', '踩'],\r\n zhài: ['债', '債', '寨', '瘵', '砦'],\r\n yē: ['倻', '吔', '噎', '擨', '暍', '椰', '歋', '潱', '蠮'],\r\n shà: ['倽', '唼', '喢', '歃', '箑', '翜', '翣', '萐', '閯', '霎'],\r\n qīng: [\r\n '倾',\r\n '傾',\r\n '卿',\r\n '圊',\r\n '寈',\r\n '氢',\r\n '氫',\r\n '淸',\r\n '清',\r\n '蜻',\r\n '軽',\r\n '輕',\r\n '轻',\r\n '郬',\r\n '錆',\r\n '鑋',\r\n '靑',\r\n '青',\r\n '鯖',\r\n ],\r\n yīng: [\r\n '偀',\r\n '嘤',\r\n '噟',\r\n '嚶',\r\n '婴',\r\n '媖',\r\n '嫈',\r\n '嬰',\r\n '孆',\r\n '孾',\r\n '愥',\r\n '撄',\r\n '攖',\r\n '朠',\r\n '桜',\r\n '樱',\r\n '櫻',\r\n '渶',\r\n '煐',\r\n '珱',\r\n '瑛',\r\n '璎',\r\n '瓔',\r\n '甇',\r\n '甖',\r\n '碤',\r\n '礯',\r\n '緓',\r\n '纓',\r\n '绬',\r\n '缨',\r\n '罂',\r\n '罃',\r\n '罌',\r\n '膺',\r\n '英',\r\n '莺',\r\n '蘡',\r\n '蝧',\r\n '蠳',\r\n '褮',\r\n '譻',\r\n '賏',\r\n '軈',\r\n '鑍',\r\n '锳',\r\n '霙',\r\n '韺',\r\n '鴬',\r\n '鶑',\r\n '鶧',\r\n '鶯',\r\n '鷪',\r\n '鷹',\r\n '鸎',\r\n '鸚',\r\n '鹦',\r\n '鹰',\r\n '䓨',\r\n ],\r\n 'chēng chèn': ['偁', '爯'],\r\n ruǎn: ['偄', '朊', '瑌', '瓀', '碝', '礝', '腝', '軟', '輭', '软', '阮'],\r\n 'zhòng tóng': ['偅'],\r\n chǔn: ['偆', '惷', '睶', '萶', '蠢', '賰'],\r\n 'jiǎ jià': ['假'],\r\n 'jì jié': ['偈'],\r\n 'bǐng bìng': ['偋'],\r\n ruò: [\r\n '偌',\r\n '叒',\r\n '嵶',\r\n '弱',\r\n '楉',\r\n '焫',\r\n '爇',\r\n '箬',\r\n '篛',\r\n '蒻',\r\n '鄀',\r\n '鰙',\r\n '鰯',\r\n '鶸',\r\n ],\r\n tí: [\r\n '偍',\r\n '厗',\r\n '啼',\r\n '嗁',\r\n '崹',\r\n '漽',\r\n '瑅',\r\n '睼',\r\n '禵',\r\n '稊',\r\n '緹',\r\n '缇',\r\n '罤',\r\n '蕛',\r\n '褆',\r\n '謕',\r\n '趧',\r\n '蹄',\r\n '蹏',\r\n '醍',\r\n '鍗',\r\n '題',\r\n '题',\r\n '騠',\r\n '鮷',\r\n '鯷',\r\n '鳀',\r\n '鵜',\r\n '鷤',\r\n '鹈',\r\n '𫘨',\r\n ],\r\n wēi: [\r\n '偎',\r\n '危',\r\n '喴',\r\n '威',\r\n '媙',\r\n '嶶',\r\n '巍',\r\n '微',\r\n '愄',\r\n '揋',\r\n '揻',\r\n '椳',\r\n '楲',\r\n '溦',\r\n '烓',\r\n '煨',\r\n '燰',\r\n '癓',\r\n '縅',\r\n '葨',\r\n '葳',\r\n '薇',\r\n '蜲',\r\n '蝛',\r\n '覣',\r\n '詴',\r\n '逶',\r\n '隇',\r\n '隈',\r\n '霺',\r\n '鰃',\r\n '鰄',\r\n '鳂',\r\n ],\r\n piān: ['偏', '囨', '媥', '楄', '犏', '篇', '翩', '鍂'],\r\n yàn: [\r\n '偐',\r\n '厌',\r\n '厭',\r\n '唁',\r\n '喭',\r\n '嚈',\r\n '嚥',\r\n '堰',\r\n '妟',\r\n '姲',\r\n '嬊',\r\n '嬿',\r\n '宴',\r\n '彥',\r\n '彦',\r\n '敥',\r\n '晏',\r\n '暥',\r\n '曕',\r\n '曣',\r\n '滟',\r\n '灎',\r\n '灔',\r\n '灧',\r\n '灩',\r\n '焔',\r\n '焰',\r\n '焱',\r\n '熖',\r\n '燄',\r\n '牪',\r\n '猒',\r\n '砚',\r\n '硯',\r\n '艳',\r\n '艶',\r\n '艷',\r\n '覎',\r\n '觃',\r\n '觾',\r\n '諺',\r\n '讌',\r\n '讞',\r\n '谚',\r\n '谳',\r\n '豓',\r\n '豔',\r\n '贋',\r\n '贗',\r\n '赝',\r\n '軅',\r\n '酀',\r\n '酽',\r\n '醼',\r\n '釅',\r\n '雁',\r\n '餍',\r\n '饜',\r\n '騐',\r\n '験',\r\n '騴',\r\n '驗',\r\n '驠',\r\n '验',\r\n '鬳',\r\n '鳫',\r\n '鴈',\r\n '鴳',\r\n '鷃',\r\n '鷰',\r\n '齞',\r\n ],\r\n 'tǎng dàng': ['偒'],\r\n è: [\r\n '偔',\r\n '匎',\r\n '卾',\r\n '厄',\r\n '呝',\r\n '咢',\r\n '噩',\r\n '垩',\r\n '堊',\r\n '堮',\r\n '岋',\r\n '崿',\r\n '廅',\r\n '悪',\r\n '愕',\r\n '戹',\r\n '扼',\r\n '搤',\r\n '搹',\r\n '擜',\r\n '櫮',\r\n '歞',\r\n '歺',\r\n '湂',\r\n '琧',\r\n '砈',\r\n '砐',\r\n '硆',\r\n '腭',\r\n '苊',\r\n '萼',\r\n '蕚',\r\n '蚅',\r\n '蝁',\r\n '覨',\r\n '諤',\r\n '讍',\r\n '谔',\r\n '豟',\r\n '軛',\r\n '軶',\r\n '轭',\r\n '遌',\r\n '遏',\r\n '遻',\r\n '鄂',\r\n '鈪',\r\n '鍔',\r\n '鑩',\r\n '锷',\r\n '阨',\r\n '阸',\r\n '頞',\r\n '顎',\r\n '颚',\r\n '餓',\r\n '餩',\r\n '饿',\r\n '鰐',\r\n '鰪',\r\n '鱷',\r\n '鳄',\r\n '鶚',\r\n '鹗',\r\n '齃',\r\n '齶',\r\n '𫫇',\r\n '𥔲',\r\n ],\r\n xié: [\r\n '偕',\r\n '勰',\r\n '协',\r\n '協',\r\n '嗋',\r\n '垥',\r\n '奊',\r\n '恊',\r\n '愶',\r\n '拹',\r\n '携',\r\n '撷',\r\n '擕',\r\n '擷',\r\n '攜',\r\n '斜',\r\n '旪',\r\n '熁',\r\n '燲',\r\n '綊',\r\n '緳',\r\n '縀',\r\n '缬',\r\n '翓',\r\n '胁',\r\n '脅',\r\n '脇',\r\n '脋',\r\n '膎',\r\n '蝢',\r\n '衺',\r\n '襭',\r\n '諧',\r\n '讗',\r\n '谐',\r\n '鞋',\r\n '鞵',\r\n '龤',\r\n '㙦',\r\n ],\r\n chě: ['偖', '扯', '撦'],\r\n shěng: ['偗', '渻', '眚'],\r\n chā: [\r\n '偛',\r\n '嗏',\r\n '扠',\r\n '挿',\r\n '插',\r\n '揷',\r\n '疀',\r\n '臿',\r\n '艖',\r\n '銟',\r\n '鍤',\r\n '锸',\r\n '餷',\r\n ],\r\n huáng: [\r\n '偟',\r\n '凰',\r\n '喤',\r\n '堭',\r\n '墴',\r\n '媓',\r\n '崲',\r\n '徨',\r\n '惶',\r\n '楻',\r\n '湟',\r\n '煌',\r\n '獚',\r\n '瑝',\r\n '璜',\r\n '癀',\r\n '皇',\r\n '磺',\r\n '穔',\r\n '篁',\r\n '簧',\r\n '艎',\r\n '葟',\r\n '蝗',\r\n '蟥',\r\n '諻',\r\n '趪',\r\n '遑',\r\n '鍠',\r\n '鐄',\r\n '锽',\r\n '隍',\r\n '韹',\r\n '餭',\r\n '騜',\r\n '鰉',\r\n '鱑',\r\n '鳇',\r\n '鷬',\r\n '黃',\r\n '黄',\r\n '𨱑',\r\n ],\r\n yǎo: [\r\n '偠',\r\n '咬',\r\n '婹',\r\n '宎',\r\n '岆',\r\n '杳',\r\n '柼',\r\n '榚',\r\n '溔',\r\n '狕',\r\n '窅',\r\n '窈',\r\n '舀',\r\n '苭',\r\n '闄',\r\n '騕',\r\n '鷕',\r\n '齩',\r\n ],\r\n 'chǒu qiào': ['偢'],\r\n yóu: [\r\n '偤',\r\n '尤',\r\n '庮',\r\n '怣',\r\n '沋',\r\n '油',\r\n '浟',\r\n '游',\r\n '犹',\r\n '猶',\r\n '猷',\r\n '由',\r\n '疣',\r\n '秞',\r\n '肬',\r\n '莜',\r\n '莸',\r\n '蕕',\r\n '蚰',\r\n '蝣',\r\n '訧',\r\n '輏',\r\n '輶',\r\n '逰',\r\n '遊',\r\n '邮',\r\n '郵',\r\n '鈾',\r\n '铀',\r\n '駀',\r\n '魷',\r\n '鮋',\r\n '鱿',\r\n '鲉',\r\n '𬨎',\r\n ],\r\n xū: [\r\n '偦',\r\n '墟',\r\n '媭',\r\n '嬃',\r\n '楈',\r\n '欨',\r\n '歔',\r\n '燸',\r\n '疞',\r\n '盱',\r\n '綇',\r\n '縃',\r\n '繻',\r\n '胥',\r\n '蕦',\r\n '虗',\r\n '虚',\r\n '虛',\r\n '蝑',\r\n '裇',\r\n '訏',\r\n '許',\r\n '諝',\r\n '譃',\r\n '谞',\r\n '鑐',\r\n '需',\r\n '須',\r\n '须',\r\n '顼',\r\n '驉',\r\n '鬚',\r\n '魆',\r\n '魖',\r\n '𬣙',\r\n '𦈡',\r\n ],\r\n zhā: [\r\n '偧',\r\n '哳',\r\n '抯',\r\n '挓',\r\n '揸',\r\n '摣',\r\n '樝',\r\n '渣',\r\n '皶',\r\n '觰',\r\n '譇',\r\n '齄',\r\n '齇',\r\n ],\r\n cī: ['偨', '疵', '蠀', '趀', '骴', '髊', '齹'],\r\n bī: ['偪', '屄', '楅', '毴', '豍', '逼', '鰏', '鲾', '鵖'],\r\n xún: [\r\n '偱',\r\n '噚',\r\n '寻',\r\n '尋',\r\n '峋',\r\n '巡',\r\n '廵',\r\n '循',\r\n '恂',\r\n '揗',\r\n '攳',\r\n '旬',\r\n '杊',\r\n '栒',\r\n '桪',\r\n '樳',\r\n '洵',\r\n '浔',\r\n '潯',\r\n '燅',\r\n '燖',\r\n '珣',\r\n '璕',\r\n '畃',\r\n '紃',\r\n '荀',\r\n '蟳',\r\n '詢',\r\n '询',\r\n '鄩',\r\n '鱏',\r\n '鱘',\r\n '鲟',\r\n '𬘓',\r\n '𬩽',\r\n '𬍤',\r\n '𬊈',\r\n ],\r\n 'cāi sī': ['偲'],\r\n duān: ['偳', '媏', '端', '褍', '鍴'],\r\n ǒu: ['偶', '吘', '嘔', '耦', '腢', '蕅', '藕', '𬉼', '𠙶'],\r\n tōu: ['偷', '偸', '鍮'],\r\n 'zán zá zǎ': ['偺'],\r\n 'lǚ lóu': ['偻', '僂'],\r\n fèn: [\r\n '偾',\r\n '僨',\r\n '奋',\r\n '奮',\r\n '弅',\r\n '忿',\r\n '愤',\r\n '憤',\r\n '瀵',\r\n '瞓',\r\n '秎',\r\n '粪',\r\n '糞',\r\n '膹',\r\n '鱝',\r\n '鲼',\r\n ],\r\n 'kuǐ guī': ['傀'],\r\n sǒu: ['傁', '叜', '叟', '嗾', '櫢', '瞍', '薮', '藪'],\r\n 'zhì sī tí': ['傂'],\r\n sù: [\r\n '傃',\r\n '僳',\r\n '嗉',\r\n '塐',\r\n '塑',\r\n '夙',\r\n '嫊',\r\n '愫',\r\n '憟',\r\n '榡',\r\n '樎',\r\n '樕',\r\n '殐',\r\n '泝',\r\n '涑',\r\n '溯',\r\n '溸',\r\n '潚',\r\n '潥',\r\n '玊',\r\n '珟',\r\n '璛',\r\n '簌',\r\n '粛',\r\n '粟',\r\n '素',\r\n '縤',\r\n '肃',\r\n '肅',\r\n '膆',\r\n '蔌',\r\n '藗',\r\n '觫',\r\n '訴',\r\n '謖',\r\n '诉',\r\n '谡',\r\n '趚',\r\n '蹜',\r\n '速',\r\n '遡',\r\n '遬',\r\n '鋉',\r\n '餗',\r\n '驌',\r\n '骕',\r\n '鱐',\r\n '鷫',\r\n '鹔',\r\n '𫗧',\r\n ],\r\n xiā: ['傄', '煆', '瞎', '虲', '谺', '颬', '鰕'],\r\n 'yuàn yuán': ['傆', '媛'],\r\n rǒng: ['傇', '冗', '宂', '氄', '軵'],\r\n nù: ['傉', '怒'],\r\n yùn: [\r\n '傊',\r\n '孕',\r\n '恽',\r\n '惲',\r\n '愠',\r\n '慍',\r\n '枟',\r\n '腪',\r\n '蕴',\r\n '薀',\r\n '藴',\r\n '蘊',\r\n '褞',\r\n '貟',\r\n '运',\r\n '運',\r\n '郓',\r\n '鄆',\r\n '酝',\r\n '醖',\r\n '醞',\r\n '韗',\r\n '韞',\r\n '韵',\r\n '韻',\r\n '餫',\r\n ],\r\n 'gòu jiǎng': ['傋'],\r\n mà: ['傌', '嘜', '榪', '睰', '祃', '禡', '罵', '閁', '駡', '骂', '鬕'],\r\n bàng: [\r\n '傍',\r\n '塝',\r\n '棒',\r\n '玤',\r\n '稖',\r\n '艕',\r\n '蒡',\r\n '蜯',\r\n '謗',\r\n '谤',\r\n '鎊',\r\n '镑',\r\n ],\r\n diān: [\r\n '傎',\r\n '厧',\r\n '嵮',\r\n '巅',\r\n '巓',\r\n '巔',\r\n '掂',\r\n '攧',\r\n '敁',\r\n '槇',\r\n '滇',\r\n '癫',\r\n '癲',\r\n '蹎',\r\n '顚',\r\n '顛',\r\n '颠',\r\n '齻',\r\n ],\r\n táng: [\r\n '傏',\r\n '唐',\r\n '啺',\r\n '坣',\r\n '堂',\r\n '塘',\r\n '搪',\r\n '棠',\r\n '榶',\r\n '溏',\r\n '漟',\r\n '煻',\r\n '瑭',\r\n '磄',\r\n '禟',\r\n '篖',\r\n '糃',\r\n '糖',\r\n '糛',\r\n '膅',\r\n '膛',\r\n '蓎',\r\n '螗',\r\n '螳',\r\n '赯',\r\n '踼',\r\n '鄌',\r\n '醣',\r\n '鎕',\r\n '隚',\r\n '餹',\r\n '饄',\r\n '鶶',\r\n '䣘',\r\n ],\r\n hào: [\r\n '傐',\r\n '哠',\r\n '恏',\r\n '昊',\r\n '昦',\r\n '晧',\r\n '暠',\r\n '暤',\r\n '暭',\r\n '曍',\r\n '浩',\r\n '淏',\r\n '澔',\r\n '灏',\r\n '灝',\r\n '皓',\r\n '皜',\r\n '皞',\r\n '皡',\r\n '皥',\r\n '耗',\r\n '聕',\r\n '薃',\r\n '號',\r\n '鄗',\r\n '顥',\r\n '颢',\r\n '鰝',\r\n ],\r\n 'xī xì': ['傒'],\r\n shān: [\r\n '傓',\r\n '删',\r\n '刪',\r\n '剼',\r\n '圸',\r\n '山',\r\n '挻',\r\n '搧',\r\n '柵',\r\n '檆',\r\n '潸',\r\n '澘',\r\n '煽',\r\n '狦',\r\n '珊',\r\n '笘',\r\n '縿',\r\n '羴',\r\n '羶',\r\n '脠',\r\n '舢',\r\n '芟',\r\n '衫',\r\n '跚',\r\n '軕',\r\n '邖',\r\n '閊',\r\n '鯅',\r\n ],\r\n 'qiàn jiān': ['傔'],\r\n 'què jué': ['傕', '埆'],\r\n 'cāng chen': ['傖'],\r\n róng: [\r\n '傛',\r\n '媶',\r\n '嫆',\r\n '嬫',\r\n '容',\r\n '峵',\r\n '嵘',\r\n '嶸',\r\n '戎',\r\n '搈',\r\n '曧',\r\n '栄',\r\n '榕',\r\n '榮',\r\n '榵',\r\n '毧',\r\n '溶',\r\n '瀜',\r\n '烿',\r\n '熔',\r\n '狨',\r\n '瑢',\r\n '穁',\r\n '絨',\r\n '绒',\r\n '羢',\r\n '肜',\r\n '茙',\r\n '茸',\r\n '荣',\r\n '蓉',\r\n '蝾',\r\n '融',\r\n '螎',\r\n '蠑',\r\n '褣',\r\n '鎔',\r\n '镕',\r\n '駥',\r\n ],\r\n 'tà tàn': ['傝'],\r\n suō: [\r\n '傞',\r\n '唆',\r\n '嗍',\r\n '嗦',\r\n '娑',\r\n '摍',\r\n '桫',\r\n '梭',\r\n '睃',\r\n '簑',\r\n '簔',\r\n '羧',\r\n '莏',\r\n '蓑',\r\n '趖',\r\n '鮻',\r\n ],\r\n dǎi: ['傣', '歹'],\r\n zài: ['傤', '儎', '再', '在', '扗', '洅', '載', '酨'],\r\n gǔ: [\r\n '傦',\r\n '古',\r\n '啒',\r\n '尳',\r\n '愲',\r\n '榖',\r\n '榾',\r\n '汩',\r\n '淈',\r\n '濲',\r\n '瀔',\r\n '牯',\r\n '皷',\r\n '皼',\r\n '盬',\r\n '瞽',\r\n '穀',\r\n '罟',\r\n '羖',\r\n '股',\r\n '脵',\r\n '臌',\r\n '薣',\r\n '蛊',\r\n '蠱',\r\n '詁',\r\n '诂',\r\n '轂',\r\n '逧',\r\n '鈷',\r\n '钴',\r\n '餶',\r\n '馉',\r\n '鼓',\r\n '鼔',\r\n '𦙶',\r\n ],\r\n bīn: [\r\n '傧',\r\n '宾',\r\n '彬',\r\n '斌',\r\n '椕',\r\n '滨',\r\n '濒',\r\n '濱',\r\n '濵',\r\n '瀕',\r\n '繽',\r\n '缤',\r\n '虨',\r\n '豩',\r\n '豳',\r\n '賓',\r\n '賔',\r\n '邠',\r\n '鑌',\r\n '镔',\r\n '霦',\r\n '顮',\r\n ],\r\n chǔ: [\r\n '储',\r\n '儲',\r\n '杵',\r\n '椘',\r\n '楚',\r\n '楮',\r\n '檚',\r\n '濋',\r\n '璴',\r\n '础',\r\n '礎',\r\n '禇',\r\n '處',\r\n '齭',\r\n '齼',\r\n '𬺓',\r\n ],\r\n nuó: ['傩', '儺', '挪', '梛', '橠'],\r\n 'cān càn': ['傪'],\r\n lěi: [\r\n '傫',\r\n '儡',\r\n '厽',\r\n '垒',\r\n '塁',\r\n '壘',\r\n '壨',\r\n '櫐',\r\n '灅',\r\n '癗',\r\n '矋',\r\n '磊',\r\n '礨',\r\n '耒',\r\n '蕌',\r\n '蕾',\r\n '藟',\r\n '蘽',\r\n '蠝',\r\n '誄',\r\n '讄',\r\n '诔',\r\n '鑸',\r\n '鸓',\r\n ],\r\n cuī: ['催', '凗', '墔', '崔', '嵟', '慛', '摧', '榱', '獕', '磪', '鏙'],\r\n yōng: [\r\n '傭',\r\n '嗈',\r\n '墉',\r\n '壅',\r\n '嫞',\r\n '庸',\r\n '廱',\r\n '慵',\r\n '拥',\r\n '擁',\r\n '滽',\r\n '灉',\r\n '牅',\r\n '痈',\r\n '癕',\r\n '癰',\r\n '臃',\r\n '邕',\r\n '郺',\r\n '鄘',\r\n '鏞',\r\n '镛',\r\n '雍',\r\n '雝',\r\n '饔',\r\n '鱅',\r\n '鳙',\r\n '鷛',\r\n ],\r\n 'zāo cáo': ['傮'],\r\n sǒng: ['傱', '嵷', '怂', '悚', '愯', '慫', '竦', '耸', '聳', '駷', '㧐'],\r\n ào: [\r\n '傲',\r\n '坳',\r\n '垇',\r\n '墺',\r\n '奡',\r\n '嫯',\r\n '岙',\r\n '岰',\r\n '嶴',\r\n '懊',\r\n '擙',\r\n '澳',\r\n '鏊',\r\n '驁',\r\n '骜',\r\n ],\r\n 'qī còu': ['傶'],\r\n chuǎng: ['傸', '磢', '闖', '闯'],\r\n shǎ: ['傻', '儍'],\r\n hàn: [\r\n '傼',\r\n '垾',\r\n '悍',\r\n '憾',\r\n '扞',\r\n '捍',\r\n '撖',\r\n '撼',\r\n '旱',\r\n '晘',\r\n '暵',\r\n '汉',\r\n '涆',\r\n '漢',\r\n '瀚',\r\n '焊',\r\n '猂',\r\n '皔',\r\n '睅',\r\n '翰',\r\n '莟',\r\n '菡',\r\n '蛿',\r\n '蜭',\r\n '螒',\r\n '譀',\r\n '輚',\r\n '釬',\r\n '銲',\r\n '鋎',\r\n '雗',\r\n '頷',\r\n '顄',\r\n '颔',\r\n '駻',\r\n '鶾',\r\n ],\r\n zhāng: [\r\n '傽',\r\n '嫜',\r\n '张',\r\n '張',\r\n '彰',\r\n '慞',\r\n '暲',\r\n '樟',\r\n '漳',\r\n '獐',\r\n '璋',\r\n '章',\r\n '粻',\r\n '蔁',\r\n '蟑',\r\n '遧',\r\n '鄣',\r\n '鏱',\r\n '餦',\r\n '騿',\r\n '鱆',\r\n '麞',\r\n ],\r\n 'yān yàn': ['傿', '墕', '嬮'],\r\n 'piào biāo': ['僄', '骠'],\r\n liàn: [\r\n '僆',\r\n '堜',\r\n '媡',\r\n '恋',\r\n '戀',\r\n '楝',\r\n '殓',\r\n '殮',\r\n '湅',\r\n '潋',\r\n '澰',\r\n '瀲',\r\n '炼',\r\n '煉',\r\n '瑓',\r\n '練',\r\n '纞',\r\n '练',\r\n '萰',\r\n '錬',\r\n '鍊',\r\n '鏈',\r\n '链',\r\n '鰊',\r\n '𬶠',\r\n ],\r\n màn: [\r\n '㵘',\r\n '僈',\r\n '墁',\r\n '幔',\r\n '慢',\r\n '曼',\r\n '漫',\r\n '澷',\r\n '熳',\r\n '獌',\r\n '縵',\r\n '缦',\r\n '蔄',\r\n '蘰',\r\n '鄤',\r\n '鏝',\r\n '镘',\r\n '𬜬',\r\n ],\r\n 'tàn tǎn': ['僋'],\r\n yíng: [\r\n '僌',\r\n '営',\r\n '塋',\r\n '嬴',\r\n '攍',\r\n '楹',\r\n '櫿',\r\n '溁',\r\n '溋',\r\n '滢',\r\n '潆',\r\n '濙',\r\n '濚',\r\n '濴',\r\n '瀅',\r\n '瀛',\r\n '瀠',\r\n '瀯',\r\n '灐',\r\n '灜',\r\n '熒',\r\n '營',\r\n '瑩',\r\n '盁',\r\n '盈',\r\n '禜',\r\n '籝',\r\n '籯',\r\n '縈',\r\n '茔',\r\n '荧',\r\n '莹',\r\n '萤',\r\n '营',\r\n '萦',\r\n '萾',\r\n '蓥',\r\n '藀',\r\n '蛍',\r\n '蝇',\r\n '蝿',\r\n '螢',\r\n '蠅',\r\n '謍',\r\n '贏',\r\n '赢',\r\n '迎',\r\n '鎣',\r\n ],\r\n dòng: [\r\n '働',\r\n '冻',\r\n '凍',\r\n '动',\r\n '動',\r\n '姛',\r\n '戙',\r\n '挏',\r\n '栋',\r\n '棟',\r\n '湩',\r\n '硐',\r\n '胨',\r\n '胴',\r\n '腖',\r\n '迵',\r\n '霘',\r\n '駧',\r\n ],\r\n zhuàn: [\r\n '僎',\r\n '啭',\r\n '囀',\r\n '堟',\r\n '撰',\r\n '灷',\r\n '瑑',\r\n '篆',\r\n '腞',\r\n '蒃',\r\n '襈',\r\n '譔',\r\n '饌',\r\n '馔',\r\n ],\r\n xiàng: [\r\n '像',\r\n '勨',\r\n '向',\r\n '嚮',\r\n '姠',\r\n '嶑',\r\n '曏',\r\n '橡',\r\n '珦',\r\n '缿',\r\n '蟓',\r\n '衖',\r\n '襐',\r\n '象',\r\n '鐌',\r\n '項',\r\n '项',\r\n '鱌',\r\n ],\r\n shàn: [\r\n '僐',\r\n '善',\r\n '墠',\r\n '墡',\r\n '嬗',\r\n '擅',\r\n '敾',\r\n '椫',\r\n '樿',\r\n '歚',\r\n '汕',\r\n '灗',\r\n '疝',\r\n '磰',\r\n '繕',\r\n '缮',\r\n '膳',\r\n '蟮',\r\n '蟺',\r\n '訕',\r\n '謆',\r\n '譱',\r\n '讪',\r\n '贍',\r\n '赡',\r\n '赸',\r\n '鄯',\r\n '鐥',\r\n '饍',\r\n '騸',\r\n '骟',\r\n '鱓',\r\n '鱔',\r\n '鳝',\r\n '𫮃',\r\n ],\r\n 'tuí tuǐ': ['僓'],\r\n zǔn: ['僔', '噂', '撙', '譐'],\r\n pú: [\r\n '僕',\r\n '匍',\r\n '圤',\r\n '墣',\r\n '濮',\r\n '獛',\r\n '璞',\r\n '瞨',\r\n '穙',\r\n '莆',\r\n '菐',\r\n '菩',\r\n '葡',\r\n '蒱',\r\n '蒲',\r\n '贌',\r\n '酺',\r\n '鏷',\r\n '镤',\r\n ],\r\n láo: [\r\n '僗',\r\n '劳',\r\n '労',\r\n '勞',\r\n '哰',\r\n '崂',\r\n '嶗',\r\n '憥',\r\n '朥',\r\n '浶',\r\n '牢',\r\n '痨',\r\n '癆',\r\n '窂',\r\n '簩',\r\n '醪',\r\n '鐒',\r\n '铹',\r\n '顟',\r\n '髝',\r\n '𫭼',\r\n ],\r\n chǎng: ['僘', '厰', '廠', '敞', '昶', '氅', '鋹', '𬬮'],\r\n guāng: [\r\n '僙',\r\n '光',\r\n '咣',\r\n '垙',\r\n '姯',\r\n '洸',\r\n '灮',\r\n '炗',\r\n '炚',\r\n '炛',\r\n '烡',\r\n '珖',\r\n '胱',\r\n '茪',\r\n '輄',\r\n '銧',\r\n '黆',\r\n '𨐈',\r\n ],\r\n liáo: [\r\n '僚',\r\n '嘹',\r\n '嫽',\r\n '寥',\r\n '寮',\r\n '尞',\r\n '屪',\r\n '嵺',\r\n '嶚',\r\n '嶛',\r\n '廫',\r\n '憀',\r\n '敹',\r\n '暸',\r\n '橑',\r\n '獠',\r\n '璙',\r\n '疗',\r\n '療',\r\n '竂',\r\n '簝',\r\n '繚',\r\n '缭',\r\n '聊',\r\n '膋',\r\n '膫',\r\n '藔',\r\n '蟟',\r\n '豂',\r\n '賿',\r\n '蹘',\r\n '辽',\r\n '遼',\r\n '飉',\r\n '髎',\r\n '鷯',\r\n '鹩',\r\n ],\r\n dèng: ['僜', '凳', '墱', '嶝', '櫈', '瞪', '磴', '覴', '邓', '鄧', '隥'],\r\n 'chán zhàn zhuàn': ['僝'],\r\n bō: [\r\n '僠',\r\n '嶓',\r\n '拨',\r\n '撥',\r\n '播',\r\n '波',\r\n '溊',\r\n '玻',\r\n '癶',\r\n '盋',\r\n '砵',\r\n '碆',\r\n '礡',\r\n '缽',\r\n '菠',\r\n '袰',\r\n '蹳',\r\n '鉢',\r\n '钵',\r\n '餑',\r\n '饽',\r\n '驋',\r\n '鱍',\r\n '𬭛',\r\n ],\r\n huì: [\r\n '僡',\r\n '匯',\r\n '卉',\r\n '喙',\r\n '嘒',\r\n '嚖',\r\n '圚',\r\n '嬒',\r\n '寭',\r\n '屶',\r\n '屷',\r\n '彗',\r\n '彙',\r\n '彚',\r\n '徻',\r\n '恚',\r\n '恵',\r\n '惠',\r\n '慧',\r\n '憓',\r\n '懳',\r\n '晦',\r\n '暳',\r\n '槥',\r\n '橞',\r\n '檅',\r\n '櫘',\r\n '汇',\r\n '泋',\r\n '滙',\r\n '潓',\r\n '烩',\r\n '燴',\r\n '獩',\r\n '璤',\r\n '瞺',\r\n '硊',\r\n '秽',\r\n '穢',\r\n '篲',\r\n '絵',\r\n '繪',\r\n '绘',\r\n '翙',\r\n '翽',\r\n '荟',\r\n '蔧',\r\n '蕙',\r\n '薈',\r\n '薉',\r\n '蟪',\r\n '詯',\r\n '誨',\r\n '諱',\r\n '譓',\r\n '譿',\r\n '讳',\r\n '诲',\r\n '賄',\r\n '贿',\r\n '鐬',\r\n '闠',\r\n '阓',\r\n '靧',\r\n '頮',\r\n '顪',\r\n '颒',\r\n '餯',\r\n '𬤝',\r\n '𬭬',\r\n ],\r\n chuǎn: ['僢', '喘', '舛', '荈', '踳'],\r\n 'tiě jiàn': ['僣'],\r\n sēng: ['僧', '鬙'],\r\n xiàn: [\r\n '僩',\r\n '僴',\r\n '哯',\r\n '垷',\r\n '塪',\r\n '姭',\r\n '娊',\r\n '宪',\r\n '岘',\r\n '峴',\r\n '憲',\r\n '撊',\r\n '晛',\r\n '橌',\r\n '橺',\r\n '涀',\r\n '瀗',\r\n '献',\r\n '獻',\r\n '现',\r\n '現',\r\n '県',\r\n '睍',\r\n '粯',\r\n '糮',\r\n '絤',\r\n '綫',\r\n '線',\r\n '线',\r\n '缐',\r\n '羡',\r\n '羨',\r\n '腺',\r\n '臔',\r\n '臽',\r\n '苋',\r\n '莧',\r\n '誢',\r\n '豏',\r\n '鋧',\r\n '錎',\r\n '限',\r\n '陥',\r\n '陷',\r\n '霰',\r\n '餡',\r\n '馅',\r\n '麲',\r\n '鼸',\r\n '𬀪',\r\n '𪾢',\r\n ],\r\n 'yù jú': ['僪'],\r\n 'è wū': ['僫'],\r\n 'tóng zhuàng': ['僮'],\r\n lǐn: [\r\n '僯',\r\n '凛',\r\n '凜',\r\n '廩',\r\n '廪',\r\n '懍',\r\n '懔',\r\n '撛',\r\n '檁',\r\n '檩',\r\n '澟',\r\n '癛',\r\n '癝',\r\n ],\r\n gù: [\r\n '僱',\r\n '凅',\r\n '固',\r\n '堌',\r\n '崓',\r\n '崮',\r\n '故',\r\n '梏',\r\n '棝',\r\n '牿',\r\n '痼',\r\n '祻',\r\n '錮',\r\n '锢',\r\n '雇',\r\n '顧',\r\n '顾',\r\n '鯝',\r\n '鲴',\r\n ],\r\n jiāng: [\r\n '僵',\r\n '壃',\r\n '姜',\r\n '橿',\r\n '殭',\r\n '江',\r\n '畕',\r\n '疅',\r\n '礓',\r\n '繮',\r\n '缰',\r\n '翞',\r\n '茳',\r\n '葁',\r\n '薑',\r\n '螀',\r\n '螿',\r\n '豇',\r\n '韁',\r\n '鱂',\r\n '鳉',\r\n ],\r\n mǐn: [\r\n '僶',\r\n '冺',\r\n '刡',\r\n '勄',\r\n '悯',\r\n '惽',\r\n '愍',\r\n '慜',\r\n '憫',\r\n '抿',\r\n '敃',\r\n '敏',\r\n '敯',\r\n '泯',\r\n '潣',\r\n '皿',\r\n '笢',\r\n '笽',\r\n '簢',\r\n '蠠',\r\n '閔',\r\n '閩',\r\n '闵',\r\n '闽',\r\n '鰵',\r\n '鳘',\r\n '黽',\r\n ],\r\n jìn: [\r\n '僸',\r\n '凚',\r\n '噤',\r\n '嚍',\r\n '墐',\r\n '壗',\r\n '妗',\r\n '嬧',\r\n '搢',\r\n '晉',\r\n '晋',\r\n '枃',\r\n '殣',\r\n '浕',\r\n '浸',\r\n '溍',\r\n '濅',\r\n '濜',\r\n '烬',\r\n '煡',\r\n '燼',\r\n '琎',\r\n '瑨',\r\n '璶',\r\n '盡',\r\n '祲',\r\n '縉',\r\n '缙',\r\n '荩',\r\n '藎',\r\n '覲',\r\n '觐',\r\n '賮',\r\n '贐',\r\n '赆',\r\n '近',\r\n '进',\r\n '進',\r\n '靳',\r\n '齽',\r\n ],\r\n 'jià jie': ['價'],\r\n qiào: [\r\n '僺',\r\n '峭',\r\n '帩',\r\n '撬',\r\n '殻',\r\n '窍',\r\n '竅',\r\n '誚',\r\n '诮',\r\n '躈',\r\n '陗',\r\n '鞩',\r\n '韒',\r\n '髚',\r\n ],\r\n pì: ['僻', '媲', '嫓', '屁', '澼', '甓', '疈', '譬', '闢', '鷿', '鸊', '䴙'],\r\n sài: ['僿', '簺', '賽', '赛'],\r\n 'chán tǎn shàn': ['儃'],\r\n 'dāng dàng': ['儅', '当', '闣'],\r\n xuān: [\r\n '儇',\r\n '喧',\r\n '塇',\r\n '媗',\r\n '宣',\r\n '愃',\r\n '愋',\r\n '揎',\r\n '昍',\r\n '暄',\r\n '煊',\r\n '煖',\r\n '瑄',\r\n '睻',\r\n '矎',\r\n '禤',\r\n '箮',\r\n '翧',\r\n '翾',\r\n '萱',\r\n '萲',\r\n '蓒',\r\n '蕿',\r\n '藼',\r\n '蘐',\r\n '蝖',\r\n '蠉',\r\n '諠',\r\n '諼',\r\n '譞',\r\n '谖',\r\n '軒',\r\n '轩',\r\n '鍹',\r\n '駽',\r\n '鰚',\r\n '𫓶',\r\n '𫍽',\r\n ],\r\n 'dān dàn': ['儋', '擔', '瘅'],\r\n càn: ['儏', '澯', '灿', '燦', '璨', '粲', '薒', '謲'],\r\n 'bīn bìn': ['儐'],\r\n 'án àn': ['儑'],\r\n tái: [\r\n '儓',\r\n '坮',\r\n '嬯',\r\n '抬',\r\n '擡',\r\n '檯',\r\n '炱',\r\n '炲',\r\n '籉',\r\n '臺',\r\n '薹',\r\n '跆',\r\n '邰',\r\n '颱',\r\n '鮐',\r\n '鲐',\r\n ],\r\n lán: [\r\n '儖',\r\n '兰',\r\n '囒',\r\n '婪',\r\n '岚',\r\n '嵐',\r\n '幱',\r\n '拦',\r\n '攔',\r\n '斓',\r\n '斕',\r\n '栏',\r\n '欄',\r\n '欗',\r\n '澜',\r\n '瀾',\r\n '灆',\r\n '灡',\r\n '燣',\r\n '燷',\r\n '璼',\r\n '篮',\r\n '籃',\r\n '籣',\r\n '繿',\r\n '葻',\r\n '蓝',\r\n '藍',\r\n '蘫',\r\n '蘭',\r\n '褴',\r\n '襕',\r\n '襤',\r\n '襴',\r\n '襽',\r\n '譋',\r\n '讕',\r\n '谰',\r\n '躝',\r\n '鑭',\r\n '镧',\r\n '闌',\r\n '阑',\r\n '韊',\r\n '𬒗',\r\n ],\r\n 'nǐ yì ài yí': ['儗'],\r\n méng: [\r\n '儚',\r\n '幪',\r\n '曚',\r\n '朦',\r\n '橗',\r\n '檬',\r\n '氋',\r\n '溕',\r\n '濛',\r\n '甍',\r\n '甿',\r\n '盟',\r\n '礞',\r\n '艨',\r\n '莔',\r\n '萌',\r\n '蕄',\r\n '虻',\r\n '蝱',\r\n '鄳',\r\n '鄸',\r\n '霿',\r\n '靀',\r\n '顭',\r\n '饛',\r\n '鯍',\r\n '鸏',\r\n '鹲',\r\n '𫑡',\r\n '㠓',\r\n ],\r\n níng: [\r\n '儜',\r\n '凝',\r\n '咛',\r\n '嚀',\r\n '嬣',\r\n '柠',\r\n '橣',\r\n '檸',\r\n '狞',\r\n '獰',\r\n '聍',\r\n '聹',\r\n '薴',\r\n '鑏',\r\n '鬡',\r\n '鸋',\r\n ],\r\n qióng: [\r\n '儝',\r\n '卭',\r\n '宆',\r\n '惸',\r\n '憌',\r\n '桏',\r\n '橩',\r\n '焪',\r\n '焭',\r\n '煢',\r\n '熍',\r\n '琼',\r\n '瓊',\r\n '睘',\r\n '穷',\r\n '穹',\r\n '窮',\r\n '竆',\r\n '笻',\r\n '筇',\r\n '舼',\r\n '茕',\r\n '藑',\r\n '藭',\r\n '蛩',\r\n '蛬',\r\n '赹',\r\n '跫',\r\n '邛',\r\n '銎',\r\n '䓖',\r\n ],\r\n liè: [\r\n '儠',\r\n '冽',\r\n '列',\r\n '劣',\r\n '劽',\r\n '埒',\r\n '埓',\r\n '姴',\r\n '峛',\r\n '巤',\r\n '挒',\r\n '捩',\r\n '栵',\r\n '洌',\r\n '浖',\r\n '烈',\r\n '烮',\r\n '煭',\r\n '犣',\r\n '猎',\r\n '猟',\r\n '獵',\r\n '聗',\r\n '脟',\r\n '茢',\r\n '蛚',\r\n '趔',\r\n '躐',\r\n '迾',\r\n '颲',\r\n '鬛',\r\n '鬣',\r\n '鮤',\r\n '鱲',\r\n '鴷',\r\n '䴕',\r\n '𫚭',\r\n ],\r\n kuǎng: ['儣', '夼', '懭'],\r\n bào: [\r\n '儤',\r\n '勽',\r\n '報',\r\n '忁',\r\n '报',\r\n '抱',\r\n '曓',\r\n '爆',\r\n '犦',\r\n '菢',\r\n '虣',\r\n '蚫',\r\n '豹',\r\n '鉋',\r\n '鑤',\r\n '铇',\r\n '骲',\r\n '髱',\r\n '鮑',\r\n '鲍',\r\n ],\r\n biāo: [\r\n '儦',\r\n '墂',\r\n '幖',\r\n '彪',\r\n '标',\r\n '標',\r\n '滮',\r\n '瀌',\r\n '熛',\r\n '爂',\r\n '猋',\r\n '瘭',\r\n '磦',\r\n '膘',\r\n '臕',\r\n '謤',\r\n '贆',\r\n '鏢',\r\n '鑣',\r\n '镖',\r\n '镳',\r\n '颮',\r\n '颷',\r\n '飆',\r\n '飇',\r\n '飈',\r\n '飊',\r\n '飑',\r\n '飙',\r\n '飚',\r\n '驫',\r\n '骉',\r\n '髟',\r\n ],\r\n zǎn: ['儧', '儹', '噆', '攅', '昝', '趱', '趲'],\r\n háo: [\r\n '儫',\r\n '嗥',\r\n '嘷',\r\n '噑',\r\n '嚎',\r\n '壕',\r\n '椃',\r\n '毜',\r\n '毫',\r\n '濠',\r\n '獆',\r\n '獔',\r\n '竓',\r\n '籇',\r\n '蚝',\r\n '蠔',\r\n '譹',\r\n '豪',\r\n ],\r\n qìng: ['儬', '凊', '庆', '慶', '櫦', '濪', '碃', '磬', '罄', '靘'],\r\n chèn: [\r\n '儭',\r\n '嚫',\r\n '榇',\r\n '櫬',\r\n '疢',\r\n '衬',\r\n '襯',\r\n '讖',\r\n '谶',\r\n '趁',\r\n '趂',\r\n '齓',\r\n '齔',\r\n '龀',\r\n ],\r\n téng: [\r\n '儯',\r\n '幐',\r\n '滕',\r\n '漛',\r\n '疼',\r\n '籐',\r\n '籘',\r\n '縢',\r\n '腾',\r\n '藤',\r\n '虅',\r\n '螣',\r\n '誊',\r\n '謄',\r\n '邆',\r\n '駦',\r\n '騰',\r\n '驣',\r\n '鰧',\r\n '䲢',\r\n ],\r\n 'lǒng lóng lòng': ['儱'],\r\n 'chán chàn': ['儳'],\r\n 'ráng xiāng': ['儴', '勷'],\r\n 'huì xié': ['儶'],\r\n luó: [\r\n '儸',\r\n '攞',\r\n '椤',\r\n '欏',\r\n '猡',\r\n '玀',\r\n '箩',\r\n '籮',\r\n '罗',\r\n '羅',\r\n '脶',\r\n '腡',\r\n '萝',\r\n '蘿',\r\n '螺',\r\n '覼',\r\n '逻',\r\n '邏',\r\n '鏍',\r\n '鑼',\r\n '锣',\r\n '镙',\r\n '饠',\r\n '騾',\r\n '驘',\r\n '骡',\r\n '鸁',\r\n ],\r\n léi: [\r\n '儽',\r\n '嫘',\r\n '檑',\r\n '欙',\r\n '瓃',\r\n '畾',\r\n '縲',\r\n '纍',\r\n '纝',\r\n '缧',\r\n '罍',\r\n '羸',\r\n '蔂',\r\n '蘲',\r\n '虆',\r\n '轠',\r\n '鐳',\r\n '鑘',\r\n '镭',\r\n '雷',\r\n '靁',\r\n '鱩',\r\n '鼺',\r\n ],\r\n 'nàng nāng': ['儾'],\r\n 'wù wū': ['兀'],\r\n yǔn: [\r\n '允',\r\n '喗',\r\n '夽',\r\n '抎',\r\n '殒',\r\n '殞',\r\n '狁',\r\n '磒',\r\n '荺',\r\n '賱',\r\n '鈗',\r\n '阭',\r\n '陨',\r\n '隕',\r\n '霣',\r\n '馻',\r\n '齫',\r\n '齳',\r\n ],\r\n zān: ['兂', '橵', '簪', '簮', '糌', '鐕', '鐟', '鵤'],\r\n yuán: [\r\n '元',\r\n '円',\r\n '原',\r\n '厡',\r\n '厵',\r\n '园',\r\n '圆',\r\n '圎',\r\n '園',\r\n '圓',\r\n '垣',\r\n '塬',\r\n '媴',\r\n '嫄',\r\n '援',\r\n '榞',\r\n '榬',\r\n '橼',\r\n '櫞',\r\n '沅',\r\n '湲',\r\n '源',\r\n '溒',\r\n '爰',\r\n '猨',\r\n '猿',\r\n '笎',\r\n '緣',\r\n '縁',\r\n '缘',\r\n '羱',\r\n '茒',\r\n '薗',\r\n '蝝',\r\n '蝯',\r\n '螈',\r\n '袁',\r\n '褤',\r\n '謜',\r\n '轅',\r\n '辕',\r\n '邍',\r\n '邧',\r\n '酛',\r\n '鈨',\r\n '鎱',\r\n '騵',\r\n '魭',\r\n '鶢',\r\n '鶰',\r\n '黿',\r\n '鼋',\r\n '𫘪',\r\n ],\r\n xiōng: [\r\n '兄',\r\n '兇',\r\n '凶',\r\n '匂',\r\n '匈',\r\n '哅',\r\n '忷',\r\n '恟',\r\n '汹',\r\n '洶',\r\n '胷',\r\n '胸',\r\n '芎',\r\n '訩',\r\n '詾',\r\n '讻',\r\n ],\r\n chōng: [\r\n '充',\r\n '嘃',\r\n '忡',\r\n '憃',\r\n '憧',\r\n '摏',\r\n '沖',\r\n '浺',\r\n '珫',\r\n '罿',\r\n '翀',\r\n '舂',\r\n '艟',\r\n '茺',\r\n '衝',\r\n '蹖',\r\n '㳘',\r\n ],\r\n zhào: [\r\n '兆',\r\n '垗',\r\n '旐',\r\n '曌',\r\n '枛',\r\n '櫂',\r\n '照',\r\n '燳',\r\n '狣',\r\n '瞾',\r\n '笊',\r\n '罀',\r\n '罩',\r\n '羄',\r\n '肁',\r\n '肇',\r\n '肈',\r\n '詔',\r\n '诏',\r\n '赵',\r\n '趙',\r\n '鮡',\r\n '𬶐',\r\n ],\r\n 'duì ruì yuè': ['兊', '兌', '兑'],\r\n kè: [\r\n '克',\r\n '刻',\r\n '勀',\r\n '勊',\r\n '堁',\r\n '娔',\r\n '客',\r\n '恪',\r\n '愙',\r\n '氪',\r\n '溘',\r\n '碦',\r\n '緙',\r\n '缂',\r\n '艐',\r\n '衉',\r\n '課',\r\n '课',\r\n '錁',\r\n '锞',\r\n '騍',\r\n '骒',\r\n ],\r\n tù: ['兎', '兔', '堍', '迌', '鵵'],\r\n dǎng: ['党', '攩', '欓', '譡', '讜', '谠', '黨', '𣗋'],\r\n dōu: ['兜', '兠', '唗', '橷', '篼', '蔸'],\r\n huǎng: [\r\n '兤',\r\n '奛',\r\n '幌',\r\n '怳',\r\n '恍',\r\n '晄',\r\n '炾',\r\n '熀',\r\n '縨',\r\n '詤',\r\n '謊',\r\n '谎',\r\n ],\r\n rù: ['入', '嗕', '媷', '扖', '杁', '洳', '溽', '縟', '缛', '蓐', '褥', '鳰'],\r\n nèi: ['內', '氝', '氞', '錗'],\r\n 'yú shù': ['兪'],\r\n 'liù lù': ['六'],\r\n han: ['兯', '爳'],\r\n tiān: ['兲', '天', '婖', '添', '酟', '靔', '靝', '黇'],\r\n 'xīng xìng': ['兴'],\r\n diǎn: [\r\n '典',\r\n '嚸',\r\n '奌',\r\n '婰',\r\n '敟',\r\n '椣',\r\n '点',\r\n '碘',\r\n '蒧',\r\n '蕇',\r\n '踮',\r\n '點',\r\n ],\r\n 'zī cí': ['兹'],\r\n jiān: [\r\n '兼',\r\n '冿',\r\n '囏',\r\n '坚',\r\n '堅',\r\n '奸',\r\n '姦',\r\n '姧',\r\n '尖',\r\n '幵',\r\n '惤',\r\n '戋',\r\n '戔',\r\n '搛',\r\n '椾',\r\n '樫',\r\n '櫼',\r\n '歼',\r\n '殱',\r\n '殲',\r\n '湔',\r\n '瀐',\r\n '瀸',\r\n '煎',\r\n '熞',\r\n '熸',\r\n '牋',\r\n '瑊',\r\n '睷',\r\n '礛',\r\n '礷',\r\n '笺',\r\n '箋',\r\n '緘',\r\n '縑',\r\n '缄',\r\n '缣',\r\n '肩',\r\n '艰',\r\n '艱',\r\n '菅',\r\n '菺',\r\n '葌',\r\n '蒹',\r\n '蔪',\r\n '蕑',\r\n '蕳',\r\n '虃',\r\n '譼',\r\n '豜',\r\n '鑯',\r\n '雃',\r\n '鞯',\r\n '韀',\r\n '韉',\r\n '餰',\r\n '馢',\r\n '鰔',\r\n '鰜',\r\n '鰹',\r\n '鲣',\r\n '鳒',\r\n '鵑',\r\n '鵳',\r\n '鶼',\r\n '鹣',\r\n '麉',\r\n ],\r\n shòu: [\r\n '兽',\r\n '受',\r\n '售',\r\n '壽',\r\n '夀',\r\n '寿',\r\n '授',\r\n '狩',\r\n '獣',\r\n '獸',\r\n '痩',\r\n '瘦',\r\n '綬',\r\n '绶',\r\n '膄',\r\n ],\r\n jì: [\r\n '兾',\r\n '冀',\r\n '剂',\r\n '剤',\r\n '劑',\r\n '勣',\r\n '坖',\r\n '垍',\r\n '塈',\r\n '妓',\r\n '季',\r\n '寂',\r\n '寄',\r\n '廭',\r\n '彑',\r\n '徛',\r\n '忌',\r\n '悸',\r\n '惎',\r\n '懻',\r\n '技',\r\n '旡',\r\n '既',\r\n '旣',\r\n '暨',\r\n '暩',\r\n '曁',\r\n '梞',\r\n '檕',\r\n '檵',\r\n '洎',\r\n '漃',\r\n '漈',\r\n '瀱',\r\n '痵',\r\n '癠',\r\n '禝',\r\n '稩',\r\n '稷',\r\n '穄',\r\n '穊',\r\n '穧',\r\n '紀',\r\n '継',\r\n '績',\r\n '繋',\r\n '繼',\r\n '继',\r\n '绩',\r\n '罽',\r\n '臮',\r\n '芰',\r\n '茍',\r\n '茤',\r\n '葪',\r\n '蓟',\r\n '蔇',\r\n '薊',\r\n '蘎',\r\n '蘮',\r\n '蘻',\r\n '裚',\r\n '襀',\r\n '覬',\r\n '觊',\r\n '計',\r\n '記',\r\n '誋',\r\n '计',\r\n '记',\r\n '跡',\r\n '跽',\r\n '蹟',\r\n '迹',\r\n '际',\r\n '際',\r\n '霁',\r\n '霽',\r\n '驥',\r\n '骥',\r\n '髻',\r\n '鬾',\r\n '魝',\r\n '魥',\r\n '鯚',\r\n '鯽',\r\n '鰶',\r\n '鰿',\r\n '鱀',\r\n '鱭',\r\n '鲚',\r\n '鲫',\r\n '鵋',\r\n '鷑',\r\n '齌',\r\n '𪟝',\r\n '𬶨',\r\n '𬶭',\r\n ],\r\n jiōng: ['冂', '冋', '坰', '埛', '扃', '蘏', '蘔', '駉', '駫', '𬳶'],\r\n mào: [\r\n '冃',\r\n '冐',\r\n '媢',\r\n '帽',\r\n '愗',\r\n '懋',\r\n '暓',\r\n '柕',\r\n '楙',\r\n '毷',\r\n '瑁',\r\n '皃',\r\n '眊',\r\n '瞀',\r\n '耄',\r\n '茂',\r\n '萺',\r\n '蝐',\r\n '袤',\r\n '覒',\r\n '貌',\r\n '貿',\r\n '贸',\r\n '鄚',\r\n '鄮',\r\n ],\r\n rǎn: ['冄', '冉', '姌', '媣', '染', '珃', '苒', '蒅', '䎃'],\r\n 'nèi nà': ['内'],\r\n gāng: [\r\n '冈',\r\n '冮',\r\n '刚',\r\n '剛',\r\n '堈',\r\n '堽',\r\n '岡',\r\n '掆',\r\n '摃',\r\n '棡',\r\n '牨',\r\n '犅',\r\n '疘',\r\n '綱',\r\n '纲',\r\n '缸',\r\n '罁',\r\n '罡',\r\n '肛',\r\n '釭',\r\n '鎠',\r\n '㭎',\r\n ],\r\n cè: [\r\n '冊',\r\n '册',\r\n '厕',\r\n '厠',\r\n '夨',\r\n '廁',\r\n '恻',\r\n '惻',\r\n '憡',\r\n '敇',\r\n '测',\r\n '測',\r\n '笧',\r\n '策',\r\n '筞',\r\n '筴',\r\n '箣',\r\n '荝',\r\n '萗',\r\n '萴',\r\n '蓛',\r\n ],\r\n guǎ: ['冎', '剐', '剮', '叧', '寡'],\r\n 'mào mò': ['冒'],\r\n gòu: [\r\n '冓',\r\n '啂',\r\n '坸',\r\n '垢',\r\n '够',\r\n '夠',\r\n '媾',\r\n '彀',\r\n '搆',\r\n '撀',\r\n '构',\r\n '構',\r\n '煹',\r\n '覯',\r\n '觏',\r\n '訽',\r\n '詬',\r\n '诟',\r\n '購',\r\n '购',\r\n '遘',\r\n '雊',\r\n ],\r\n xǔ: ['冔', '喣', '暊', '栩', '珝', '盨', '糈', '詡', '諿', '诩', '鄦', '醑'],\r\n mì: [\r\n '冖',\r\n '冪',\r\n '嘧',\r\n '塓',\r\n '宻',\r\n '密',\r\n '峚',\r\n '幂',\r\n '幎',\r\n '幦',\r\n '怽',\r\n '榓',\r\n '樒',\r\n '櫁',\r\n '汨',\r\n '淧',\r\n '滵',\r\n '漞',\r\n '濗',\r\n '熐',\r\n '羃',\r\n '蔤',\r\n '蜜',\r\n '覓',\r\n '覔',\r\n '覛',\r\n '觅',\r\n '謐',\r\n '谧',\r\n '鼏',\r\n ],\r\n 'yóu yín': ['冘'],\r\n xiě: ['写', '冩', '藛'],\r\n jūn: [\r\n '军',\r\n '君',\r\n '均',\r\n '桾',\r\n '汮',\r\n '皲',\r\n '皸',\r\n '皹',\r\n '碅',\r\n '莙',\r\n '蚐',\r\n '袀',\r\n '覠',\r\n '軍',\r\n '鈞',\r\n '銁',\r\n '銞',\r\n '鍕',\r\n '钧',\r\n '頵',\r\n '鮶',\r\n '鲪',\r\n '麏',\r\n ],\r\n mí: [\r\n '冞',\r\n '擟',\r\n '瀰',\r\n '爢',\r\n '猕',\r\n '獼',\r\n '祢',\r\n '禰',\r\n '縻',\r\n '蒾',\r\n '藌',\r\n '蘪',\r\n '蘼',\r\n '袮',\r\n '詸',\r\n '謎',\r\n '迷',\r\n '醚',\r\n '醾',\r\n '醿',\r\n '釄',\r\n '镾',\r\n '鸍',\r\n '麊',\r\n '麋',\r\n '麛',\r\n ],\r\n 'guān guàn': ['冠', '覌', '観', '觀', '观'],\r\n měng: [\r\n '冡',\r\n '勐',\r\n '懵',\r\n '掹',\r\n '猛',\r\n '獴',\r\n '艋',\r\n '蜢',\r\n '蠓',\r\n '錳',\r\n '锰',\r\n '鯭',\r\n '鼆',\r\n ],\r\n zhǒng: ['冢', '塚', '尰', '歱', '煄', '瘇', '肿', '腫', '踵'],\r\n zuì: [\r\n '冣',\r\n '嶵',\r\n '晬',\r\n '最',\r\n '栬',\r\n '槜',\r\n '檇',\r\n '檌',\r\n '祽',\r\n '絊',\r\n '罪',\r\n '蕞',\r\n '辠',\r\n '酔',\r\n '酻',\r\n '醉',\r\n '錊',\r\n ],\r\n yuān: [\r\n '冤',\r\n '剈',\r\n '囦',\r\n '嬽',\r\n '寃',\r\n '棩',\r\n '淵',\r\n '渁',\r\n '渆',\r\n '渊',\r\n '渕',\r\n '灁',\r\n '眢',\r\n '肙',\r\n '葾',\r\n '蒬',\r\n '蜎',\r\n '蜵',\r\n '駌',\r\n '鳶',\r\n '鴛',\r\n '鵷',\r\n '鸢',\r\n '鸳',\r\n '鹓',\r\n '鼘',\r\n '鼝',\r\n ],\r\n míng: [\r\n '冥',\r\n '名',\r\n '明',\r\n '暝',\r\n '朙',\r\n '榠',\r\n '洺',\r\n '溟',\r\n '猽',\r\n '眀',\r\n '眳',\r\n '瞑',\r\n '茗',\r\n '螟',\r\n '覭',\r\n '詺',\r\n '鄍',\r\n '銘',\r\n '铭',\r\n '鳴',\r\n '鸣',\r\n ],\r\n kòu: [\r\n '冦',\r\n '叩',\r\n '宼',\r\n '寇',\r\n '扣',\r\n '敂',\r\n '滱',\r\n '窛',\r\n '筘',\r\n '簆',\r\n '蔲',\r\n '蔻',\r\n '釦',\r\n '鷇',\r\n ],\r\n tài: [\r\n '冭',\r\n '太',\r\n '夳',\r\n '忲',\r\n '态',\r\n '態',\r\n '汰',\r\n '汱',\r\n '泰',\r\n '溙',\r\n '肽',\r\n '舦',\r\n '酞',\r\n '鈦',\r\n '钛',\r\n ],\r\n 'féng píng': ['冯', '馮'],\r\n 'chōng chòng': ['冲'],\r\n kuàng: [\r\n '况',\r\n '圹',\r\n '壙',\r\n '岲',\r\n '懬',\r\n '旷',\r\n '昿',\r\n '曠',\r\n '框',\r\n '況',\r\n '爌',\r\n '眖',\r\n '眶',\r\n '矿',\r\n '砿',\r\n '礦',\r\n '穬',\r\n '絋',\r\n '絖',\r\n '纊',\r\n '纩',\r\n '貺',\r\n '贶',\r\n '軦',\r\n '邝',\r\n '鄺',\r\n '鉱',\r\n '鋛',\r\n '鑛',\r\n '黋',\r\n ],\r\n lěng: ['冷'],\r\n pàn: [\r\n '冸',\r\n '判',\r\n '叛',\r\n '沜',\r\n '泮',\r\n '溿',\r\n '炍',\r\n '牉',\r\n '畔',\r\n '盼',\r\n '聁',\r\n '袢',\r\n '襻',\r\n '詊',\r\n '鋬',\r\n '鑻',\r\n '頖',\r\n '鵥',\r\n ],\r\n fā: ['冹', '彂', '沷', '発', '發'],\r\n xiǎn: [\r\n '冼',\r\n '尟',\r\n '尠',\r\n '崄',\r\n '嶮',\r\n '幰',\r\n '攇',\r\n '显',\r\n '櫶',\r\n '毨',\r\n '灦',\r\n '烍',\r\n '燹',\r\n '狝',\r\n '猃',\r\n '獫',\r\n '獮',\r\n '玁',\r\n '禒',\r\n '筅',\r\n '箲',\r\n '藓',\r\n '蘚',\r\n '蚬',\r\n '蜆',\r\n '譣',\r\n '赻',\r\n '跣',\r\n '鍌',\r\n '险',\r\n '険',\r\n '險',\r\n '韅',\r\n '顕',\r\n '顯',\r\n '㬎',\r\n ],\r\n qià: ['冾', '圶', '帢', '恰', '殎', '洽', '硈', '胢', '髂'],\r\n 'jìng chēng': ['净', '凈', '淨'],\r\n sōu: [\r\n '凁',\r\n '嗖',\r\n '廀',\r\n '廋',\r\n '捜',\r\n '搜',\r\n '摉',\r\n '溲',\r\n '獀',\r\n '艘',\r\n '蒐',\r\n '螋',\r\n '鄋',\r\n '醙',\r\n '鎪',\r\n '锼',\r\n '颼',\r\n '飕',\r\n '餿',\r\n '馊',\r\n '騪',\r\n ],\r\n měi: [\r\n '凂',\r\n '媄',\r\n '媺',\r\n '嬍',\r\n '嵄',\r\n '挴',\r\n '毎',\r\n '每',\r\n '浼',\r\n '渼',\r\n '燘',\r\n '美',\r\n '躾',\r\n '鎂',\r\n '镁',\r\n '黣',\r\n ],\r\n tú: [\r\n '凃',\r\n '図',\r\n '图',\r\n '圖',\r\n '圗',\r\n '塗',\r\n '屠',\r\n '峹',\r\n '嵞',\r\n '庩',\r\n '廜',\r\n '徒',\r\n '悇',\r\n '揬',\r\n '涂',\r\n '瘏',\r\n '筡',\r\n '腯',\r\n '荼',\r\n '蒤',\r\n '跿',\r\n '途',\r\n '酴',\r\n '鈯',\r\n '鍎',\r\n '馟',\r\n '駼',\r\n '鵌',\r\n '鶟',\r\n '鷋',\r\n '鷵',\r\n '𬳿',\r\n ],\r\n zhǔn: ['准', '凖', '埻', '準', '𬘯'],\r\n 'liáng liàng': ['凉', '涼', '量'],\r\n diāo: [\r\n '凋',\r\n '刁',\r\n '刟',\r\n '叼',\r\n '奝',\r\n '弴',\r\n '彫',\r\n '汈',\r\n '琱',\r\n '碉',\r\n '簓',\r\n '虭',\r\n '蛁',\r\n '貂',\r\n '錭',\r\n '雕',\r\n '鮉',\r\n '鯛',\r\n '鲷',\r\n '鵰',\r\n '鼦',\r\n ],\r\n còu: ['凑', '湊', '腠', '輳', '辏'],\r\n ái: ['凒', '啀', '嘊', '捱', '溰', '癌', '皑', '皚'],\r\n duó: ['凙', '剫', '夺', '奪', '痥', '踱', '鈬', '鐸', '铎'],\r\n dú: [\r\n '凟',\r\n '匵',\r\n '嬻',\r\n '椟',\r\n '櫝',\r\n '殰',\r\n '涜',\r\n '牍',\r\n '牘',\r\n '犊',\r\n '犢',\r\n '独',\r\n '獨',\r\n '瓄',\r\n '皾',\r\n '裻',\r\n '読',\r\n '讀',\r\n '讟',\r\n '豄',\r\n '贕',\r\n '錖',\r\n '鑟',\r\n '韇',\r\n '韣',\r\n '韥',\r\n '騳',\r\n '髑',\r\n '黩',\r\n '黷',\r\n ],\r\n 'jǐ jī': ['几'],\r\n fán: [\r\n '凡',\r\n '凢',\r\n '凣',\r\n '匥',\r\n '墦',\r\n '杋',\r\n '柉',\r\n '棥',\r\n '樊',\r\n '瀿',\r\n '烦',\r\n '煩',\r\n '燔',\r\n '璠',\r\n '矾',\r\n '礬',\r\n '笲',\r\n '籵',\r\n '緐',\r\n '羳',\r\n '舤',\r\n '舧',\r\n '薠',\r\n '蘩',\r\n '蠜',\r\n '襎',\r\n '蹯',\r\n '釩',\r\n '鐇',\r\n '鐢',\r\n '钒',\r\n '鷭',\r\n '𫔍',\r\n '𬸪',\r\n ],\r\n jū: [\r\n '凥',\r\n '匊',\r\n '娵',\r\n '婮',\r\n '居',\r\n '崌',\r\n '抅',\r\n '挶',\r\n '掬',\r\n '梮',\r\n '椐',\r\n '檋',\r\n '毩',\r\n '毱',\r\n '泃',\r\n '涺',\r\n '狙',\r\n '琚',\r\n '疽',\r\n '砠',\r\n '罝',\r\n '腒',\r\n '艍',\r\n '蜛',\r\n '裾',\r\n '諊',\r\n '跔',\r\n '踘',\r\n '躹',\r\n '陱',\r\n '雎',\r\n '鞠',\r\n '鞫',\r\n '駒',\r\n '驹',\r\n '鮈',\r\n '鴡',\r\n '鶋',\r\n '𬶋',\r\n ],\r\n 'chù chǔ': ['処', '处'],\r\n zhǐ: [\r\n '凪',\r\n '劧',\r\n '咫',\r\n '址',\r\n '坧',\r\n '帋',\r\n '恉',\r\n '扺',\r\n '指',\r\n '旨',\r\n '枳',\r\n '止',\r\n '汦',\r\n '沚',\r\n '洔',\r\n '淽',\r\n '疻',\r\n '砋',\r\n '祉',\r\n '秖',\r\n '紙',\r\n '纸',\r\n '芷',\r\n '藢',\r\n '衹',\r\n '襧',\r\n '訨',\r\n '趾',\r\n '軹',\r\n '轵',\r\n '酯',\r\n '阯',\r\n '黹',\r\n ],\r\n píng: [\r\n '凭',\r\n '凴',\r\n '呯',\r\n '坪',\r\n '塀',\r\n '岼',\r\n '帡',\r\n '帲',\r\n '幈',\r\n '平',\r\n '慿',\r\n '憑',\r\n '枰',\r\n '洴',\r\n '焩',\r\n '玶',\r\n '瓶',\r\n '甁',\r\n '竮',\r\n '箳',\r\n '簈',\r\n '缾',\r\n '荓',\r\n '萍',\r\n '蓱',\r\n '蚲',\r\n '蛢',\r\n '評',\r\n '评',\r\n '軿',\r\n '輧',\r\n '郱',\r\n '鮃',\r\n '鲆',\r\n ],\r\n kǎi: [\r\n '凯',\r\n '凱',\r\n '剀',\r\n '剴',\r\n '垲',\r\n '塏',\r\n '恺',\r\n '愷',\r\n '慨',\r\n '暟',\r\n '蒈',\r\n '輆',\r\n '鍇',\r\n '鎧',\r\n '铠',\r\n '锴',\r\n '闓',\r\n '闿',\r\n '颽',\r\n ],\r\n gān: [\r\n '凲',\r\n '坩',\r\n '尲',\r\n '尴',\r\n '尶',\r\n '尷',\r\n '柑',\r\n '泔',\r\n '漧',\r\n '玕',\r\n '甘',\r\n '疳',\r\n '矸',\r\n '竿',\r\n '筸',\r\n '粓',\r\n '肝',\r\n '苷',\r\n '迀',\r\n '酐',\r\n '魐',\r\n ],\r\n 'kǎn qiǎn': ['凵'],\r\n tū: [\r\n '凸',\r\n '堗',\r\n '嶀',\r\n '捸',\r\n '涋',\r\n '湥',\r\n '痜',\r\n '禿',\r\n '秃',\r\n '突',\r\n '葖',\r\n '鋵',\r\n '鵚',\r\n '鼵',\r\n '㻬',\r\n ],\r\n 'āo wā': ['凹'],\r\n chū: ['出', '初', '岀', '摴', '榋', '樗', '貙', '齣', '䢺', '䝙'],\r\n dàng: [\r\n '凼',\r\n '圵',\r\n '垱',\r\n '壋',\r\n '档',\r\n '檔',\r\n '氹',\r\n '璗',\r\n '瓽',\r\n '盪',\r\n '瞊',\r\n '砀',\r\n '碭',\r\n '礑',\r\n '簜',\r\n '荡',\r\n '菪',\r\n '蕩',\r\n '蘯',\r\n '趤',\r\n '逿',\r\n '雼',\r\n '𬍡',\r\n ],\r\n hán: [\r\n '函',\r\n '凾',\r\n '含',\r\n '圅',\r\n '娢',\r\n '寒',\r\n '崡',\r\n '晗',\r\n '梒',\r\n '浛',\r\n '涵',\r\n '澏',\r\n '焓',\r\n '琀',\r\n '甝',\r\n '筨',\r\n '蜬',\r\n '邗',\r\n '邯',\r\n '鋡',\r\n '韓',\r\n '韩',\r\n ],\r\n záo: ['凿', '鑿'],\r\n dāo: ['刀', '刂', '忉', '氘', '舠', '螩', '釖', '魛', '鱽'],\r\n chuāng: ['刅', '摐', '牎', '牕', '疮', '瘡', '窓', '窗', '窻'],\r\n 'fēn fèn': ['分'],\r\n 'qiè qiē': ['切'],\r\n kān: ['刊', '勘', '堪', '戡', '栞', '龕', '龛'],\r\n cǔn: ['刌', '忖'],\r\n chú: [\r\n '刍',\r\n '厨',\r\n '幮',\r\n '廚',\r\n '橱',\r\n '櫉',\r\n '櫥',\r\n '滁',\r\n '犓',\r\n '篨',\r\n '耡',\r\n '芻',\r\n '蒢',\r\n '蒭',\r\n '蜍',\r\n '蟵',\r\n '豠',\r\n '趎',\r\n '蹰',\r\n '躇',\r\n '躕',\r\n '鉏',\r\n '鋤',\r\n '锄',\r\n '除',\r\n '雏',\r\n '雛',\r\n '鶵',\r\n ],\r\n 'huà huá': ['划'],\r\n lí: [\r\n '刕',\r\n '剓',\r\n '剺',\r\n '劙',\r\n '厘',\r\n '喱',\r\n '嚟',\r\n '囄',\r\n '嫠',\r\n '孷',\r\n '廲',\r\n '悡',\r\n '梨',\r\n '梸',\r\n '棃',\r\n '漓',\r\n '灕',\r\n '犁',\r\n '犂',\r\n '狸',\r\n '琍',\r\n '璃',\r\n '瓈',\r\n '盠',\r\n '睝',\r\n '离',\r\n '穲',\r\n '竰',\r\n '筣',\r\n '篱',\r\n '籬',\r\n '糎',\r\n '縭',\r\n '缡',\r\n '罹',\r\n '艃',\r\n '荲',\r\n '菞',\r\n '蓠',\r\n '蔾',\r\n '藜',\r\n '蘺',\r\n '蜊',\r\n '蟍',\r\n '蟸',\r\n '蠫',\r\n '褵',\r\n '謧',\r\n '貍',\r\n '醨',\r\n '鋫',\r\n '錅',\r\n '鏫',\r\n '鑗',\r\n '離',\r\n '驪',\r\n '骊',\r\n '鯏',\r\n '鯬',\r\n '鱺',\r\n '鲡',\r\n '鵹',\r\n '鸝',\r\n '鹂',\r\n '黎',\r\n '黧',\r\n '㰀',\r\n ],\r\n yuè: [\r\n '刖',\r\n '嬳',\r\n '岄',\r\n '岳',\r\n '嶽',\r\n '恱',\r\n '悅',\r\n '悦',\r\n '戉',\r\n '抈',\r\n '捳',\r\n '月',\r\n '樾',\r\n '瀹',\r\n '爚',\r\n '玥',\r\n '礿',\r\n '禴',\r\n '篗',\r\n '籆',\r\n '籥',\r\n '籰',\r\n '粤',\r\n '粵',\r\n '蘥',\r\n '蚎',\r\n '蚏',\r\n '説',\r\n '越',\r\n '跀',\r\n '跃',\r\n '躍',\r\n '軏',\r\n '鈅',\r\n '鉞',\r\n '鑰',\r\n '钺',\r\n '閱',\r\n '閲',\r\n '阅',\r\n '鸑',\r\n '鸙',\r\n '黦',\r\n '龠',\r\n '𫐄',\r\n '𬸚',\r\n ],\r\n liú: [\r\n '刘',\r\n '劉',\r\n '嚠',\r\n '媹',\r\n '嵧',\r\n '旈',\r\n '旒',\r\n '榴',\r\n '橊',\r\n '流',\r\n '浏',\r\n '瀏',\r\n '琉',\r\n '瑠',\r\n '瑬',\r\n '璢',\r\n '畄',\r\n '留',\r\n '畱',\r\n '疁',\r\n '瘤',\r\n '癅',\r\n '硫',\r\n '蒥',\r\n '蓅',\r\n '蟉',\r\n '裗',\r\n '鎏',\r\n '鏐',\r\n '鐂',\r\n '镠',\r\n '飀',\r\n '飅',\r\n '飗',\r\n '駠',\r\n '駵',\r\n '騮',\r\n '驑',\r\n '骝',\r\n '鰡',\r\n '鶹',\r\n '鹠',\r\n '麍',\r\n ],\r\n zé: [\r\n '则',\r\n '則',\r\n '啧',\r\n '嘖',\r\n '嫧',\r\n '帻',\r\n '幘',\r\n '択',\r\n '樍',\r\n '歵',\r\n '沢',\r\n '泎',\r\n '溭',\r\n '皟',\r\n '瞔',\r\n '矠',\r\n '礋',\r\n '箦',\r\n '簀',\r\n '舴',\r\n '蔶',\r\n '蠌',\r\n '襗',\r\n '謮',\r\n '賾',\r\n '赜',\r\n '迮',\r\n '鸅',\r\n '齚',\r\n '齰',\r\n ],\r\n 'chuàng chuāng': ['创', '創'],\r\n qù: ['刞', '厺', '去', '閴', '闃', '阒', '麮', '鼁'],\r\n 'bié biè': ['別', '别'],\r\n 'páo bào': ['刨'],\r\n 'chǎn chàn': ['刬', '剗', '幝'],\r\n guā: [\r\n '刮',\r\n '劀',\r\n '桰',\r\n '歄',\r\n '煱',\r\n '瓜',\r\n '胍',\r\n '踻',\r\n '颪',\r\n '颳',\r\n '騧',\r\n '鴰',\r\n '鸹',\r\n ],\r\n gēng: [\r\n '刯',\r\n '庚',\r\n '椩',\r\n '浭',\r\n '焿',\r\n '畊',\r\n '絚',\r\n '羮',\r\n '羹',\r\n '耕',\r\n '菮',\r\n '賡',\r\n '赓',\r\n '鶊',\r\n '鹒',\r\n ],\r\n dào: [\r\n '到',\r\n '噵',\r\n '悼',\r\n '椡',\r\n '檤',\r\n '燾',\r\n '瓙',\r\n '盗',\r\n '盜',\r\n '稲',\r\n '稻',\r\n '纛',\r\n '翿',\r\n '艔',\r\n '菿',\r\n '衜',\r\n '衟',\r\n '軇',\r\n '道',\r\n ],\r\n chuàng: ['刱', '剏', '剙', '怆', '愴'],\r\n kū: ['刳', '哭', '圐', '堀', '枯', '桍', '矻', '窟', '跍', '郀', '骷', '鮬'],\r\n duò: [\r\n '刴',\r\n '剁',\r\n '墯',\r\n '尮',\r\n '惰',\r\n '憜',\r\n '挅',\r\n '桗',\r\n '舵',\r\n '跥',\r\n '跺',\r\n '陊',\r\n '陏',\r\n '飿',\r\n '饳',\r\n '鵽',\r\n ],\r\n 'shuā shuà': ['刷'],\r\n 'quàn xuàn': ['券'],\r\n 'chà shā': ['刹', '剎'],\r\n 'cì cī': ['刺'],\r\n guì: [\r\n '刽',\r\n '刿',\r\n '劊',\r\n '劌',\r\n '撌',\r\n '攰',\r\n '昋',\r\n '桂',\r\n '椢',\r\n '槶',\r\n '樻',\r\n '櫃',\r\n '猤',\r\n '禬',\r\n '筀',\r\n '蓕',\r\n '襘',\r\n '貴',\r\n '贵',\r\n '跪',\r\n '鐀',\r\n '鑎',\r\n '鞼',\r\n '鱖',\r\n '鱥',\r\n ],\r\n lóu: [\r\n '剅',\r\n '娄',\r\n '婁',\r\n '廔',\r\n '楼',\r\n '樓',\r\n '溇',\r\n '漊',\r\n '熡',\r\n '耧',\r\n '耬',\r\n '艛',\r\n '蒌',\r\n '蔞',\r\n '蝼',\r\n '螻',\r\n '謱',\r\n '軁',\r\n '遱',\r\n '鞻',\r\n '髅',\r\n '髏',\r\n '𪣻',\r\n ],\r\n cuò: [\r\n '剉',\r\n '剒',\r\n '厝',\r\n '夎',\r\n '挫',\r\n '措',\r\n '棤',\r\n '莝',\r\n '莡',\r\n '蓌',\r\n '逪',\r\n '銼',\r\n '錯',\r\n '锉',\r\n '错',\r\n ],\r\n 'xiāo xuē': ['削'],\r\n 'kēi kè': ['剋', '尅'],\r\n 'là lá': ['剌'],\r\n tī: ['剔', '梯', '踢', '銻', '锑', '鷈', '鷉', '䏲', '䴘'],\r\n pōu: ['剖'],\r\n wān: ['剜', '塆', '壪', '帵', '弯', '彎', '湾', '潫', '灣', '睕', '蜿', '豌'],\r\n 'bāo bō': ['剝', '剥'],\r\n duō: ['剟', '咄', '哆', '嚉', '多', '夛', '掇', '毲', '畓', '裰', '㙍'],\r\n qíng: [\r\n '剠',\r\n '勍',\r\n '夝',\r\n '情',\r\n '擎',\r\n '晴',\r\n '暒',\r\n '棾',\r\n '樈',\r\n '檠',\r\n '氰',\r\n '甠',\r\n '硘',\r\n '葝',\r\n '黥',\r\n ],\r\n 'yǎn shàn': ['剡'],\r\n 'dū zhuó': ['剢'],\r\n yān: [\r\n '剦',\r\n '嫣',\r\n '崦',\r\n '嶖',\r\n '恹',\r\n '懕',\r\n '懨',\r\n '樮',\r\n '淊',\r\n '淹',\r\n '漹',\r\n '烟',\r\n '焉',\r\n '焑',\r\n '煙',\r\n '珚',\r\n '篶',\r\n '胭',\r\n '臙',\r\n '菸',\r\n '鄢',\r\n '醃',\r\n '閹',\r\n '阉',\r\n '黫',\r\n ],\r\n huō: ['剨', '劐', '吙', '攉', '秴', '耠', '锪', '騞', '𬴃'],\r\n shèng: [\r\n '剩',\r\n '剰',\r\n '勝',\r\n '圣',\r\n '墭',\r\n '嵊',\r\n '晠',\r\n '榺',\r\n '橳',\r\n '琞',\r\n '聖',\r\n '蕂',\r\n '貹',\r\n '賸',\r\n ],\r\n 'duān zhì': ['剬'],\r\n wū: [\r\n '剭',\r\n '呜',\r\n '嗚',\r\n '圬',\r\n '屋',\r\n '巫',\r\n '弙',\r\n '杇',\r\n '歍',\r\n '汙',\r\n '汚',\r\n '污',\r\n '洿',\r\n '烏',\r\n '窏',\r\n '箼',\r\n '螐',\r\n '誈',\r\n '誣',\r\n '诬',\r\n '邬',\r\n '鄔',\r\n '鎢',\r\n '钨',\r\n '鰞',\r\n '鴮',\r\n ],\r\n gē: [\r\n '割',\r\n '哥',\r\n '圪',\r\n '彁',\r\n '戈',\r\n '戓',\r\n '戨',\r\n '歌',\r\n '滒',\r\n '犵',\r\n '肐',\r\n '袼',\r\n '謌',\r\n '鎶',\r\n '鴚',\r\n '鴿',\r\n '鸽',\r\n ],\r\n 'dá zhá': ['剳'],\r\n chuán: ['剶', '暷', '椽', '篅', '舡', '舩', '船', '輲', '遄'],\r\n 'tuán zhuān': ['剸', '漙', '篿'],\r\n 'lù jiū': ['剹'],\r\n pēng: ['剻', '匉', '嘭', '怦', '恲', '抨', '梈', '烹', '砰', '軯', '駍'],\r\n piāo: ['剽', '勡', '慓', '旚', '犥', '翲', '螵', '飃', '飄', '飘', '魒'],\r\n kōu: ['剾', '彄', '抠', '摳', '眍', '瞘', '芤', '𫸩'],\r\n 'jiǎo chāo': ['剿', '劋', '勦', '摷'],\r\n qiāo: [\r\n '劁',\r\n '勪',\r\n '墝',\r\n '幧',\r\n '敲',\r\n '橇',\r\n '毃',\r\n '燆',\r\n '硗',\r\n '磽',\r\n '繑',\r\n '趬',\r\n '跷',\r\n '踍',\r\n '蹺',\r\n '蹻',\r\n '郻',\r\n '鄡',\r\n '鄥',\r\n '鍫',\r\n '鍬',\r\n '鐰',\r\n '锹',\r\n '頝',\r\n ],\r\n 'huá huà': ['劃'],\r\n 'zhā zhá': ['劄'],\r\n 'pī pǐ': ['劈', '悂'],\r\n tāng: ['劏', '嘡', '羰', '薚', '蝪', '蹚', '鞺', '鼞'],\r\n chán: [\r\n '劖',\r\n '嚵',\r\n '壥',\r\n '婵',\r\n '嬋',\r\n '巉',\r\n '廛',\r\n '棎',\r\n '毚',\r\n '湹',\r\n '潹',\r\n '潺',\r\n '澶',\r\n '瀍',\r\n '瀺',\r\n '煘',\r\n '獑',\r\n '磛',\r\n '緾',\r\n '纏',\r\n '纒',\r\n '缠',\r\n '艬',\r\n '蝉',\r\n '蟐',\r\n '蟬',\r\n '蟾',\r\n '誗',\r\n '讒',\r\n '谗',\r\n '躔',\r\n '鄽',\r\n '酁',\r\n '鋋',\r\n '鑱',\r\n '镵',\r\n '饞',\r\n '馋',\r\n ],\r\n zuān: ['劗', '躜', '躦', '鉆', '鑚'],\r\n mó: [\r\n '劘',\r\n '嫫',\r\n '嬤',\r\n '嬷',\r\n '尛',\r\n '摹',\r\n '擵',\r\n '橅',\r\n '糢',\r\n '膜',\r\n '藦',\r\n '蘑',\r\n '謨',\r\n '謩',\r\n '谟',\r\n '饃',\r\n '饝',\r\n '馍',\r\n '髍',\r\n '魔',\r\n '魹',\r\n ],\r\n zhú: [\r\n '劚',\r\n '斸',\r\n '曯',\r\n '欘',\r\n '灟',\r\n '炢',\r\n '烛',\r\n '燭',\r\n '爥',\r\n '瘃',\r\n '竹',\r\n '笁',\r\n '笜',\r\n '舳',\r\n '茿',\r\n '蓫',\r\n '蠋',\r\n '蠾',\r\n '躅',\r\n '逐',\r\n '逫',\r\n '钃',\r\n '鱁',\r\n ],\r\n quàn: ['劝', '勧', '勸', '牶', '韏'],\r\n 'jìn jìng': ['劤', '劲', '勁'],\r\n kēng: ['劥', '坑', '牼', '硁', '硜', '誙', '銵', '鍞', '鏗', '铿', '阬'],\r\n 'xié liè': ['劦'],\r\n 'zhù chú': ['助'],\r\n nǔ: ['努', '弩', '砮', '胬'],\r\n shào: ['劭', '卲', '哨', '潲', '紹', '綤', '绍', '袑', '邵'],\r\n miǎo: ['劰', '杪', '淼', '渺', '眇', '秒', '篎', '緲', '缈', '藐', '邈'],\r\n kǒu: ['劶', '口'],\r\n wā: [\r\n '劸',\r\n '娲',\r\n '媧',\r\n '屲',\r\n '挖',\r\n '攨',\r\n '洼',\r\n '溛',\r\n '漥',\r\n '瓾',\r\n '畖',\r\n '穵',\r\n '窊',\r\n '窪',\r\n '蛙',\r\n '韈',\r\n '鼃',\r\n ],\r\n kuāng: [\r\n '劻',\r\n '匡',\r\n '匩',\r\n '哐',\r\n '恇',\r\n '洭',\r\n '筐',\r\n '筺',\r\n '誆',\r\n '诓',\r\n '軭',\r\n '邼',\r\n ],\r\n hé: [\r\n '劾',\r\n '咊',\r\n '啝',\r\n '姀',\r\n '峆',\r\n '敆',\r\n '曷',\r\n '柇',\r\n '楁',\r\n '毼',\r\n '河',\r\n '涸',\r\n '渮',\r\n '澕',\r\n '熆',\r\n '皬',\r\n '盇',\r\n '盉',\r\n '盍',\r\n '盒',\r\n '禾',\r\n '篕',\r\n '籺',\r\n '粭',\r\n '翮',\r\n '菏',\r\n '萂',\r\n '覈',\r\n '訸',\r\n '詥',\r\n '郃',\r\n '釛',\r\n '鉌',\r\n '鑉',\r\n '閡',\r\n '闔',\r\n '阂',\r\n '阖',\r\n '鞨',\r\n '頜',\r\n '餄',\r\n '饸',\r\n '魺',\r\n '鹖',\r\n '麧',\r\n '齕',\r\n '龁',\r\n '龢',\r\n '𬌗',\r\n ],\r\n gào: [\r\n '勂',\r\n '吿',\r\n '告',\r\n '峼',\r\n '祮',\r\n '祰',\r\n '禞',\r\n '筶',\r\n '誥',\r\n '诰',\r\n '郜',\r\n '鋯',\r\n '锆',\r\n ],\r\n 'bó bèi': ['勃'],\r\n láng: [\r\n '勆',\r\n '嫏',\r\n '廊',\r\n '斏',\r\n '桹',\r\n '榔',\r\n '樃',\r\n '欴',\r\n '狼',\r\n '琅',\r\n '瑯',\r\n '硠',\r\n '稂',\r\n '艆',\r\n '蓈',\r\n '蜋',\r\n '螂',\r\n '躴',\r\n '郒',\r\n '郞',\r\n '鋃',\r\n '鎯',\r\n '锒',\r\n ],\r\n xūn: [\r\n '勋',\r\n '勛',\r\n '勲',\r\n '勳',\r\n '嚑',\r\n '坃',\r\n '埙',\r\n '塤',\r\n '壎',\r\n '壦',\r\n '曛',\r\n '燻',\r\n '獯',\r\n '矄',\r\n '纁',\r\n '臐',\r\n '薫',\r\n '薰',\r\n '蘍',\r\n '醺',\r\n '𫄸',\r\n ],\r\n 'juàn juān': ['勌', '瓹'],\r\n 'lè lēi': ['勒'],\r\n kài: ['勓', '炌', '烗', '鎎'],\r\n 'wěng yǎng': ['勜'],\r\n qín: [\r\n '勤',\r\n '嗪',\r\n '噙',\r\n '嶜',\r\n '庈',\r\n '懃',\r\n '懄',\r\n '捦',\r\n '擒',\r\n '斳',\r\n '檎',\r\n '澿',\r\n '珡',\r\n '琴',\r\n '琹',\r\n '瘽',\r\n '禽',\r\n '秦',\r\n '耹',\r\n '芩',\r\n '芹',\r\n '菦',\r\n '螓',\r\n '蠄',\r\n '鈙',\r\n '鈫',\r\n '雂',\r\n '靲',\r\n '鳹',\r\n '鵭',\r\n ],\r\n jiàng: [\r\n '勥',\r\n '匞',\r\n '匠',\r\n '嵹',\r\n '弜',\r\n '弶',\r\n '摾',\r\n '櫤',\r\n '洚',\r\n '滰',\r\n '犟',\r\n '糡',\r\n '糨',\r\n '絳',\r\n '绛',\r\n '謽',\r\n '酱',\r\n '醤',\r\n '醬',\r\n ],\r\n fān: [\r\n '勫',\r\n '嬏',\r\n '帆',\r\n '幡',\r\n '忛',\r\n '憣',\r\n '旙',\r\n '旛',\r\n '繙',\r\n '翻',\r\n '藩',\r\n '轓',\r\n '颿',\r\n '飜',\r\n '鱕',\r\n ],\r\n juān: ['勬', '姢', '娟', '捐', '涓', '蠲', '裐', '鎸', '鐫', '镌', '鹃'],\r\n 'tóng dòng': ['勭', '烔', '燑', '狪'],\r\n lǜ: [\r\n '勴',\r\n '垏',\r\n '嵂',\r\n '律',\r\n '慮',\r\n '氯',\r\n '滤',\r\n '濾',\r\n '爈',\r\n '箻',\r\n '綠',\r\n '繂',\r\n '膟',\r\n '葎',\r\n '虑',\r\n '鑢',\r\n ],\r\n chè: [\r\n '勶',\r\n '坼',\r\n '彻',\r\n '徹',\r\n '掣',\r\n '撤',\r\n '澈',\r\n '烢',\r\n '爡',\r\n '瞮',\r\n '硩',\r\n '聅',\r\n '迠',\r\n '頙',\r\n '㬚',\r\n ],\r\n sháo: ['勺', '玿', '韶'],\r\n 'gōu gòu': ['勾'],\r\n cōng: [\r\n '匆',\r\n '囪',\r\n '囱',\r\n '忩',\r\n '怱',\r\n '悤',\r\n '暰',\r\n '樬',\r\n '漗',\r\n '瑽',\r\n '璁',\r\n '瞛',\r\n '篵',\r\n '繱',\r\n '聡',\r\n '聦',\r\n '聪',\r\n '聰',\r\n '苁',\r\n '茐',\r\n '葱',\r\n '蓯',\r\n '蔥',\r\n '蟌',\r\n '鍯',\r\n '鏓',\r\n '鏦',\r\n '騘',\r\n '驄',\r\n '骢',\r\n ],\r\n 'táo yáo': ['匋', '陶'],\r\n páo: ['匏', '咆', '垉', '庖', '爮', '狍', '袍', '褜', '軳', '鞄', '麅'],\r\n dá: [\r\n '匒',\r\n '妲',\r\n '怛',\r\n '炟',\r\n '燵',\r\n '畣',\r\n '笪',\r\n '羍',\r\n '荙',\r\n '薘',\r\n '蟽',\r\n '詚',\r\n '达',\r\n '迏',\r\n '迖',\r\n '迚',\r\n '逹',\r\n '達',\r\n '鐽',\r\n '靼',\r\n '鞑',\r\n '韃',\r\n '龖',\r\n '龘',\r\n '𫟼',\r\n ],\r\n 'huà huā': ['化'],\r\n 'běi bèi': ['北'],\r\n nǎo: ['匘', '垴', '堖', '嫐', '恼', '悩', '惱', '瑙', '碯', '脑', '脳', '腦'],\r\n 'chí shi': ['匙'],\r\n fāng: ['匚', '堏', '方', '淓', '牥', '芳', '邡', '鈁', '錺', '钫', '鴋'],\r\n zā: ['匝', '咂', '帀', '沞', '臜', '臢', '迊', '鉔', '魳'],\r\n qiè: [\r\n '匧',\r\n '厒',\r\n '妾',\r\n '怯',\r\n '悏',\r\n '惬',\r\n '愜',\r\n '挈',\r\n '穕',\r\n '窃',\r\n '竊',\r\n '笡',\r\n '箧',\r\n '篋',\r\n '籡',\r\n '踥',\r\n '鍥',\r\n '锲',\r\n '鯜',\r\n ],\r\n 'zāng cáng': ['匨'],\r\n fěi: ['匪', '奜', '悱', '棐', '榧', '篚', '翡', '蕜', '誹', '诽'],\r\n 'kuì guì': ['匮', '匱'],\r\n suǎn: ['匴'],\r\n pǐ: ['匹', '噽', '嚭', '圮', '庀', '痞', '癖', '脴', '苉', '銢', '鴄'],\r\n 'qū ōu': ['区', '區'],\r\n 'kē qià': ['匼'],\r\n 'yǎn yàn': ['匽', '棪'],\r\n biǎn: ['匾', '惼', '揙', '碥', '稨', '窆', '藊', '褊', '貶', '贬', '鴘'],\r\n nì: [\r\n '匿',\r\n '堄',\r\n '嫟',\r\n '嬺',\r\n '惄',\r\n '愵',\r\n '昵',\r\n '暱',\r\n '氼',\r\n '眤',\r\n '睨',\r\n '縌',\r\n '胒',\r\n '腻',\r\n '膩',\r\n '逆',\r\n '𨺙',\r\n ],\r\n niàn: ['卄', '唸', '埝', '廿', '念', '惗', '艌'],\r\n sà: ['卅', '櫒', '脎', '萨', '蕯', '薩', '鈒', '隡', '颯', '飒', '馺'],\r\n zú: ['卆', '哫', '崪', '族', '箤', '足', '踤', '镞'],\r\n shēng: [\r\n '升',\r\n '呏',\r\n '声',\r\n '斘',\r\n '昇',\r\n '曻',\r\n '枡',\r\n '殅',\r\n '泩',\r\n '湦',\r\n '焺',\r\n '牲',\r\n '珄',\r\n '生',\r\n '甥',\r\n '竔',\r\n '笙',\r\n '聲',\r\n '鉎',\r\n '鍟',\r\n '阩',\r\n '陞',\r\n '陹',\r\n '鵿',\r\n '鼪',\r\n ],\r\n wàn: [\r\n '卍',\r\n '卐',\r\n '忨',\r\n '杤',\r\n '瞣',\r\n '脕',\r\n '腕',\r\n '萬',\r\n '蟃',\r\n '贎',\r\n '輐',\r\n '錽',\r\n '𬇕',\r\n ],\r\n 'huá huà huā': ['华', '華'],\r\n bēi: ['卑', '悲', '揹', '杯', '桮', '盃', '碑', '藣', '鵯', '鹎'],\r\n 'zú cù': ['卒'],\r\n 'dān shàn chán': ['单', '單'],\r\n 'nán nā': ['南'],\r\n 'shuài lǜ': ['卛'],\r\n 'bǔ bo pú': ['卜'],\r\n 'kuàng guàn': ['卝'],\r\n biàn: [\r\n '卞',\r\n '变',\r\n '変',\r\n '峅',\r\n '弁',\r\n '徧',\r\n '忭',\r\n '抃',\r\n '昪',\r\n '汳',\r\n '汴',\r\n '玣',\r\n '艑',\r\n '苄',\r\n '覍',\r\n '諚',\r\n '變',\r\n '辡',\r\n '辧',\r\n '辨',\r\n '辩',\r\n '辫',\r\n '辮',\r\n '辯',\r\n '遍',\r\n '釆',\r\n '𨚕',\r\n ],\r\n bǔ: ['卟', '哺', '捕', '补', '補', '鸔', '𬷕'],\r\n 'zhàn zhān': ['占', '覱'],\r\n 'kǎ qiǎ': ['卡'],\r\n lú: [\r\n '卢',\r\n '嚧',\r\n '垆',\r\n '壚',\r\n '庐',\r\n '廬',\r\n '曥',\r\n '枦',\r\n '栌',\r\n '櫨',\r\n '泸',\r\n '瀘',\r\n '炉',\r\n '爐',\r\n '獹',\r\n '玈',\r\n '瓐',\r\n '盧',\r\n '矑',\r\n '籚',\r\n '纑',\r\n '罏',\r\n '胪',\r\n '臚',\r\n '舮',\r\n '舻',\r\n '艫',\r\n '芦',\r\n '蘆',\r\n '蠦',\r\n '轤',\r\n '轳',\r\n '鈩',\r\n '鑪',\r\n '顱',\r\n '颅',\r\n '馿',\r\n '髗',\r\n '魲',\r\n '鱸',\r\n '鲈',\r\n '鸕',\r\n '鸬',\r\n '黸',\r\n '𬬻',\r\n ],\r\n lǔ: [\r\n '卤',\r\n '塷',\r\n '掳',\r\n '擄',\r\n '樐',\r\n '橹',\r\n '櫓',\r\n '氌',\r\n '滷',\r\n '澛',\r\n '瀂',\r\n '硵',\r\n '磠',\r\n '穞',\r\n '艣',\r\n '艪',\r\n '蓾',\r\n '虏',\r\n '虜',\r\n '鏀',\r\n '鐪',\r\n '鑥',\r\n '镥',\r\n '魯',\r\n '鲁',\r\n '鹵',\r\n ],\r\n guà: ['卦', '啩', '挂', '掛', '罣', '褂', '詿', '诖'],\r\n 'áng yǎng': ['卬'],\r\n yìn: [\r\n '印',\r\n '垽',\r\n '堷',\r\n '廕',\r\n '慭',\r\n '憖',\r\n '憗',\r\n '懚',\r\n '洕',\r\n '湚',\r\n '猌',\r\n '癊',\r\n '胤',\r\n '茚',\r\n '酳',\r\n '鮣',\r\n '䲟',\r\n ],\r\n què: [\r\n '却',\r\n '卻',\r\n '塙',\r\n '崅',\r\n '悫',\r\n '愨',\r\n '慤',\r\n '搉',\r\n '榷',\r\n '燩',\r\n '琷',\r\n '皵',\r\n '确',\r\n '確',\r\n '礭',\r\n '闋',\r\n '阕',\r\n '鵲',\r\n '鹊',\r\n '𬒈',\r\n ],\r\n luǎn: ['卵'],\r\n 'juàn juǎn': ['卷', '巻'],\r\n 'chǎng ān hàn': ['厂'],\r\n 'wěi yán': ['厃'],\r\n tīng: [\r\n '厅',\r\n '厛',\r\n '听',\r\n '庁',\r\n '廰',\r\n '廳',\r\n '汀',\r\n '烃',\r\n '烴',\r\n '綎',\r\n '耓',\r\n '聴',\r\n '聼',\r\n '聽',\r\n '鞓',\r\n '𬘩',\r\n ],\r\n 'zhé zhái': ['厇'],\r\n 'hàn àn': ['厈', '屽'],\r\n yǎ: ['厊', '唖', '庌', '痖', '瘂', '蕥'],\r\n shè: [\r\n '厍',\r\n '厙',\r\n '弽',\r\n '慑',\r\n '慴',\r\n '懾',\r\n '摂',\r\n '欇',\r\n '涉',\r\n '涻',\r\n '渉',\r\n '滠',\r\n '灄',\r\n '社',\r\n '舎',\r\n '蔎',\r\n '蠂',\r\n '設',\r\n '设',\r\n '赦',\r\n '騇',\r\n '麝',\r\n ],\r\n dǐ: [\r\n '厎',\r\n '呧',\r\n '坘',\r\n '弤',\r\n '抵',\r\n '拞',\r\n '掋',\r\n '牴',\r\n '砥',\r\n '菧',\r\n '觝',\r\n '詆',\r\n '诋',\r\n '軧',\r\n '邸',\r\n '阺',\r\n '骶',\r\n '鯳',\r\n ],\r\n 'zhǎ zhǎi': ['厏'],\r\n páng: ['厐', '嫎', '庞', '徬', '舽', '螃', '逄', '鰟', '鳑', '龎', '龐'],\r\n 'zhì shī': ['厔'],\r\n máng: [\r\n '厖',\r\n '吂',\r\n '哤',\r\n '娏',\r\n '忙',\r\n '恾',\r\n '杗',\r\n '杧',\r\n '汒',\r\n '浝',\r\n '牻',\r\n '痝',\r\n '盲',\r\n '硭',\r\n '笀',\r\n '芒',\r\n '茫',\r\n '蘉',\r\n '邙',\r\n '釯',\r\n '鋩',\r\n '铓',\r\n '駹',\r\n ],\r\n zuī: ['厜', '樶', '纗', '蟕'],\r\n 'shà xià': ['厦', '廈'],\r\n áo: [\r\n '厫',\r\n '嗷',\r\n '嗸',\r\n '廒',\r\n '敖',\r\n '滶',\r\n '獒',\r\n '獓',\r\n '璈',\r\n '翱',\r\n '翶',\r\n '翺',\r\n '聱',\r\n '蔜',\r\n '螯',\r\n '謷',\r\n '謸',\r\n '遨',\r\n '鏖',\r\n '隞',\r\n '鰲',\r\n '鳌',\r\n '鷔',\r\n '鼇',\r\n ],\r\n 'lán qiān': ['厱'],\r\n 'sī mǒu': ['厶'],\r\n 'gōng hóng': ['厷'],\r\n 'lín miǎo': ['厸'],\r\n 'qiú róu': ['厹'],\r\n dū: ['厾', '嘟', '督', '醏'],\r\n 'xiàn xuán': ['县', '縣'],\r\n 'cān shēn cēn sān': ['参', '參', '叄', '叅'],\r\n 'ài yǐ': ['叆'],\r\n 'chā chà chǎ chá': ['叉'],\r\n shuāng: [\r\n '双',\r\n '孀',\r\n '孇',\r\n '欆',\r\n '礵',\r\n '艭',\r\n '雙',\r\n '霜',\r\n '騻',\r\n '驦',\r\n '骦',\r\n '鷞',\r\n '鸘',\r\n '鹴',\r\n ],\r\n shōu: ['収', '收'],\r\n guái: ['叏'],\r\n bá: [\r\n '叐',\r\n '妭',\r\n '抜',\r\n '拔',\r\n '炦',\r\n '癹',\r\n '胈',\r\n '茇',\r\n '菝',\r\n '詙',\r\n '跋',\r\n '軷',\r\n '魃',\r\n '鼥',\r\n ],\r\n 'fā fà': ['发'],\r\n 'zhuó yǐ lì jué': ['叕'],\r\n qǔ: ['取', '娶', '竬', '蝺', '詓', '齲', '龋'],\r\n 'jiǎ xiá': ['叚', '徦'],\r\n 'wèi yù': ['叞', '尉', '蔚'],\r\n dié: [\r\n '叠',\r\n '垤',\r\n '堞',\r\n '峌',\r\n '幉',\r\n '恎',\r\n '惵',\r\n '戜',\r\n '曡',\r\n '殜',\r\n '氎',\r\n '牃',\r\n '牒',\r\n '瓞',\r\n '畳',\r\n '疂',\r\n '疉',\r\n '疊',\r\n '碟',\r\n '絰',\r\n '绖',\r\n '耊',\r\n '耋',\r\n '胅',\r\n '艓',\r\n '苵',\r\n '蜨',\r\n '蝶',\r\n '褋',\r\n '詄',\r\n '諜',\r\n '谍',\r\n '跮',\r\n '蹀',\r\n '迭',\r\n '镻',\r\n '鰈',\r\n '鲽',\r\n '鴩',\r\n '𫶇',\r\n ],\r\n ruì: ['叡', '枘', '汭', '瑞', '睿', '芮', '蚋', '蜹', '銳', '鋭', '锐'],\r\n 'jù gōu': ['句'],\r\n lìng: ['另', '呤', '炩', '蘦'],\r\n 'dāo dáo tāo': ['叨'],\r\n 'zhī zhǐ': ['只'],\r\n jiào: [\r\n '叫',\r\n '呌',\r\n '嘂',\r\n '嘦',\r\n '噍',\r\n '嬓',\r\n '斍',\r\n '斠',\r\n '滘',\r\n '漖',\r\n '獥',\r\n '珓',\r\n '皭',\r\n '窖',\r\n '藠',\r\n '訆',\r\n '譥',\r\n '趭',\r\n '較',\r\n '轎',\r\n '轿',\r\n '较',\r\n '酵',\r\n '醮',\r\n '釂',\r\n ],\r\n 'zhào shào': ['召'],\r\n 'kě kè': ['可'],\r\n 'tái tāi': ['台', '苔'],\r\n pǒ: ['叵', '尀', '笸', '箥', '鉕', '钷', '駊'],\r\n 'yè xié': ['叶'],\r\n 'hào háo': ['号'],\r\n tàn: ['叹', '嘆', '探', '歎', '湠', '炭', '碳', '舕'],\r\n 'hōng hóng': ['叿'],\r\n miē: ['吀', '咩', '哶', '孭'],\r\n 'xū yū yù': ['吁'],\r\n chī: [\r\n '吃',\r\n '哧',\r\n '喫',\r\n '嗤',\r\n '噄',\r\n '妛',\r\n '媸',\r\n '彨',\r\n '彲',\r\n '摛',\r\n '攡',\r\n '殦',\r\n '瓻',\r\n '痴',\r\n '癡',\r\n '眵',\r\n '瞝',\r\n '笞',\r\n '粚',\r\n '胵',\r\n '蚩',\r\n '螭',\r\n '訵',\r\n '魑',\r\n '鴟',\r\n '鵄',\r\n '鸱',\r\n '黐',\r\n '齝',\r\n '𫄨',\r\n ],\r\n 'xuān sòng': ['吅'],\r\n yāo: [\r\n '吆',\r\n '喓',\r\n '夭',\r\n '妖',\r\n '幺',\r\n '楆',\r\n '殀',\r\n '祅',\r\n '腰',\r\n '葽',\r\n '訞',\r\n '邀',\r\n '鴁',\r\n '鴢',\r\n '㙘',\r\n ],\r\n zǐ: [\r\n '吇',\r\n '姉',\r\n '姊',\r\n '子',\r\n '杍',\r\n '梓',\r\n '榟',\r\n '橴',\r\n '滓',\r\n '矷',\r\n '秭',\r\n '笫',\r\n '籽',\r\n '紫',\r\n '耔',\r\n '虸',\r\n '訿',\r\n '釨',\r\n ],\r\n 'hé gě': ['合', '鲄'],\r\n 'cùn dòu': ['吋'],\r\n 'tóng tòng': ['同'],\r\n 'tǔ tù': ['吐', '唋'],\r\n 'zhà zhā': ['吒', '奓'],\r\n 'xià hè': ['吓'],\r\n 'ā yā': ['吖'],\r\n 'ma má mǎ': ['吗'],\r\n lìn: [\r\n '吝',\r\n '恡',\r\n '悋',\r\n '橉',\r\n '焛',\r\n '甐',\r\n '膦',\r\n '蔺',\r\n '藺',\r\n '賃',\r\n '赁',\r\n '蹸',\r\n '躏',\r\n '躙',\r\n '躪',\r\n '轥',\r\n '閵',\r\n ],\r\n tūn: ['吞', '暾', '朜', '焞'],\r\n 'bǐ pǐ': ['吡'],\r\n qìn: ['吢', '吣', '唚', '抋', '揿', '搇', '撳', '沁', '瀙', '菣', '藽'],\r\n 'jiè gè': ['吤'],\r\n 'fǒu pǐ': ['否'],\r\n 'ba bā': ['吧'],\r\n dūn: [\r\n '吨',\r\n '噸',\r\n '墩',\r\n '墪',\r\n '惇',\r\n '撉',\r\n '撴',\r\n '犜',\r\n '獤',\r\n '礅',\r\n '蜳',\r\n '蹾',\r\n '驐',\r\n ],\r\n fēn: [\r\n '吩',\r\n '帉',\r\n '昐',\r\n '朆',\r\n '梤',\r\n '棻',\r\n '氛',\r\n '竕',\r\n '紛',\r\n '纷',\r\n '翂',\r\n '芬',\r\n '衯',\r\n '訜',\r\n '躮',\r\n '酚',\r\n '鈖',\r\n '雰',\r\n '餴',\r\n '饙',\r\n '馚',\r\n ],\r\n 'é huā': ['吪'],\r\n 'kēng háng': ['吭', '妔'],\r\n shǔn: ['吮'],\r\n 'zhī zī': ['吱'],\r\n 'yǐn shěn': ['吲'],\r\n wú: [\r\n '吳',\r\n '吴',\r\n '呉',\r\n '墲',\r\n '峿',\r\n '梧',\r\n '橆',\r\n '毋',\r\n '洖',\r\n '浯',\r\n '無',\r\n '珸',\r\n '璑',\r\n '祦',\r\n '芜',\r\n '茣',\r\n '莁',\r\n '蕪',\r\n '蜈',\r\n '蟱',\r\n '譕',\r\n '郚',\r\n '鋙',\r\n '铻',\r\n '鯃',\r\n '鵐',\r\n '鷡',\r\n '鹀',\r\n '鼯',\r\n ],\r\n 'chǎo chāo': ['吵'],\r\n 'nà nè': ['吶'],\r\n 'xuè chuò jué': ['吷'],\r\n chuī: ['吹', '炊', '龡'],\r\n 'dōu rú': ['吺'],\r\n hǒu: ['吼', '犼'],\r\n 'hōng hǒu ōu': ['吽'],\r\n 'wú yù': ['吾'],\r\n 'ya yā': ['呀'],\r\n 'è e': ['呃'],\r\n dāi: ['呆', '懛', '獃'],\r\n 'mèn qǐ': ['呇'],\r\n hōng: [\r\n '呍',\r\n '嚝',\r\n '揈',\r\n '灴',\r\n '烘',\r\n '焢',\r\n '硡',\r\n '薨',\r\n '訇',\r\n '谾',\r\n '軣',\r\n '輷',\r\n '轟',\r\n '轰',\r\n '鍧',\r\n ],\r\n nà: [\r\n '呐',\r\n '捺',\r\n '笝',\r\n '納',\r\n '纳',\r\n '肭',\r\n '蒳',\r\n '衲',\r\n '豽',\r\n '貀',\r\n '軜',\r\n '郍',\r\n '鈉',\r\n '钠',\r\n '靹',\r\n '魶',\r\n ],\r\n 'tūn tiān': ['呑'],\r\n 'fǔ ḿ': ['呒', '嘸'],\r\n 'dāi tǎi': ['呔'],\r\n 'ǒu ōu òu': ['呕'],\r\n 'bài bei': ['呗'],\r\n 'yuán yún yùn': ['员', '員'],\r\n guō: [\r\n '呙',\r\n '啯',\r\n '嘓',\r\n '埚',\r\n '堝',\r\n '墎',\r\n '崞',\r\n '彉',\r\n '彍',\r\n '懖',\r\n '猓',\r\n '瘑',\r\n '聒',\r\n '蝈',\r\n '蟈',\r\n '郭',\r\n '鈛',\r\n '鍋',\r\n '锅',\r\n ],\r\n 'huá qì': ['呚'],\r\n 'qiàng qiāng': ['呛', '跄'],\r\n shī: [\r\n '呞',\r\n '失',\r\n '尸',\r\n '屍',\r\n '师',\r\n '師',\r\n '施',\r\n '浉',\r\n '湤',\r\n '湿',\r\n '溮',\r\n '溼',\r\n '濕',\r\n '狮',\r\n '獅',\r\n '瑡',\r\n '絁',\r\n '葹',\r\n '蒒',\r\n '蓍',\r\n '虱',\r\n '蝨',\r\n '褷',\r\n '襹',\r\n '詩',\r\n '诗',\r\n '邿',\r\n '釃',\r\n '鉇',\r\n '鍦',\r\n '鯴',\r\n '鰤',\r\n '鲺',\r\n '鳲',\r\n '鳾',\r\n '鶳',\r\n '鸤',\r\n '䴓',\r\n '𫚕',\r\n ],\r\n juǎn: ['呟', '埍', '臇', '菤', '錈', '锩'],\r\n pěn: ['呠', '翸'],\r\n 'wěn mǐn': ['呡'],\r\n 'ne ní': ['呢'],\r\n 'ḿ m̀ móu': ['呣'],\r\n rán: [\r\n '呥',\r\n '嘫',\r\n '然',\r\n '燃',\r\n '繎',\r\n '肰',\r\n '蚦',\r\n '蚺',\r\n '衻',\r\n '袇',\r\n '袡',\r\n '髥',\r\n '髯',\r\n ],\r\n 'tiè chè': ['呫'],\r\n 'qì zhī': ['呮'],\r\n 'zǐ cī': ['呰'],\r\n 'guā gū guǎ': ['呱'],\r\n 'cī zī': ['呲'],\r\n 'hǒu xǔ gòu': ['呴'],\r\n 'hē ā á ǎ à a': ['呵'],\r\n náo: [\r\n '呶',\r\n '夒',\r\n '峱',\r\n '嶩',\r\n '巎',\r\n '挠',\r\n '撓',\r\n '猱',\r\n '硇',\r\n '蛲',\r\n '蟯',\r\n '詉',\r\n '譊',\r\n '鐃',\r\n '铙',\r\n ],\r\n 'xiā gā': ['呷'],\r\n pēi: ['呸', '怌', '肧', '胚', '衃', '醅'],\r\n 'háo xiāo': ['呺'],\r\n mìng: ['命', '掵'],\r\n 'dá dàn': ['呾'],\r\n 'zuǐ jǔ': ['咀'],\r\n 'xián gān': ['咁'],\r\n pǒu: ['咅', '哣', '犃'],\r\n 'yǎng yāng': ['咉'],\r\n 'zǎ zé zhā': ['咋'],\r\n 'hé hè huó huò hú': ['和'],\r\n hāi: ['咍'],\r\n dā: ['咑', '哒', '噠', '墶', '搭', '撘', '耷', '褡', '鎝', '𨱏'],\r\n 'kǎ kā': ['咔'],\r\n gū: [\r\n '咕',\r\n '唂',\r\n '唃',\r\n '姑',\r\n '嫴',\r\n '孤',\r\n '巬',\r\n '巭',\r\n '柧',\r\n '橭',\r\n '沽',\r\n '泒',\r\n '稒',\r\n '笟',\r\n '箍',\r\n '箛',\r\n '篐',\r\n '罛',\r\n '苽',\r\n '菇',\r\n '菰',\r\n '蓇',\r\n '觚',\r\n '軱',\r\n '軲',\r\n '轱',\r\n '辜',\r\n '酤',\r\n '鈲',\r\n '鮕',\r\n '鴣',\r\n '鸪',\r\n ],\r\n 'kā gā': ['咖'],\r\n zuo: ['咗'],\r\n lóng: [\r\n '咙',\r\n '嚨',\r\n '嶐',\r\n '巃',\r\n '巄',\r\n '昽',\r\n '曨',\r\n '朧',\r\n '栊',\r\n '槞',\r\n '櫳',\r\n '湰',\r\n '滝',\r\n '漋',\r\n '爖',\r\n '珑',\r\n '瓏',\r\n '癃',\r\n '眬',\r\n '矓',\r\n '砻',\r\n '礱',\r\n '礲',\r\n '窿',\r\n '竜',\r\n '聋',\r\n '聾',\r\n '胧',\r\n '茏',\r\n '蘢',\r\n '蠪',\r\n '蠬',\r\n '襱',\r\n '豅',\r\n '鏧',\r\n '鑨',\r\n '霳',\r\n '靇',\r\n '驡',\r\n '鸗',\r\n '龍',\r\n '龒',\r\n '龙',\r\n ],\r\n 'xiàn xián': ['咞'],\r\n qì: [\r\n '咠',\r\n '唭',\r\n '噐',\r\n '器',\r\n '夡',\r\n '弃',\r\n '憇',\r\n '憩',\r\n '暣',\r\n '棄',\r\n '欫',\r\n '气',\r\n '気',\r\n '氣',\r\n '汔',\r\n '汽',\r\n '泣',\r\n '湆',\r\n '湇',\r\n '炁',\r\n '甈',\r\n '盵',\r\n '矵',\r\n '碛',\r\n '碶',\r\n '磜',\r\n '磧',\r\n '罊',\r\n '芞',\r\n '葺',\r\n '藒',\r\n '蟿',\r\n '訖',\r\n '讫',\r\n '迄',\r\n '鐑',\r\n ],\r\n 'xì dié': ['咥'],\r\n 'liē liě lié lie': ['咧'],\r\n zī: [\r\n '咨',\r\n '嗞',\r\n '姕',\r\n '姿',\r\n '孜',\r\n '孳',\r\n '孶',\r\n '崰',\r\n '嵫',\r\n '栥',\r\n '椔',\r\n '淄',\r\n '湽',\r\n '滋',\r\n '澬',\r\n '玆',\r\n '禌',\r\n '秶',\r\n '粢',\r\n '紎',\r\n '緇',\r\n '緕',\r\n '纃',\r\n '缁',\r\n '茊',\r\n '茲',\r\n '葘',\r\n '諮',\r\n '谘',\r\n '貲',\r\n '資',\r\n '赀',\r\n '资',\r\n '赼',\r\n '趑',\r\n '趦',\r\n '輜',\r\n '輺',\r\n '辎',\r\n '鄑',\r\n '鈭',\r\n '錙',\r\n '鍿',\r\n '鎡',\r\n '锱',\r\n '镃',\r\n '頾',\r\n '頿',\r\n '髭',\r\n '鯔',\r\n '鰦',\r\n '鲻',\r\n '鶅',\r\n '鼒',\r\n '齍',\r\n '齜',\r\n '龇',\r\n ],\r\n mī: ['咪'],\r\n 'jī xī qià': ['咭'],\r\n 'gē luò kǎ lo': ['咯'],\r\n 'shù xún': ['咰'],\r\n 'zán zá zǎ zan': ['咱'],\r\n 'hāi ké': ['咳'],\r\n huī: [\r\n '咴',\r\n '噅',\r\n '噕',\r\n '婎',\r\n '媈',\r\n '幑',\r\n '徽',\r\n '恢',\r\n '拻',\r\n '挥',\r\n '揮',\r\n '晖',\r\n '暉',\r\n '楎',\r\n '洃',\r\n '瀈',\r\n '灰',\r\n '灳',\r\n '烣',\r\n '睳',\r\n '禈',\r\n '翚',\r\n '翬',\r\n '蘳',\r\n '袆',\r\n '褘',\r\n '詼',\r\n '诙',\r\n '豗',\r\n '輝',\r\n '辉',\r\n '鰴',\r\n '麾',\r\n '㧑',\r\n ],\r\n 'huài shì': ['咶'],\r\n táo: [\r\n '咷',\r\n '啕',\r\n '桃',\r\n '檮',\r\n '洮',\r\n '淘',\r\n '祹',\r\n '綯',\r\n '绹',\r\n '萄',\r\n '蜪',\r\n '裪',\r\n '迯',\r\n '逃',\r\n '醄',\r\n '鋾',\r\n '鞀',\r\n '鞉',\r\n '饀',\r\n '駣',\r\n '騊',\r\n '鼗',\r\n '𫘦',\r\n ],\r\n xián: [\r\n '咸',\r\n '啣',\r\n '娴',\r\n '娹',\r\n '婱',\r\n '嫌',\r\n '嫺',\r\n '嫻',\r\n '弦',\r\n '挦',\r\n '撏',\r\n '涎',\r\n '湺',\r\n '澖',\r\n '甉',\r\n '痫',\r\n '癇',\r\n '癎',\r\n '絃',\r\n '胘',\r\n '舷',\r\n '藖',\r\n '蚿',\r\n '蛝',\r\n '衔',\r\n '衘',\r\n '誸',\r\n '諴',\r\n '賢',\r\n '贒',\r\n '贤',\r\n '輱',\r\n '醎',\r\n '銜',\r\n '鑦',\r\n '閑',\r\n '闲',\r\n '鷳',\r\n '鷴',\r\n '鷼',\r\n '鹇',\r\n '鹹',\r\n '麙',\r\n '𫍯',\r\n ],\r\n 'è àn': ['咹'],\r\n 'xuān xuǎn': ['咺', '烜'],\r\n 'wāi hé wǒ guǎ guō': ['咼'],\r\n 'yàn yè yān': ['咽'],\r\n āi: ['哀', '哎', '埃', '溾', '銰', '鎄', '锿'],\r\n pǐn: ['品', '榀'],\r\n shěn: [\r\n '哂',\r\n '婶',\r\n '嬸',\r\n '审',\r\n '宷',\r\n '審',\r\n '弞',\r\n '曋',\r\n '渖',\r\n '瀋',\r\n '瞫',\r\n '矤',\r\n '矧',\r\n '覾',\r\n '訠',\r\n '諗',\r\n '讅',\r\n '谂',\r\n '谉',\r\n '邥',\r\n '頣',\r\n '魫',\r\n ],\r\n 'hǒng hōng hòng': ['哄'],\r\n 'wā wa': ['哇'],\r\n 'hā hǎ hà': ['哈'],\r\n zāi: ['哉', '栽', '渽', '溨', '災', '灾', '烖', '睵', '賳'],\r\n 'dì diè': ['哋'],\r\n pài: ['哌', '沠', '派', '渒', '湃', '蒎', '鎃'],\r\n 'gén hěn': ['哏'],\r\n 'yǎ yā': ['哑', '雅'],\r\n 'yuě huì': ['哕', '噦'],\r\n nián: ['哖', '年', '秊', '秥', '鮎', '鯰', '鲇', '鲶', '鵇', '黏'],\r\n 'huá huā': ['哗', '嘩'],\r\n 'jì jiē zhāi': ['哜', '嚌'],\r\n mōu: ['哞'],\r\n 'yō yo': ['哟', '喲'],\r\n lòng: ['哢', '梇', '贚'],\r\n 'ò ó é': ['哦'],\r\n 'lī lǐ li': ['哩'],\r\n 'nǎ na nǎi né něi': ['哪'],\r\n hè: [\r\n '哬',\r\n '垎',\r\n '壑',\r\n '寉',\r\n '惒',\r\n '焃',\r\n '煂',\r\n '燺',\r\n '爀',\r\n '癋',\r\n '碋',\r\n '翯',\r\n '褐',\r\n '謞',\r\n '賀',\r\n '贺',\r\n '赫',\r\n '靍',\r\n '靎',\r\n '靏',\r\n '鶴',\r\n '鸖',\r\n '鹤',\r\n ],\r\n 'bō pò bā': ['哱'],\r\n zhé: [\r\n '哲',\r\n '啠',\r\n '喆',\r\n '嚞',\r\n '埑',\r\n '悊',\r\n '摺',\r\n '晢',\r\n '晣',\r\n '歽',\r\n '矺',\r\n '砓',\r\n '磔',\r\n '籷',\r\n '粍',\r\n '虴',\r\n '蛰',\r\n '蟄',\r\n '袩',\r\n '詟',\r\n '謫',\r\n '謺',\r\n '讁',\r\n '讋',\r\n '谪',\r\n '輒',\r\n '輙',\r\n '轍',\r\n '辄',\r\n '辙',\r\n '鮿',\r\n ],\r\n 'liàng láng': ['哴'],\r\n 'liè lǜ': ['哷'],\r\n hān: ['哻', '憨', '蚶', '谽', '酣', '頇', '顸', '馠', '魽', '鼾'],\r\n 'hēng hng': ['哼'],\r\n gěng: [\r\n '哽',\r\n '埂',\r\n '峺',\r\n '挭',\r\n '梗',\r\n '綆',\r\n '绠',\r\n '耿',\r\n '莄',\r\n '郠',\r\n '骾',\r\n '鯁',\r\n '鲠',\r\n '𬒔',\r\n ],\r\n 'chuò yuè': ['哾'],\r\n 'gě jiā': ['哿'],\r\n 'bei bài': ['唄'],\r\n 'hán hàn': ['唅'],\r\n chún: [\r\n '唇',\r\n '浱',\r\n '湻',\r\n '滣',\r\n '漘',\r\n '犉',\r\n '純',\r\n '纯',\r\n '脣',\r\n '莼',\r\n '蒓',\r\n '蓴',\r\n '醇',\r\n '醕',\r\n '錞',\r\n '陙',\r\n '鯙',\r\n '鶉',\r\n '鹑',\r\n '𬭚',\r\n ],\r\n 'ài āi': ['唉'],\r\n 'jiá qiǎn': ['唊'],\r\n 'yán dàn xián': ['唌'],\r\n chē: ['唓', '砗', '硨', '莗', '蛼'],\r\n 'wú ńg ń': ['唔'],\r\n zào: [\r\n '唕',\r\n '唣',\r\n '噪',\r\n '慥',\r\n '梍',\r\n '灶',\r\n '煰',\r\n '燥',\r\n '皁',\r\n '皂',\r\n '竃',\r\n '竈',\r\n '簉',\r\n '艁',\r\n '譟',\r\n '趮',\r\n '躁',\r\n '造',\r\n '𥖨',\r\n ],\r\n dí: [\r\n '唙',\r\n '啇',\r\n '嘀',\r\n '嚁',\r\n '嫡',\r\n '廸',\r\n '敌',\r\n '敵',\r\n '梑',\r\n '涤',\r\n '滌',\r\n '狄',\r\n '笛',\r\n '籴',\r\n '糴',\r\n '苖',\r\n '荻',\r\n '蔋',\r\n '蔐',\r\n '藡',\r\n '覿',\r\n '觌',\r\n '豴',\r\n '迪',\r\n '靮',\r\n '頔',\r\n '馰',\r\n '髢',\r\n '鸐',\r\n '𬱖',\r\n ],\r\n 'gòng hǒng gǒng': ['唝', '嗊'],\r\n dóu: ['唞'],\r\n 'lào láo': ['唠', '嘮', '憦'],\r\n huàn: [\r\n '唤',\r\n '喚',\r\n '奂',\r\n '奐',\r\n '宦',\r\n '嵈',\r\n '幻',\r\n '患',\r\n '愌',\r\n '换',\r\n '換',\r\n '擐',\r\n '攌',\r\n '梙',\r\n '槵',\r\n '浣',\r\n '涣',\r\n '渙',\r\n '漶',\r\n '澣',\r\n '烉',\r\n '焕',\r\n '煥',\r\n '瑍',\r\n '痪',\r\n '瘓',\r\n '睆',\r\n '肒',\r\n '藧',\r\n '豢',\r\n '轘',\r\n '逭',\r\n '鯇',\r\n '鯶',\r\n '鰀',\r\n '鲩',\r\n ],\r\n léng: ['唥', '塄', '楞', '碐', '薐'],\r\n 'wō wěi': ['唩'],\r\n fěng: ['唪', '覂', '諷', '讽'],\r\n 'yín jìn': ['唫'],\r\n 'hǔ xià': ['唬'],\r\n wéi: [\r\n '唯',\r\n '围',\r\n '圍',\r\n '壝',\r\n '峗',\r\n '峞',\r\n '嵬',\r\n '帏',\r\n '帷',\r\n '幃',\r\n '惟',\r\n '桅',\r\n '沩',\r\n '洈',\r\n '涠',\r\n '湋',\r\n '溈',\r\n '潍',\r\n '潙',\r\n '潿',\r\n '濰',\r\n '犩',\r\n '矀',\r\n '維',\r\n '维',\r\n '蓶',\r\n '覹',\r\n '违',\r\n '違',\r\n '鄬',\r\n '醀',\r\n '鍏',\r\n '闈',\r\n '闱',\r\n '韋',\r\n '韦',\r\n '鮠',\r\n '𣲗',\r\n '𬶏',\r\n ],\r\n shuā: ['唰'],\r\n chàng: ['唱', '怅', '悵', '暢', '焻', '畅', '畼', '誯', '韔', '鬯'],\r\n 'ér wā': ['唲'],\r\n qiàng: ['唴', '炝', '熗', '羻'],\r\n yō: ['唷'],\r\n yū: ['唹', '淤', '瘀', '盓', '箊', '紆', '纡', '込', '迂', '迃', '陓'],\r\n lài: [\r\n '唻',\r\n '濑',\r\n '瀨',\r\n '瀬',\r\n '癞',\r\n '癩',\r\n '睐',\r\n '睞',\r\n '籁',\r\n '籟',\r\n '藾',\r\n '賚',\r\n '賴',\r\n '赉',\r\n '赖',\r\n '頼',\r\n '顂',\r\n '鵣',\r\n ],\r\n tuò: ['唾', '嶞', '柝', '毤', '毻', '箨', '籜', '萚', '蘀', '跅'],\r\n 'zhōu zhāo tiào': ['啁'],\r\n kěn: ['啃', '垦', '墾', '恳', '懇', '肎', '肯', '肻', '豤', '錹'],\r\n 'zhuó zhào': ['啅', '濯'],\r\n 'hēng hèng': ['啈', '悙'],\r\n 'lín lán': ['啉'],\r\n 'a ā á ǎ à': ['啊'],\r\n qiāng: [\r\n '啌',\r\n '嗴',\r\n '嶈',\r\n '戕',\r\n '摤',\r\n '斨',\r\n '枪',\r\n '槍',\r\n '溬',\r\n '牄',\r\n '猐',\r\n '獇',\r\n '羌',\r\n '羗',\r\n '腔',\r\n '蜣',\r\n '謒',\r\n '鏘',\r\n '锖',\r\n '锵',\r\n ],\r\n 'tūn zhūn xiāng duǐ': ['啍'],\r\n wèn: ['問', '妏', '揾', '搵', '璺', '问', '顐'],\r\n 'cuì qi': ['啐'],\r\n 'dié shà jié tì': ['啑'],\r\n 'yuē wā': ['啘'],\r\n 'zǐ cǐ': ['啙'],\r\n 'bǐ tú': ['啚'],\r\n 'chuò chuài': ['啜'],\r\n 'yǎ yā è': ['啞'],\r\n fēi: [\r\n '啡',\r\n '婓',\r\n '婔',\r\n '扉',\r\n '暃',\r\n '渄',\r\n '猆',\r\n '緋',\r\n '绯',\r\n '裶',\r\n '霏',\r\n '非',\r\n '靟',\r\n '飛',\r\n '飝',\r\n '飞',\r\n '餥',\r\n '馡',\r\n '騑',\r\n '騛',\r\n '鯡',\r\n '鲱',\r\n '𬴂',\r\n ],\r\n pí: [\r\n '啤',\r\n '壀',\r\n '枇',\r\n '毗',\r\n '毘',\r\n '焷',\r\n '琵',\r\n '疲',\r\n '皮',\r\n '篺',\r\n '罴',\r\n '羆',\r\n '脾',\r\n '腗',\r\n '膍',\r\n '蚍',\r\n '蚽',\r\n '蜱',\r\n '螷',\r\n '蠯',\r\n '豼',\r\n '貔',\r\n '郫',\r\n '鈹',\r\n '阰',\r\n '陴',\r\n '隦',\r\n '魮',\r\n '鮍',\r\n '鲏',\r\n '鵧',\r\n '鼙',\r\n ],\r\n shá: ['啥'],\r\n 'lā la': ['啦'],\r\n 'yīng qíng': ['啨'],\r\n pā: ['啪', '妑', '舥', '葩', '趴'],\r\n 'zhě shì': ['啫'],\r\n sè: [\r\n '啬',\r\n '嗇',\r\n '懎',\r\n '擌',\r\n '栜',\r\n '歮',\r\n '涩',\r\n '渋',\r\n '澀',\r\n '澁',\r\n '濇',\r\n '濏',\r\n '瀒',\r\n '瑟',\r\n '璱',\r\n '瘷',\r\n '穑',\r\n '穡',\r\n '穯',\r\n '繬',\r\n '譅',\r\n '轖',\r\n '銫',\r\n '鏼',\r\n '铯',\r\n '飋',\r\n ],\r\n niè: [\r\n '啮',\r\n '嗫',\r\n '噛',\r\n '嚙',\r\n '囁',\r\n '囓',\r\n '圼',\r\n '孼',\r\n '孽',\r\n '嵲',\r\n '嶭',\r\n '巕',\r\n '帇',\r\n '敜',\r\n '枿',\r\n '槷',\r\n '櫱',\r\n '涅',\r\n '湼',\r\n '痆',\r\n '篞',\r\n '籋',\r\n '糱',\r\n '糵',\r\n '聂',\r\n '聶',\r\n '臬',\r\n '臲',\r\n '蘖',\r\n '蠥',\r\n '讘',\r\n '踂',\r\n '踗',\r\n '踙',\r\n '蹑',\r\n '躡',\r\n '錜',\r\n '鎳',\r\n '鑈',\r\n '鑷',\r\n '钀',\r\n '镊',\r\n '镍',\r\n '闑',\r\n '陧',\r\n '隉',\r\n '顳',\r\n '颞',\r\n '齧',\r\n '𫔶',\r\n ],\r\n 'luō luó luo': ['啰', '囉'],\r\n 'tān chǎn tuō': ['啴'],\r\n bo: ['啵', '蔔'],\r\n dìng: [\r\n '啶',\r\n '定',\r\n '椗',\r\n '矴',\r\n '碇',\r\n '碠',\r\n '磸',\r\n '聢',\r\n '腚',\r\n '萣',\r\n '蝊',\r\n '訂',\r\n '订',\r\n '錠',\r\n '锭',\r\n '顁',\r\n '飣',\r\n '饤',\r\n ],\r\n lāng: ['啷'],\r\n 'án ān': ['啽'],\r\n kā: ['喀', '擖'],\r\n 'yóng yú': ['喁'],\r\n 'lā lá lǎ': ['喇'],\r\n jiē: [\r\n '喈',\r\n '喼',\r\n '嗟',\r\n '堦',\r\n '媘',\r\n '接',\r\n '掲',\r\n '擑',\r\n '湝',\r\n '煯',\r\n '疖',\r\n '痎',\r\n '癤',\r\n '皆',\r\n '秸',\r\n '稭',\r\n '脻',\r\n '蝔',\r\n '街',\r\n '謯',\r\n '阶',\r\n '階',\r\n '鞂',\r\n '鶛',\r\n ],\r\n hóu: [\r\n '喉',\r\n '帿',\r\n '猴',\r\n '瘊',\r\n '睺',\r\n '篌',\r\n '糇',\r\n '翭',\r\n '葔',\r\n '鄇',\r\n '鍭',\r\n '餱',\r\n '骺',\r\n '鯸',\r\n '𬭤',\r\n ],\r\n 'dié zhá': ['喋'],\r\n wāi: ['喎', '歪', '竵'],\r\n 'nuò rě': ['喏'],\r\n 'xù huò guó': ['喐'],\r\n zán: ['喒'],\r\n 'wō ō': ['喔'],\r\n hú: [\r\n '喖',\r\n '嘝',\r\n '囫',\r\n '壶',\r\n '壷',\r\n '壺',\r\n '媩',\r\n '弧',\r\n '搰',\r\n '斛',\r\n '楜',\r\n '槲',\r\n '湖',\r\n '瀫',\r\n '焀',\r\n '煳',\r\n '狐',\r\n '猢',\r\n '瑚',\r\n '瓳',\r\n '箶',\r\n '絗',\r\n '縠',\r\n '胡',\r\n '葫',\r\n '蔛',\r\n '蝴',\r\n '螜',\r\n '衚',\r\n '觳',\r\n '醐',\r\n '鍸',\r\n '頶',\r\n '餬',\r\n '鬍',\r\n '魱',\r\n '鰗',\r\n '鵠',\r\n '鶘',\r\n '鶦',\r\n '鹕',\r\n ],\r\n 'huàn yuán xuǎn hé': ['喛'],\r\n xǐ: [\r\n '喜',\r\n '囍',\r\n '壐',\r\n '屣',\r\n '徙',\r\n '憙',\r\n '枲',\r\n '橲',\r\n '歖',\r\n '漇',\r\n '玺',\r\n '璽',\r\n '矖',\r\n '禧',\r\n '縰',\r\n '葈',\r\n '葸',\r\n '蓰',\r\n '蟢',\r\n '謑',\r\n '蹝',\r\n '躧',\r\n '鈢',\r\n '鉨',\r\n '鉩',\r\n '鱚',\r\n '𬭳',\r\n '𬶮',\r\n ],\r\n 'hē hè yè': ['喝'],\r\n kuì: [\r\n '喟',\r\n '嘳',\r\n '媿',\r\n '嬇',\r\n '愦',\r\n '愧',\r\n '憒',\r\n '篑',\r\n '簣',\r\n '籄',\r\n '聩',\r\n '聭',\r\n '聵',\r\n '膭',\r\n '蕢',\r\n '謉',\r\n '餽',\r\n '饋',\r\n '馈',\r\n ],\r\n 'zhǒng chuáng': ['喠'],\r\n 'wéi wèi': ['喡', '為', '爲'],\r\n 'duó zhà': ['喥'],\r\n 'sāng sàng': ['喪'],\r\n 'qiáo jiāo': ['喬'],\r\n 'pèn bēn': ['喯'],\r\n 'cān sūn qī': ['喰'],\r\n 'zhā chā': ['喳'],\r\n miāo: ['喵'],\r\n 'pēn pèn': ['喷'],\r\n kuí: [\r\n '喹',\r\n '夔',\r\n '奎',\r\n '巙',\r\n '戣',\r\n '揆',\r\n '晆',\r\n '暌',\r\n '楏',\r\n '楑',\r\n '櫆',\r\n '犪',\r\n '睽',\r\n '葵',\r\n '藈',\r\n '蘷',\r\n '虁',\r\n '蝰',\r\n '躨',\r\n '逵',\r\n '鄈',\r\n '鍨',\r\n '鍷',\r\n '頯',\r\n '馗',\r\n '騤',\r\n '骙',\r\n '魁',\r\n ],\r\n 'lou lóu': ['喽'],\r\n 'zào qiāo': ['喿'],\r\n 'hè xiāo xiào hù': ['嗃'],\r\n 'á shà': ['嗄'],\r\n xiù: [\r\n '嗅',\r\n '岫',\r\n '峀',\r\n '溴',\r\n '珛',\r\n '琇',\r\n '璓',\r\n '秀',\r\n '綉',\r\n '繍',\r\n '繡',\r\n '绣',\r\n '螑',\r\n '袖',\r\n '褎',\r\n '褏',\r\n '銹',\r\n '鏥',\r\n '鏽',\r\n '锈',\r\n '齅',\r\n ],\r\n 'qiāng qiàng': ['嗆', '戗', '戧', '蹌', '蹡'],\r\n 'ài yì': ['嗌', '艾'],\r\n 'má mǎ ma': ['嗎'],\r\n 'kè kē': ['嗑'],\r\n 'dā tà': ['嗒', '鎉'],\r\n sǎng: ['嗓', '搡', '磉', '褬', '鎟', '顙', '颡'],\r\n chēn: ['嗔', '抻', '琛', '瞋', '諃', '謓', '賝', '郴', '𬘭'],\r\n 'wā gǔ': ['嗗'],\r\n 'pǎng bēng': ['嗙'],\r\n 'xián qiǎn qiān': ['嗛'],\r\n lào: ['嗠', '嫪', '橯', '涝', '澇', '耢', '耮', '躼', '軂', '酪'],\r\n wēng: ['嗡', '翁', '聬', '螉', '鎓', '鶲', '鹟', '𬭩'],\r\n wà: ['嗢', '腽', '膃', '袜', '襪', '韤'],\r\n 'hēi hāi': ['嗨'],\r\n hē: ['嗬', '欱', '蠚', '訶', '诃'],\r\n zi: ['嗭'],\r\n sǎi: ['嗮'],\r\n 'ǹg ńg ňg': ['嗯'],\r\n gě: ['嗰', '舸'],\r\n ná: ['嗱', '拏', '拿', '鎿', '镎'],\r\n diǎ: ['嗲'],\r\n 'ài ǎi āi': ['嗳'],\r\n tōng: ['嗵', '樋', '炵', '蓪'],\r\n 'zuī suī': ['嗺'],\r\n 'zhē zhè zhù zhe': ['嗻'],\r\n mò: [\r\n '嗼',\r\n '圽',\r\n '塻',\r\n '墨',\r\n '妺',\r\n '嫼',\r\n '寞',\r\n '帞',\r\n '昩',\r\n '末',\r\n '枺',\r\n '歿',\r\n '殁',\r\n '沫',\r\n '漠',\r\n '爅',\r\n '獏',\r\n '瘼',\r\n '皌',\r\n '眽',\r\n '眿',\r\n '瞐',\r\n '瞙',\r\n '砞',\r\n '礳',\r\n '秣',\r\n '絈',\r\n '纆',\r\n '耱',\r\n '茉',\r\n '莈',\r\n '蓦',\r\n '蛨',\r\n '蟔',\r\n '貃',\r\n '貊',\r\n '貘',\r\n '銆',\r\n '鏌',\r\n '镆',\r\n '陌',\r\n '靺',\r\n '驀',\r\n '魩',\r\n '默',\r\n '黙',\r\n '𬙊',\r\n ],\r\n sòu: ['嗽', '瘶'],\r\n tǎn: [\r\n '嗿',\r\n '坦',\r\n '忐',\r\n '憳',\r\n '憻',\r\n '暺',\r\n '毯',\r\n '璮',\r\n '菼',\r\n '袒',\r\n '襢',\r\n '醓',\r\n '鉭',\r\n '钽',\r\n ],\r\n 'jiào dǎo': ['嘄'],\r\n 'kǎi gě': ['嘅'],\r\n 'shān càn': ['嘇'],\r\n cáo: ['嘈', '嶆', '曹', '曺', '槽', '漕', '艚', '蓸', '螬', '褿', '鏪', '𥕢'],\r\n piào: ['嘌', '徱', '蔈', '驃'],\r\n 'lóu lou': ['嘍'],\r\n gǎ: ['尕', '玍'],\r\n 'gǔ jiǎ': ['嘏'],\r\n 'jiāo xiāo': ['嘐'],\r\n 'xū shī': ['嘘', '噓'],\r\n pó: ['嘙', '嚩', '婆', '櫇', '皤', '鄱'],\r\n 'dē dēi': ['嘚'],\r\n 'ma má': ['嘛'],\r\n 'lē lei': ['嘞'],\r\n 'gā gá gǎ': ['嘠'],\r\n sāi: ['嘥', '噻', '毢', '腮', '顋', '鰓'],\r\n 'zuō chuài': ['嘬'],\r\n 'cháo zhāo': ['嘲', '朝', '鼂'],\r\n zuǐ: ['嘴', '噿', '嶊', '璻'],\r\n 'qiáo qiào': ['嘺', '翹', '谯'],\r\n 'chù xù shòu': ['嘼'],\r\n 'tān chǎn': ['嘽'],\r\n 'dàn tán': ['嘾', '弾', '彈', '惔', '澹'],\r\n 'hēi mò': ['嘿'],\r\n ě: ['噁', '砨', '頋', '騀', '鵈'],\r\n 'fān bo': ['噃'],\r\n chuáng: ['噇', '床', '牀'],\r\n 'cù zā hé': ['噈'],\r\n 'tūn kuò': ['噋'],\r\n 'cēng chēng': ['噌'],\r\n dēng: ['噔', '嬁', '灯', '燈', '璒', '登', '竳', '簦', '艠', '豋'],\r\n pū: ['噗', '扑', '撲', '攴', '攵', '潽', '炇', '陠'],\r\n juē: ['噘', '屩', '屫', '撧'],\r\n lū: ['噜', '嚕', '撸', '擼', '謢'],\r\n zhān: [\r\n '噡',\r\n '岾',\r\n '惉',\r\n '旃',\r\n '旜',\r\n '枬',\r\n '栴',\r\n '毡',\r\n '氈',\r\n '氊',\r\n '沾',\r\n '瞻',\r\n '薝',\r\n '蛅',\r\n '詀',\r\n '詹',\r\n '譫',\r\n '谵',\r\n '趈',\r\n '邅',\r\n '閚',\r\n '霑',\r\n '飦',\r\n '饘',\r\n '驙',\r\n '魙',\r\n '鱣',\r\n '鸇',\r\n '鹯',\r\n '𫗴',\r\n ],\r\n ō: ['噢'],\r\n 'zhòu zhuó': ['噣'],\r\n 'jiào qiào chī': ['噭'],\r\n yuàn: [\r\n '噮',\r\n '妴',\r\n '怨',\r\n '愿',\r\n '掾',\r\n '瑗',\r\n '禐',\r\n '苑',\r\n '衏',\r\n '裫',\r\n '褑',\r\n '院',\r\n '願',\r\n ],\r\n 'ǎi ài āi': ['噯'],\r\n 'yōng yǒng': ['噰', '澭'],\r\n 'jué xué': ['噱'],\r\n 'pēn pèn fèn': ['噴'],\r\n gá: ['噶', '尜', '釓', '錷', '钆'],\r\n 'xīn hěn hèn': ['噷'],\r\n dāng: ['噹', '澢', '珰', '璫', '筜', '簹', '艡', '蟷', '裆', '襠'],\r\n làn: ['嚂', '滥', '濫', '烂', '燗', '爁', '爛', '爤', '瓓', '糷', '钄'],\r\n tà: [\r\n '嚃',\r\n '嚺',\r\n '崉',\r\n '挞',\r\n '搨',\r\n '撻',\r\n '榻',\r\n '橽',\r\n '毾',\r\n '涾',\r\n '澾',\r\n '濌',\r\n '禢',\r\n '粏',\r\n '誻',\r\n '譶',\r\n '蹋',\r\n '蹹',\r\n '躂',\r\n '躢',\r\n '遝',\r\n '錔',\r\n '闒',\r\n '闥',\r\n '闼',\r\n '阘',\r\n '鞜',\r\n '鞳',\r\n ],\r\n 'huō huò ǒ': ['嚄'],\r\n hāo: ['嚆', '茠', '蒿', '薅'],\r\n 'hè xià': ['嚇'],\r\n 'xiù pì': ['嚊'],\r\n 'zhōu chóu': ['嚋', '盩', '诪'],\r\n mē: ['嚒'],\r\n 'chā cā': ['嚓'],\r\n 'bó pào bào': ['嚗'],\r\n 'me mèi mò': ['嚜'],\r\n 'xié hái': ['嚡'],\r\n 'áo xiāo': ['嚣'],\r\n mō: ['嚤', '摸'],\r\n pín: [\r\n '嚬',\r\n '娦',\r\n '嫔',\r\n '嬪',\r\n '玭',\r\n '矉',\r\n '薲',\r\n '蠙',\r\n '貧',\r\n '贫',\r\n '顰',\r\n '颦',\r\n '𬞟',\r\n ],\r\n mè: ['嚰', '濹'],\r\n 'rǎng rāng': ['嚷'],\r\n lá: ['嚹', '旯'],\r\n 'jiáo jué jiào': ['嚼'],\r\n chuò: [\r\n '嚽',\r\n '娖',\r\n '擉',\r\n '歠',\r\n '涰',\r\n '磭',\r\n '踀',\r\n '輟',\r\n '辍',\r\n '辵',\r\n '辶',\r\n '酫',\r\n '鑡',\r\n '餟',\r\n '齪',\r\n '龊',\r\n ],\r\n 'huān huàn': ['嚾'],\r\n 'zá cà': ['囃'],\r\n chài: ['囆', '虿', '蠆', '袃', '訍'],\r\n 'náng nāng': ['囊'],\r\n 'zá zàn cān': ['囋'],\r\n sū: ['囌', '櫯', '甦', '稣', '穌', '窣', '蘇', '蘓', '酥', '鯂'],\r\n zèng: ['囎', '熷', '甑', '贈', '赠', '鋥', '锃'],\r\n 'zá niè yàn': ['囐'],\r\n nāng: ['囔'],\r\n 'luó luō luo': ['囖'],\r\n 'wéi guó': ['囗'],\r\n huí: [\r\n '囘',\r\n '回',\r\n '囬',\r\n '廻',\r\n '廽',\r\n '恛',\r\n '洄',\r\n '痐',\r\n '茴',\r\n '蚘',\r\n '蛔',\r\n '蛕',\r\n '蜖',\r\n '迴',\r\n '逥',\r\n '鮰',\r\n ],\r\n nín: ['囜', '您', '脌'],\r\n 'jiǎn nān': ['囝'],\r\n nān: ['囡'],\r\n tuán: ['团', '団', '團', '慱', '抟', '摶', '檲', '糰', '鏄', '鷒', '鷻'],\r\n 'tún dùn': ['囤', '坉'],\r\n guó: [\r\n '囯',\r\n '囶',\r\n '囻',\r\n '国',\r\n '圀',\r\n '國',\r\n '帼',\r\n '幗',\r\n '慖',\r\n '摑',\r\n '漍',\r\n '聝',\r\n '腘',\r\n '膕',\r\n '蔮',\r\n '虢',\r\n '馘',\r\n '𬇹',\r\n ],\r\n kùn: ['困', '涃', '睏'],\r\n 'wéi tōng': ['囲'],\r\n qūn: ['囷', '夋', '逡'],\r\n rì: ['囸', '日', '衵', '鈤', '馹', '驲'],\r\n tāi: ['囼', '孡', '胎'],\r\n pǔ: [\r\n '圃',\r\n '圑',\r\n '擈',\r\n '普',\r\n '暜',\r\n '樸',\r\n '檏',\r\n '氆',\r\n '浦',\r\n '溥',\r\n '烳',\r\n '諩',\r\n '譜',\r\n '谱',\r\n '蹼',\r\n '鐠',\r\n '镨',\r\n ],\r\n 'quān juàn juān': ['圈', '圏'],\r\n 'chuí chuán': ['圌'],\r\n tuǎn: ['圕', '畽', '疃'],\r\n lüè: ['圙', '掠', '略', '畧', '稤', '鋝', '鋢', '锊', '䂮'],\r\n 'huán yuán': ['圜'],\r\n luán: [\r\n '圝',\r\n '圞',\r\n '奱',\r\n '娈',\r\n '孌',\r\n '孪',\r\n '孿',\r\n '峦',\r\n '巒',\r\n '挛',\r\n '攣',\r\n '曫',\r\n '栾',\r\n '欒',\r\n '滦',\r\n '灤',\r\n '癴',\r\n '癵',\r\n '羉',\r\n '脔',\r\n '臠',\r\n '虊',\r\n '銮',\r\n '鑾',\r\n '鵉',\r\n '鸞',\r\n '鸾',\r\n ],\r\n tǔ: ['土', '圡', '釷', '钍'],\r\n 'xū wéi': ['圩'],\r\n 'dì de': ['地', '嶳'],\r\n 'qiān sú': ['圱'],\r\n zhèn: [\r\n '圳',\r\n '塦',\r\n '挋',\r\n '振',\r\n '朕',\r\n '栚',\r\n '甽',\r\n '眹',\r\n '紖',\r\n '絼',\r\n '纼',\r\n '誫',\r\n '賑',\r\n '赈',\r\n '鋴',\r\n '鎭',\r\n '鎮',\r\n '镇',\r\n '阵',\r\n '陣',\r\n '震',\r\n '鴆',\r\n '鸩',\r\n ],\r\n 'chǎng cháng': ['场', '場', '塲'],\r\n 'qí yín': ['圻'],\r\n jiá: [\r\n '圿',\r\n '忦',\r\n '恝',\r\n '戞',\r\n '扴',\r\n '脥',\r\n '荚',\r\n '莢',\r\n '蛱',\r\n '蛺',\r\n '裌',\r\n '跲',\r\n '郏',\r\n '郟',\r\n '鋏',\r\n '铗',\r\n '頬',\r\n '頰',\r\n '颊',\r\n '鴶',\r\n '鵊',\r\n ],\r\n 'zhǐ zhì': ['坁'],\r\n bǎn: [\r\n '坂',\r\n '岅',\r\n '昄',\r\n '板',\r\n '版',\r\n '瓪',\r\n '粄',\r\n '舨',\r\n '蝂',\r\n '鈑',\r\n '钣',\r\n '阪',\r\n '魬',\r\n ],\r\n qǐn: ['坅', '寑', '寝', '寢', '昑', '梫', '笉', '螼', '赾', '鋟', '锓'],\r\n 'méi fén': ['坆'],\r\n 'rǒng kēng': ['坈'],\r\n 'fāng fáng': ['坊'],\r\n 'fèn bèn': ['坋'],\r\n tān: ['坍', '怹', '摊', '擹', '攤', '滩', '灘', '瘫', '癱', '舑', '貪', '贪'],\r\n 'huài pēi pī péi': ['坏'],\r\n 'dì làn': ['坔'],\r\n tán: [\r\n '坛',\r\n '墰',\r\n '墵',\r\n '壇',\r\n '壜',\r\n '婒',\r\n '憛',\r\n '昙',\r\n '曇',\r\n '榃',\r\n '檀',\r\n '潭',\r\n '燂',\r\n '痰',\r\n '磹',\r\n '罈',\r\n '罎',\r\n '藫',\r\n '談',\r\n '譚',\r\n '譠',\r\n '谈',\r\n '谭',\r\n '貚',\r\n '郯',\r\n '醰',\r\n '錟',\r\n '顃',\r\n ],\r\n bà: ['坝', '垻', '壩', '弝', '欛', '灞', '爸', '矲', '覇', '霸', '鮁', '鲅'],\r\n fén: [\r\n '坟',\r\n '墳',\r\n '妢',\r\n '岎',\r\n '幩',\r\n '枌',\r\n '棼',\r\n '汾',\r\n '焚',\r\n '燌',\r\n '燓',\r\n '羒',\r\n '羵',\r\n '蒶',\r\n '蕡',\r\n '蚠',\r\n '蚡',\r\n '豮',\r\n '豶',\r\n '轒',\r\n '鐼',\r\n '隫',\r\n '馩',\r\n '魵',\r\n '黂',\r\n '鼖',\r\n '鼢',\r\n '𣸣',\r\n ],\r\n zhuì: [\r\n '坠',\r\n '墜',\r\n '惴',\r\n '甀',\r\n '畷',\r\n '礈',\r\n '綴',\r\n '縋',\r\n '缀',\r\n '缒',\r\n '腏',\r\n '膇',\r\n '諈',\r\n '贅',\r\n '赘',\r\n '醊',\r\n '錣',\r\n '鑆',\r\n ],\r\n pō: ['坡', '岥', '泼', '溌', '潑', '釙', '鏺', '钋', '頗', '颇', '䥽'],\r\n 'pǎn bàn': ['坢'],\r\n kūn: [\r\n '坤',\r\n '堃',\r\n '堒',\r\n '崐',\r\n '崑',\r\n '昆',\r\n '晜',\r\n '潉',\r\n '焜',\r\n '熴',\r\n '猑',\r\n '琨',\r\n '瑻',\r\n '菎',\r\n '蜫',\r\n '裈',\r\n '裩',\r\n '褌',\r\n '醌',\r\n '錕',\r\n '锟',\r\n '騉',\r\n '髠',\r\n '髡',\r\n '髨',\r\n '鯤',\r\n '鲲',\r\n '鵾',\r\n '鶤',\r\n '鹍',\r\n ],\r\n diàn: [\r\n '坫',\r\n '垫',\r\n '墊',\r\n '壂',\r\n '奠',\r\n '婝',\r\n '店',\r\n '惦',\r\n '扂',\r\n '橂',\r\n '殿',\r\n '淀',\r\n '澱',\r\n '玷',\r\n '琔',\r\n '电',\r\n '癜',\r\n '簟',\r\n '蜔',\r\n '鈿',\r\n '電',\r\n '靛',\r\n '驔',\r\n ],\r\n 'mù mǔ': ['坶'],\r\n 'kē kě': ['坷', '軻'],\r\n xuè: ['坹', '岤', '桖', '瀥', '狘', '瞲', '謔', '谑', '趐'],\r\n 'dǐ chí': ['坻', '柢'],\r\n lā: ['垃', '柆', '菈', '邋'],\r\n lǒng: ['垄', '垅', '壟', '壠', '拢', '攏', '竉', '陇', '隴', '𬕂'],\r\n mín: [\r\n '垊',\r\n '姄',\r\n '岷',\r\n '崏',\r\n '捪',\r\n '旻',\r\n '旼',\r\n '民',\r\n '珉',\r\n '琘',\r\n '琝',\r\n '瑉',\r\n '痻',\r\n '盿',\r\n '砇',\r\n '緍',\r\n '緡',\r\n '缗',\r\n '罠',\r\n '苠',\r\n '鈱',\r\n '錉',\r\n '鍲',\r\n '鴖',\r\n ],\r\n 'dòng tóng': ['垌', '峒', '洞'],\r\n cí: [\r\n '垐',\r\n '嬨',\r\n '慈',\r\n '柌',\r\n '濨',\r\n '珁',\r\n '瓷',\r\n '甆',\r\n '磁',\r\n '礠',\r\n '祠',\r\n '糍',\r\n '茨',\r\n '詞',\r\n '词',\r\n '辝',\r\n '辞',\r\n '辤',\r\n '辭',\r\n '雌',\r\n '飺',\r\n '餈',\r\n '鴜',\r\n '鶿',\r\n '鷀',\r\n '鹚',\r\n ],\r\n duī: ['垖', '堆', '塠', '痽', '磓', '鐓', '鐜', '鴭'],\r\n 'duò duǒ': ['垛'],\r\n 'duǒ duò': ['垜', '挆'],\r\n chá: ['垞', '察', '嵖', '搽', '槎', '檫', '猹', '茬', '茶', '詧', '靫', '𥻗'],\r\n shǎng: ['垧', '晌', '樉', '賞', '贘', '赏', '鋿', '鏛', '鑜'],\r\n shǒu: ['垨', '守', '手', '扌', '艏', '首'],\r\n da: ['垯', '繨', '跶'],\r\n háng: [\r\n '垳',\r\n '斻',\r\n '杭',\r\n '筕',\r\n '絎',\r\n '绗',\r\n '航',\r\n '苀',\r\n '蚢',\r\n '裄',\r\n '貥',\r\n '迒',\r\n '頏',\r\n '颃',\r\n '魧',\r\n ],\r\n 'ān ǎn': ['垵'],\r\n xīng: [\r\n '垶',\r\n '惺',\r\n '星',\r\n '曐',\r\n '煋',\r\n '猩',\r\n '瑆',\r\n '皨',\r\n '篂',\r\n '腥',\r\n '興',\r\n '觪',\r\n '觲',\r\n '謃',\r\n '騂',\r\n '骍',\r\n '鮏',\r\n '鯹',\r\n ],\r\n 'yuàn huán': ['垸'],\r\n bāng: [\r\n '垹',\r\n '帮',\r\n '幇',\r\n '幚',\r\n '幫',\r\n '捠',\r\n '梆',\r\n '浜',\r\n '邦',\r\n '邫',\r\n '鞤',\r\n '𠳐',\r\n ],\r\n 'póu fú': ['垺'],\r\n cén: ['埁', '岑', '涔'],\r\n 'běng fēng': ['埄'],\r\n 'dì fáng': ['埅'],\r\n 'xiá jiā': ['埉'],\r\n 'mái mán': ['埋'],\r\n làng: ['埌', '崀', '浪', '蒗', '閬', '㫰'],\r\n 'shān yán': ['埏'],\r\n 'qín jīn': ['埐'],\r\n 'pǔ bù': ['埔'],\r\n huā: ['埖', '婲', '椛', '硴', '糀', '花', '蒊', '蘤', '誮', '錵'],\r\n 'suì sù': ['埣'],\r\n 'pí pì': ['埤'],\r\n 'qīng zhēng': ['埥', '鲭'],\r\n 'wǎn wān': ['埦'],\r\n lǔn: ['埨', '稐', '𫭢'],\r\n 'zhēng chéng': ['埩'],\r\n kōng: ['埪', '崆', '箜', '躻', '錓', '鵼'],\r\n 'cǎi cài': ['埰', '寀', '采'],\r\n 'chù tòu': ['埱'],\r\n běng: ['埲', '琫', '菶', '鞛'],\r\n 'kǎn xiàn': ['埳'],\r\n 'yì shì': ['埶', '醳'],\r\n péi: ['培', '毰', '裴', '裵', '賠', '赔', '錇', '锫', '阫', '陪'],\r\n 'sào sǎo': ['埽'],\r\n 'jǐn qīn jìn': ['堇'],\r\n 'péng bèng': ['堋'],\r\n 'qiàn zàn jiàn': ['堑'],\r\n àn: [\r\n '堓',\r\n '屵',\r\n '岸',\r\n '按',\r\n '暗',\r\n '案',\r\n '胺',\r\n '荌',\r\n '豻',\r\n '貋',\r\n '錌',\r\n '闇',\r\n '隌',\r\n '黯',\r\n ],\r\n 'duò huī': ['堕', '墮'],\r\n huán: [\r\n '堚',\r\n '寏',\r\n '寰',\r\n '峘',\r\n '桓',\r\n '洹',\r\n '澴',\r\n '獂',\r\n '环',\r\n '環',\r\n '糫',\r\n '繯',\r\n '缳',\r\n '羦',\r\n '荁',\r\n '萈',\r\n '萑',\r\n '豲',\r\n '鍰',\r\n '鐶',\r\n '锾',\r\n '镮',\r\n '闤',\r\n '阛',\r\n '雈',\r\n '鬟',\r\n '鹮',\r\n '𬘫',\r\n '𤩽',\r\n ],\r\n 'bǎo bǔ pù': ['堡'],\r\n 'máo móu wǔ': ['堥'],\r\n ruán: ['堧', '壖', '撋'],\r\n 'ài è yè': ['堨'],\r\n gèng: ['堩', '暅'],\r\n méi: [\r\n '堳',\r\n '塺',\r\n '媒',\r\n '嵋',\r\n '徾',\r\n '攗',\r\n '枚',\r\n '栂',\r\n '梅',\r\n '楣',\r\n '楳',\r\n '槑',\r\n '湄',\r\n '湈',\r\n '煤',\r\n '猸',\r\n '玫',\r\n '珻',\r\n '瑂',\r\n '眉',\r\n '睂',\r\n '禖',\r\n '脄',\r\n '脢',\r\n '腜',\r\n '苺',\r\n '莓',\r\n '葿',\r\n '郿',\r\n '酶',\r\n '鎇',\r\n '镅',\r\n '霉',\r\n '鶥',\r\n '鹛',\r\n '黴',\r\n ],\r\n dǔ: ['堵', '琽', '睹', '笃', '篤', '覩', '賭', '赌'],\r\n féng: ['堸', '綘', '艂', '逢'],\r\n hèng: ['堼'],\r\n chūn: [\r\n '堾',\r\n '媋',\r\n '旾',\r\n '春',\r\n '暙',\r\n '杶',\r\n '椿',\r\n '槆',\r\n '橁',\r\n '櫄',\r\n '瑃',\r\n '箺',\r\n '萅',\r\n '蝽',\r\n '輴',\r\n '鰆',\r\n '鶞',\r\n '䲠',\r\n ],\r\n jiǎng: [\r\n '塂',\r\n '奖',\r\n '奨',\r\n '奬',\r\n '桨',\r\n '槳',\r\n '獎',\r\n '耩',\r\n '膙',\r\n '蒋',\r\n '蔣',\r\n '講',\r\n '讲',\r\n '顜',\r\n ],\r\n huāng: ['塃', '巟', '慌', '肓', '荒', '衁'],\r\n duàn: [\r\n '塅',\r\n '断',\r\n '斷',\r\n '椴',\r\n '段',\r\n '毈',\r\n '煅',\r\n '瑖',\r\n '碫',\r\n '簖',\r\n '籪',\r\n '緞',\r\n '缎',\r\n '腶',\r\n '葮',\r\n '躖',\r\n '鍛',\r\n '锻',\r\n ],\r\n tǎ: ['塔', '墖', '獭', '獺', '鮙', '鰨', '鳎'],\r\n wěng: ['塕', '奣', '嵡', '攚', '暡', '瞈', '蓊'],\r\n 'sāi sài sè': ['塞'],\r\n zàng: ['塟', '弉', '臓', '臟', '葬', '蔵', '銺'],\r\n tián: [\r\n '塡',\r\n '屇',\r\n '恬',\r\n '沺',\r\n '湉',\r\n '璳',\r\n '甛',\r\n '甜',\r\n '田',\r\n '畋',\r\n '畑',\r\n '碵',\r\n '磌',\r\n '胋',\r\n '闐',\r\n '阗',\r\n '鴫',\r\n '鷆',\r\n '鷏',\r\n ],\r\n zhèng: [\r\n '塣',\r\n '幁',\r\n '政',\r\n '証',\r\n '諍',\r\n '證',\r\n '证',\r\n '诤',\r\n '郑',\r\n '鄭',\r\n '靕',\r\n '鴊',\r\n ],\r\n 'tián zhèn': ['填'],\r\n wēn: [\r\n '塭',\r\n '昷',\r\n '榲',\r\n '殟',\r\n '温',\r\n '溫',\r\n '瑥',\r\n '瘟',\r\n '蕰',\r\n '豱',\r\n '輼',\r\n '轀',\r\n '辒',\r\n '鎾',\r\n '饂',\r\n '鰛',\r\n '鰮',\r\n '鳁',\r\n ],\r\n liù: ['塯', '廇', '磟', '翏', '雡', '霤', '餾', '鬸', '鷚', '鹨'],\r\n hǎi: ['塰', '海', '烸', '酼', '醢'],\r\n lǎng: ['塱', '朖', '朗', '朤', '烺', '蓢', '㮾'],\r\n bèng: ['塴', '揼', '泵', '甏', '綳', '蹦', '迸', '逬', '鏰', '镚'],\r\n chén: [\r\n '塵',\r\n '宸',\r\n '尘',\r\n '忱',\r\n '敐',\r\n '敶',\r\n '晨',\r\n '曟',\r\n '栕',\r\n '樄',\r\n '沉',\r\n '煁',\r\n '瘎',\r\n '臣',\r\n '茞',\r\n '莀',\r\n '莐',\r\n '蔯',\r\n '薼',\r\n '螴',\r\n '訦',\r\n '諶',\r\n '軙',\r\n '辰',\r\n '迧',\r\n '鈂',\r\n '陈',\r\n '陳',\r\n '霃',\r\n '鷐',\r\n '麎',\r\n ],\r\n 'ōu qiū': ['塸'],\r\n 'qiàn jiàn': ['塹'],\r\n 'zhuān tuán': ['塼'],\r\n shuǎng: ['塽', '慡', '漺', '爽', '縔', '鏯'],\r\n shú: ['塾', '婌', '孰', '璹', '秫', '贖', '赎'],\r\n lǒu: ['塿', '嵝', '嶁', '甊', '篓', '簍'],\r\n chí: [\r\n '墀',\r\n '弛',\r\n '持',\r\n '池',\r\n '漦',\r\n '竾',\r\n '筂',\r\n '箎',\r\n '篪',\r\n '茌',\r\n '荎',\r\n '蚳',\r\n '謘',\r\n '貾',\r\n '赿',\r\n '踟',\r\n '迟',\r\n '迡',\r\n '遅',\r\n '遟',\r\n '遲',\r\n '鍉',\r\n '馳',\r\n '驰',\r\n ],\r\n shù: [\r\n '墅',\r\n '庶',\r\n '庻',\r\n '怷',\r\n '恕',\r\n '戍',\r\n '束',\r\n '树',\r\n '樹',\r\n '沭',\r\n '漱',\r\n '潄',\r\n '濖',\r\n '竖',\r\n '竪',\r\n '絉',\r\n '腧',\r\n '荗',\r\n '蒁',\r\n '虪',\r\n '術',\r\n '裋',\r\n '豎',\r\n '述',\r\n '鉥',\r\n '錰',\r\n '鏣',\r\n '霔',\r\n '鶐',\r\n '𬬸',\r\n ],\r\n 'dì zhì': ['墆', '疐'],\r\n kàn: ['墈', '崁', '瞰', '矙', '磡', '衎', '鬫'],\r\n chěn: ['墋', '夦', '硶', '碜', '磣', '贂', '趻', '踸', '鍖'],\r\n 'zhǐ zhuó': ['墌'],\r\n qiǎng: ['墏', '繈', '繦', '羥', '襁'],\r\n zēng: ['増', '增', '憎', '璔', '矰', '磳', '罾', '譄', '鄫', '鱛', '䎖'],\r\n qiáng: [\r\n '墙',\r\n '墻',\r\n '嫱',\r\n '嬙',\r\n '樯',\r\n '檣',\r\n '漒',\r\n '牆',\r\n '艢',\r\n '蔃',\r\n '蔷',\r\n '蘠',\r\n ],\r\n 'kuài tuí': ['墤'],\r\n 'tuǎn dǒng': ['墥'],\r\n 'qiáo què': ['墧'],\r\n 'zūn dūn': ['墫'],\r\n 'qiāo áo': ['墽'],\r\n 'yì tú': ['墿'],\r\n 'xué bó jué': ['壆'],\r\n lǎn: [\r\n '壈',\r\n '嬾',\r\n '孄',\r\n '孏',\r\n '懒',\r\n '懶',\r\n '揽',\r\n '擥',\r\n '攬',\r\n '榄',\r\n '欖',\r\n '浨',\r\n '漤',\r\n '灠',\r\n '纜',\r\n '缆',\r\n '罱',\r\n '覧',\r\n '覽',\r\n '览',\r\n '醂',\r\n '顲',\r\n ],\r\n huài: ['壊', '壞', '蘾'],\r\n rǎng: ['壌', '壤', '攘', '爙'],\r\n 'làn xiàn': ['壏'],\r\n dǎo: [\r\n '壔',\r\n '导',\r\n '導',\r\n '岛',\r\n '島',\r\n '嶋',\r\n '嶌',\r\n '嶹',\r\n '捣',\r\n '搗',\r\n '擣',\r\n '槝',\r\n '祷',\r\n '禂',\r\n '禱',\r\n '蹈',\r\n '陦',\r\n '隝',\r\n '隯',\r\n ],\r\n ruǐ: ['壡', '桵', '橤', '繠', '蕊', '蕋', '蘂', '蘃'],\r\n san: ['壭'],\r\n zhuàng: ['壮', '壯', '壵', '撞', '焋', '状', '狀'],\r\n 'ké qiào': ['壳', '殼'],\r\n kǔn: [\r\n '壸',\r\n '壼',\r\n '悃',\r\n '捆',\r\n '梱',\r\n '硱',\r\n '祵',\r\n '稇',\r\n '稛',\r\n '綑',\r\n '裍',\r\n '閫',\r\n '閸',\r\n '阃',\r\n ],\r\n mǎng: ['壾', '漭', '茻', '莽', '莾', '蠎'],\r\n cún: ['壿', '存'],\r\n 'zhǐ zhōng': ['夂'],\r\n 'gǔ yíng': ['夃'],\r\n 'jiàng xiáng': ['夅', '降'],\r\n 'páng féng fēng': ['夆'],\r\n zhāi: ['夈', '捚', '摘', '斋', '斎', '榸', '粂', '齋'],\r\n 'xuàn xiòng': ['夐'],\r\n wài: ['外', '顡'],\r\n 'wǎn yuàn wān yuān': ['夗'],\r\n 'mǎo wǎn': ['夘'],\r\n mèng: ['夢', '夣', '孟', '梦', '癦', '霥'],\r\n 'dà dài': ['大'],\r\n 'fū fú': ['夫', '姇', '枎', '粰'],\r\n guài: ['夬', '怪', '恠'],\r\n yāng: [\r\n '央',\r\n '姎',\r\n '抰',\r\n '殃',\r\n '泱',\r\n '秧',\r\n '胦',\r\n '鉠',\r\n '鍈',\r\n '雵',\r\n '鴦',\r\n '鸯',\r\n ],\r\n 'hāng bèn': ['夯'],\r\n gǎo: [\r\n '夰',\r\n '搞',\r\n '杲',\r\n '槀',\r\n '槁',\r\n '檺',\r\n '稁',\r\n '稾',\r\n '稿',\r\n '縞',\r\n '缟',\r\n '菒',\r\n '藁',\r\n '藳',\r\n ],\r\n 'tāo běn': ['夲'],\r\n 'tóu tou': ['头'],\r\n 'yǎn tāo': ['夵'],\r\n 'kuā kuà': ['夸', '誇'],\r\n 'jiá jiā gā xiá': ['夹'],\r\n huà: [\r\n '夻',\r\n '婳',\r\n '嫿',\r\n '嬅',\r\n '崋',\r\n '摦',\r\n '杹',\r\n '枠',\r\n '桦',\r\n '槬',\r\n '樺',\r\n '澅',\r\n '画',\r\n '畫',\r\n '畵',\r\n '繣',\r\n '舙',\r\n '話',\r\n '諙',\r\n '譮',\r\n '话',\r\n '黊',\r\n ],\r\n 'jiā jiá gā xiá': ['夾'],\r\n ēn: ['奀', '恩', '蒽'],\r\n 'dī tì': ['奃'],\r\n 'yǎn yān': ['奄', '渰'],\r\n pào: ['奅', '疱', '皰', '砲', '礟', '礮', '靤', '麭'],\r\n nài: ['奈', '柰', '渿', '耐', '萘', '褦', '錼', '鼐'],\r\n 'quān juàn': ['奍', '弮', '棬'],\r\n zòu: ['奏', '揍'],\r\n 'qì qiè xiè': ['契'],\r\n kāi: ['奒', '开', '揩', '鐦', '锎', '開'],\r\n 'bēn bèn': ['奔', '泍'],\r\n tào: ['套'],\r\n 'zàng zhuǎng': ['奘'],\r\n běn: ['奙', '本', '楍', '畚', '翉', '苯'],\r\n 'xùn zhuì': ['奞'],\r\n shē: ['奢', '檨', '猞', '畭', '畲', '賒', '賖', '赊', '輋', '𪨶'],\r\n 'hǎ pò tǎi': ['奤'],\r\n 'ào yù': ['奥', '奧', '澚'],\r\n yūn: ['奫', '氲', '氳', '蒀', '蒕', '蝹', '贇', '赟', '𫖳'],\r\n 'duǒ chě': ['奲'],\r\n 'nǚ rǔ': ['女'],\r\n nú: ['奴', '孥', '笯', '駑', '驽'],\r\n 'dīng dǐng tiǎn': ['奵'],\r\n 'tā jiě': ['她'],\r\n nuán: ['奻'],\r\n 'hǎo hào': ['好'],\r\n fàn: [\r\n '奿',\r\n '嬎',\r\n '梵',\r\n '汎',\r\n '泛',\r\n '滼',\r\n '瀪',\r\n '犯',\r\n '畈',\r\n '盕',\r\n '笵',\r\n '範',\r\n '范',\r\n '訉',\r\n '販',\r\n '贩',\r\n '軬',\r\n '輽',\r\n '飯',\r\n '飰',\r\n '饭',\r\n ],\r\n shuò: ['妁', '搠', '朔', '槊', '烁', '爍', '矟', '蒴', '鎙', '鑠', '铄'],\r\n 'fēi pèi': ['妃'],\r\n wàng: ['妄', '忘', '旺', '望', '朢'],\r\n zhuāng: [\r\n '妆',\r\n '妝',\r\n '娤',\r\n '庄',\r\n '庒',\r\n '桩',\r\n '梉',\r\n '樁',\r\n '粧',\r\n '糚',\r\n '荘',\r\n '莊',\r\n '装',\r\n '裝',\r\n ],\r\n mā: ['妈', '媽'],\r\n 'fū yōu': ['妋'],\r\n 'hài jiè': ['妎'],\r\n dù: [\r\n '妒',\r\n '妬',\r\n '杜',\r\n '殬',\r\n '渡',\r\n '秺',\r\n '芏',\r\n '荰',\r\n '螙',\r\n '蠧',\r\n '蠹',\r\n '鍍',\r\n '镀',\r\n '靯',\r\n '𬭊',\r\n ],\r\n miào: ['妙', '庙', '庿', '廟', '玅', '竗'],\r\n 'fǒu pēi pī': ['妚'],\r\n 'yuè jué': ['妜'],\r\n niū: ['妞'],\r\n 'nà nàn': ['妠'],\r\n tuǒ: ['妥', '嫷', '庹', '椭', '楕', '橢', '鬌', '鰖', '鵎'],\r\n 'wàn yuán': ['妧'],\r\n fáng: ['妨', '房', '肪', '防', '魴', '鲂'],\r\n nī: ['妮'],\r\n zhóu: ['妯', '碡'],\r\n zhāo: ['妱', '巶', '招', '昭', '釗', '鉊', '鍣', '钊', '駋', '𬬿'],\r\n 'nǎi nǐ': ['妳'],\r\n tǒu: ['妵', '敨', '紏', '蘣', '黈'],\r\n 'xián xuán xù': ['妶'],\r\n 'zhí yì': ['妷', '秇'],\r\n ē: ['妸', '妿', '婀', '屙'],\r\n mèi: [\r\n '妹',\r\n '媚',\r\n '寐',\r\n '抺',\r\n '旀',\r\n '昧',\r\n '沬',\r\n '煝',\r\n '痗',\r\n '眛',\r\n '睸',\r\n '祙',\r\n '篃',\r\n '蝞',\r\n '袂',\r\n '跊',\r\n '鬽',\r\n '魅',\r\n ],\r\n 'qī qì': ['妻'],\r\n 'xū xǔ': ['姁', '稰'],\r\n 'shān shàn': ['姍', '姗', '苫', '釤', '钐'],\r\n mán: ['姏', '慲', '樠', '蛮', '蠻', '謾', '饅', '馒', '鬗', '鬘', '鰻', '鳗'],\r\n jiě: ['姐', '媎', '檞', '毑', '飷'],\r\n 'wěi wēi': ['委'],\r\n pīn: ['姘', '拼', '礗', '穦', '馪', '驞'],\r\n 'huá huó': ['姡'],\r\n 'jiāo xiáo': ['姣'],\r\n 'gòu dù': ['姤'],\r\n 'lǎo mǔ': ['姥'],\r\n 'nián niàn': ['姩'],\r\n zhěn: [\r\n '姫',\r\n '屒',\r\n '弫',\r\n '抮',\r\n '昣',\r\n '枕',\r\n '畛',\r\n '疹',\r\n '眕',\r\n '稹',\r\n '縝',\r\n '縥',\r\n '缜',\r\n '聄',\r\n '萙',\r\n '袗',\r\n '裖',\r\n '覙',\r\n '診',\r\n '诊',\r\n '軫',\r\n '轸',\r\n '辴',\r\n '駗',\r\n '鬒',\r\n ],\r\n héng: [\r\n '姮',\r\n '恆',\r\n '恒',\r\n '烆',\r\n '珩',\r\n '胻',\r\n '蘅',\r\n '衡',\r\n '鑅',\r\n '鴴',\r\n '鵆',\r\n '鸻',\r\n ],\r\n 'jūn xún': ['姰'],\r\n 'kuā hù': ['姱'],\r\n 'è yà': ['姶'],\r\n 'xiān shēn': ['姺'],\r\n wá: ['娃'],\r\n 'ráo rǎo': ['娆', '嬈'],\r\n 'shào shāo': ['娋'],\r\n xiē: ['娎', '揳', '楔', '歇', '蝎', '蠍'],\r\n 'wǔ méi mǔ': ['娒'],\r\n 'chuò lài': ['娕'],\r\n niáng: ['娘', '嬢', '孃'],\r\n 'nà nuó': ['娜', '𦰡'],\r\n 'pōu bǐ': ['娝'],\r\n 'něi suī': ['娞'],\r\n tuì: ['娧', '煺', '蛻', '蜕', '退', '駾'],\r\n mǎn: ['娨', '屘', '満', '满', '滿', '螨', '蟎', '襔', '鏋'],\r\n 'wú wù yú': ['娪'],\r\n 'xī āi': ['娭'],\r\n 'zhuì shuì': ['娷'],\r\n 'dōng dòng': ['娻'],\r\n 'ǎi ái è': ['娾'],\r\n 'ē ě': ['娿'],\r\n mián: [\r\n '婂',\r\n '嬵',\r\n '宀',\r\n '杣',\r\n '棉',\r\n '檰',\r\n '櫋',\r\n '眠',\r\n '矈',\r\n '矊',\r\n '矏',\r\n '綿',\r\n '緜',\r\n '绵',\r\n '芇',\r\n '蝒',\r\n ],\r\n 'pǒu péi bù': ['婄'],\r\n biǎo: ['婊', '脿', '表', '裱', '褾', '諘', '錶'],\r\n 'fù fàn': ['婏'],\r\n wǒ: ['婐', '婑', '我'],\r\n 'ní nǐ': ['婗', '棿'],\r\n 'quán juàn': ['婘', '惓'],\r\n hūn: [\r\n '婚',\r\n '昏',\r\n '昬',\r\n '棔',\r\n '涽',\r\n '睧',\r\n '睯',\r\n '碈',\r\n '荤',\r\n '葷',\r\n '蔒',\r\n '轋',\r\n '閽',\r\n '阍',\r\n ],\r\n 'qiān jǐn': ['婜'],\r\n 'wān wà': ['婠'],\r\n 'lái lài': ['婡', '徕', '徠'],\r\n 'zhōu chōu': ['婤'],\r\n 'chuò nào': ['婥'],\r\n 'nüè àn': ['婩'],\r\n 'hùn kūn': ['婫'],\r\n 'dàng yáng': ['婸'],\r\n nàn: ['婻'],\r\n 'ruò chuò': ['婼'],\r\n jiǎ: ['婽', '岬', '斚', '斝', '榎', '槚', '檟', '玾', '甲', '胛', '鉀', '钾'],\r\n 'tōu yú': ['婾', '媮'],\r\n 'yù yú': ['媀'],\r\n 'wéi wěi': ['媁'],\r\n 'dì tí': ['媂', '珶', '苐'],\r\n róu: [\r\n '媃',\r\n '揉',\r\n '柔',\r\n '渘',\r\n '煣',\r\n '瑈',\r\n '瓇',\r\n '禸',\r\n '粈',\r\n '糅',\r\n '脜',\r\n '腬',\r\n '葇',\r\n '蝚',\r\n '蹂',\r\n '輮',\r\n '鍒',\r\n '鞣',\r\n '騥',\r\n '鰇',\r\n '鶔',\r\n '𫐓',\r\n ],\r\n 'ruǎn nèn': ['媆'],\r\n miáo: ['媌', '嫹', '描', '瞄', '苗', '鶓', '鹋'],\r\n 'yí pèi': ['媐'],\r\n 'mián miǎn': ['媔'],\r\n 'tí shì': ['媞', '惿'],\r\n 'duò tuó': ['媠', '沲'],\r\n ǎo: ['媪', '媼', '艹', '芺', '袄', '襖', '镺'],\r\n 'chú zòu': ['媰'],\r\n yìng: ['媵', '映', '暎', '硬', '膡', '鱦'],\r\n 'qín shēn': ['嫀'],\r\n jià: ['嫁', '幏', '架', '榢', '稼', '駕', '驾'],\r\n sǎo: ['嫂'],\r\n 'zhēn zhěn': ['嫃'],\r\n 'jiē suǒ': ['嫅'],\r\n 'míng mǐng': ['嫇'],\r\n niǎo: ['嫋', '嬝', '嬲', '茑', '蔦', '袅', '裊', '褭', '鸟'],\r\n tāo: [\r\n '嫍',\r\n '幍',\r\n '弢',\r\n '慆',\r\n '掏',\r\n '搯',\r\n '槄',\r\n '涛',\r\n '滔',\r\n '濤',\r\n '瑫',\r\n '絛',\r\n '縚',\r\n '縧',\r\n '绦',\r\n '詜',\r\n '謟',\r\n '轁',\r\n '鞱',\r\n '韜',\r\n '韬',\r\n '飸',\r\n '饕',\r\n ],\r\n biáo: ['嫑'],\r\n 'piáo piāo': ['嫖', '薸'],\r\n xuán: [\r\n '嫙',\r\n '悬',\r\n '懸',\r\n '暶',\r\n '檈',\r\n '漩',\r\n '玄',\r\n '璇',\r\n '璿',\r\n '痃',\r\n '蜁',\r\n '𫠊',\r\n ],\r\n 'màn mān': ['嫚'],\r\n kāng: [\r\n '嫝',\r\n '嵻',\r\n '康',\r\n '慷',\r\n '槺',\r\n '漮',\r\n '砊',\r\n '穅',\r\n '糠',\r\n '躿',\r\n '鏮',\r\n '鱇',\r\n '𡐓',\r\n '𩾌',\r\n ],\r\n 'hān nǎn': ['嫨'],\r\n nèn: ['嫩', '嫰'],\r\n zhē: ['嫬', '遮'],\r\n 'mā má': ['嫲'],\r\n piè: ['嫳'],\r\n zhǎn: [\r\n '嫸',\r\n '展',\r\n '搌',\r\n '斩',\r\n '斬',\r\n '琖',\r\n '盏',\r\n '盞',\r\n '輾',\r\n '醆',\r\n '颭',\r\n '飐',\r\n ],\r\n 'xiān yǎn jìn': ['嬐'],\r\n liǎn: [\r\n '嬚',\r\n '敛',\r\n '斂',\r\n '琏',\r\n '璉',\r\n '羷',\r\n '脸',\r\n '臉',\r\n '蔹',\r\n '蘝',\r\n '蘞',\r\n '裣',\r\n '襝',\r\n '鄻',\r\n ],\r\n 'qióng huán xuān': ['嬛'],\r\n dǒng: ['嬞', '懂', '箽', '董', '蕫', '諌'],\r\n cān: ['嬠', '湌', '爘', '飡', '餐', '驂', '骖'],\r\n tiǎo: ['嬥', '宨', '晀', '朓', '窱', '脁'],\r\n bí: ['嬶', '荸', '鼻'],\r\n liǔ: [\r\n '嬼',\r\n '柳',\r\n '栁',\r\n '桞',\r\n '桺',\r\n '橮',\r\n '熮',\r\n '珋',\r\n '綹',\r\n '绺',\r\n '罶',\r\n '羀',\r\n '鋶',\r\n '锍',\r\n ],\r\n 'qiān xiān': ['孅', '欦'],\r\n 'xié huī': ['孈'],\r\n 'huān quán': ['孉'],\r\n 'lí lì': ['孋', '麗'],\r\n 'zhú chuò': ['孎'],\r\n kǒng: ['孔', '恐'],\r\n 'mā zī': ['孖'],\r\n 'sūn xùn': ['孙', '孫'],\r\n 'bèi bó': ['孛', '誖'],\r\n 'yòu niū': ['孧'],\r\n zhuǎn: ['孨', '竱', '轉'],\r\n hái: ['孩', '骸'],\r\n nāo: ['孬'],\r\n 'chán càn': ['孱'],\r\n bò: ['孹', '檗', '蘗', '譒'],\r\n nái: ['孻', '腉'],\r\n 'níng nìng': ['宁', '寍', '寗', '寜', '寧', '甯'],\r\n zhái: ['宅'],\r\n 'tū jiā': ['宊'],\r\n sòng: ['宋', '訟', '誦', '讼', '诵', '送', '鎹', '頌', '颂', '餸'],\r\n ròu: ['宍', '肉', '譳'],\r\n zhūn: ['宒', '窀', '衠', '諄', '谆', '迍'],\r\n 'mì fú': ['宓'],\r\n 'dàng tàn': ['宕'],\r\n 'wǎn yuān': ['宛'],\r\n chǒng: ['宠', '寵'],\r\n qún: ['宭', '峮', '帬', '羣', '群', '裙', '裠'],\r\n zǎi: ['宰', '崽'],\r\n 'bǎo shí': ['宲'],\r\n 'jiā jia jie': ['家'],\r\n 'huāng huǎng': ['宺'],\r\n kuān: ['宽', '寛', '寬', '臗', '鑧', '髋', '髖'],\r\n 'sù xiǔ xiù': ['宿'],\r\n 'jié zǎn': ['寁'],\r\n 'bìng bǐng': ['寎'],\r\n 'jìn qǐn': ['寖'],\r\n 'lóu jù': ['寠'],\r\n 'xiě xiè': ['寫'],\r\n 'qīn qìn': ['寴'],\r\n cùn: ['寸', '籿'],\r\n duì: [\r\n '对',\r\n '対',\r\n '對',\r\n '怼',\r\n '憝',\r\n '懟',\r\n '濧',\r\n '瀩',\r\n '碓',\r\n '祋',\r\n '綐',\r\n '薱',\r\n '譈',\r\n '譵',\r\n '轛',\r\n '队',\r\n '陮',\r\n ],\r\n 'lüè luó': ['寽'],\r\n 'shè yè yì': ['射'],\r\n 'jiāng jiàng qiāng': ['将'],\r\n 'jiāng jiàng': ['將', '浆', '漿', '畺'],\r\n zūn: ['尊', '嶟', '樽', '罇', '遵', '鐏', '鱒', '鳟', '鶎', '鷷', '𨱔'],\r\n 'shù zhù': ['尌', '澍'],\r\n xiǎo: ['小', '晓', '暁', '曉', '皛', '皢', '筱', '筿', '篠', '謏', '𫍲'],\r\n 'jié jí': ['尐', '诘', '鞊'],\r\n 'shǎo shào': ['少'],\r\n ěr: [\r\n '尒',\r\n '尓',\r\n '尔',\r\n '栮',\r\n '毦',\r\n '洱',\r\n '爾',\r\n '珥',\r\n '耳',\r\n '薾',\r\n '衈',\r\n '趰',\r\n '迩',\r\n '邇',\r\n '鉺',\r\n '铒',\r\n '餌',\r\n '饵',\r\n '駬',\r\n ],\r\n 'wāng yóu': ['尢'],\r\n wāng: ['尣', '尩', '尪', '尫', '汪'],\r\n liào: ['尥', '尦', '廖', '撂', '料', '炓', '窷', '鐐', '镣', '𪤗'],\r\n 'méng máng lóng páng': ['尨'],\r\n gà: ['尬', '魀'],\r\n 'kuì kuǐ': ['尯'],\r\n tuí: ['尵', '弚', '穨', '蘈', '蹪', '隤', '頹', '頺', '頽', '颓', '魋', '𬯎'],\r\n yǐn: [\r\n '尹',\r\n '嶾',\r\n '引',\r\n '朄',\r\n '檃',\r\n '檼',\r\n '櫽',\r\n '淾',\r\n '濥',\r\n '瘾',\r\n '癮',\r\n '粌',\r\n '蘟',\r\n '蚓',\r\n '螾',\r\n '讔',\r\n '赺',\r\n '趛',\r\n '輑',\r\n '鈏',\r\n '靷',\r\n ],\r\n 'chǐ chě': ['尺'],\r\n kāo: ['尻', '髛'],\r\n 'jìn jǐn': ['尽'],\r\n 'wěi yǐ': ['尾'],\r\n 'niào suī': ['尿'],\r\n céng: ['层', '層', '嶒', '驓'],\r\n diǎo: ['屌'],\r\n 'píng bǐng bīng': ['屏'],\r\n lòu: ['屚', '漏', '瘘', '瘺', '瘻', '鏤', '镂', '陋'],\r\n 'shǔ zhǔ': ['属', '屬'],\r\n 'xiè tì': ['屟'],\r\n 'chè cǎo': ['屮'],\r\n 'tún zhūn': ['屯'],\r\n 'nì jǐ': ['屰'],\r\n 'hóng lóng': ['屸'],\r\n 'qǐ kǎi': ['岂', '豈'],\r\n áng: ['岇', '昂', '昻'],\r\n 'gǎng gāng': ['岗', '崗'],\r\n kě: ['岢', '敤', '渇', '渴', '炣'],\r\n gǒu: ['岣', '狗', '玽', '笱', '耇', '耈', '耉', '苟', '豿'],\r\n tiáo: [\r\n '岧',\r\n '岹',\r\n '樤',\r\n '祒',\r\n '笤',\r\n '芀',\r\n '萔',\r\n '蓚',\r\n '蓨',\r\n '蜩',\r\n '迢',\r\n '鋚',\r\n '鎥',\r\n '鞗',\r\n '髫',\r\n '鯈',\r\n '鰷',\r\n '鲦',\r\n '齠',\r\n '龆',\r\n ],\r\n 'qū jū': ['岨'],\r\n lǐng: ['岭', '嶺', '領', '领'],\r\n pò: ['岶', '敀', '洦', '湐', '烞', '珀', '破', '砶', '粕', '蒪', '魄'],\r\n 'bā kè': ['峇'],\r\n luò: [\r\n '峈',\r\n '摞',\r\n '洛',\r\n '洜',\r\n '犖',\r\n '珞',\r\n '笿',\r\n '纙',\r\n '荦',\r\n '詻',\r\n '雒',\r\n '駱',\r\n '骆',\r\n '鵅',\r\n ],\r\n 'fù niè': ['峊'],\r\n ěn: ['峎'],\r\n 'zhì shì': ['峙', '崻'],\r\n qiǎ: ['峠', '跒', '酠', '鞐'],\r\n 'qiáo jiào': ['峤', '癄'],\r\n 'xié yé': ['峫'],\r\n bū: ['峬', '庯', '晡', '誧', '逋', '鈽', '錻', '钸', '餔', '鵏'],\r\n chóng: ['崇', '崈', '爞', '虫', '蝩', '蟲', '褈', '隀'],\r\n 'zú cuì': ['崒', '椊'],\r\n 'líng léng': ['崚'],\r\n 'dòng dōng': ['崠'],\r\n xiáo: ['崤', '洨', '淆', '訤', '誵'],\r\n 'pí bǐ': ['崥', '芘'],\r\n 'zhǎn chán': ['崭', '嶃', '嶄'],\r\n 'wǎi wēi': ['崴'],\r\n 'yáng dàng': ['崵'],\r\n 'shì dié': ['崼'],\r\n yào: [\r\n '崾',\r\n '曜',\r\n '熎',\r\n '燿',\r\n '矅',\r\n '穾',\r\n '窔',\r\n '筄',\r\n '耀',\r\n '艞',\r\n '药',\r\n '葯',\r\n '薬',\r\n '藥',\r\n '袎',\r\n '覞',\r\n '詏',\r\n '讑',\r\n '靿',\r\n '鷂',\r\n '鹞',\r\n '鼼',\r\n ],\r\n 'kān zhàn': ['嵁'],\r\n 'hán dǎng': ['嵅'],\r\n 'qiàn kàn': ['嵌'],\r\n 'wù máo': ['嵍'],\r\n 'kě jié': ['嵑', '嶱'],\r\n 'wēi wěi': ['嵔'],\r\n kē: [\r\n '嵙',\r\n '柯',\r\n '棵',\r\n '榼',\r\n '樖',\r\n '牁',\r\n '牱',\r\n '犐',\r\n '珂',\r\n '疴',\r\n '瞌',\r\n '磕',\r\n '礚',\r\n '科',\r\n '稞',\r\n '窠',\r\n '萪',\r\n '薖',\r\n '蚵',\r\n '蝌',\r\n '趷',\r\n '轲',\r\n '醘',\r\n '鈳',\r\n '钶',\r\n '頦',\r\n '顆',\r\n '颗',\r\n '髁',\r\n ],\r\n 'dàng táng': ['嵣'],\r\n 'róng yíng': ['嵤', '爃'],\r\n 'ái kǎi': ['嵦'],\r\n 'kāo qiāo': ['嵪'],\r\n cuó: ['嵯', '嵳', '痤', '矬', '蒫', '蔖', '虘', '鹺', '鹾'],\r\n 'qiǎn qīn': ['嵰'],\r\n 'dì dié': ['嵽'],\r\n cēn: ['嵾'],\r\n dǐng: ['嵿', '艼', '薡', '鐤', '頂', '顶', '鼎', '鼑'],\r\n 'áo ào': ['嶅'],\r\n 'pǐ pèi': ['嶏'],\r\n 'jiào qiáo': ['嶠', '潐'],\r\n 'jué guì': ['嶡', '鳜'],\r\n 'zhān shàn': ['嶦', '鳣'],\r\n 'xiè jiè': ['嶰'],\r\n 'guī xī juàn': ['嶲'],\r\n rū: ['嶿'],\r\n 'lì liè': ['巁', '棙', '爄', '綟'],\r\n 'xī guī juàn': ['巂'],\r\n 'yíng hōng': ['巆'],\r\n yǐng: [\r\n '巊',\r\n '廮',\r\n '影',\r\n '摬',\r\n '梬',\r\n '潁',\r\n '瘿',\r\n '癭',\r\n '矨',\r\n '穎',\r\n '郢',\r\n '鐛',\r\n '頴',\r\n '颍',\r\n '颕',\r\n '颖',\r\n ],\r\n chǎo: ['巐', '炒', '煼', '眧', '麨'],\r\n cuán: ['巑', '櫕', '欑'],\r\n chuān: ['巛', '川', '氚', '瑏', '穿'],\r\n 'jīng xíng': ['巠'],\r\n cháo: [\r\n '巢',\r\n '巣',\r\n '晁',\r\n '漅',\r\n '潮',\r\n '牊',\r\n '窲',\r\n '罺',\r\n '謿',\r\n '轈',\r\n '鄛',\r\n '鼌',\r\n ],\r\n qiǎo: ['巧', '愀', '髜'],\r\n gǒng: ['巩', '廾', '拱', '拲', '栱', '汞', '珙', '輁', '鞏'],\r\n 'chà chā chāi cī': ['差'],\r\n 'xiàng hàng': ['巷'],\r\n shuài: ['帅', '帥', '蟀'],\r\n pà: ['帊', '帕', '怕', '袙'],\r\n 'tǎng nú': ['帑'],\r\n 'mò wà': ['帓'],\r\n 'tiē tiě tiè': ['帖'],\r\n zhǒu: ['帚', '晭', '疛', '睭', '箒', '肘', '菷', '鯞'],\r\n 'juǎn juàn': ['帣'],\r\n shuì: ['帨', '涗', '涚', '睡', '稅', '税', '裞'],\r\n 'chóu dào': ['帱', '幬'],\r\n 'jiǎn jiān sàn': ['帴'],\r\n 'shà qiè': ['帹'],\r\n 'qí jì': ['帺', '荠'],\r\n 'shān qiāo shēn': ['幓'],\r\n 'zhuàng chuáng': ['幢'],\r\n 'chān chàn': ['幨'],\r\n miè: [\r\n '幭',\r\n '懱',\r\n '搣',\r\n '滅',\r\n '灭',\r\n '烕',\r\n '礣',\r\n '篾',\r\n '蔑',\r\n '薎',\r\n '蠛',\r\n '衊',\r\n '鑖',\r\n '鱴',\r\n '鴓',\r\n ],\r\n 'gān gàn': ['干'],\r\n 'bìng bīng': ['并', '幷'],\r\n 'jī jǐ': ['幾'],\r\n 'guǎng ān': ['广'],\r\n guǎng: ['広', '廣', '犷', '獷'],\r\n me: ['庅'],\r\n 'dùn tún': ['庉'],\r\n 'bài tīng': ['庍'],\r\n 'yìng yīng': ['应'],\r\n 'dǐ de': ['底'],\r\n 'dù duó': ['度'],\r\n 'máng méng páng': ['庬'],\r\n 'bìng píng': ['庰'],\r\n chěng: ['庱', '悜', '睈', '逞', '騁', '骋'],\r\n 'jī cuò': ['庴'],\r\n qǐng: ['庼', '廎', '檾', '漀', '苘', '請', '謦', '请', '頃', '顷'],\r\n 'guī wěi huì': ['廆'],\r\n 'jǐn qín': ['廑'],\r\n kuò: [\r\n '廓',\r\n '扩',\r\n '拡',\r\n '擴',\r\n '濶',\r\n '筈',\r\n '萿',\r\n '葀',\r\n '蛞',\r\n '闊',\r\n '阔',\r\n '霩',\r\n '鞟',\r\n '鞹',\r\n '韕',\r\n '頢',\r\n '鬠',\r\n ],\r\n 'qiáng sè': ['廧', '薔'],\r\n 'yǐn yìn': ['廴', '隐', '隠', '隱', '飮', '飲', '饮'],\r\n 'pò pǎi': ['廹', '迫'],\r\n 'nòng lòng': ['弄'],\r\n 'dì tì tuí': ['弟'],\r\n 'jué zhāng': ['弡'],\r\n 'mí mǐ': ['弥', '彌', '靡'],\r\n chāo: ['弨', '怊', '抄', '欩', '訬', '超', '鈔', '钞'],\r\n yi: ['弬'],\r\n shāo: [\r\n '弰',\r\n '旓',\r\n '烧',\r\n '焼',\r\n '燒',\r\n '筲',\r\n '艄',\r\n '萷',\r\n '蕱',\r\n '輎',\r\n '髾',\r\n '鮹',\r\n ],\r\n 'xuān yuān': ['弲'],\r\n 'qiáng qiǎng jiàng': ['強', '强'],\r\n 'tán dàn': ['弹', '醈'],\r\n biè: ['彆'],\r\n 'qiáng jiàng qiǎng': ['彊'],\r\n 'jì xuě': ['彐'],\r\n tuàn: ['彖', '褖'],\r\n yuē: ['彟', '曰', '曱', '矱'],\r\n 'shān xiǎn': ['彡'],\r\n wén: [\r\n '彣',\r\n '文',\r\n '炆',\r\n '珳',\r\n '瘒',\r\n '繧',\r\n '聞',\r\n '芠',\r\n '蚉',\r\n '蚊',\r\n '螡',\r\n '蟁',\r\n '閺',\r\n '閿',\r\n '闅',\r\n '闦',\r\n '闻',\r\n '阌',\r\n '雯',\r\n '馼',\r\n '駇',\r\n '魰',\r\n '鳼',\r\n '鴍',\r\n '鼤',\r\n '𫘜',\r\n ],\r\n 'péng bāng': ['彭'],\r\n 'piāo piào': ['彯'],\r\n 'zhuó bó': ['彴'],\r\n 'tuǒ yí': ['彵'],\r\n 'páng fǎng': ['彷'],\r\n wǎng: [\r\n '彺',\r\n '往',\r\n '徃',\r\n '惘',\r\n '枉',\r\n '棢',\r\n '網',\r\n '网',\r\n '罒',\r\n '罓',\r\n '罔',\r\n '罖',\r\n '菵',\r\n '蛧',\r\n '蝄',\r\n '誷',\r\n '輞',\r\n '辋',\r\n '魍',\r\n ],\r\n cú: ['徂', '殂'],\r\n 'dài dāi': ['待'],\r\n huái: ['徊', '怀', '懐', '懷', '槐', '淮', '耲', '蘹', '褢', '褱', '踝'],\r\n 'wā wàng jiā': ['徍'],\r\n 'chěng zhèng': ['徎'],\r\n 'dé děi de': ['得'],\r\n 'cóng zòng': ['從'],\r\n 'shì tǐ': ['徥'],\r\n 'tí chí': ['徲', '鶗', '鶙'],\r\n dé: ['徳', '德', '恴', '悳', '惪', '淂', '鍀', '锝'],\r\n 'zhǐ zhēng': ['徴', '徵'],\r\n bié: ['徶', '癿', '莂', '蛂', '襒', '蹩'],\r\n 'chōng zhǒng': ['徸'],\r\n 'jiǎo jiào': ['徼', '笅', '筊'],\r\n 'lòng lǒng': ['徿'],\r\n 'qú jù': ['忂', '渠', '瞿', '螶'],\r\n 'dìng tìng': ['忊'],\r\n gǎi: ['忋', '改'],\r\n rěn: ['忍', '栠', '栣', '秹', '稔', '綛', '荏', '荵', '躵'],\r\n chàn: ['忏', '懴', '懺', '硟', '羼', '韂', '顫'],\r\n tè: ['忑', '慝', '特', '蟘', '鋱', '铽'],\r\n 'tè tēi tuī': ['忒'],\r\n 'gān hàn': ['忓', '攼'],\r\n 'yì qì': ['忔'],\r\n 'tài shì': ['忕'],\r\n 'xī liě': ['忚'],\r\n 'yīng yìng': ['応', '應', '譍'],\r\n 'mǐn wěn mín': ['忞', '忟'],\r\n 'sōng zhōng': ['忪'],\r\n 'yù shū': ['忬', '悆'],\r\n 'qí shì': ['忯', '耆'],\r\n 'tún zhūn dùn': ['忳'],\r\n 'qián qín': ['忴', '扲'],\r\n hún: ['忶', '浑', '渾', '餛', '馄', '魂', '鼲'],\r\n niǔ: ['忸', '扭', '炄', '狃', '紐', '纽', '莥', '鈕', '钮', '靵'],\r\n 'kuáng wǎng': ['忹'],\r\n 'kāng hàng': ['忼'],\r\n 'kài xì': ['忾', '愾'],\r\n òu: ['怄', '慪'],\r\n 'bǎo bào': ['怉'],\r\n 'mín mén': ['怋'],\r\n 'zuò zhà': ['怍'],\r\n zěn: ['怎'],\r\n yàng: ['怏', '恙', '样', '様', '樣', '漾', '羕', '詇'],\r\n 'kòu jù': ['怐'],\r\n 'náo niú': ['怓'],\r\n 'zhēng zhèng': ['怔', '掙', '钲', '铮'],\r\n 'tiē zhān': ['怗'],\r\n 'hù gù': ['怘'],\r\n 'cū jù zū': ['怚'],\r\n 'sī sāi': ['思'],\r\n 'yóu chóu': ['怞'],\r\n 'tū dié': ['怢'],\r\n 'yōu yào': ['怮'],\r\n xuàn: [\r\n '怰',\r\n '昡',\r\n '楦',\r\n '泫',\r\n '渲',\r\n '炫',\r\n '琄',\r\n '眩',\r\n '碹',\r\n '絢',\r\n '縼',\r\n '繏',\r\n '绚',\r\n '蔙',\r\n '衒',\r\n '袨',\r\n '贙',\r\n '鉉',\r\n '鏇',\r\n '铉',\r\n '镟',\r\n '颴',\r\n ],\r\n 'xù xuè': ['怴'],\r\n 'bì pī': ['怶'],\r\n 'xī shù': ['怸'],\r\n 'nèn nín': ['恁'],\r\n 'tiāo yáo': ['恌'],\r\n 'xī qī xù': ['恓'],\r\n 'xiào jiǎo': ['恔'],\r\n 'hū kuā': ['恗'],\r\n nǜ: ['恧', '朒', '衂', '衄'],\r\n hèn: ['恨'],\r\n 'dòng tōng': ['恫'],\r\n 'quán zhuān': ['恮'],\r\n 'è wù ě wū': ['恶', '惡'],\r\n tòng: ['恸', '慟', '憅', '痛', '衕'],\r\n 'yuān juàn': ['悁'],\r\n 'qiāo qiǎo': ['悄'],\r\n 'jiè kè': ['悈'],\r\n 'hào jiào': ['悎'],\r\n huǐ: ['悔', '檓', '毀', '毁', '毇', '燬', '譭'],\r\n 'mán mèn': ['悗', '鞔'],\r\n 'yī yì': ['悘', '衣'],\r\n quān: ['悛', '箞', '鐉', '𨟠'],\r\n 'kuī lǐ': ['悝'],\r\n 'yì niàn': ['悥'],\r\n 'mèn mēn': ['悶'],\r\n guàn: [\r\n '悹',\r\n '悺',\r\n '惯',\r\n '慣',\r\n '掼',\r\n '摜',\r\n '樌',\r\n '欟',\r\n '泴',\r\n '涫',\r\n '潅',\r\n '灌',\r\n '爟',\r\n '瓘',\r\n '盥',\r\n '礶',\r\n '祼',\r\n '罆',\r\n '罐',\r\n '貫',\r\n '贯',\r\n '躀',\r\n '遦',\r\n '鏆',\r\n '鑵',\r\n '鱹',\r\n '鸛',\r\n '鹳',\r\n ],\r\n 'kōng kǒng': ['悾'],\r\n 'lǔn lùn': ['惀'],\r\n guǒ: [\r\n '惈',\r\n '果',\r\n '椁',\r\n '槨',\r\n '粿',\r\n '綶',\r\n '菓',\r\n '蜾',\r\n '裹',\r\n '褁',\r\n '輠',\r\n '餜',\r\n '馃',\r\n ],\r\n 'yuān wǎn': ['惌', '箢'],\r\n 'lán lín': ['惏'],\r\n 'yù xù': ['惐', '淢'],\r\n 'chuò chuì': ['惙'],\r\n 'hūn mèn': ['惛'],\r\n 'chǎng tǎng': ['惝'],\r\n 'suǒ ruǐ': ['惢'],\r\n cǎn: ['惨', '慘', '憯', '黪', '黲', '䅟'],\r\n cán: ['惭', '慙', '慚', '残', '殘', '蚕', '蝅', '蠶', '蠺'],\r\n 'dàn dá': ['惮', '憚'],\r\n rě: ['惹'],\r\n 'yú tōu': ['愉'],\r\n 'kài qì': ['愒'],\r\n 'dàng táng shāng yáng': ['愓'],\r\n 'chén xìn dān': ['愖'],\r\n 'kè qià': ['愘'],\r\n nuò: [\r\n '愞',\r\n '懦',\r\n '懧',\r\n '掿',\r\n '搦',\r\n '榒',\r\n '稬',\r\n '穤',\r\n '糑',\r\n '糥',\r\n '糯',\r\n '諾',\r\n '诺',\r\n '蹃',\r\n '逽',\r\n '鍩',\r\n '锘',\r\n ],\r\n gǎn: [\r\n '感',\r\n '擀',\r\n '敢',\r\n '桿',\r\n '橄',\r\n '澉',\r\n '澸',\r\n '皯',\r\n '秆',\r\n '稈',\r\n '笴',\r\n '芉',\r\n '衦',\r\n '赶',\r\n '趕',\r\n '鱤',\r\n '鳡',\r\n ],\r\n 'còng sōng': ['愡'],\r\n 'sāi sī sǐ': ['愢'],\r\n 'gōng gòng hǒng': ['愩', '慐'],\r\n 'shuò sù': ['愬', '洬'],\r\n 'yáo yào': ['愮'],\r\n huàng: ['愰', '曂', '榥', '滉', '皝', '皩', '鎤', '㿠'],\r\n zhěng: ['愸', '抍', '拯', '整', '晸'],\r\n cǎo: ['愺', '艸', '草', '騲'],\r\n 'xì xié': ['慀'],\r\n 'cǎo sāo': ['慅'],\r\n 'xù chù': ['慉'],\r\n 'qiè qiàn': ['慊'],\r\n 'cáo cóng': ['慒'],\r\n 'ào áo': ['慠'],\r\n 'lián liǎn': ['慩', '梿', '槤', '櫣'],\r\n 'jìn qín jǐn': ['慬'],\r\n 'dì chì': ['慸'],\r\n 'zhí zhé': ['慹'],\r\n 'lóu lǚ': ['慺', '鷜'],\r\n còng: ['憁', '謥'],\r\n 'zhī zhì': ['憄', '知', '織', '织'],\r\n chēng: [\r\n '憆',\r\n '摚',\r\n '撐',\r\n '撑',\r\n '晿',\r\n '柽',\r\n '棦',\r\n '橕',\r\n '檉',\r\n '泟',\r\n '浾',\r\n '琤',\r\n '瞠',\r\n '碀',\r\n '緽',\r\n '罉',\r\n '蛏',\r\n '蟶',\r\n '赪',\r\n '赬',\r\n '鏿',\r\n '鐣',\r\n '阷',\r\n '靗',\r\n '頳',\r\n '饓',\r\n ],\r\n biē: ['憋', '虌', '鱉', '鳖', '鼈', '龞'],\r\n 'chéng dèng zhèng': ['憕'],\r\n 'xǐ xī': ['憘'],\r\n 'duì dùn tūn': ['憞'],\r\n 'xiāo jiāo': ['憢'],\r\n 'xián xiàn': ['憪'],\r\n 'liáo liǎo': ['憭', '燎', '爎', '爒'],\r\n shéng: ['憴', '縄', '繉', '繩', '绳', '譝'],\r\n 'náo nǎo náng': ['憹'],\r\n 'jǐng jìng': ['憼'],\r\n 'jǐ jiǎo': ['憿'],\r\n 'xuān huān': ['懁'],\r\n 'cǎo sāo sào': ['懆'],\r\n mèn: ['懑', '懣', '暪', '焖', '燜'],\r\n 'mèng méng měng': ['懜'],\r\n 'ài yì nǐ': ['懝'],\r\n 'méng měng': ['懞', '瞢', '矒'],\r\n 'qí jī jì': ['懠'],\r\n mǒ: ['懡'],\r\n 'lán xiàn': ['懢'],\r\n 'yōu yǒu': ['懮'],\r\n 'liú liǔ': ['懰', '藰'],\r\n ràng: ['懹', '譲', '讓', '让'],\r\n huān: ['懽', '欢', '歓', '歡', '獾', '讙', '貛', '酄', '驩', '鴅', '鵍'],\r\n nǎn: ['戁', '揇', '湳', '煵', '腩', '蝻', '赧'],\r\n 'mí mó': ['戂'],\r\n 'gàng zhuàng': ['戅', '戆'],\r\n 'zhuàng gàng': ['戇'],\r\n 'xū qu': ['戌'],\r\n 'xì hū': ['戏', '戯', '戲'],\r\n 'jiá gā': ['戛'],\r\n zéi: ['戝', '蠈', '賊', '贼', '鰂', '鱡', '鲗'],\r\n děng: ['戥', '等'],\r\n 'hū xì': ['戱'],\r\n chuō: ['戳', '踔', '逴'],\r\n 'biǎn piān': ['扁'],\r\n 'shǎng jiōng': ['扄'],\r\n 'shàn shān': ['扇'],\r\n cái: ['才', '材', '纔', '裁', '財', '财'],\r\n 'zhā zā zhá': ['扎'],\r\n 'lè lì cái': ['扐'],\r\n 'bā pá': ['扒'],\r\n 'dǎ dá': ['打'],\r\n rēng: ['扔'],\r\n 'fǎn fú': ['払'],\r\n 'diǎo dí yuē lì': ['扚'],\r\n 'káng gāng': ['扛'],\r\n 'yū wū': ['扜'],\r\n 'yū wū kū': ['扝'],\r\n 'tuō chǐ yǐ': ['扡'],\r\n 'gǔ jié xì gē': ['扢'],\r\n dèn: ['扥', '扽'],\r\n 'sǎo sào': ['扫', '掃'],\r\n rǎo: ['扰', '擾', '隢'],\r\n 'xī chā qì': ['扱'],\r\n 'bān pān': ['扳'],\r\n 'bā ào': ['扷'],\r\n 'xī zhé': ['扸'],\r\n 'zhì sǔn kǎn': ['扻'],\r\n zhǎo: ['找', '沼', '瑵'],\r\n 'kuáng wǎng zài': ['抂'],\r\n 'hú gǔ': ['抇', '鹄', '鹘'],\r\n 'bǎ bà': ['把'],\r\n 'dǎn shěn': ['抌'],\r\n 'nè nì ruì nà': ['抐'],\r\n zhuā: ['抓', '檛', '簻', '膼', '髽'],\r\n póu: ['抔', '裒'],\r\n 'zhé shé zhē': ['折'],\r\n 'póu pōu fū': ['抙', '捊'],\r\n pāo: ['抛', '拋', '脬', '萢'],\r\n 'ǎo ào niù': ['抝'],\r\n 'lūn lún': ['抡', '掄'],\r\n 'qiǎng qiāng chēng': ['抢'],\r\n 'zhǐ zhǎi': ['抧'],\r\n 'bù pū': ['抪', '柨'],\r\n 'yǎo tāo': ['抭'],\r\n 'hē hè qiā': ['抲'],\r\n 'nǐ ní': ['抳'],\r\n 'pī pēi': ['抷'],\r\n 'mǒ mò mā': ['抹'],\r\n chōu: ['抽', '犨', '犫', '瘳', '篘'],\r\n 'jiā yá': ['拁'],\r\n 'fú bì': ['拂', '畐', '鶝'],\r\n zhǎ: ['拃', '眨', '砟', '鮺', '鲝'],\r\n 'dān dàn dǎn': ['担'],\r\n 'chāi cā': ['拆'],\r\n niān: ['拈', '蔫'],\r\n 'lā lá lǎ là': ['拉'],\r\n 'bàn pàn': ['拌'],\r\n pāi: ['拍'],\r\n līn: ['拎'],\r\n guǎi: ['拐', '枴', '柺'],\r\n 'tuò tà zhí': ['拓'],\r\n 'ào ǎo niù': ['拗'],\r\n 'jū gōu': ['拘'],\r\n 'pīn pàn fān': ['拚'],\r\n 'bài bái': ['拜'],\r\n bài: ['拝', '敗', '稗', '粺', '薭', '贁', '败', '韛'],\r\n qiá: ['拤'],\r\n 'nǐng níng nìng': ['拧'],\r\n 'zé zhái': ['择', '擇'],\r\n hén: ['拫', '痕', '鞎'],\r\n 'kuò guā': ['括'],\r\n 'jié jiá': ['拮'],\r\n nǐn: ['拰'],\r\n shuān: ['拴', '栓', '閂', '闩'],\r\n 'cún zùn': ['拵'],\r\n 'zā zǎn': ['拶', '桚'],\r\n kǎo: ['拷', '攷', '栲', '烤', '考'],\r\n 'yí chǐ hài': ['拸'],\r\n 'cè sè chuò': ['拺'],\r\n 'zhuài zhuāi yè': ['拽'],\r\n 'shí shè': ['拾'],\r\n bāi: ['挀', '掰'],\r\n 'kuò guāng': ['挄'],\r\n nòng: ['挊', '挵', '齈'],\r\n 'jiào jiāo': ['挍', '敎', '教'],\r\n 'kuà kū': ['挎'],\r\n 'ná rú': ['挐'],\r\n 'tiāo tiǎo': ['挑'],\r\n 'dié shè': ['挕'],\r\n liě: ['挘', '毟'],\r\n 'yà yǎ': ['挜', '掗'],\r\n 'wō zhuā': ['挝'],\r\n 'xié jiā': ['挟', '挾'],\r\n 'dǎng dàng': ['挡', '擋'],\r\n 'zhèng zhēng': ['挣', '正', '症'],\r\n 'āi ái': ['挨'],\r\n 'tuō shuì': ['挩', '捝'],\r\n 'tǐ tì': ['挮'],\r\n 'suō shā': ['挱'],\r\n 'sā shā suō': ['挲'],\r\n 'kēng qiān': ['挳', '摼'],\r\n 'bàng péng': ['挷'],\r\n 'ruó ruá': ['挼'],\r\n 'jiǎo kù': ['捁'],\r\n 'wǔ wú': ['捂'],\r\n tǒng: ['捅', '桶', '筒', '筩', '統', '綂', '统', '㛚'],\r\n 'huò chì': ['捇'],\r\n 'tú shū chá': ['捈'],\r\n 'lǚ luō': ['捋'],\r\n 'shāo shào': ['捎', '稍'],\r\n niē: ['捏', '揑'],\r\n 'shù sǒng sōu': ['捒'],\r\n 'yé yú': ['捓'],\r\n 'jué zhuó': ['捔'],\r\n 'bù pú zhì': ['捗'],\r\n zùn: ['捘', '銌'],\r\n lāo: ['捞', '撈', '粩'],\r\n sǔn: ['损', '損', '榫', '笋', '筍', '箰', '鎨', '隼'],\r\n 'wàn wǎn wān yù': ['捥'],\r\n pěng: ['捧', '淎', '皏'],\r\n shě: ['捨'],\r\n 'fǔ fù bǔ': ['捬'],\r\n dáo: ['捯'],\r\n 'luò luǒ wǒ': ['捰'],\r\n 'juǎn quán': ['捲'],\r\n 'chēn tiǎn': ['捵'],\r\n 'niǎn niē': ['捻'],\r\n 'ruó wěi ré': ['捼'],\r\n zuó: ['捽', '昨', '秨', '稓', '筰', '莋', '鈼'],\r\n 'wò xiá': ['捾'],\r\n 'qìng qiàn': ['掅'],\r\n 'póu pǒu': ['掊'],\r\n qiā: ['掐', '葜'],\r\n 'pái pǎi': ['排'],\r\n 'qiān wàn': ['掔'],\r\n 'yè yē': ['掖'],\r\n 'niè nǐ yì': ['掜'],\r\n 'huò xù': ['掝'],\r\n 'yàn shàn yǎn': ['掞'],\r\n 'zhěng dìng': ['掟'],\r\n kòng: ['控', '鞚'],\r\n tuī: ['推', '蓷', '藬'],\r\n 'zōu zhōu chōu': ['掫'],\r\n tiàn: ['掭', '舚'],\r\n kèn: ['掯', '裉', '褃'],\r\n pá: ['掱', '杷', '潖', '爬', '琶', '筢'],\r\n 'guó guāi': ['掴'],\r\n 'dǎn shàn': ['掸', '撣'],\r\n 'chān xiān càn shǎn': ['掺'],\r\n sāo: ['掻', '搔', '溞', '繅', '缫', '螦', '騒', '騷', '鰠', '鱢', '鳋'],\r\n pèng: ['掽', '椪', '槰', '碰', '踫'],\r\n 'zhēng kēng': ['揁'],\r\n 'jiū yóu': ['揂'],\r\n 'jiān jiǎn': ['揃', '籛'],\r\n 'pì chè': ['揊'],\r\n 'sāi zǒng cāi': ['揌'],\r\n 'tí dī dǐ': ['提'],\r\n 'zǒng sōng': ['揔'],\r\n 'huáng yóng': ['揘'],\r\n 'zǎn zuàn': ['揝'],\r\n 'xū jū': ['揟'],\r\n 'ké qiā': ['揢'],\r\n 'chuāi chuǎi chuài tuán zhuī': ['揣'],\r\n 'dì tì': ['揥'],\r\n 'lá là': ['揦'],\r\n là: [\r\n '揧',\r\n '楋',\r\n '溂',\r\n '瓎',\r\n '瘌',\r\n '翋',\r\n '臘',\r\n '蝋',\r\n '蝲',\r\n '蠟',\r\n '辢',\r\n '辣',\r\n '鑞',\r\n '镴',\r\n '鬎',\r\n '鯻',\r\n '𬶟',\r\n ],\r\n 'jiē qì': ['揭'],\r\n 'chòng dǒng': ['揰'],\r\n 'dié shé yè': ['揲'],\r\n 'jiàn qián jiǎn': ['揵'],\r\n yé: ['揶', '爷', '爺', '瑘', '鋣', '鎁', '铘'],\r\n chān: ['搀', '摻', '攙', '裧', '襜', '覘', '觇', '辿', '鋓'],\r\n 'gē gé': ['搁', '擱'],\r\n 'lǒu lōu': ['搂', '摟'],\r\n 'chōu zǒu': ['搊'],\r\n chuāi: ['搋'],\r\n sūn: ['搎', '槂', '狲', '猻', '荪', '蓀', '蕵', '薞', '飧', '飱'],\r\n 'róng náng nǎng': ['搑'],\r\n 'péng bàng': ['搒'],\r\n cuō: ['搓', '瑳', '磋', '蹉', '遳', '醝'],\r\n 'kē è': ['搕'],\r\n 'nù nuò nòu': ['搙'],\r\n 'lā xié xiàn': ['搚'],\r\n qiǔ: ['搝', '糗'],\r\n 'xiǎn xiān': ['搟'],\r\n 'jié zhé': ['搩'],\r\n 'pán bān pó': ['搫'],\r\n bān: [\r\n '搬',\r\n '攽',\r\n '斑',\r\n '斒',\r\n '班',\r\n '瘢',\r\n '癍',\r\n '肦',\r\n '螁',\r\n '螌',\r\n '褩',\r\n '辬',\r\n '頒',\r\n '颁',\r\n '𨭉',\r\n ],\r\n 'zhì nái': ['搱'],\r\n 'wā wǎ wà': ['搲'],\r\n huá: ['搳', '撶', '滑', '猾', '蕐', '螖', '譁', '鏵', '铧', '驊', '骅', '鷨'],\r\n 'qiāng qiǎng chēng': ['搶'],\r\n 'tián shēn': ['搷'],\r\n 'ná nuò': ['搻'],\r\n èn: ['摁'],\r\n 'shè niè': ['摄', '攝'],\r\n bìn: ['摈', '擯', '殡', '殯', '膑', '臏', '髌', '髕', '髩', '鬂', '鬓', '鬢'],\r\n 'shā sà shǎi': ['摋'],\r\n 'chǎn sùn': ['摌'],\r\n 'jiū liú liáo jiǎo náo': ['摎'],\r\n 'féng pěng': ['摓'],\r\n shuāi: ['摔'],\r\n 'dì tú zhí': ['摕'],\r\n 'qì jì chá': ['摖'],\r\n 'sōu sǒng': ['摗'],\r\n 'liǎn liàn': ['摙'],\r\n 'gài xì': ['摡'],\r\n 'hù chū': ['摢'],\r\n tàng: ['摥', '烫', '燙', '鐋'],\r\n 'nái zhì': ['摨'],\r\n 'mó mā': ['摩'],\r\n 'jiāng qiàng': ['摪'],\r\n 'áo qiáo': ['摮'],\r\n 'niè chè': ['摰'],\r\n 'mán màn': ['摱'],\r\n 'chàn cán': ['摲'],\r\n 'sè mí sù': ['摵'],\r\n 'biāo biào': ['摽'],\r\n 'juē jué': ['撅'],\r\n piē: ['撆', '暼', '氕', '瞥'],\r\n 'piě piē': ['撇'],\r\n 'zǎn zān zēn qián': ['撍'],\r\n 'sā sǎ': ['撒'],\r\n hòng: ['撔', '訌', '讧', '闀', '鬨'],\r\n 'héng guàng': ['撗'],\r\n niǎn: [\r\n '撚',\r\n '撵',\r\n '攆',\r\n '涊',\r\n '焾',\r\n '碾',\r\n '簐',\r\n '蹍',\r\n '蹨',\r\n '躎',\r\n '輦',\r\n '辇',\r\n ],\r\n 'chéng zhěng': ['撜'],\r\n 'huī wéi': ['撝'],\r\n cāo: ['撡', '操', '糙'],\r\n 'xiāo sōu': ['撨'],\r\n 'liáo liāo': ['撩'],\r\n 'cuō zuǒ': ['撮'],\r\n 'wěi tuǒ': ['撱'],\r\n cuān: ['撺', '攛', '汆', '蹿', '躥', '鑹', '镩'],\r\n 'qiào yāo jī': ['撽'],\r\n 'zhuā wō': ['撾'],\r\n 'lèi léi': ['擂'],\r\n nǎng: ['擃', '攮', '曩', '灢'],\r\n 'qíng jǐng': ['擏'],\r\n kuǎi: ['擓', '蒯', '㧟'],\r\n 'pǐ bò': ['擗'],\r\n 'bò bāi': ['擘'],\r\n 'jù jǐ': ['據'],\r\n mēng: ['擝'],\r\n 'sǒu sòu': ['擞'],\r\n xǐng: ['擤', '箵', '醒'],\r\n cā: ['擦'],\r\n 'níng nǐng nìng': ['擰'],\r\n 'zhì jié': ['擳'],\r\n 'là liè': ['擸', '爉'],\r\n 'sòu sǒu': ['擻'],\r\n 'lì luò yuè': ['擽'],\r\n 'tī zhāi zhì': ['擿'],\r\n pān: ['攀', '潘', '眅', '萠'],\r\n lèi: [\r\n '攂',\r\n '泪',\r\n '涙',\r\n '淚',\r\n '禷',\r\n '类',\r\n '纇',\r\n '蘱',\r\n '酹',\r\n '銇',\r\n '錑',\r\n '頛',\r\n '頪',\r\n '類',\r\n '颣',\r\n ],\r\n 'cā sǎ': ['攃'],\r\n 'jùn pèi': ['攈'],\r\n 'lì luò': ['攊', '躒'],\r\n 'là lài': ['攋', '櫴'],\r\n 'lú luó': ['攎'],\r\n 'zǎn cuán': ['攒'],\r\n 'xiān jiān': ['攕'],\r\n 'mí mǐ mó': ['攠'],\r\n 'zǎn cuán zàn zuān': ['攢'],\r\n zuàn: ['攥'],\r\n 'lì shài': ['攦'],\r\n 'lì luǒ': ['攭'],\r\n 'guǐ guì': ['攱'],\r\n 'jī qī yǐ': ['攲'],\r\n fàng: ['放'],\r\n 'wù móu': ['敄'],\r\n 'chù shōu': ['敊'],\r\n 'gé guó è': ['敋'],\r\n 'duó duì': ['敓', '敚'],\r\n 'duō què': ['敠', '敪'],\r\n 'sàn sǎn': ['散'],\r\n 'dūn duì': ['敦', '镦'],\r\n 'qī yǐ jī': ['敧'],\r\n 'xiào xué': ['敩'],\r\n 'shù shǔ shuò': ['数', '數'],\r\n 'ái zhú': ['敱', '敳'],\r\n 'xiòng xuàn': ['敻'],\r\n 'zhuó zhú': ['斀'],\r\n 'yì dù': ['斁'],\r\n 'lí tái': ['斄'],\r\n 'fěi fēi': ['斐'],\r\n 'yǔ zhōng': ['斔'],\r\n 'dòu dǒu': ['斗'],\r\n 'wò guǎn': ['斡'],\r\n 'tǒu tiǎo': ['斢'],\r\n dòu: [\r\n '斣',\r\n '梪',\r\n '浢',\r\n '痘',\r\n '窦',\r\n '竇',\r\n '脰',\r\n '荳',\r\n '豆',\r\n '逗',\r\n '郖',\r\n '酘',\r\n '閗',\r\n '闘',\r\n '餖',\r\n '饾',\r\n '鬥',\r\n '鬦',\r\n '鬪',\r\n '鬬',\r\n '鬭',\r\n ],\r\n 'yín zhì': ['斦'],\r\n 'chǎn jiè': ['斺'],\r\n 'wū yū yú': ['於'],\r\n 'yóu liú': ['斿'],\r\n 'páng bàng': ['旁'],\r\n 'máo mào': ['旄'],\r\n 'pī bì': ['旇'],\r\n 'xuán xuàn': ['旋'],\r\n 'wú mó': ['无'],\r\n zǎo: ['早', '枣', '栆', '棗', '澡', '璪', '薻', '藻', '蚤'],\r\n gā: ['旮'],\r\n 'gàn hàn': ['旰'],\r\n 'tái yīng': ['旲'],\r\n 'xū xù': ['旴'],\r\n 'tūn zhùn': ['旽'],\r\n 'wù wǔ': ['旿'],\r\n 'pò pèi': ['昢'],\r\n zòng: ['昮', '猔', '疭', '瘲', '粽', '糉', '糭', '縦'],\r\n ǎi: ['昹', '毐', '矮', '蔼', '藹', '譪', '躷', '霭', '靄'],\r\n 'huàng huǎng': ['晃'],\r\n xuǎn: ['晅', '癣', '癬', '选', '選'],\r\n 'xù kuā': ['晇'],\r\n hǒng: ['晎'],\r\n shài: ['晒', '曬'],\r\n 'yūn yùn': ['晕', '煴'],\r\n 'shèng chéng': ['晟', '椉', '盛'],\r\n 'jǐng yǐng': ['景'],\r\n shǎn: ['晱', '熌', '睒', '覢', '閃', '闪', '陕', '陝'],\r\n 'qǐ dù': ['晵'],\r\n 'ǎn àn yǎn': ['晻'],\r\n 'wǎng wàng': ['暀'],\r\n zàn: [\r\n '暂',\r\n '暫',\r\n '瓉',\r\n '瓒',\r\n '瓚',\r\n '禶',\r\n '襸',\r\n '讃',\r\n '讚',\r\n '賛',\r\n '贊',\r\n '赞',\r\n '蹔',\r\n '鄼',\r\n '錾',\r\n '鏨',\r\n '饡',\r\n ],\r\n 'yùn yūn': ['暈'],\r\n 'mín mǐn': ['暋'],\r\n 'dǔ shǔ': ['暏'],\r\n shǔ: [\r\n '暑',\r\n '曙',\r\n '潻',\r\n '癙',\r\n '糬',\r\n '署',\r\n '薥',\r\n '薯',\r\n '藷',\r\n '蜀',\r\n '蠴',\r\n '襡',\r\n '襩',\r\n '鱪',\r\n '鱰',\r\n '黍',\r\n '鼠',\r\n '鼡',\r\n ],\r\n 'jiǎn lán': ['暕'],\r\n nuǎn: ['暖', '煗', '餪'],\r\n 'bào pù': ['暴'],\r\n 'xī xǐ': ['暿'],\r\n 'pù bào': ['曝', '瀑'],\r\n 'qū qǔ': ['紶'],\r\n 'qǔ qū': ['曲'],\r\n 'gèng gēng': ['更'],\r\n 'hū hù': ['曶', '雽'],\r\n 'zēng céng': ['曽', '橧'],\r\n 'céng zēng': ['曾', '竲'],\r\n 'cǎn qián jiàn': ['朁'],\r\n 'qiè hé': ['朅'],\r\n 'bì pí': ['朇', '禆', '笓', '裨'],\r\n 'yǒu yòu': ['有'],\r\n 'bān fén': ['朌', '鳻'],\r\n 'fú fù': ['服', '洑'],\r\n 'fěi kū': ['朏', '胐'],\r\n 'qú xù chǔn': ['朐'],\r\n 'juān zuī': ['朘'],\r\n 'huāng máng wáng': ['朚'],\r\n 'qī jī': ['期'],\r\n 'tóng chuáng': ['朣', '橦'],\r\n zhá: ['札', '牐', '箚', '蚻', '譗', '鍘', '铡', '閘', '闸'],\r\n 'zhú shù shú': ['朮'],\r\n 'shù shú zhú': ['术'],\r\n 'zhū shú': ['朱'],\r\n 'pǔ pò pō piáo': ['朴'],\r\n 'dāo tiáo mù': ['朷'],\r\n 'guǐ qiú': ['朹'],\r\n xiǔ: ['朽', '滫', '潃', '糔'],\r\n 'chéng chēng': ['朾'],\r\n zá: ['杂', '沯', '砸', '襍', '雑', '雜', '雥', '韴'],\r\n 'yú wū': ['杅'],\r\n 'gān gǎn': ['杆'],\r\n 'chā chà': ['杈'],\r\n 'shān shā': ['杉'],\r\n cūn: ['村', '皴', '竴', '膥', '踆', '邨'],\r\n 'rèn ér': ['杒', '梕'],\r\n 'sháo biāo': ['杓'],\r\n 'dì duò': ['杕', '枤'],\r\n 'gū gài': ['杚'],\r\n 'yí zhì lí duò': ['杝'],\r\n 'gàng gāng': ['杠'],\r\n 'tiáo tiāo': ['条', '條'],\r\n 'mà mǎ': ['杩'],\r\n 'sì zhǐ xǐ': ['杫'],\r\n 'yuán wán': ['杬', '蚖'],\r\n 'bèi fèi': ['杮'],\r\n 'shū duì': ['杸'],\r\n 'niǔ chǒu': ['杻'],\r\n 'wò yuè': ['枂', '臒'],\r\n máo: [\r\n '枆',\r\n '毛',\r\n '氂',\r\n '渵',\r\n '牦',\r\n '矛',\r\n '罞',\r\n '茅',\r\n '茆',\r\n '蝥',\r\n '蟊',\r\n '軞',\r\n '酕',\r\n '鉾',\r\n '錨',\r\n '锚',\r\n '髦',\r\n '鶜',\r\n ],\r\n 'pī mì': ['枈'],\r\n àng: ['枊', '盎', '醠'],\r\n 'fāng bìng': ['枋'],\r\n 'hù dǐ': ['枑'],\r\n xín: ['枔', '襑', '鐔', '鬵'],\r\n 'yāo yǎo': ['枖'],\r\n 'ě è': ['枙'],\r\n 'zhī qí': ['枝'],\r\n 'cōng zōng': ['枞', '樅'],\r\n 'xiān zhēn': ['枮'],\r\n 'tái sì': ['枱'],\r\n 'gǒu jǔ gōu': ['枸'],\r\n 'bāo fú': ['枹'],\r\n 'yì xiè': ['枻', '栧'],\r\n 'tuó duò': ['柁', '馱', '駄', '驮'],\r\n 'yí duò lí': ['柂'],\r\n 'nǐ chì': ['柅'],\r\n 'pán bàn': ['柈', '跘'],\r\n 'yǎng yàng yāng yīng': ['柍'],\r\n 'fù fū fǔ': ['柎'],\r\n 'bǎi bó bò': ['柏'],\r\n mǒu: ['某'],\r\n 'sháo shào': ['柖'],\r\n zhè: ['柘', '樜', '浙', '淛', '蔗', '蟅', '這', '鷓', '鹧', '䗪'],\r\n 'yòu yóu': ['柚', '櫾'],\r\n 'guì jǔ': ['柜'],\r\n 'zhà zuò': ['柞'],\r\n 'dié zhì': ['柣', '眰'],\r\n 'zhā zǔ zū': ['柤'],\r\n 'chá zhā': ['查', '査'],\r\n 'āo ào': ['柪', '軪'],\r\n 'bā fú pèi bó biē': ['柭'],\r\n 'duò zuó wù': ['柮'],\r\n 'bì bié': ['柲'],\r\n 'zhù chù': ['柷'],\r\n 'bēi pēi': ['柸'],\r\n 'shì fèi': ['柹'],\r\n 'shān zhà shi cè': ['栅'],\r\n 'lì yuè': ['栎', '櫟'],\r\n 'qì qiè': ['栔', '砌'],\r\n 'qī xī': ['栖', '蹊'],\r\n 'guā kuò': ['栝'],\r\n 'bīng bēn': ['栟'],\r\n 'xiào jiào': ['校'],\r\n 'jiàn zùn': ['栫', '袸'],\r\n 'yǒu yù': ['栯'],\r\n 'hé hú': ['核'],\r\n gēn: ['根', '跟'],\r\n 'zhī yì': ['栺'],\r\n 'gé gē': ['格'],\r\n 'héng háng': ['桁'],\r\n 'guàng guāng': ['桄'],\r\n 'yí tí': ['桋', '荑'],\r\n sāng: ['桑', '桒', '槡'],\r\n 'jú jié': ['桔'],\r\n 'yú móu': ['桙'],\r\n 'ráo náo': ['桡', '橈'],\r\n 'guì huì': ['桧', '檜'],\r\n 'chén zhèn': ['桭'],\r\n 'tīng yíng': ['桯'],\r\n 'bó po': ['桲'],\r\n 'bèn fàn': ['桳'],\r\n 'fēng fèng': ['桻', '葑'],\r\n 'sù yìn': ['梀'],\r\n 'tǐng tìng': ['梃'],\r\n 'xuān juān xié': ['梋'],\r\n 'tú chá': ['梌'],\r\n 'āo yòu': ['梎'],\r\n kuǎn: ['梡', '欵', '款', '歀'],\r\n 'shāo sào': ['梢'],\r\n 'qín chén cén': ['梣'],\r\n 'lí sì qǐ': ['梩'],\r\n 'chān yán': ['梴'],\r\n 'bīn bīng': ['梹', '槟', '檳'],\r\n 'táo chóu dào': ['梼'],\r\n 'cōng sōng': ['棇'],\r\n 'gùn hùn': ['棍'],\r\n 'dé zhé': ['棏'],\r\n 'pái bèi pèi': ['棑'],\r\n 'bàng pǒu bèi bēi': ['棓'],\r\n 'dì dài tì': ['棣'],\r\n sēn: ['森', '椮', '槮', '襂'],\r\n 'rěn shěn': ['棯'],\r\n 'léng lēng líng': ['棱'],\r\n 'fú sù': ['棴'],\r\n 'zōu sǒu': ['棷'],\r\n zōu: [\r\n '棸',\r\n '箃',\r\n '緅',\r\n '諏',\r\n '诹',\r\n '邹',\r\n '郰',\r\n '鄒',\r\n '鄹',\r\n '陬',\r\n '騶',\r\n '驺',\r\n '鯫',\r\n '鲰',\r\n '黀',\r\n '齱',\r\n '齺',\r\n ],\r\n 'zhào zhuō': ['棹'],\r\n 'chēn shēn': ['棽'],\r\n 'jiē qiè': ['椄'],\r\n 'yǐ yī': ['椅'],\r\n 'chóu zhòu diāo': ['椆'],\r\n 'qiāng kōng': ['椌'],\r\n 'zhuī chuí': ['椎'],\r\n 'bēi pí': ['椑'],\r\n mēn: ['椚'],\r\n 'quān juàn quán': ['椦'],\r\n 'duǒ chuán': ['椯'],\r\n 'wěi huī': ['椲'],\r\n 'jiǎ jiā': ['椵'],\r\n 'hán jiān': ['椷'],\r\n 'shèn zhēn': ['椹'],\r\n 'yàn yà': ['椻'],\r\n 'zhā chá': ['楂'],\r\n 'guō kuǎ': ['楇'],\r\n 'jí zhì': ['楖'],\r\n 'kǔ hù': ['楛'],\r\n 'yóu yǒu': ['楢'],\r\n 'sǒng cōng': ['楤'],\r\n 'yuán xuàn': ['楥'],\r\n 'yǎng yàng yīng': ['楧'],\r\n pián: ['楩', '胼', '腁', '賆', '蹁', '駢', '騈', '骈', '骿', '㛹'],\r\n 'dié yè': ['楪'],\r\n 'dùn shǔn': ['楯'],\r\n 'còu zòu': ['楱'],\r\n 'dì dǐ shì': ['楴'],\r\n 'kǎi jiē': ['楷'],\r\n 'róu ròu': ['楺'],\r\n 'lè yuè': ['楽'],\r\n 'wēn yùn': ['榅', '鞰'],\r\n lǘ: ['榈', '櫚', '氀', '膢', '藘', '閭', '闾', '驢', '驴'],\r\n shén: ['榊', '神', '鉮', '鰰', '𬬹'],\r\n 'bī pi': ['榌'],\r\n 'zhǎn niǎn zhèn': ['榐'],\r\n 'fú fù bó': ['榑'],\r\n 'jiàn jìn': ['榗'],\r\n 'bǎng bàng': ['榜'],\r\n 'shā xiè': ['榝', '樧'],\r\n nòu: ['槈', '耨', '鎒', '鐞'],\r\n 'qiǎn lián xiàn': ['槏'],\r\n gàng: ['槓', '焵', '焹', '筻', '鿍'],\r\n gāo: [\r\n '槔',\r\n '槹',\r\n '橰',\r\n '櫜',\r\n '睾',\r\n '篙',\r\n '糕',\r\n '羔',\r\n '臯',\r\n '韟',\r\n '餻',\r\n '高',\r\n '髙',\r\n '鷎',\r\n '鷱',\r\n '鼛',\r\n ],\r\n 'diān zhěn zhēn': ['槙'],\r\n 'kǎn jiàn': ['槛'],\r\n 'xí dié': ['槢'],\r\n 'jī guī': ['槣'],\r\n 'róng yōng': ['槦'],\r\n 'tuán shuàn quán': ['槫'],\r\n 'qì sè': ['槭'],\r\n 'cuī zhǐ': ['槯'],\r\n 'yǒu chǎo': ['槱'],\r\n 'màn wàn': ['槾'],\r\n 'lí chī': ['樆'],\r\n 'léi lěi': ['樏', '櫑', '礌'],\r\n 'cháo jiǎo chāo': ['樔'],\r\n 'chēng táng': ['樘'],\r\n 'jiū liáo': ['樛'],\r\n 'mó mú': ['模'],\r\n 'niǎo mù': ['樢'],\r\n 'héng hèng': ['横', '橫'],\r\n xuě: ['樰', '膤', '艝', '轌', '雪', '鱈', '鳕'],\r\n 'fá fèi': ['橃'],\r\n rùn: ['橍', '润', '潤', '膶', '閏', '閠', '闰'],\r\n 'zhǎn jiǎn': ['橏'],\r\n shùn: ['橓', '瞚', '瞬', '舜', '蕣', '順', '顺', '鬊'],\r\n 'tuí dūn': ['橔'],\r\n 'táng chēng': ['橖'],\r\n 'sù qiū': ['橚'],\r\n 'tán diàn': ['橝'],\r\n 'fén fèn fèi': ['橨'],\r\n 'rǎn yān': ['橪'],\r\n 'cū chu': ['橻'],\r\n 'shū qiāo': ['橾'],\r\n 'píng bò': ['檘'],\r\n 'zhái shì tú': ['檡'],\r\n 'biǎo biāo': ['檦'],\r\n 'qiān lián': ['檶'],\r\n 'nǐ mí': ['檷'],\r\n 'jiàn kǎn': ['檻'],\r\n 'nòu ruǎn rú': ['檽'],\r\n 'jī jì': ['櫅', '禨'],\r\n 'huǎng guǒ gǔ': ['櫎'],\r\n 'lǜ chū': ['櫖'],\r\n 'miè mèi': ['櫗'],\r\n ōu: [\r\n '櫙',\r\n '欧',\r\n '歐',\r\n '殴',\r\n '毆',\r\n '瓯',\r\n '甌',\r\n '膒',\r\n '藲',\r\n '謳',\r\n '讴',\r\n '鏂',\r\n '鴎',\r\n '鷗',\r\n '鸥',\r\n ],\r\n 'zhù zhuó': ['櫡'],\r\n 'jué jì': ['櫭'],\r\n 'huái guī': ['櫰'],\r\n 'chán zhàn': ['欃'],\r\n 'wéi zuì': ['欈'],\r\n cáng: ['欌', '鑶'],\r\n 'yù yì': ['欥'],\r\n 'chù qù xì': ['欪'],\r\n 'kài ài': ['欬'],\r\n 'yì yīn': ['欭'],\r\n 'xì kài': ['欯'],\r\n 'shuò sòu': ['欶'],\r\n 'ǎi ēi éi ěi èi ê̄ ế ê̌ ề': ['欸'],\r\n 'qī yī': ['欹'],\r\n 'chuā xū': ['欻'],\r\n 'chǐ chuài': ['欼'],\r\n 'kǎn qiàn': ['欿'],\r\n 'kǎn kè': ['歁'],\r\n 'chuǎn chuán': ['歂'],\r\n 'yīn yān': ['歅'],\r\n 'jìn qūn': ['歏'],\r\n pēn: ['歕'],\r\n 'xū chuā': ['歘'],\r\n 'xī shè': ['歙'],\r\n 'liǎn hān': ['歛'],\r\n 'zhì chí': ['歭'],\r\n 'sè shà': ['歰'],\r\n sǐ: ['死'],\r\n 'wěn mò': ['歾'],\r\n piǎo: ['殍', '皫', '瞟', '醥', '顠'],\r\n 'qíng jìng': ['殑'],\r\n 'fǒu bó': ['殕'],\r\n 'zhí shi': ['殖'],\r\n 'yè yān yàn': ['殗'],\r\n 'hūn mèi': ['殙'],\r\n chòu: ['殠', '臰', '遚'],\r\n 'kuì huì': ['殨', '溃', '潰'],\r\n cuàn: ['殩', '熶', '爨', '窜', '竄', '篡', '簒'],\r\n 'yīn yān yǐn': ['殷'],\r\n 'qìng kēng shēng': ['殸'],\r\n 'yáo xiáo xiào': ['殽'],\r\n 'gū gǔ': ['毂', '蛄'],\r\n 'guàn wān': ['毌'],\r\n 'dú dài': ['毒'],\r\n 'xún xùn': ['毥'],\r\n mú: ['毪', '氁'],\r\n 'dòu nuò': ['毭'],\r\n 'sāi suī': ['毸'],\r\n lu: ['氇'],\r\n sào: ['氉', '瘙', '矂', '髞'],\r\n 'shì zhī': ['氏'],\r\n 'dī dǐ': ['氐'],\r\n 'máng méng': ['氓'],\r\n 'yáng rì': ['氜'],\r\n shuǐ: ['水', '氵', '氺', '閖'],\r\n 'zhěng chéng zhèng': ['氶'],\r\n tǔn: ['氽'],\r\n 'fán fàn': ['氾'],\r\n 'guǐ jiǔ': ['氿'],\r\n 'bīn pà pā': ['汃'],\r\n 'zhuó què': ['汋'],\r\n 'dà tài': ['汏'],\r\n pìn: ['汖', '牝', '聘'],\r\n 'hàn hán': ['汗', '馯'],\r\n tu: ['汢'],\r\n 'tāng shāng': ['汤', '湯'],\r\n 'zhī jì': ['汥'],\r\n 'gàn hán cén': ['汵'],\r\n 'wèn mén': ['汶'],\r\n 'fāng pāng': ['汸'],\r\n 'hǔ huǎng': ['汻'],\r\n 'niú yóu': ['汼'],\r\n hàng: ['沆'],\r\n 'shěn chén': ['沈'],\r\n 'dùn zhuàn': ['沌'],\r\n 'nǜ niǔ': ['沑'],\r\n 'méi mò': ['沒', '没'],\r\n 'tà dá': ['沓'],\r\n 'mì wù': ['沕'],\r\n 'hóng pāng': ['沗'],\r\n 'shā shà': ['沙'],\r\n 'zhuǐ zǐ': ['沝'],\r\n 'ōu òu': ['沤', '漚'],\r\n 'jǔ jù': ['沮'],\r\n 'tuō duó': ['沰'],\r\n 'mǐ lì': ['沵'],\r\n 'yí chí': ['沶'],\r\n 'xiè yì': ['泄'],\r\n 'bó pō': ['泊'],\r\n 'mì bì': ['泌', '秘'],\r\n 'chù shè': ['泏'],\r\n 'yōu yòu āo': ['泑'],\r\n 'pēng píng': ['泙', '硑'],\r\n 'pào pāo': ['泡'],\r\n 'ní nì': ['泥', '秜'],\r\n 'yuè sà': ['泧'],\r\n 'jué xuè': ['泬', '疦'],\r\n 'lóng shuāng': ['泷', '瀧'],\r\n 'luò pō': ['泺', '濼'],\r\n 'zé shì': ['泽', '澤'],\r\n 'sǎ xǐ': ['洒'],\r\n 'sè qì zì': ['洓'],\r\n 'xǐ xiǎn': ['洗'],\r\n 'kǎo kào': ['洘'],\r\n 'àn yàn è': ['洝'],\r\n 'lěi lèi': ['洡'],\r\n 'qiè jié': ['洯'],\r\n 'qiǎn jiān': ['浅'],\r\n 'jì jǐ': ['济', '済', '濟', '纪'],\r\n 'hǔ xǔ': ['浒', '滸'],\r\n 'jùn xùn': ['浚', '濬'],\r\n 'yǐng chéng yíng': ['浧'],\r\n 'liàn lì': ['浰'],\r\n 'féng hóng': ['浲', '溄'],\r\n 'jiǒng jiōng': ['浻'],\r\n 'suī něi': ['浽'],\r\n 'yǒng chōng': ['涌'],\r\n 'tūn yūn': ['涒'],\r\n 'wō guō': ['涡', '渦'],\r\n hēng: ['涥', '脝'],\r\n 'zhǎng zhàng': ['涨', '漲'],\r\n 'shòu tāo': ['涭'],\r\n shuàn: ['涮', '腨'],\r\n 'kōng náng': ['涳'],\r\n 'wò wǎn yuān': ['涴'],\r\n 'tuō tuò': ['涶'],\r\n wō: ['涹', '猧', '窝', '窩', '莴', '萵', '蜗', '蝸', '踒'],\r\n 'qiè jí': ['淁'],\r\n 'guǒ guàn': ['淉'],\r\n 'lín lìn': ['淋', '獜', '疄'],\r\n 'tǎng chǎng': ['淌'],\r\n 'nào chuò zhuō': ['淖'],\r\n 'péng píng': ['淜'],\r\n féi: ['淝', '肥', '腓', '蜰'],\r\n 'pì pèi': ['淠'],\r\n 'niǎn shěn': ['淰'],\r\n 'biāo hǔ': ['淲'],\r\n 'chún zhūn': ['淳'],\r\n 'hùn hún': ['混'],\r\n qiǎn: ['淺', '繾', '缱', '肷', '膁', '蜸', '譴', '谴', '遣', '鑓'],\r\n 'wèn mín': ['渂'],\r\n 'rè ruò luò': ['渃'],\r\n 'dú dòu': ['渎', '瀆', '读'],\r\n 'jiàn jiān': ['渐', '溅', '漸', '濺'],\r\n 'miǎn shéng': ['渑', '澠'],\r\n 'nuǎn nuán': ['渜'],\r\n 'qiú wù': ['渞'],\r\n 'tíng tīng': ['渟'],\r\n 'dì tí dī': ['渧'],\r\n 'gǎng jiǎng': ['港'],\r\n 'hōng qìng': ['渹'],\r\n tuān: ['湍', '煓'],\r\n 'huì mǐn xū': ['湏'],\r\n 'xǔ xù': ['湑'],\r\n pén: ['湓', '瓫', '盆', '葐'],\r\n 'mǐn hūn': ['湣'],\r\n 'tuàn nuǎn': ['湪'],\r\n 'qiū jiǎo': ['湫', '湬'],\r\n 'yān yīn': ['湮'],\r\n 'bàn pán': ['湴'],\r\n 'zhuāng hún': ['湷'],\r\n 'yàn guì': ['溎'],\r\n 'lián liǎn nián xián xiàn': ['溓'],\r\n 'dá tǎ': ['溚', '鿎'],\r\n 'liū liù': ['溜', '澑', '蹓'],\r\n lùn: ['溣'],\r\n mǎ: [\r\n '溤',\r\n '犸',\r\n '獁',\r\n '玛',\r\n '瑪',\r\n '码',\r\n '碼',\r\n '遤',\r\n '鎷',\r\n '馬',\r\n '马',\r\n '鰢',\r\n '鷌',\r\n ],\r\n 'zhēn qín': ['溱'],\r\n 'nì niào': ['溺'],\r\n 'chù xù': ['滀', '畜'],\r\n 'wěng wēng': ['滃'],\r\n 'hào xuè': ['滈'],\r\n 'qì xì xiē': ['滊'],\r\n 'xíng yíng': ['滎'],\r\n 'zé hào': ['滜'],\r\n 'piāo piào piǎo': ['漂'],\r\n 'cóng sǒng': ['漎'],\r\n 'féng péng': ['漨'],\r\n 'luò tà': ['漯'],\r\n 'pēng bēn': ['漰'],\r\n 'chóng shuāng': ['漴'],\r\n 'huǒ kuò huò': ['漷'],\r\n 'liáo liú': ['漻'],\r\n 'cuǐ cuī': ['漼'],\r\n 'cóng zǒng': ['潀'],\r\n 'cóng zōng': ['潈'],\r\n 'pì piē': ['潎'],\r\n 'dàng xiàng': ['潒'],\r\n 'huáng guāng': ['潢'],\r\n 'liáo lào lǎo': ['潦'],\r\n 'cōng zòng': ['潨'],\r\n 'zhí zhì': ['潪'],\r\n 'tān shàn': ['潬'],\r\n 'tú zhā': ['潳'],\r\n 'sàn sǎ': ['潵'],\r\n hēi: ['潶', '黑', '黒', '𬭶'],\r\n 'chéng dèng': ['澄', '瀓'],\r\n 'cūn cún': ['澊'],\r\n 'péng pēng': ['澎'],\r\n 'hòng gǒng': ['澒', '銾'],\r\n 'wàn màn': ['澫'],\r\n 'kuài huì': ['澮'],\r\n 'guō wō': ['濄'],\r\n 'pēn fén': ['濆'],\r\n 'jí shà': ['濈'],\r\n 'huì huò': ['濊'],\r\n 'dǐng tìng': ['濎'],\r\n 'mǐ nǐ': ['濔'],\r\n 'bì pì': ['濞'],\r\n 'cuì zuǐ': ['濢'],\r\n 'hù huò': ['濩'],\r\n 'ǎi kài kè': ['濭'],\r\n 'wěi duì': ['濻', '瀢'],\r\n 'zàn cuán': ['濽', '灒'],\r\n 'yǎng yàng': ['瀁'],\r\n 'wǎng wāng': ['瀇'],\r\n 'mò miè': ['瀎', '眜'],\r\n suǐ: ['瀡', '膸', '髓'],\r\n 'huái wāi': ['瀤'],\r\n 'zùn jiàn': ['瀳'],\r\n 'yīng yǐng yìng': ['瀴'],\r\n 'ráng ràng': ['瀼'],\r\n shuàng: ['灀'],\r\n 'zhuó jiào zé': ['灂'],\r\n sǎ: ['灑', '訯', '靸'],\r\n 'luán luàn': ['灓'],\r\n 'dǎng tǎng': ['灙'],\r\n 'xún quán quàn': ['灥'],\r\n 'huǒ biāo': ['灬'],\r\n 'zhà yù': ['灹'],\r\n 'fén bèn': ['炃'],\r\n 'jiǒng guì': ['炅'],\r\n 'pàng fēng': ['炐'],\r\n quē: ['炔', '缺', '缼', '蒛'],\r\n biān: [\r\n '炞',\r\n '煸',\r\n '甂',\r\n '砭',\r\n '笾',\r\n '箯',\r\n '籩',\r\n '編',\r\n '编',\r\n '蝙',\r\n '邉',\r\n '邊',\r\n '鍽',\r\n '鞭',\r\n '鯾',\r\n '鯿',\r\n '鳊',\r\n ],\r\n 'zhāo zhào': ['炤'],\r\n 'zhuō chù': ['炪'],\r\n 'pào páo bāo': ['炮'],\r\n 'páo fǒu': ['炰'],\r\n 'shǎn qián shān': ['炶'],\r\n 'zhà zhá': ['炸'],\r\n 'jiǎo yào': ['烄'],\r\n quǎn: ['烇', '犬', '犭', '畎', '綣', '绻', '虇'],\r\n 'yàng yáng': ['烊'],\r\n 'lào luò': ['烙'],\r\n 'huí huǐ': ['烠'],\r\n rè: ['热', '熱'],\r\n 'fú páo': ['烰'],\r\n 'xiè chè': ['烲', '焎'],\r\n 'yàn shān': ['烻'],\r\n 'hūn xūn': ['焄'],\r\n kào: ['焅', '犒', '銬', '铐', '靠', '鮳', '鯌', '鲓', '㸆'],\r\n 'juān yè': ['焆'],\r\n 'jùn qū': ['焌'],\r\n 'tāo dào': ['焘'],\r\n 'chǎo jù': ['焣'],\r\n 'wò ài': ['焥'],\r\n 'zǒng cōng': ['焧'],\r\n 'xī yì': ['焬'],\r\n 'xìn xīn': ['焮'],\r\n 'chāo zhuō': ['焯'],\r\n 'xiǒng yīng': ['焸', '焽'],\r\n kuǐ: ['煃', '跬', '蹞', '頍', '𫠆'],\r\n 'huī yùn xūn': ['煇'],\r\n 'jiǎo qiāo': ['煍'],\r\n 'qián shǎn shān': ['煔'],\r\n 'xī yí': ['煕'],\r\n 'shà shā': ['煞'],\r\n 'yè zhá': ['煠'],\r\n 'yáng yàng': ['煬'],\r\n 'ēn yūn': ['煾'],\r\n 'yūn yǔn': ['熅'],\r\n 'hè xiāo': ['熇'],\r\n xióng: ['熊', '熋', '雄'],\r\n 'xūn xùn': ['熏', '爋'],\r\n gòng: ['熕', '貢', '贡'],\r\n liū: ['熘'],\r\n 'cōng zǒng': ['熜'],\r\n 'lù āo': ['熝'],\r\n 'shú shóu': ['熟'],\r\n 'fēng péng': ['熢'],\r\n 'cuǐ suī': ['熣'],\r\n tēng: ['熥', '膯', '鼟'],\r\n 'yùn yù': ['熨'],\r\n 'áo āo': ['熬'],\r\n 'hàn rǎn': ['熯'],\r\n 'ōu ǒu': ['熰'],\r\n 'huáng huǎng': ['熿'],\r\n 'chǎn dǎn chàn': ['燀'],\r\n 'jiāo zhuó qiáo jué': ['燋'],\r\n 'yàn yān': ['燕'],\r\n 'tài liè': ['燤'],\r\n āo: ['爊'],\r\n 'yàn xún': ['爓'],\r\n 'jué jiào': ['爝', '覐', '覚', '覺', '觉'],\r\n 'lǎn làn': ['爦'],\r\n 'zhuǎ zhǎo': ['爪'],\r\n 'zhǎo zhuǎ': ['爫'],\r\n 'fù fǔ': ['父'],\r\n diē: ['爹', '褺', '跌'],\r\n zāng: ['牂', '羘', '臧', '賍', '賘', '贓', '贜', '赃', '髒'],\r\n 'piàn piān': ['片'],\r\n 'biān miàn': ['牑'],\r\n bǎng: ['牓', '綁', '绑'],\r\n 'yǒu yōng': ['牗'],\r\n 'chēng chèng': ['牚', '竀'],\r\n niú: ['牛', '牜'],\r\n 'jiū lè': ['牞'],\r\n 'mù móu': ['牟'],\r\n māng: ['牤'],\r\n 'gē qiú': ['牫'],\r\n 'yòu chōu': ['牰'],\r\n 'tè zhí': ['犆'],\r\n bēn: ['犇', '錛', '锛'],\r\n 'jiān qián': ['犍', '玪'],\r\n má: ['犘', '痲', '蔴', '蟇', '麻'],\r\n 'máo lí': ['犛'],\r\n 'bá quǎn': ['犮'],\r\n 'zhuó bào': ['犳'],\r\n 'àn hān': ['犴'],\r\n 'kàng gǎng': ['犺'],\r\n 'pèi fèi': ['犻'],\r\n 'fān huān': ['犿'],\r\n kuáng: ['狂', '狅', '誑', '诳', '軖', '軠', '鵟', '𫛭'],\r\n 'yí quán chí': ['狋'],\r\n 'xīng shēng': ['狌'],\r\n 'tuó yí': ['狏'],\r\n kǔ: ['狜', '苦'],\r\n 'huán huān': ['狟'],\r\n 'hé mò': ['狢'],\r\n 'tà shì': ['狧'],\r\n 'máng dòu': ['狵'],\r\n 'xī shǐ': ['狶'],\r\n suān: ['狻', '痠', '酸'],\r\n 'bài pí': ['猈'],\r\n 'jiān yàn': ['猏', '豣'],\r\n 'yī yǐ': ['猗'],\r\n 'yá wèi': ['猚'],\r\n cāi: ['猜'],\r\n 'māo máo': ['猫', '貓'],\r\n 'chuàn chuān': ['猭'],\r\n 'tuān tuàn': ['猯', '貒'],\r\n 'yà jiá qiè': ['猰'],\r\n 'hè xiē gé hài': ['猲'],\r\n 'biān piàn': ['猵', '獱'],\r\n 'bó pò': ['猼'],\r\n 'háo gāo': ['獋'],\r\n 'fén fèn': ['獖'],\r\n 'yào xiāo': ['獟'],\r\n 'shuò xī': ['獡'],\r\n 'gé liè xiē': ['獦'],\r\n 'nòu rú': ['獳'],\r\n 'náo nǎo yōu': ['獶'],\r\n ráng: ['獽', '瓤', '禳', '穣', '穰', '蘘', '躟', '鬤'],\r\n 'náo yōu': ['獿'],\r\n 'lǜ shuài': ['率'],\r\n 'wáng wàng': ['王'],\r\n 'yáng chàng': ['玚'],\r\n 'mín wén': ['玟'],\r\n 'bīn fēn': ['玢'],\r\n 'mén yǔn': ['玧'],\r\n 'qiāng cāng': ['玱', '瑲', '篬'],\r\n 'án gān': ['玵'],\r\n 'xuán xián': ['玹'],\r\n 'cī cǐ': ['玼', '跐'],\r\n 'yí tāi': ['珆'],\r\n 'zǔ jù': ['珇'],\r\n fà: ['珐', '琺', '蕟', '髪', '髮'],\r\n 'yín kèn': ['珢'],\r\n 'huī hún': ['珲'],\r\n 'xuán qióng': ['琁'],\r\n 'fú fū': ['琈'],\r\n 'bǐng pín': ['琕'],\r\n 'cuì sè': ['琗'],\r\n 'yù wéi': ['琟'],\r\n 'tiǎn tiàn': ['琠'],\r\n 'zhuó zuó': ['琢'],\r\n 'běng pěi': ['琣'],\r\n guǎn: ['琯', '璭', '痯', '筦', '管', '舘', '輨', '錧', '館', '馆', '鳤'],\r\n 'hún huī': ['琿'],\r\n 'xié jiē': ['瑎'],\r\n 'chàng dàng yáng': ['瑒'],\r\n 'tiàn zhèn': ['瑱'],\r\n 'bīn pián': ['瑸', '璸'],\r\n 'tú shū': ['瑹'],\r\n cuǐ: ['璀', '皠', '趡'],\r\n 'zǎo suǒ': ['璅'],\r\n 'jué qióng': ['璚'],\r\n 'lú fū': ['璷'],\r\n 'jì zī': ['璾'],\r\n suí: ['瓍', '綏', '绥', '遀', '随', '隨', '髄'],\r\n 'mí xǐ': ['瓕'],\r\n 'qióng wěi wèi': ['瓗'],\r\n 'huán yè yà': ['瓛'],\r\n 'bó páo': ['瓟'],\r\n 'zhí hú': ['瓡'],\r\n piáo: ['瓢', '闝'],\r\n 'wǎ wà': ['瓦'],\r\n 'xiáng hóng': ['瓨'],\r\n wèng: ['瓮', '甕', '罋', '蕹', '齆'],\r\n 'shèn shén': ['甚'],\r\n ruí: ['甤', '緌', '蕤'],\r\n yòng: ['用', '砽', '苚', '蒏', '醟', '㶲'],\r\n shuǎi: ['甩'],\r\n béng: ['甭', '甮'],\r\n 'yóu zhá': ['甴'],\r\n 'diàn tián shèng': ['甸'],\r\n 'tǐng dīng': ['町', '甼'],\r\n 'zāi zī': ['甾'],\r\n 'bì qí': ['畁'],\r\n 'dá fú': ['畗'],\r\n 'cè jì': ['畟'],\r\n 'zāi zī tián': ['畠'],\r\n 'zhì chóu shì': ['畤'],\r\n 'fān pān': ['畨', '番'],\r\n 'shē yú': ['畬'],\r\n 'dāng dàng dǎng': ['當'],\r\n 'jiāng qiáng': ['疆'],\r\n 'pǐ yǎ shū': ['疋'],\r\n 'jié qiè': ['疌'],\r\n 'yí nǐ': ['疑'],\r\n nè: ['疒', '眲', '訥', '讷'],\r\n 'gē yì': ['疙'],\r\n 'nüè yào': ['疟', '瘧'],\r\n 'lì lài': ['疠', '癘'],\r\n 'yǎ xiā': ['疨'],\r\n xuē: ['疶', '蒆', '薛', '辥', '辪', '靴', '鞾'],\r\n 'dǎn da': ['疸'],\r\n 'fá biǎn': ['疺'],\r\n 'fèi féi': ['疿', '痱'],\r\n 'shān diàn': ['痁'],\r\n 'téng chóng': ['痋'],\r\n 'tōng tóng': ['痌'],\r\n 'wěi yòu yù': ['痏'],\r\n 'tān shǐ': ['痑'],\r\n 'pū pù': ['痡', '鋪'],\r\n 'bēng péng': ['痭'],\r\n 'má lìn': ['痳'],\r\n 'tiǎn diàn': ['痶'],\r\n 'ān yè è': ['痷'],\r\n 'kē ē': ['痾'],\r\n 'zhì chì': ['瘈'],\r\n 'jiǎ xiá xiā': ['瘕'],\r\n 'lěi huì': ['瘣'],\r\n 'chài cuó': ['瘥'],\r\n 'diān chēn': ['瘨'],\r\n 'da dá': ['瘩'],\r\n 'biě biē': ['瘪'],\r\n qué: ['瘸'],\r\n 'dàn dān': ['癉'],\r\n 'guì wēi': ['癐'],\r\n 'nòng nóng': ['癑'],\r\n 'biē biě': ['癟'],\r\n 'bō bǒ': ['癷'],\r\n bái: ['白'],\r\n 'jí bī': ['皀'],\r\n 'de dì dí dī': ['的'],\r\n 'pā bà': ['皅'],\r\n 'gāo háo': ['皋'],\r\n 'gāo yáo': ['皐'],\r\n 'lì luò bō': ['皪'],\r\n 'zhā cǔ': ['皻'],\r\n 'zhāo zhǎn dǎn': ['皽'],\r\n 'jiān jiàn': ['监', '監', '鋻', '间', '鞬'],\r\n 'gài gě hé': ['盖'],\r\n 'máng wàng': ['盳'],\r\n yuǎn: ['盶', '逺', '遠'],\r\n 'tián xián': ['盷'],\r\n 'xiāng xiàng': ['相'],\r\n dǔn: ['盹', '趸', '躉'],\r\n 'xì pǎn': ['盻'],\r\n 'shěng xǐng': ['省'],\r\n 'yún hùn': ['眃'],\r\n 'miǎn miàn': ['眄'],\r\n 'kàn kān': ['看'],\r\n 'yìng yāng yǎng': ['眏'],\r\n 'yǎo āo ǎo': ['眑'],\r\n 'jū xū kōu': ['眗'],\r\n 'yí chì': ['眙'],\r\n 'dié tì': ['眣'],\r\n 'bǐng fǎng': ['眪'],\r\n 'pàng pán': ['眫'],\r\n 'mī mí': ['眯', '瞇'],\r\n 'xuàn shùn xún': ['眴'],\r\n tiào: ['眺', '粜', '糶', '覜', '趒'],\r\n 'zhe zhuó zháo zhāo': ['着'],\r\n 'qiáo shào xiāo': ['睄'],\r\n 'cuó zhuài': ['睉'],\r\n gùn: ['睔', '謴'],\r\n 'suì zuì': ['睟'],\r\n 'pì bì': ['睥', '稫', '辟'],\r\n 'yì zé gāo': ['睪'],\r\n 'xǐng xìng': ['睲'],\r\n 'guì wèi kuì': ['瞆'],\r\n 'kòu jì': ['瞉'],\r\n 'qióng huán': ['瞏'],\r\n 'mán mén': ['瞒', '瞞'],\r\n 'diāo dōu': ['瞗'],\r\n 'lou lóu lǘ': ['瞜'],\r\n 'shùn rún': ['瞤'],\r\n 'liào liǎo': ['瞭', '钌'],\r\n 'jiàn xián': ['瞯'],\r\n 'wǔ mí': ['瞴'],\r\n 'guì kuì': ['瞶'],\r\n 'nǐng chēng': ['矃'],\r\n 'huò yuè': ['矆'],\r\n 'mēng méng': ['矇'],\r\n 'kuàng guō': ['矌'],\r\n 'guàn quán': ['矔'],\r\n 'mǎn mán': ['矕'],\r\n 'jīn guān qín': ['矜'],\r\n 'jīn qín guān': ['矝'],\r\n 'yù xù jué': ['矞'],\r\n 'jiǎo jiáo': ['矫', '矯'],\r\n duǎn: ['短'],\r\n 'shí dàn': ['石'],\r\n 'gāng qiāng kòng': ['矼'],\r\n 'huā xū': ['砉'],\r\n 'pīn bīn fēn': ['砏'],\r\n 'yán yàn': ['研', '硏'],\r\n 'luǒ kē': ['砢'],\r\n 'fú fèi': ['砩', '笰'],\r\n 'zhǔ zhù': ['砫'],\r\n 'lá lì lā': ['砬'],\r\n 'kuāng guāng': ['硄'],\r\n 'gè luò': ['硌'],\r\n 'shuò shí': ['硕', '碩'],\r\n 'wèi wéi ái': ['硙'],\r\n 'què kè kù': ['硞'],\r\n 'mǎng bàng': ['硥'],\r\n 'luò lòng': ['硦'],\r\n 'yǒng tóng': ['硧'],\r\n nüè: ['硸', '虐'],\r\n 'kēng kěng': ['硻'],\r\n 'yān yǎn': ['硽'],\r\n 'zhuì chuí duǒ': ['硾'],\r\n 'kōng kòng': ['硿'],\r\n 'zòng cóng': ['碂'],\r\n 'jiān zhàn': ['碊'],\r\n 'lù liù': ['碌', '陆'],\r\n 'què xī': ['碏'],\r\n 'lún lǔn lùn': ['碖'],\r\n 'náo gāng': ['碙'],\r\n 'jié yà': ['碣'],\r\n 'wèi wěi': ['碨'],\r\n 'tí dī': ['碮'],\r\n 'chá chā': ['碴'],\r\n 'qiāo què': ['碻'],\r\n 'sù xiè': ['碿'],\r\n 'liú liù': ['磂', '遛', '鎦', '馏'],\r\n 'sī tí': ['磃'],\r\n 'bàng páng': ['磅'],\r\n 'huá kě gū': ['磆'],\r\n 'wěi kuǐ': ['磈'],\r\n 'xiá qià yà': ['磍'],\r\n 'lián qiān': ['磏'],\r\n 'wèi ái gài': ['磑'],\r\n 'lá lā': ['磖'],\r\n 'áo qiāo': ['磝'],\r\n 'pēng pèng': ['磞', '閛'],\r\n 'yīn yǐn': ['磤'],\r\n 'lěi léi': ['磥'],\r\n 'mó mò': ['磨'],\r\n 'qì zhú': ['磩'],\r\n 'láo luò': ['磱'],\r\n 'pán bō': ['磻'],\r\n 'jí shé': ['磼'],\r\n 'hé qiāo qiào': ['礉'],\r\n 'kè huò': ['礊'],\r\n 'què hú': ['礐'],\r\n 'è qì': ['礘'],\r\n cǎ: ['礤', '礸'],\r\n 'xián xín': ['礥'],\r\n 'léi lěi lèi': ['礧'],\r\n 'yán yǎn': ['礹'],\r\n 'qí zhǐ': ['祇', '蚔'],\r\n 'bēng fāng': ['祊'],\r\n 'bì mì': ['祕'],\r\n suàn: ['祘', '笇', '筭', '算', '蒜'],\r\n 'piào piāo': ['票'],\r\n 'jì zhài': ['祭'],\r\n 'shuì lèi': ['祱'],\r\n 'jìn jīn': ['禁'],\r\n 'chán shàn': ['禅'],\r\n 'yáng shāng': ['禓'],\r\n 'zhī zhǐ tí': ['禔'],\r\n 'shàn chán': ['禪'],\r\n 'yú yù ǒu': ['禺'],\r\n 'zǐ zì': ['秄'],\r\n 'chá ná': ['秅'],\r\n 'zhǒng zhòng chóng': ['种'],\r\n 'hào mào': ['秏'],\r\n 'kù kū': ['秙'],\r\n zū: ['租', '葅'],\r\n chèng: ['秤', '穪'],\r\n 'huó kuò': ['秮', '秳'],\r\n 'chēng chèn chèng': ['称', '稱'],\r\n 'shì zhì': ['秲', '銴'],\r\n 'fù pū': ['秿'],\r\n 'xùn zè': ['稄'],\r\n 'tú shǔ': ['稌'],\r\n 'zhùn zhǔn': ['稕'],\r\n 'jī qí': ['稘', '綨', '觭'],\r\n 'léng líng': ['稜'],\r\n 'zuì zú sū': ['稡'],\r\n 'xì qiè': ['稧', '郄'],\r\n 'zhǒng zhòng': ['種'],\r\n 'zōng zǒng': ['稯'],\r\n 'xián jiān liàn': ['稴'],\r\n 'zī jiū': ['稵'],\r\n 'jī qǐ': ['稽'],\r\n ròng: ['穃'],\r\n 'shān cǎn cēn': ['穇'],\r\n 'mén méi': ['穈'],\r\n 'jǐ jì': ['穖'],\r\n 'xiāo rào': ['穘'],\r\n 'zhuō bó': ['穛'],\r\n 'tóng zhǒng zhòng': ['穜'],\r\n zuō: ['穝'],\r\n 'biāo pāo': ['穮', '藨'],\r\n 'zhuō jué': ['穱'],\r\n 'cuán zàn': ['穳'],\r\n 'kōng kòng kǒng': ['空'],\r\n 'yū yǔ': ['穻'],\r\n zhǎi: ['窄', '鉙'],\r\n báo: ['窇', '雹'],\r\n 'kū zhú': ['窋'],\r\n 'jiào liáo liù': ['窌'],\r\n 'wā guī': ['窐'],\r\n 'tiǎo yáo': ['窕'],\r\n 'xūn yìn': ['窨'],\r\n 'yà yē': ['窫'],\r\n 'tián diān yǎn': ['窴'],\r\n 'chāo kē': ['窼'],\r\n 'kuǎn cuàn': ['窽', '窾'],\r\n 'chù qì': ['竐'],\r\n 'qǔ kǒu': ['竘'],\r\n 'jìng zhěn': ['竧'],\r\n 'kǎn kàn': ['竷'],\r\n 'zhú dǔ': ['竺'],\r\n 'lè jīn': ['竻'],\r\n 'zhuì ruì': ['笍'],\r\n 'háng hàng': ['笐'],\r\n 'cén jìn hán': ['笒'],\r\n 'dā xiá nà': ['笚'],\r\n 'zé zuó': ['笮'],\r\n 'lóng lǒng': ['笼', '篭', '籠', '躘', '龓'],\r\n 'zhù zhú': ['筑', '築'],\r\n 'dá dā': ['答', '荅'],\r\n shāi: ['筛', '篩', '簁', '籭'],\r\n 'yún jūn': ['筠'],\r\n 'láng làng': ['筤', '郎', '阆'],\r\n 'zhì zhǐ': ['筫'],\r\n o: ['筽'],\r\n 'póu bù fú pú': ['箁'],\r\n 'pái bēi': ['箄'],\r\n gè: ['箇', '虼', '鉻', '铬'],\r\n 'tái chí': ['箈'],\r\n 'guǎi dài': ['箉'],\r\n 'zhào dào': ['箌'],\r\n 'jīng qìng': ['箐'],\r\n 'lín lǐn': ['箖'],\r\n 'jùn qūn': ['箘'],\r\n 'shī yí': ['箷', '釶'],\r\n 'yuē yào chuò': ['箹'],\r\n 'xiāo shuò qiào': ['箾'],\r\n 'gōng gǎn lǒng': ['篢'],\r\n 'páng péng': ['篣'],\r\n 'zhuó huò': ['篧'],\r\n 'jiǎn jiān': ['篯'],\r\n 'dí zhú': ['篴'],\r\n 'zān cēn cǎn': ['篸'],\r\n 'zhuàn suǎn zuàn': ['篹'],\r\n 'piǎo biāo': ['篻'],\r\n 'guó guì': ['簂'],\r\n 'cè jí': ['簎'],\r\n 'mì miè': ['簚'],\r\n 'shāi sī': ['簛'],\r\n 'sǔn zhuàn': ['簨'],\r\n 'gàn gǎn': ['簳'],\r\n 'bò bǒ': ['簸'],\r\n 'bó bù': ['簿'],\r\n shi: ['籂'],\r\n 'zhēn jiān': ['籈'],\r\n 'zhuàn zuǎn': ['籑'],\r\n 'fān pān biān': ['籓'],\r\n 'sǒu shǔ': ['籔'],\r\n zuǎn: ['籫', '繤', '纂', '纉', '纘', '缵'],\r\n nǚ: ['籹', '釹', '钕'],\r\n 'shā chǎo': ['粆'],\r\n 'kāng jīng': ['粇'],\r\n fěn: ['粉', '黺'],\r\n cū: ['粗', '觕', '麁', '麄', '麤'],\r\n 'nián zhān': ['粘'],\r\n 'cè sè': ['粣'],\r\n 'zhōu yù': ['粥'],\r\n 'shēn sǎn': ['糁'],\r\n 'biān biǎn': ['糄', '萹'],\r\n miàn: ['糆', '面', '靣', '麪', '麫', '麵', '麺'],\r\n 'hú hū hù': ['糊'],\r\n 'gǔ gòu': ['糓'],\r\n 'mí méi': ['糜'],\r\n 'sǎn shēn': ['糝', '糣'],\r\n zāo: ['糟', '蹧', '遭', '醩'],\r\n 'mì sī': ['糸'],\r\n 'jiū jiǔ': ['糺'],\r\n 'xì jì': ['系', '繫'],\r\n 'zhēng zhěng': ['糽'],\r\n 'chà chǎ': ['紁', '衩'],\r\n 'yuē yāo': ['約', '约'],\r\n 'hóng gōng': ['紅', '红'],\r\n 'hé gē': ['紇', '纥'],\r\n 'wén wèn': ['紋', '纹'],\r\n fóu: ['紑'],\r\n 'jì jié jiè': ['紒'],\r\n 'pī pí bǐ': ['紕', '纰'],\r\n 'jīn jìn': ['紟'],\r\n 'zhā zā': ['紥', '紮'],\r\n hā: ['紦'],\r\n 'fū fù': ['紨'],\r\n 'chōu chóu': ['紬'],\r\n 'lèi léi lěi': ['累'],\r\n 'bō bì': ['紴'],\r\n 'tiǎn zhěn': ['紾'],\r\n 'jiōng jiǒng': ['絅'],\r\n 'jié jiē': ['結', '结', '节'],\r\n 'guà kuā': ['絓'],\r\n 'bǎi mò': ['絔'],\r\n 'gēng huán': ['絙'],\r\n 'jié xié': ['絜'],\r\n 'quán shuān': ['絟'],\r\n 'gǎi ǎi': ['絠'],\r\n 'luò lào': ['絡', '络'],\r\n 'bīng bēng pēng': ['絣'],\r\n 'gěi jǐ': ['給', '给'],\r\n 'tóng tōng dòng': ['絧'],\r\n 'tiào diào dào': ['絩'],\r\n 'lěi lèi léi': ['絫'],\r\n 'gāi hài': ['絯'],\r\n 'chī zhǐ': ['絺'],\r\n 'wèn miǎn mán wàn': ['絻'],\r\n 'huán huàn wàn': ['綄'],\r\n 'qīn xiān': ['綅'],\r\n 'tì tí': ['綈'],\r\n 'yán xiàn': ['綖'],\r\n 'zōng zèng zòng': ['綜'],\r\n 'chēn lín': ['綝'],\r\n 'zhǔn zhùn': ['綧'],\r\n 'qiàn qīng zhēng': ['綪'],\r\n 'qìng qǐ': ['綮'],\r\n 'lún guān': ['綸', '纶'],\r\n 'chuò chāo': ['綽', '绰'],\r\n 'tián tǎn chān': ['緂'],\r\n 'lǜ lù': ['緑', '绿'],\r\n 'ruǎn ruàn': ['緛'],\r\n 'jí qī': ['緝'],\r\n 'zhòng chóng': ['緟', '重'],\r\n 'miáo máo': ['緢'],\r\n 'xiè yè': ['緤'],\r\n huǎn: ['緩', '缓', '㬊'],\r\n 'gēng gèng': ['緪', '縆'],\r\n 'tōu xū shū': ['緰'],\r\n 'zōng zòng': ['緵', '繌'],\r\n 'yùn gǔn': ['緷'],\r\n 'guā wō': ['緺'],\r\n 'yùn yūn wēn': ['緼', '縕'],\r\n 'bāng bàng': ['縍'],\r\n 'gǔ hú': ['縎', '鶻'],\r\n 'cī cuò suǒ': ['縒'],\r\n 'cuī shuāi': ['縗'],\r\n 'róng rǒng ròng': ['縙'],\r\n 'zài zēng': ['縡'],\r\n cài: ['縩', '菜', '蔡'],\r\n 'féng fèng': ['縫'],\r\n 'suō sù': ['縮', '缩'],\r\n 'yǎn yǐn': ['縯', '酓'],\r\n 'zòng zǒng': ['縱', '纵'],\r\n 'zhuàn juàn': ['縳'],\r\n 'mò mù': ['縸', '莫'],\r\n 'piǎo piāo': ['縹', '缥'],\r\n 'fán pó': ['繁'],\r\n 'bēng bèng': ['繃'],\r\n 'móu miù miào liǎo': ['繆'],\r\n 'yáo yóu zhòu': ['繇'],\r\n 'zēng zèng': ['繒', '缯'],\r\n 'jú jué': ['繘'],\r\n 'chuō chuò': ['繛'],\r\n 'zūn zǔn': ['繜'],\r\n rào: ['繞', '绕', '遶'],\r\n 'chǎn chán': ['繟'],\r\n 'huì huí': ['繢', '缋', '藱'],\r\n 'qiāo sāo zǎo': ['繰'],\r\n 'jiǎo zhuó': ['繳', '缴'],\r\n 'dàn tán chán': ['繵'],\r\n nǒng: ['繷'],\r\n 'pú fú': ['纀'],\r\n 'yào lì': ['纅'],\r\n 'rǎng xiāng': ['纕'],\r\n 'lí sǎ xǐ lǐ': ['纚'],\r\n 'xiān qiàn': ['纤'],\r\n 'jīng jìng': ['经'],\r\n 'tí tì': ['绨'],\r\n 'bēng běng bèng': ['绷'],\r\n 'zōng zèng': ['综'],\r\n 'jī qī': ['缉'],\r\n 'wēn yùn yūn': ['缊'],\r\n 'fèng féng': ['缝'],\r\n 'shuāi cuī suī': ['缞'],\r\n 'miù móu liáo miào mù': ['缪'],\r\n 'qiāo sāo': ['缲'],\r\n fǒu: ['缶', '缹', '缻', '雬', '鴀'],\r\n 'bà ba pí': ['罢', '罷'],\r\n 'guà guǎi': ['罫'],\r\n 'yáng xiáng': ['羊', '羏'],\r\n 'měi gāo': ['羙'],\r\n 'yì xī': ['羛'],\r\n 'qiǎng qiān': ['羟'],\r\n 'qiāng kòng': ['羫'],\r\n 'qián xián yán': ['羬'],\r\n nóu: ['羺'],\r\n 'hóng gòng': ['羾'],\r\n 'pī bì pō': ['翍'],\r\n 'qú yù': ['翑'],\r\n ké: ['翗'],\r\n 'qiào qiáo': ['翘'],\r\n 'zhái dí': ['翟'],\r\n 'dào zhōu': ['翢'],\r\n 'hóu qú': ['翵'],\r\n shuǎ: ['耍'],\r\n 'ruǎn nuò': ['耎'],\r\n 'ér nài': ['耏'],\r\n 'zhuān duān': ['耑'],\r\n 'pá bà': ['耙'],\r\n 'chí sì': ['耛'],\r\n 'qù chú': ['耝'],\r\n 'lún lǔn': ['耣'],\r\n 'jí jiè': ['耤'],\r\n 'tāng tǎng': ['耥'],\r\n pǎng: ['耪', '覫'],\r\n 'zhá zé': ['耫'],\r\n 'yē yé': ['耶'],\r\n 'yún yíng': ['耺'],\r\n 'wà tuǐ zhuó': ['聉'],\r\n 'ér nǜ': ['聏'],\r\n 'tiē zhé': ['聑'],\r\n 'dǐ zhì': ['聜'],\r\n qié: ['聺'],\r\n 'nǐ jiàn': ['聻'],\r\n 'lèi lē': ['肋'],\r\n cào: ['肏', '襙', '鄵', '鼜'],\r\n 'bó dí': ['肑'],\r\n 'xiào xiāo': ['肖'],\r\n 'dù dǔ': ['肚'],\r\n chāi: ['肞', '釵', '钗'],\r\n 'hán qín hàn': ['肣'],\r\n 'pàng pán pàn': ['肨', '胖'],\r\n 'zhūn chún': ['肫'],\r\n āng: ['肮', '骯'],\r\n 'yù yō': ['育'],\r\n 'pí bǐ bì': ['肶'],\r\n 'fèi bì': ['胇'],\r\n 'bèi bēi': ['背'],\r\n 'fèi zǐ': ['胏'],\r\n 'píng pēng': ['胓', '苹'],\r\n 'fū fú zhǒu': ['胕'],\r\n 'shèng shēng': ['胜'],\r\n kuà: ['胯', '跨', '骻'],\r\n 'gǎi hǎi': ['胲'],\r\n 'gē gé gā': ['胳'],\r\n 'néng nài': ['能'],\r\n 'guī kuì': ['胿'],\r\n 'mài mò': ['脉'],\r\n 'zāng zàng': ['脏'],\r\n 'jiǎo jué': ['脚', '角'],\r\n cuǒ: ['脞'],\r\n 'de te': ['脦'],\r\n 'zuī juān': ['脧'],\r\n něi: ['脮', '腇', '餒', '馁', '鮾', '鯘'],\r\n 'pú fǔ': ['脯'],\r\n niào: ['脲'],\r\n shuí: ['脽'],\r\n guò: ['腂', '過', '鐹'],\r\n 'là xī': ['腊'],\r\n 'yān ā': ['腌'],\r\n 'gāo gào': ['膏'],\r\n 'lù biāo': ['膔'],\r\n chuái: ['膗'],\r\n 'zhuān chuán chún zhuǎn': ['膞'],\r\n chuài: ['膪', '踹'],\r\n 'fán pán': ['膰'],\r\n 'wǔ hū': ['膴'],\r\n 'shān dàn': ['膻'],\r\n tún: ['臀', '臋', '蛌', '豘', '豚', '軘', '霕', '飩', '饨', '魨', '鲀', '黗'],\r\n 'bì bei': ['臂'],\r\n 'là gé': ['臈'],\r\n 'sào sāo': ['臊'],\r\n nào: ['臑', '閙', '闹', '鬧'],\r\n 'ní luán': ['臡'],\r\n 'qiān xián': ['臤'],\r\n 'guàng jiǒng': ['臦'],\r\n 'guǎng jiǒng': ['臩'],\r\n 'chòu xiù': ['臭'],\r\n 'mián biān': ['臱'],\r\n 'dié zhí': ['臷'],\r\n 'zhī jìn': ['臸'],\r\n 'shè shě': ['舍'],\r\n pù: ['舖', '舗'],\r\n 'bān bō pán': ['般'],\r\n kuā: ['舿'],\r\n 'gèn gěn': ['艮'],\r\n 'sè shǎi': ['色'],\r\n 'fú bó': ['艴'],\r\n 'jiāo qiú': ['艽'],\r\n 'chāi chā': ['芆'],\r\n 'sháo què': ['芍'],\r\n 'hù xià': ['芐'],\r\n 'zì zǐ': ['芓'],\r\n 'huì hū': ['芔'],\r\n 'tún chūn': ['芚'],\r\n 'jiè gài': ['芥'],\r\n 'xù zhù': ['芧'],\r\n 'yuán yán': ['芫'],\r\n 'xīn xìn': ['芯'],\r\n 'lún huā': ['芲'],\r\n 'wù hū': ['芴'],\r\n 'gōu gǒu': ['芶'],\r\n 'mào máo': ['芼'],\r\n 'fèi fú': ['芾'],\r\n 'chán yín': ['苂'],\r\n qiē: ['苆'],\r\n 'sū sù': ['苏'],\r\n 'tiáo sháo': ['苕'],\r\n 'lì jī': ['苙'],\r\n 'kē hē': ['苛'],\r\n 'jù qǔ': ['苣'],\r\n 'ruò rě': ['若'],\r\n 'zhù níng': ['苧'],\r\n 'pā bó': ['苩'],\r\n xiú: ['苬'],\r\n 'zhǎ zuó': ['苲'],\r\n 'jū chá': ['苴'],\r\n nié: ['苶'],\r\n 'shēng ruí': ['苼'],\r\n 'qié jiā': ['茄'],\r\n 'zǐ cí': ['茈'],\r\n 'qiàn xī': ['茜'],\r\n chǎi: ['茝'],\r\n 'fá pèi': ['茷'],\r\n ráo: ['荛', '蕘', '襓', '饒', '饶'],\r\n 'yíng xíng': ['荥'],\r\n 'qián xún': ['荨', '蕁'],\r\n 'yìn yīn': ['荫'],\r\n 'hé hè': ['荷'],\r\n 'shā suō': ['莎'],\r\n 'péng fēng': ['莑'],\r\n 'shēn xīn': ['莘'],\r\n 'wǎn guān guǎn': ['莞'],\r\n 'yóu sù': ['莤'],\r\n 'shāo xiāo': ['莦', '蛸'],\r\n 'làng liáng': ['莨'],\r\n 'piǎo fú': ['莩'],\r\n 'wèn wǎn miǎn': ['莬'],\r\n 'shì shí': ['莳', '蒔'],\r\n 'tù tú': ['莵'],\r\n 'xiān liǎn': ['莶', '薟'],\r\n 'wǎn yù': ['菀'],\r\n 'zōu chù': ['菆'],\r\n 'lù lǜ': ['菉'],\r\n 'jūn jùn': ['菌'],\r\n 'niè rěn': ['菍'],\r\n 'zī zì zāi': ['菑'],\r\n 'tú tù': ['菟'],\r\n 'jiē shà': ['菨'],\r\n 'qiáo zhǎo': ['菬'],\r\n 'tái zhī chí': ['菭'],\r\n 'fēi fěi': ['菲', '蜚'],\r\n 'qín qīn jīn': ['菳'],\r\n 'zū jù': ['菹', '蒩'],\r\n 'lǐn má': ['菻'],\r\n 'tián tiàn': ['菾'],\r\n tiē: ['萜', '貼', '贴'],\r\n 'luò là lào luō': ['落'],\r\n 'zhù zhuó zhe': ['著'],\r\n 'shèn rèn': ['葚'],\r\n 'gě gé': ['葛'],\r\n 'jùn suǒ': ['葰'],\r\n 'kuì kuài': ['蒉'],\r\n 'rú ná': ['蒘'],\r\n 'méng mēng měng': ['蒙'],\r\n 'yuán huán': ['蒝'],\r\n 'xú shú': ['蒣'],\r\n 'xí xì': ['蒵'],\r\n 'mì míng': ['蓂'],\r\n 'sōu sǒu': ['蓃'],\r\n 'gài gě hé hài': ['蓋'],\r\n 'yǎo zhuó': ['蓔'],\r\n 'diào tiáo dí': ['蓧'],\r\n 'xū qiū fū': ['蓲'],\r\n 'zí jú': ['蓻'],\r\n 'liǎo lù': ['蓼'],\r\n xu: ['蓿'],\r\n 'hàn hǎn': ['蔊'],\r\n 'màn wàn mán': ['蔓'],\r\n 'pó bò': ['蔢'],\r\n 'fān fán bō': ['蕃'],\r\n 'hóng hòng': ['蕻'],\r\n 'yù ào': ['薁', '隩'],\r\n 'xí xiào': ['薂'],\r\n 'báo bó bò': ['薄'],\r\n 'cí zī': ['薋'],\r\n 'wàn luàn': ['薍'],\r\n 'kǎo hāo': ['薧'],\r\n 'yuǎn wěi': ['薳'],\r\n 'zhòu chóu': ['薵'],\r\n 'wō mái': ['薶'],\r\n 'xiāo hào': ['藃'],\r\n 'yù xù xū': ['藇'],\r\n 'jiè jí': ['藉'],\r\n 'diào zhuó': ['藋'],\r\n 'cáng zàng': ['藏'],\r\n lǎ: ['藞'],\r\n 'chú zhū': ['藸'],\r\n 'pín píng': ['蘋'],\r\n 'gān hán': ['虷'],\r\n 'hóng jiàng': ['虹'],\r\n 'huī huǐ': ['虺'],\r\n 'xiā há': ['虾'],\r\n 'mǎ mà mā': ['蚂'],\r\n 'fāng bàng': ['蚄'],\r\n 'bàng bèng': ['蚌'],\r\n 'jué quē': ['蚗'],\r\n 'qín qián': ['蚙'],\r\n 'gōng zhōng': ['蚣'],\r\n 'fǔ fù': ['蚥'],\r\n 'dài dé': ['蚮'],\r\n 'gǒu qú xù': ['蚼'],\r\n 'bǒ pí': ['蚾'],\r\n 'shé yí': ['蛇'],\r\n tiě: ['蛈', '鉄', '銕', '鐡', '鐵', '铁', '驖'],\r\n 'gé luò': ['蛒'],\r\n 'máng bàng': ['蛖'],\r\n 'yì xǔ': ['蛡'],\r\n 'há gé': ['蛤'],\r\n 'qiè ní': ['蛪'],\r\n 'é yǐ': ['蛾'],\r\n 'zhē zhé': ['蜇'],\r\n 'là zhà': ['蜡'],\r\n suò: ['蜶', '逤'],\r\n 'yóu qiú': ['蝤'],\r\n 'xiā hā': ['蝦'],\r\n 'xī qī': ['螇'],\r\n 'bī pí': ['螕'],\r\n 'nài něng': ['螚'],\r\n 'hé xiá': ['螛'],\r\n 'guì huǐ': ['螝'],\r\n 'mǎ mā mà': ['螞'],\r\n 'shì zhē': ['螫'],\r\n 'zhì dié': ['螲'],\r\n 'jiàn chán': ['螹'],\r\n 'ma má mò': ['蟆'],\r\n 'mǎng měng': ['蟒'],\r\n 'biē bié': ['蟞'],\r\n 'bēn fèi': ['蟦'],\r\n 'láo liáo': ['蟧'],\r\n 'yín xún': ['蟫'],\r\n 'lí lǐ': ['蠡'],\r\n 'xuè xiě': ['血'],\r\n 'xíng háng hàng héng': ['行'],\r\n 'shuāi cuī': ['衰'],\r\n 'tuó tuō': ['袉'],\r\n 'lǐng líng': ['袊'],\r\n 'bào páo pào': ['袌'],\r\n 'jù jiē': ['袓'],\r\n 'hè kè': ['袔'],\r\n 'yí yì': ['袘', '貤'],\r\n 'nà jué': ['袦'],\r\n 'bèi pī': ['被'],\r\n 'chǐ nuǒ': ['袲'],\r\n 'chǐ qǐ duǒ nuǒ': ['袳'],\r\n 'jiá qiā jié': ['袷'],\r\n 'bó mò': ['袹'],\r\n 'guī guà': ['袿'],\r\n 'liè liě': ['裂'],\r\n 'chéng chěng': ['裎'],\r\n 'jiē gé': ['裓'],\r\n 'dāo chóu': ['裯'],\r\n 'shang cháng': ['裳'],\r\n 'yuān gǔn': ['裷'],\r\n 'yǎn ān': ['裺'],\r\n 'tì xī': ['裼'],\r\n 'fù fú': ['褔'],\r\n 'chǔ zhǔ': ['褚'],\r\n 'tuì tùn': ['褪'],\r\n lǎi: ['襰'],\r\n 'yào yāo': ['要'],\r\n 'qín tán': ['覃'],\r\n 'jiàn xiàn': ['見', '见'],\r\n piǎn: ['覑', '諞', '谝', '貵', '𡎚'],\r\n 'piē miè': ['覕'],\r\n 'yíng yǐng': ['覮'],\r\n 'qù qū': ['覰', '覷', '觑'],\r\n 'jiàn biǎn': ['覵'],\r\n 'luó luǎn': ['覶'],\r\n 'zī zuǐ': ['觜'],\r\n 'huà xiè': ['觟'],\r\n 'jiě jiè xiè': ['解', '觧'],\r\n 'xué hù': ['觷'],\r\n 'lì lù': ['觻'],\r\n tǎo: ['討', '讨'],\r\n zhùn: ['訰'],\r\n 'zī zǐ': ['訾'],\r\n 'yí dài': ['詒', '诒'],\r\n xiòng: ['詗', '诇'],\r\n 'diào tiǎo': ['誂'],\r\n 'yí chǐ chì': ['誃'],\r\n 'lǎng làng': ['誏'],\r\n 'ēi éi ěi èi xī': ['誒', '诶'],\r\n shuà: ['誜'],\r\n 'yǔ yù': ['語', '语', '雨'],\r\n 'shuō shuì yuè': ['說', '说'],\r\n 'shuí shéi': ['誰', '谁'],\r\n 'qū juè': ['誳'],\r\n 'chī lài': ['誺'],\r\n 'nì ná': ['誽'],\r\n 'diào tiáo': ['調'],\r\n 'pǐ bēi': ['諀'],\r\n 'jì jī': ['諅'],\r\n 'zé zuò zhǎ cuò': ['諎'],\r\n 'chù jí': ['諔'],\r\n 'háo xià': ['諕'],\r\n 'lùn lún': ['論', '论'],\r\n 'shì dì': ['諟'],\r\n 'huà guā': ['諣'],\r\n 'xǐ shāi āi': ['諰'],\r\n 'nán nàn': ['諵', '難'],\r\n miù: ['謬', '谬'],\r\n zèn: ['譖', '谮'],\r\n 'shí zhì': ['識', '识'],\r\n 'juàn xuān': ['讂'],\r\n 'yí tuī': ['讉'],\r\n zhán: ['讝'],\r\n 'xǔ hǔ': ['许'],\r\n 'xiáng yáng': ['详'],\r\n 'tiáo diào zhōu': ['调'],\r\n 'chén shèn': ['谌'],\r\n 'mí mèi': ['谜'],\r\n 'màn mán': ['谩'],\r\n 'gǔ yù': ['谷'],\r\n 'huō huò huá': ['豁'],\r\n 'zhì zhài': ['豸'],\r\n 'huān huán': ['貆'],\r\n 'kěn kūn': ['貇'],\r\n 'mò hé': ['貈'],\r\n 'mò hé háo': ['貉'],\r\n 'jù lóu': ['貗'],\r\n 'zé zhài': ['責', '责'],\r\n 'dài tè': ['貸'],\r\n 'bì bēn': ['賁'],\r\n 'jiǎ gǔ jià': ['賈'],\r\n 'xiōng mín': ['賯'],\r\n càng: ['賶'],\r\n 'zhuàn zuàn': ['賺', '赚'],\r\n 'wàn zhuàn': ['贃'],\r\n 'gàn gòng zhuàng': ['贛'],\r\n 'yuán yùn': ['贠'],\r\n 'bēn bì': ['贲'],\r\n 'jiǎ gǔ': ['贾'],\r\n zǒu: ['走', '赱', '鯐'],\r\n 'dié tú': ['趃'],\r\n 'jū qiè': ['趄'],\r\n 'qū cù': ['趋', '趨'],\r\n 'jí jié': ['趌'],\r\n 'guā huó': ['趏'],\r\n 'què qì jí': ['趞'],\r\n 'tàng tāng': ['趟'],\r\n 'chuō zhuó': ['趠'],\r\n 'qù cù': ['趣'],\r\n 'yuè tì': ['趯'],\r\n 'bō bào': ['趵'],\r\n 'kuà wù': ['趶'],\r\n 'guì jué': ['趹'],\r\n 'fāng fàng páng': ['趽'],\r\n 'páo bà': ['跁'],\r\n 'qí qǐ': ['跂'],\r\n 'jiàn chén': ['跈'],\r\n 'pǎo páo': ['跑'],\r\n 'diǎn diē tiē': ['跕'],\r\n 'jū jù qiè': ['跙'],\r\n bǒ: ['跛'],\r\n 'luò lì': ['跞'],\r\n 'dài duò duō chí': ['跢'],\r\n zhuǎi: ['跩'],\r\n 'bèng pián': ['跰'],\r\n 'tiào táo': ['跳'],\r\n 'shū chōu': ['跾'],\r\n 'liàng liáng': ['踉'],\r\n 'tà tā': ['踏'],\r\n chǎ: ['蹅', '鑔', '镲'],\r\n 'dí zhí': ['蹢'],\r\n 'dēng dèng': ['蹬', '鐙', '镫'],\r\n cèng: ['蹭'],\r\n 'dūn cún': ['蹲'],\r\n 'juě jué': ['蹶'],\r\n liāo: ['蹽'],\r\n 'xiè sǎ': ['躠'],\r\n tǐ: ['躰', '軆', '骵'],\r\n 'yà zhá gá': ['轧', '軋'],\r\n 'xìn xiàn': ['軐'],\r\n 'fàn guǐ': ['軓'],\r\n 'zhuàn zhuǎn': ['転'],\r\n 'zhóu zhòu': ['軸', '轴'],\r\n bú: ['轐', '醭', '鳪'],\r\n 'zhuǎn zhuàn zhuǎi': ['转'],\r\n 'zǎi zài': ['载'],\r\n 'niǎn zhǎn': ['辗'],\r\n 'biān bian': ['边'],\r\n 'dào biān': ['辺'],\r\n 'yǐ yí': ['迆', '迤', '迱'],\r\n 'guò guo guō': ['过'],\r\n 'wàng kuāng': ['迋'],\r\n 'hái huán': ['还'],\r\n 'zhè zhèi': ['这'],\r\n 'yuǎn yuàn': ['远'],\r\n 'zhì lì': ['迣'],\r\n 'zhù wǎng': ['迬'],\r\n 'zhuī duī': ['追'],\r\n 'shì kuò': ['适'],\r\n tòu: ['透'],\r\n 'tōng tòng': ['通'],\r\n guàng: ['逛'],\r\n 'dǎi dài': ['逮'],\r\n 'suì suí': ['遂'],\r\n 'tí dì': ['遆'],\r\n 'yí wèi': ['遗'],\r\n 'shì dí zhé': ['適'],\r\n cà: ['遪'],\r\n 'huán hái': ['還'],\r\n 'lí chí': ['邌'],\r\n 'kàng háng': ['邟'],\r\n 'nà nèi nā': ['那'],\r\n 'xié yá yé yú xú': ['邪'],\r\n 'gāi hái': ['郂'],\r\n 'huán xún': ['郇'],\r\n 'chī xī': ['郗'],\r\n hǎo: ['郝'],\r\n 'lì zhí': ['郦'],\r\n 'xiáo ǎo': ['郩'],\r\n 'dōu dū': ['都'],\r\n liǎo: ['曢', '鄝', '镽'],\r\n 'zàn cuán cuó': ['酂', '酇'],\r\n 'dīng dǐng': ['酊'],\r\n 'cù zuò': ['酢'],\r\n 'fā pō': ['酦'],\r\n 'shāi shī': ['酾'],\r\n niàng: ['酿', '醸'],\r\n 'qiú chōu': ['醔'],\r\n 'pō fā': ['醗', '醱'],\r\n 'chǎn chěn': ['醦'],\r\n 'yàn liǎn xiān': ['醶'],\r\n 'niàng niáng': ['釀'],\r\n 'lǐ li': ['里'],\r\n 'lí xǐ xī': ['釐'],\r\n 'liǎo liào': ['釕'],\r\n 'dīng dìng': ['釘', '钉'],\r\n 'qiǎo jiǎo': ['釥'],\r\n 'yú huá': ['釪'],\r\n 'huá wū': ['釫'],\r\n 'rì rèn jiàn': ['釰', '釼'],\r\n 'dì dài': ['釱'],\r\n 'pī zhāo': ['釽'],\r\n 'yá yé': ['釾'],\r\n 'bǎ pá': ['鈀', '钯'],\r\n 'tā tuó': ['鉈', '铊'],\r\n běi: ['鉳'],\r\n 'bǐng píng': ['鉼'],\r\n 'hā kē': ['鉿', '铪'],\r\n chòng: ['銃', '铳'],\r\n 'xiǎng jiōng': ['銄'],\r\n 'yù sì': ['銉'],\r\n 'xù huì': ['銊'],\r\n 'rén rěn': ['銋'],\r\n 'shàn shuò': ['銏'],\r\n 'chì lì': ['銐'],\r\n 'xiǎn xǐ': ['銑', '铣'],\r\n 'hóu xiàng': ['銗'],\r\n 'diào tiáo yáo': ['銚'],\r\n 'xiān kuò tiǎn guā': ['銛', '銽', '铦'],\r\n 'zhé niè': ['銸'],\r\n 'zhōng yōng': ['銿'],\r\n 'tōu tù dòu': ['鋀'],\r\n 'méi méng': ['鋂'],\r\n 'wàn jiǎn': ['鋄', '鎫'],\r\n 'tǐng dìng': ['鋌', '铤'],\r\n 'juān jiān cuān': ['鋑'],\r\n 'sī tuó': ['鋖'],\r\n 'juān xuān juàn': ['鋗'],\r\n 'wú huá wū': ['鋘'],\r\n 'zhuó chuò': ['鋜'],\r\n 'xíng xìng jīng': ['鋞'],\r\n 'jū jú': ['鋦', '锔'],\r\n 'zuì niè': ['鋷'],\r\n 'yuān yuǎn wǎn wān': ['鋺'],\r\n 'gāng gàng': ['鋼', '钢'],\r\n zhuī: ['錐', '锥', '騅', '骓', '鵻'],\r\n ā: ['錒', '锕'],\r\n 'cuō chā': ['鎈'],\r\n 'suǒ sè': ['鎍'],\r\n 'yáo zú': ['鎐'],\r\n 'yè tà gé': ['鎑'],\r\n 'qiāng chēng': ['鎗'],\r\n 'gé lì': ['鎘', '镉', '鬲'],\r\n 'bī pī bì': ['鎞'],\r\n 'gǎo hào': ['鎬'],\r\n 'zú chuò': ['鏃'],\r\n 'xiū xiù': ['鏅'],\r\n 'shòu sōu': ['鏉'],\r\n 'dí dī': ['鏑', '镝'],\r\n 'qiāo sǎn càn': ['鏒'],\r\n 'lù áo': ['鏕'],\r\n 'tāng táng': ['鏜'],\r\n 'jiàn zàn': ['鏩'],\r\n 'huì suì ruì': ['鏸'],\r\n 'qiǎng qiāng': ['鏹', '镪'],\r\n 'sǎn xiàn sà': ['鏾'],\r\n 'jiǎn jiàn': ['鐧', '锏'],\r\n 'dāng chēng': ['鐺', '铛'],\r\n 'zuān zuàn': ['鑽'],\r\n 'sà xì': ['钑'],\r\n 'yào yuè': ['钥'],\r\n 'tǒu dǒu': ['钭'],\r\n 'zuàn zuān': ['钻'],\r\n 'qiān yán': ['铅'],\r\n 'pí pī': ['铍'],\r\n 'yáo diào tiáo': ['铫'],\r\n 'tāng tàng': ['铴'],\r\n 'pù pū': ['铺'],\r\n 'tán xiān': ['锬'],\r\n 'liù liú': ['镏'],\r\n 'hào gǎo': ['镐'],\r\n 'táng tāng': ['镗'],\r\n 'tán chán xín': ['镡'],\r\n 'huò shǎn': ['閄'],\r\n 'hàn bì': ['閈', '闬'],\r\n 'kāng kàng': ['閌', '闶'],\r\n 'xián jiàn jiān jiǎn': ['閒'],\r\n 'xiā xiǎ': ['閕'],\r\n 'xiǎ kě': ['閜'],\r\n 'biàn guān': ['閞'],\r\n 'hé gé': ['閤', '颌'],\r\n 'hòng xiàng': ['閧'],\r\n 'sē xī': ['閪'],\r\n 'tíng tǐng': ['閮'],\r\n 'è yān': ['閼', '阏'],\r\n 'hòng juǎn xiàng': ['闂'],\r\n 'bǎn pàn': ['闆'],\r\n 'dū shé': ['闍', '阇'],\r\n 'què quē': ['闕'],\r\n 'tāng táng chāng': ['闛'],\r\n 'kàn hǎn': ['闞', '阚'],\r\n 'xì sè tà': ['闟'],\r\n 'mēn mèn': ['闷'],\r\n 'quē què': ['阙'],\r\n 'yán diàn': ['阽'],\r\n 'ā ē': ['阿'],\r\n 'bēi pō pí': ['陂'],\r\n 'yàn yǎn': ['隁'],\r\n 'yú yáo shù': ['隃'],\r\n 'lóng lōng': ['隆'],\r\n 'duì zhuì': ['隊'],\r\n 'suí duò': ['隋'],\r\n 'gāi qí ái': ['隑'],\r\n 'huī duò': ['隓', '隳'],\r\n 'wěi kuí': ['隗'],\r\n 'lì dài': ['隸'],\r\n 'zhuī cuī wéi': ['隹'],\r\n 'hè hú': ['隺', '鶮'],\r\n 'jùn juàn': ['隽', '雋'],\r\n 'nán nàn nuó': ['难'],\r\n 'què qiāo qiǎo': ['雀'],\r\n 'guàn huán': ['雚'],\r\n 'guī xī': ['雟'],\r\n 'sè xí': ['雭'],\r\n án: ['雸'],\r\n 'wù méng': ['雺'],\r\n tèng: ['霯'],\r\n 'lù lòu': ['露'],\r\n mái: ['霾'],\r\n 'jìng liàng': ['靚'],\r\n 'gé jí': ['革'],\r\n bǎ: ['靶'],\r\n 'yāng yàng': ['鞅'],\r\n 'gé tà sǎ': ['鞈'],\r\n 'biān yìng': ['鞕'],\r\n 'qiào shāo': ['鞘'],\r\n 'juān xuān': ['鞙'],\r\n 'shàng zhǎng': ['鞝'],\r\n 'pí bǐng bì bēi': ['鞞'],\r\n la: ['鞡'],\r\n 'xiè dié': ['鞢'],\r\n ēng: ['鞥'],\r\n 'móu mù': ['鞪'],\r\n 'bì bǐng': ['鞸'],\r\n 'mèi wà': ['韎'],\r\n rǒu: ['韖'],\r\n 'shè xiè': ['韘'],\r\n 'yùn wēn': ['韫'],\r\n 'dùn dú': ['頓', '顿'],\r\n duǐ: ['頧'],\r\n luō: ['頱'],\r\n 'bīn pín': ['頻'],\r\n yóng: ['顒', '颙', '鰫'],\r\n mān: ['顢', '颟'],\r\n 'jǐng gěng': ['颈'],\r\n 'jié xié jiá': ['颉'],\r\n 'kē ké': ['颏'],\r\n 'pín bīn': ['频'],\r\n 'chàn zhàn': ['颤'],\r\n 'fēng fěng': ['風', '风'],\r\n 'biāo diū': ['颩'],\r\n 'bá fú': ['颰'],\r\n 'sāo sōu': ['颾'],\r\n 'liù liáo': ['飂'],\r\n 'shí sì yì': ['食'],\r\n 'yǎng juàn': ['飬'],\r\n 'zhù tǒu': ['飳'],\r\n 'yí sì': ['飴'],\r\n 'zuò zé zhā': ['飵'],\r\n tiè: ['飻', '餮'],\r\n 'xiǎng náng': ['饟'],\r\n 'táng xíng': ['饧'],\r\n 'gē le': ['饹'],\r\n 'chā zha': ['馇'],\r\n 'náng nǎng': ['馕'],\r\n 'yūn wò': ['馧'],\r\n 'zhī shì': ['馶'],\r\n 'xìn jìn': ['馸'],\r\n 'kuài jué': ['駃'],\r\n zǎng: ['駔', '驵'],\r\n 'tái dài': ['駘'],\r\n 'xún xuān': ['駨'],\r\n 'liáng láng': ['駺'],\r\n piàn: ['騗', '騙', '骗', '魸'],\r\n 'dài tái': ['骀'],\r\n 'sāo sǎo': ['骚'],\r\n 'gǔ gū': ['骨'],\r\n 'bèi mó': ['骳'],\r\n 'xiāo qiāo': ['骹'],\r\n 'bǎng pǎng': ['髈'],\r\n 'bó jué': ['髉'],\r\n 'bì pǒ': ['髲'],\r\n 'máo méng': ['髳'],\r\n 'kuò yuè': ['髺'],\r\n 'bā bà': ['魞', '鲃'],\r\n 'jì cǐ': ['鮆'],\r\n 'bó bà': ['鮊'],\r\n 'zhǎ zhà': ['鮓', '鲊'],\r\n 'chóu dài': ['鮘'],\r\n 'luò gé': ['鮥'],\r\n 'guī xié wā kuí': ['鮭'],\r\n 'xiān xiǎn': ['鮮', '鲜'],\r\n 'pū bū': ['鯆'],\r\n 'yì sī': ['鯣'],\r\n 'bà bó': ['鲌'],\r\n 'guī xié': ['鲑'],\r\n 'sāi xǐ': ['鳃'],\r\n 'niǎo diǎo': ['鳥'],\r\n 'diāo zhāo': ['鳭'],\r\n 'gān hàn yàn': ['鳱'],\r\n 'fū guī': ['鳺'],\r\n 'jiān qiān zhān': ['鳽'],\r\n 'hé jiè': ['鶡'],\r\n 'piān biǎn': ['鶣'],\r\n 'chuàn zhì': ['鶨'],\r\n 'cāng qiāng': ['鶬'],\r\n 'sǔn xùn': ['鶽'],\r\n 'biāo páo': ['麃'],\r\n 'zhù cū': ['麆'],\r\n 'jūn qún': ['麇', '麕'],\r\n chi: ['麶'],\r\n 'mó me': ['麼'],\r\n 'mó me ma': ['麽'],\r\n 'mí mǒ': ['麿'],\r\n 'dàn shèn': ['黮'],\r\n 'zhěn yān': ['黰'],\r\n 'dǎn zhǎn': ['黵'],\r\n 'miǎn mǐn měng': ['黾'],\r\n hōu: ['齁'],\r\n nàng: ['齉'],\r\n 'qí jì zī zhāi': ['齐'],\r\n 'yín kěn yǎn': ['龂'],\r\n 'yín kěn': ['龈'],\r\n 'gōng wò': ['龏'],\r\n 'guī jūn qiū': ['龜', '龟'],\r\n 'kuí wā': ['䖯'],\r\n lōu: ['䁖'],\r\n 'ōu qū': ['𫭟'],\r\n 'lóu lǘ': ['𦝼'],\r\n 'gǎ gā gá': ['嘎'],\r\n 'wā guà': ['坬'],\r\n 'zhǐ dǐ': ['茋'],\r\n 'gǒng hóng': ['硔'],\r\n 'yáo xiào': ['滧'],\r\n};\r\nconst DICT1 = new FastDictFactory();\r\nObject.keys(map).forEach((key) => {\r\n const chars = map[key];\r\n for (let char of chars) {\r\n DICT1.set(char, key);\r\n }\r\n});\n\nexport { DICT1 as default };\n","import { Priority } from '../common/constant.mjs';\n\nconst DICT2 = {\r\n 这个: 'zhè ge',\r\n 成为: 'chéng wéi',\r\n 认为: 'rèn wéi',\r\n 作为: 'zuò wéi',\r\n 部分: 'bù fen',\r\n 要求: 'yāo qiú',\r\n 应该: 'yīng gāi',\r\n 增长: 'zēng zhǎng',\r\n 提供: 'tí gōng',\r\n 觉得: 'jué de',\r\n 任务: 'rèn wu',\r\n 那个: 'nà ge',\r\n 称为: 'chēng wéi',\r\n 为主: 'wéi zhǔ',\r\n 了解: 'liǎo jiě',\r\n 处理: 'chǔ lǐ',\r\n 皇上: 'huáng shang',\r\n 只要: 'zhǐ yào',\r\n 大量: 'dà liàng',\r\n 力量: 'lì liàng',\r\n 几乎: 'jī hū',\r\n 干部: 'gàn bù',\r\n 目的: 'mù dì',\r\n 行为: 'xíng wéi',\r\n 只见: 'zhǐ jiàn',\r\n 认识: 'rèn shi',\r\n 市长: 'shì zhǎng',\r\n 师父: 'shī fu',\r\n 调查: 'diào chá',\r\n 重新: 'chóng xīn',\r\n 分为: 'fēn wéi',\r\n 知识: 'zhī shi',\r\n 导弹: 'dǎo dàn',\r\n 质量: 'zhì liàng',\r\n 行款: 'háng kuǎn',\r\n 行列: 'háng liè',\r\n 行话: 'háng huà',\r\n 行业: 'háng yè',\r\n 隔行: 'gé háng',\r\n 在行: 'zài háng',\r\n 行家: 'háng jia',\r\n 内行: 'nèi háng',\r\n 外行: 'wài háng',\r\n 同行: 'tóng háng',\r\n 本行: 'běn háng',\r\n 行伍: 'háng wǔ',\r\n 洋行: 'yáng háng',\r\n 银行: 'yín háng',\r\n 商行: 'shāng háng',\r\n 支行: 'zhī háng',\r\n 总行: 'zǒng háng',\r\n 行情: 'háng qíng',\r\n 懂行: 'dǒng háng',\r\n 行规: 'háng guī',\r\n 行当: 'háng dang',\r\n 行货: 'háng huò',\r\n 太行: 'tài háng',\r\n 入行: 'rù háng',\r\n 中行: 'zhōng háng',\r\n 农行: 'nóng háng',\r\n 工行: 'gōng háng',\r\n 建行: 'jiàn háng',\r\n 各行: \"gè háng\",\r\n 行号: 'háng hào',\r\n 行高: 'háng gāo',\r\n 行首: 'háng shǒu',\r\n 行尾: 'háng wěi',\r\n 行末: 'háng mò',\r\n 行长: 'háng zhǎng',\r\n 行距: 'háng jù',\r\n 换行: 'huàn háng',\r\n 行会: 'háng huì',\r\n 行辈: 'háng bèi',\r\n 行道: 'háng dào',\r\n 道行: 'dào heng',\r\n 参与: 'cān yù',\r\n 充分: 'chōng fèn',\r\n 尽管: 'jǐn guǎn',\r\n 生长: 'shēng zhǎng',\r\n 数量: 'shù liàng',\r\n 应当: 'yīng dāng',\r\n 院长: 'yuàn zhǎng',\r\n 强调: 'qiáng diào',\r\n 只能: 'zhǐ néng',\r\n 音乐: 'yīn yuè',\r\n 以为: 'yǐ wéi',\r\n 处于: 'chǔ yú',\r\n 部长: 'bù zhǎng',\r\n 蒙古: 'měng gǔ',\r\n 只有: 'zhǐ yǒu',\r\n 适当: 'shì dàng',\r\n 只好: 'zhǐ hǎo',\r\n 成长: 'chéng zhǎng',\r\n 高兴: 'gāo xìng',\r\n 不了: 'bù liǎo',\r\n 产量: 'chǎn liàng',\r\n 胖子: 'pàng zi',\r\n 显得: 'xiǎn de',\r\n 只是: 'zhǐ shì',\r\n 似的: 'shì de',\r\n 率领: 'shuài lǐng',\r\n 改为: 'gǎi wéi',\r\n 不禁: 'bù jīn',\r\n 成分: 'chéng fèn',\r\n 答应: 'dā ying',\r\n 少年: 'shào nián',\r\n 兴趣: 'xìng qù',\r\n 太监: 'tài jian',\r\n 休息: 'xiū xi',\r\n 校长: 'xiào zhǎng',\r\n 更新: 'gēng xīn',\r\n 合同: 'hé tong',\r\n 喝道: 'hè dào',\r\n 重庆: 'chóng qìng',\r\n 重建: 'chóng jiàn',\r\n 使得: 'shǐ de',\r\n 审查: 'shěn chá',\r\n 累计: 'lěi jì',\r\n 给予: 'jǐ yǔ',\r\n 极为: 'jí wéi',\r\n 冠军: 'guàn jūn',\r\n 仿佛: 'fǎng fú',\r\n 头发: 'tóu fa',\r\n 投降: 'tóu xiáng',\r\n 家长: 'jiā zhǎng',\r\n 仔细: 'zǐ xì',\r\n 要是: 'yào shi',\r\n 将领: 'jiàng lǐng',\r\n 含量: 'hán liàng',\r\n 更为: 'gèng wéi',\r\n 积累: 'jī lěi',\r\n 地处: 'dì chǔ',\r\n 县长: 'xiàn zhǎng',\r\n 少女: 'shào nǚ',\r\n 路上: 'lù shang',\r\n 只怕: 'zhǐ pà',\r\n 能量: 'néng liàng',\r\n 储量: 'chǔ liàng',\r\n 供应: 'gōng yìng',\r\n 挑战: 'tiǎo zhàn',\r\n 西藏: 'xī zàng',\r\n 记得: 'jì de',\r\n 总量: 'zǒng liàng',\r\n 当真: 'dàng zhēn',\r\n 将士: 'jiàng shì',\r\n 差别: 'chā bié',\r\n 较为: 'jiào wéi',\r\n 长老: 'zhǎng lǎo',\r\n 大夫: 'dài fu',\r\n 差异: 'chā yì',\r\n 懂得: 'dǒng de',\r\n 尽量: 'jǐn liàng',\r\n 模样: 'mú yàng',\r\n 的确: 'dí què',\r\n 为首: 'wéi shǒu',\r\n 便宜: 'pián yi',\r\n 更名: 'gēng míng',\r\n 石头: 'shí tou',\r\n 州长: 'zhōu zhǎng',\r\n 为止: 'wéi zhǐ',\r\n 漂亮: 'piào liang',\r\n 炮弹: 'pào dàn',\r\n 藏族: 'zàng zú',\r\n 角色: 'jué sè',\r\n 当作: 'dàng zuò',\r\n 尽快: 'jǐn kuài',\r\n 人为: 'rén wéi',\r\n 重复: 'chóng fù',\r\n 胡同: 'hú tòng',\r\n 差距: 'chā jù',\r\n 弟兄: 'dì xiong',\r\n 大将: 'dà jiàng',\r\n 睡觉: 'shuì jiào',\r\n 一觉: 'yí jiào',\r\n 团长: 'tuán zhǎng',\r\n 队长: 'duì zhǎng',\r\n 区长: 'qū zhǎng',\r\n 难得: 'nán dé',\r\n 丫头: 'yā tou',\r\n 会长: 'huì zhǎng',\r\n 弟弟: 'dì di',\r\n 王爷: 'wáng ye',\r\n 重量: 'zhòng liàng',\r\n 誉为: 'yù wéi',\r\n 家伙: 'jiā huo',\r\n 华山: 'huà shān',\r\n 椅子: 'yǐ zi',\r\n 流量: 'liú liàng',\r\n 长大: 'zhǎng dà',\r\n 勉强: 'miǎn qiǎng',\r\n 会计: 'kuài jì',\r\n 过分: 'guò fèn',\r\n 济南: 'jǐ nán',\r\n 调动: 'diào dòng',\r\n 燕京: 'yān jīng',\r\n 少将: 'shào jiàng',\r\n 中毒: 'zhòng dú',\r\n 晓得: 'xiǎo de',\r\n 变更: 'biàn gēng',\r\n 打更: 'dǎ gēng',\r\n 认得: 'rèn de',\r\n 苹果: 'píng guǒ',\r\n 念头: 'niàn tou',\r\n 挣扎: 'zhēng zhá',\r\n 三藏: 'sān zàng',\r\n 剥削: 'bō xuē',\r\n 丞相: 'chéng xiàng',\r\n 少量: 'shǎo liàng',\r\n 寻思: 'xún si',\r\n 夺得: 'duó dé',\r\n 干线: 'gàn xiàn',\r\n 呼吁: 'hū yù',\r\n 处罚: 'chǔ fá',\r\n 长官: 'zhǎng guān',\r\n 柏林: 'bó lín',\r\n 亲戚: 'qīn qi',\r\n 身分: 'shēn fèn',\r\n 胳膊: 'gē bo',\r\n 着手: 'zhuó shǒu',\r\n 炸弹: 'zhà dàn',\r\n 咳嗽: 'ké sou',\r\n 叶子: 'yè zi',\r\n 外长: 'wài zhǎng',\r\n 供给: 'gōng jǐ',\r\n 师长: 'shī zhǎng',\r\n 变量: 'biàn liàng',\r\n 应有: 'yīng yǒu',\r\n 下载: 'xià zài',\r\n 乐器: 'yuè qì',\r\n 间接: 'jiàn jiē',\r\n 底下: 'dǐ xià',\r\n 打扮: 'dǎ bàn',\r\n 子弹: 'zǐ dàn',\r\n 弹药: 'dàn yào',\r\n 热量: 'rè liàng',\r\n 削弱: 'xuē ruò',\r\n 骨干: 'gǔ gàn',\r\n 容量: 'róng liàng',\r\n 模糊: 'mó hu',\r\n 转动: 'zhuàn dòng',\r\n 称呼: 'chēng hu',\r\n 科长: 'kē zhǎng',\r\n 处置: 'chǔ zhì',\r\n 着重: 'zhuó zhòng',\r\n 着急: 'zháo jí',\r\n 强迫: 'qiǎng pò',\r\n 庭长: 'tíng zhǎng',\r\n 首相: 'shǒu xiàng',\r\n 喇嘛: 'lǎ ma',\r\n 镇长: 'zhèn zhǎng',\r\n 只管: 'zhǐ guǎn',\r\n 重重: 'chóng chóng',\r\n 免得: 'miǎn de',\r\n 着实: 'zhuó shí',\r\n 度假: 'dù jià',\r\n 真相: 'zhēn xiàng',\r\n 相貌: 'xiàng mào',\r\n 处分: 'chǔ fèn',\r\n 委屈: 'wěi qu',\r\n 为期: 'wéi qī',\r\n 伯伯: 'bó bo',\r\n 伯子: 'bǎi zi',\r\n 圈子: 'quān zi',\r\n 见识: 'jiàn shi',\r\n 笼罩: 'lǒng zhào',\r\n 与会: 'yù huì',\r\n 都督: 'dū du',\r\n 都市: 'dū shì',\r\n 成都: 'chéng dū',\r\n 首都: 'shǒu dū',\r\n 帝都: 'dì dū',\r\n 王都: 'wáng dū',\r\n 东都: 'dōng dū',\r\n 都护: 'dū hù',\r\n 都城: 'dū chéng',\r\n 建都: 'jiàn dū',\r\n 迁都: 'qiān dū',\r\n 故都: 'gù dū',\r\n 定都: 'dìng dū',\r\n 中都: 'zhōng dū',\r\n 六安: 'lù ān',\r\n 宰相: 'zǎi xiàng',\r\n 较量: 'jiào liàng',\r\n 对称: 'duì chèn',\r\n 总长: 'zǒng zhǎng',\r\n 相公: 'xiàng gong',\r\n 空白: 'kòng bái',\r\n 打量: 'dǎ liang',\r\n 水分: 'shuǐ fèn',\r\n 舌头: 'shé tou',\r\n 没收: 'mò shōu',\r\n 行李: 'xíng li',\r\n 判处: 'pàn chǔ',\r\n 散文: 'sǎn wén',\r\n 处境: 'chǔ jìng',\r\n 孙子: 'sūn zi',\r\n 拳头: 'quán tou',\r\n 打发: 'dǎ fā',\r\n 组长: 'zǔ zhǎng',\r\n 骨头: 'gǔ tou',\r\n 宁可: 'nìng kě',\r\n 更换: 'gēng huàn',\r\n 薄弱: 'bó ruò',\r\n 还原: 'huán yuán',\r\n 重修: 'chóng xiū',\r\n 重来: 'chóng lái',\r\n 只顾: 'zhǐ gù',\r\n 爱好: 'ài hào',\r\n 馒头: 'mán tou',\r\n 军长: 'jūn zhǎng',\r\n 首长: 'shǒu zhǎng',\r\n 厂长: 'chǎng zhǎng',\r\n 司长: 'sī zhǎng',\r\n 长子: 'zhǎng zǐ',\r\n 强劲: 'qiáng jìng',\r\n 恰当: 'qià dàng',\r\n 头儿: 'tóu er',\r\n 站长: 'zhàn zhǎng',\r\n 折腾: 'zhē teng',\r\n 相处: 'xiāng chǔ',\r\n 统率: 'tǒng shuài',\r\n 中将: 'zhōng jiàng',\r\n 命中: 'mìng zhòng',\r\n 名将: 'míng jiàng',\r\n 木头: 'mù tou',\r\n 动弹: 'dòng tan',\r\n 地壳: 'dì qiào',\r\n 干活: 'gàn huó',\r\n 少爷: 'shào ye',\r\n 水量: 'shuǐ liàng',\r\n 补给: 'bǔ jǐ',\r\n 尾巴: 'wěi ba',\r\n 来得: 'lái de',\r\n 好奇: 'hào qí',\r\n 钥匙: 'yào shi',\r\n 当做: 'dàng zuò',\r\n 沉着: 'chén zhuó',\r\n 哑巴: 'yǎ ba',\r\n 车子: 'chē zi',\r\n 上将: 'shàng jiàng',\r\n 恶心: 'ě xīn',\r\n 担子: 'dàn zi',\r\n 应届: 'yīng jiè',\r\n 主角: 'zhǔ jué',\r\n 运转: 'yùn zhuǎn',\r\n 兄长: 'xiōng zhǎng',\r\n 格式: 'gé shì',\r\n 正月: 'zhēng yuè',\r\n 营长: 'yíng zhǎng',\r\n 当成: 'dàng chéng',\r\n 女婿: 'nǚ xu',\r\n 咽喉: 'yān hóu',\r\n 重阳: 'chóng yáng',\r\n 化为: 'huà wéi',\r\n 吐蕃: 'tǔ bō',\r\n 钻进: 'zuān jìn',\r\n 乐队: 'yuè duì',\r\n 亮相: 'liàng xiàng',\r\n 被子: 'bèi zi',\r\n 舍得: 'shě de',\r\n 杉木: 'shā mù',\r\n 击中: 'jī zhòng',\r\n 排长: 'pái zhǎng',\r\n 假期: 'jià qī',\r\n 分量: 'fèn liàng',\r\n 数次: 'shù cì',\r\n 提防: 'dī fáng',\r\n 吆喝: 'yāo he',\r\n 查处: 'chá chǔ',\r\n 量子: 'liàng zǐ',\r\n 里头: 'lǐ tou',\r\n 调研: 'diào yán',\r\n 伺候: 'cì hou',\r\n 重申: 'chóng shēn',\r\n 枕头: 'zhěn tou',\r\n 拚命: 'pīn mìng',\r\n 社长: 'shè zhǎng',\r\n 归还: 'guī huán',\r\n 批量: 'pī liàng',\r\n 畜牧: 'xù mù',\r\n 点着: 'diǎn zháo',\r\n 甚为: 'shèn wéi',\r\n 小将: 'xiǎo jiàng',\r\n 着眼: 'zhuó yǎn',\r\n 处死: 'chǔ sǐ',\r\n 厌恶: 'yàn wù',\r\n 鼓乐: 'gǔ yuè',\r\n 树干: 'shù gàn',\r\n 秘鲁: 'bì lǔ',\r\n 大方: 'dà fāng',\r\n 外头: 'wài tou',\r\n 班长: 'bān zhǎng',\r\n 星宿: 'xīng xiù',\r\n 宁愿: 'nìng yuàn',\r\n 钦差: 'qīn chāi',\r\n 为数: 'wéi shù',\r\n 勾当: 'gòu dàng',\r\n 削减: 'xuē jiǎn',\r\n 间谍: 'jiàn dié',\r\n 埋怨: 'mán yuàn',\r\n 结实: 'jiē shi',\r\n 计量: 'jì liáng',\r\n 淹没: 'yān mò',\r\n 村长: 'cūn zhǎng',\r\n 连长: 'lián zhǎng',\r\n 自给: 'zì jǐ',\r\n 武将: 'wǔ jiàng',\r\n 温差: 'wēn chā',\r\n 直奔: 'zhí bèn',\r\n 供求: 'gōng qiú',\r\n 剂量: 'jì liàng',\r\n 道长: 'dào zhǎng',\r\n 泄露: 'xiè lòu',\r\n 王八: 'wáng ba',\r\n 切割: 'qiē gē',\r\n 间隔: 'jiàn gé',\r\n 一晃: 'yì huǎng',\r\n 长假: 'cháng jià',\r\n 令狐: 'líng hú',\r\n 为害: 'wéi hài',\r\n 句子: 'jù zi',\r\n 偿还: 'cháng huán',\r\n 疙瘩: 'gē da',\r\n 燕山: 'yān shān',\r\n 堵塞: 'dǔ sè',\r\n 夺冠: 'duó guàn',\r\n 扎实: 'zhā shi',\r\n 电荷: 'diàn hè',\r\n 看守: 'kān shǒu',\r\n 复辟: 'fù bì',\r\n 郁闷: 'yù mèn',\r\n 尽早: 'jǐn zǎo',\r\n 切断: 'qiē duàn',\r\n 指头: 'zhǐ tou',\r\n 为生: 'wéi shēng',\r\n 畜生: 'chù sheng',\r\n 切除: 'qiē chú',\r\n 着力: 'zhuó lì',\r\n 着想: 'zhuó xiǎng',\r\n 级差: 'jí chā',\r\n 投奔: 'tóu bèn',\r\n 棍子: 'gùn zi',\r\n 含糊: 'hán hu',\r\n 少妇: 'shào fù',\r\n 兴致: 'xìng zhì',\r\n 纳闷: 'nà mèn',\r\n 干流: 'gàn liú',\r\n 卷起: 'juǎn qǐ',\r\n 扇子: 'shàn zi',\r\n 更改: 'gēng gǎi',\r\n 笼络: 'lǒng luò',\r\n 喇叭: 'lǎ ba',\r\n 载荷: 'zài hè',\r\n 妥当: 'tuǒ dàng',\r\n 为难: 'wéi nán',\r\n 着陆: 'zhuó lù',\r\n 燕子: 'yàn zi',\r\n 干吗: 'gàn má',\r\n 白发: 'bái fà',\r\n 总得: 'zǒng děi',\r\n 夹击: 'jiā jī',\r\n 曝光: 'bào guāng',\r\n 曲调: 'qǔ diào',\r\n 相机: 'xiàng jī',\r\n 叫化: 'jiào huà',\r\n 角逐: 'jué zhú',\r\n 啊哟: 'ā yō',\r\n 载重: 'zài zhòng',\r\n 长辈: 'zhǎng bèi',\r\n 出差: 'chū chāi',\r\n 垛口: 'duǒ kǒu',\r\n 撇开: 'piē kāi',\r\n 厅长: 'tīng zhǎng',\r\n 组分: 'zǔ fèn',\r\n 误差: 'wù chā',\r\n 家当: 'jiā dàng',\r\n 传记: 'zhuàn jì',\r\n 个子: 'gè zi',\r\n 铺设: 'pū shè',\r\n 干事: 'gàn shì',\r\n 杆菌: 'gǎn jūn',\r\n 定量: 'dìng liàng',\r\n 运载: 'yùn zài',\r\n 会儿: 'huì er',\r\n 酋长: 'qiú zhǎng',\r\n 重返: 'chóng fǎn',\r\n 差额: 'chā é',\r\n 露面: 'lòu miàn',\r\n 钻研: 'zuān yán',\r\n 大城: 'dài chéng',\r\n 上当: 'shàng dàng',\r\n 销量: 'xiāo liàng',\r\n 作坊: 'zuō fang',\r\n 照相: 'zhào xiàng',\r\n 哎呀: 'āi yā',\r\n 调集: 'diào jí',\r\n 看中: 'kàn zhòng',\r\n 议长: 'yì zhǎng',\r\n 风筝: 'fēng zheng',\r\n 辟邪: 'bì xié',\r\n 空隙: 'kòng xì',\r\n 更迭: 'gēng dié',\r\n 偏差: 'piān chā',\r\n 声调: 'shēng diào',\r\n 适量: 'shì liàng',\r\n 屯子: 'tún zi',\r\n 无量: 'wú liàng',\r\n 空地: 'kòng dì',\r\n 调度: 'diào dù',\r\n 散射: 'sǎn shè',\r\n 创伤: 'chuāng shāng',\r\n 海参: 'hǎi shēn',\r\n 满载: 'mǎn zài',\r\n 重叠: 'chóng dié',\r\n 落差: 'luò chā',\r\n 单调: 'dān diào',\r\n 老将: 'lǎo jiàng',\r\n 人参: 'rén shēn',\r\n 间断: 'jiàn duàn',\r\n 重现: 'chóng xiàn',\r\n 夹杂: 'jiā zá',\r\n 调用: 'diào yòng',\r\n 萝卜: 'luó bo',\r\n 附着: 'fù zhuó',\r\n 应声: 'yìng shēng',\r\n 主将: 'zhǔ jiàng',\r\n 罪过: 'zuì guo',\r\n 咀嚼: 'jǔ jué',\r\n 为政: 'wéi zhèng',\r\n 过量: 'guò liàng',\r\n 乐曲: 'yuè qǔ',\r\n 负荷: 'fù hè',\r\n 枪弹: 'qiāng dàn',\r\n 悄然: 'qiǎo rán',\r\n 处方: 'chǔ fāng',\r\n 悄声: 'qiǎo shēng',\r\n 曲子: 'qǔ zi',\r\n 情调: 'qíng diào',\r\n 挑衅: 'tiǎo xìn',\r\n 代为: 'dài wéi',\r\n 了结: 'liǎo jié',\r\n 打中: 'dǎ zhòng',\r\n 酒吧: 'jiǔ bā',\r\n 懒得: 'lǎn de',\r\n 增量: 'zēng liàng',\r\n 衣着: 'yī zhuó',\r\n 部将: 'bù jiàng',\r\n 要塞: 'yào sài',\r\n 茶几: 'chá jī',\r\n 杠杆: 'gàng gǎn',\r\n 出没: 'chū mò',\r\n 鲜有: 'xiǎn yǒu',\r\n 间隙: 'jiàn xì',\r\n 重担: 'zhòng dàn',\r\n 重演: 'chóng yǎn',\r\n 重试: 'chóng shì',\r\n 应酬: 'yìng chou',\r\n 只当: 'zhǐ dāng',\r\n 毋宁: 'wú nìng',\r\n 包扎: 'bāo zā',\r\n 前头: 'qián tou',\r\n 卷烟: 'juǎn yān',\r\n 非得: 'fēi děi',\r\n 弹道: 'dàn dào',\r\n 杆子: 'gān zi',\r\n 门将: 'mén jiàng',\r\n 后头: 'hòu tou',\r\n 喝彩: 'hè cǎi',\r\n 暖和: 'nuǎn huo',\r\n 累积: 'lěi jī',\r\n 调遣: 'diào qiǎn',\r\n 倔强: 'jué jiàng',\r\n 宝藏: 'bǎo zàng',\r\n 丧事: 'sāng shì',\r\n 约莫: 'yuē mo',\r\n 纤夫: 'qiàn fū',\r\n 更替: 'gēng tì',\r\n 装载: 'zhuāng zài',\r\n 背包: 'bēi bāo',\r\n 帖子: 'tiě zi',\r\n 松散: 'sōng sǎn',\r\n 呼喝: 'hū hè',\r\n 可恶: 'kě wù',\r\n 自转: 'zì zhuàn',\r\n 供电: 'gōng diàn',\r\n 反省: 'fǎn xǐng',\r\n 坦率: 'tǎn shuài',\r\n 苏打: 'sū dá',\r\n 本分: 'běn fèn',\r\n 落得: 'luò de',\r\n 鄙薄: 'bǐ bó',\r\n 相间: 'xiāng jiàn',\r\n 单薄: 'dān bó',\r\n 混蛋: 'hún dàn',\r\n 贞观: 'zhēn guān',\r\n 附和: 'fù hè',\r\n 能耐: 'néng nài',\r\n 吓唬: 'xià hu',\r\n 未了: 'wèi liǎo',\r\n 引着: 'yǐn zháo',\r\n 抽调: 'chōu diào',\r\n 沙子: 'shā zi',\r\n 席卷: 'xí juǎn',\r\n 标的: 'biāo dì',\r\n 别扭: 'biè niu',\r\n 思量: 'sī liang',\r\n 喝采: 'hè cǎi',\r\n 论语: 'lún yǔ',\r\n 盖子: 'gài zi',\r\n 分外: 'fèn wài',\r\n 弄堂: 'lòng táng',\r\n 乐舞: 'yuè wǔ',\r\n 雨量: 'yǔ liàng',\r\n 毛发: 'máo fà',\r\n 差遣: 'chāi qiǎn',\r\n 背负: 'bēi fù',\r\n 转速: 'zhuàn sù',\r\n 声乐: 'shēng yuè',\r\n 夹攻: 'jiā gōng',\r\n 供水: 'gōng shuǐ',\r\n 主干: 'zhǔ gàn',\r\n 惩处: 'chéng chǔ',\r\n 长相: 'zhǎng xiàng',\r\n 公差: 'gōng chāi',\r\n 榴弹: 'liú dàn',\r\n 省得: 'shěng de',\r\n 条子: 'tiáo zi',\r\n 重围: 'chóng wéi',\r\n 阻塞: 'zǔ sè',\r\n 劲风: 'jìng fēng',\r\n 纠葛: 'jiū gé',\r\n 颠簸: 'diān bǒ',\r\n 点中: 'diǎn zhòng',\r\n 重创: 'zhòng chuāng',\r\n 姥姥: 'lǎo lao',\r\n 迷糊: 'mí hu',\r\n 公家: 'gōng jia',\r\n 几率: 'jī lǜ',\r\n 苦闷: 'kǔ mèn',\r\n 度量: 'dù liàng',\r\n 差错: 'chā cuò',\r\n 暑假: 'shǔ jià',\r\n 参差: 'cēn cī',\r\n 搭载: 'dā zài',\r\n 助长: 'zhù zhǎng',\r\n 相称: 'xiāng chèn',\r\n 红晕: 'hóng yùn',\r\n 舍命: 'shě mìng',\r\n 喜好: 'xǐ hào',\r\n 列传: 'liè zhuàn',\r\n 劲敌: 'jìng dí',\r\n 蛤蟆: 'há ma',\r\n 请假: 'qǐng jià',\r\n 钉子: 'dīng zi',\r\n 沉没: 'chén mò',\r\n 高丽: 'gāo lí',\r\n 休假: 'xiū jià',\r\n 无为: 'wú wéi',\r\n 巴结: 'bā jie',\r\n 了得: 'liǎo dé',\r\n 变相: 'biàn xiàng',\r\n 核弹: 'hé dàn',\r\n 亲家: 'qìng jia',\r\n 承载: 'chéng zài',\r\n 喝问: 'hè wèn',\r\n 还击: 'huán jī',\r\n 交还: 'jiāo huán',\r\n 将令: 'jiàng lìng',\r\n 单于: 'chán yú',\r\n 空缺: 'kòng quē',\r\n 绿林: 'lù lín',\r\n 胆量: 'dǎn liàng',\r\n 执着: 'zhí zhuó',\r\n 低调: 'dī diào',\r\n 闭塞: 'bì sè',\r\n 轻薄: 'qīng bó',\r\n 得当: 'dé dàng',\r\n 占卜: 'zhān bǔ',\r\n 扫帚: 'sào zhou',\r\n 龟兹: 'qiū cí',\r\n 年长: 'nián zhǎng',\r\n 外传: 'wài zhuàn',\r\n 头子: 'tóu zi',\r\n 裁缝: 'cái feng',\r\n 礼乐: 'lǐ yuè',\r\n 血泊: 'xuè pō',\r\n 散乱: 'sǎn luàn',\r\n 动量: 'dòng liàng',\r\n 倒腾: 'dǎo teng',\r\n 取舍: 'qǔ shě',\r\n 咱家: 'zán jiā',\r\n 长发: 'cháng fà',\r\n 爪哇: 'zhǎo wā',\r\n 弹壳: 'dàn ké',\r\n 省悟: 'xǐng wù',\r\n 嚷嚷: 'rāng rang',\r\n 连累: 'lián lèi',\r\n 应得: 'yīng dé',\r\n 族长: 'zú zhǎng',\r\n 柜子: 'guì zi',\r\n 擂鼓: 'léi gǔ',\r\n 眩晕: 'xuàn yùn',\r\n 调配: 'tiáo pèi',\r\n 躯干: 'qū gàn',\r\n 差役: 'chāi yì',\r\n 坎坷: 'kǎn kě',\r\n 少儿: 'shào ér',\r\n 乐团: 'yuè tuán',\r\n 养分: 'yǎng fèn',\r\n 退还: 'tuì huán',\r\n 格调: 'gé diào',\r\n 语调: 'yǔ diào',\r\n 音调: 'yīn diào',\r\n 乐府: 'yuè fǔ',\r\n 古朴: 'gǔ pǔ',\r\n 打点: 'dǎ diǎn',\r\n 差使: 'chāi shǐ',\r\n 匀称: 'yún chèn',\r\n 瘦削: 'shòu xuē',\r\n 膏药: 'gāo yao',\r\n 吞没: 'tūn mò',\r\n 调任: 'diào rèn',\r\n 散居: 'sǎn jū',\r\n 上头: 'shàng tóu',\r\n 风靡: 'fēng mǐ',\r\n 放假: 'fàng jià',\r\n 估量: 'gū liang',\r\n 失当: 'shī dàng',\r\n 中弹: 'zhòng dàn',\r\n 妄为: 'wàng wéi',\r\n 长者: 'zhǎng zhě',\r\n 起哄: 'qǐ hòng',\r\n 末了: 'mò liǎo',\r\n 相声: 'xiàng sheng',\r\n 校正: 'jiào zhèng',\r\n 劝降: 'quàn xiáng',\r\n 矢量: 'shǐ liàng',\r\n 沉闷: 'chén mèn',\r\n 给与: 'jǐ yǔ',\r\n 解法: 'jiě fǎ',\r\n 塞外: 'sài wài',\r\n 将校: 'jiàng xiào',\r\n 嗜好: 'shì hào',\r\n 没落: 'mò luò',\r\n 朴刀: 'pō dāo',\r\n 片子: 'piān zi',\r\n 切削: 'qiē xiāo',\r\n 弹丸: 'dàn wán',\r\n 稀薄: 'xī bó',\r\n 亏得: 'kuī dé',\r\n 间歇: 'jiàn xiē',\r\n 翘首: 'qiáo shǒu',\r\n 色调: 'sè diào',\r\n 处决: 'chǔ jué',\r\n 表率: 'biǎo shuài',\r\n 尺子: 'chǐ zi',\r\n 招降: 'zhāo xiáng',\r\n 称职: 'chèn zhí',\r\n 斗篷: 'dǒu peng',\r\n 铺子: 'pù zi',\r\n 底子: 'dǐ zi',\r\n 负载: 'fù zài',\r\n 干警: 'gàn jǐng',\r\n 倒数: 'dào shǔ',\r\n 将官: 'jiàng guān',\r\n 锄头: 'chú tou',\r\n 归降: 'guī xiáng',\r\n 疟疾: 'nüè ji',\r\n 唠叨: 'láo dao',\r\n 限量: 'xiàn liàng',\r\n 屏息: 'bǐng xī',\r\n 重逢: 'chóng féng',\r\n 器乐: 'qì yuè',\r\n 氢弹: 'qīng dàn',\r\n 脖颈: 'bó gěng',\r\n 妃子: 'fēi zi',\r\n 处事: 'chǔ shì',\r\n 参量: 'cān liàng',\r\n 轻率: 'qīng shuài',\r\n 缥缈: 'piāo miǎo',\r\n 中奖: 'zhòng jiǎng',\r\n 才干: 'cái gàn',\r\n 施舍: 'shī shě',\r\n 卷子: 'juàn zi',\r\n 游说: 'yóu shuì',\r\n 巷子: 'xiàng zi',\r\n 膀胱: 'páng guāng',\r\n 切勿: 'qiè wù',\r\n 看管: 'kān guǎn',\r\n 风头: 'fēng tou',\r\n 精干: 'jīng gàn',\r\n 高差: 'gāo chā',\r\n 恐吓: 'kǒng hè',\r\n 扁担: 'biǎn dàn',\r\n 给养: 'jǐ yǎng',\r\n 格子: 'gé zi',\r\n 供需: 'gōng xū',\r\n 反差: 'fǎn chā',\r\n 飞弹: 'fēi dàn',\r\n 微薄: 'wēi bó',\r\n 发型: 'fà xíng',\r\n 即兴: 'jí xìng',\r\n 攒动: 'cuán dòng',\r\n 间或: 'jiàn huò',\r\n 浅薄: 'qiǎn bó',\r\n 乐章: 'yuè zhāng',\r\n 顺差: 'shùn chā',\r\n 调子: 'diào zi',\r\n 相位: 'xiàng wèi',\r\n 转子: 'zhuàn zǐ',\r\n 劲旅: 'jìng lǚ',\r\n 咔嚓: 'kā chā',\r\n 了事: 'liǎo shì',\r\n 转悠: 'zhuàn you',\r\n 当铺: 'dàng pù',\r\n 爪子: 'zhuǎ zi',\r\n 单子: 'dān zi',\r\n 好战: 'hào zhàn',\r\n 燕麦: 'yàn mài',\r\n 只许: 'zhǐ xǔ',\r\n 干练: 'gàn liàn',\r\n 女将: 'nǚ jiàng',\r\n 酒量: 'jiǔ liàng',\r\n 划船: 'huá chuán',\r\n 伎俩: 'jì liǎng',\r\n 挑拨: 'tiǎo bō',\r\n 少校: 'shào xiào',\r\n 着落: 'zhuó luò',\r\n 憎恶: 'zēng wù',\r\n 刻薄: 'kè bó',\r\n 要挟: 'yāo xié',\r\n 用处: 'yòng chu',\r\n 还手: 'huán shǒu',\r\n 模具: 'mú jù',\r\n 执著: 'zhí zhuó',\r\n 喝令: 'hè lìng',\r\n 保长: 'bǎo zhǎng',\r\n 吸着: 'xī zhe',\r\n 症结: 'zhēng jié',\r\n 公转: 'gōng zhuàn',\r\n 校勘: 'jiào kān',\r\n 重提: 'chóng tí',\r\n 扫兴: 'sǎo xìng',\r\n 铺盖: 'pū gài',\r\n 长史: 'zhǎng shǐ',\r\n 差价: 'chā jià',\r\n 压根: 'yà gēn',\r\n 怔住: 'zhèng zhù',\r\n 应允: 'yīng yǔn',\r\n 切入: 'qiē rù',\r\n 战将: 'zhàn jiàng',\r\n 年少: 'nián shào',\r\n 舍身: 'shě shēn',\r\n 执拗: 'zhí niù',\r\n 处世: 'chǔ shì',\r\n 中风: 'zhòng fēng',\r\n 等量: 'děng liàng',\r\n 放量: 'fàng liàng',\r\n 腔调: 'qiāng diào',\r\n 老少: 'lǎo shào',\r\n 没入: 'mò rù',\r\n 瓜葛: 'guā gé',\r\n 将帅: 'jiàng shuài',\r\n 车载: 'chē zài',\r\n 窝囊: 'wō nang',\r\n 长进: 'zhǎng jìn',\r\n 可汗: 'kè hán',\r\n 并州: 'bīng zhōu',\r\n 供销: 'gōng xiāo',\r\n 切片: 'qiē piàn',\r\n 差事: 'chāi shì',\r\n 知会: 'zhī hui',\r\n 鹰爪: 'yīng zhǎo',\r\n 处女: 'chǔ nǚ',\r\n 切磋: 'qiē cuō',\r\n 日头: 'rì tou',\r\n 押解: 'yā jiè',\r\n 滋长: 'zī zhǎng',\r\n 道观: 'dào guàn',\r\n 脚色: 'jué sè',\r\n 当量: 'dāng liàng',\r\n 婆家: 'pó jia',\r\n 缘分: 'yuán fèn',\r\n 空闲: 'kòng xián',\r\n 好色: 'hào sè',\r\n 怒喝: 'nù hè',\r\n 笼统: 'lǒng tǒng',\r\n 边塞: 'biān sài',\r\n 何曾: 'hé céng',\r\n 重合: 'chóng hé',\r\n 零散: 'líng sǎn',\r\n 轰隆: 'hōng lōng',\r\n 化子: 'huà zi',\r\n 内蒙: 'nèi měng',\r\n 数落: 'shǔ luò',\r\n 逆差: 'nì chā',\r\n 牟利: 'móu lì',\r\n 栅栏: 'zhà lan',\r\n 中标: 'zhòng biāo',\r\n 调档: 'diào dàng',\r\n 佝偻: 'gōu lóu',\r\n 场子: 'chǎng zi',\r\n 甲壳: 'jiǎ qiào',\r\n 重温: 'chóng wēn',\r\n 炮制: 'páo zhì',\r\n 返还: 'fǎn huán',\r\n 自传: 'zì zhuàn',\r\n 高调: 'gāo diào',\r\n 殷红: 'yān hóng',\r\n 固着: 'gù zhuó',\r\n 强求: 'qiǎng qiú',\r\n 本相: 'běn xiàng',\r\n 骄横: 'jiāo hèng',\r\n 草率: 'cǎo shuài',\r\n 气闷: 'qì mèn',\r\n 着色: 'zhuó sè',\r\n 宁肯: 'nìng kěn',\r\n 兴头: 'xìng tou',\r\n 拘泥: 'jū nì',\r\n 夹角: 'jiā jiǎo',\r\n 发髻: 'fà jì',\r\n 猛将: 'měng jiàng',\r\n 约摸: 'yuē mo',\r\n 拖累: 'tuō lěi',\r\n 呢绒: 'ní róng',\r\n 钻探: 'zuān tàn',\r\n 夹层: 'jiā céng',\r\n 落魄: 'luò pò',\r\n 巷道: 'hàng dào',\r\n 运量: 'yùn liàng',\r\n 解闷: 'jiě mèn',\r\n 空儿: 'kòng er',\r\n 估摸: 'gū mo',\r\n 好客: 'hào kè',\r\n 钻孔: 'zuān kǒng',\r\n 糊弄: 'hù nòng',\r\n 荥阳: 'xíng yáng',\r\n 烦闷: 'fán mèn',\r\n 仓卒: 'cāng cù',\r\n 分叉: 'fēn chà',\r\n 厂子: 'chǎng zi',\r\n 小调: 'xiǎo diào',\r\n 少阳: 'shào yáng',\r\n 受降: 'shòu xiáng',\r\n 染坊: 'rǎn fáng',\r\n 胳臂: 'gē bei',\r\n 将门: 'jiàng mén',\r\n 模板: 'mú bǎn',\r\n 配给: 'pèi jǐ',\r\n 为伍: 'wéi wǔ',\r\n 跟头: 'gēn tou',\r\n 划算: 'huá suàn',\r\n 累赘: 'léi zhui',\r\n 哄笑: 'hōng xiào',\r\n 晕眩: 'yūn xuàn',\r\n 干掉: 'gàn diào',\r\n 缝制: 'féng zhì',\r\n 难处: 'nán chù',\r\n 着意: 'zhuó yì',\r\n 蛮横: 'mán hèng',\r\n 奇数: 'jī shù',\r\n 短发: 'duǎn fà',\r\n 生还: 'shēng huán',\r\n 还清: 'huán qīng',\r\n 看护: 'kān hù',\r\n 直率: 'zhí shuài',\r\n 奏乐: 'zòu yuè',\r\n 载客: 'zài kè',\r\n 专横: 'zhuān hèng',\r\n 湮没: 'yān mò',\r\n 空格: 'kòng gé',\r\n 铺垫: 'pū diàn',\r\n 良将: 'liáng jiàng',\r\n 哗啦: 'huā lā',\r\n 散漫: 'sǎn màn',\r\n 脱发: 'tuō fà',\r\n 送还: 'sòng huán',\r\n 埋没: 'mái mò',\r\n 累及: 'lěi jí',\r\n 薄雾: 'bó wù',\r\n 调离: 'diào lí',\r\n 舌苔: 'shé tāi',\r\n 机长: 'jī zhǎng',\r\n 栓塞: 'shuān sè',\r\n 配角: 'pèi jué',\r\n 切口: 'qiē kǒu',\r\n 创口: 'chuāng kǒu',\r\n 哈欠: 'hā qian',\r\n 实弹: 'shí dàn',\r\n 铺平: 'pū píng',\r\n 哈达: 'hǎ dá',\r\n 懒散: 'lǎn sǎn',\r\n 实干: 'shí gàn',\r\n 填空: 'tián kòng',\r\n 刁钻: 'diāo zuān',\r\n 乐师: 'yuè shī',\r\n 量变: 'liàng biàn',\r\n 诱降: 'yòu xiáng',\r\n 搪塞: 'táng sè',\r\n 征调: 'zhēng diào',\r\n 夹道: 'jiā dào',\r\n 干咳: 'gān ké',\r\n 止咳: 'zhǐ ké',\r\n 乐工: 'yuè gōng',\r\n 划过: 'huá guò',\r\n 着火: 'zháo huǒ',\r\n 更正: 'gēng zhèng',\r\n 给付: 'jǐ fù',\r\n 空子: 'kòng zi',\r\n 哪吒: 'né zhā',\r\n 正着: 'zhèng zháo',\r\n 刷子: 'shuā zi',\r\n 丧葬: 'sāng zàng',\r\n 夹带: 'jiā dài',\r\n 安分: 'ān fèn',\r\n 中意: 'zhòng yì',\r\n 长孙: 'zhǎng sūn',\r\n 校订: 'jiào dìng',\r\n 卷曲: 'juǎn qū',\r\n 载运: 'zài yùn',\r\n 投弹: 'tóu dàn',\r\n 柞蚕: 'zuò cán',\r\n 份量: 'fèn liàng',\r\n 调换: 'diào huàn',\r\n 了然: 'liǎo rán',\r\n 咧嘴: 'liě zuǐ',\r\n 典当: 'diǎn dàng',\r\n 寒假: 'hán jià',\r\n 长兄: 'zhǎng xiōng',\r\n 给水: 'jǐ shuǐ',\r\n 须发: 'xū fà',\r\n 枝干: 'zhī gàn',\r\n 属相: 'shǔ xiàng',\r\n 哄抢: 'hōng qiǎng',\r\n 刻划: 'kè huà',\r\n 塞子: 'sāi zi',\r\n 单干: 'dān gàn',\r\n 还乡: 'huán xiāng',\r\n 兆头: 'zhào tou',\r\n 寺观: 'sì guàn',\r\n 督率: 'dū shuài',\r\n 啊哈: 'ā ha',\r\n 割舍: 'gē shě',\r\n 抹布: 'mā bù',\r\n 好恶: 'hào wù',\r\n 下处: 'xià chǔ',\r\n 消长: 'xiāo zhǎng',\r\n 离间: 'lí jiàn',\r\n 准头: 'zhǔn tou',\r\n 校对: 'jiào duì',\r\n 什物: 'shí wù',\r\n 番禺: 'pān yú',\r\n 佛爷: 'fó ye',\r\n 吗啡: 'mǎ fēi',\r\n 盐分: 'yán fèn',\r\n 虎将: 'hǔ jiàng',\r\n 薄荷: 'bò he',\r\n 独处: 'dú chǔ',\r\n 空位: 'kòng wèi',\r\n 铺路: 'pū lù',\r\n 乌拉: 'wū lā',\r\n 调回: 'diào huí',\r\n 来头: 'lái tou',\r\n 闲散: 'xián sǎn',\r\n 胶卷: 'jiāo juǎn',\r\n 冒失: 'mào shi',\r\n 干劲: 'gàn jìn',\r\n 弦乐: 'xián yuè',\r\n 相国: 'xiàng guó',\r\n 丹参: 'dān shēn',\r\n 助兴: 'zhù xìng',\r\n 铺开: 'pū kāi',\r\n 次长: 'cì zhǎng',\r\n 发卡: 'fà qiǎ',\r\n 拮据: 'jié jū',\r\n 刹车: 'shā chē',\r\n 生发: 'shēng fà',\r\n 重播: 'chóng bō',\r\n 缝合: 'féng hé',\r\n 音量: 'yīn liàng',\r\n 少尉: 'shào wèi',\r\n 冲压: 'chòng yā',\r\n 苍劲: 'cāng jìng',\r\n 厚薄: 'hòu báo',\r\n 威吓: 'wēi hè',\r\n 外相: 'wài xiàng',\r\n 呼号: 'hū háo',\r\n 着迷: 'zháo mí',\r\n 挑担: 'tiāo dàn',\r\n 纹路: 'wén lù',\r\n 还俗: 'huán sú',\r\n 强横: 'qiáng hèng',\r\n 着数: 'zhāo shù',\r\n 降顺: 'xiáng shùn',\r\n 挑明: 'tiǎo míng',\r\n 眯缝: 'mī feng',\r\n 分内: 'fèn nèi',\r\n 更衣: 'gēng yī',\r\n 软和: 'ruǎn huo',\r\n 尽兴: 'jìn xìng',\r\n 号子: 'hào zi',\r\n 爪牙: 'zhǎo yá',\r\n 败将: 'bài jiàng',\r\n 猜中: 'cāi zhòng',\r\n 结扎: 'jié zā',\r\n 没空: 'méi kòng',\r\n 夹缝: 'jiā fèng',\r\n 拾掇: 'shí duo',\r\n 掺和: 'chān huo',\r\n 簸箕: 'bò ji',\r\n 电量: 'diàn liàng',\r\n 荷载: 'hè zǎi',\r\n 调式: 'diào shì',\r\n 处身: 'chǔ shēn',\r\n 打手: 'dǎ shǒu',\r\n 弹弓: 'dàn gōng',\r\n 横蛮: 'hèng mán',\r\n 能干: 'néng gàn',\r\n 校点: 'jiào diǎn',\r\n 加载: 'jiā zài',\r\n 干校: 'gàn xiào',\r\n 哄传: 'hōng chuán',\r\n 校注: 'jiào zhù',\r\n 淤塞: 'yū sè',\r\n 马扎: 'mǎ zhá',\r\n 月氏: 'yuè zhī',\r\n 高干: 'gāo gàn',\r\n 经传: 'jīng zhuàn',\r\n 曾孙: 'zēng sūn',\r\n 好斗: 'hào dòu',\r\n 关卡: 'guān qiǎ',\r\n 逃奔: 'táo bèn',\r\n 磨蹭: 'mó ceng',\r\n 牟取: 'móu qǔ',\r\n 颤栗: 'zhàn lì',\r\n 蚂蚱: 'mà zha',\r\n 撮合: 'cuō he',\r\n 趔趄: 'liè qie',\r\n 摔打: 'shuāi dǎ',\r\n 台子: 'tái zi',\r\n 分得: 'fēn de',\r\n 粘着: 'nián zhuó',\r\n 采邑: 'cài yì',\r\n 散装: 'sǎn zhuāng',\r\n 婀娜: 'ē nuó',\r\n 兴味: 'xìng wèi',\r\n 行头: 'xíng tou',\r\n 气量: 'qì liàng',\r\n 调运: 'diào yùn',\r\n 处治: 'chǔ zhì',\r\n 乐音: 'yuè yīn',\r\n 充塞: 'chōng sè',\r\n 恫吓: 'dòng hè',\r\n 论调: 'lùn diào',\r\n 相中: 'xiāng zhòng',\r\n 民乐: 'mín yuè',\r\n 炮仗: 'pào zhang',\r\n 丧服: 'sāng fú',\r\n 骁将: 'xiāo jiàng',\r\n 量刑: 'liàng xíng',\r\n 缝补: 'féng bǔ',\r\n 财会: 'cái kuài',\r\n 大干: 'dà gàn',\r\n 历数: 'lì shǔ',\r\n 校场: 'jiào chǎng',\r\n 塞北: 'sài běi',\r\n 识相: 'shí xiàng',\r\n 辱没: 'rǔ mò',\r\n 鲜亮: 'xiān liàng',\r\n 语塞: 'yǔ sè',\r\n 露脸: 'lòu liǎn',\r\n 凉快: 'liáng kuai',\r\n 腰杆: 'yāo gǎn',\r\n 溜达: 'liū da',\r\n 嘎嘎: 'gā gā',\r\n 公干: 'gōng gàn',\r\n 桔梗: 'jié gěng',\r\n 挑逗: 'tiǎo dòu',\r\n 看门: 'kān mén',\r\n 乐歌: 'yuè gē',\r\n 拓片: 'tà piàn',\r\n 挑动: 'tiǎo dòng',\r\n 准将: 'zhǔn jiàng',\r\n 遒劲: 'qiú jìng',\r\n 磨坊: 'mò fáng',\r\n 逶迤: 'wēi yí',\r\n 搅和: 'jiǎo huo',\r\n 摩挲: 'mó suō',\r\n 作弄: 'zuò nòng',\r\n 苗头: 'miáo tou',\r\n 打颤: 'dǎ zhàn',\r\n 大藏: 'dà zàng',\r\n 畜牲: 'chù shēng',\r\n 勾搭: 'gōu da',\r\n 树荫: 'shù yīn',\r\n 树杈: 'shù chà',\r\n 铁杆: 'tiě gǎn',\r\n 将相: 'jiàng xiàng',\r\n 份子: 'fèn zi',\r\n 视差: 'shì chā',\r\n 绿荫: 'lǜ yīn',\r\n 枪杆: 'qiāng gǎn',\r\n 缝纫: 'féng rèn',\r\n 愁闷: 'chóu mèn',\r\n 点将: 'diǎn jiàng',\r\n 华佗: 'huà tuó',\r\n 劲射: 'jìng shè',\r\n 箱笼: 'xiāng lǒng',\r\n 终了: 'zhōng liǎo',\r\n 鬓发: 'bìn fà',\r\n 结巴: 'jiē ba',\r\n 苦干: 'kǔ gàn',\r\n 看家: 'kān jiā',\r\n 正旦: 'zhēng dàn',\r\n 中肯: 'zhòng kěn',\r\n 厦门: 'xià mén',\r\n 东莞: 'dōng guǎn',\r\n 食量: 'shí liàng',\r\n 宫调: 'gōng diào',\r\n 间作: 'jiàn zuò',\r\n 弹片: 'dàn piàn',\r\n 差池: 'chā chí',\r\n 漂白: 'piǎo bái',\r\n 杠子: 'gàng zi',\r\n 调处: 'tiáo chǔ',\r\n 好动: 'hào dòng',\r\n 转炉: 'zhuàn lú',\r\n 屏气: 'bǐng qì',\r\n 夹板: 'jiā bǎn',\r\n 哀乐: 'āi yuè',\r\n 干道: 'gàn dào',\r\n 苦处: 'kǔ chù',\r\n 劈柴: 'pǐ chái',\r\n 长势: 'zhǎng shì',\r\n 天华: 'tiān huá',\r\n 共处: 'gòng chǔ',\r\n 校验: 'jiào yàn',\r\n 出塞: 'chū sài',\r\n 磨盘: 'mò pán',\r\n 萎靡: 'wěi mǐ',\r\n 奔丧: 'bēn sāng',\r\n 唱和: 'chàng hè',\r\n 大调: 'dà diào',\r\n 非分: 'fēi fèn',\r\n 钻营: 'zuān yíng',\r\n 夹子: 'jiā zi',\r\n 超载: 'chāo zài',\r\n 更始: 'gēng shǐ',\r\n 铃铛: 'líng dang',\r\n 披散: 'pī sàn',\r\n 发还: 'fā huán',\r\n 转轮: 'zhuàn lún',\r\n 横财: 'hèng cái',\r\n 泡桐: 'pāo tóng',\r\n 抛撒: 'pāo sǎ',\r\n 天呀: 'tiān yā',\r\n 糊糊: 'hū hu',\r\n 躯壳: 'qū qiào',\r\n 通量: 'tōng liàng',\r\n 奉还: 'fèng huán',\r\n 午觉: 'wǔ jiào',\r\n 闷棍: 'mèn gùn',\r\n 浪头: 'làng tou',\r\n 砚台: 'yàn tái',\r\n 油坊: 'yóu fáng',\r\n 学长: 'xué zhǎng',\r\n 过载: 'guò zài',\r\n 笔调: 'bǐ diào',\r\n 衣被: 'yī bèi',\r\n 畜产: 'xù chǎn',\r\n 调阅: 'diào yuè',\r\n 蛮干: 'mán gàn',\r\n 曾祖: 'zēng zǔ',\r\n 提干: 'tí gàn',\r\n 变调: 'biàn diào',\r\n 覆没: 'fù mò',\r\n 模子: 'mú zi',\r\n 乐律: 'yuè lǜ',\r\n 称心: 'chèn xīn',\r\n 木杆: 'mù gān',\r\n 重印: 'chóng yìn',\r\n 自省: 'zì xǐng',\r\n 提调: 'tí diào',\r\n 看相: 'kàn xiàng',\r\n 芋头: 'yù tou',\r\n 下切: 'xià qiē',\r\n 塞上: 'sài shàng',\r\n 铺张: 'pū zhāng',\r\n 藤蔓: 'téng wàn',\r\n 薄幸: 'bó xìng',\r\n 解数: 'xiè shù',\r\n 褪去: 'tuì qù',\r\n 霰弹: 'xiàn dàn',\r\n 柚木: 'yóu mù',\r\n 痕量: 'hén liàng',\r\n 雅乐: 'yǎ yuè',\r\n 号哭: 'háo kū',\r\n 诈降: 'zhà xiáng',\r\n 猪圈: 'zhū juàn',\r\n 咋舌: 'zé shé',\r\n 铣床: 'xǐ chuáng',\r\n 防弹: 'fáng dàn',\r\n 健将: 'jiàn jiàng',\r\n 丽水: 'lí shuǐ',\r\n 削发: 'xuē fà',\r\n 空当: 'kòng dāng',\r\n 多相: 'duō xiàng',\r\n 鲜见: 'xiǎn jiàn',\r\n 划桨: 'huá jiǎng',\r\n 载波: 'zài bō',\r\n 跳蚤: 'tiào zao',\r\n 俏皮: 'qiào pí',\r\n 吧嗒: 'bā dā',\r\n 结发: 'jié fà',\r\n 了断: 'liǎo duàn',\r\n 同调: 'tóng diào',\r\n 石磨: 'shí mò',\r\n 时差: 'shí chā',\r\n 鼻塞: 'bí sè',\r\n 挑子: 'tiāo zi',\r\n 推磨: 'tuī mò',\r\n 武侯: 'wǔ hóu',\r\n 抹煞: 'mǒ shā',\r\n 调转: 'diào zhuǎn',\r\n 籍没: 'jí mò',\r\n 还债: 'huán zhài',\r\n 调演: 'diào yǎn',\r\n 分划: 'fēn huá',\r\n 奇偶: 'jī ǒu',\r\n 断喝: 'duàn hè',\r\n 闷雷: 'mèn léi',\r\n 狼藉: 'láng jí',\r\n 饭量: 'fàn liàng',\r\n 还礼: 'huán lǐ',\r\n 转调: 'zhuǎn diào',\r\n 星相: 'xīng xiàng',\r\n 手相: 'shǒu xiàng',\r\n 配乐: 'pèi yuè',\r\n 盖头: 'gài tou',\r\n 连杆: 'lián gǎn',\r\n 簿记: 'bù jì',\r\n 刀把: 'dāo bà',\r\n 量词: 'liàng cí',\r\n 名角: 'míng jué',\r\n 步调: 'bù diào',\r\n 校本: 'jiào běn',\r\n 账簿: 'zhàng bù',\r\n 隽永: 'juàn yǒng',\r\n 稍为: 'shāo wéi',\r\n 易传: 'yì zhuàn',\r\n 乐谱: 'yuè pǔ',\r\n 牵累: 'qiān lěi',\r\n 答理: 'dā li',\r\n 喝斥: 'hè chì',\r\n 吟哦: 'yín é',\r\n 干渠: 'gàn qú',\r\n 海量: 'hǎi liàng',\r\n 精当: 'jīng dàng',\r\n 着床: 'zhuó chuáng',\r\n 月相: 'yuè xiàng',\r\n 庶几: 'shù jī',\r\n 宫观: 'gōng guàn',\r\n 论处: 'lùn chǔ',\r\n 征辟: 'zhēng bì',\r\n 厚朴: 'hòu pò',\r\n 介壳: 'jiè qiào',\r\n 吭哧: 'kēng chī',\r\n 咯血: 'kǎ xiě',\r\n 铺陈: 'pū chén',\r\n 重生: 'chóng shēng',\r\n 乐理: 'yuè lǐ',\r\n 哀号: 'āi háo',\r\n 藏历: 'zàng lì',\r\n 刚劲: 'gāng jìng',\r\n 削平: 'xuē píng',\r\n 浓荫: 'nóng yīn',\r\n 城垛: 'chéng duǒ',\r\n 当差: 'dāng chāi',\r\n 正传: 'zhèng zhuàn',\r\n 并处: 'bìng chǔ',\r\n 创面: 'chuāng miàn',\r\n 旦角: 'dàn jué',\r\n 薄礼: 'bó lǐ',\r\n 晃荡: 'huàng dang',\r\n 臊子: 'sào zi',\r\n 家什: 'jiā shí',\r\n 闷头: 'mēn tóu',\r\n 美发: 'měi fà',\r\n 度数: 'dù shu',\r\n 着凉: 'zháo liáng',\r\n 闯将: 'chuǎng jiàng',\r\n 几案: 'jī àn',\r\n 姘头: 'pīn tou',\r\n 差数: 'chā shù',\r\n 散碎: 'sǎn suì',\r\n 壅塞: 'yōng sè',\r\n 寒颤: 'hán zhàn',\r\n 牵强: 'qiān qiǎng',\r\n 无间: 'wú jiàn',\r\n 轮转: 'lún zhuàn',\r\n 号叫: 'háo jiào',\r\n 铺排: 'pū pái',\r\n 降伏: 'xiáng fú',\r\n 轧钢: 'zhá gāng',\r\n 东阿: 'dōng ē',\r\n 病假: 'bìng jià',\r\n 累加: 'lěi jiā',\r\n 梗塞: 'gěng sè',\r\n 弹夹: 'dàn jiā',\r\n 钻心: 'zuān xīn',\r\n 晃眼: 'huǎng yǎn',\r\n 魔爪: 'mó zhǎo',\r\n 标量: 'biāo liàng',\r\n 憋闷: 'biē mèn',\r\n 猜度: 'cāi duó',\r\n 处士: 'chǔ shì',\r\n 官差: 'guān chāi',\r\n 讨还: 'tǎo huán',\r\n 长门: 'cháng mén',\r\n 馏分: 'liú fēn',\r\n 里弄: 'lǐ lòng',\r\n 色相: 'sè xiàng',\r\n 雅兴: 'yǎ xìng',\r\n 角力: 'jué lì',\r\n 弹坑: 'dàn kēng',\r\n 枝杈: 'zhī chà',\r\n 夹具: 'jiā jù',\r\n 处刑: 'chǔ xíng',\r\n 悍将: 'hàn jiàng',\r\n 好学: 'hào xué',\r\n 好好: 'hǎo hǎo',\r\n 银发: 'yín fà',\r\n 扫把: 'sào bǎ',\r\n 法相: 'fǎ xiàng',\r\n 贵干: 'guì gàn',\r\n 供气: 'gōng qì',\r\n 空余: 'kòng yú',\r\n 捆扎: 'kǔn zā',\r\n 瘠薄: 'jí bó',\r\n 浆糊: 'jiàng hu',\r\n 嘎吱: 'gā zhī',\r\n 调令: 'diào lìng',\r\n 法帖: 'fǎ tiè',\r\n 淋病: 'lìn bìng',\r\n 调派: 'diào pài',\r\n 转盘: 'zhuàn pán',\r\n 供稿: 'gōng gǎo',\r\n 差官: 'chāi guān',\r\n 忧闷: 'yōu mèn',\r\n 教长: 'jiào zhǎng',\r\n 重唱: 'chóng chàng',\r\n 酒兴: 'jiǔ xìng',\r\n 乐坛: 'yuè tán',\r\n 花呢: 'huā ní',\r\n 叱喝: 'chì hè',\r\n 膀臂: 'bǎng bì',\r\n 得空: 'dé kòng',\r\n 转圈: 'zhuàn quān',\r\n 横暴: 'hèng bào',\r\n 哄抬: 'hōng tái',\r\n 引吭: 'yǐn háng',\r\n 载货: 'zài huò',\r\n 中计: 'zhòng jì',\r\n 官长: 'guān zhǎng',\r\n 相面: 'xiàng miàn',\r\n 看头: 'kàn tou',\r\n 盼头: 'pàn tou',\r\n 意兴: 'yì xìng',\r\n 军乐: 'jūn yuè',\r\n 累次: 'lěi cì',\r\n 骨嘟: 'gǔ dū',\r\n 燕赵: 'yān zhào',\r\n 报丧: 'bào sāng',\r\n 弥撒: 'mí sa',\r\n 挨斗: 'ái dòu',\r\n 扁舟: 'piān zhōu',\r\n 丑角: 'chǒu jué',\r\n 吊丧: 'diào sāng',\r\n 强将: 'qiáng jiàng',\r\n 重奏: 'chóng zòu',\r\n 发辫: 'fà biàn',\r\n 着魔: 'zháo mó',\r\n 着法: 'zhāo fǎ',\r\n 盛放: 'shèng fàng',\r\n 填塞: 'tián sè',\r\n 凶横: 'xiōng hèng',\r\n 稽首: 'qǐ shǒu',\r\n 碑帖: 'bēi tiè',\r\n 冲量: 'chōng liàng',\r\n 发菜: 'fà cài',\r\n 假发: 'jiǎ fà',\r\n 翻卷: 'fān juǎn',\r\n 小量: 'xiǎo liàng',\r\n 胶着: 'jiāo zhuó',\r\n 里子: 'lǐ zi',\r\n 调调: 'diào diao',\r\n 散兵: 'sǎn bīng',\r\n 高挑: 'gāo tiǎo',\r\n 播撒: 'bō sǎ',\r\n 夹心: 'jiā xīn',\r\n 扇动: 'shān dòng',\r\n 叨扰: 'tāo rǎo',\r\n 霓裳: 'ní cháng',\r\n 捻子: 'niǎn zi',\r\n 弥缝: 'mí féng',\r\n 撒布: 'sǎ bù',\r\n 场院: 'cháng yuàn',\r\n 省亲: 'xǐng qīn',\r\n 提拉: 'tí lā',\r\n 惯量: 'guàn liàng',\r\n 强逼: 'qiáng bī',\r\n 强征: 'qiáng zhēng',\r\n 晕车: 'yùn chē',\r\n 数道: 'shù dào',\r\n 带累: 'dài lèi',\r\n 拓本: 'tà běn',\r\n 嫌恶: 'xián wù',\r\n 宿将: 'sù jiàng',\r\n 龟裂: 'jūn liè',\r\n 缠夹: 'chán jiā',\r\n 发式: 'fà shì',\r\n 隔扇: 'gé shàn',\r\n 天分: 'tiān fèn',\r\n 癖好: 'pǐ hào',\r\n 四通: 'sì tōng',\r\n 白术: 'bái zhú',\r\n 划伤: 'huá shāng',\r\n 角斗: 'jué dòu',\r\n 听差: 'tīng chāi',\r\n 岁差: 'suì chā',\r\n 丧礼: 'sāng lǐ',\r\n 脉脉: 'mò mò',\r\n 削瘦: 'xuē shòu',\r\n 撒播: 'sǎ bō',\r\n 莎草: 'suō cǎo',\r\n 犍为: 'qián wéi',\r\n 调头: 'diào tóu',\r\n 龙卷: 'lóng juǎn',\r\n 外调: 'wài diào',\r\n 字帖: 'zì tiè',\r\n 卷发: 'juǎn fà',\r\n 揣度: 'chuǎi duó',\r\n 洋相: 'yáng xiàng',\r\n 散光: 'sǎn guāng',\r\n 骨碌: 'gū lu',\r\n 薄命: 'bó mìng',\r\n 笼头: 'lóng tóu',\r\n 咽炎: 'yān yán',\r\n 碌碡: 'liù zhou',\r\n 片儿: 'piàn er',\r\n 纤手: 'qiàn shǒu',\r\n 散体: 'sǎn tǐ',\r\n 内省: 'nèi xǐng',\r\n 强留: 'qiáng liú',\r\n 解送: 'jiè sòng',\r\n 反间: 'fǎn jiàn',\r\n 少壮: 'shào zhuàng',\r\n 留空: 'liú kōng',\r\n 告假: 'gào jià',\r\n 咳血: 'ké xuè',\r\n 薄暮: 'bó mù',\r\n 铺轨: 'pū guǐ',\r\n 磨削: 'mó xuē',\r\n 治丧: 'zhì sāng',\r\n 叉子: 'chā zi',\r\n 哄动: 'hōng dòng',\r\n 蛾子: 'é zi',\r\n 出落: 'chū luò',\r\n 股长: 'gǔ zhǎng',\r\n 贵处: 'guì chù',\r\n 还魂: 'huán hún',\r\n 例假: 'lì jià',\r\n 刹住: 'shā zhù',\r\n 身量: 'shēn liàng',\r\n 同好: 'tóng hào',\r\n 模量: 'mó liàng',\r\n 更生: 'gēng shēng',\r\n 服丧: 'fú sāng',\r\n 率直: 'shuài zhí',\r\n 字模: 'zì mú',\r\n 散架: 'sǎn jià',\r\n 答腔: 'dā qiāng',\r\n 交恶: 'jiāo wù',\r\n 薄情: 'bó qíng',\r\n 眼泡: 'yǎn pāo',\r\n 袅娜: 'niǎo nuó',\r\n 草垛: 'cǎo duò',\r\n 冲劲: 'chòng jìn',\r\n 呢喃: 'ní nán',\r\n 切中: 'qiè zhòng',\r\n 挑灯: 'tiǎo dēng',\r\n 还愿: 'huán yuàn',\r\n 激将: 'jī jiàng',\r\n 更鼓: 'gēng gǔ',\r\n 没药: 'mò yào',\r\n 败兴: 'bài xìng',\r\n 切面: 'qiē miàn',\r\n 散户: 'sǎn hù',\r\n 累进: 'lěi jìn',\r\n 背带: 'bēi dài',\r\n 秤杆: 'chèng gǎn',\r\n 碾坊: 'niǎn fáng',\r\n 簿子: 'bù zi',\r\n 扳手: 'bān shǒu',\r\n 铅山: 'yán shān',\r\n 儒将: 'rú jiàng',\r\n 重光: 'chóng guāng',\r\n 剪发: 'jiǎn fà',\r\n 长上: 'zhǎng shàng',\r\n 小传: 'xiǎo zhuàn',\r\n 压轴: 'yā zhòu',\r\n 弱冠: 'ruò guàn',\r\n 花卷: 'huā juǎn',\r\n 横祸: 'hèng huò',\r\n 夹克: 'jiā kè',\r\n 光晕: 'guāng yùn',\r\n 披靡: 'pī mǐ',\r\n 对调: 'duì diào',\r\n 夹持: 'jiā chí',\r\n 空额: 'kòng é',\r\n 平调: 'píng diào',\r\n 铺床: 'pū chuáng',\r\n 丧钟: 'sāng zhōng',\r\n 作乐: 'zuò lè',\r\n 少府: 'shào fǔ',\r\n 数数: 'shuò shuò',\r\n 奔头: 'bèn tou',\r\n 进给: 'jìn jǐ',\r\n 率性: 'shuài xìng',\r\n 乐子: 'lè zi',\r\n 绑扎: 'bǎng zā',\r\n 挑唆: 'tiǎo suō',\r\n 漂洗: 'piǎo xǐ',\r\n 夹墙: 'jiā qiáng',\r\n 咳喘: 'ké chuǎn',\r\n 乜斜: 'miē xie',\r\n 错处: 'cuò chù',\r\n 闷酒: 'mèn jiǔ',\r\n 时调: 'shí diào',\r\n 重孙: 'chóng sūn',\r\n 经幢: 'jīng chuáng',\r\n 圩场: 'xū chǎng',\r\n 调门: 'diào mén',\r\n 花头: 'huā tóu',\r\n 划拉: 'huá la',\r\n 套色: 'tào shǎi',\r\n 粗率: 'cū shuài',\r\n 相率: 'xiāng shuài',\r\n 款识: 'kuǎn zhì',\r\n 吁请: 'yù qǐng',\r\n 荫蔽: 'yīn bì',\r\n 文蛤: 'wén gé',\r\n 嘀嗒: 'dī dā',\r\n 调取: 'diào qǔ',\r\n 交差: 'jiāo chāi',\r\n 落子: 'luò zǐ',\r\n 相册: 'xiàng cè',\r\n 絮叨: 'xù dao',\r\n 落发: 'luò fà',\r\n 异相: 'yì xiàng',\r\n 浸没: 'jìn mò',\r\n 角抵: 'jué dǐ',\r\n 卸载: 'xiè zài',\r\n 春卷: 'chūn juǎn',\r\n 扎挣: 'zhá zheng',\r\n 畜养: 'xù yǎng',\r\n 吡咯: 'bǐ luò',\r\n 垛子: 'duò zi',\r\n 恶少: 'è shào',\r\n 发际: 'fà jì',\r\n 红苕: 'hóng sháo',\r\n 糨糊: 'jiàng hu',\r\n 哭丧: 'kū sāng',\r\n 稍息: 'shào xī',\r\n 晕船: 'yùn chuán',\r\n 校样: 'jiào yàng',\r\n 外差: 'wài chā',\r\n 脚爪: 'jiǎo zhǎo',\r\n 铺展: 'pū zhǎn',\r\n 芫荽: 'yán sui',\r\n 夹紧: 'jiā jǐn',\r\n 尿泡: 'suī pào',\r\n 丧乱: 'sāng luàn',\r\n 凶相: 'xiōng xiàng',\r\n 华发: 'huá fà',\r\n 打场: 'dǎ cháng',\r\n 云量: 'yún liàng',\r\n 正切: 'zhèng qiē',\r\n 划拳: 'huá quán',\r\n 划艇: 'huá tǐng',\r\n 评传: 'píng zhuàn',\r\n 拉纤: 'lā qiàn',\r\n 句读: 'jù dòu',\r\n 散剂: 'sǎn jì',\r\n 骨殖: 'gǔ shi',\r\n 塞音: 'sè yīn',\r\n 铺叙: 'pū xù',\r\n 阏氏: 'yān zhī',\r\n 冷颤: 'lěng zhàn',\r\n 煞住: 'shā zhù',\r\n 少男: 'shào nán',\r\n 管乐: 'guǎn yuè',\r\n 号啕: 'háo táo',\r\n 纳降: 'nà xiáng',\r\n 拥塞: 'yōng sè',\r\n 万乘: 'wàn shèng',\r\n 杆儿: 'gǎn ér',\r\n 葛藤: 'gé téng',\r\n 簿籍: 'bù jí',\r\n 皮夹: 'pí jiā',\r\n 校准: 'jiào zhǔn',\r\n 允当: 'yǔn dàng',\r\n 器量: 'qì liàng',\r\n 选调: 'xuǎn diào',\r\n 扮相: 'bàn xiàng',\r\n 干才: 'gàn cái',\r\n 基干: 'jī gàn',\r\n 割切: 'gē qiē',\r\n 国乐: 'guó yuè',\r\n 卡壳: 'qiǎ ké',\r\n 辟谷: 'bì gǔ',\r\n 磨房: 'mò fáng',\r\n 咿呀: 'yī yā',\r\n 芥末: 'jiè mo',\r\n 薄技: 'bó jì',\r\n 产假: 'chǎn jià',\r\n 诗兴: 'shī xìng',\r\n 重出: 'chóng chū',\r\n 转椅: 'zhuàn yǐ',\r\n 酌量: 'zhuó liang',\r\n 簿册: 'bù cè',\r\n 藏青: 'zàng qīng',\r\n 的士: 'dī shì',\r\n 调人: 'diào rén',\r\n 解元: 'jiè yuán',\r\n 茎干: 'jīng gàn',\r\n 巨量: 'jù liàng',\r\n 榔头: 'láng tou',\r\n 率真: 'shuài zhēn',\r\n 喷香: 'pèn xiāng',\r\n 锁钥: 'suǒ yuè',\r\n 虾蟆: 'há má',\r\n 相图: 'xiàng tú',\r\n 兴会: 'xìng huì',\r\n 灶头: 'zào tóu',\r\n 重婚: 'chóng hūn',\r\n 钻洞: 'zuān dòng',\r\n 忖度: 'cǔn duó',\r\n 党参: 'dǎng shēn',\r\n 调温: 'diào wēn',\r\n 杆塔: 'gān tǎ',\r\n 葛布: 'gé bù',\r\n 拱券: 'gǒng xuàn',\r\n 夹生: 'jiā shēng',\r\n 露馅: 'lòu xiàn',\r\n 恰切: 'qià qiè',\r\n 散见: 'sǎn jiàn',\r\n 哨卡: 'shào qiǎ',\r\n 烫发: 'tàng fà',\r\n 体量: 'tǐ liàng',\r\n 挺括: 'tǐng kuò',\r\n 系带: 'jì dài',\r\n 相士: 'xiàng shì',\r\n 羊圈: 'yáng juàn',\r\n 转矩: 'zhuàn jǔ',\r\n 吧台: 'bā tái',\r\n 苍术: 'cāng zhú',\r\n 菲薄: 'fěi bó',\r\n 蛤蚧: 'gé jiè',\r\n 蛤蜊: 'gé lí',\r\n 瓜蔓: 'guā wàn',\r\n 怪相: 'guài xiàng',\r\n 临帖: 'lín tiè',\r\n 女红: 'nǚ gōng',\r\n 刨床: 'bào chuáng',\r\n 翘楚: 'qiáo chǔ',\r\n 数九: 'shǔ jiǔ',\r\n 谈兴: 'tán xìng',\r\n 雄劲: 'xióng jìng',\r\n 扎染: 'zā rǎn',\r\n 遮荫: 'zhē yīn',\r\n 周正: 'zhōu zhèng',\r\n 赚头: 'zhuàn tou',\r\n 扒手: 'pá shǒu',\r\n 搀和: 'chān huo',\r\n 诚朴: 'chéng pǔ',\r\n 肚量: 'dù liàng',\r\n 干结: 'gān jié',\r\n 工尺: 'gōng chě',\r\n 家累: 'jiā lěi',\r\n 曲水: 'qū shuǐ',\r\n 沙参: 'shā shēn',\r\n 挑花: 'tiǎo huā',\r\n 阿门: 'ā mén',\r\n 背篓: 'bēi lǒu',\r\n 瘪三: 'biē sān',\r\n 裁处: 'cái chǔ',\r\n 创痛: 'chuāng tòng',\r\n 福相: 'fú xiàng',\r\n 更动: 'gēng dòng',\r\n 豪兴: 'háo xìng',\r\n 还阳: 'huán yáng',\r\n 还嘴: 'huán zuǐ',\r\n 借调: 'jiè diào',\r\n 卷云: 'juǎn yún',\r\n 流弹: 'liú dàn',\r\n 想头: 'xiǎng tou',\r\n 削价: 'xuē jià',\r\n 校阅: 'jiào yuè',\r\n 雅量: 'yǎ liàng',\r\n 别传: 'bié zhuàn',\r\n 薄酒: 'bó jiǔ',\r\n 春假: 'chūn jià',\r\n 发妻: 'fà qī',\r\n 哗哗: 'huā huā',\r\n 宽绰: 'kuān chuo',\r\n 了悟: 'liǎo wù',\r\n 切花: 'qiē huā',\r\n 审度: 'shěn duó',\r\n 应许: 'yīng xǔ',\r\n 转台: 'zhuàn tái',\r\n 仔猪: 'zǐ zhū',\r\n 裁量: 'cái liáng',\r\n 藏戏: 'zàng xì',\r\n 乘兴: 'chéng xìng',\r\n 绸缪: 'chóu móu',\r\n 摧折: 'cuī zhé',\r\n 调经: 'tiáo jīng',\r\n 调职: 'diào zhí',\r\n 缝缀: 'féng zhuì',\r\n 骨朵: 'gū duǒ',\r\n 核儿: 'hú er',\r\n 恒量: 'héng liàng',\r\n 还价: 'huán jià',\r\n 浑朴: 'hún pǔ',\r\n 苦差: 'kǔ chāi',\r\n 面糊: 'miàn hù',\r\n 煞车: 'shā chē',\r\n 省视: 'xǐng shì',\r\n 什锦: 'shí jǐn',\r\n 信差: 'xìn chāi',\r\n 余切: 'yú qiē',\r\n 攒眉: 'cuán méi',\r\n 炸糕: 'zhá gāo',\r\n 钻杆: 'zuàn gǎn',\r\n 扒灰: 'pá huī',\r\n 拌和: 'bàn huò',\r\n 长调: 'cháng diào',\r\n 大溜: 'dà liù',\r\n 抖搂: 'dǒu lōu',\r\n 飞转: 'fēi zhuàn',\r\n 干仗: 'gàn zhàng',\r\n 好胜: 'hào shèng',\r\n 画片: 'huà piàn',\r\n 搅混: 'jiǎo hún',\r\n 螺杆: 'luó gǎn',\r\n 木模: 'mù mú',\r\n 怒号: 'nù háo',\r\n 频数: 'pín shù',\r\n 无宁: 'wú níng',\r\n 遗少: 'yí shào',\r\n 邮差: 'yóu chāi',\r\n 占卦: 'zhān guà',\r\n 占星: 'zhān xīng',\r\n 重审: 'chóng shěn',\r\n 自量: 'zì liàng',\r\n 调防: 'diào fáng',\r\n 发廊: 'fà láng',\r\n 反调: 'fǎn diào',\r\n 缝子: 'fèng zi',\r\n 更夫: 'gēng fū',\r\n 骨子: 'gǔ zi',\r\n 光杆: 'guāng gǎn',\r\n 夹棍: 'jiā gùn',\r\n 居丧: 'jū sāng',\r\n 巨贾: 'jù gǔ',\r\n 看押: 'kān yā',\r\n 空转: 'kōng zhuàn',\r\n 量力: 'liàng lì',\r\n 炮烙: 'páo luò',\r\n 赔还: 'péi huán',\r\n 扑扇: 'pū shān',\r\n 散记: 'sǎn jì',\r\n 散件: 'sǎn jiàn',\r\n 删削: 'shān xuē',\r\n 射干: 'shè gàn',\r\n 条几: 'tiáo jī',\r\n 偷空: 'tōu kòng',\r\n 削壁: 'xuē bì',\r\n 校核: 'jiào hé',\r\n 阴干: 'yīn gān',\r\n 择菜: 'zhái cài',\r\n 重九: 'chóng jiǔ',\r\n 主调: 'zhǔ diào',\r\n 自禁: 'zì jīn',\r\n 吧唧: 'bā jī',\r\n 便溺: 'biàn niào',\r\n 词调: 'cí diào',\r\n 叨咕: 'dáo gu',\r\n 落枕: 'lào zhěn',\r\n 铺砌: 'pū qì',\r\n 刷白: 'shuà bái',\r\n 委靡: 'wěi mǐ',\r\n 系泊: 'xì bó',\r\n 相马: 'xiàng mǎ',\r\n 熨帖: 'yù tiē',\r\n 转筋: 'zhuàn jīn',\r\n 棒喝: 'bàng hè',\r\n 傧相: 'bīn xiàng',\r\n 镐头: 'gǎo tóu',\r\n 间苗: 'jiàn miáo',\r\n 乐池: 'yuè chí',\r\n 卖相: 'mài xiàng',\r\n 屏弃: 'bǐng qì',\r\n 铅弹: 'qiān dàn',\r\n 切变: 'qiē biàn',\r\n 请调: 'qǐng diào',\r\n 群氓: 'qún méng',\r\n 散板: 'sǎn bǎn',\r\n 省察: 'xǐng chá',\r\n 事假: 'shì jià',\r\n 纤绳: 'qiàn shéng',\r\n 重影: 'chóng yǐng',\r\n 耕种: 'gēng zhòng',\r\n 种地: 'zhòng dì',\r\n 种菜: 'zhòng cài',\r\n 栽种: 'zāi zhòng',\r\n 接种: 'jiē zhòng',\r\n 垦种: 'kěn zhòng',\r\n 种殖: 'zhòng zhí',\r\n 种瓜: 'zhòng guā',\r\n 种豆: 'zhòng dòu',\r\n 种树: 'zhòng shù',\r\n 睡着: 'shuì zháo',\r\n 笼子: 'lóng zi',\r\n 重启: 'chóng qǐ',\r\n 重整: 'chóng zhěng',\r\n 重弹: 'chóng tán',\r\n 重足: 'chóng zú',\r\n 重山: 'chóng shān',\r\n 重游: 'chóng yóu',\r\n 重峦: 'chóng luán',\r\n 爷爷: 'yé ye',\r\n 奶奶: 'nǎi nai',\r\n 姥爷: 'lǎo ye',\r\n 爸爸: 'bà ba',\r\n 妈妈: 'mā ma',\r\n 婶婶: 'shěn shen',\r\n 舅舅: 'jiù jiu',\r\n 姑姑: 'gū gu',\r\n 叔叔: 'shū shu',\r\n 姨夫: 'yí fu',\r\n 舅母: 'jiù mu',\r\n 姑父: 'gū fu',\r\n 姐夫: 'jiě fu',\r\n 婆婆: 'pó po',\r\n 公公: 'gōng gong',\r\n 舅子: 'jiù zi',\r\n 姐姐: 'jiě jie',\r\n 哥哥: 'gē ge',\r\n 妹妹: 'mèi mei',\r\n 妹夫: 'mèi fu',\r\n 姨子: 'yí zi',\r\n 宝宝: 'bǎo bao',\r\n 娃娃: 'wá wa',\r\n 孩子: 'hái zi',\r\n 日子: 'rì zi',\r\n 样子: 'yàng zi',\r\n 狮子: 'shī zi',\r\n 身子: 'shēn zi',\r\n 架子: 'jià zi',\r\n 嫂子: 'sǎo zi',\r\n 鼻子: 'bí zi',\r\n 亭子: 'tíng zi',\r\n 折子: 'zhé zi',\r\n 面子: 'miàn zi',\r\n 脖子: 'bó zi',\r\n 辈子: 'bèi zi',\r\n 帽子: 'mào zi',\r\n 拍子: 'pāi zi',\r\n 柱子: 'zhù zi',\r\n 辫子: 'biàn zi',\r\n 鸽子: 'gē zi',\r\n 房子: 'fáng zi',\r\n 丸子: 'wán zi',\r\n 摊子: 'tān zi',\r\n 牌子: 'pái zi',\r\n 胡子: 'hú zi',\r\n 鬼子: 'guǐ zi',\r\n 矮子: 'ǎi zi',\r\n 鸭子: 'yā zi',\r\n 小子: 'xiǎo zi',\r\n 影子: 'yǐng zi',\r\n 屋子: 'wū zi',\r\n 对子: 'duì zi',\r\n 点子: 'diǎn zi',\r\n 本子: 'běn zi',\r\n 种子: 'zhǒng zi',\r\n 儿子: 'ér zi',\r\n 兔子: 'tù zi',\r\n 骗子: 'piàn zi',\r\n 院子: 'yuàn zi',\r\n 猴子: 'hóu zi',\r\n 嗓子: 'sǎng zi',\r\n 侄子: 'zhí zi',\r\n 柿子: 'shì zi',\r\n 钳子: 'qián zi',\r\n 虱子: 'shī zi',\r\n 瓶子: 'píng zi',\r\n 豹子: 'bào zi',\r\n 筷子: 'kuài zi',\r\n 篮子: 'lán zi',\r\n 绳子: 'shéng zi',\r\n 嘴巴: 'zuǐ ba',\r\n 耳朵: 'ěr duo',\r\n 茄子: 'qié zi',\r\n 蚌埠: 'bèng bù',\r\n 崆峒: 'kōng tóng',\r\n 琵琶: 'pí pa',\r\n 蘑菇: 'mó gu',\r\n 葫芦: 'hú lu',\r\n 狐狸: 'hú li',\r\n 桔子: 'jú zi',\r\n 盒子: 'hé zi',\r\n 桌子: 'zhuō zi',\r\n 竹子: 'zhú zi',\r\n 师傅: 'shī fu',\r\n 衣服: 'yī fu',\r\n 袜子: 'wà zi',\r\n 杯子: 'bēi zi',\r\n 刺猬: 'cì wei',\r\n 麦子: 'mài zi',\r\n 队伍: 'duì wu',\r\n 知了: 'zhī liǎo',\r\n 鱼儿: 'yú er',\r\n 馄饨: 'hún tun',\r\n 灯笼: 'dēng long',\r\n 庄稼: 'zhuāng jia',\r\n 聪明: 'cōng ming',\r\n 镜子: 'jìng zi',\r\n 银子: 'yín zi',\r\n 盘子: 'pán zi',\r\n 了却: 'liǎo què',\r\n 力气: 'lì qi',\r\n 席子: 'xí zi',\r\n 林子: 'lín zi',\r\n 朝霞: 'zhāo xiá',\r\n 朝夕: 'zhāo xī',\r\n 朝气: 'zhāo qì',\r\n 翅膀: 'chì bǎng',\r\n 省长: 'shěng zhǎng',\r\n 臧否: 'zāng pǐ',\r\n 否泰: 'pǐ tài',\r\n 变得: 'biàn de',\r\n 丈夫: 'zhàng fu',\r\n 豆腐: 'dòu fu',\r\n 笔杆: 'bǐ gǎn',\r\n 枞阳: 'zōng yáng',\r\n 行人: 'xíng rén',\r\n 打着: 'dǎ zhe',\r\n // 一字不变调的词语(需要增补更多)\r\n // 有歧义的词:一楼、一栋、一层、一排、一连\r\n // “一楼”这个词,上下文语意是“一整栋楼”时,需要变调成四声;我住一楼时,则是一声\r\n 第一: 'dì yī',\r\n 万一: 'wàn yī',\r\n 之一: 'zhī yī',\r\n 得之: 'dé zhī',\r\n 统一: 'tǒng yī',\r\n 唯一: 'wéi yī',\r\n 专一: 'zhuān yī',\r\n 单一: 'dān yī',\r\n 如一: 'rú yī',\r\n 其一: 'qí yī',\r\n 合一: 'hé yī',\r\n 逐一: 'zhú yī',\r\n 周一: 'zhōu yī',\r\n 初一: 'chū yī',\r\n 研一: 'yán yī',\r\n 归一: 'guī yī',\r\n 假一: 'jiǎ yī',\r\n 闻一: 'wén yī',\r\n 了了: 'liǎo liǎo',\r\n 公了: 'gōng liǎo',\r\n 私了: 'sī liǎo',\r\n // 一 发音\r\n 一月: 'yī yuè',\r\n 一号: 'yī hào',\r\n 一级: 'yī jí',\r\n 一等: 'yī děng',\r\n 一哥: 'yī gē',\r\n 月一: 'yuè yī',\r\n 一一: 'yī yī',\r\n 二一: 'èr yī',\r\n 三一: 'sān yī',\r\n 四一: 'sì yī',\r\n 五一: 'wǔ yī',\r\n 六一: 'liù yī',\r\n 七一: 'qī yī',\r\n 八一: 'bā yī',\r\n 九一: 'jiǔ yī',\r\n 一〇: 'yī líng',\r\n 一零: 'yī líng',\r\n 一二: 'yī èr',\r\n 一三: 'yī sān',\r\n 一四: 'yī sì',\r\n 一五: 'yī wǔ',\r\n 一六: 'yī liù',\r\n 一七: 'yī qī',\r\n 一八: 'yī bā',\r\n 一九: 'yī jiǔ',\r\n 一又: 'yī yòu',\r\n 一饼: 'yī bǐng',\r\n 一楼: 'yī lóu',\r\n 为例: 'wéi lì',\r\n 为准: 'wéi zhǔn',\r\n 沧海: 'cāng hǎi',\r\n 难为: 'nán wéi',\r\n 责难: 'zé nàn',\r\n 患难: 'huàn nàn',\r\n 磨难: 'mó nàn',\r\n 大难: 'dà nàn',\r\n 刁难: 'diāo nàn',\r\n 殉难: 'xùn nàn',\r\n 落难: 'luò nàn',\r\n 罹难: 'lí nàn',\r\n 灾难: 'zāi nàn',\r\n 难民: 'nàn mín',\r\n 苦难: 'kǔ nàn',\r\n 危难: 'wēi nàn',\r\n 发难: 'fā nàn',\r\n 逃难: 'táo nàn',\r\n 避难: 'bì nàn',\r\n 遇难: 'yù nàn',\r\n 阻难: 'zǔ nàn',\r\n 厄难: 'è nàn',\r\n 徇难: 'xùn nàn',\r\n 空难: 'kōng nàn',\r\n 喜欢: 'xǐ huan',\r\n 朝朝: 'zhāo zhāo',\r\n 不行: 'bù xíng',\r\n 轧轧: 'yà yà',\r\n 弯曲: 'wān qū',\r\n 扭曲: 'niǔ qū',\r\n 曲直: 'qū zhí',\r\n 委曲: 'wěi qū',\r\n 酒曲: 'jiǔ qū',\r\n 曲径: 'qū jìng',\r\n 曲解: 'qū jiě',\r\n 歪曲: 'wāi qū',\r\n 曲线: 'qū xiàn',\r\n 曲阜: 'qū fù',\r\n 九曲: 'jiǔ qū',\r\n 曲折: 'qū zhé',\r\n 曲肱: 'qū gōng',\r\n 曲意: 'qū yì',\r\n 仡佬: 'gē lǎo',\r\n};\r\nconst Pattern2 = Object.keys(DICT2).map((key) => ({\r\n zh: key,\r\n pinyin: DICT2[key],\r\n probability: 2e-8 /* Probability.DICT */,\r\n length: 2,\r\n priority: Priority.Normal,\r\n dict: Symbol('dict2'),\r\n}));\n\nexport { Pattern2, DICT2 as default };\n","import { Priority } from '../common/constant.mjs';\n\nconst DICT3 = {\r\n 为什么: 'wèi shén me',\r\n 实际上: 'shí jì shang',\r\n 检察长: 'jiǎn chá zhǎng',\r\n 干什么: 'gàn shén me',\r\n 这会儿: 'zhè huì er',\r\n 尽可能: 'jǐn kě néng',\r\n 董事长: 'dǒng shì zhǎng',\r\n 了不起: 'liǎo bù qǐ',\r\n 参谋长: 'cān móu zhǎng',\r\n 朝鲜族: 'cháo xiǎn zú',\r\n 海内外: 'hǎi nèi wài',\r\n 禁不住: 'jīn bú zhù',\r\n 柏拉图: 'bó lā tú',\r\n 不在乎: 'bú zài hu',\r\n 洛杉矶: 'luò shān jī',\r\n 有点儿: 'yǒu diǎn er',\r\n 迫击炮: 'pǎi jī pào',\r\n 不得了: 'bù dé liǎo',\r\n 马尾松: 'mǎ wěi sōng',\r\n 运输量: 'yùn shū liàng',\r\n 发脾气: 'fā pí qi',\r\n 士大夫: 'shì dà fū',\r\n 鸭绿江: 'yā lù jiāng',\r\n 压根儿: 'yà gēn er',\r\n 对得起: 'duì de qǐ',\r\n 那会儿: 'nà huì er',\r\n 自个儿: 'zì gě er',\r\n 物理量: 'wù lǐ liàng',\r\n 怎么着: 'zěn me zhāo',\r\n 明晃晃: 'míng huǎng huǎng',\r\n 节假日: 'jié jià rì',\r\n 心里话: 'xīn lǐ huà',\r\n 发行量: 'fā xíng liàng',\r\n 兴冲冲: 'xìng chōng chōng',\r\n 分子量: 'fēn zǐ liàng',\r\n 国子监: 'guó zǐ jiàn',\r\n 老大难: 'lǎo dà nán',\r\n 党内外: 'dǎng nèi wài',\r\n 这么着: 'zhè me zhāo',\r\n 少奶奶: 'shào nǎi nai',\r\n 暗地里: 'àn dì lǐ',\r\n 更年期: 'gēng nián qī',\r\n 工作量: 'gōng zuò liàng',\r\n 背地里: 'bèi dì lǐ',\r\n 山里红: 'shān li hóng',\r\n 好好儿: 'hǎo hāo er',\r\n 交响乐: 'jiāo xiǎng yuè',\r\n 好意思: 'hǎo yì si',\r\n 吐谷浑: 'tǔ yù hún',\r\n 没意思: 'méi yì si',\r\n 理发师: 'lǐ fà shī',\r\n 塔什干: 'tǎ shí gān',\r\n 充其量: 'chōng qí liàng',\r\n 靠得住: 'kào de zhù',\r\n 车行道: 'chē xíng dào',\r\n 人行道: 'rén xíng dào',\r\n 中郎将: 'zhōng láng jiàng',\r\n 照明弹: 'zhào míng dàn',\r\n 烟幕弹: 'yān mù dàn',\r\n 没奈何: 'mò nài hé',\r\n 乱哄哄: 'luàn hōng hōng',\r\n 惠更斯: 'huì gēng sī',\r\n 载重量: 'zài zhòng liàng',\r\n 瞧得起: 'qiáo de qǐ',\r\n 纪传体: 'jì zhuàn tǐ',\r\n 阿房宫: 'ē páng gōng',\r\n 卷心菜: 'juǎn xīn cài',\r\n 戏班子: 'xì bān zi',\r\n 过得去: 'guò de qù',\r\n 花岗石: 'huā gāng shí',\r\n 外甥女: 'wài sheng nǚ',\r\n 团团转: 'tuán tuán zhuàn',\r\n 大堡礁: 'dà bǎo jiāo',\r\n 燃烧弹: 'rán shāo dàn',\r\n 劳什子: 'láo shí zi',\r\n 摇滚乐: 'yáo gǔn yuè',\r\n 夹竹桃: 'jiā zhú táo',\r\n 闹哄哄: 'nào hōng hōng',\r\n 三连冠: 'sān lián guàn',\r\n 重头戏: 'zhòng tóu xì',\r\n 二人转: 'èr rén zhuàn',\r\n 节骨眼: 'jiē gǔ yǎn',\r\n 知识面: 'zhī shi miàn',\r\n 护士长: 'hù shi zhǎng',\r\n 信号弹: 'xìn hào dàn',\r\n 干电池: 'gān diàn chí',\r\n 枪杆子: 'qiāng gǎn zi',\r\n 哭丧棒: 'kū sāng bàng',\r\n 鼻咽癌: 'bí yān ái',\r\n 瓦岗军: 'wǎ gāng jūn',\r\n 买得起: 'mǎi de qǐ',\r\n 癞蛤蟆: 'lài há ma',\r\n 脊梁骨: 'jǐ liang gǔ',\r\n 子母弹: 'zǐ mǔ dàn',\r\n 开小差: 'kāi xiǎo chāi',\r\n 女强人: 'nǚ qiáng rén',\r\n 英雄传: 'yīng xióng zhuàn',\r\n 爵士乐: 'jué shì yuè',\r\n 说笑话: 'shuō xiào hua',\r\n 碰头会: 'pèng tóu huì',\r\n 玻璃钢: 'bō li gāng',\r\n 曳光弹: 'yè guāng dàn',\r\n 少林拳: 'shào lín quán',\r\n 咏叹调: 'yǒng tàn diào',\r\n 少先队: 'shào xiān duì',\r\n 灵长目: 'líng zhǎng mù',\r\n 对着干: 'duì zhe gàn',\r\n 蒙蒙亮: 'méng méng liàng',\r\n 软骨头: 'ruǎn gǔ tou',\r\n 铺盖卷: 'pū gài juǎn',\r\n 和稀泥: 'huò xī ní',\r\n 背黑锅: 'bēi hēi guō',\r\n 红彤彤: 'hóng tōng tōng',\r\n 武侯祠: 'wǔ hóu cí',\r\n 打哆嗦: 'dǎ duō suo',\r\n 户口簿: 'hù kǒu bù',\r\n 马尾藻: 'mǎ wěi zǎo',\r\n 夜猫子: 'yè māo zi',\r\n 打手势: 'dǎ shǒu shì',\r\n 龙王爷: 'lóng wáng yé',\r\n 气头上: 'qì tóu shang',\r\n 糊涂虫: 'hú tu chóng',\r\n 笔杆子: 'bǐ gǎn zi',\r\n 占便宜: 'zhàn pián yi',\r\n 打主意: 'dǎ zhǔ yì',\r\n 多弹头: 'duō dàn tóu',\r\n 露一手: 'lòu yì shǒu',\r\n 堰塞湖: 'yàn sè hú',\r\n 保得住: 'bǎo de zhù',\r\n 趵突泉: 'bào tū quán',\r\n 奥得河: 'ào de hé',\r\n 司务长: 'sī wù zhǎng',\r\n 禁不起: 'jīn bù qǐ',\r\n 什刹海: 'shí chà hǎi',\r\n 莲花落: 'lián huā lào',\r\n 见世面: 'jiàn shì miàn',\r\n 豁出去: 'huō chū qù',\r\n 电位差: 'diàn wèi chā',\r\n 挨个儿: 'āi gè er',\r\n 那阵儿: 'nà zhèn er',\r\n 肺活量: 'fèi huó liàng',\r\n 大师傅: 'dà shī fu',\r\n 掷弹筒: 'zhì dàn tǒng',\r\n 打呼噜: 'dǎ hū lu',\r\n 广渠门: 'ān qú mén',\r\n 未见得: 'wèi jiàn dé',\r\n 大婶儿: 'dà shěn er',\r\n 谈得来: 'tán de lái',\r\n 脚丫子: 'jiǎo yā zi',\r\n 空包弹: 'kōng bāo dàn',\r\n 窝里斗: 'wō li dòu',\r\n 弹着点: 'dàn zhuó diǎn',\r\n 个头儿: 'gè tóu er',\r\n 看得起: 'kàn de qǐ',\r\n 糊涂账: 'hú tu zhàng',\r\n 大猩猩: 'dà xīng xing',\r\n 禁得起: 'jīn de qǐ',\r\n 法相宗: 'fǎ xiàng zōng',\r\n 可怜相: 'kě lián xiàng',\r\n 吃得下: 'chī de xià',\r\n 汉堡包: 'hàn bǎo bāo',\r\n 闹嚷嚷: 'nào rāng rāng',\r\n 数来宝: 'shǔ lái bǎo',\r\n 合得来: 'hé de lái',\r\n 干性油: 'gān xìng yóu',\r\n 闷葫芦: 'mèn hú lu',\r\n 呱呱叫: 'guā guā jiào',\r\n 西洋参: 'xī yáng shēn',\r\n 林荫道: 'lín yīn dào',\r\n 拉家常: 'lā jiā cháng',\r\n 卷铺盖: 'juǎn pū gài',\r\n 过得硬: 'guò de yìng',\r\n 飞将军: 'fēi jiāng jūn',\r\n 挑大梁: 'tiǎo dà liáng',\r\n 哈巴狗: 'hǎ ba gǒu',\r\n 过家家: 'guò jiā jiā',\r\n 催泪弹: 'cuī lèi dàn',\r\n 雨夹雪: 'yǔ jiā xuě',\r\n 敲竹杠: 'qiāo zhú gàng',\r\n 列车长: 'liè chē zhǎng',\r\n 华达呢: 'huá dá ní',\r\n 犯得着: 'fàn de zháo',\r\n 土疙瘩: 'tǔ gē da',\r\n 煞风景: 'shā fēng jǐng',\r\n 轻量级: 'qīng liàng jí',\r\n 羞答答: 'xiū dā dā',\r\n 石子儿: 'shí zǐ er',\r\n 达姆弹: 'dá mǔ dàn',\r\n 科教片: 'kē jiào piān',\r\n 侃大山: 'kǎn dà shān',\r\n 丁点儿: 'dīng diǎn er',\r\n 吃得消: 'chī de xiāo',\r\n 捋虎须: 'luō hǔ xū',\r\n 高丽参: 'gāo lí shēn',\r\n 众生相: 'zhòng shēng xiàng',\r\n 咽峡炎: 'yān xiá yán',\r\n 禁得住: 'jīn de zhù',\r\n 吃得开: 'chī de kāi',\r\n 柞丝绸: 'zuò sī chóu',\r\n 应声虫: 'yìng shēng chóng',\r\n 数得着: 'shǔ de zháo',\r\n 傻劲儿: 'shǎ jìn er',\r\n 铅玻璃: 'qiān bō li',\r\n 可的松: 'kě dì sōng',\r\n 划得来: 'huá de lái',\r\n 晕乎乎: 'yūn hū hū',\r\n 屎壳郎: 'shǐ ke làng',\r\n 尥蹶子: 'liào juě zi',\r\n 藏红花: 'zàng hóng huā',\r\n 闷罐车: 'mèn guàn chē',\r\n 卡脖子: 'qiǎ bó zi',\r\n 红澄澄: 'hóng deng deng',\r\n 赶得及: 'gǎn de jí',\r\n 当间儿: 'dāng jiàn er',\r\n 露马脚: 'lòu mǎ jiǎo',\r\n 鸡内金: 'jī nèi jīn',\r\n 犯得上: 'fàn de shàng',\r\n 钉齿耙: 'dīng chǐ bà',\r\n 饱和点: 'bǎo hé diǎn',\r\n 龙爪槐: 'lóng zhǎo huái',\r\n 喝倒彩: 'hè dào cǎi',\r\n 定冠词: 'dìng guàn cí',\r\n 担担面: 'dàn dan miàn',\r\n 吃得住: 'chī de zhù',\r\n 爪尖儿: 'zhuǎ jiān er',\r\n 支着儿: 'zhī zhāo er',\r\n 折跟头: 'zhē gēn tou',\r\n 阴着儿: 'yīn zhāo er',\r\n 烟卷儿: 'yān juǎn er',\r\n 宣传弹: 'xuān chuán dàn',\r\n 信皮儿: 'xìn pí er',\r\n 弦切角: 'xián qiē jiǎo',\r\n 缩砂密: 'sù shā mì',\r\n 说得来: 'shuō de lái',\r\n 水漂儿: 'shuǐ piāo er',\r\n 耍笔杆: 'shuǎ bǐ gǎn',\r\n 数得上: 'shǔ de shàng',\r\n 数不着: 'shǔ bù zháo',\r\n 数不清: 'shǔ bù qīng',\r\n 什件儿: 'shí jiàn er',\r\n 生死簿: 'shēng sǐ bù',\r\n 扇风机: 'shān fēng jī',\r\n 撒呓挣: 'sā yì zheng',\r\n 日记簿: 'rì jì bù',\r\n 热得快: 'rè de kuài',\r\n 亲家公: 'qìng jia gōng',\r\n 奇函数: 'jī hán shù',\r\n 拍纸簿: 'pāi zhǐ bù',\r\n 努劲儿: 'nǔ jìn er',\r\n 泥娃娃: 'ní wá wa',\r\n 内切圆: 'nèi qiē yuán',\r\n 哪会儿: 'nǎ huì er',\r\n 闷头儿: 'mēn tóu er',\r\n 没谱儿: 'méi pǔ er',\r\n 铆劲儿: 'mǎo jìn er',\r\n 溜肩膀: 'liū jiān bǎng',\r\n 了望台: 'liào wàng tái',\r\n 老来少: 'lǎo lái shào',\r\n 坤角儿: 'kūn jué er',\r\n 考勤簿: 'kǎo qín bù',\r\n 卷笔刀: 'juǎn bǐ dāo',\r\n 进给量: 'jìn jǐ liàng',\r\n 划不来: 'huá bù lái',\r\n 汗褂儿: 'hàn guà er',\r\n 鼓囊囊: 'gǔ nāng nāng',\r\n 够劲儿: 'gòu jìn er',\r\n 公切线: 'gōng qiē xiàn',\r\n 搁得住: 'gé de zhù',\r\n 赶浪头: 'gǎn làng tóu',\r\n 赶得上: 'gǎn de shàng',\r\n 干酵母: 'gān jiào mǔ',\r\n 嘎渣儿: 'gā zhā er',\r\n 嘎嘣脆: 'gā bēng cuì',\r\n 对得住: 'duì de zhù',\r\n 逗闷子: 'dòu mèn zi',\r\n 顶呱呱: 'dǐng guā guā',\r\n 滴溜儿: 'dī liù er',\r\n 大轴子: 'dà zhòu zi',\r\n 打板子: 'dǎ bǎn zi',\r\n 寸劲儿: 'cùn jìn er',\r\n 醋劲儿: 'cù jìn er',\r\n 揣手儿: 'chuāi shǒu er',\r\n 冲劲儿: 'chòng jìn er',\r\n 吃得来: 'chī de lái',\r\n 不更事: 'bù gēng shì',\r\n 奔头儿: 'bèn tou er',\r\n 百夫长: 'bǎi fū zhǎng',\r\n 娃娃亲: 'wá wa qīn',\r\n 死劲儿: 'sǐ jìn er',\r\n 骨朵儿: 'gū duǒ er',\r\n 功劳簿: 'gōng láo bù',\r\n 都江堰: 'dū jiāng yàn',\r\n 一担水: 'yí dàn shuǐ',\r\n 否极泰: 'pǐ jí tài',\r\n 泰来否: 'tài lái pǐ',\r\n 咳特灵: 'ké tè líng',\r\n 开户行: 'kāi hù háng',\r\n 郦食其: 'lì yì jī',\r\n 花事了: 'huā shì liǎo',\r\n // 一字变调的词语(与两个字的字典冲突,故需要重新定义)\r\n 一更更: 'yì gēng gēng',\r\n 一重山: 'yì chóng shān',\r\n 风一更: 'fēng yì gēng',\r\n 雪一更: 'xuě yì gēng',\r\n 归一码: 'guī yì mǎ',\r\n // 一字不变调的词语(需要增补更多)\r\n 星期一: 'xīng qī yī',\r\n 礼拜一: 'lǐ bài yī',\r\n 一季度: 'yī jì dù',\r\n 一月一: 'yī yuè yī',\r\n 一字马: 'yī zì mǎ',\r\n 一是一: 'yī shì yī',\r\n 一次方: 'yī cì fāng',\r\n 一阳指: 'yī yáng zhǐ',\r\n 一字决: 'yī zì jué',\r\n 一年级: 'yī nián jí',\r\n 一不做: 'yī bú zuò',\r\n 屈戌儿: 'qū qu ér',\r\n 难为水: 'nán wéi shuǐ',\r\n 难为情: 'nán wéi qíng',\r\n 行一行: 'xíng yì háng',\r\n 别别的: 'biè bié de',\r\n 干哪行: 'gàn nǎ háng',\r\n 干一行: 'gàn yì háng',\r\n 曲别针: 'qū bié zhēn',\r\n};\r\nconst Pattern3 = Object.keys(DICT3).map((key) => ({\r\n zh: key,\r\n pinyin: DICT3[key],\r\n probability: 2e-8 /* Probability.DICT */,\r\n length: 3,\r\n priority: Priority.Normal,\r\n dict: Symbol('dict3'),\r\n}));\n\nexport { Pattern3, DICT3 as default };\n","import { Priority } from '../common/constant.mjs';\n\nconst DICT4 = {\r\n 成吉思汗: \"chéng jí sī hán\",\r\n 四通八达: \"sì tōng bā dá\",\r\n 一模一样: \"yì mú yí yàng\",\r\n 青藏高原: \"qīng zàng gāo yuán\",\r\n 阿弥陀佛: \"ē mí tuó fó\",\r\n 解放思想: \"jiè fàng sī xiǎng\",\r\n 所作所为: \"suǒ zuò suǒ wéi\",\r\n 迷迷糊糊: \"mí mí hu hū\",\r\n 荷枪实弹: \"hè qiāng shí dàn\",\r\n 兴高采烈: \"xìng gāo cǎi liè\",\r\n 无能为力: \"wú néng wéi lì\",\r\n 布鲁塞尔: \"bù lǔ sài ěr\",\r\n 为所欲为: \"wéi suǒ yù wéi\",\r\n 克什米尔: \"kè shí mǐ ěr\",\r\n 没完没了: \"méi wán méi liǎo\",\r\n 不为人知: \"bù wéi rén zhī\",\r\n 结结巴巴: \"jiē jiē bā bā\",\r\n 前仆后继: \"qián pū hòu jì\",\r\n 铺天盖地: \"pū tiān gài dì\",\r\n 直截了当: \"zhí jié liǎo dàng\",\r\n 供不应求: \"gōng bú yìng qiú\",\r\n 御史大夫: \"yù shǐ dà fū\",\r\n 不为瓦全: \"bù wéi wǎ quán\",\r\n 不可收拾: \"bù kě shōu shi\",\r\n 胡作非为: \"hú zuò fēi wéi\",\r\n 分毫不差: \"fēn háo bú chà\",\r\n 模模糊糊: \"mó mó hu hū\",\r\n 不足为奇: \"bù zú wéi qí\",\r\n 悄无声息: \"qiǎo wú shēng xī\",\r\n 了如指掌: \"liǎo rú zhǐ zhǎng\",\r\n 深恶痛绝: \"shēn wù tòng jué\",\r\n 高高兴兴: \"gāo gāo xìng xìng\",\r\n 唉声叹气: \"āi shēng tàn qì\",\r\n 汉藏语系: \"hàn zàng yǔ xì\",\r\n 处心积虑: \"chǔ xīn jī lǜ\",\r\n 泣不成声: \"qì bù chéng shēng\",\r\n 半夜三更: \"bàn yè sān gēng\",\r\n 失魂落魄: \"shī hún luò pò\",\r\n 二十八宿: \"èr shí bā xiù\",\r\n 转来转去: \"zhuàn lái zhuàn qù\",\r\n 数以万计: \"shǔ yǐ wàn jì\",\r\n 相依为命: \"xiāng yī wéi mìng\",\r\n 恋恋不舍: \"liàn liàn bù shě\",\r\n 屈指可数: \"qū zhǐ kě shǔ\",\r\n 神出鬼没: \"shén chū guǐ mò\",\r\n 结结实实: \"jiē jiē shí shí\",\r\n 有的放矢: \"yǒu dì fàng shǐ\",\r\n 叽哩咕噜: \"jī lǐ gū lū\",\r\n 调兵遣将: \"diào bīng qiǎn jiàng\",\r\n 载歌载舞: \"zài gē zài wǔ\",\r\n 转危为安: \"zhuǎn wēi wéi ān\",\r\n 踏踏实实: \"tā tā shi shí\",\r\n 桑给巴尔: \"sāng jǐ bā ěr\",\r\n 装模作样: \"zhuāng mú zuò yàng\",\r\n 见义勇为: \"jiàn yì yǒng wéi\",\r\n 相差无几: \"xiāng chā wú jǐ\",\r\n 叹为观止: \"tàn wéi guān zhǐ\",\r\n 闷闷不乐: \"mèn mèn bú lè\",\r\n 喜怒哀乐: \"xǐ nù āi lè\",\r\n 鲜为人知: \"xiǎn wéi rén zhī\",\r\n 张牙舞爪: \"zhāng yá wǔ zhǎo\",\r\n 为非作歹: \"wéi fēi zuò dǎi\",\r\n 含糊其辞: \"hán hú qí cí\",\r\n 疲于奔命: \"pí yú bēn mìng\",\r\n 勉为其难: \"miǎn wéi qí nán\",\r\n 依依不舍: \"yī yī bù shě\",\r\n 顶头上司: \"dǐng tóu shàng si\",\r\n 不着边际: \"bù zhuó biān jì\",\r\n 大模大样: \"dà mú dà yàng\",\r\n 寻欢作乐: \"xún huān zuò lè\",\r\n 一走了之: \"yì zǒu liǎo zhī\",\r\n 字里行间: \"zì lǐ háng jiān\",\r\n 含含糊糊: \"hán hán hu hū\",\r\n 恰如其分: \"qià rú qí fèn\",\r\n 破涕为笑: \"pò tì wéi xiào\",\r\n 深更半夜: \"shēn gēng bàn yè\",\r\n 千差万别: \"qiān chā wàn bié\",\r\n 数不胜数: \"shǔ bú shèng shǔ\",\r\n 据为己有: \"jù wéi jǐ yǒu\",\r\n 天旋地转: \"tiān xuán dì zhuàn\",\r\n 养尊处优: \"yǎng zūn chǔ yōu\",\r\n 玻璃纤维: \"bō li xiān wéi\",\r\n 吵吵闹闹: \"chāo chao nào nào\",\r\n 晕头转向: \"yūn tóu zhuàn xiàng\",\r\n 土生土长: \"tǔ shēng tǔ zhǎng\",\r\n 宁死不屈: \"nìng sǐ bù qū\",\r\n 不省人事: \"bù xǐng rén shì\",\r\n 尽力而为: \"jìn lì ér wéi\",\r\n 精明强干: \"jīng míng qiáng gàn\",\r\n 唠唠叨叨: \"láo lao dāo dāo\",\r\n 叽叽喳喳: \"jī ji zhā zhā\",\r\n 功不可没: \"gōng bù kě mò\",\r\n 锲而不舍: \"qiè ér bù shě\",\r\n 排忧解难: \"pái yōu jiě nàn\",\r\n 稀里糊涂: \"xī li hú tú\",\r\n 各有所长: \"gè yǒu suǒ cháng\",\r\n 的的确确: \"dí dí què què\",\r\n 哄堂大笑: \"hōng táng dà xiào\",\r\n 听而不闻: \"tīng ér bù wén\",\r\n 刀耕火种: \"dāo gēng huǒ zhòng\",\r\n 内分泌腺: \"nèi fèn mì xiàn\",\r\n 化险为夷: \"huà xiǎn wéi yí\",\r\n 百发百中: \"bǎi fā bǎi zhòng\",\r\n 重见天日: \"chóng jiàn tiān rì\",\r\n 反败为胜: \"fǎn bài wéi shèng\",\r\n 一了百了: \"yì liǎo bǎi liǎo\",\r\n 大大咧咧: \"dà da liē liē\",\r\n 心急火燎: \"xīn jí huǒ liǎo\",\r\n 粗心大意: \"cū xīn dà yi\",\r\n 鸡皮疙瘩: \"jī pí gē da\",\r\n 夷为平地: \"yí wéi píng dì\",\r\n 日积月累: \"rì jī yuè lěi\",\r\n 设身处地: \"shè shēn chǔ dì\",\r\n 投其所好: \"tóu qí suǒ hào\",\r\n 间不容发: \"jiān bù róng fà\",\r\n 人满为患: \"rén mǎn wéi huàn\",\r\n 穷追不舍: \"qióng zhuī bù shě\",\r\n 为时已晚: \"wéi shí yǐ wǎn\",\r\n 如数家珍: \"rú shǔ jiā zhēn\",\r\n 心里有数: \"xīn lǐ yǒu shù\",\r\n 以牙还牙: \"yǐ yá huán yá\",\r\n 神不守舍: \"shén bù shǒu shě\",\r\n 孟什维克: \"mèng shí wéi kè\",\r\n 各自为战: \"gè zì wéi zhàn\",\r\n 怨声载道: \"yuàn shēng zài dào\",\r\n 救苦救难: \"jiù kǔ jiù nàn\",\r\n 好好先生: \"hǎo hǎo xiān sheng\",\r\n 怪模怪样: \"guài mú guài yàng\",\r\n 抛头露面: \"pāo tóu lù miàn\",\r\n 游手好闲: \"yóu shǒu hào xián\",\r\n 无所不为: \"wú suǒ bù wéi\",\r\n 调虎离山: \"diào hǔ lí shān\",\r\n 步步为营: \"bù bù wéi yíng\",\r\n 好大喜功: \"hào dà xǐ gōng\",\r\n 众矢之的: \"zhòng shǐ zhī dì\",\r\n 长生不死: \"cháng shēng bù sǐ\",\r\n 蔚为壮观: \"wèi wéi zhuàng guān\",\r\n 不可胜数: \"bù kě shèng shǔ\",\r\n 鬼使神差: \"guǐ shǐ shén chāi\",\r\n 洁身自好: \"jié shēn zì hào\",\r\n 敢作敢为: \"gǎn zuò gǎn wéi\",\r\n 茅塞顿开: \"máo sè dùn kāi\",\r\n 走马换将: \"zǒu mǎ huàn jiàng\",\r\n 为时过早: \"wéi shí guò zǎo\",\r\n 为人师表: \"wéi rén shī biǎo\",\r\n 阴差阳错: \"yīn chā yáng cuò\",\r\n 油腔滑调: \"yóu qiāng huá diào\",\r\n 重蹈覆辙: \"chóng dǎo fù zhé\",\r\n 骂骂咧咧: \"mà ma liē liē\",\r\n 絮絮叨叨: \"xù xù dāo dāo\",\r\n 如履薄冰: \"rú lǚ bó bīng\",\r\n 损兵折将: \"sǔn bīng zhé jiàng\",\r\n 拐弯抹角: \"guǎi wān mò jiǎo\",\r\n 像模像样: \"xiàng mú xiàng yàng\",\r\n 供过于求: \"gōng guò yú qiú\",\r\n 开花结果: \"kāi huā jiē guǒ\",\r\n 仔仔细细: \"zǐ zǐ xì xì\",\r\n 川藏公路: \"chuān zàng gōng lù\",\r\n 河北梆子: \"hé běi bāng zi\",\r\n 长年累月: \"cháng nián lěi yuè\",\r\n 正儿八经: \"zhèng er bā jīng\",\r\n 不识抬举: \"bù shí tái ju\",\r\n 重振旗鼓: \"chóng zhèn qí gǔ\",\r\n 气息奄奄: \"qì xī yān yān\",\r\n 紧追不舍: \"jǐn zhuī bù shě\",\r\n 服服帖帖: \"fú fu tiē tiē\",\r\n 强词夺理: \"qiǎng cí duó lǐ\",\r\n 噼里啪啦: \"pī li pā lā\",\r\n 人才济济: \"rén cái jǐ jǐ\",\r\n 发人深省: \"fā rén shēn xǐng\",\r\n 不足为凭: \"bù zú wéi píng\",\r\n 为富不仁: \"wéi fù bù rén\",\r\n 连篇累牍: \"lián piān lěi dú\",\r\n 呼天抢地: \"hū tiān qiāng dì\",\r\n 落落大方: \"luò luò dà fāng\",\r\n 自吹自擂: \"zì chuī zì léi\",\r\n 乐善好施: \"lè shàn hào shī\",\r\n 以攻为守: \"yǐ gōng wéi shǒu\",\r\n 磨磨蹭蹭: \"mó mó cèng cèng\",\r\n 削铁如泥: \"xuē tiě rú ní\",\r\n 助纣为虐: \"zhù zhòu wéi nüè\",\r\n 以退为进: \"yǐ tuì wéi jìn\",\r\n 嘁嘁喳喳: \"qī qī chā chā\",\r\n 枪林弹雨: \"qiāng lín dàn yǔ\",\r\n 令人发指: \"lìng rén fà zhǐ\",\r\n 转败为胜: \"zhuǎn bài wéi shèng\",\r\n 转弯抹角: \"zhuǎn wān mò jiǎo\",\r\n 在劫难逃: \"zài jié nán táo\",\r\n 正当防卫: \"zhèng dàng fáng wèi\",\r\n 不足为怪: \"bù zú wéi guài\",\r\n 难兄难弟: \"nàn xiōng nàn dì\",\r\n 咿咿呀呀: \"yī yī yā yā\",\r\n 弹尽粮绝: \"dàn jìn liáng jué\",\r\n 阿谀奉承: \"ē yú fèng chéng\",\r\n 稀里哗啦: \"xī li huā lā\",\r\n 返老还童: \"fǎn lǎo huán tóng\",\r\n 好高骛远: \"hào gāo wù yuǎn\",\r\n 鹿死谁手: \"lù sǐ shéi shǒu\",\r\n 差强人意: \"chā qiáng rén yì\",\r\n 大吹大擂: \"dà chuī dà léi\",\r\n 成家立业: \"chéng jiā lì yè\",\r\n 自怨自艾: \"zì yuàn zì yì\",\r\n 负债累累: \"fù zhài lěi lěi\",\r\n 古为今用: \"gǔ wéi jīn yòng\",\r\n 入土为安: \"rù tǔ wéi ān\",\r\n 下不为例: \"xià bù wéi lì\",\r\n 一哄而上: \"yì hōng ér shàng\",\r\n 没头苍蝇: \"méi tóu cāng ying\",\r\n 天差地远: \"tiān chā dì yuǎn\",\r\n 风卷残云: \"fēng juǎn cán yún\",\r\n 多灾多难: \"duō zāi duō nàn\",\r\n 乳臭未干: \"rǔ xiù wèi gān\",\r\n 行家里手: \"háng jiā lǐ shǒu\",\r\n 狼狈为奸: \"láng bèi wéi jiān\",\r\n 处变不惊: \"chǔ biàn bù jīng\",\r\n 一唱一和: \"yí chàng yí hè\",\r\n 一念之差: \"yí niàn zhī chā\",\r\n 金蝉脱壳: \"jīn chán tuō qiào\",\r\n 滴滴答答: \"dī dī dā dā\",\r\n 硕果累累: \"shuò guǒ léi léi\",\r\n 好整以暇: \"hào zhěng yǐ xiá\",\r\n 红得发紫: \"hóng de fā zǐ\",\r\n 传为美谈: \"chuán wéi měi tán\",\r\n 富商大贾: \"fù shāng dà gǔ\",\r\n 四海为家: \"sì hǎi wéi jiā\",\r\n 了若指掌: \"liǎo ruò zhǐ zhǎng\",\r\n 大有可为: \"dà yǒu kě wéi\",\r\n 出头露面: \"chū tóu lù miàn\",\r\n 鼓鼓囊囊: \"gǔ gu nāng nāng\",\r\n 窗明几净: \"chuāng míng jī jìng\",\r\n 泰然处之: \"tài rán chǔ zhī\",\r\n 怒发冲冠: \"nù fà chōng guān\",\r\n 有机玻璃: \"yǒu jī bō li\",\r\n 骨头架子: \"gǔ tou jià zi\",\r\n 义薄云天: \"yì bó yún tiān\",\r\n 一丁点儿: \"yī dīng diǎn er\",\r\n 时来运转: \"shí lái yùn zhuǎn\",\r\n 陈词滥调: \"chén cí làn diào\",\r\n 化整为零: \"huà zhěng wéi líng\",\r\n 火烧火燎: \"huǒ shāo huǒ liǎo\",\r\n 干脆利索: \"gàn cuì lì suǒ\",\r\n 吊儿郎当: \"diào er láng dāng\",\r\n 广种薄收: \"guǎng zhòng bó shōu\",\r\n 种瓜得瓜: \"zhòng guā dé guā\",\r\n 种豆得豆: \"zhòng dòu dé dòu\",\r\n 难舍难分: \"nán shě nán fēn\",\r\n 歃血为盟: \"shà xuè wéi méng\",\r\n 奋发有为: \"fèn fā yǒu wéi\",\r\n 阴错阳差: \"yīn cuò yáng chā\",\r\n 东躲西藏: \"dōng duǒ xī cáng\",\r\n 烟熏火燎: \"yān xūn huǒ liǎo\",\r\n 钻牛角尖: \"zuān niú jiǎo jiān\",\r\n 乔装打扮: \"qiáo zhuāng dǎ bàn\",\r\n 改弦更张: \"gǎi xián gēng zhāng\",\r\n 河南梆子: \"hé nán bāng zi\",\r\n 好吃懒做: \"hào chī lǎn zuò\",\r\n 何乐不为: \"hé lè bù wéi\",\r\n 大出风头: \"dà chū fēng tóu\",\r\n 攻城掠地: \"gōng chéng lüè dì\",\r\n 漂漂亮亮: \"piào piào liang liang\",\r\n 折衷主义: \"zhé zhōng zhǔ yì\",\r\n 大马哈鱼: \"dà mǎ hǎ yú\",\r\n 绿树成荫: \"lǜ shù chéng yīn\",\r\n 率先垂范: \"shuài xiān chuí fàn\",\r\n 家长里短: \"jiā cháng lǐ duǎn\",\r\n 宽大为怀: \"kuān dà wéi huái\",\r\n 左膀右臂: \"zuǒ bǎng yòu bì\",\r\n 一笑了之: \"yí xiào liǎo zhī\",\r\n 天下为公: \"tiān xià wéi gōng\",\r\n 还我河山: \"huán wǒ hé shān\",\r\n 何足为奇: \"hé zú wéi qí\",\r\n 好自为之: \"hǎo zì wéi zhī\",\r\n 风姿绰约: \"fēng zī chuò yuē\",\r\n 大雨滂沱: \"dà yǔ pāng tuó\",\r\n 传为佳话: \"chuán wéi jiā huà\",\r\n 吃里扒外: \"chī lǐ pá wài\",\r\n 重操旧业: \"chóng cāo jiù yè\",\r\n 小家子气: \"xiǎo jiā zi qì\",\r\n 少不更事: \"shào bù gēng shì\",\r\n 难分难舍: \"nán fēn nán shě\",\r\n 添砖加瓦: \"tiān zhuān jiā wǎ\",\r\n 是非分明: \"shì fēi fēn míng\",\r\n 舍我其谁: \"shě wǒ qí shuí\",\r\n 偏听偏信: \"piān tīng piān xìn\",\r\n 量入为出: \"liàng rù wéi chū\",\r\n 降龙伏虎: \"xiáng lóng fú hǔ\",\r\n 钢化玻璃: \"gāng huà bō li\",\r\n 正中下怀: \"zhèng zhòng xià huái\",\r\n 以身许国: \"yǐ shēn xǔ guó\",\r\n 一语中的: \"yì yǔ zhòng dì\",\r\n 丧魂落魄: \"sàng hún luò pò\",\r\n 三座大山: \"sān zuò dà shān\",\r\n 济济一堂: \"jǐ jǐ yì táng\",\r\n 好事之徒: \"hào shì zhī tú\",\r\n 干净利索: \"gàn jìng lì suǒ\",\r\n 出将入相: \"chū jiàng rù xiàng\",\r\n 袅袅娜娜: \"niǎo niǎo nuó nuó\",\r\n 狐狸尾巴: \"hú li wěi ba\",\r\n 好逸恶劳: \"hào yì wù láo\",\r\n 大而无当: \"dà ér wú dàng\",\r\n 打马虎眼: \"dǎ mǎ hu yǎn\",\r\n 板上钉钉: \"bǎn shàng dìng dīng\",\r\n 吆五喝六: \"yāo wǔ hè liù\",\r\n 虾兵蟹将: \"xiā bīng xiè jiàng\",\r\n 水调歌头: \"shuǐ diào gē tóu\",\r\n 数典忘祖: \"shǔ diǎn wàng zǔ\",\r\n 人事不省: \"rén shì bù xǐng\",\r\n 曲高和寡: \"qǔ gāo hè guǎ\",\r\n 屡教不改: \"lǚ jiào bù gǎi\",\r\n 互为因果: \"hù wéi yīn guǒ\",\r\n 互为表里: \"hù wéi biǎo lǐ\",\r\n 厚此薄彼: \"hòu cǐ bó bǐ\",\r\n 过关斩将: \"guò guān zhǎn jiàng\",\r\n 疙疙瘩瘩: \"gē ge dā dā\",\r\n 大腹便便: \"dà fù pián pián\",\r\n 走为上策: \"zǒu wéi shàng cè\",\r\n 冤家对头: \"yuān jia duì tóu\",\r\n 有隙可乘: \"yǒu xì kě chèng\",\r\n 一鳞半爪: \"yì lín bàn zhǎo\",\r\n 片言只语: \"piàn yán zhǐ yǔ\",\r\n 开花结实: \"kāi huā jié shí\",\r\n 经年累月: \"jīng nián lěi yuè\",\r\n 含糊其词: \"hán hú qí cí\",\r\n 寡廉鲜耻: \"guǎ lián xiǎn chǐ\",\r\n 成年累月: \"chéng nián lěi yuè\",\r\n 不徇私情: \"bú xùn sī qíng\",\r\n 不当人子: \"bù dāng rén zǐ\",\r\n 膀大腰圆: \"bǎng dà yāo yuán\",\r\n 指腹为婚: \"zhǐ fù wéi hūn\",\r\n 这么点儿: \"zhè me diǎn er\",\r\n 意兴索然: \"yì xīng suǒ rán\",\r\n 绣花枕头: \"xiù huā zhěn tou\",\r\n 无的放矢: \"wú dì fàng shǐ\",\r\n 望闻问切: \"wàng wén wèn qiè\",\r\n 舍己为人: \"shě jǐ wèi rén\",\r\n 穷年累月: \"qióng nián lěi yuè\",\r\n 排难解纷: \"pái nàn jiě fēn\",\r\n 处之泰然: \"chǔ zhī tài rán\",\r\n 指鹿为马: \"zhǐ lù wéi mǎ\",\r\n 危如累卵: \"wēi rú lěi luǎn\",\r\n 天兵天将: \"tiān bīng tiān jiàng\",\r\n 舍近求远: \"shě jìn qiú yuǎn\",\r\n 南腔北调: \"nán qiāng běi diào\",\r\n 苦中作乐: \"kǔ zhōng zuò lè\",\r\n 厚积薄发: \"hòu jī bó fā\",\r\n 臭味相投: \"xiù wèi xiāng tóu\",\r\n 长幼有序: \"zhǎng yòu yǒu xù\",\r\n 逼良为娼: \"bī liáng wéi chāng\",\r\n 悲悲切切: \"bēi bēi qiè qiē\",\r\n 败军之将: \"bài jūn zhī jiàng\",\r\n 欺行霸市: \"qī háng bà shì\",\r\n 削足适履: \"xuē zú shì lǚ\",\r\n 先睹为快: \"xiān dǔ wéi kuài\",\r\n 啼饥号寒: \"tí jī háo hán\",\r\n 疏不间亲: \"shū bú jiàn qīn\",\r\n 神差鬼使: \"shén chāi guǐ shǐ\",\r\n 敲敲打打: \"qiāo qiāo dǎ dǎ\",\r\n 平铺直叙: \"píng pū zhí xù\",\r\n 没头没尾: \"méi tóu mò wěi\",\r\n 寥寥可数: \"liáo liáo kě shǔ\",\r\n 哼哈二将: \"hēng hā èr jiàng\",\r\n 鹤发童颜: \"hè fà tóng yán\",\r\n 各奔前程: \"gè bèn qián chéng\",\r\n 弹无虚发: \"dàn wú xū fā\",\r\n 大人先生: \"dà rén xiān sheng\",\r\n 与民更始: \"yǔ mín gēng shǐ\",\r\n 树碑立传: \"shù bēi lì zhuàn\",\r\n 是非得失: \"shì fēi dé shī\",\r\n 实逼处此: \"shí bī chǔ cǐ\",\r\n 塞翁失马: \"sài wēng shī mǎ\",\r\n 日薄西山: \"rì bó xī shān\",\r\n 切身体会: \"qiè shēn tǐ huì\",\r\n 片言只字: \"piàn yán zhǐ zì\",\r\n 跑马卖解: \"pǎo mǎ mài xiè\",\r\n 宁折不弯: \"nìng zhé bù wān\",\r\n 零零散散: \"líng líng sǎn sǎn\",\r\n 量体裁衣: \"liàng tǐ cái yī\",\r\n 连中三元: \"lián zhòng sān yuán\",\r\n 礼崩乐坏: \"lǐ bēng yuè huài\",\r\n 不为已甚: \"bù wéi yǐ shèn\",\r\n 转悲为喜: \"zhuǎn bēi wéi xǐ\",\r\n 以眼还眼: \"yǐ yǎn huán yǎn\",\r\n 蔚为大观: \"wèi wéi dà guān\",\r\n 未为不可: \"wèi wéi bù kě\",\r\n 童颜鹤发: \"tóng yán hè fà\",\r\n 朋比为奸: \"péng bǐ wéi jiān\",\r\n 莫此为甚: \"mò cǐ wéi shèn\",\r\n 夹枪带棒: \"jiā qiāng dài bàng\",\r\n 富商巨贾: \"fù shāng jù jiǎ\",\r\n 淡然处之: \"dàn rán chǔ zhī\",\r\n 箪食壶浆: \"dān shí hú jiāng\",\r\n 创巨痛深: \"chuāng jù tòng shēn\",\r\n 草长莺飞: \"cǎo zhǎng yīng fēi\",\r\n 坐视不救: \"zuò shī bú jiù\",\r\n 以己度人: \"yǐ jǐ duó rén\",\r\n 随行就市: \"suí háng jiù shì\",\r\n 文以载道: \"wén yǐ zài dào\",\r\n 文不对题: \"wén bú duì tí\",\r\n 铁板钉钉: \"tiě bǎn dìng dīng\",\r\n 身体发肤: \"shēn tǐ fà fū\",\r\n 缺吃少穿: \"quē chī shǎo chuān\",\r\n 目无尊长: \"mù wú zūn zhǎng\",\r\n 吉人天相: \"jí rén tiān xiàng\",\r\n 毁家纾难: \"huǐ jiā shū nàn\",\r\n 钢筋铁骨: \"gāng jīn tiě gǔ\",\r\n 丢卒保车: \"diū zú bǎo jū\",\r\n 丢三落四: \"diū sān là sì\",\r\n 闭目塞听: \"bì mù sè tīng\",\r\n 削尖脑袋: \"xuē jiān nǎo dài\",\r\n 为非作恶: \"wéi fēi zuò è\",\r\n 人才难得: \"rén cái nán dé\",\r\n 情非得已: \"qíng fēi dé yǐ\",\r\n 切中要害: \"qiè zhòng yào hài\",\r\n 火急火燎: \"huǒ jí huǒ liǎo\",\r\n 画地为牢: \"huà dì wéi láo\",\r\n 好酒贪杯: \"hào jiǔ tān bēi\",\r\n 长歌当哭: \"cháng gē dàng kū\",\r\n 载沉载浮: \"zài chén zài fú\",\r\n 遇难呈祥: \"yù nàn chéng xiáng\",\r\n 榆木疙瘩: \"yú mù gē da\",\r\n 以邻为壑: \"yǐ lín wéi hè\",\r\n 洋为中用: \"yáng wéi zhōng yòng\",\r\n 言为心声: \"yán wéi xīn shēng\",\r\n 言必有中: \"yán bì yǒu zhòng\",\r\n 图穷匕见: \"tú qióng bǐ xiàn\",\r\n 滂沱大雨: \"páng tuó dà yǔ\",\r\n 目不暇给: \"mù bù xiá jǐ\",\r\n 量才录用: \"liàng cái lù yòng\",\r\n 教学相长: \"jiào xué xiāng zhǎng\",\r\n 悔不当初: \"huǐ bù dāng chū\",\r\n 呼幺喝六: \"hū yāo hè liù\",\r\n 不足为训: \"bù zú wéi xùn\",\r\n 不拘形迹: \"bù jū xíng jī\",\r\n 傍若无人: \"páng ruò wú rén\",\r\n 罪责难逃: \"zuì zé nán táo\",\r\n 自我吹嘘: \"zì wǒ chuī xū\",\r\n 转祸为福: \"zhuǎn huò wéi fú\",\r\n 勇冠三军: \"yǒng guàn sān jūn\",\r\n 易地而处: \"yì dì ér chǔ\",\r\n 卸磨杀驴: \"xiè mò shā lǘ\",\r\n 玩儿不转: \"wán ér bú zhuàn\",\r\n 天道好还: \"tiān dào hǎo huán\",\r\n 身单力薄: \"shēn dān lì bó\",\r\n 撒豆成兵: \"sǎ dòu chéng bīng\",\r\n 片纸只字: \"piàn zhǐ zhī zì\",\r\n 宁缺毋滥: \"nìng quē wú làn\",\r\n 没没无闻: \"mò mò wú wén\",\r\n 量力而为: \"liàng lì ér wéi\",\r\n 历历可数: \"lì lì kě shǔ\",\r\n 口碑载道: \"kǒu bēi zài dào\",\r\n 君子好逑: \"jūn zǐ hǎo qiú\",\r\n 好为人师: \"hào wéi rén shī\",\r\n 豪商巨贾: \"háo shāng jù jiǎ\",\r\n 各有所好: \"gè yǒu suǒ hào\",\r\n 度德量力: \"duó dé liàng lì\",\r\n 指天为誓: \"zhǐ tiān wéi shì\",\r\n 逸兴遄飞: \"yì xìng chuán fēi\",\r\n 心宽体胖: \"xīn kuān tǐ pán\",\r\n 为德不卒: \"wéi dé bù zú\",\r\n 天下为家: \"tiān xià wéi jiā\",\r\n 视为畏途: \"shì wéi wèi tú\",\r\n 三灾八难: \"sān zāi bā nàn\",\r\n 沐猴而冠: \"mù hóu ér guàn\",\r\n 哩哩啦啦: \"lī li lā lā\",\r\n 见缝就钻: \"jiàn fèng jiù zuān\",\r\n 夹层玻璃: \"jiā céng bō li\",\r\n 急公好义: \"jí gōng hào yì\",\r\n 积年累月: \"jī nián lěi yuè\",\r\n 划地为牢: \"huá dì wéi láo\",\r\n 更名改姓: \"gēng míng gǎi xìng\",\r\n 奉为圭臬: \"fèng wéi guī niè\",\r\n 多难兴邦: \"duō nàn xīng bāng\",\r\n 不破不立: \"bú pò bú lì\",\r\n 坐地自划: \"zuò dì zì huá\",\r\n 坐不重席: \"zuò bù chóng xí\",\r\n 坐不窥堂: \"zuò bù kuī táng\",\r\n 作嫁衣裳: \"zuò jià yī shang\",\r\n 左枝右梧: \"zuǒ zhī yòu wú\",\r\n 左宜右有: \"zuǒ yí yòu yǒu\",\r\n 钻头觅缝: \"zuān tóu mì fèng\",\r\n 钻天打洞: \"zuān tiān dǎ dòng\",\r\n 钻皮出羽: \"zuān pí chū yǔ\",\r\n 钻火得冰: \"zuān huǒ dé bīng\",\r\n 钻洞觅缝: \"zuàn dòng mì féng\",\r\n 钻冰求火: \"zuān bīng qiú huǒ\",\r\n 子为父隐: \"zǐ wéi fù yǐn\",\r\n 擢发难数: \"zhuó fà nán shǔ\",\r\n 着人先鞭: \"zhuó rén xiān biān\",\r\n 斫雕为朴: \"zhuó diāo wéi pǔ\",\r\n 锥处囊中: \"zhuī chǔ náng zhōng\",\r\n 椎心饮泣: \"chuí xīn yǐn qì\",\r\n 椎心泣血: \"chuí xīn qì xuè\",\r\n 椎牛飨士: \"chuí niú xiǎng shì\",\r\n 椎牛歃血: \"chuí niú shà xuè\",\r\n 椎牛发冢: \"chuí niú fà zhǒng\",\r\n 椎埋屠狗: \"chuí mái tú gǒu\",\r\n 椎埋狗窃: \"chuí mái gǒu qiè\",\r\n 壮发冲冠: \"zhuàng fā chōng guàn\",\r\n 庄严宝相: \"zhuāng yán bǎo xiàng\",\r\n 转愁为喜: \"zhuǎn chóu wéi xǐ\",\r\n 转嗔为喜: \"zhuǎn chēn wéi xǐ\",\r\n 拽巷啰街: \"zhuài xiàng luó jiē\",\r\n 拽耙扶犁: \"zhuāi pá fú lí\",\r\n 拽布拖麻: \"zhuài bù tuō má\",\r\n 箸长碗短: \"zhù cháng wǎn duǎn\",\r\n 铸剑为犁: \"zhù jiàn wéi lí\",\r\n 杼柚其空: \"zhù yòu qí kōng\",\r\n 杼柚空虚: \"zhù yòu kōng xū\",\r\n 助天为虐: \"zhù tiān wéi nüè\",\r\n 属垣有耳: \"zhǔ yuán yǒu ěr\",\r\n 属毛离里: \"zhǔ máo lí lǐ\",\r\n 属辞比事: \"zhǔ cí bǐ shì\",\r\n 逐物不还: \"zhú wù bù huán\",\r\n 铢量寸度: \"zhū liáng cùn duó\",\r\n 铢两悉称: \"zhū liǎng xī chèn\",\r\n 侏儒观戏: \"zhū rú guān xì\",\r\n 朱轓皁盖: \"zhū fān zào gài\",\r\n 昼度夜思: \"zhòu duó yè sī\",\r\n 诪张为幻: \"zhōu zhāng wéi huàn\",\r\n 重明继焰: \"chóng míng jì yàn\",\r\n 众啄同音: \"zhòng zhuó tóng yīn\",\r\n 众毛攒裘: \"zhòng máo cuán qiú\",\r\n 众好众恶: \"zhòng hào zhòng wù\",\r\n 擿埴索涂: \"zhāi zhí suǒ tú\",\r\n 稚齿婑媠: \"zhì chǐ wǒ tuó\",\r\n 至当不易: \"zhì dàng bú yì\",\r\n 指皂为白: \"zhǐ zào wéi bái\",\r\n 指雁为羹: \"zhǐ yàn wéi gēng\",\r\n 指树为姓: \"zhǐ shù wéi xìng\",\r\n 指山说磨: \"zhǐ shān shuō mò\",\r\n 止戈为武: \"zhǐ gē wéi wǔ\",\r\n 枝干相持: \"zhī gàn xiāng chí\",\r\n 枝大于本: \"zh dà yú běn\",\r\n 支吾其词: \"zhī wú qí cí\",\r\n 正身率下: \"zhèng shēn shuài xià\",\r\n 正冠李下: \"zhèng guàn lǐ xià\",\r\n 整冠纳履: \"zhěng guān nà lǚ\",\r\n 整躬率物: \"zhěng gōng shuài wù\",\r\n 整顿干坤: \"zhěng dùn gàn kūn\",\r\n 针头削铁: \"zhēn tóu xuē tiě\",\r\n 贞松劲柏: \"zhēn sōng jìng bǎi\",\r\n 赭衣塞路: \"zhě yī sè lù\",\r\n 折箭为誓: \"shé jiàn wéi shì\",\r\n 折而族之: \"zhé ér zú zhī\",\r\n 昭德塞违: \"zhāo dé sè wéi\",\r\n 章句小儒: \"zhāng jù xiǎo rú\",\r\n 湛恩汪濊: \"zhàn ēn wāng huì\",\r\n 占风望气: \"zhān fēng wàng qì\",\r\n 斩将搴旗: \"zhǎn jiàng qiān qí\",\r\n 曾母投杼: \"zēng mǔ tóu zhù\",\r\n 曾参杀人: \"zēng shēn shā rén\",\r\n 造谣中伤: \"zào yáo zhòng shāng\",\r\n 早占勿药: \"zǎo zhān wù yào\",\r\n 凿龟数策: \"záo guī shǔ cè\",\r\n 攒三聚五: \"cuán sān jù wǔ\",\r\n 攒眉蹙额: \"cuán mei cù é\",\r\n 攒零合整: \"cuán líng hé zhěng\",\r\n 攒锋聚镝: \"cuán fēng jù dí\",\r\n 载笑载言: \"zài xiào zài yán\",\r\n 载酒问字: \"zài jiǔ wèn zì\",\r\n 殒身不恤: \"yǔn shēn bú xù\",\r\n 云舒霞卷: \"yún shū xiá juǎn\",\r\n 月中折桂: \"yuè zhōng shé guì\",\r\n 月落参横: \"yuè luò shēn héng\",\r\n 鬻驽窃价: \"yù nú qiè jià\",\r\n 鬻鸡为凤: \"yù jī wéi fèng\",\r\n 遇难成祥: \"yù nàn chéng xiáng\",\r\n 郁郁累累: \"yù yù lěi lěi\",\r\n 玉卮无当: \"yù zhī wú dàng\",\r\n 语笑喧阗: \"yǔ xiào xuān tián\",\r\n 与世沉浮: \"yǔ shì chén fú\",\r\n 与时消息: \"yǔ shí xiāo xi\",\r\n 逾墙钻隙: \"yú qiáng zuān xì\",\r\n 渔夺侵牟: \"yú duó qīn móu\",\r\n 杅穿皮蠹: \"yú chuān pí dù\",\r\n 余勇可贾: \"yú yǒng kě gǔ\",\r\n 予智予雄: \"yú zhì yú xióng\",\r\n 予取予求: \"yú qǔ yú qiú\",\r\n 于家为国: \"yú jiā wéi guó\",\r\n 有借无还: \"yǒu jiè wú huán\",\r\n 有加无已: \"yǒu jiā wú yǐ\",\r\n 有国难投: \"yǒu guó nán tóu\",\r\n 游必有方: \"yóu bì yǒu fāng\",\r\n 油干灯尽: \"yóu gàn dēng jìn\",\r\n 尤云殢雨: \"yóu yún tì yǔ\",\r\n 庸中皦皦: \"yōng zhōng jiǎo jiǎo\",\r\n 郢书燕说: \"yǐng shū yān shuō\",\r\n 营蝇斐锦: \"yíng yíng fēi jǐn\",\r\n 鹰心雁爪: \"yīng xīn yàn zhǎo\",\r\n 莺吟燕儛: \"yīng yín yàn wǔ\",\r\n 应天顺时: \"yīng tiān shùn shí\",\r\n 印累绶若: \"yìn léi shòu ruò\",\r\n 隐占身体: \"yǐn zhàn shēn tǐ\",\r\n 饮犊上流: \"yìn dú shàng liú\",\r\n 引绳切墨: \"yǐn shéng qiē mò\",\r\n 龈齿弹舌: \"yín chǐ dàn shé\",\r\n 因缘为市: \"yīn yuán wéi shì\",\r\n 因树为屋: \"yīn shù wéi wū\",\r\n 溢美溢恶: \"yì měi yì wù\",\r\n 抑塞磊落: \"yì sè lěi luò\",\r\n 倚闾望切: \"yǐ lǘ wàng qiē\",\r\n 以意为之: \"yǐ yì wéi zhī\",\r\n 以言为讳: \"yǐ yán wéi huì\",\r\n 以疏间亲: \"yǐ shū jiàn qīn\",\r\n 以水济水: \"yǐ shuǐ jǐ shuǐ\",\r\n 以书为御: \"yǐ shū wéi yù\",\r\n 以守为攻: \"yǐ shǒu wéi gōng\",\r\n 以升量石: \"yǐ shēng liáng dàn\",\r\n 以慎为键: \"yǐ shèn wéi jiàn\",\r\n 以筌为鱼: \"yǐ quán wéi yú\",\r\n 以利累形: \"yǐ lì lěi xíng\",\r\n 以毁为罚: \"yǐ huǐ wéi fá\",\r\n 以黑为白: \"yǐ hēi wéi bái\",\r\n 以规为瑱: \"yǐ guī wéi tiàn\",\r\n 以古为鉴: \"yǐ gǔ wéi jiàn\",\r\n 以宫笑角: \"yǐ gōng xiào jué\",\r\n 以法为教: \"yǐ fǎ wéi jiào\",\r\n 以大恶细: \"yǐ dà wù xì\",\r\n 遗世忘累: \"yí shì wàng lěi\",\r\n 遗寝载怀: \"yí qǐn zài huái\",\r\n 移的就箭: \"yí dì jiù jiàn\",\r\n 依头缕当: \"yī tóu lǚ dàng\",\r\n 衣租食税: \"yì zū shí shuì\",\r\n 衣轻乘肥: \"yì qīng chéng féi\",\r\n 衣裳之会: \"yī shang zhī huì\",\r\n 衣单食薄: \"yī dān shí bó\",\r\n 一还一报: \"yì huán yí bào\",\r\n 叶公好龙: \"yè gōng hào lóng\",\r\n 野调无腔: \"yě diào wú qiāng\",\r\n 瑶池女使: \"yáo chí nǚ shǐ\",\r\n 幺麽小丑: \"yāo mó xiǎo chǒu\",\r\n 养精畜锐: \"yǎng jīng xù ruì\",\r\n 卬首信眉: \"áng shǒu shēn méi\",\r\n 洋洋纚纚: \"yáng yáng sǎ sǎ\",\r\n 羊羔美酒: \"yáng gāo měi jiǔ\",\r\n 扬风扢雅: \"yáng fēng jié yǎ\",\r\n 燕昭市骏: \"yān zhāo shì jùn\",\r\n 燕昭好马: \"yān zhāo hǎo mǎ\",\r\n 燕石妄珍: \"yān shí wàng zhēn\",\r\n 燕骏千金: \"yān jùn qiān jīn\",\r\n 燕金募秀: \"yān jīn mù xiù\",\r\n 燕驾越毂: \"yān jià yuè gǔ\",\r\n 燕歌赵舞: \"yān gē zhào wǔ\",\r\n 燕岱之石: \"yān dài zhī shí\",\r\n 燕处危巢: \"yàn chǔ wēi cháo\",\r\n 掞藻飞声: \"shàn zǎo fēi shēng\",\r\n 偃革为轩: \"yǎn gé wéi xuān\",\r\n 妍蚩好恶: \"yán chī hǎo è\",\r\n 压良为贱: \"yā liáng wéi jiàn\",\r\n 搀行夺市: \"chān háng duó shì\",\r\n 泣数行下: \"qì shù háng xià\",\r\n 当行出色: \"dāng háng chū sè\",\r\n 秀出班行: \"xiù chū bān háng\",\r\n 儿女成行: \"ér nǚ chéng háng\",\r\n 大行大市: \"dà háng dà shì\",\r\n 寻行数墨: \"xún háng shǔ mò\",\r\n 埙篪相和: \"xūn chí xiāng hè\",\r\n 血债累累: \"xuè zhài lěi lěi\",\r\n 炫玉贾石: \"xuàn yù gǔ shí\",\r\n 炫石为玉: \"xuàn shí wéi yù\",\r\n 悬石程书: \"xuán dàn chéng shū\",\r\n 悬狟素飡: \"xuán huán sù cān\",\r\n 悬龟系鱼: \"xuán guī xì yú\",\r\n 揎拳捋袖: \"xuān quán luō xiù\",\r\n 轩鹤冠猴: \"xuān hè guàn hóu\",\r\n 畜妻养子: \"xù qī yǎng zǐ\",\r\n 羞人答答: \"xiū rén dā dā\",\r\n 修鳞养爪: \"xiū lín yǎng zhǎo\",\r\n 熊据虎跱: \"xióng jù hǔ zhì\",\r\n 兄死弟及: \"xiōng sǐ dì jí\",\r\n 腥闻在上: \"xīng wén zài shàng\",\r\n 兴文匽武: \"xīng wén yǎn wǔ\",\r\n 兴观群怨: \"xìng guān qún yuàn\",\r\n 兴高彩烈: \"xìng gāo cǎi liè\",\r\n 心手相应: \"xīn shǒu xiāng yìng\",\r\n 心口相应: \"xīn kǒu xiāng yīng\",\r\n 挟势弄权: \"xié shì nòng quán\",\r\n 胁肩累足: \"xié jiān lěi zú\",\r\n 校短量长: \"jiào duǎn liáng cháng\",\r\n 小眼薄皮: \"xiǎo yǎn bó pí\",\r\n 硝云弹雨: \"xiāo yún dàn yǔ\",\r\n 鸮鸣鼠暴: \"xiāo míng shǔ bào\",\r\n 削株掘根: \"xuē zhū jué gēn\",\r\n 削铁无声: \"xuē tiě wú shēng\",\r\n 削职为民: \"xuē zhí wéi mín\",\r\n 削木为吏: \"xuē mù wéi lì\",\r\n 想望风褱: \"xiǎng wàng fēng huái\",\r\n 香培玉琢: \"xiang pei yu zhuó\",\r\n 相鼠有皮: \"xiàng shǔ yǒu pí\",\r\n 相时而动: \"xiàng shí ér dòng\",\r\n 相切相磋: \"xiāng qiē xiāng cuō\",\r\n 相女配夫: \"xiàng nǚ pèi fū\",\r\n 相门有相: \"xiàng mén yǒu xiàng\",\r\n 挦章撦句: \"xián zhāng chě jù\",\r\n 先我着鞭: \"xiān wǒ zhuó biān\",\r\n 习焉不察: \"xí yān bù chá\",\r\n 歙漆阿胶: \"shè qī ē jiāo\",\r\n 晰毛辨发: \"xī máo biàn fà\",\r\n 悉索薄赋: \"xī suǒ bó fù\",\r\n 雾鳞云爪: \"wù lín yún zhǎo\",\r\n 物稀为贵: \"wù xī wéi guì\",\r\n 碔砆混玉: \"wǔ fū hùn yù\",\r\n 武断专横: \"wǔ duàn zhuān héng\",\r\n 五石六鹢: \"wǔ shí liù yì\",\r\n 五色相宣: \"wǔ sè xiāng xuān\",\r\n 五侯七贵: \"wǔ hóu qī guì\",\r\n 五侯蜡烛: \"wǔ hòu là zhú\",\r\n 五羖大夫: \"wǔ gǔ dà fū\",\r\n 吾自有处: \"wú zì yǒu chǔ\",\r\n 无下箸处: \"wú xià zhù chǔ\",\r\n 无伤无臭: \"wú shāng wú xiù\",\r\n 无能为役: \"wú néng wéi yì\",\r\n 无寇暴死: \"wú kòu bào sǐ\",\r\n 无孔不钻: \"wú kǒng bú zuàn\",\r\n 无间可乘: \"wú jiān kě chéng\",\r\n 无间冬夏: \"wú jiān dōng xià\",\r\n 无恶不为: \"wú è bù wéi\",\r\n 无动为大: \"wú dòng wéi dà\",\r\n 诬良为盗: \"wū liáng wéi dào\",\r\n 握拳透爪: \"wò quán tòu zhǎo\",\r\n 文武差事: \"wén wǔ chāi shì\",\r\n 委委佗佗: \"wēi wēi tuó tuó\",\r\n 惟日为岁: \"wéi rì wéi suì\",\r\n 帷薄不修: \"wéi bó bù xiū\",\r\n 为善最乐: \"wéi shàn zuì lè\",\r\n 为山止篑: \"wéi shān zhǐ kuì\",\r\n 为仁不富: \"wéi rén bú fù\",\r\n 为裘为箕: \"wéi qiú wéi jī\",\r\n 为民父母: \"wéi mín fù mǔ\",\r\n 为虺弗摧: \"wéi huǐ fú cuī\",\r\n 为好成歉: \"wéi hǎo chéng qiàn\",\r\n 为鬼为蜮: \"wéi guǐ wéi yù\",\r\n 望风响应: \"wàng fēng xiǎng yīng\",\r\n 望尘僄声: \"wàng chén piào shēng\",\r\n 往渚还汀: \"wǎng zhǔ huán tīng\",\r\n 王贡弹冠: \"wáng gòng dàn guàn\",\r\n 亡国大夫: \"wáng guó dà fū\",\r\n 万贯家私: \"wàn guàn jiā sī\",\r\n 晚食当肉: \"wǎn shí dàng ròu\",\r\n 晚节不保: \"wǎn jié bù bǎo\",\r\n 玩岁愒时: \"wán suì kài shí\",\r\n 蛙蟆胜负: \"wā má shèng fù\",\r\n 吞言咽理: \"tūn yán yàn lǐ\",\r\n 颓垣断堑: \"tuí yuán duàn qiàn\",\r\n 推干就湿: \"tuī gàn jiù shī\",\r\n 剸繁决剧: \"tuán fán jué jù\",\r\n 团头聚面: \"tuán tóu jù miàn\",\r\n 兔丝燕麦: \"tù sī yàn mài\",\r\n 兔头麞脑: \"tù tóu zhāng nǎo\",\r\n 兔葵燕麦: \"tù kuí yàn mài\",\r\n 吐哺握发: \"tǔ bǔ wò fà\",\r\n 投传而去: \"tóu zhuàn ér qù\",\r\n 头没杯案: \"tóu mò bēi àn\",\r\n 头昏脑闷: \"tóu hūn nǎo mèn\",\r\n 头会箕敛: \"tóu kuài jī liǎn\",\r\n 头出头没: \"tóu chū tóu mò\",\r\n 痛自创艾: \"tòng zì chuāng yì\",\r\n 同恶相助: \"tóng wù xiāng zhù\",\r\n 同恶相恤: \"tóng wù xiāng xù\",\r\n 痌瘝在抱: \"tōng guān zài bào\",\r\n 通文调武: \"tōng wén diào wǔ\",\r\n 停留长智: \"tíng liú zhǎng zhì\",\r\n 铁树开华: \"tiě shù kāi huā\",\r\n 条贯部分: \"tiáo guàn bù fēn\",\r\n 挑牙料唇: \"tiǎo yá liào chún\",\r\n 挑么挑六: \"tiāo yāo tiāo liù\",\r\n 挑唇料嘴: \"tiǎo chún liào zuǐ\",\r\n 恬不为意: \"tián bù wéi yì\",\r\n 恬不为怪: \"tián bù wéi guài\",\r\n 天下为笼: \"tiān xià wéi lóng\",\r\n 天台路迷: \"tiān tái lù mí\",\r\n 天年不遂: \"tiān nián bú suì\",\r\n 探囊胠箧: \"tàn náng qū qiè\",\r\n 谭言微中: \"tán yán wēi zhòng\",\r\n 谈言微中: \"tán yán wēi zhòng\",\r\n 狧穅及米: \"shì kāng jí mǐ\",\r\n 随物应机: \"suí wù yīng jī\",\r\n 搜岩采干: \"sōu yán cǎi gàn\",\r\n 宋斤鲁削: \"sòng jīn lǔ xuē\",\r\n 松筠之节: \"sōng yún zhī jié\",\r\n 四亭八当: \"sì tíng bā dàng\",\r\n 四马攒蹄: \"sì mǎ cuán tí\",\r\n 四不拗六: \"sì bú niù liù\",\r\n 思所逐之: \"sī suǒ zhú zhī\",\r\n 丝恩发怨: \"sī ēn fà yuàn\",\r\n 硕望宿德: \"shuò wàng xiǔ dé\",\r\n 铄古切今: \"shuò gǔ qiē jīn\",\r\n 顺风而呼: \"shùn fēng ér hū\",\r\n 顺风吹火: \"shùn fēng chuī huǒ\",\r\n 水中著盐: \"shuǐ zhōng zhuó yán\",\r\n 双柑斗酒: \"shuāng gān dǒu jiǔ\",\r\n 数米而炊: \"shǔ mǐ ér chuī\",\r\n 数米量柴: \"shǔ mǐ liáng chái\",\r\n 数理逻辑: \"shù lǐ luó ji\",\r\n 数黑论黄: \"shǔ hēi lùn huáng\",\r\n 数白论黄: \"shǔ bái lùn huáng\",\r\n 束缊还妇: \"shù yūn huán fù\",\r\n 束蒲为脯: \"shù pú wéi pú\",\r\n 束椽为柱: \"shù chuán wéi zhù\",\r\n 书缺有间: \"shū quē yǒu jiàn\",\r\n 手足重茧: \"shǒu zú chóng jiǎn\",\r\n 手足异处: \"shǒu zú yì chǔ\",\r\n 手脚干净: \"shǒu jiǎo gàn jìng\",\r\n 手不应心: \"shǒu bù yīng xīn\",\r\n 螫手解腕: \"shì shǒu jiě wàn\",\r\n 释知遗形: \"shì zhī yí xíng\",\r\n 适时应务: \"shì shí yīng wù\",\r\n 适情率意: \"shì qíng shuài yì\",\r\n 适当其冲: \"shì dāng qí chōng\",\r\n 视为知己: \"shì wéi zhī jǐ\",\r\n 使羊将狼: \"shǐ yáng jiàng láng\",\r\n 食为民天: \"shí wéi mín tiān\",\r\n 拾掇无遗: \"shí duō wú yí\",\r\n 实与有力: \"shí yù yǒu lì\",\r\n 石英玻璃: \"shí yīng bō li\",\r\n 石室金匮: \"shí shì jīn guì\",\r\n 什袭珍藏: \"shí xí zhēn cáng\",\r\n 什伍东西: \"shí wǔ dōng xī\",\r\n 什围伍攻: \"shí wéi wǔ gōng\",\r\n 十魔九难: \"shí mó jiǔ nàn\",\r\n 诗书发冢: \"shī shū fà zhǒng\",\r\n 虱处裈中: \"shī chǔ kūn zhōng\",\r\n 师直为壮: \"shī zhí wéi zhuàng\",\r\n 尸居龙见: \"shī jū lóng xiàn\",\r\n 圣经贤传: \"shèng jīng xián zhuàn\",\r\n 圣君贤相: \"shèng jūn xián xiàng\",\r\n 生拖死拽: \"shēng tuō sǐ zhuài\",\r\n 审己度人: \"shěn jǐ duó rén\",\r\n 神武挂冠: \"shén wǔ guà guàn\",\r\n 神龙失埶: \"shén lóng shī shì\",\r\n 深文曲折: \"shēn wén qǔ shé\",\r\n 深厉浅揭: \"shēn lì qiǎn qì\",\r\n 深谷为陵: \"shēn gǔ wéi líng\",\r\n 深恶痛疾: \"shēn wù tòng jí\",\r\n 深仇宿怨: \"shēn chóu xiǔ yuàn\",\r\n 舍己为公: \"shě jǐ wèi gōng\",\r\n 舍短取长: \"shě duǎn qǔ cháng\",\r\n 舍策追羊: \"shě cè zhuī yáng\",\r\n 蛇蝎为心: \"shé xiē wéi xīn\",\r\n 少成若性: \"shào chéng ruò xìng\",\r\n 上当学乖: \"shàng dàng xué guāi\",\r\n 赏不当功: \"shǎng bù dāng gōng\",\r\n 善自为谋: \"shàn zì wéi móu\",\r\n 善为说辞: \"shàn wéi shuō cí\",\r\n 善善恶恶: \"shàn shàn wù è\",\r\n 善财难舍: \"shàn cái nán shě\",\r\n 苫眼铺眉: \"shān yǎn pū méi\",\r\n 讪牙闲嗑: \"shàn yá xián kē\",\r\n 山阴乘兴: \"shān yīn chéng xīng\",\r\n 山殽野湋: \"shān yáo yě wéi\",\r\n 山溜穿石: \"shān liù chuān shí\",\r\n 山节藻棁: \"shān jié zǎo zhuō\",\r\n 杀鸡为黍: \"shā jī wéi shǔ\",\r\n 色厉胆薄: \"sè lì dǎn bó\",\r\n 桑荫未移: \"sāng yīn wèi yí\",\r\n 桑荫不徙: \"sāng yīn bù xǐ\",\r\n 桑土绸缪: \"sāng tǔ chóu miù\",\r\n 桑户棬枢: \"sāng hù juàn shū\",\r\n 三战三北: \"sān zhàn sān běi\",\r\n 三瓦两舍: \"sān wǎ liǎng shě\",\r\n 三人为众: \"sān rén wèi zhòng\",\r\n 三差两错: \"sān chā liǎng cuò\",\r\n 塞井焚舍: \"sāi jǐng fén shě\",\r\n 洒心更始: \"sǎ xīn gèng shǐ\",\r\n 洒扫应对: \"sǎ sǎo yìng duì\",\r\n 软红香土: \"ruǎn hóng xiāng tǔ\",\r\n 入吾彀中: \"rù wú gòu zhōng\",\r\n 入铁主簿: \"rù tiě zhǔ bù\",\r\n 入理切情: \"rù lǐ qiē qíng\",\r\n 汝成人耶: \"rǔ chéng rén yé\",\r\n 如水投石: \"rú shuǐ tóu shí\",\r\n 如切如磋: \"rú qiē rú cuō\",\r\n 如登春台: \"rú dēng chūn tái\",\r\n 肉薄骨并: \"ròu bó gǔ bìng\",\r\n 柔情绰态: \"róu qíng chuò tài\",\r\n 戎马劻勷: \"róng mǎ kuāng ráng\",\r\n 日中为市: \"rì zhōng wéi shì\",\r\n 日月参辰: \"rì yuè shēn chén\",\r\n 日省月修: \"rì xǐng yuè xiū\",\r\n 日削月割: \"rì xuē yuè gē\",\r\n 日省月试: \"rì xǐng yuè shì\",\r\n 任达不拘: \"rèn dá bù jū\",\r\n 人言藉藉: \"rén yán jí jí\",\r\n 人模狗样: \"rén mú gǒu yàng\",\r\n 人莫予毒: \"rén mò yú dú\",\r\n 热熬翻饼: \"rè áo fān bǐng\",\r\n 圈牢养物: \"juàn láo yǎng wù\",\r\n 取予有节: \"qǔ yǔ yǒu jié\",\r\n 诎要桡腘: \"qū yāo ráo guó\",\r\n 穷形尽相: \"qióng xíng jìn xiàng\",\r\n 情凄意切: \"qíng qī yì qiè\",\r\n 情见势屈: \"qíng xiàn shì qū\",\r\n 情见乎辞: \"qíng xiàn hū cí\",\r\n 清都绛阙: \"qīng dōu jiàng què\",\r\n 倾肠倒肚: \"qīng cháng dào dǔ\",\r\n 青紫被体: \"qīng zǐ pī tǐ\",\r\n 青林黑塞: \"qīng lín hēi sài\",\r\n 螓首蛾眉: \"qín shǒu é méi\",\r\n 琴瑟之好: \"qín sè zhī hào\",\r\n 且住为佳: \"qiě zhù wéi jiā\",\r\n 切树倒根: \"qiē shù dǎo gēn\",\r\n 切理餍心: \"qiē lǐ yàn xīn\",\r\n 切近的当: \"qiē jìn de dāng\",\r\n 翘足引领: \"qiáo zú yǐn lǐng\",\r\n 巧发奇中: \"qiǎo fā qí zhòng\",\r\n 强嘴拗舌: \"jiàng zuǐ niù shé\",\r\n 强直自遂: \"qiáng zhí zì suí\",\r\n 强死强活: \"qiǎng sǐ qiǎng huó\",\r\n 强食自爱: \"qiǎng shí zì ài\",\r\n 强食靡角: \"qiǎng shí mí jiǎo\",\r\n 强弓劲弩: \"qiáng gōng jìng nǔ\",\r\n 强聒不舍: \"qiǎng guō bù shě\",\r\n 强凫变鹤: \"qiáng fú biàn hè\",\r\n 强而后可: \"qiǎng ér hòu kě\",\r\n 强得易贫: \"qiǎng dé yì pín\",\r\n 遣兴陶情: \"qiǎn xìng táo qíng\",\r\n 牵羊担酒: \"qiān yáng dān jiǔ\",\r\n 千了百当: \"qiān liǎo bǎi dàng\",\r\n 泣下如雨: \"qì xià rú yǔ\",\r\n 起偃为竖: \"qǐ yǎn wéi shù\",\r\n 岂弟君子: \"kǎi tì jūn zǐ\",\r\n 綦溪利跂: \"qí xī lì qí\",\r\n 棋输先著: \"qí shū xiān zhuó\",\r\n 齐王舍牛: \"qí wáng shě niú\",\r\n 欺天诳地: \"qī tiān kuáng dì\",\r\n 普天率土: \"pǔ tiān shuài tǔ\",\r\n 铺胸纳地: \"pū xiōng nà dì\",\r\n 铺锦列绣: \"pū jǐn liè xiù\",\r\n 破家为国: \"pò jiā wèi guó\",\r\n 破觚为圜: \"pò gū wéi yuán\",\r\n 萍飘蓬转: \"píng piāo péng zhuàn\",\r\n 帡天极地: \"píng tiān jí dì\",\r\n 屏声息气: \"bǐng shēng xī qì\",\r\n 凭几据杖: \"píng jī jù zhàng\",\r\n 贫嘴薄舌: \"pín zuǐ bó shé\",\r\n 片语只辞: \"piàn yǔ zhī cí\",\r\n 披发文身: \"pī fà wén shēn\",\r\n 烹龙炮凤: \"pēng lóng páo fèng\",\r\n 炰鳖脍鲤: \"fǒu biē kuài lǐ\",\r\n 庞眉皓发: \"páng méi hào fà\",\r\n 攀花折柳: \"pān huā zhé liǔ\",\r\n 攀蟾折桂: \"pān chán shé guì\",\r\n 女大难留: \"nǚ dà nán liú\",\r\n 弄玉吹箫: \"nòng yù chuī xiāo\",\r\n 弄管调弦: \"nòng guǎn tiáo xián\",\r\n 弄粉调朱: \"nòng fěn diào zhū\",\r\n 浓抹淡妆: \"nóng mò dàn zhuāng\",\r\n 捻土为香: \"niǎn tǔ wéi xiāng\",\r\n 年谊世好: \"nián yì shì hǎo\",\r\n 年华垂暮: \"nián huá chuí mù\",\r\n 儗不于伦: \"nǐ bù yú lún\",\r\n 泥而不滓: \"ní ér bù zǐ\",\r\n 能者为师: \"néng zhě wéi shī\",\r\n 能不称官: \"néng bú chèn guān\",\r\n 挠直为曲: \"náo zhí wéi qū\",\r\n 难进易退: \"nán jìn yì tuì\",\r\n 难得糊涂: \"nán dé hú tú\",\r\n 南蛮鴂舌: \"nán mán jué shé\",\r\n 南贩北贾: \"nán fàn běi gǔ\",\r\n 牧猪奴戏: \"mù zhū nú xì\",\r\n 目眢心忳: \"mù yuān xīn tún\",\r\n 目挑心招: \"mù tiǎo xīn zhāo\",\r\n 目量意营: \"mù liàng yì yíng\",\r\n 木头木脑: \"mù tóu mù nǎo\",\r\n 木干鸟栖: \"mù gàn niǎo qī\",\r\n 侔色揣称: \"móu sè chuǎi chèn\",\r\n 莫予毒也: \"mò yú dú yě\",\r\n 抹粉施脂: \"mò fěn shī zhī\",\r\n 磨砻镌切: \"mó lóng juān qiē\",\r\n 磨棱刓角: \"mó léng wán jiǎo\",\r\n 摸门不着: \"mō mén bù zháo\",\r\n 摸不着边: \"mō bù zhuó biān\",\r\n 命中注定: \"mìng zhōng zhù dìng\",\r\n 鸣鹤之应: \"míng hè zhī yìng\",\r\n 明效大验: \"míng xiào dà yàn\",\r\n 名我固当: \"míng wǒ gù dāng\",\r\n 邈处欿视: \"miǎo chǔ kǎn shì\",\r\n 黾穴鸲巢: \"měng xué qú cháo\",\r\n 绵里薄材: \"mián lǐ bó cái\",\r\n 靡有孑遗: \"mǐ yǒu jié yí\",\r\n 靡衣偷食: \"mǐ yī tōu shí\",\r\n 迷恋骸骨: \"mí liàn hái gǔ\",\r\n 扪参历井: \"mén shēn lì jǐng\",\r\n 门单户薄: \"mén dān hù bó\",\r\n 昧旦晨兴: \"mèi dàn chén xīng\",\r\n 冒名接脚: \"mào míng jiē jiǎo\",\r\n 毛遂堕井: \"máo suí duò jǐng\",\r\n 毛发倒竖: \"máo fā dǎo shù\",\r\n 卖文为生: \"mài wén wéi shēng\",\r\n 卖李钻核: \"mài lǐ zuān hé\",\r\n 买椟还珠: \"mǎi dú huán zhū\",\r\n 埋三怨四: \"mán sān yuàn sì\",\r\n 马入华山: \"mǎ rù huá shān\",\r\n 落魄江湖: \"luò pò jiāng hú\",\r\n 落落难合: \"luò luò nán hé\",\r\n 落草为寇: \"luò cǎo wéi kòu\",\r\n 罗织构陷: \"luó zhī gòu xiàn\",\r\n 鸾凤和鸣: \"luán fèng hè míng\",\r\n 率由旧章: \"shuài yóu jiù zhāng\",\r\n 率土同庆: \"shuài tǔ tóng qìng\",\r\n 率兽食人: \"shuài shòu shí rén\",\r\n 率土归心: \"shuài tǔ guī xīn\",\r\n 率马以骥: \"shuài mǎ yǐ jì\",\r\n 率尔成章: \"shuài ěr chéng zhāng\",\r\n 鲁斤燕削: \"lǔ jīn yàn xuē\",\r\n 漏尽更阑: \"lòu jìn gēng lán\",\r\n 笼鸟槛猿: \"lóng niǎo jiàn yuán\",\r\n 笼鸟池鱼: \"lóng niǎo chí yú\",\r\n 龙游曲沼: \"lóng yóu qū zhǎo\",\r\n 龙血玄黄: \"lóng xuè xuán huáng\",\r\n 龙雕凤咀: \"lóng diāo fèng jǔ\",\r\n 六尺之讬: \"liù chǐ zhī tuō\",\r\n 令原之戚: \"líng yuán zhī qī\",\r\n 令人捧腹: \"lìng rén pěng fù\",\r\n 陵劲淬砺: \"líng jìng cuì lì\",\r\n 临敌易将: \"lín dí yì jiàng\",\r\n 裂裳衣疮: \"liè shang yī chuāng\",\r\n 裂冠毁冕: \"liè guàn huǐ miǎn\",\r\n 了无惧色: \"liǎo wú jù sè\",\r\n 了身达命: \"liǎo shēn dá mìng\",\r\n 了然无闻: \"liǎo rán wú wén\",\r\n 了不可见: \"liǎo bù kě jiàn\",\r\n 了不长进: \"liǎo bù zhǎng jìn\",\r\n 燎发摧枯: \"liǎo fà cuī kū\",\r\n 审时度势: \"shěn shí duó shì\",\r\n 量小力微: \"liàng xiǎo lì wēi\",\r\n 相时度力: \"xiāng shí duó lì\",\r\n 量枘制凿: \"liàng ruì zhì záo\",\r\n 量如江海: \"liàng rú jiāng hǎi\",\r\n 量金买赋: \"liàng jīn mǎi fù\",\r\n 量己审分: \"liàng jǐ shěn fēn\",\r\n 敛骨吹魂: \"liǎn gǔ chuī hún\",\r\n 詈夷为跖: \"lì yí wéi zhí\",\r\n 利令志惛: \"lì lìng zhì hūn\",\r\n 李广不侯: \"lǐ guǎng bú hòu\",\r\n 礼为情貌: \"lǐ wéi qíng mào\",\r\n 礼让为国: \"lǐ ràng wéi guó\",\r\n 犁生骍角: \"lí shēng xīng jiǎo\",\r\n 离本徼末: \"lí běn jiǎo mò\",\r\n 楞眉横眼: \"léng méi hèng yǎn\",\r\n 擂天倒地: \"léi tiān dǎo dì\",\r\n 累足成步: \"lěi zú chéng bù\",\r\n 累瓦结绳: \"lěi wǎ jié shéng\",\r\n 累土至山: \"lěi tǔ zhì shān\",\r\n 累土聚沙: \"lěi tǔ jù shā\",\r\n 累卵之危: \"lěi luǎn zhī wēi\",\r\n 累累如珠: \"lěi lěi rú zhū\",\r\n 累块积苏: \"lěi kuài jī sū\",\r\n 乐山乐水: \"lè shān lè shuǐ\",\r\n 潦原浸天: \"lǎo yuán jìn tiān\",\r\n 老师宿儒: \"lǎo shī xiǔ rú\",\r\n 牢什古子: \"láo shí gǔ zi\",\r\n 琅嬛福地: \"láng huán fú dì\",\r\n 揆情度理: \"kuí qíng duó lǐ\",\r\n 旷日累时: \"kuàng rì lěi shí\",\r\n 匡救弥缝: \"kuāng jiù mí fèng\",\r\n 枯树生华: \"kū shù shēng huā\",\r\n 口轻舌薄: \"kǒu qīng shé bó\",\r\n 口角生风: \"kǒu jiǎo shēng fēng\",\r\n 口角春风: \"kǒu jiǎo chūn fēng\",\r\n 口角风情: \"kǒu jiǎo fēng qíng\",\r\n 口干舌焦: \"kǒu gān shé jiāo\",\r\n 口腹之累: \"kǒu fù zhī lěi\",\r\n 空腹便便: \"kōng fù pián pián\",\r\n 嗑牙料嘴: \"kē yá liào zuǐ\",\r\n 刻木为鹄: \"kè mù wéi hú\",\r\n 咳珠唾玉: \"ké zhū tuò yù\",\r\n 咳唾成珠: \"ké tuò chéng zhū\",\r\n 抗颜为师: \"kàng yán wéi shī\",\r\n 开华结果: \"kāi huā jié guǒ\",\r\n 峻阪盐车: \"jùn bǎn yán chē\",\r\n 嚼铁咀金: \"jiáo tiě jǔ jīn\",\r\n 嚼墨喷纸: \"jué mò pēn zhǐ\",\r\n 倔头强脑: \"juè tóu jiàng nǎo\",\r\n 倔头倔脑: \"juè tóu juè nǎo\",\r\n 倦鸟知还: \"juàn niǎo zhī huán\",\r\n 卷席而葬: \"juǎn xí ér zàng\",\r\n 卷甲倍道: \"juǎn jiǎ bèi dào\",\r\n 聚米为山: \"jù mǐ wéi shān\",\r\n 举手相庆: \"jǔ shǒu xiāng qìng\",\r\n 举世混浊: \"jǔ shì hún zhuó\",\r\n 鞠为茂草: \"jū wéi mào cǎo\",\r\n 拘神遣将: \"jū shén qiǎn jiàng\",\r\n 居下讪上: \"jū xià shàn shàng\",\r\n 久要不忘: \"jiǔ yāo bú wàng\",\r\n 九转功成: \"jiǔ zhuǎn gōng chéng\",\r\n 九蒸三熯: \"jiǔ zhēng sān hàn\",\r\n 敬业乐群: \"jìng yè lè qún\",\r\n 井底虾蟆: \"jǐng dǐ xiā má\",\r\n 旌旗卷舒: \"jīng qí juǎn shū\",\r\n 荆棘载途: \"jīng jí zài tú\",\r\n 禁舍开塞: \"jìn shě kāi sāi\",\r\n 祲威盛容: \"jìn wēi shèng róng\",\r\n 进退消长: \"jìn tuì xiāo cháng\",\r\n 进退应矩: \"jìn tuì yīng jǔ\",\r\n 进退触籓: \"jìn tuì chù fān\",\r\n 进退跋疐: \"jìn tuì bá zhì\",\r\n 尽多尽少: \"jǐn duō jǐn shǎo\",\r\n 锦囊还矢: \"jǐn náng huán shǐ\",\r\n 矜己自饰: \"jīn jǐ zì shì\",\r\n 矜功负气: \"jīn gōng fù qì\",\r\n 津关险塞: \"jīn guān xiǎn sài\",\r\n 金吾不禁: \"jīn wú bú jìn\",\r\n 金翅擘海: \"jīn chì bāi hǎi\",\r\n 解衣衣人: \"jiě yī yī rén\",\r\n 解人难得: \"jiě rén nán dé\",\r\n 解铃系铃: \"jiě líng xì líng\",\r\n 解发佯狂: \"jiě fà yáng kuáng\",\r\n 诘屈磝碻: \"jié qū áo qiāo\",\r\n 教猱升木: \"jiāo náo shēng mù\",\r\n 较瘦量肥: \"jiào shòu liàng féi\",\r\n 角立杰出: \"jiǎo lì jié chū\",\r\n 焦沙烂石: \"jiāo shā làn shí\",\r\n 骄儿騃女: \"jiāo ér sì nǚ\",\r\n 浇风薄俗: \"jiāo fēng bó sú\",\r\n 降妖捉怪: \"xiáng yāo zhuō guài\",\r\n 将取固予: \"jiāng qǔ gù yǔ\",\r\n 将门有将: \"jiàng mén yǒu jiàng\",\r\n 将夺固与: \"jiāng duó gù yǔ\",\r\n 槛花笼鹤: \"jiàn huā lóng hè\",\r\n 鉴影度形: \"jiàn yǐng duó xíng\",\r\n 渐不可长: \"jiàn bù kě zhǎng\",\r\n 见素抱朴: \"xiàn sù bào pǔ\",\r\n 见弃于人: \"jiàn qì yú rén\",\r\n 简丝数米: \"jiǎn sī shǔ mǐ\",\r\n 俭不中礼: \"jiǎn bú zhòng lǐ\",\r\n 间见层出: \"jiàn xiàn céng chū\",\r\n 尖嘴薄舌: \"jiān zuǐ bó shé\",\r\n 甲冠天下: \"jiǎ guàn tiān xià\",\r\n 葭莩之亲: \"jiā fú zhī qīn\",\r\n 家累千金: \"jiā lèi qiān jīn\",\r\n 家给人足: \"jiā jǐ rén zú\",\r\n 家道从容: \"jiā dào cóng róng\",\r\n 夹袋人物: \"jiā dài rén wù\",\r\n 霁风朗月: \"jì fēng lǎng yuè\",\r\n 寄兴寓情: \"jì xìng yù qíng\",\r\n 计深虑远: \"jì shēn lǜ yuǎn\",\r\n 计功量罪: \"jì gōng liàng zuì\",\r\n 掎裳连襼: \"jǐ shang lián yì\",\r\n 虮虱相吊: \"jǐ shī xiāng diào\",\r\n 疾不可为: \"jí bù kě wéi\",\r\n 极深研几: \"jí shēn yán jī\",\r\n 及宾有鱼: \"jí bīn yǒu yú\",\r\n 激薄停浇: \"jī bó tíng jiāo\",\r\n 积素累旧: \"jī sù lěi jiù\",\r\n 积时累日: \"jī shí lěi rì\",\r\n 积露为波: \"jī lù wéi bō\",\r\n 积德累功: \"jī dé lěi gōng\",\r\n 积谗糜骨: \"jī chán méi gǔ\",\r\n 击排冒没: \"jī pái mào mò\",\r\n 祸为福先: \"huò wéi fú xiān\",\r\n 祸福相依: \"huò fú xiāng yī\",\r\n 获隽公车: \"huò jùn gōng chē\",\r\n 混应滥应: \"hùn yīng làn yīng\",\r\n 毁舟为杕: \"huǐ zhōu wéi duò\",\r\n 毁钟为铎: \"huǐ zhōng wéi duó\",\r\n 毁冠裂裳: \"huǐ guān liè cháng\",\r\n 晦盲否塞: \"huì máng pǐ sè\",\r\n 回船转舵: \"huí chuán zhuàn duò\",\r\n 潢池盗弄: \"huáng chí dào nòng\",\r\n 黄冠草履: \"huáng guàn cǎo lǚ\",\r\n 黄发儿齿: \"huáng fà ér chǐ\",\r\n 黄发垂髫: \"huáng fà chuí tiáo\",\r\n 还珠返璧: \"huán zhū fǎn bì\",\r\n 还年驻色: \"huán nián zhù sè\",\r\n 还年却老: \"huán nián què lǎo\",\r\n 坏裳为裤: \"huài shang wéi kù\",\r\n 画荻和丸: \"huà dí huò wán\",\r\n 化枭为鸠: \"huà xiāo wéi jiū\",\r\n 化腐为奇: \"huà fǔ wéi qí\",\r\n 化鸱为凤: \"huà chī wéi fèng\",\r\n 花不棱登: \"huā bu lēng dēng\",\r\n 户限为穿: \"hù xiàn wéi chuān\",\r\n 呼卢喝雉: \"hū lú hè zhì\",\r\n 呼来喝去: \"hū lái hè qù\",\r\n 呼不给吸: \"hū bù jǐ xī\",\r\n 厚味腊毒: \"hòu wèi xī dú\",\r\n 厚德载物: \"hòu dé zài wù\",\r\n 鸿渐于干: \"hóng jiàn yú gàn\",\r\n 洪炉燎发: \"hóng lú liáo fà\",\r\n 红绳系足: \"hóng shéng jì zú\",\r\n 红不棱登: \"hóng bu lēng dēng\",\r\n 横抢硬夺: \"hèng qiǎng yìng duó\",\r\n 横恩滥赏: \"hèng ēn làn shǎng\",\r\n 恨海难填: \"hèn hǎi nán tián\",\r\n 鹤发鸡皮: \"hè fà jī pí\",\r\n 涸思干虑: \"hé sī gān lǜ\",\r\n 河涸海干: \"hé hé hǎi gān\",\r\n 和颜说色: \"hé yán yuè sè\",\r\n 合从连衡: \"hé zòng lián héng\",\r\n 浩浩汤汤: \"hào hào shāng shāng\",\r\n 好勇斗狠: \"hào yǒng dòu hěn\",\r\n 好问则裕: \"hào wèn zé yù\",\r\n 好为事端: \"hào wéi shì duān\",\r\n 好问决疑: \"hào wèn jué yí\",\r\n 好生之德: \"hào shēng zhī dé\",\r\n 好奇尚异: \"hǎo qí shàng yì\",\r\n 好恶不同: \"hǎo è bù tóng\",\r\n 好丹非素: \"hào dān fēi sù\",\r\n 豪干暴取: \"háo gàn bào qǔ\",\r\n 毫发不爽: \"háo fà bù shuǎng\",\r\n 寒酸落魄: \"hán suān luò pò\",\r\n 含英咀华: \"hán yīng jǔ huá\",\r\n 含糊不明: \"hán hú bù míng\",\r\n 过为已甚: \"guò wéi yǐ shèn\",\r\n 桂折兰摧: \"guì shé lán cuī\",\r\n 规旋矩折: \"guī xuán jǔ shé\",\r\n 广文先生: \"guǎng wén xiān sheng\",\r\n 广陵散绝: \"guǎng líng sǎn jué\",\r\n 冠山戴粒: \"guàn shān dài lì\",\r\n 冠屦倒施: \"guàn jù dǎo shī\",\r\n 挂席为门: \"guà xí wéi mén\",\r\n 寡见鲜闻: \"guǎ jiàn xiǎn wén\",\r\n 瓜葛相连: \"guā gé xiāng lián\",\r\n 鼓吻奋爪: \"gǔ wěn fèn zhǎo\",\r\n 古调单弹: \"gǔ diào dān tán\",\r\n 古调不弹: \"gǔ diào bù tán\",\r\n 姑射神人: \"gū yè shén rén\",\r\n 苟合取容: \"gǒu hé qǔ róng\",\r\n 狗续侯冠: \"gǒu xù hòu guàn\",\r\n 钩爪锯牙: \"gōu zhǎo jù yá\",\r\n 共枝别干: \"gòng zhī bié gàn\",\r\n 共为唇齿: \"gòng wéi chún chǐ\",\r\n 拱手而降: \"gǒng shǒu ér xiáng\",\r\n 拱肩缩背: \"gǒng jiān suō bèi\",\r\n 功薄蝉翼: \"gōng bó chán yì\",\r\n 弓调马服: \"gōng diào mǎ fú\",\r\n 更姓改物: \"gēng xìng gǎi wù\",\r\n 更仆难数: \"gēng pú nán shǔ\",\r\n 更令明号: \"gēng lìng míng hào\",\r\n 更待干罢: \"gèng dài gàn bà\",\r\n 更唱迭和: \"gēng chàng dié hé\",\r\n 更长梦短: \"gēng cháng mèng duǎn\",\r\n 各色名样: \"gè sè míng yàng\",\r\n 格格不纳: \"gé gé bú nà\",\r\n 格格不吐: \"gé gé bù tǔ\",\r\n 告朔饩羊: \"gù shuò xì yáng\",\r\n 膏车秣马: \"gào chē mò mǎ\",\r\n 高义薄云: \"gāo yì bó yún\",\r\n 岗头泽底: \"gāng tóu zé dǐ\",\r\n 敢为敢做: \"gǎn wéi gǎn zuò\",\r\n 甘分随时: \"gān fèn suí shí\",\r\n 甘处下流: \"gān chǔ xià liú\",\r\n 干啼湿哭: \"gàn tí shī kū\",\r\n 干名犯义: \"gàn míng fàn yì\",\r\n 干将莫邪: \"gān jiāng mò yé\",\r\n 干城之将: \"gān chéng zhī jiàng\",\r\n 腹载五车: \"fù zài wǔ chē\",\r\n 父债子还: \"fù zhài zǐ huán\",\r\n 父为子隐: \"fù wéi zǐ yǐn\",\r\n 辅世长民: \"fǔ shì zhǎng mín\",\r\n 福为祸始: \"fú wéi huò shǐ\",\r\n 符号逻辑: \"fú hào luó jí\",\r\n 浮收勒折: \"fú shōu lè shé\",\r\n 肤受之愬: \"fū shòu zhī sù\",\r\n 否终则泰: \"pǐ zhōng zé tài\",\r\n 佛头著粪: \"fó tóu zhuó fèn\",\r\n 奉为楷模: \"fèng wéi kǎi mó\",\r\n 凤靡鸾吪: \"fèng mǐ luán é\",\r\n 封豨修蛇: \"fēng xī xiū shé\",\r\n 风影敷衍: \"fēng yǐng fū yǎn\",\r\n 丰屋蔀家: \"fēng wū bù jiā\",\r\n 粪土不如: \"fèn tǔ bù rú\",\r\n 分风劈流: \"fēn fēng pǐ liú\",\r\n 沸沸汤汤: \"fèi fèi shāng shāng\",\r\n 菲食薄衣: \"fěi shí bó yī\",\r\n 飞将数奇: \"fēi jiàng shù qí\",\r\n 放辟邪侈: \"fàng pì xié chǐ\",\r\n 方领圆冠: \"fāng lǐng yuán guàn\",\r\n 犯而不校: \"fàn ér bú jiào\",\r\n 返本还源: \"fǎn běn huán yuán\",\r\n 反劳为逸: \"fǎn láo wéi yì\",\r\n 法轮常转: \"fǎ lún cháng zhuàn\",\r\n 罚不当罪: \"fá bù dāng zuì\",\r\n 发引千钧: \"fà yǐn qiān jūn\",\r\n 发奸擿伏: \"fā jiān tī fú\",\r\n 发短心长: \"fà duǎn xīn cháng\",\r\n 二竖为虐: \"èr shù wéi nüè\",\r\n 儿女心肠: \"ér nǚ xīn cháng\",\r\n 儿女亲家: \"ér nǚ qìng jiā\",\r\n 遏恶扬善: \"è wù yáng shàn\",\r\n 饿殍枕藉: \"è piǎo zhěn jí\",\r\n 饿殍载道: \"è piǎo zài dào\",\r\n 恶醉强酒: \"wù zuì qiǎng jiǔ\",\r\n 恶意中伤: \"è yì zhòng shāng\",\r\n 恶湿居下: \"wù shī jū xià\",\r\n 恶居下流: \"wù jū xià liú\",\r\n 恶不去善: \"wù bú qù shàn\",\r\n 扼吭夺食: \"è háng duó shí\",\r\n 扼襟控咽: \"è jīn kòng yān\",\r\n 峨峨汤汤: \"é é shāng shāng\",\r\n 屙金溺银: \"ē jīn niào yín\",\r\n 朵颐大嚼: \"duǒ yí dà jiáo\",\r\n 夺人所好: \"duó rén suǒ hào\",\r\n 多言数穷: \"duō yán shuò qióng\",\r\n 多文为富: \"duō wén wéi fù\",\r\n 多端寡要: \"duō duān guǎ yào\",\r\n 多财善贾: \"duō cái shàn gǔ\",\r\n 遁世无闷: \"dùn shì wú mèn\",\r\n 遁迹黄冠: \"dùn jì huáng guàn\",\r\n 堆案盈几: \"duī àn yíng jī\",\r\n 断还归宗: \"duàn huán guī zōng\",\r\n 短见薄识: \"duǎn jiàn bó shí\",\r\n 蠹居棊处: \"dù jū qí chǔ\",\r\n 度己以绳: \"duó jǐ yǐ shéng\",\r\n 杜默为诗: \"dù mò wéi shī\",\r\n 杜鹃啼血: \"dù juān tí xuè\",\r\n 笃近举远: \"dǔ jìn jǔ yuǎn\",\r\n 独有千秋: \"dú yǒu qiān qiū\",\r\n 读书得间: \"dú shū dé jiàn\",\r\n 斗转参横: \"dǒu zhuǎn shēn héng\",\r\n 兜肚连肠: \"dōu dǔ lián cháng\",\r\n 洞见症结: \"dòng jiàn zhèng jié\",\r\n 恫疑虚喝: \"dòng yí xū hè\",\r\n 动中窾要: \"dòng zhōng kuǎn yào\",\r\n 东鸣西应: \"dōng míng xī yīng\",\r\n 东鳞西爪: \"dōng lín xī zhǎo\",\r\n 东量西折: \"dōng liàng xī shé\",\r\n 东家西舍: \"dōng jiā xī shè\",\r\n 东扯西拽: \"dōng chě xī zhuāi\",\r\n 鼎铛有耳: \"dǐng chēng yǒu ěr\",\r\n 鼎铛玉石: \"dǐng chēng yù shí\",\r\n 钉头磷磷: \"dīng tóu lín lín\",\r\n 跌宕不羁: \"diē dàng bù jī\",\r\n 跌弹斑鸠: \"diē dàn bān jiū\",\r\n 雕心雁爪: \"diāo xīn yàn zhǎo\",\r\n 颠倒衣裳: \"diān dǎo yī cháng\",\r\n 德薄能鲜: \"dé bó néng xiǎn\",\r\n 得马折足: \"dé mǎ shé zú\",\r\n 蹈其覆辙: \"dǎo qí fù zhé\",\r\n 捣虚撇抗: \"dǎo xū piē kàng\",\r\n 倒载干戈: \"dào zài gān gē\",\r\n 倒裳索领: \"dào cháng suǒ lǐng\",\r\n 倒果为因: \"dào guǒ wéi yīn\",\r\n 叨在知己: \"tāo zài zhī jǐ\",\r\n 叨陪末座: \"tāo péi mò zuò\",\r\n 党豺为虐: \"dǎng chái wéi nüè\",\r\n 当轴处中: \"dāng zhóu chǔ zhōng\",\r\n 当着不着: \"dāng zhuó bù zhuó\",\r\n 当务始终: \"dāng wù shǐ zhōng\",\r\n 淡汝浓抹: \"dàn rǔ nóng mǒ\",\r\n 弹丸脱手: \"tán wán tuō shǒu\",\r\n 弹铗无鱼: \"dàn jiá wú yú\",\r\n 箪食瓢饮: \"dān sì piáo yǐn\",\r\n 大璞不完: \"dà pú bù wán\",\r\n 大明法度: \"dà míng fǎ dù\",\r\n 大车以载: \"dà chē yǐ zài\",\r\n 打闷葫芦: \"dǎ mèn hú lu\",\r\n 沓来踵至: \"tà lái zhǒng zhì\",\r\n 厝火燎原: \"cuò huǒ liǎo yuán\",\r\n 撮科打哄: \"cuō kē dǎ hòng\",\r\n 寸积铢累: \"cùn jī zhū lěi\",\r\n 啛啛喳喳: \"cuì cuì chā chā\",\r\n 摧折豪强: \"cuī zhé háo qiáng\",\r\n 摧刚为柔: \"cuī gāng wéi róu\",\r\n 从俗就简: \"cóng sú jiù jiǎn\",\r\n 此发彼应: \"cǐ fā bǐ yīng\",\r\n 此唱彼和: \"cǐ chàng bǐ hè\",\r\n 慈悲为本: \"cí bēi wéi běn\",\r\n 纯属骗局: \"chún shǔ piàn jú\",\r\n 春笋怒发: \"chūn sǔn nù fā\",\r\n 垂头搨翼: \"chuí tóu tà yì\",\r\n 传为笑谈: \"chuán wéi xiào tán\",\r\n 传风扇火: \"chuán fēng shān huǒ\",\r\n 穿红着绿: \"chuān hóng zhuó lǜ\",\r\n 触处机来: \"chù chǔ jī lái\",\r\n 处尊居显: \"chǔ zūn jū xiǎn\",\r\n 处堂燕雀: \"chǔ táng yàn què\",\r\n 处实效功: \"chǔ shí xiào gōng\",\r\n 处高临深: \"chǔ gāo lín shēn\",\r\n 出入无间: \"chū rù wú jiān\",\r\n 出门应辙: \"chū mén yīng zhé\",\r\n 出处语默: \"chū chǔ yǔ mò\",\r\n 出处殊途: \"chū chǔ shū tú\",\r\n 出处进退: \"chū chǔ jìn tuì\",\r\n 愁山闷海: \"chóu shān mèn hǎi\",\r\n 冲冠眦裂: \"chōng guàn zì liè\",\r\n 齿牙为祸: \"chǐ yá wéi huò\",\r\n 尺二冤家: \"chǐ èr yuān jia\",\r\n 尺短寸长: \"chǐ duǎn cùn cháng\",\r\n 尺寸之功: \"chǐ cùn zhī gōng\",\r\n 城北徐公: \"chéng běi xú gōng\",\r\n 成败兴废: \"chéng bài xīng fèi\",\r\n 趁水和泥: \"chèn shuǐ huò ní\",\r\n 称雨道晴: \"chēng yǔ dào qíng\",\r\n 称体载衣: \"chēng tǐ zài yī\",\r\n 称体裁衣: \"chèn tǐ cái yī\",\r\n 称家有无: \"chèn jiā yǒu wú\",\r\n 称德度功: \"chēng dé duó gōng\",\r\n 沉吟章句: \"chén yín zhāng jù\",\r\n 沉吟不决: \"chén yín bù jué\",\r\n 沉疴宿疾: \"chén kē sù jí\",\r\n 扯纤拉烟: \"chě qiàn lā yān\",\r\n 扯顺风旗: \"chě shùn fēng qí\",\r\n 车载船装: \"chē zǎi chuán zhuāng\",\r\n 朝升暮合: \"zhāo shēng mù gě\",\r\n 朝攀暮折: \"zhāo pān mù shé\",\r\n 超今冠古: \"chāo jīn guàn gǔ\",\r\n 倡而不和: \"chàng ér bú hè\",\r\n 畅所欲为: \"chàng suǒ yù wéi\",\r\n 苌弘碧血: \"cháng hóng bì xiě\",\r\n 长幼尊卑: \"zhǎng yòu zūn bēi\",\r\n 长绳系日: \"cháng shéng jì rì\",\r\n 长年三老: \"zhǎng nián sān lǎo\",\r\n 长春不老: \"cháng chūn bù lǎo\",\r\n 长傲饰非: \"zhǎng ào shì fēi\",\r\n 昌亭旅食: \"chāng tíng lǚ shí\",\r\n 禅絮沾泥: \"chán xù zhān ní\",\r\n 差三错四: \"chā sān cuò sì\",\r\n 层台累榭: \"céng tái lěi xiè\",\r\n 层见迭出: \"céng xiàn dié chū\",\r\n 藏踪蹑迹: \"cáng zōng niè jì\",\r\n 苍蝇见血: \"cāng yíng jiàn xiě\",\r\n 餐松啖柏: \"cān sōng dàn bó\",\r\n 骖风驷霞: \"cān fēng sì xiá\",\r\n 参伍错综: \"cēn wǔ cuò zōng\",\r\n 参辰卯酉: \"shēn chén mǎo yǒu\",\r\n 材优干济: \"cái yōu gān jǐ\",\r\n 材薄质衰: \"cái bó zhì shuāi\",\r\n 才大难用: \"cái dà nán yòng\",\r\n 才薄智浅: \"cái bó zhì qiǎn\",\r\n 不足为意: \"bù zú wéi yì\",\r\n 不足为据: \"bù zú wéi jù\",\r\n 不足为法: \"bù zú wéi fǎ\",\r\n 不足齿数: \"bù zú chǐ shǔ\",\r\n 不着疼热: \"bù zhuó téng rè\",\r\n 不知薡蕫: \"bù zhī dǐng dǒng\",\r\n 不越雷池: \"bú yuè léi chí\",\r\n 不相为谋: \"bù xiāng wéi móu\",\r\n 不贪为宝: \"bù tān wéi bǎo\",\r\n 不了而了: \"bù liǎo ér liǎo\",\r\n 不可揆度: \"bù kě kuí duó\",\r\n 不遑启处: \"bù huáng qǐ chǔ\",\r\n 不当不正: \"bù dāng bú zhèng\",\r\n 不差什么: \"bú chà shén me\",\r\n 不差累黍: \"bù chā lěi shǔ\",\r\n 擘两分星: \"bò liǎng fēn xīng\",\r\n 簸土扬沙: \"bǒ tǔ yáng shā\",\r\n 薄物细故: \"bó wù xì gù\",\r\n 薄寒中人: \"bó hán zhòng rén\",\r\n 博文约礼: \"bó wén yuē lǐ\",\r\n 播糠眯目: \"bō kāng mí mù\",\r\n 剥皮抽筋: \"bō pí chōu jīn\",\r\n 剥肤椎髓: \"bō fū chuí suǐ\",\r\n 波属云委: \"bō zhǔ yún wěi\",\r\n 波骇云属: \"bō hài yún zhǔ\",\r\n 兵微将寡: \"bīng wēi jiàng guǎ\",\r\n 兵强将勇: \"bīng qiáng jiàng yǒng\",\r\n 兵多将广: \"bīng duō jiàng guǎng\",\r\n 兵不由将: \"bīng bù yóu jiàng\",\r\n 冰解的破: \"bīng jiě dì pò\",\r\n 彬彬济济: \"bīn bīn jǐ jǐ\",\r\n 摽梅之年: \"biào méi zhī nián\",\r\n 表里为奸: \"biǎo lǐ wéi jiān\",\r\n 飙发电举: \"biāo fā diàn jǔ\",\r\n 变贪厉薄: \"biàn tān lì bó\",\r\n 敝盖不弃: \"bì gài bú qì\",\r\n 秕言谬说: \"bǐ yán miù shuō\",\r\n 比物属事: \"bǐ wù zhǔ shì\",\r\n 被山带河: \"pī shān dài hé\",\r\n 被甲枕戈: \"pī jiǎ zhěn gē\",\r\n 被甲据鞍: \"pī jiǎ jù ān\",\r\n 被褐怀玉: \"pī hè huái yù\",\r\n 被发缨冠: \"pī fà yīng guàn\",\r\n 背曲腰躬: \"bèi qǔ yāo gōng\",\r\n 北窗高卧: \"běi chuāng gāo wò\",\r\n 北辰星拱: \"běi chén xīng gǒng\",\r\n 北鄙之音: \"běi bǐ zhī yīn\",\r\n 卑宫菲食: \"bēi gōng fěi shí\",\r\n 暴衣露冠: \"pù yī lù guàn\",\r\n 暴腮龙门: \"pù sāi lóng mén\",\r\n 暴露文学: \"bào lù wén xué\",\r\n 暴虎冯河: \"bào hǔ píng hé\",\r\n 抱蔓摘瓜: \"bào wàn zhāi guā\",\r\n 抱法处势: \"bào fǎ chǔ shì\",\r\n 褒贬与夺: \"bāo biǎn yǔ duó\",\r\n 帮闲钻懒: \"bāng xián zuān lǎn\",\r\n 拜将封侯: \"bài jiàng fēng hóu\",\r\n 百兽率舞: \"bǎi shòu shuài wǔ\",\r\n 百孔千创: \"bǎi kǒng qiān chuāng\",\r\n 白衣卿相: \"bái yī qīng xiàng\",\r\n 白首为郎: \"bái shǒu wéi láng\",\r\n 白首相知: \"bái shǒu xiāng zhī\",\r\n 把玩无厌: \"bǎ wán wú yàn\",\r\n 拔锅卷席: \"bá guō juǎn xí\",\r\n 拔本塞源: \"bá běn sè yuán\",\r\n 傲不可长: \"ào bù kě zhǎng\",\r\n 熬更守夜: \"áo gēng shǒu yè\",\r\n 安时处顺: \"ān shí chǔ shùn\",\r\n 安身为乐: \"ān shēn wéi lè\",\r\n 安老怀少: \"ān lǎo huái shào\",\r\n 安步当车: \"ān bù dàng chē\",\r\n 爱人好士: \"ài rén hào shì\",\r\n 矮人观场: \"ǎi rén guān chǎng\",\r\n 捱风缉缝: \"ái fēng jī fèng\",\r\n 挨山塞海: \"āi shān sè hǎi\",\r\n 阿家阿翁: \"ā jiā ā wēng\",\r\n 阿党相为: \"ē dǎng xiāng wéi\",\r\n 追亡逐北: \"zhuī wáng zhú běi\",\r\n 竹篮打水: \"zhú lán dá shuǐ\",\r\n 知疼着热: \"zhī téng zháo rè\",\r\n 语不惊人: \"yǔ bù jīng rén\",\r\n 于今为烈: \"yú jīn wéi liè\",\r\n 一日三省: \"yí rì sān xǐng\",\r\n 穴居野处: \"xué jū yě chǔ\",\r\n 五脊六兽: \"wǔ jǐ liù shòu\",\r\n 无声无臭: \"wú shēng wú xiù\",\r\n 谓予不信: \"wèi yú bú xìn\",\r\n 舍身为国: \"shě shēn wéi guó\",\r\n 杀妻求将: \"shā qī qiú jiàng\",\r\n 强作解人: \"qiǎng zuò jiě rén\",\r\n 气冲斗牛: \"qì chōng dǒu niú\",\r\n 临深履薄: \"lín shēn lǚ bó\",\r\n 钧天广乐: \"jūn tiān guǎng yuè\",\r\n 艰难竭蹶: \"jiān nán jié jué\",\r\n 夹七夹八: \"jiā qī jiā bā\",\r\n 混混噩噩: \"hún hún è è\",\r\n 厚古薄今: \"hòu gǔ bó jīn\",\r\n 鬼怕恶人: \"guǐ pà è rén\",\r\n 伽马射线: \"gā mǎ shè xiàn\",\r\n 佛头着粪: \"fó tóu zhuó fèn\",\r\n 奉为至宝: \"fèng wéi zhì bǎo\",\r\n 登坛拜将: \"dēng tán bài jiàng\",\r\n 晨昏定省: \"chén hūn dìng xǐng\",\r\n 察察为明: \"chá chá wéi míng\",\r\n 博闻强识: \"bó wén qiáng zhì\",\r\n 避难就易: \"bì nán jiù yì\",\r\n 了无生机: 'liǎo wú shēng jī',\r\n // 一字不变调的词语,如果词语仅有单个一且一字在结尾的无需添加(需要增补更多)\r\n 有一说一: 'yǒu yī shuō yī',\r\n 独一无二: 'dú yī wú èr',\r\n 说一不二: 'shuō yī bù èr',\r\n 举一反三: 'jǔ yī fǎn sān',\r\n 数一数二: 'shǔ yī shǔ èr',\r\n 杀一儆百: 'shā yī jǐng bǎi',\r\n 丁一卯二: 'dīng yī mǎo èr',\r\n 丁一确二: 'dīng yī què èr',\r\n 不一而止: 'bù yī ér zhǐ',\r\n 无一幸免: 'wú yī xìng miǎn',\r\n // 来源:https://m.gushici.com/cyxy_4e00_4\r\n 表里不一: 'biǎo lǐ bù yī',\r\n 良莠不一: 'liáng yǒu bù yī',\r\n 心口不一: 'xīn kǒu bù yī',\r\n 言行不一: 'yán xíng bù yī',\r\n 政令不一: 'zhèng lìng bù yī',\r\n 参差不一: 'cēn cī bù yī',\r\n 纷纷不一: 'fēn fēn bù yī',\r\n 毁誉不一: 'huǐ yù bù yī',\r\n 不一而三: 'bù yī ér sān',\r\n 百不一遇: 'bǎi bù yī yù',\r\n 言行抱一: 'yán xíng bào yī',\r\n 瑜百瑕一: 'yú bǎi xiá yī',\r\n 背城借一: 'bèi chéng jiè yī',\r\n 凭城借一: 'píng chéng jiè yī',\r\n 劝百讽一: 'quàn bǎi fěng yī',\r\n 群居和一: 'qún jū hé yī',\r\n 百不获一: 'bǎi bù huò yī',\r\n 百不失一: 'bǎi bù shī yī',\r\n 百无失一: 'bǎi wú shī yī',\r\n 万不失一: 'wàn bù shī yī',\r\n 万无失一: 'wàn wú shī yī',\r\n 合而为一: 'hé ér wéi yī',\r\n 合两为一: 'hé liǎng wéi yī',\r\n 合二为一: 'hé èr wéi yī',\r\n 天下为一: 'tiān xià wéi yī',\r\n 相与为一: 'xiāng yǔ wéi yī',\r\n 较若画一: 'jiào ruò huà yī',\r\n 较如画一: 'jiào rú huà yī',\r\n 斠若画一: 'jiào ruò huà yī',\r\n 言行若一: 'yán xíng ruò yī',\r\n 始终若一: 'shǐ zhōng ruò yī',\r\n 终始若一: 'zhōng shǐ ruò yī',\r\n 惟精惟一: 'wéi jīng wéi yī',\r\n 众多非一: 'zhòng duō fēi yī',\r\n 不能赞一: 'bù néng zàn yī',\r\n 问一答十: 'wèn yī dá shí',\r\n 一不扭众: 'yī bù niǔ zhòng',\r\n 一以贯之: 'yī yǐ guàn zhī',\r\n 一以当百: 'yī yǐ dāng bǎi',\r\n 百不当一: 'bǎi bù dāng yī',\r\n 十不当一: 'shí bù dāng yī',\r\n 以一警百: 'yǐ yī jǐng bǎi',\r\n 以一奉百: 'yǐ yī fèng bǎi',\r\n 以一持万: 'yǐ yī chí wàn',\r\n 以一知万: 'yǐ yī zhī wàn',\r\n 百里挑一: 'bǎi lǐ tiāo yī',\r\n 整齐划一: 'zhěng qí huà yī',\r\n 一来二去: 'yī lái èr qù',\r\n 一路公交: 'yī lù gōng jiāo',\r\n 一路汽车: 'yī lù qì chē',\r\n 一路巴士: 'yī lù bā shì',\r\n 朝朝朝落: 'zhāo cháo zhāo luò',\r\n 曲意逢迎: 'qū yì féng yíng',\r\n 一行不行: 'yì háng bù xíng',\r\n 行行不行: 'háng háng bù xíng'\r\n};\r\nconst Pattern4 = Object.keys(DICT4).map((key) => ({\r\n zh: key,\r\n pinyin: DICT4[key],\r\n probability: 2e-8 /* Probability.DICT */,\r\n length: 4,\r\n priority: Priority.Normal,\r\n dict: Symbol('dict4'),\r\n}));\n\nexport { Pattern4, DICT4 as default };\n","import { Priority } from '../common/constant.mjs';\n\nconst DICT5 = {\r\n 巴尔干半岛: 'bā ěr gàn bàn dǎo',\r\n 巴尔喀什湖: 'bā ěr kā shí hú',\r\n 不幸而言中: 'bú xìng ér yán zhòng',\r\n 布尔什维克: 'bù ěr shí wéi kè',\r\n 何乐而不为: 'hé lè ér bù wéi',\r\n 苛政猛于虎: 'kē zhèng měng yú hǔ',\r\n 蒙得维的亚: 'méng dé wéi dì yà',\r\n 民以食为天: 'mín yǐ shí wéi tiān',\r\n 事后诸葛亮: 'shì hòu zhū gě liàng',\r\n 物以稀为贵: 'wù yǐ xī wéi guì',\r\n 先下手为强: 'xiān xià shǒu wéi qiáng',\r\n 行行出状元: 'háng háng chū zhuàng yuan',\r\n 亚得里亚海: 'yà dé lǐ yà hǎi',\r\n 眼不见为净: 'yǎn bú jiàn wéi jìng',\r\n 竹筒倒豆子: 'zhú tǒng dào dòu zi',\r\n};\r\nconst Pattern5 = Object.keys(DICT5).map((key) => ({\r\n zh: key,\r\n pinyin: DICT5[key],\r\n probability: 2e-8 /* Probability.DICT */,\r\n length: 5,\r\n priority: Priority.Normal,\r\n dict: Symbol('dict5'),\r\n}));\n\nexport { Pattern5, DICT5 as default };\n","import { PatternNumberDict } from './special.mjs';\nimport { Pattern2 } from './dict2.mjs';\nimport { Pattern3 } from './dict3.mjs';\nimport { Pattern4 } from './dict4.mjs';\nimport { Pattern5 } from './dict5.mjs';\nimport { PatternSurname } from './surname.mjs';\n\nconst PatternsNormal = [\r\n ...Pattern5,\r\n ...Pattern4,\r\n ...Pattern3,\r\n ...Pattern2,\r\n ...PatternNumberDict,\r\n ...PatternSurname,\r\n];\n\nexport { PatternsNormal };\n","import { Priority } from '../common/constant.mjs';\nimport { stringLength } from '../common/utils.mjs';\n\nconst InitialList = [\r\n \"zh\",\r\n \"ch\",\r\n \"sh\",\r\n \"z\",\r\n \"c\",\r\n \"s\",\r\n \"b\",\r\n \"p\",\r\n \"m\",\r\n \"f\",\r\n \"d\",\r\n \"t\",\r\n \"n\",\r\n \"l\",\r\n \"g\",\r\n \"k\",\r\n \"h\",\r\n \"j\",\r\n \"q\",\r\n \"x\",\r\n \"r\",\r\n \"y\",\r\n \"w\",\r\n \"\",\r\n];\r\nconst SpecialInitialList = [\"j\", \"q\", \"x\"];\r\nconst SpecialFinalList = [\r\n \"uān\",\r\n \"uán\",\r\n \"uǎn\",\r\n \"uàn\",\r\n \"uan\",\r\n \"uē\",\r\n \"ué\",\r\n \"uě\",\r\n \"uè\",\r\n \"ue\",\r\n \"ūn\",\r\n \"ún\",\r\n \"ǔn\",\r\n \"ùn\",\r\n \"un\",\r\n \"ū\",\r\n \"ú\",\r\n \"ǔ\",\r\n \"ù\",\r\n \"u\",\r\n];\r\nconst SpecialFinalMap = {\r\n uān: \"üān\",\r\n uán: \"üán\",\r\n uǎn: \"üǎn\",\r\n uàn: \"üàn\",\r\n uan: \"üan\",\r\n uē: \"üē\",\r\n ué: \"üé\",\r\n uě: \"üě\",\r\n uè: \"üè\",\r\n ue: \"üe\",\r\n ūn: \"ǖn\",\r\n ún: \"ǘn\",\r\n ǔn: \"ǚn\",\r\n ùn: \"ǜn\",\r\n un: \"ün\",\r\n ū: \"ǖ\",\r\n ú: \"ǘ\",\r\n ǔ: \"ǚ\",\r\n ù: \"ǜ\",\r\n u: \"ü\",\r\n};\r\nconst doubleFinalList = [\r\n \"ia\",\r\n \"ian\",\r\n \"iang\",\r\n \"iao\",\r\n \"ie\",\r\n \"iu\",\r\n \"iong\",\r\n \"ua\",\r\n \"uai\",\r\n \"uan\",\r\n \"uang\",\r\n \"ue\",\r\n \"ui\",\r\n \"uo\",\r\n \"üan\",\r\n \"üe\",\r\n \"van\",\r\n \"ve\",\r\n];\r\n/**\r\n * @description: 数量词 + 特殊词 音调处理\r\n */\r\nconst Numbers = {\r\n 一: \"yì\",\r\n 二: \"èr\",\r\n 三: \"sān\",\r\n 四: \"sì\",\r\n 五: \"wǔ\",\r\n 六: \"liù\",\r\n 七: \"qī\",\r\n 八: \"bā\",\r\n 九: \"jiǔ\",\r\n 十: \"shí\",\r\n 百: \"bǎi\",\r\n 千: \"qiān\",\r\n 万: \"wàn\",\r\n 亿: \"yì\",\r\n 单: \"dān\",\r\n 两: \"liǎng\",\r\n 双: \"shuāng\",\r\n 多: \"duō\",\r\n 几: \"jǐ\",\r\n 十一: \"shí yī\",\r\n 零一: \"líng yī\",\r\n 第一: \"dì yī\",\r\n 一十: \"yī shí\",\r\n 一十一: \"yī shí yī\",\r\n};\r\nconst NumberWordMap = {\r\n 重: \"chóng\",\r\n 行: \"háng\",\r\n 斗: \"dǒu\",\r\n 更: \"gēng\",\r\n};\r\n// 与以下词组合时,不变调\r\nfunction genNumberDict() {\r\n const dict = {\r\n 零一: \"líng yī\",\r\n 〇一: \"líng yī\",\r\n 十一: \"shí yī\",\r\n 一十: \"yī shí\",\r\n 第一: \"dì yī\",\r\n 一十一: \"yī shí yī\",\r\n };\r\n for (let number in Numbers) {\r\n for (let key in NumberWordMap) {\r\n const word = `${number}${key}`;\r\n const pinyin = `${Numbers[number]} ${NumberWordMap[key]}`;\r\n dict[word] = pinyin;\r\n }\r\n }\r\n return dict;\r\n}\r\nconst NumberDict = genNumberDict();\r\nconst PatternNumberDict = Object.keys(NumberDict).map((key) => ({\r\n zh: key,\r\n pinyin: NumberDict[key],\r\n probability: 1e-12 /* Probability.Rule */,\r\n length: stringLength(key),\r\n priority: Priority.Normal,\r\n dict: Symbol(\"rule\"),\r\n}));\r\n/**\r\n * @description: 连续变调处理:https://zh.wiktionary.org/wiki/Appendix:%E2%80%9C%E4%B8%80%E2%80%9D%E5%8F%8A%E2%80%9C%E4%B8%8D%E2%80%9D%E7%9A%84%E5%8F%98%E8%B0%83\r\n */\r\nconst toneSandhiMap = {\r\n // 说不说,说一说,叠词之间发音为轻声\r\n 不: {\r\n bú: [4], // \"不\" 后面跟 4 声时,变调为 2 声\r\n },\r\n 一: {\r\n yí: [4],\r\n yì: [1, 2, 3],\r\n },\r\n};\r\nconst toneSandhiIgnoreSuffix = {\r\n 不: [\"的\", \"而\", \"之\", \"后\", \"也\", \"还\", \"地\"],\r\n 一: [\"的\", \"而\", \"之\", \"后\", \"也\", \"还\", \"是\"],\r\n};\r\nconst toneSandhiList = Object.keys(toneSandhiMap);\n\nexport { InitialList, PatternNumberDict, SpecialFinalList, SpecialFinalMap, SpecialInitialList, doubleFinalList, toneSandhiIgnoreSuffix, toneSandhiList, toneSandhiMap };\n","import { Priority } from '../common/constant.mjs';\nimport { stringLength } from '../common/utils.mjs';\n\nconst Surnames = {\r\n 南宫: 'nán gōng',\r\n 第五: 'dì wǔ',\r\n 万俟: 'mò qí',\r\n 司马: 'sī mǎ',\r\n 上官: 'shàng guān',\r\n 欧阳: 'ōu yáng',\r\n 夏侯: 'xià hóu',\r\n 诸葛: 'zhū gě',\r\n 闻人: 'wén rén',\r\n 东方: 'dōng fāng',\r\n 赫连: 'hè lián',\r\n 皇甫: 'huáng fǔ',\r\n 尉迟: 'yù chí',\r\n 公羊: 'gōng yáng',\r\n 澹台: 'tán tái',\r\n 公冶: 'gōng yě',\r\n 宗政: 'zōng zhèng',\r\n 濮阳: 'pú yáng',\r\n 淳于: 'chún yú',\r\n 太叔: 'tài shū',\r\n 申屠: 'shēn tú',\r\n 公孙: 'gōng sūn',\r\n 仲孙: 'zhòng sūn',\r\n 轩辕: 'xuān yuán',\r\n 令狐: 'líng hú',\r\n 钟离: 'zhōng lí',\r\n 宇文: 'yǔ wén',\r\n 长孙: 'zhǎng sūn',\r\n 慕容: 'mù róng',\r\n 鲜于: 'xiān yú',\r\n 闾丘: 'lǘ qiū',\r\n 司徒: 'sī tú',\r\n 司空: 'sī kōng',\r\n 亓官: 'qí guān',\r\n 司寇: 'sī kòu',\r\n 仉督: 'zhǎng dū',\r\n 子车: 'zǐ jū',\r\n 颛孙: 'zhuān sūn',\r\n 端木: 'duān mù',\r\n 巫马: 'wū mǎ',\r\n 公西: 'gōng xī',\r\n 漆雕: 'qī diāo',\r\n 乐正: 'yuè zhèng',\r\n 壤驷: 'rǎng sì',\r\n 公良: 'gōng liáng',\r\n 拓跋: 'tuò bá',\r\n 夹谷: 'jiá gǔ',\r\n 宰父: 'zǎi fǔ',\r\n 榖梁: 'gǔ liáng',\r\n 段干: 'duàn gān',\r\n 百里: 'bǎi lǐ',\r\n 东郭: 'dōng guō',\r\n 南门: 'nán mén',\r\n 呼延: 'hū yán',\r\n 羊舌: 'yáng shé',\r\n 梁丘: 'liáng qiū',\r\n 左丘: 'zuǒ qiū',\r\n 东门: 'dōng mén',\r\n 西门: 'xī mén',\r\n 句龙: 'gōu lóng',\r\n 毌丘: 'guàn qiū',\r\n 赵: 'zhào',\r\n 钱: 'qián',\r\n 孙: 'sūn',\r\n 李: 'lǐ',\r\n 周: 'zhōu',\r\n 吴: 'wú',\r\n 郑: 'zhèng',\r\n 王: 'wáng',\r\n 冯: 'féng',\r\n 陈: 'chén',\r\n 褚: 'chǔ',\r\n 卫: 'wèi',\r\n 蒋: 'jiǎng',\r\n 沈: 'shěn',\r\n 韩: 'hán',\r\n 杨: 'yáng',\r\n 朱: 'zhū',\r\n 秦: 'qín',\r\n 尤: 'yóu',\r\n 许: 'xǔ',\r\n 何: 'hé',\r\n 吕: 'lǚ',\r\n 施: 'shī',\r\n 张: 'zhāng',\r\n 孔: 'kǒng',\r\n 曹: 'cáo',\r\n 严: 'yán',\r\n 华: 'huà',\r\n 金: 'jīn',\r\n 魏: 'wèi',\r\n 陶: 'táo',\r\n 姜: 'jiāng',\r\n 戚: 'qī',\r\n 谢: 'xiè',\r\n 邹: 'zōu',\r\n 喻: 'yù',\r\n 柏: 'bǎi',\r\n 水: 'shuǐ',\r\n 窦: 'dòu',\r\n 章: 'zhāng',\r\n 云: 'yún',\r\n 苏: 'sū',\r\n 潘: 'pān',\r\n 葛: 'gě',\r\n 奚: 'xī',\r\n 范: 'fàn',\r\n 彭: 'péng',\r\n 郎: 'láng',\r\n 鲁: 'lǔ',\r\n 韦: 'wéi',\r\n 昌: 'chāng',\r\n 马: 'mǎ',\r\n 苗: 'miáo',\r\n 凤: 'fèng',\r\n 花: 'huā',\r\n 方: 'fāng',\r\n 俞: 'yú',\r\n 任: 'rén',\r\n 袁: 'yuán',\r\n 柳: 'liǔ',\r\n 酆: 'fēng',\r\n 鲍: 'bào',\r\n 史: 'shǐ',\r\n 唐: 'táng',\r\n 费: 'fèi',\r\n 廉: 'lián',\r\n 岑: 'cén',\r\n 薛: 'xuē',\r\n 雷: 'léi',\r\n 贺: 'hè',\r\n 倪: 'ní',\r\n 汤: 'tāng',\r\n 滕: 'téng',\r\n 殷: 'yīn',\r\n 罗: 'luó',\r\n 毕: 'bì',\r\n 郝: 'hǎo',\r\n 邬: 'wū',\r\n 安: 'ān',\r\n 常: 'cháng',\r\n 乐: 'yuè',\r\n 于: 'yú',\r\n 时: 'shí',\r\n 傅: 'fù',\r\n 皮: 'pí',\r\n 卞: 'biàn',\r\n 齐: 'qí',\r\n 康: 'kāng',\r\n 伍: 'wǔ',\r\n 余: 'yú',\r\n 元: 'yuán',\r\n 卜: 'bǔ',\r\n 顾: 'gù',\r\n 孟: 'mèng',\r\n 平: 'píng',\r\n 黄: 'huáng',\r\n 和: 'hé',\r\n 穆: 'mù',\r\n 萧: 'xiāo',\r\n 尹: 'yǐn',\r\n 姚: 'yáo',\r\n 邵: 'shào',\r\n 湛: 'zhàn',\r\n 汪: 'wāng',\r\n 祁: 'qí',\r\n 毛: 'máo',\r\n 禹: 'yǔ',\r\n 狄: 'dí',\r\n 米: 'mǐ',\r\n 贝: 'bèi',\r\n 明: 'míng',\r\n 臧: 'zāng',\r\n 计: 'jì',\r\n 伏: 'fú',\r\n 成: 'chéng',\r\n 戴: 'dài',\r\n 谈: 'tán',\r\n 宋: 'sòng',\r\n 茅: 'máo',\r\n 庞: 'páng',\r\n 熊: 'xióng',\r\n 纪: 'jǐ',\r\n 舒: 'shū',\r\n 屈: 'qū',\r\n 项: 'xiàng',\r\n 祝: 'zhù',\r\n 董: 'dǒng',\r\n 梁: 'liáng',\r\n 杜: 'dù',\r\n 阮: 'ruǎn',\r\n 蓝: 'lán',\r\n 闵: 'mǐn',\r\n 席: 'xí',\r\n 季: 'jì',\r\n 麻: 'má',\r\n 强: 'qiáng',\r\n 贾: 'jiǎ',\r\n 路: 'lù',\r\n 娄: 'lóu',\r\n 危: 'wēi',\r\n 江: 'jiāng',\r\n 童: 'tóng',\r\n 颜: 'yán',\r\n 郭: 'guō',\r\n 梅: 'méi',\r\n 盛: 'shèng',\r\n 林: 'lín',\r\n 刁: 'diāo',\r\n 钟: 'zhōng',\r\n 徐: 'xú',\r\n 邱: 'qiū',\r\n 骆: 'luò',\r\n 高: 'gāo',\r\n 夏: 'xià',\r\n 蔡: 'cài',\r\n 田: 'tián',\r\n 樊: 'fán',\r\n 胡: 'hú',\r\n 凌: 'líng',\r\n 霍: 'huò',\r\n 虞: 'yú',\r\n 万: 'wàn',\r\n 支: 'zhī',\r\n 柯: 'kē',\r\n 昝: 'zǎn',\r\n 管: 'guǎn',\r\n 卢: 'lú',\r\n 莫: 'mò',\r\n 经: 'jīng',\r\n 房: 'fáng',\r\n 裘: 'qiú',\r\n 缪: 'miào',\r\n 干: 'gān',\r\n 解: 'xiè',\r\n 应: 'yīng',\r\n 宗: 'zōng',\r\n 丁: 'dīng',\r\n 宣: 'xuān',\r\n 贲: 'bēn',\r\n 邓: 'dèng',\r\n 郁: 'yù',\r\n 单: 'shàn',\r\n 杭: 'háng',\r\n 洪: 'hóng',\r\n 包: 'bāo',\r\n 诸: 'zhū',\r\n 左: 'zuǒ',\r\n 石: 'shí',\r\n 崔: 'cuī',\r\n 吉: 'jí',\r\n 钮: 'niǔ',\r\n 龚: 'gōng',\r\n 程: 'chéng',\r\n 嵇: 'jī',\r\n 邢: 'xíng',\r\n 滑: 'huá',\r\n 裴: 'péi',\r\n 陆: 'lù',\r\n 荣: 'róng',\r\n 翁: 'wēng',\r\n 荀: 'xún',\r\n 羊: 'yáng',\r\n 於: 'yū',\r\n 惠: 'huì',\r\n 甄: 'zhēn',\r\n 曲: 'qū',\r\n 家: 'jiā',\r\n 封: 'fēng',\r\n 芮: 'ruì',\r\n 羿: 'yì',\r\n 储: 'chǔ',\r\n 靳: 'jìn',\r\n 汲: 'jí',\r\n 邴: 'bǐng',\r\n 糜: 'mí',\r\n 松: 'sōng',\r\n 井: 'jǐng',\r\n 段: 'duàn',\r\n 富: 'fù',\r\n 巫: 'wū',\r\n 乌: 'wū',\r\n 焦: 'jiāo',\r\n 巴: 'bā',\r\n 弓: 'gōng',\r\n 牧: 'mù',\r\n 隗: 'wěi',\r\n 山: 'shān',\r\n 谷: 'gǔ',\r\n 车: 'chē',\r\n 侯: 'hóu',\r\n 宓: 'mì',\r\n 蓬: 'péng',\r\n 全: 'quán',\r\n 郗: 'xī',\r\n 班: 'bān',\r\n 仰: 'yǎng',\r\n 秋: 'qiū',\r\n 仲: 'zhòng',\r\n 伊: 'yī',\r\n 宫: 'gōng',\r\n 宁: 'nìng',\r\n 仇: 'qiú',\r\n 栾: 'luán',\r\n 暴: 'bào',\r\n 甘: 'gān',\r\n 钭: 'tǒu',\r\n 厉: 'lì',\r\n 戎: 'róng',\r\n 祖: 'zǔ',\r\n 武: 'wǔ',\r\n 符: 'fú',\r\n 刘: 'liú',\r\n 景: 'jǐng',\r\n 詹: 'zhān',\r\n 束: 'shù',\r\n 龙: 'lóng',\r\n 叶: 'yè',\r\n 幸: 'xìng',\r\n 司: 'sī',\r\n 韶: 'sháo',\r\n 郜: 'gào',\r\n 黎: 'lí',\r\n 蓟: 'jì',\r\n 薄: 'bó',\r\n 印: 'yìn',\r\n 宿: 'sù',\r\n 白: 'bái',\r\n 怀: 'huái',\r\n 蒲: 'pú',\r\n 邰: 'tái',\r\n 从: 'cóng',\r\n 鄂: 'è',\r\n 索: 'suǒ',\r\n 咸: 'xián',\r\n 籍: 'jí',\r\n 赖: 'lài',\r\n 卓: 'zhuó',\r\n 蔺: 'lìn',\r\n 屠: 'tú',\r\n 蒙: 'méng',\r\n 池: 'chí',\r\n 乔: 'qiáo',\r\n 阴: 'yīn',\r\n 鬱: 'yù',\r\n 胥: 'xū',\r\n 能: 'nài',\r\n 苍: 'cāng',\r\n 双: 'shuāng',\r\n 闻: 'wén',\r\n 莘: 'shēn',\r\n 党: 'dǎng',\r\n 翟: 'zhái',\r\n 谭: 'tán',\r\n 贡: 'gòng',\r\n 劳: 'láo',\r\n 逄: 'páng',\r\n 姬: 'jī',\r\n 申: 'shēn',\r\n 扶: 'fú',\r\n 堵: 'dǔ',\r\n 冉: 'rǎn',\r\n 宰: 'zǎi',\r\n 郦: 'lì',\r\n 雍: 'yōng',\r\n 郤: 'xì',\r\n 璩: 'qú',\r\n 桑: 'sāng',\r\n 桂: 'guì',\r\n 濮: 'pú',\r\n 牛: 'niú',\r\n 寿: 'shòu',\r\n 通: 'tōng',\r\n 边: 'biān',\r\n 扈: 'hù',\r\n 燕: 'yān',\r\n 冀: 'jì',\r\n 郏: 'jiá',\r\n 浦: 'pǔ',\r\n 尚: 'shàng',\r\n 农: 'nóng',\r\n 温: 'wēn',\r\n 别: 'bié',\r\n 庄: 'zhuāng',\r\n 晏: 'yàn',\r\n 柴: 'chái',\r\n 瞿: 'qú',\r\n 阎: 'yán',\r\n 充: 'chōng',\r\n 慕: 'mù',\r\n 连: 'lián',\r\n 茹: 'rú',\r\n 习: 'xí',\r\n 宦: 'huàn',\r\n 艾: 'ài',\r\n 鱼: 'yú',\r\n 容: 'róng',\r\n 向: 'xiàng',\r\n 古: 'gǔ',\r\n 易: 'yì',\r\n 慎: 'shèn',\r\n 戈: 'gē',\r\n 廖: 'liào',\r\n 庾: 'yǔ',\r\n 终: 'zhōng',\r\n 暨: 'jì',\r\n 居: 'jū',\r\n 衡: 'héng',\r\n 步: 'bù',\r\n 都: 'dū',\r\n 耿: 'gěng',\r\n 满: 'mǎn',\r\n 弘: 'hóng',\r\n 匡: 'kuāng',\r\n 国: 'guó',\r\n 文: 'wén',\r\n 寇: 'kòu',\r\n 广: 'guǎng',\r\n 禄: 'lù',\r\n 阙: 'quē',\r\n 东: 'dōng',\r\n 欧: 'ōu',\r\n 殳: 'shū',\r\n 沃: 'wò',\r\n 利: 'lì',\r\n 蔚: 'wèi',\r\n 越: 'yuè',\r\n 夔: 'kuí',\r\n 隆: 'lóng',\r\n 师: 'shī',\r\n 巩: 'gǒng',\r\n 厍: 'shè',\r\n 聂: 'niè',\r\n 晁: 'cháo',\r\n 勾: 'gōu',\r\n 敖: 'áo',\r\n 融: 'róng',\r\n 冷: 'lěng',\r\n 訾: 'zī',\r\n 辛: 'xīn',\r\n 阚: 'kàn',\r\n 那: 'nā',\r\n 简: 'jiǎn',\r\n 饶: 'ráo',\r\n 空: 'kōng',\r\n 曾: 'zēng',\r\n 母: 'mǔ',\r\n 沙: 'shā',\r\n 乜: 'niè',\r\n 养: 'yǎng',\r\n 鞠: 'jū',\r\n 须: 'xū',\r\n 丰: 'fēng',\r\n 巢: 'cháo',\r\n 关: 'guān',\r\n 蒯: 'kuǎi',\r\n 相: 'xiàng',\r\n 查: 'zhā',\r\n 后: 'hòu',\r\n 荆: 'jīng',\r\n 红: 'hóng',\r\n 游: 'yóu',\r\n 竺: 'zhú',\r\n 权: 'quán',\r\n 逯: 'lù',\r\n 盖: 'gě',\r\n 益: 'yì',\r\n 桓: 'huán',\r\n 公: 'gōng',\r\n 牟: 'móu',\r\n 哈: 'hǎ',\r\n 言: 'yán',\r\n 福: 'fú',\r\n 肖: 'xiāo',\r\n 区: 'ōu',\r\n 覃: 'qín',\r\n 朴: 'piáo',\r\n 繁: 'pó',\r\n 员: 'yùn',\r\n 句: 'gōu',\r\n 要: 'yāo',\r\n 过: 'guō',\r\n 钻: 'zuān',\r\n 谌: 'chén',\r\n 折: 'shé',\r\n 召: 'shào',\r\n 郄: 'qiè',\r\n 撒: 'sǎ',\r\n 甯: 'nìng',\r\n 六: 'lù',\r\n 啜: 'chuài',\r\n 行: 'xíng',\r\n};\r\nconst PatternSurname = Object.keys(Surnames).map((key) => ({\r\n zh: key,\r\n pinyin: Surnames[key],\r\n probability: 1 /* Probability.Surname */ + stringLength(key),\r\n length: stringLength(key),\r\n priority: Priority.Surname,\r\n dict: Symbol('surname'),\r\n}));\n\nexport { PatternSurname, Surnames as default };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tif (!(moduleId in __webpack_modules__)) {\n\t\tdelete __webpack_module_cache__[moduleId];\n\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter/value functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tif(Array.isArray(definition)) {\n\t\tvar i = 0;\n\t\twhile(i < definition.length) {\n\t\t\tvar key = definition[i++];\n\t\t\tvar binding = definition[i++];\n\t\t\tif(!__webpack_require__.o(exports, key)) {\n\t\t\t\tif(binding === 0) {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, value: definition[i++] });\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: binding });\n\t\t\t\t}\n\t\t\t} else if(binding === 0) { i++; }\n\t\t}\n\t} else {\n\t\tfor(var key in definition) {\n\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t\t}\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".dev.js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"tinode-webapp:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// set .name for anonymous default exports per ES spec\n__webpack_require__.dn = function(x) {\n\t(Object.getOwnPropertyDescriptor(x, \"name\") || {}).writable || Object.defineProperty(x, \"name\", { value: \"default\", configurable: true });\n};","__webpack_require__.p = \"/umd/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"index\": 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunktinode_webapp\"] = self[\"webpackChunktinode_webapp\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// Put all packages together.\n// Used to generate umd/index.prod.js\n\nimport React from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport { IntlProvider } from 'react-intl';\n\nimport TinodeWeb from './views/tinode-web.jsx';\nimport HashNavigation from './lib/navigation.js';\n\n// Insert google analytics script and tag if configured.\nif (typeof FIREBASE_INIT != 'undefined' && FIREBASE_INIT && FIREBASE_INIT.measurementId) {\n const head = document.getElementsByTagName('head')[0];\n let script = document.createElement('script');\n script.src = 'https://www.googletagmanager.com/gtag/js?id=' + FIREBASE_INIT.measurementId;\n script.async = true;\n head.prepend(script);\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', FIREBASE_INIT.measurementId);\n}\n\n// Allow loading translation strings for just one language.\nconst messageLoader = {\n 'ar': _ => import('./i18n.min/ar.json'),\n 'de': _ => import('./i18n.min/de.json'),\n 'en': _ => import('./i18n.min/en.json'),\n 'es': _ => import('./i18n.min/es.json'),\n 'fr': _ => import('./i18n.min/fr.json'),\n 'it': _ => import('./i18n.min/it.json'),\n 'ko': _ => import('./i18n.min/ko.json'),\n 'ro': _ => import('./i18n.min/ro.json'),\n 'ru': _ => import('./i18n.min/ru.json'),\n 'th': _ => import('./i18n.min/th.json'),\n 'uk': _ => import('./i18n.min/uk.json'),\n 'vi': _ => import('./i18n.min/vi.json'),\n 'zh': _ => import('./i18n.min/zh.json'),\n 'zh-TW': _ => import('./i18n.min/zh-TW.json')\n};\n\n// List of languages that are written right-to-left.\nconst rtl = ['ar', 'fa', 'he', 'ur'];\n\n// Detect human language to use in the UI:\n// Check parameters from URL hash #?hl=ru, then browser, then use 'en' as a fallback.\nconst { params } = HashNavigation.parseUrlHash(window.location.hash);\nconst language = (params && params.hl) ||\n (navigator.languages && navigator.languages[0]) ||\n navigator.language ||\n navigator.userLanguage ||\n 'en';\n\n// Make sure names like 'en_GB' and 'en-GB' consistently use '-'.\nconst normalized = language.replace('_', '-');\n// Get the base language 'en' from a more specific 'en-US' as a partial fallback.\nconst baseLanguage = normalized.split('-')[0].toLowerCase();\n\n// Try the full locale first, then the locale without the region code, fallback to 'en'.\nconst htmlLang = messageLoader[normalized] ? language : messageLoader[baseLanguage] ? baseLanguage : 'en';\n\nconst html = document.getElementsByTagName('html')[0];\n// Set lang attribute of the HTML element: \nhtml.setAttribute('lang', htmlLang);\nif (rtl.includes(baseLanguage)) {\n // Set right-to-left dir attribute of the HTML element: \n html.setAttribute('dir', 'rtl');\n}\n// Render the app.\nconst root = createRoot(document.getElementById('mountPoint'));\nmessageLoader[htmlLang]().then(messages =>\n root.render(\n React.createElement(IntlProvider,\n { locale: language, messages: messages, textComponent: React.Fragment },\n React.createElement(TinodeWeb, null)\n )\n));\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/umd/src_views_messages-view_jsx.dev.js b/umd/src_views_messages-view_jsx.dev.js
index eff9ea6b..2e6e38d0 100644
--- a/umd/src_views_messages-view_jsx.dev.js
+++ b/umd/src_views_messages-view_jsx.dev.js
@@ -13,45 +13,35 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-intl */ "react-intl");
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tinode-sdk */ "tinode-sdk");
-/* harmony import */ var tinode_sdk__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(tinode_sdk__WEBPACK_IMPORTED_MODULE_2__);
-/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
-/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react/jsx-dev-runtime */ "./node_modules/react/jsx-dev-runtime.js");
-
-
+/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
+/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react/jsx-dev-runtime */ "./node_modules/react/jsx-dev-runtime.js");
+function Icon({
+ children
+}) {
+ return (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxDEV)("i", {
+ className: "material-icons",
+ "aria-hidden": "true",
+ children: children
+ }, void 0, false);
+}
class LogoView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
render() {
- const version = _config_js__WEBPACK_IMPORTED_MODULE_3__.APP_NAME + ' (' + tinode_sdk__WEBPACK_IMPORTED_MODULE_2__.Tinode.getLibrary() + ')';
- return (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxDEV)("div", {
+ return (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxDEV)("div", {
id: "dummy-view",
- children: (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxDEV)("div", {
- children: [(0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxDEV)("a", {
- href: "https://github.com/tinode/chat/",
- children: [(0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxDEV)("img", {
- id: "logo",
- alt: "logo",
- src: "img/logo.svg"
- }, void 0, false), (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxDEV)("h2", {
- children: "Tinode Web"
- }, void 0, false)]
- }, void 0, true), (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxDEV)("p", {
- children: [(0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxDEV)(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
- id: "label_client",
- defaultMessage: "Client:",
- description: "Label for a client version"
- }, void 0, false), " ", version]
- }, void 0, true), (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxDEV)("p", {
- children: [(0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_4__.jsxDEV)(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
- id: "label_server",
- defaultMessage: "Server:",
- description: "Label for a server version"
- }, void 0, false), " ", this.props.serverVersion, " (", this.props.serverAddress, ")"]
- }, void 0, true)]
+ children: (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxDEV)("div", {
+ children: [(0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxDEV)("span", {
+ id: "dummy-view-icon",
+ children: (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxDEV)(Icon, {
+ children: "forum"
+ }, void 0, false)
+ }, void 0, false), (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxDEV)("h2", {
+ children: _config_js__WEBPACK_IMPORTED_MODULE_1__.BASE_APP_NAME
+ }, void 0, false), (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_2__.jsxDEV)("p", {
+ children: "选择一个会话开始聊天"
+ }, void 0, false)]
}, void 0, true)
}, void 0, false);
}
@@ -1841,10 +1831,7 @@ class MessagesView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Compone
}, void 0, false);
let component;
if (!this.state.topic) {
- component = (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_22__.jsxDEV)(_logo_view_jsx__WEBPACK_IMPORTED_MODULE_10__["default"], {
- serverVersion: this.props.serverVersion,
- serverAddress: this.props.serverAddress
- }, void 0, false);
+ component = (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_22__.jsxDEV)(_logo_view_jsx__WEBPACK_IMPORTED_MODULE_10__["default"], {}, void 0, false);
} else {
let component2;
if (this.state.imagePreview) {
diff --git a/umd/src_views_messages-view_jsx.dev.js.map b/umd/src_views_messages-view_jsx.dev.js.map
index 6ba367d2..b3b334dc 100644
--- a/umd/src_views_messages-view_jsx.dev.js.map
+++ b/umd/src_views_messages-view_jsx.dev.js.map
@@ -1 +1 @@
-{"version":3,"file":"src_views_messages-view_jsx.dev.js","mappings":"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","sources":["webpack://tinode-webapp/./src/views/logo-view.jsx","webpack://tinode-webapp/./src/views/messages-view.jsx","webpack://tinode-webapp/./src/widgets/attachment.jsx","webpack://tinode-webapp/./src/widgets/chat-message.jsx","webpack://tinode-webapp/./src/widgets/forward-bundle.jsx","webpack://tinode-webapp/./src/widgets/group-subs.jsx","webpack://tinode-webapp/./src/widgets/invitation.jsx","webpack://tinode-webapp/./src/widgets/meta-message.jsx","webpack://tinode-webapp/./src/widgets/pinned-messages.jsx","webpack://tinode-webapp/./src/widgets/received-marker.jsx","webpack://tinode-webapp/./src/widgets/send-message.jsx"],"sourcesContent":["/* This is just a static page to display when no conversation is selected. */\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { APP_NAME } from '../config.js';\n\nexport default class LogoView extends React.PureComponent {\n render() {\n const version = APP_NAME + ' (' + Tinode.getLibrary() + ')';\n return (\n \n
\n
\n \n Tinode Web \n \n
{version}
\n
{this.props.serverVersion} ({this.props.serverAddress})
\n
\n
\n );\n }\n};\n","// Panel with a chat.\n\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode, TheCard } from 'tinode-sdk';\n\nconst CallPanel = React.lazy(_ => import('../widgets/call-panel.jsx'));\nimport ChatMessage from '../widgets/chat-message.jsx';\nimport ContactBadges from '../widgets/contact-badges.jsx';\nconst DocPreview = React.lazy(_ => import('../widgets/doc-preview.jsx'));\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupSubs from '../widgets/group-subs.jsx';\nconst ImagePreview = React.lazy(_ => import('../widgets/image-preview.jsx'));\nimport Invitation from '../widgets/invitation.jsx';\nimport LetterTile from '../widgets/letter-tile.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport LogoView from './logo-view.jsx';\nimport MetaMessage from '../widgets/meta-message.jsx';\nimport PinnedMessages from '../widgets/pinned-messages.jsx';\nimport { RiskConfirmDialog } from './security-support-view.jsx';\nimport SendMessage from '../widgets/send-message.jsx';\nconst TheCardPreview = React.lazy(_ => import('../widgets/the-card-preview.jsx'));\nconst VideoPreview = React.lazy(_ => import('../widgets/video-preview.jsx'));\n\nimport { DEFAULT_P2P_ACCESS_MODE, EDIT_PREVIEW_LENGTH, IMAGE_PREVIEW_DIM, IMMEDIATE_P2P_SUBSCRIPTION,\n DRAFTY_FR_MIME_TYPE_LEGACY, KEYPRESS_DELAY, MESSAGES_PAGE, MAX_EXTERN_ATTACHMENT_SIZE, MAX_IMAGE_DIM,\n MAX_INBAND_ATTACHMENT_SIZE, READ_DELAY, QUOTED_REPLY_LENGTH, VIDEO_PREVIEW_DIM } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\nimport { blobToBase64, fileToBase64, imageScaled, importVCard, makeImageUrl } from '../lib/blob-helpers.js';\nimport { topicDisplayName } from '../lib/utils.js';\nimport { checkURL, confirmRiskChallenge, createChatUploader, favoriteMessages, getBootstrap, getConversationContext,\n getFavorites, getGroupJoinRequests, getGroupMembers, getLatestGroupAnnouncement, getTopicDraft, recallMessage,\n updateTopicDraft } from '../lib/im-api.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { bytesToHumanSize, relativeDateFormat, shortDateFormat } from '../lib/strformat.js';\n\n// Run timer with this frequency (ms) for checking notification queue.\nconst NOTIFICATION_EXEC_INTERVAL = 300;\n// Scroll distance before [go to latest message] button is shown.\nconst SHOW_GO_TO_LAST_DIST = 100;\n// Sctoll distance from the top when fetching the page of earlier messages is triggered.\nconst FETCH_PAGE_TRIGGER = 40;\n\nconst messages = defineMessages({\n // 已存在于 src/i18n/*.json(zh: \"消息已删除\"),这里只是注册引用,不是新增待翻译串\n message_deleted: {\n id: 'message_deleted',\n defaultMessage: 'message deleted',\n description: 'Placeholder shown in the timeline where a message was recalled or deleted',\n },\n online_now: {\n id: 'online_now',\n defaultMessage: 'online now',\n description: 'Indicator that the user or topic is currently online',\n },\n last_seen: {\n id: 'last_seen_timestamp',\n defaultMessage: 'Last seen: {timestamp}',\n description: 'Label for the timestamp of when the user or topic was last online'\n },\n not_found: {\n id: 'title_not_found',\n defaultMessage: 'Not found',\n description: 'Title shown when topic is not found'\n },\n channel: {\n id: 'channel',\n defaultMessage: 'channel',\n description: 'Subtitle shown for channels in MessagesView instead of last seen'\n },\n file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n invalid_content: {\n id: 'invalid_content',\n defaultMessage: 'invalid content',\n description: 'Shown when the message is unreadable'\n },\n editing_message: {\n id: 'editing_message',\n defaultMessage: 'Editing',\n description: 'Title over message editing preview'\n },\n drag_file: {\n id: 'drag_file',\n defaultMessage: 'Drag file here',\n description: 'Prompt on the file drag-n-drop overlay banner'\n },\n self_topic_name: {\n id: 'self_topic_name',\n defaultMessage: 'Saved messages',\n description: 'Name of self topic for UI'\n },\n subscriber_count: {\n id: 'subscriber_count',\n defaultMessage: '{count, plural, ' +\n 'one {{count, number} subscriber} ' +\n 'two {{count, number} subscribers} ' +\n 'three {{count, number} subscribers} ' +\n 'few {{count, number} subscribers} ' +\n 'many {{count, number} subscribers} ' +\n 'other {{count, number} subscribers}}',\n description: 'Count of channel subscribers'\n },\n member_count: {\n id: 'member_count',\n defaultMessage: '{count, plural, ' +\n 'one {{count, number} member} ' +\n 'two {{count, number} members} ' +\n 'three {{count, number} members} ' +\n 'few {{count, number} members} ' +\n 'many {{count, number} members} ' +\n 'other {{count, number} members}}',\n description: 'Count of group topic members'\n },\n cannot_parse_vcard: {\n id: 'cannot_parse_vcard',\n defaultMessage: 'Cannot parse vCard file.',\n description: 'Error message when vCard file cannot be parsed'\n }\n});\n\n// Checks if the access permissions are granted but not yet accepted.\nfunction isUnconfirmed(acs) {\n if (acs) {\n const ex = acs.getExcessive() || '';\n return acs.isJoiner('given') && (ex.includes('R') || ex.includes('W'));\n }\n return false;\n}\n\nfunction isPeerRestricted(acs) {\n if (acs) {\n const ms = acs.getMissing() || '';\n return acs.isJoiner('want') && (ms.includes('R') || ms.includes('W'));\n }\n return false;\n}\n\n// Synthetic \"所有人\" entry in the @提醒 picker (mentionSearch below) -- not a real user_id, just a\n// marker mentionSelected/sendMessage recognize to set head.mention_all instead of resolving a\n// Drafty MN entity to it. Never sent to the server as an actual id.\nconst MENTION_ALL_UID = '__mention_all__';\n\nfunction shouldPresentCallPanel(callState) {\n // Show call panel if either:\n // - call is outgoing (and the client is waiting for the other side to pick up) or,\n // - call is already in progress.\n return callState == CALL_STATE_OUTGOING_INITATED || callState == CALL_STATE_IN_PROGRESS;\n}\n\nclass MessagesView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = MessagesView.getDerivedStateFromProps(props, {});\n // Not topic-specific, fetched once in componentDidMount -- unlike the rest of state this\n // is intentionally not touched by getDerivedStateFromProps on topic change.\n this.state.messagePolicy = null;\n this.state.toast = null;\n this.state.riskDialog = null;\n this.mentionedUsers = [];\n this.mentionAllPending = false;\n\n this.componentSetup = this.componentSetup.bind(this);\n this.leave = this.leave.bind(this);\n this.sendMessage = this.sendMessage.bind(this);\n this.handleRiskConfirm = this.handleRiskConfirm.bind(this);\n this.handleRiskCancel = this.handleRiskCancel.bind(this);\n this.retrySend = this.retrySend.bind(this);\n this.sendImageAttachment = this.sendImageAttachment.bind(this);\n this.sendVideoAttachment = this.sendVideoAttachment.bind(this);\n this.sendFileAttachment = this.sendFileAttachment.bind(this);\n this.sendAudioAttachment = this.sendAudioAttachment.bind(this);\n this.sendTheCardAttachment = this.sendTheCardAttachment.bind(this);\n this.sendKeyPress = this.sendKeyPress.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.handleScrollReference = this.handleScrollReference.bind(this);\n this.mountDnDEvents = this.mountDnDEvents.bind(this);\n this.handleScrollEvent = this.handleScrollEvent.bind(this);\n this.handleDescChange = this.handleDescChange.bind(this);\n this.handleSubsUpdated = this.handleSubsUpdated.bind(this);\n this.handleMessageUpdate = this.handleMessageUpdate.bind(this);\n this.handleAuxUpdate = this.handleAuxUpdate.bind(this);\n this.handleAllMessagesReceived = this.handleAllMessagesReceived.bind(this);\n this.handleInfoReceipt = this.handleInfoReceipt.bind(this);\n this.handleExpandMedia = this.handleExpandMedia.bind(this);\n this.handleClosePreview = this.handleClosePreview.bind(this);\n this.handleCallPanelToggle = this.handleCallPanelToggle.bind(this);\n this.handleFormResponse = this.handleFormResponse.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleShowMessageContextMenu = this.handleShowMessageContextMenu.bind(this);\n this.handleNewChatAcceptance = this.handleNewChatAcceptance.bind(this);\n this.handleEnablePeer = this.handleEnablePeer.bind(this);\n this.loadRelationshipContext = this.loadRelationshipContext.bind(this);\n this.loadGroupContext = this.loadGroupContext.bind(this);\n this.loadDraft = this.loadDraft.bind(this);\n this.handleComposerChange = this.handleComposerChange.bind(this);\n this.clearDraft = this.clearDraft.bind(this);\n this.mentionSearch = this.mentionSearch.bind(this);\n this.mentionSelected = this.mentionSelected.bind(this);\n this.handleShowAnnouncement = this.handleShowAnnouncement.bind(this);\n this.handleShowJoinRequests = this.handleShowJoinRequests.bind(this);\n this.handleSendFriendVerification = this.handleSendFriendVerification.bind(this);\n this.handleBatchDelete = this.handleBatchDelete.bind(this);\n this.handleBatchFavorite = this.handleBatchFavorite.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachImageOrVideo = this.handleAttachImageOrVideo.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.postReadNotification = this.postReadNotification.bind(this);\n this.clearNotificationQueue = this.clearNotificationQueue.bind(this);\n this.goToLatestMessage = this.goToLatestMessage.bind(this);\n this.handleFileDrop = this.handleFileDrop.bind(this);\n\n this.handlePickReply = this.handlePickReply.bind(this);\n this.handleEditMessage = this.handleEditMessage.bind(this);\n this.handleCancelReply = this.handleCancelReply.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n this.jumpToMessage = this.jumpToMessage.bind(this);\n this.handleUnpinMessage = this.handleUnpinMessage.bind(this);\n this.handleCallHangup = this.handleCallHangup.bind(this);\n\n this.isDragEnabled = this.isDragEnabled.bind(this);\n this.handleDragStart = this.handleDragStart.bind(this);\n this.handleDragIn = this.handleDragIn.bind(this);\n this.handleDragOut = this.handleDragOut.bind(this);\n this.handleDrag = this.handleDrag.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n\n this.chatMessageRefs = [];\n this.getOrCreateMessageRef = this.getOrCreateMessageRef.bind(this);\n this.getVisibleMessageRange = this.getVisibleMessageRange.bind(this);\n\n // Keeps track of the drag event.\n // Need a counter b/c the browser's 'drag' events may fire multiple times\n // when the user takes the mouse pointer over the container:\n // for the component itself and for all nested/child elements.\n this.dragCounter = 0;\n this.dndRef = null;\n\n this.readNotificationQueue = [];\n this.readNotificationTimer = null;\n\n this.keyPressTimer = null;\n }\n\n getOrCreateMessageRef(seqId) {\n if (this.chatMessageRefs[seqId]) {\n return this.chatMessageRefs[seqId];\n }\n const ref = React.createRef();\n this.chatMessageRefs[seqId] = ref;\n return ref;\n }\n\n getVisibleMessageRange(holderRect) {\n let min = Number.MAX_SAFE_INTEGER, max = -1;\n let visibilityStatus = false;\n this.chatMessageRefs.every((ref, seq) => {\n if (ref.current) {\n const { top, bottom, height } = ref.current.getBoundingClientRect();\n const visible = top <= holderRect.top ? holderRect.top - top <= height : bottom - holderRect.bottom <= height;\n if (visible) {\n visibilityStatus = true;\n min = Math.min(min, seq);\n max = Math.max(max, seq);\n } else if (visibilityStatus) {\n // The remaining elements are no longer visible, no need to iterate them.\n return false;\n }\n }\n return true;\n });\n\n return max >= min ? {min: min, max: max} : {min: 0, max: 0};\n }\n\n componentDidMount() {\n if (this.messagesScroller) {\n this.messagesScroller.addEventListener('scroll', this.handleScrollEvent);\n }\n\n // Drag and drop events\n this.mountDnDEvents(this.dndRef);\n\n this.componentSetup({}, {});\n\n getBootstrap().then(data => {\n this.setState({messagePolicy: data.message_policy || null});\n }).catch(_ => {});\n }\n\n componentWillUnmount() {\n // componentSetup below has an identical guard for switching from one topic to another during an\n // active call -- but componentDidUpdate/componentSetup never runs on an actual unmount (leaving\n // the messaging section entirely for another chapter, or on mobile switching to the conversation\n // list while displayMobile). Without this, CallPanel's own componentWillUnmount only tears down\n // local media: it never notifies the peer or resets tinode-web.jsx's top-level callState/\n // callTopic, which then stay stuck at CALL_STATE_IN_PROGRESS. Navigating back to the call's topic\n // later remounts a \"zombie\" CallPanel -- its start() sees that stale CALL_STATE_IN_PROGRESS and\n // takes the \"we just accepted\" branch, which never calls getUserMedia(): no local media, every\n // control disabled, only hang-up works.\n if (this.state.rtcPanel) {\n this.handleCallHangup(this.state.topic, this.props.callSeq);\n }\n if (this.messagesScroller) {\n this.messagesScroller.removeEventListener('scroll', this.handleScrollEvent);\n }\n window.clearTimeout(this.toastTimer);\n\n // Flush all notifications.\n this.clearNotificationQueue();\n\n // Drag and drop events\n if (this.dndRef) {\n this.dndRef.removeEventListener('dragstart', this.handleDragStart);\n this.dndRef.removeEventListener('dragenter', this.handleDragIn);\n this.dndRef.removeEventListener('dragleave', this.handleDragOut);\n this.dndRef.removeEventListener('dragover', this.handleDrag);\n this.dndRef.removeEventListener('drop', this.handleDrop);\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n // Scroll last message into view on component update e.g. on message received\n // or vertical shrinking.\n if (this.messagesScroller &&\n (prevState.topic != this.state.topic || prevState.maxSeqId != this.state.maxSeqId ||\n prevState.minSeqId != this.state.minSeqId)) {\n // New message.\n if (this.state.scrollPosition < SHOW_GO_TO_LAST_DIST) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight -\n this.state.scrollPosition - this.messagesScroller.offsetHeight;\n }\n }\n\n if (!this.props.applicationVisible) {\n // If application is not visible, flush all unsent 'read' notifications.\n this.clearNotificationQueue();\n } else {\n // Otherwise assume there are unread messages.\n this.postReadNotification(0);\n }\n\n // Ch.7: jump to a message found via chat-history search (content-library-view.jsx's History),\n // passed in as a ?jumpseq= hash param rather than a normal prop since the navigation that gets us\n // here also has to change the *topic*, which content-library-view.jsx has no direct way to do.\n if (this.props.jumpToSeq && this.props.jumpToSeq != prevProps.jumpToSeq) {\n this.jumpToMessage(parseInt(this.props.jumpToSeq, 10));\n }\n\n this.componentSetup(prevProps, prevState);\n }\n\n componentSetup(prevProps, prevState) {\n const topic = this.props.tinode ? this.props.tinode.getTopic(this.state.topic) : undefined;\n if (this.state.topic != prevState.topic) {\n if (prevState.topic && !Tinode.isNewGroupTopicName(prevState.topic)) {\n this.leave(prevState.topic);\n if (prevState.rtcPanel) {\n this.handleCallHangup(prevState.topic, prevProps.callSeq);\n }\n }\n\n if (topic) {\n topic.onData = this.handleMessageUpdate;\n topic.onAllMessagesReceived = this.handleAllMessagesReceived;\n topic.onInfo = this.handleInfoReceipt;\n topic.onMetaDesc = this.handleDescChange;\n topic.onSubsUpdated = this.handleSubsUpdated;\n topic.onPres = this.handleSubsUpdated;\n topic.onAuxUpdated = this.handleAuxUpdate;\n }\n\n this.mentionedUsers = [];\n this.mentionAllPending = false;\n this.loadRelationshipContext(topic);\n this.loadGroupContext(topic);\n this.loadDraft(topic);\n }\n\n if (topic) {\n if ((this.state.topic != prevState.topic) || (this.props.myUserId && !prevProps.myUserId)) {\n // Don't immediately subscribe to a new p2p topic, wait for the first message.\n const newTopic = (this.props.newTopicParams && this.props.newTopicParams._topicName == this.props.topic);\n if (topic.isP2PType() && newTopic && !IMMEDIATE_P2P_SUBSCRIPTION) {\n topic.getMeta(topic.startMetaQuery().withDesc().build());\n } else if (this.props.myUserId) {\n this.subscribe(topic);\n }\n } else if (topic.isSubscribed() && this.state.isReader && !prevState.isReader) {\n // If reader status has changed and data became available.\n topic.getMeta(topic.startMetaQuery().withLaterData().build());\n } else if (!topic.isSubscribed() && this.props.ready && !prevProps.ready) {\n // Connection restored (e.g. wake from sleep): resubscribe to the currently open topic.\n this.subscribe(topic);\n }\n }\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n let nextState = {};\n if (!nextProps.topic) {\n // Default state: no topic.\n nextState = {\n minSeqId: -1,\n maxSeqId: -1,\n latestClearId: -1,\n onlineSubs: [],\n topic: null,\n title: '',\n avatar: null,\n isVerified: false,\n isStaff: false,\n isDangerous: false,\n deleted: false,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n minimizedCallPanel: false,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n peerMessagingDisabled: false,\n channel: false,\n reply: null,\n contentToEdit: null,\n showGoToLastButton: false,\n dragging: false,\n pins: [],\n pinsLoaded: false,\n selectedPin: 0,\n subsVersion: 0,\n relationshipContext: null,\n groupRoles: null,\n myGroupRole: null,\n groupAnnouncement: null,\n pendingJoinRequests: 0,\n draftText: null,\n draftVersion: 0\n };\n } else if (nextProps.topic != prevState.topic) {\n const topic = nextProps.tinode.getTopic(nextProps.topic);\n\n nextState = {\n topic: nextProps.topic,\n deleted: topic._deleted,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n minimizedCallPanel: false,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n showGoToLastButton: false,\n contentToEdit: null,\n dragging: false,\n selectedPin: 0,\n relationshipContext: null,\n groupRoles: null,\n myGroupRole: null,\n groupAnnouncement: null,\n pendingJoinRequests: 0,\n draftText: null,\n draftVersion: 0,\n // MessagesView isn't remounted on topic switch (no `key={topic}` at the call site in\n // tinode-web.jsx), so a pending risk-check dialog from the conversation just left would\n // otherwise survive the switch -- confirming it would then send the old topic's message\n // into whichever topic is now open, since doSend()'s `this.props.sendMessage` resolves the\n // topic to send to at call time, not at the time the dialog was raised.\n riskDialog: null\n };\n\n if (nextProps.forwardMessage) {\n if (nextProps.forwardMessage.content) {\n const content = nextProps.forwardMessage.content;\n const size = content?.length || (content?.size || 0);\n nextState.docPreview = {\n object: content,\n type: nextProps.forwardMessage.type,\n size: size\n };\n } else {\n // We are forwarding a message. Show preview.\n nextState.reply = {\n content: nextProps.forwardMessage.preview,\n seq: null\n };\n }\n } else {\n nextState.reply = null;\n }\n\n if (topic) {\n // Topic exists.\n const subs = [];\n\n if (nextProps.connected) {\n topic.subscribers((sub) => {\n if (sub.online && sub.user != nextProps.myUserId) {\n subs.push(sub);\n }\n });\n }\n\n Object.assign(nextState, {\n onlineSubs: subs\n });\n\n if (topic.isSelfType()) {\n Object.assign(nextState, {\n title: nextProps.intl.formatMessage(messages.self_topic_name),\n avatar: true\n });\n } else if (topic.public) {\n Object.assign(nextState, {\n title: topicDisplayName(topic.name, topic.public, ''),\n avatar: makeImageUrl(topic.public.photo)\n });\n } else {\n Object.assign(nextState, {\n title: '',\n avatar: null\n });\n }\n\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(nextState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (prevState.peerMessagingDisabled) {\n Object.assign(nextState, {\n peerMessagingDisabled: false\n });\n }\n Object.assign(nextState, {\n minSeqId: topic.minMsgSeq(),\n maxSeqId: topic.maxMsgSeq(),\n latestClearId: topic.maxClearId(),\n channel: topic.isChannelType(),\n pins: (topic.aux('pins') || []).slice(),\n pinsLoaded: false\n });\n\n if (nextProps.callTopic == topic.name && shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\n }\n } else {\n // Invalid topic.\n Object.assign(nextState, {\n minSeqId: -1,\n maxSeqId: -1,\n latestClearId: -1,\n onlineSubs: [],\n title: '',\n avatar: null,\n peerMessagingDisabled: false,\n channel: false,\n pins: [],\n pinsLoaded: false\n });\n }\n } else {\n // We are still in same topic. Show the call panel if necessary.\n if (nextProps.callTopic == prevState.topic && !prevState.rtcPanel &&\n shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\n }\n }\n\n if (nextProps.acs) {\n if (nextProps.acs.isWriter() != prevState.isWriter) {\n nextState.isWriter = !prevState.isWriter;\n }\n if (nextProps.acs.isReader() != prevState.isReader) {\n nextState.isReader = !prevState.isReader;\n }\n if (nextProps.acs.isAdmin() != prevState.isAdmin) {\n nextState.isAdmin = !prevState.isAdmin;\n }\n if (!nextProps.acs.isReader('given') != prevState.readingBlocked) {\n nextState.readingBlocked = !prevState.readingBlocked;\n }\n if (nextProps.acs.isSharer() != prevState.isSharer) {\n nextState.isSharer = !prevState.isSharer;\n }\n } else {\n if (prevState.isWriter) {\n nextState.isWriter = false;\n }\n if (prevState.isReader) {\n nextState.isReader = false;\n }\n if (prevState.isAdmin) {\n nextState.isAdmin = false;\n }\n if (!prevState.readingBlocked) {\n nextState.readingBlocked = true;\n }\n if (prevState.isSharer) {\n nextState.isSharer = false;\n }\n }\n\n if (isUnconfirmed(nextProps.acs) == !prevState.unconformed) {\n nextState.unconfirmed = !prevState.unconformed;\n }\n\n // Clear subscribers online when there is no connection.\n if (!nextProps.connected && prevState.onlineSubs && prevState.onlineSubs.length > 0) {\n nextState.onlineSubs = [];\n }\n\n return nextState;\n }\n\n subscribe(topic) {\n if (topic.isSubscribed() || !this.props.ready) {\n return;\n }\n\n // Is this a new topic?\n const newTopic = (this.props.newTopicParams && this.props.newTopicParams._topicName == this.props.topic);\n // Don't request the tags. They are useless unless the user\n // is the owner and is editing the topic.\n let getQuery = topic.startMetaQuery().withLaterDesc().withLaterSub().withAux();\n if (this.state.isReader || newTopic) {\n // Reading is either permitted or we don't know because it's a new topic. Ask for messages.\n getQuery = getQuery.withLaterData(MESSAGES_PAGE);\n if (this.state.isReader) {\n getQuery = getQuery.withLaterDel();\n }\n // And show \"loading\" spinner.\n this.setState({ fetchingMessages: true });\n }\n\n const setQuery = newTopic ? this.props.newTopicParams : undefined;\n topic.subscribe(getQuery.build(), setQuery)\n .then(ctrl => {\n if (ctrl.code == 303) {\n // Redirect to another topic requested.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', ctrl.params.topic));\n return;\n }\n if (this.state.topic != ctrl.topic) {\n this.setState({topic: ctrl.topic});\n }\n if (this.state.deleted) {\n this.setState({deleted: false});\n }\n this.props.onNewTopicCreated(this.props.topic, ctrl.topic);\n // If there are unsent messages (except hard-failed and video call messages),\n // try sending them now. Hard-failed and unsent video call messages will be dropped.\n let discard = [];\n topic.queuedMessages(pub => {\n if (pub._sending) {\n return;\n }\n if (pub._fatal || (pub.head && pub.head.webrtc)) {\n // Filter out unsent failed & video call messages.\n discard.push(pub.seq);\n return;\n }\n if (topic.isSubscribed()) {\n this.retrySend(pub);\n }\n });\n if (discard.length > 0) {\n topic.delMessagesList(discard, true);\n }\n })\n .catch(err => {\n console.error(\"Failed subscription to\", this.state.topic, err);\n this.props.onError(err.message, 'err');\n const blankState = MessagesView.getDerivedStateFromProps({}, {});\n blankState.title = this.props.intl.formatMessage(messages.not_found);\n this.setState(blankState);\n });\n }\n\n leave(oldTopicName) {\n if (!oldTopicName || !this.props.tinode.isTopicCached(oldTopicName)) {\n return;\n }\n\n const oldTopic = this.props.tinode.getTopic(oldTopicName);\n if (oldTopic && oldTopic.isSubscribed()) {\n oldTopic.leave(false)\n .catch(_ => { /* do nothing here */ })\n .finally(_ => {\n // We don't care if the request succeeded or failed.\n // The topic is dead regardless.\n this.setState({fetchingMessages: false});\n oldTopic.onData = undefined;\n oldTopic.onAllMessagesReceived = undefined;\n oldTopic.onInfo = undefined;\n oldTopic.onMetaDesc = undefined;\n oldTopic.onSubsUpdated = undefined;\n oldTopic.onPres = undefined;\n oldTopic.onAuxUpdated = undefined;\n });\n }\n }\n\n // Don't use React.createRef as the ref.current is not available in componentDidMount in this component.\n handleScrollReference(node) {\n if (node) {\n node.addEventListener('scroll', this.handleScrollEvent);\n this.messagesScroller = node;\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight -\n this.state.scrollPosition - this.messagesScroller.offsetHeight;\n }\n }\n\n // Get older messages and show/hide [go to latest message] button.\n handleScrollEvent(event) {\n const pos = event.target.scrollHeight - event.target.scrollTop - event.target.offsetHeight;\n this.setState({\n scrollPosition: pos,\n // Show [go to latest message] if far enough from bottom and scrolling down.\n showGoToLastButton: (pos > SHOW_GO_TO_LAST_DIST) && (pos < this.state.scrollPosition),\n });\n\n if (this.state.fetchingMessages || this.processingScrollEvent) {\n return;\n }\n\n if (event.target.scrollTop <= FETCH_PAGE_TRIGGER) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic && topic.isSubscribed()) {\n this.processingScrollEvent = true;\n const {min, max} = this.getVisibleMessageRange(event.target.getBoundingClientRect());\n const gaps = topic.msgHasMoreMessages(min, max, false);\n if (gaps.length > 0) {\n this.setState({fetchingMessages: true}, _ => {\n topic.getMessagesPage(MESSAGES_PAGE, gaps, min, max)\n .catch(err => this.props.onError(err.message, 'err'))\n .finally(_ => this.setState({fetchingMessages: false}));\n });\n }\n }\n }\n this.processingScrollEvent = false;\n }\n\n /* Mount drag and drop events */\n mountDnDEvents(dnd) {\n if (dnd) {\n dnd.addEventListener('dragstart', this.handleDragStart);\n dnd.addEventListener('dragenter', this.handleDragIn);\n dnd.addEventListener('dragleave', this.handleDragOut);\n dnd.addEventListener('dragover', this.handleDrag);\n dnd.addEventListener('drop', this.handleDrop);\n this.dndRef = dnd;\n }\n }\n\n goToLatestMessage() {\n this.setState({scrollPosition: 0});\n if (this.messagesScroller) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.messagesScroller.offsetHeight;\n }\n }\n\n handleDescChange(desc) {\n if (Tinode.isSelfTopicName(this.props.topic)) {\n this.setState({\n title: this.props.intl.formatMessage(messages.self_topic_name),\n avatar: true\n });\n } else if (desc.public) {\n this.setState({\n title: topicDisplayName(this.props.topic, desc.public, ''),\n avatar: makeImageUrl(desc.public.photo)\n });\n } else {\n this.setState({\n title: '',\n avatar: null\n });\n }\n\n if (desc.acs) {\n this.setState({\n isWriter: desc.acs.isWriter(),\n isReader: desc.acs.isReader(),\n isAdmin: desc.acs.isAdmin(),\n readingBlocked: !desc.acs.isReader('given'),\n unconfirmed: isUnconfirmed(desc.acs),\n });\n }\n }\n\n postReadNotification(seq) {\n // Ignore notifications if the app is invisible or topic is not yet available.\n if (!this.props.applicationVisible || !this.state.topic) {\n return;\n }\n\n // Set up the timer if it's not running already.\n if (!this.readNotificationTimer) {\n this.readNotificationTimer = setInterval(_ => {\n if (this.readNotificationQueue.length == 0) {\n // Shut down the timer if the queue is empty.\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n return;\n }\n\n let seq = -1;\n while (this.readNotificationQueue.length > 0) {\n const n = this.readNotificationQueue[0];\n if (n.topicName != this.state.topic) {\n // Topic has changed. Drop the notification.\n this.readNotificationQueue.shift();\n continue;\n }\n\n const now = new Date();\n if (n.sendAt <= now) {\n // Remove expired notification from queue.\n this.readNotificationQueue.shift();\n if (n.seq == 0 || Tinode.isServerAssignedSeq(n.seq)) {\n seq = Math.max(seq, n.seq);\n }\n } else {\n break;\n }\n }\n\n // Send only one notification for the whole batch of messages.\n if (seq >= 0) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic) {\n try {\n topic.noteRead(seq);\n } catch (err) {\n console.error(\"Failed to send read notification\", err);\n }\n }\n }\n }, NOTIFICATION_EXEC_INTERVAL);\n }\n\n const now = new Date();\n this.readNotificationQueue.push({\n topicName: this.state.topic,\n seq: seq,\n sendAt: now.setMilliseconds(now.getMilliseconds() + READ_DELAY)\n });\n }\n\n // Clear notification queue and timer.\n clearNotificationQueue() {\n this.readNotificationQueue = [];\n if (this.readNotificationTimer) {\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n }\n }\n\n handleSubsUpdated() {\n if (this.state.topic) {\n const subs = [];\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.subscribers(sub => {\n if (sub.online && sub.user != this.props.myUserId) {\n subs.push(sub);\n }\n });\n const newState = {onlineSubs: subs, subsVersion: this.state.subsVersion + 1};\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(newState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (this.state.peerMessagingDisabled) {\n Object.assign(newState, {\n peerMessagingDisabled: false\n });\n }\n this.setState(newState);\n }\n }\n\n // The 'msg' could be false-ish if some message ranges were deleted.\n handleMessageUpdate(msg) {\n if (!this.state.topic) {\n return;\n }\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (!msg) {\n // msg could be null if one or more messages were deleted.\n // Updating state to force redraw.\n this.setState({latestClearId: topic.maxClearId()});\n return;\n }\n\n clearTimeout(this.keyPressTimer)\n this.setState({maxSeqId: topic.maxMsgSeq(), minSeqId: topic.minMsgSeq(), typingIndicator: false}, _ => {\n // Scroll to the bottom if the message is added to the end of the message\n // list if already at the bottom, otherwise show [go to latest] button.\n // Implemented as a callback to be sure the scroll height has been updated.\n if (topic.isNewMessage(msg.seq)) {\n if (this.state.scrollPosition > SHOW_GO_TO_LAST_DIST) {\n this.setState({showGoToLastButton: true});\n } else {\n this.goToLatestMessage();\n }\n } else {\n if (this.messagesScroller) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.state.scrollPosition -\n this.messagesScroller.offsetHeight;\n }\n }\n });\n\n // Aknowledge messages except own messages. They are\n // automatically assumed to be read and recived.\n const status = topic.msgStatus(msg, true);\n if (status >= Tinode.MESSAGE_STATUS_SENT && msg.from != this.props.myUserId) {\n this.postReadNotification(msg.seq);\n }\n }\n\n handleAllMessagesReceived(count) {\n this.setState({fetchingMessages: false});\n if (!count) {\n // All messages received. Nothing left to receive.\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic) {\n // Send read notification for the absolute last message.\n this.postReadNotification(topic.seq);\n }\n return;\n }\n\n // Load pinned message too (if any);\n if (!this.state.pinsLoaded) {\n // This needs to be guarded to avoid an infinite loop.\n // The loop may happen if some pinned messages are deleted.\n const topic = this.props.tinode.getTopic(this.state.topic);\n this.setState({pinsLoaded: true}, _ => {\n topic.getPinnedMessages();\n });\n } else {\n this.setState({pinsLoaded: false});\n }\n }\n\n handleAuxUpdate(aux) {\n const pins = (aux['pins'] || []).slice();\n let selectedPin = this.state.selectedPin;\n if (pins.length > this.state.pins.length) {\n // New pins added, show the latest.\n selectedPin = 0;\n } else if (selectedPin >= pins.length) {\n selectedPin = Math.max(0, pins.length - 1);\n }\n this.setState({pins: pins, selectedPin: selectedPin});\n }\n\n handleInfoReceipt(info) {\n switch (info.what) {\n case 'kp': {\n clearTimeout(this.keyPressTimer);\n this.keyPressTimer = setTimeout(_ => this.setState({typingIndicator: false}), KEYPRESS_DELAY + 1000);\n if (!this.state.typingIndicator) {\n this.setState({typingIndicator: true});\n }\n break;\n }\n case 'read':\n case 'recv':\n // Redraw due to changed recv/read status.\n this.forceUpdate();\n break;\n default:\n console.info(\"Other change in topic: \", info.what);\n }\n }\n\n handleExpandMedia(content) {\n if (!content) {\n return;\n }\n\n if (content.video) {\n this.setState({videoPostview: content});\n } else {\n this.setState({imagePostview: content});\n }\n }\n\n handleClosePreview() {\n if (this.state.imagePreview && this.state.imagePreview.url) {\n URL.revokeObjectURL(this.state.imagePreview.url);\n }\n if (this.state.videoPreview && this.state.videoPreview.url) {\n URL.revokeObjectURL(this.state.videoPreview.url);\n }\n this.setState({\n imagePostview: null,\n imagePreview: null,\n docPreview: null,\n videoPreview: null,\n videoPostview: null,\n });\n this.props.onCancelForwardMessage();\n }\n\n handleFormResponse(action, text, data) {\n if (action == 'pub') {\n this.sendMessage(Drafty.attachJSON(Drafty.parse(text), data));\n } else if (action == 'url') {\n const url = new URL(data.ref);\n const params = url.searchParams;\n for (let key in data.resp) {\n if (data.resp.hasOwnProperty(key)) {\n params.set(key, data.resp[key]);\n }\n }\n ['name', 'seq'].forEach(key => {\n if (data[key]) {\n params.set(key, data[key]);\n }\n });\n params.set('uid', this.props.myUserId);\n params.set('topic', this.state.topic);\n url.search = params;\n window.open(url, '_blank');\n } else {\n console.info(\"Unknown action in form\", action);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({ topicName: this.state.topic, y: e.pageY, x: e.pageX });\n }\n\n handleShowMessageContextMenu(params, messageSpecificMenuItems) {\n if (params.userFrom == 'chan') {\n params.userFrom = this.state.topic;\n params.userName = this.state.title;\n }\n params.topicName = this.state.topic;\n let menuItems = messageSpecificMenuItems || [];\n // Picking \"回复\" on some other message while already editing one (this.state.reply.editing)\n // silently abandons the edit: handlePickReply overwrites this.state.reply wholesale but never\n // touches contentToEdit, so the composer keeps showing the message being edited while the\n // header/send-icon quietly switch to reply mode -- sending then posts that text as a brand new\n // reply to the other message, and the original edit is lost with no confirmation. Simplest fix\n // is the same one already used for menu_item_edit's window check: just don't offer the option\n // that would cause it, rather than trying to reconcile the two states after the fact.\n if (this.state.reply && this.state.reply.editing) {\n menuItems = menuItems.filter(item => item !== 'menu_item_reply');\n }\n const topic = this.props.tinode.getTopic(params.topicName);\n if (topic) {\n // Edit (Ch.4): chat-message.jsx already gated 'menu_item_edit' on writer + non-attachment\n // content, but has no access to the server-configured edit window (that's session-level state\n // living here, not a per-message prop) -- unlike recall just below, this was never actually\n // filtered by age, so an edit attempt on a message well past the window would only fail at\n // send time instead of never showing the option. Same window-check shape as recall's, just\n // removing the item after the fact instead of adding it, since base eligibility already ran.\n const editWindow = this.state.messagePolicy ? this.state.messagePolicy.edit_window_seconds : 0;\n if (menuItems.includes('menu_item_edit') && !(editWindow > 0 && params.timestamp &&\n params.timestamp.getTime() > (new Date().getTime() - editWindow * 1000))) {\n menuItems = menuItems.filter(item => item !== 'menu_item_edit');\n }\n menuItems.push('menu_item_copy', 'menu_item_favorite');\n // Recall (Ch.4): own message, real seq, and still inside the server-configured window.\n // Distinct from delete -- see context-menu.jsx recallOwnMessage for why both exist.\n // A group admin/owner can also recall *other* members' messages within the same window --\n // server/im_http.go's serveIMMessageRecall calls authorizeIMMessageMutation with\n // allowAdmin=true, so the backend has always accepted this; the reference screenshot\n // (消息页面—长按弹出.png) lists \"群撤回\" as its own, always-shown menu item alongside \"撤回\" --\n // this was previously never offered at all since the only condition checked was authorship.\n const recallWindow = this.state.messagePolicy ? this.state.messagePolicy.recall_window_seconds : 0;\n const canRecallAsAdmin = topic.isGroupType() && topic.getAccessMode() && topic.getAccessMode().isAdmin();\n if ((params.userFrom == this.props.myUserId || canRecallAsAdmin) && params.seq > 0 && recallWindow > 0 &&\n params.timestamp && params.timestamp.getTime() > (new Date().getTime() - recallWindow * 1000)) {\n menuItems.push('menu_item_recall');\n }\n // Self -> (1) always hard-delete with [Delete] title.\n // P2P -> (1) hard-delete if allowed and not too old, (2) always soft-delete.\n // Group -> (1) hard-delete if allowed and not too old or owner, (2) always soft-delete.\n if (topic.isSelfType()) {\n // Hard-delete with plain [Delete] title.\n menuItems.push('message_delete_generic');\n } else {\n if (!topic.isChannelType()) {\n // P2P or normal group: always allow to soft-delete.\n menuItems.push('message_delete');\n }\n\n const acs = topic.getAccessMode();\n if (acs && acs.isDeleter()) {\n // Owner can always hard-delete regardless of age.\n let canDelete = acs.isOwner();\n if (!canDelete) {\n // Not owner: check message age if configured on the server.\n const maxDelAge = this.props.tinode.getServerParam(Tinode.MSG_DELETE_AGE, 0) | 0;\n // Make sure the message is not too old. This check is here just to make the UI\n // more user-friendly. The server will enforce the limit regardless of this.\n canDelete = maxDelAge == 0 || (maxDelAge > 0 && params.timestamp ?\n params.timestamp.getTime() > (new Date().getTime() - maxDelAge * 1000) : false);\n }\n if (canDelete) {\n // [Delete for All] title.\n menuItems.push('message_delete_hard');\n }\n }\n }\n }\n menuItems.push('menu_item_select');\n this.props.showContextMenu(params, menuItems);\n }\n\n handleNewChatAcceptance(action) {\n this.props.onNewChat(this.state.topic, action);\n }\n\n handleEnablePeer(e) {\n e.preventDefault();\n this.props.onChangePermissions(this.state.topic, DEFAULT_P2P_ACCESS_MODE, this.state.topic);\n }\n\n // Fetch the real friend/block/pending relationship state for a 1:1 topic so the UI can explain\n // (instead of silently disabling) why sending is restricted. Best-effort: a failed fetch just\n // leaves relationshipContext null and the existing isWriter-based disable stays in effect.\n loadRelationshipContext(topic) {\n if (!topic || !topic.isP2PType()) {\n return;\n }\n const topicName = topic.name;\n getConversationContext(topicName).then(data => {\n if (this.state.topic == topicName) {\n this.setState({relationshipContext: data});\n }\n }).catch(_ => {});\n }\n\n // Ch.6: role badges (docs/images/群标识.png) and the announcement/join-request banners at the top of a\n // group chat (docs/images/群公告状态.png, 新邀请进群申请.png) all need data no P2P topic has -- fetch it\n // once per group-topic-load, same best-effort pattern as loadRelationshipContext above. Every `topic`\n // field these Ch.6 endpoints return is a real grp-prefixed native Tinode name (verified against the Go\n // source), so there's no Ch.5-style translation needed anywhere here.\n loadGroupContext(topic) {\n if (!topic || !topic.isGroupType() || topic.isChannelType()) {\n return;\n }\n const topicName = topic.name;\n getGroupMembers(topicName).then(data => {\n if (this.state.topic != topicName) {\n return;\n }\n const roles = {};\n (data.items || []).forEach(m => { roles[m.user_id] = m.role; });\n this.setState({groupRoles: roles, myGroupRole: roles[this.props.myUserId] || null});\n // Pending join requests can only be resolved by an admin/owner -- only they can act on the banner,\n // and only they pass requireIMGroupMember's IsAdmin() check on the list endpoint itself.\n if (roles[this.props.myUserId] == 'owner' || roles[this.props.myUserId] == 'admin') {\n getGroupJoinRequests(topicName, 'pending').then(reqData => {\n if (this.state.topic == topicName) {\n this.setState({pendingJoinRequests: (reqData.items || []).length});\n }\n }).catch(_ => {});\n }\n }).catch(_ => {});\n getLatestGroupAnnouncement(topicName).then(data => {\n if (this.state.topic == topicName) {\n this.setState({groupAnnouncement: (data && data.content) ? data : null});\n }\n }).catch(_ => {});\n }\n\n // 4.2-4.3 @提醒:只对群话题开放(私聊提@没有意义,也没有可选的\"其他成员\")。返回给\n // send-message.jsx 的选择器渲染,真正的 uid 解析在 mentionSelected 里记下来,供发送时\n // applyMentionResolution 使用。\n mentionSearch(query) {\n const topic = this.props.tinode ? this.props.tinode.getTopic(this.state.topic) : null;\n if (!topic || !topic.isGroupType()) {\n return Promise.resolve([]);\n }\n return getGroupMembers(this.state.topic, {mentionable: true, query}).then(data => {\n const items = data.items || [];\n // \"所有人\" (参考图 @人员—选择提醒人.png 里排在真实成员最前面的合成选项) -- server/topic.go's\n // validateAndNormalizeMentions rejects head.mention_all from anyone who isn't admin\n // (ErrPermissionDenied), so this is only offered to accounts GET .../members already told us\n // can actually use it -- an ineligible account would otherwise see the option, pick it, and\n // have the server silently reject the send.\n const canMentionAll = !!(data.permissions && data.permissions.can_mention_all);\n if (canMentionAll && '所有人'.includes((query || '').trim())) {\n return [{user_id: MENTION_ALL_UID, display_name: '所有人'}, ...items];\n }\n return items;\n });\n }\n\n mentionSelected(uid, name) {\n if (uid === MENTION_ALL_UID) {\n // Not a real Drafty mention to resolve -- sendMessage below reads this flag directly to set\n // head.mention_all, independent of the this.mentionedUsers/applyMentionResolution machinery\n // single-person @提醒 uses. The \"@所有人\" text itself still gets auto-detected by Drafty.parse\n // into an ordinary (uid-less) MN entity and renders highlighted like any other mention --\n // that's just decorative here since the real \"notify everyone\" effect comes from the head flag.\n this.mentionAllPending = true;\n return;\n }\n this.mentionedUsers = (this.mentionedUsers || []).filter(m => m.name !== name);\n this.mentionedUsers.push({uid, name});\n }\n\n // 4.1 跨话题草稿:话题一切换就去问服务端这个会话有没有存过草稿。原生话题名(P2P 用对方\n // user_id)直接可用,接口内部自己会做订阅存在性校验,不需要额外归一化。\n loadDraft(topic) {\n if (!topic) {\n return;\n }\n const topicName = topic.name;\n getTopicDraft(topicName).then(data => {\n if (this.state.topic != topicName) {\n return;\n }\n this.setState({draftText: data.content || '', draftVersion: data.version || 0});\n }).catch(_ => {});\n }\n\n // 输入框每次变化都会调这个(不在这里节流——防抖延迟统一放这一处,跟日报/月报草稿已有的\n // 600ms 防抖是同一个数值,方便以后统一调整)。编辑已有消息、转发预填内容这两种情况下\n // SendMessage 的文本框也会触发 onChange,但那些不是\"新写的草稿\",不应该覆盖真正的草稿。\n //\n // 定时器按话题分开存(this.draftSaveTimers 是个 map),不能像原来那样用单个共享句柄——\n // 那样话题A打字触发的600ms保存,会在300ms后切到话题B打字时被 clearTimeout 直接取消掉,\n // A刚打的字就再也不会发给服务器了。\n //\n // version 在这里(调用的当下,this.state.topic 必然还是 topicName,因为 onMessageChange\n // 只有当前激活话题的 SendMessage 实例会触发)同步捕获进闭包,不能等定时器触发时才去读\n // this.state.draftVersion——那时用户很可能已经切到别的话题,届时重新读到的要么是无关话题\n // 的版本号,要么在判断不匹配时退化成硬编码的 0。后端 PUT .../draft 对 version=0 是\"无条件\n // 跳过乐观锁校验直接覆盖\"而不是\"仅当草稿真的不存在时才创建\"(见\n // docs/IM-后端问题清单-2026-09-04.md),这个 0 一旦被真的发出去,可能无声覆盖掉这段时间里\n // 别的标签页/设备写入的更新草稿。\n handleComposerChange(text) {\n if (this.state.reply && this.state.reply.editing) {\n return;\n }\n if (this.props.forwardMessage) {\n return;\n }\n const topicName = this.state.topic;\n if (!topicName) {\n return;\n }\n const version = this.state.draftVersion || 0;\n this.draftSaveTimers = this.draftSaveTimers || {};\n if (this.draftSaveTimers[topicName]) {\n window.clearTimeout(this.draftSaveTimers[topicName]);\n }\n this.draftSaveTimers[topicName] = window.setTimeout(() => {\n delete this.draftSaveTimers[topicName];\n updateTopicDraft(topicName, text, [], version).then(d => {\n if (this.state.topic == topicName) {\n this.setState({draftVersion: d.version});\n }\n }).catch(_ => {});\n }, 600);\n }\n\n // 消息真的发出去之后,把服务端存的草稿清空——不然重新打开这个会话会看到已经发送过的旧文字。\n // 单纯等下一次防抖自然把空字符串存上去也能达到同样效果,但那样在\"发送后立刻切走\"这个真实\n // 会发生的场景里会有一个几百毫秒的窗口,草稿还是旧内容,不如发送成功后立刻清。\n // knownVersion 由调用方(sendMessage)在发送发起的那一刻同步捕获传入,原因同上——避免在\n // 发送成功回调触发时(用户很可能已经切换话题)重新派生出不可靠的版本号。\n clearDraft(topicName, knownVersion) {\n if (this.draftSaveTimers && this.draftSaveTimers[topicName]) {\n window.clearTimeout(this.draftSaveTimers[topicName]);\n delete this.draftSaveTimers[topicName];\n }\n const version = knownVersion != null ? knownVersion :\n (this.state.topic == topicName) ? (this.state.draftVersion || 0) : 0;\n updateTopicDraft(topicName, '', [], version).then(d => {\n if (this.state.topic == topicName) {\n this.setState({draftText: '', draftVersion: d.version});\n }\n }).catch(_ => {});\n }\n\n // Note: setUrlSidePanel only overwrites path[0] -- called with window.location.hash while a topic is\n // open (path[1] is the open topic), it leaves that segment in place, producing e.g.\n // \"#group-announcement-detail/grpXXX?topic=grpXXX\". handleHashRoute then re-parses path[1] as a topic\n // selector on every hashchange, fighting with the sidepanel that's trying to open and leaving the\n // whole view blank. Build the target hash from an empty path instead of the current one.\n handleShowAnnouncement(e) {\n e.preventDefault();\n // `from=chat` lets Announcement (group-management-view.jsx) tell this entry point apart from\n // the one via group-settings -- both land on the identical path[0]/topic hash otherwise, so\n // without it the \"back\" button can't know whether to return to group-settings or to this chat.\n let hash = HashNavigation.addUrlParam(HashNavigation.setUrlSidePanel('', 'group-announcement-detail'), 'topic', this.state.topic);\n hash = HashNavigation.addUrlParam(hash, 'from', 'chat');\n HashNavigation.navigateTo(hash);\n }\n\n handleShowJoinRequests(e) {\n e.preventDefault();\n // `from=chat` mirrors handleShowAnnouncement above -- lets JoinRequests (group-management-view.jsx)\n // return to this chat instead of always landing on group-governance.\n let hash = HashNavigation.addUrlParam(HashNavigation.setUrlSidePanel('', 'group-join-requests'), 'topic', this.state.topic);\n hash = HashNavigation.addUrlParam(hash, 'from', 'chat');\n HashNavigation.navigateTo(hash);\n }\n\n handleSendFriendVerification(e) {\n e.preventDefault();\n // Same stray-path[1] hazard as handleShowAnnouncement above (build from an empty base, not the\n // current hash, since a topic is open) -- this one additionally never set `uid`, which the\n // friend-verification page needs (contact-management-view.jsx's Verification reads hashParams.uid)\n // to know who the verification is for; for a P2P topic that's simply the topic name itself.\n HashNavigation.navigateTo(HashNavigation.addUrlParam(\n HashNavigation.setUrlSidePanel('', 'friend-verification'), 'uid', this.state.topic));\n }\n\n showToast(text) {\n this.setState({toast: text});\n window.clearTimeout(this.toastTimer);\n // Matches div.toast.show's own fadein(0.5s) + hold(2.5s) + fadeout(0.5s) animation length,\n // so the class is removed right as the CSS fadeout finishes instead of cutting it short.\n this.toastTimer = window.setTimeout(() => this.setState({toast: null}), 3500);\n }\n\n handleBatchDelete() {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (!topic || !this.props.selectedSeqs.length) {\n return;\n }\n // A selected message may still be queued/uploading (no server-confirmed seq yet, same case\n // context-menu.jsx's single-message deleteMessages guards with cancelSend before falling\n // back to delMessagesList). delMessagesList's normalizeRanges silently drops local-only\n // seqs instead of cancelling them, so left unfiltered a still-uploading attachment would\n // survive \"delete\" and get sent normally once its upload finishes.\n const remaining = this.props.selectedSeqs.filter(seq => !topic.cancelSend(seq));\n if (!remaining.length) {\n this.props.onExitSelectMode();\n return;\n }\n topic.delMessagesList(remaining, true).then(_ => {\n this.props.onExitSelectMode();\n }).catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n // Per docs/images/多选-选中对话内容-收藏成功.png the selection stays visible behind the toast --\n // unlike delete, favoriting doesn't remove the messages, so there's no reason to exit select mode.\n handleBatchFavorite() {\n if (!this.props.selectedSeqs.length) {\n return;\n }\n const topicName = this.state.topic;\n const seqs = this.props.selectedSeqs.slice();\n favoriteMessages(seqs.map(seq => ({topic: topicName, seq}))).then(() => {\n // `result.failed` can't be trusted here: the batch-create endpoint reuses one request-level\n // Idempotency-Key across every message in the batch (docs/IM-后端问题清单-2026-09-04.md,\n // 新增1), so every item after the first silently no-ops via ON DUPLICATE KEY UPDATE and gets\n // folded into `existing_count` -- indistinguishable, from this response alone, from a message\n // that really was already favorited. Re-reading the actual favorites list and checking which\n // of the messages we just asked for really landed sidesteps that ambiguity entirely.\n return getFavorites({type: 'all', limit: 100}).then(data => {\n const items = (data && data.items) || [];\n const landed = new Set(items\n .filter(it => it.source && it.source.topic == topicName)\n .map(it => String(it.source.seq)));\n const missing = seqs.filter(seq => !landed.has(String(seq)));\n if (missing.length === seqs.length) {\n this.props.onError('收藏失败', 'err');\n } else if (missing.length) {\n this.showToast(`已收藏 ${seqs.length - missing.length}/${seqs.length} 条`);\n } else {\n this.showToast('收藏成功');\n }\n });\n }).catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n sendKeyPress(audio) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (!topic.isSubscribed()) {\n return;\n }\n if (audio) {\n // Doc's default for the \"user is recording voice\" indicator is OFF unless product opts in\n // (a non-persisted {note what:\"kpa\"} broadcast to every other group member) -- this was firing\n // unconditionally on every recording, contradicting that documented default. No product signal\n // to turn it on yet, so this is a deliberate no-op rather than a removed feature: re-enable by\n // restoring `topic.noteRecording(true);` here if/when that's confirmed wanted.\n return;\n }\n topic.noteKeyPress();\n }\n\n // sendMessage sends the message with an optional subscription to topic first.\n // typeHint (Ch.7): the backend's imMessageType() classifier -- which drives every type-filtered list\n // in this chapter (favorites tabs, chat-history search/media tabs) -- only recognizes a flat\n // content.file_id/content.url key or an explicit head['x-im-type'] hint; it never walks a real\n // Drafty entity array. Since every attachment this app actually sends uses the standard ent[]\n // format (Drafty.attachFile/insertImage/insertVideo), none of them carry a flat file_id, so without\n // this hint every image/video/file/voice message silently classifies as plain \"text\" server-side.\n // Mutates a parsed Drafty document in place, upgrading any auto-detected \"@name\" MN entity whose\n // raw matched text equals a name the user actually picked from the mention dropdown into a real,\n // uid-bearing mention. Entities that don't match anything tracked (a literal \"@word\" the user just\n // typed, or an edited/mismatched name) are left with their raw text value -- Tinode's own renderer\n // already falls back to displaying that gracefully, this only upgrades the ones it safely can.\n applyMentionResolution(parsed) {\n if (!parsed || !Array.isArray(parsed.ent) || !this.mentionedUsers || !this.mentionedUsers.length) {\n return;\n }\n parsed.ent.forEach(e => {\n if (e.tp === 'MN' && e.data && typeof e.data.val === 'string') {\n const match = this.mentionedUsers.find(m => m.name === e.data.val);\n if (match) {\n e.data.val = match.uid;\n }\n }\n });\n }\n\n sendMessage(msg, uploadCompletionPromise, uploader, typeHint) {\n // Captured before the reply/edit branches below possibly rewrite `msg` into a Drafty object\n // (Drafty.append(...) for a reply-with-quote) -- the URL risk check further down keys off\n // `typeof msg == 'string'`, so without this a plain-text reply containing a link would silently\n // skip the check entirely (a fresh, non-reply message with the same text does get checked).\n const originalText = typeof msg === 'string' ? msg : null;\n let head;\n if (!msg && this.props.forwardMessage) {\n // We are forwarding a message.\n msg = this.props.forwardMessage.msg;\n head = this.props.forwardMessage.head;\n this.handleCancelReply();\n } else if (this.state.reply) {\n if (this.state.reply.editing) {\n if (msg == this.state.contentToEdit) {\n // Message unchanged.\n this.handleCancelReply();\n return;\n }\n // Editing an existing message.\n head = {replace: ':' + this.state.reply.seq};\n } else if (this.state.reply.content) {\n // Replying to a message in this topic.\n // Turn it into Drafty so we can make a quoted Drafty object later.\n head = {reply: '' + this.state.reply.seq};\n if (typeof msg == 'string') {\n msg = Drafty.parse(msg);\n this.applyMentionResolution(msg);\n }\n msg = Drafty.append(Drafty.sanitizeEntities(this.state.reply.content), msg);\n }\n this.handleCancelReply();\n } else if (typeof msg == 'string' && this.mentionedUsers && this.mentionedUsers.length) {\n // 4.2-4.3 @提醒:Drafty.parse 本来就会把纯文本里的\"@word\"自动识别成 MN 实体,但\n // data.val 存的是匹配到的原始文字(tinode.dev.js 的 ENTITY_TYPES 表,pack: val =>\n // ({val: val.slice(1)})),不是 uid——那是纯文本解析器,不可能凭空知道 uid。真正的 uid\n // 只在用户从选择器里点选时才知道,记在 this.mentionedUsers 里;这里按显示名回填,把\n // 自动识别出的占位符换成真的 uid。没有任何选过的提醒时完全不碰 msg,维持字符串原样,\n // 交给 SDK 自己在更底层 parse(跟这次改动之前完全一样的行为,不引入任何差异)。\n const parsed = Drafty.parse(msg);\n this.applyMentionResolution(parsed);\n msg = parsed;\n }\n // Was only cleared on topic switch -- picking someone from the @提醒 picker once left them\n // resolvable for every later message in the same topic too, so literal text \"@张三\" typed by\n // hand, pasted, or quoted from someone else in a LATER, unrelated message would silently turn\n // into a real mention of whoever was last picked under that name. A retry of a failed send\n // (retrySend) reuses the already-resolved Drafty content stored on the failed pub, not this\n // array, so clearing it here doesn't affect retries.\n this.mentionedUsers = [];\n if (this.mentionAllPending) {\n // server/topic.go's validateAndNormalizeMentions reads head.mention_all directly -- it's a\n // separate signal from the Drafty MN entity the \"@所有人\" text itself auto-parses into (that\n // entity has no real uid and is purely decorative here, same as any other unresolved mention).\n // Reset immediately after reading, same lifecycle as this.mentionedUsers just above -- a\n // \"所有人\" pick should only apply to the one message being sent right now, not linger into\n // later ones in the same topic.\n head = {...(head || {}), mention_all: true};\n this.mentionAllPending = false;\n }\n if (typeHint) {\n head = {...(head || {}), 'x-im-type': typeHint};\n }\n\n const topicForDraft = this.state.topic;\n // Captured now, not re-read inside the .then() below -- by the time send actually resolves\n // the user may have switched topics, and clearDraft falling back to a hardcoded 0 runs into\n // the same backend version=0-skips-the-lock issue explained in handleComposerChange above.\n const draftVersionAtSend = this.state.draftVersion || 0;\n const doSend = () => {\n const result = this.props.sendMessage(msg, uploadCompletionPromise, uploader, head);\n // Only a plain-text compose (not a reply/edit/forward, all of which pass a Drafty object or\n // reuse contentToEdit rather than the persisted draft) has a server-side draft worth clearing.\n if (originalText != null && result && typeof result.then == 'function' && topicForDraft) {\n result.then(() => this.clearDraft(topicForDraft, draftVersionAtSend));\n }\n return result;\n };\n\n // Pre-send URL risk check (POST /security/urls/check) -- the only Ch.11 \"anti-fraud\" mechanism\n // with a real backend behind it. Only plain-text composed messages are checked (not forwards,\n // uploads, or already-Drafty content) since that's the one path a URL could plausibly be typed in.\n // Returns a promise resolving to `false` when the message was NOT sent (blocked/cancelled) so\n // send-message.jsx can leave the composer text intact instead of optimistically clearing it --\n // without this, a blocked message's text would just vanish with no failed-message trace to retry.\n // Was missing the `g` flag -- .match() without it only ever returns the FIRST url in the message,\n // so a second url (e.g. the phishing link in \"看这个 https://safe.example.com 但是别信这个\n // https://phish.example.com/login?token=abc\") never got checked at all as long as the first one\n // came back `allow`. Check every distinct url in the message and act on the riskiest verdict.\n const urlMatches = originalText && originalText.match(/https?:\\/\\/\\S+/g);\n if (urlMatches) {\n const RISK_RANK = {block: 2, warn: 1, allow: 0};\n const urls = Array.from(new Set(urlMatches));\n return Promise.all(urls.map(url => checkURL(url, 'message_compose'))).then(results => {\n const result = results.reduce((worst, r) => (RISK_RANK[r.decision] || 0) > (RISK_RANK[worst.decision] || 0) ? r : worst);\n if (result.decision === 'allow') {\n return doSend();\n }\n return new Promise(resolve => {\n // riskDialog is a single slot -- if an earlier risk check is still awaiting the user's\n // decision (two messages sent in quick succession, both flagged), overwriting it here\n // would leave that first promise permanently unresolved and its message silently dropped\n // with send-message.jsx never told to stop holding it as unsent. Resolving it `false` first\n // means it's treated the same as the user cancelling it -- lost, but not hung forever.\n if (this.state.riskDialog) this.state.riskDialog.resolve(false);\n this.setState({riskDialog: {blocked: result.decision === 'block', challengeId: result.risk_challenge_id, send: doSend, resolve}});\n });\n }).catch(_ => doSend()); // Don't let a risk-check failure block sending altogether.\n }\n\n return doSend();\n }\n\n handleRiskConfirm() {\n const dialog = this.state.riskDialog;\n if (!dialog) return;\n this.setState({riskDialog: null});\n const finish = () => dialog.resolve(dialog.send());\n if (dialog.challengeId) {\n confirmRiskChallenge(dialog.challengeId, 'continue').then(finish).catch(finish);\n } else {\n finish();\n }\n }\n\n handleRiskCancel() {\n const dialog = this.state.riskDialog;\n if (!dialog) return;\n this.setState({riskDialog: null});\n if (dialog.challengeId && !dialog.blocked) {\n confirmRiskChallenge(dialog.challengeId, 'cancel').catch(_ => {});\n }\n dialog.resolve(false);\n }\n\n // Retry sending a message.\n retrySend(pub) {\n this.props.sendMessage(pub.content, undefined, undefined, pub.head)\n .then(_ => {\n // All good. Remove the original message draft from the cache.\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.delMessagesList([pub.seq], true);\n });\n }\n\n // sendFileAttachment sends the file as Drafty message:\n // - if file is too large, upload it and send a s link.\n // - if file is small enough, just send it in-band.\n sendFileAttachment(file) {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (TheCard.isFileSupported(file.type, file.name) || file.type == TheCard.contentType) {\n // This is a vCard file, try to convert and send as TheCard.\n if (this.sendTheCardAttachment(file, maxInbandAttachmentSize)) {\n // Successfully sent as TheCard.\n return;\n }\n // Sending as TheCard failed, fall through to sending as generic file attachment.\n }\n\n // If the attachment is a JSON file, then use 'application/octet-stream' instead of 'application/json'.\n // This is a temporary workaround for the collision with the 'application/json' MIME type of form responses.\n // Remove this code in 2026 or so.\n const jsonMimeConverter = (fileType) => fileType === DRAFTY_FR_MIME_TYPE_LEGACY ? 'application/octet-stream' : fileType;\n\n if (file.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = createChatUploader(this.props.tinode);\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(file);\n const msg = Drafty.attachFile(null, {\n mime: jsonMimeConverter(file.type),\n filename: file.name,\n size: file.size,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader, 'file');\n } else {\n // Small enough to send inband.\n fileToBase64(file)\n .then(b64 => this.sendMessage(Drafty.attachFile(null, {\n mime: jsonMimeConverter(b64.mime),\n data: b64.bits,\n filename: b64.name,\n size: file.size\n }), undefined, undefined, 'file'))\n .catch(err => this.props.onError(err.message, 'err'));\n }\n }\n\n // Convert attached vCard to TheCard and send.\n sendTheCardAttachment(file, maxInbandAttachmentSize) {\n if (file.size > maxInbandAttachmentSize) {\n // Cannot convert to TheCard, send as a generic file attachment instead.\n return false;\n }\n\n if (file.type == TheCard.contentType) {\n // Already TheCard, no need to convert.\n this.sendMessage(Drafty.appendTheCard(null, file.object));\n return true;\n }\n\n importVCard(file)\n .then(card => {\n this.sendMessage(Drafty.appendTheCard(null, card));\n })\n .catch(err => {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_parse_vcard, {error: err.message}), 'err');\n });\n return true;\n }\n\n // handleAttachFile method is called when [Attach file] button is clicked: launch attachment preview.\n handleAttachFile(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.size > maxExternAttachmentSize) {\n // Too large.\n this.props.onError(this.props.intl.formatMessage(messages.file_attachment_too_large,\n {size: bytesToHumanSize(file.size), limit: bytesToHumanSize(maxExternAttachmentSize)}), 'err');\n } else {\n this.setState({\n docPreview: {\n file: file,\n name: file.name,\n size: file.size,\n type: file.type\n }\n });\n }\n }\n\n handleCallHangup(topic, seq) {\n this.props.onVideoCallClosed();\n this.setState({\n rtcPanel: null\n });\n this.props.onCallHangup(topic, seq);\n }\n\n handleCallPanelToggle() {\n this.setState({minimizedCallPanel: !this.state.minimizedCallPanel});\n }\n\n // sendImageAttachment sends the image bits as Drafty message.\n sendImageAttachment(caption, blob) {\n const mime = this.state.imagePreview.mime;\n const width = this.state.imagePreview.width;\n const height = this.state.imagePreview.height;\n const fname = this.state.imagePreview.filename;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (blob.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = createChatUploader(this.props.tinode);\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(blob);\n\n // Make small preview to show while uploading.\n imageScaled(blob, IMAGE_PREVIEW_DIM, IMAGE_PREVIEW_DIM, -1, false)\n // Convert tiny image into base64 for serialization and previewing.\n .then(scaled => blobToBase64(scaled.blob))\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: mime,\n _tempPreview: b64.bits, // This preview will not be serialized.\n bits: b64.bits, // Image thumbnail.\n width: width,\n height: height,\n filename: fname,\n size: blob.size,\n urlPromise: uploadCompletionPromise\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader, 'image');\n })\n .catch(err => this.props.onError(err, 'err'));\n return;\n }\n\n // Send the image inband if it's not too big. The image has been scaled already\n // in image preview.\n blobToBase64(blob)\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: b64.mime,\n bits: b64.bits,\n width: width,\n height: height,\n filename: fname,\n size: blob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n this.sendMessage(msg, undefined, undefined, 'image');\n });\n }\n\n // sendVideoAttachment sends the video bits as Drafty message.\n sendVideoAttachment(caption, videoBlob, previewBlob, params) {\n const width = params.width;\n const height = params.height;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n const uploads = [];\n let uploader;\n if ((videoBlob.size + previewBlob.size) > maxInbandAttachmentSize) {\n // One or both are too large to send inband. Uploading out of band and sending as a link.\n uploader = createChatUploader(this.props.tinode);\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n\n uploads[0] = videoBlob.size > maxInbandAttachmentSize * 0.675 ? uploader.upload(videoBlob) : null;\n uploads[1] = previewBlob.size > maxInbandAttachmentSize * 0.275 ? uploader.upload(previewBlob) : null;\n }\n\n if (uploads.length == 0) {\n // Both video and preview are small enough to send inband.\n Promise.all([blobToBase64(videoBlob), blobToBase64(previewBlob)])\n .then(b64s => {\n const [v64, i64] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: v64.mime,\n bits: v64.bits,\n preview: i64.bits,\n premime: i64.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n this.sendMessage(msg, undefined, undefined, 'video');\n });\n return;\n }\n\n const uploadCompletionPromise = Promise.all(uploads);\n\n const b64conv = [];\n // Small video converted to base64.\n b64conv[0] = uploads[0] ? null : blobToBase64(videoBlob);\n // Full-size preview fits inline.\n b64conv[1] = uploads[1] ? null : imageScaled(previewBlob, MAX_IMAGE_DIM, MAX_IMAGE_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n // Small preview to show while uploading.\n b64conv[2] = imageScaled(previewBlob, VIDEO_PREVIEW_DIM, VIDEO_PREVIEW_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n // Convert tiny image into base64 for serialization and previewing.\n Promise.all(b64conv)\n .then(b64s => {\n const [video, img, preview] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: params.mime,\n bits: video ? video.bits : null,\n _tempPreview: preview.bits,\n preview: img ? img.bits : preview.bits,\n premime: img ? img.mime : preview.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size,\n urlPromise: uploadCompletionPromise\n });\n\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader, 'video');\n })\n .catch(err => this.props.onError(err.message, 'err'));\n }\n\n // handleAttachImageOrVideo method is called when [Attach image or video] button is clicked: launch image or video preview.\n handleAttachImageOrVideo(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.type.startsWith('video/')) {\n this.setState({videoPreview: {\n url: URL.createObjectURL(file),\n blob: file,\n filename: file.name,\n size: file.size,\n mime: file.type\n }});\n return;\n }\n\n // Get image dimensions and size, optionally scale it down.\n imageScaled(file, MAX_IMAGE_DIM, MAX_IMAGE_DIM, maxExternAttachmentSize, false)\n .then(scaled => {\n this.setState({imagePreview: {\n url: URL.createObjectURL(scaled.blob),\n blob: scaled.blob,\n filename: scaled.name,\n width: scaled.width,\n height: scaled.height,\n size: scaled.blob.size,\n mime: scaled.mime\n }});\n }).catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n // handleFileDrop is called when the user drags & drops a file upon the message view.\n handleFileDrop(files) {\n if (!files || files.length == 0) {\n return;\n }\n const file = files[0];\n if (file.type && file.type.startsWith('image/')) {\n this.handleAttachImageOrVideo(file);\n } else {\n this.handleAttachFile(file);\n }\n }\n\n // sendAudioAttachment sends audio bits inband as Drafty message (no preview).\n sendAudioAttachment(url, preview, duration) {\n fetch(url)\n .then(result => result.blob())\n .then(blob => {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = this.props.tinode.getServerParam('maxMessageSize', MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024;\n if (blob.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = createChatUploader(this.props.tinode);\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(blob);\n const msg = Drafty.appendAudio(null, {\n mime: blob.type,\n size: blob.size,\n duration: duration,\n preview: preview,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader, 'voice');\n } else {\n // Small enough to send inband.\n blobToBase64(blob)\n .then(b64 => {\n this.sendMessage(Drafty.appendAudio(null, {\n mime: b64.mime,\n bits: b64.bits,\n size: blob.size,\n duration: duration,\n preview: preview,\n }), undefined, undefined, 'voice')\n })\n }\n })\n .catch(err => {this.props.onError(err.message, 'err')});;\n }\n\n handleCancelUpload(seq, uploader) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const found = topic.findMessage(seq);\n if (found) {\n found._cancelled = true;\n }\n uploader.cancel();\n }\n\n // seq: seq ID of the source message\n // context: message content.\n // senderId: UID of the sender of the source message.\n // senderName: full name of the sender of the original message.\n handlePickReply(seq, content, senderId, senderName) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, QUOTED_REPLY_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(senderName, senderId, content),\n seq: seq\n }\n });\n this.props.onCancelForwardMessage();\n }\n\n // seq: seq ID of the message to edit.\n // context: message content.\n handleEditMessage(seq, content) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n const editable = Drafty.toMarkdown(content);\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, EDIT_PREVIEW_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(this.props.intl.formatMessage(messages.editing_message), null, content),\n seq: seq,\n editing: true\n },\n contentToEdit: editable\n });\n this.props.onCancelForwardMessage();\n }\n\n\n handleCancelReply() {\n this.setState({reply: null, contentToEdit: null});\n this.props.onCancelForwardMessage();\n }\n\n handleQuoteClick(replyToSeq) {\n const ref = this.getOrCreateMessageRef(replyToSeq);\n if (ref && ref.current) {\n ref.current.scrollIntoView({block: \"center\", behavior: \"smooth\"});\n ref.current.classList.add('flash');\n setTimeout(_ => {ref.current.classList.remove('flash')} , 1000);\n } else {\n // Most commonly hit when the target message was deleted/recalled after being found by\n // Ch.7 chat-history search but before this click -- never gets a ref\n // (see jumpToMessage below), so without this the click did nothing visible at all.\n console.error(\"Unresolved message ref\", replyToSeq);\n if (this.props.onError) {\n this.props.onError('该消息已被删除或撤回', 'err');\n }\n }\n }\n\n // Ch.7 chat-history search result -> jump to the message in the real conversation. handleQuoteClick\n // only scrolls to a message already present in this topic's locally-cached message list (used\n // elsewhere for quoted-reply/pinned-message jumps, where that's always true); a search result can\n // point at a message far outside whatever window happens to be loaded, so fetch a window around it\n // first via the native SDK (not the REST search API -- handleQuoteClick reads refs off the SDK's own\n // local topic cache, so the data has to land there, which only getMeta does).\n jumpToMessage(seq) {\n const topic = this.props.tinode && this.props.topic ? this.props.tinode.getTopic(this.props.topic) : null;\n if (!topic || !seq || isNaN(seq)) {\n return;\n }\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'jumpseq'));\n const jump = () => window.setTimeout(() => this.handleQuoteClick(seq), 150);\n if (topic.findMessage(seq)) {\n jump();\n } else {\n topic.getMeta(topic.startMetaQuery().withData(Math.max(1, seq - 20), seq + 21, 41).build())\n .then(jump).catch(err => this.props.onError(err.message, 'err'));\n }\n }\n\n handleUnpinMessage(seq) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.pinMessage(seq, false);\n }\n\n isDragEnabled() {\n // Same editing-state guard as the attach-panel props in render() (see the `editingMessage`\n // local there) -- drag&drop is a second, independent path into handleFileDrop below, which\n // calls handleAttachImageOrVideo/handleAttachFile directly rather than through those props, so\n // gating only the props left this route as a full bypass of that guard: dropping a file while\n // editing a message (without touching the \"+\" button at all) still replaced the edited\n // message's content via sendMessage's head.replace, with no confirmation.\n const editingMessage = !!(this.state.reply && this.state.reply.editing);\n return this.state.isWriter && !this.state.unconfirmed && !this.props.forwardMessage &&\n !this.state.peerMessagingDisabled && !editingMessage;\n }\n\n handleDragStart(e) {\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.clearData();\n }\n\n handleDragIn(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter++;\n if (e.dataTransfer.items && e.dataTransfer.items.length > 0) {\n this.setState({dragging: true});\n }\n }\n\n handleDragOut(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter--;\n if (this.dragCounter <= 0) {\n this.setState({dragging: false});\n }\n }\n\n handleDrag(e) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n handleDrop(e) {\n e.preventDefault();\n e.stopPropagation();\n this.setState({dragging: false});\n if (this.isDragEnabled() && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n this.handleFileDrop(e.dataTransfer.files);\n this.dragCounter = 0;\n }\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n\n // P2P call is an overlay, not a separate component because it cannot be\n // re-mounted between full screen/minimized.\n const overlay = this.state.rtcPanel &&\n }>\n \n ;\n\n const riskDialog = this.state.riskDialog &&\n ;\n\n let component;\n if (!this.state.topic) {\n component = ;\n\n } else {\n let component2;\n if (this.state.imagePreview) {\n // Preview image before sending.\n component2 = (\n }>\n \n \n );\n } else if (this.state.videoPreview) {\n // Preview video.\n component2 = }>\n \n ;\n\n } else if (this.state.imagePostview) {\n // Expand received image.\n component2 = }>\n \n ;\n\n } else if (this.state.videoPostview) {\n // Play received video.\n component2 = }>\n \n ;\n\n } else if (this.state.docPreview) {\n // Preview attachment before sending.\n if (TheCard.isFileSupported(this.state.docPreview.type, this.state.docPreview.name) ||\n this.state.docPreview.type == TheCard.contentType) {\n component2 = }>\n \n ;\n } else {\n component2 = }>\n \n ;\n }\n } else {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const isChannel = topic.isChannelType() || topic.chan;\n const groupTopic = topic.isGroupType() && !isChannel;\n const icon_badges = [];\n if (topic.trusted) {\n if (topic.trusted.verified) {\n icon_badges.push({icon: 'verified', color: 'badge-inv'});\n }\n if (topic.trusted.staff) {\n icon_badges.push({icon: 'staff', color: 'badge-inv'});\n }\n if (topic.trusted.danger) {\n icon_badges.push({icon: 'dangerous', color: 'badge-inv'});\n }\n }\n\n const pinnedMessages = [];\n this.state.pins.forEach(seq => pinnedMessages.push(topic.latestMsgVersion(seq) || topic.findMessage(seq)));\n\n const messageNodes = [];\n let previousFrom = null;\n let prevDate = null;\n let chatBoxClass = null;\n topic.messages((msg, prev, next, i) => {\n let nextFrom = next ? (next.from || 'chan') : null;\n\n let sequence = 'single';\n let thisFrom = msg.from || 'chan';\n if (thisFrom == previousFrom) {\n if (thisFrom == nextFrom) {\n sequence = 'middle';\n } else {\n sequence = 'last';\n }\n } else if (thisFrom == nextFrom) {\n sequence = 'first';\n }\n previousFrom = thisFrom;\n\n const isReply = !(thisFrom == this.props.myUserId);\n const deliveryStatus = topic.msgStatus(msg, true);\n\n let userFrom = thisFrom, userName, userAvatar;\n const user = topic.userDesc(thisFrom);\n if (user && user.public) {\n userName = user.public.fn;\n userAvatar = makeImageUrl(user.public.photo);\n }\n chatBoxClass = groupTopic ? 'chat-box group' : 'chat-box';\n\n // Ref for this chat message.\n const ref = this.getOrCreateMessageRef(msg.seq);\n let replyToSeq = msg.head ? parseInt(msg.head.reply) : null;\n if (!replyToSeq || isNaN(replyToSeq)) {\n replyToSeq = null;\n }\n\n if (msg.hi) {\n // Deleted message.\n messageNodes.push(\n \n );\n } else {\n const thisDate = new Date(msg.ts);\n // This message was sent on a different date than the previous.\n if (!prevDate || prevDate.toDateString() != thisDate.toDateString()) {\n messageNodes.push(\n \n );\n prevDate = thisDate;\n }\n messageNodes.push(\n \n );\n }\n });\n\n let lastSeen = null;\n if (isChannel) {\n if (topic.subcnt) {\n lastSeen = formatMessage(messages.subscriber_count, {count: topic.subcnt});\n }\n } else {\n const cont = this.props.tinode.getMeTopic().getContact(this.state.topic);\n if (cont) {\n if (Tinode.isP2PTopicName(cont.topic)) {\n if (cont.online) {\n lastSeen = formatMessage(messages.online_now);\n } else if (cont.seen) {\n lastSeen = formatMessage(messages.last_seen,\n {timestamp: shortDateFormat(cont.seen.when, this.props.intl.locale)});\n // TODO: also handle user agent in c.seen.ua\n }\n } else if (Tinode.isGroupTopicName(cont.topic)) {\n if (topic.subcnt) {\n lastSeen = formatMessage(messages.member_count, {count: topic.subcnt});\n }\n }\n }\n }\n const avatar = this.state.avatar || true;\n const online = this.state.deleted || topic.isSelfType() ? null :\n this.props.online ? 'online' + (this.state.typingIndicator ? ' typing' : '') : 'offline';\n\n const titleClass = 'panel-title' + (this.state.deleted ? ' deleted' : '');\n const darkModeClass = this.props.colorSchema == 'dark' ? 'dark' : '';\n // sendMessage() unconditionally sends whatever content it's given with head={replace:...}\n // while this.state.reply.editing is set (see sendMessage above) -- it has no way to tell\n // \"the user is still editing the original text\" apart from \"the user just picked a photo/\n // file/card/favorite from the attachment panel while that edit was still open\". Gating the\n // attach entry points closed here (same mechanism already used for forwardMessage below) is\n // simpler and safer than trying to teach sendMessage to distinguish those cases after the fact.\n const editingMessage = !!(this.state.reply && this.state.reply.editing);\n\n let messagesComponent = (\n <>\n {this.state.groupAnnouncement ?\n \n campaign \n {this.state.groupAnnouncement.content} \n chevron_right \n : null}\n {this.state.pendingJoinRequests > 0 ?\n \n person_add_alt \n 新邀请进群申请({this.state.pendingJoinRequests}) \n chevron_right \n : null}\n \n
\n arrow_downward \n \n
\n {!this.state.isReader ?\n
\n {this.state.readingBlocked ?\n
\n \n
\n : null }\n
\n : null }\n
\n check {this.state.toast}\n
\n
\n {this.state.peerMessagingDisabled && !this.state.unconfirmed ?\n : null}\n {!this.state.unconfirmed && this.state.relationshipContext &&\n this.state.relationshipContext.relationship == 'pending_inbound' ?\n 以上是打招呼的消息
: null}\n {!this.state.unconfirmed && this.state.relationshipContext &&\n this.state.relationshipContext.relationship == 'pending_outbound' ?\n 好友申请正在等待处理
: null}\n {!this.state.unconfirmed && this.state.relationshipContext &&\n this.state.relationshipContext.relationship == 'none' ?\n : null}\n {this.props.selectMode ?\n \n : this.state.unconfirmed ?\n \n :\n }\n >\n );\n\n component2 = (\n <>\n \n {this.props.displayMobile ?\n <>\n {this.state.pins.length > 0 ?\n this.setState({selectedPin: index})}\n onSelected={this.handleQuoteClick}\n onCancel={this.handleUnpinMessage} />\n : null\n }\n \n >\n : null}\n \n {messagesComponent}\n {this.state.dragging && this.isDragEnabled() ?\n {formatMessage(messages.drag_file)}
\n : null}\n >\n );\n }\n component = {component2}{overlay}{riskDialog}
\n }\n return component;\n }\n};\n\nexport default injectIntl(MessagesView);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport FileProgress from './file-progress.jsx';\nimport { createFileDownloader } from '../lib/im-api.js';\nimport { bytesToHumanSize } from '../lib/strformat.js';\nimport { isUrlRelative, sanitizeUrl } from '../lib/utils.js';\n\n// Same broad-category icon+color convention already established for file cards elsewhere\n// (content-library-view.jsx / group-management-view.jsx's FILE_TYPE_META) -- this was the one place\n// that never adopted it and instead used the same generic gray icon for every attachment regardless\n// of type. This client-side mime sniff exists only because chat attachments (unlike a group file\n// or a favorite) don't carry a server-computed file_type field to look up directly.\nconst ATTACHMENT_TYPE_META = {image: ['image', '#3ba55c'], video: ['videocam', '#3b82c4'], audio: ['audiotrack', '#8b5cf6'], document: ['description', '#e05d44'], file: ['insert_drive_file', '#8a8f98']};\nfunction attachmentTypeFromMime(mime) {\n const m = (mime || '').toLowerCase();\n if (m.startsWith('image/')) return 'image';\n if (m.startsWith('video/')) return 'video';\n if (m.startsWith('audio/')) return 'audio';\n if (m === 'application/pdf' || m === 'text/plain' || m.includes('msword') || m.includes('wordprocessingml') ||\n m.includes('spreadsheetml') || m.includes('presentationml') || m === 'application/vnd.ms-excel' || m === 'application/vnd.ms-powerpoint') {\n return 'document';\n }\n return 'file';\n}\n\nexport default class Attachment extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n downloader: null,\n progress: 0\n };\n\n this.downloadFile = this.downloadFile.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n downloadFile(url, filename, mimetype) {\n if (!url) {\n this.props.onError(\"Invalid download URL '\" + url + \"'\");\n return;\n }\n\n // Same wrong-header bug as content-library-view.jsx's DownloadPage (X-Tinode-APIKey/\n // X-Tinode-Auth, neither recognized by this backend) -- confirmed live: clicking \"保存\" on any\n // real chat file attachment 403'd with \"valid API key required\". createFileDownloader() is the\n // fixed-headers drop-in with the same download()/cancel() interface.\n const downloader = createFileDownloader(this.props.tinode);\n this.setState({downloader: downloader});\n downloader.download(url, filename, mimetype,\n loaded => this.setState({progress: loaded / this.props.size}),\n err => this.props.onError(err, 'err')\n )\n .then(_ => this.setState({downloader: null, progress: 0}))\n .catch(err => {\n if (err) {\n this.props.onError(\"Error downloading file: \" + err.message, 'err');\n }\n this.setState({downloader: null, progress: 0});\n });\n }\n\n handleCancel() {\n if (this.props.uploading) {\n this.props.onCancelUpload();\n } else if (this.state.downloader) {\n this.state.downloader.cancel();\n }\n }\n\n render() {\n let filename = this.props.filename || 'file_attachment';\n if (filename.length > 36) {\n filename = filename.substr(0, 16) + '...' + filename.substr(-16);\n }\n let size = this.props.size > 0 ?\n ({bytesToHumanSize(this.props.size)}) :\n null;\n\n // Detect if the download URL is relative or absolute.\n // If the URL is relative use LargeFileHelper to attach authentication\n // credentials to the request.\n let url, helperFunc;\n if (!this.props.uploading && !this.state.downloader && isUrlRelative(this.props.downloadUrl)) {\n // Relative URL. Use download helper.\n url = '#';\n helperFunc = (e) => {\n e.preventDefault();\n this.downloadFile(this.props.downloadUrl, this.props.filename, this.props.mimetype);\n };\n } else {\n url = sanitizeUrl(this.props.downloadUrl);\n helperFunc = null;\n }\n const downloadWidget = <>file_download >;\n const [icon, color] = ATTACHMENT_TYPE_META[attachmentTypeFromMime(this.props.mimetype)];\n return (\n \n
{icon}
\n
\n
{filename} {size}
\n {this.props.uploading || this.state.downloader ?\n
\n :\n
\n }\n
\n
\n );\n }\n};\n","// Single chat message bubble, sent or received.\n\nimport React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\nimport { Drafty, Tinode, TheCard } from 'tinode-sdk';\n\nimport Attachment from './attachment.jsx';\nimport ForwardBundle from './forward-bundle.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport ReceivedMarker from './received-marker.jsx'\n\nimport { fullFormatter } from '../lib/formatters.js';\nimport { sanitizeUrl } from '../lib/utils.js';\nimport HashNavigation from '../lib/navigation.js';\n\n// 4.9 语音未读红点:纯客户端概念,没有对应的后端字段——原生 Tinode 的 recv/read 只标记到\n// \"这条消息本身有没有被看到\",跟\"这条语音有没有被真的点开听过\"是两回事(文字消息看一眼就算\n// 读过,语音消息可能只是划过去、根本没点开播放)。按话题分别记一份\"已播放过的 seq 集合\"在\n// localStorage,跟\"最近使用表情\"是同一类不需要后端参与的本地小状态。\n// Key还要按登录账号分——P2P话题名本身就是对方user_id,跟\"我是谁\"无关;这个应用已知同一浏览器\n// origin下多个账号共享localStorage(多标签页各自登录不同账号),不带uid会导致账号A点开播放过\n// 的语音,在账号B自己与同一个人/同一个群的独立会话里也显示成\"已读\"。\nconst VOICE_PLAYED_KEY_PREFIX = 'im-voice-played:';\nfunction isVoicePlayed(myUid, topic, seq) {\n try {\n const list = JSON.parse(localStorage.getItem(VOICE_PLAYED_KEY_PREFIX + myUid + ':' + topic) || '[]');\n return Array.isArray(list) && list.includes(seq);\n } catch (_) {\n return false;\n }\n}\nfunction markVoicePlayed(myUid, topic, seq) {\n try {\n const key = VOICE_PLAYED_KEY_PREFIX + myUid + ':' + topic;\n const list = JSON.parse(localStorage.getItem(key) || '[]');\n const set = Array.isArray(list) ? list : [];\n if (!set.includes(seq)) {\n // Cap so a very long-lived topic doesn't grow this without bound.\n localStorage.setItem(key, JSON.stringify(set.concat(seq).slice(-500)));\n }\n } catch (_) { /* ignore */ }\n}\n\nclass BaseChatMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n progress: 0,\n voicePlayed: isVoicePlayed(props.tinode.getCurrentUserID(), props.topic, props.seq)\n };\n\n if (props.uploader) {\n props.uploader.onProgress = this.handleProgress.bind(this);\n }\n\n this.handleExpandImage = this.handleExpandImage.bind(this);\n this.handlePlayVideo = this.handlePlayVideo.bind(this);\n this.handleFormButtonClick = this.handleFormButtonClick.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.handleDraftyClick = this.handleDraftyClick.bind(this);\n this.handleVoicePlayed = this.handleVoicePlayed.bind(this);\n\n this.formatterContext = {\n formatMessage: props.intl.formatMessage.bind(props.intl),\n viewportWidth: props.viewportWidth,\n authorizeURL: props.tinode.authorizeURL.bind(props.tinode),\n\n onHandleClick: this.handleDraftyClick,\n // formatters.js's 'AU' case wires this to AudioPlayer's onPlay -- see handleVoicePlayed below\n // for why this needs to live on the instance (closes over this specific message's seq/topic)\n // rather than being a static, prop-derived value like the other formatterContext entries.\n onVoicePlayed: this.handleVoicePlayed\n };\n }\n\n handleDraftyClick = (e, action) => {\n switch (action) {\n case 'image':\n this.handleExpandImage(e);\n break;\n case 'video':\n this.handlePlayVideo(e);\n break;\n case 'form_button':\n this.handleFormButtonClick(e);\n break;\n case 'quote':\n this.handleQuoteClick(e);\n break;\n case 'contact_chat':\n e.preventDefault();\n try {\n // tinode:topic/usr123abc -> usr123abc\n const pathname = new URL(e.target.dataset.val)?.pathname;\n const parts = pathname.split('/').filter(Boolean);\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', parts.pop() || ''));\n } catch (error) {\n console.error(\"Invalid URL:\", error);\n }\n break;\n case 'contact_find':\n e.preventDefault();\n let hashUrl = HashNavigation.setUrlSidePanel(window.location.hash, 'newtpk');\n hashUrl = HashNavigation.addUrlParam(hashUrl, 'q', e.target.dataset.val);\n hashUrl = HashNavigation.addUrlParam(hashUrl, 'tab', 'find');\n HashNavigation.navigateTo(hashUrl);\n break;\n default:\n // No special handling; let the browser deal with it.\n console.info('Unhandled drafty action.', action, e.target.dataset);\n break;\n }\n }\n\n handleExpandImage(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n url: e.target.src,\n filename: e.target.dataset.name,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n\n handlePlayVideo(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n video: true,\n url: e.target.dataset.src,\n preview: e.target.src,\n filename: e.target.dataset.name,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n duration: e.target.dataset.duration,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n\n handleFormButtonClick(e) {\n e.preventDefault();\n const data = {\n seq: this.props.seq\n };\n data.resp = {};\n if (e.target.dataset.name) {\n data.resp[e.target.dataset.name] = e.target.dataset.val ? e.target.dataset.val :\n e.target.dataset.val === undefined ? 1 : '' + e.target.dataset.val;\n }\n if (e.target.dataset.act == 'url') {\n data.ref = sanitizeUrl(e.target.dataset.ref) || 'about:blank';\n }\n const text = e.target.dataset.title || 'unknown';\n this.props.onFormResponse(e.target.dataset.act, text, data);\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const menuItems = [];\n if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {\n menuItems.push('menu_item_send_retry');\n }\n if (this.props.received > Tinode.MESSAGE_STATUS_FATAL) {\n if (this.props.userIsWriter) {\n menuItems.push('menu_item_reply');\n if (!this.props.response) {\n let immutable = false;\n Drafty.entities(this.props.content, (_0, _1, tp) => {\n immutable = ['AU', 'EX', 'FM', 'IM', 'TC', 'VC', 'VD'].includes(tp);\n return immutable;\n });\n if (!immutable) {\n Drafty.styles(this.props.content, tp => {\n immutable = ['QQ'].includes(tp);\n return immutable;\n });\n }\n if (!immutable) {\n menuItems.push('menu_item_edit');\n }\n }\n }\n if (this.props.userIsAdmin) {\n menuItems.push(this.props.pinned ? 'menu_item_unpin' : 'menu_item_pin');\n }\n }\n menuItems.push('menu_item_forward');\n\n this.props.showContextMenu({\n seq: this.props.seq,\n replace: this.props.edited ? parseInt(this.props.edited.split(':')[1]) : 0,\n content: this.props.content,\n head: this.props.head,\n userFrom: this.props.userFrom,\n userName: this.props.userName,\n y: e.pageY,\n x: e.pageX,\n pickReply: this.props.pickReply,\n editMessage: this.props.editMessage,\n timestamp: this.props.timestamp,\n }, menuItems);\n }\n\n handleProgress(ratio) {\n this.setState({progress: ratio});\n }\n\n handleCancelUpload() {\n this.props.onCancelUpload(this.props.seq, this.props.uploader);\n }\n\n handleVoicePlayed() {\n if (this.state.voicePlayed) {\n return;\n }\n markVoicePlayed(this.props.tinode.getCurrentUserID(), this.props.topic, this.props.seq);\n this.setState({voicePlayed: true});\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const replyToSeq = this.props.replyToSeq;\n if (replyToSeq) {\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n // Reason caption shown under a failed outgoing message in a 1:1 chat, based on the real\n // relationship state (see docs/images/个人对话—拉黑状态/已读状态.png and .../个人对话—删除状态.png).\n // Returns null for relationships that don't explain a send failure (friend, pending, unknown) so\n // a plain network failure doesn't get a misleading relationship-based caption.\n renderFailReason() {\n if (this.props.response ||\n (this.props.received != Tinode.MESSAGE_STATUS_FAILED && this.props.received != Tinode.MESSAGE_STATUS_FATAL)) {\n return null;\n }\n if (this.props.relationship == 'blocked_by_peer' || this.props.relationship == 'blocked_by_me') {\n return 消息已发送,但被对方拒收了
;\n }\n if (this.props.relationship == 'none') {\n return ;\n }\n return null;\n }\n\n render() {\n const sideClass = this.props.sequence + ' ' + (this.props.response ? 'left' : 'right');\n const bubbleClass = (this.props.sequence == 'single' || this.props.sequence == 'last') ? 'bubble tip' : 'bubble';\n const avatar = this.props.userAvatar || true;\n const isFailed = !this.props.response &&\n (this.props.received == Tinode.MESSAGE_STATUS_FAILED || this.props.received == Tinode.MESSAGE_STATUS_FATAL);\n const failReason = this.renderFailReason();\n // 4.9 语音未读红点:只对收到的(response=true)语音消息生效——自己发的语音不需要提醒自己听。\n let isVoiceMessage = false;\n if (this.props.response && this.props.mimeType == Drafty.getContentType() && Drafty.isValid(this.props.content)) {\n Drafty.entities(this.props.content, (_0, _1, tp) => {\n if (tp === 'AU') { isVoiceMessage = true; }\n return isVoiceMessage;\n });\n }\n const showVoiceUnreadDot = isVoiceMessage && !this.state.voicePlayed;\n let textSizeClass = 'message-content';\n const fullDisplay = (this.props.isGroup && this.props.response &&\n (this.props.sequence == 'single' || this.props.sequence == 'last'));\n\n let content = this.props.content;\n // Server-generated conversation notices (`system_notice`, e.g. `friend_added` sent once when two\n // users become friends -- see server's publishIMConversationSystemNotice) and group system-action\n // events (`system_action`, e.g. group_member_joined/join_request_approved/governance changes --\n // server/im_http.go's group event publishers) both carry a custom JSON shape\n // ({template, text, actors/actions, ...}), not Drafty and not a plain string, so without this\n // they fall through to the generic \"invalid content\" placeholder below -- a real, human-readable\n // message like \"有成员通过审批加入了群聊。\" was rendering as a bare warning icon. Reduce either to\n // its `text` upfront so the existing plain-string path renders it as an ordinary bubble -- these\n // are meant to read like a normal message, not a special banner.\n if (this.props.head && (this.props.head['x-im-type'] === 'system_notice' || this.props.head['x-im-type'] === 'system_action') &&\n content && typeof content == 'object' && typeof content.text == 'string') {\n content = content.text;\n }\n // 合并转发(服务端 mode=\"bundle\" 生成的消息)同样不是 Drafty,content 是\n // {bundle_id, title, item_count, preview, items, source_refs, comment}。不认这个类型的话\n // 一样会落到下面的 \"invalid content\" 兜底。渲染成一张可展开的\"聊天记录\"卡片。\n let bundleCard = null;\n if (this.props.head && this.props.head['x-im-type'] === 'forward_bundle' &&\n content && typeof content == 'object' && (content.items || content.preview)) {\n bundleCard = ;\n }\n const attachments = [];\n if (this.props.mimeType == Drafty.getContentType() && Drafty.isValid(content)) {\n Drafty.attachments(content, (att, i) => {\n if (Drafty.isFormResponseType(att.mime)) {\n // Don't show json drafty form response objects as attachments.\n // They are not meant for users.\n return;\n }\n attachments.push( );\n }, this);\n const tree = Drafty.format(content, fullFormatter, this.formatterContext);\n content = React.createElement(React.Fragment, null, tree);\n } else if (typeof content == 'string') {\n // Make font bigger for emoji-only messages.\n // Must use 'new RegExp(...)' because React does not like /{1-5}/.\n if (new RegExp('^\\\\p{RGI_Emoji}{1,5}$', 'v').test(content || '')) {\n // Content consists of 1-5 emoji characters. Count how many and use it to increase the font size.\n textSizeClass += ' emoji-' + (content || '').match(/\\p{RGI_Emoji}/vg).length;\n }\n } else {\n content = <>warning_amber \n >\n }\n\n return (\n \n {this.props.selectMode ?\n this.props.onToggleSelect(this.props.seq)}>\n {this.props.selected ? 'check_circle' : 'radio_button_unchecked'}\n : null}\n {this.props.isGroup && this.props.response ?\n \n {fullDisplay ?\n :\n null}\n
:\n null}\n {isFailed && failReason ?\n error : null}\n \n
\n {showVoiceUnreadDot ?
: null}\n
\n
\n {bundleCard || content}\n {attachments}\n
\n {this.props.timestamp ?\n
\n : null}\n
\n {this.props.showContextMenu && !this.props.selectMode ?\n
\n \n expand_more \n \n : null\n }\n
\n {failReason}\n {fullDisplay ?\n
\n {this.props.userName ||\n \n }\n {this.props.senderRole == 'owner' ? 群主 :\n this.props.senderRole == 'admin' ? 管理员 : null}\n
\n : null\n }\n
\n \n );\n }\n};\n\nconst IntlChatMessage = injectIntl(BaseChatMessage);\nconst ChatMessage = React.forwardRef((props, ref) => );\n\nexport default ChatMessage;\n","// 合并转发卡片(第4章 4.20)。\n//\n// 服务端在 `POST /v1/im/messages/forward` 的 mode=\"bundle\" 下会生成一条消息,\n// head 带 `x-im-type: \"forward_bundle\"`,content 形如:\n// {bundle_id, title, item_count, preview:[{from,type,summary,ts}], items:[...], source_refs, comment}\n// 这个结构不是 Drafty,所以不加这个渲染的话会落到 chat-message 的 \"invalid content\" 兜底。\n//\n// items[] 里已经带了每条被转发消息的完整快照,所以\"查看完整记录\"是就地展开,不需要额外请求。\nimport React from 'react';\n\n// 快照里的 from 是不带 usr 前缀的裸 uid(与收藏快照一致)。先补前缀再查本地会话缓存拿显示名,\n// 查不到就不显示发送者——宁可少一行,也不要把一串 uid 摆在摘要前面。\nfunction senderName(tinode, from) {\n const raw = (from || '').trim();\n if (!raw) return '';\n const uid = raw.startsWith('usr') ? raw : 'usr' + raw;\n const topic = tinode && tinode.getTopic ? tinode.getTopic(uid) : null;\n const pub = topic && topic.public;\n return (pub && (pub.fn || pub.name)) || '';\n}\n\nconst TYPE_LABEL = {image: '[图片]', video: '[视频]', voice: '[语音]', file: '[文件]', link: '[链接]'};\n\nfunction lineText(entry) {\n if (!entry) return '';\n const summary = (entry.summary || entry.text || '').trim();\n if (summary) return summary;\n return TYPE_LABEL[entry.type] || '';\n}\n\nexport default class ForwardBundle extends React.PureComponent {\n constructor(props) {\n super(props);\n this.state = {expanded: false};\n this.handleToggle = this.handleToggle.bind(this);\n }\n\n handleToggle(e) {\n e.preventDefault();\n e.stopPropagation();\n this.setState(s => ({expanded: !s.expanded}));\n }\n\n render() {\n const c = this.props.content || {};\n const count = Number(c.item_count) || (Array.isArray(c.items) ? c.items.length : 0);\n // 收起时用 preview(服务端已截到最多 3 条);展开时用 items(全量)。\n const rows = this.state.expanded ? (c.items || []) : (c.preview || []);\n const comment = (c.comment || '').trim();\n\n return \n
{c.title || '聊天记录'}
\n
\n {rows.map((entry, i) => {\n const who = senderName(this.props.tinode, entry.from);\n return \n {who ? {who}: : null}{lineText(entry)}\n ;\n })}\n \n {count > rows.length || this.state.expanded ?\n
\n {this.state.expanded ? '收起' : `查看完整记录(共 ${count} 条)`}\n :\n
共 {count} 条消息
}\n {comment ?
{comment}
: null}\n
;\n }\n}\n","// GroupSubs: a list of group subscribers currently online.\n// Show in the topic title bar\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { MAX_ONLINE_IN_TOPIC } from '../config.js'\n\nimport LetterTile from './letter-tile.jsx';\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class GroupSubs extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n const usersOnline = [];\n const totalCount = (this.props.subscribers || []).length;\n const countToShow = Math.min(MAX_ONLINE_IN_TOPIC, totalCount);\n\n (this.props.subscribers || []).some((sub) => {\n usersOnline.push(\n \n \n
\n );\n return usersOnline.length == countToShow;\n });\n if (usersOnline.length == 0) {\n return null;\n }\n return (\n {usersOnline} {totalCount > countToShow ?\n \n \n : null}\n
\n );\n }\n};\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Invitation extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleButtonAction = this.handleButtonAction.bind(this);\n }\n\n handleButtonAction(evt, data) {\n evt.preventDefault();\n this.props.onAction(data);\n }\n\n render() {\n return (\n \n
\n \n
\n
\n { this.handleButtonAction(event, \"accept\"); }}>\n \n \n { this.handleButtonAction(event, \"delete\"); }}>\n \n \n { this.handleButtonAction(event, \"block\"); }}>\n \n \n
\n
\n );\n }\n};\n","// Message bubble with non-payload content, such as an indicator of deleted content or a date stamp.\n\nimport React from 'react';\n\nexport default class MetaMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n let content = null;\n let bubbleClass = 'bubble';\n if (this.props.date) {\n // A date badge.\n content = <>{this.props.date}>\n bubbleClass += ' date';\n } else if (this.props.deleted) {\n // 撤回/删除占位。messages-view.jsx 对 msg.hi 的消息一直在传 deleted={true},但这里从来\n // 没有处理过这个分支,于是整个组件走到下面的 `return null` —— 撤回一条消息之后时间线上\n // 什么都不剩,看不出这里曾经有过一条消息。文案复用已有的 message_deleted(\"消息已删除\")。\n content = {this.props.deletedText || '消息已删除'} ;\n bubbleClass += ' date';\n }\n\n if (!content) {\n return <>{null}>\n }\n\n return (\n \n \n \n );\n }\n};\n","// Send message form.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { Drafty } from 'tinode-sdk';\n\nimport { previewFormatter } from '../lib/formatters.js';\nimport { MIN_SWIPE_DISTANCE } from '../config.js';\n\nconst messages = defineMessages({\n message_not_found: {\n id: 'message_not_found',\n defaultMessage: 'message not found',\n description: 'Pinned message is not found'\n },\n message_deleted: {\n id: 'message_deleted',\n defaultMessage: 'message deleted',\n description: 'Pinned message is deleted'\n }\n});\n\nclass PinnedMessages extends React.PureComponent {\n constructor(props) {\n super(props);\n\n // Starting location of the touch gesture.\n this.touchX = null;\n this.touchY = null;\n\n this.touchSurface = React.createRef();\n\n this.getSelectedIndex = this.getSelectedIndex.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n this.handleSelected = this.handleSelected.bind(this);\n this.handleMoveNext = this.handleMoveNext.bind(this);\n this.handleMovePrev = this.handleMovePrev.bind(this);\n this.handleTouchEventStart = this.handleTouchEventStart.bind(this);\n this.handleTouchEventEnd = this.handleTouchEventEnd.bind(this);\n this.handleTouchCancel = this.handleTouchCancel.bind(this);\n }\n\n componentDidMount() {\n this.touchSurface.current.addEventListener('touchstart', this.handleTouchEventStart, {passive: true});\n this.touchSurface.current.addEventListener('touchend', this.handleTouchEventEnd, {passive: true});\n this.touchSurface.current.addEventListener('touchcancel', this.handleTouchCancel, {passive: true});\n }\n\n componentWillUnmount() {\n this.touchSurface.current.removeEventListener('touchstart', this.handleTouchEventStart);\n this.touchSurface.current.removeEventListener('touchend', this.handleTouchEventEnd);\n this.touchSurface.current.removeEventListener('touchcancel', this.handleTouchCancel);\n }\n getSelectedIndex() {\n const list = (this.props.pins || []);\n return list.length - this.props.selected - 1;\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel(this.props.pins[this.getSelectedIndex()]);\n }\n\n handleSelected(e) {\n e.preventDefault();\n this.props.onSelected(this.props.pins[this.getSelectedIndex()]);\n }\n\n handleMoveNext(e, isTouch) {\n // Don't call preventDefault for touch events.\n isTouch || e.preventDefault();\n e.stopPropagation();\n const idx = Math.max(this.props.selected - 1, 0);\n if (idx != this.props.selected) {\n this.props.setSelected(idx);\n }\n }\n\n handleMovePrev(e, isTouch) {\n // Don't call preventDefault for touch events.\n isTouch || e.preventDefault();\n e.stopPropagation();\n const idx = Math.min(this.props.selected + 1, (this.props.pins || []).length - 1);\n if (idx != this.props.selected) {\n this.props.setSelected(idx);\n }\n }\n\n handleTouchEventStart(e) {\n if (e.touches.length == 1) {\n this.touchX = e.touches[0].clientX;\n this.touchY = e.touches[0].clientY;\n }\n }\n\n handleTouchEventEnd(e) {\n if (this.touchX === null || e.changedTouches.length != 1) {\n this.touchX = null;\n return;\n }\n\n const dX = this.touchX - e.changedTouches[0].clientX;\n const dY = this.touchY - e.changedTouches[0].clientY;\n this.touchX = null;\n\n if (Math.abs(dX) > Math.abs(dY) || Math.abs(dY) < MIN_SWIPE_DISTANCE) {\n // Horizontal swipe or too short vertical swipe.\n return;\n }\n\n if (dY > 0) {\n this.handleMovePrev(e, true);\n } else {\n this.handleMoveNext(e, true);\n }\n }\n\n handleTouchCancel() {\n this.touchX = null;\n }\n\n render() {\n const selected = this.getSelectedIndex();\n let messageShown = (this.props.messages || [])[selected];\n messageShown = messageShown ?\n messageShown._deleted ?\n {this.props.intl.formatMessage(messages.message_deleted)} \n :\n Drafty.format(messageShown.content, previewFormatter, {\n formatMessage: this.props.intl.formatMessage.bind(this.props.intl),\n authorizeURL: this.props.tinode.authorizeURL.bind(this.props.tinode)\n })\n :\n {this.props.intl.formatMessage(messages.message_not_found)} ;\n\n const dots = [];\n this.props.pins.forEach(seq => {\n const cn = dots.length == selected ? 'adot' : 'dot';\n dots.push(
);\n });\n\n return (\n \n {this.props.isAdmin ?\n
:\n
push_pin
\n }\n
{dots}
\n
\n
\n
\n );\n }\n}\n\nexport default injectIntl(PinnedMessages);\n","// Received/read indicator.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { deliveryMarker } from '../lib/utils.js';\n\nconst messages = defineMessages({\n message_sending: {\n id: 'message_sending',\n defaultMessage: 'sending...',\n description: 'Message being sent, in place of time stamp'\n },\n message_sending_failed: {\n id: 'message_sending_failed',\n defaultMessage: 'failed',\n description: 'Failed to send message, in place of time stamp'\n },\n message_edited_marker: {\n id: 'message_edited_marker',\n defaultMessage: ', edited',\n description: 'Marker indicating that the message was edited'\n }\n});\n\nclass ReceivedMarker extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let timestamp;\n if (this.props.received <= Tinode.MESSAGE_STATUS_SENDING) {\n timestamp = formatMessage(messages.message_sending);\n } else if (this.props.received == Tinode.MESSAGE_STATUS_FAILED ||\n this.props.received == Tinode.MESSAGE_STATUS_FATAL) {\n timestamp = formatMessage(messages.message_sending_failed);\n } else {\n timestamp = this.props.timestamp.toLocaleTimeString(this.props.intl.locale, { timeStyle: 'short' });\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n const edited = this.props.edited ? formatMessage(messages.message_edited_marker) : null;\n\n return (\n \n {timestamp}{edited}{'\\u00a0'}{marker}\n \n );\n }\n};\n\nexport default injectIntl(ReceivedMarker);\n","// Send message form.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport { Drafty, TheCard } from 'tinode-sdk';\n\n// Lazy-loading AudioRecorder because it's quite large due to\n// a dependency on webm-duration-fix.\nconst AudioRecorder = React.lazy(_ => import('./audio-recorder.jsx'));\n\nimport { KEYPRESS_DELAY } from '../config.js';\nimport { filePasted } from '../lib/blob-helpers.js';\nimport { replyFormatter } from '../lib/formatters.js';\nimport { forwardFavorites, getFavorites, getFileUrl, getFriends, translateReason } from '../lib/im-api.js';\n\n// 4.5-4.6 表情面板:参考图确认了\"只有2个tab\"(😊表情 / ♡)和\"发送按钮浅蓝禁用、深蓝启用\"这两点,\n// 但没有任何一张图能看清第二个tab具体展示什么内容——判断为\"常用\"(这是这类两tab设计里最常见的\n// 语义,也是本项目其它地方唯一有本地存储依据能撑起来的一种:不存在一个真实的\"收藏表情\"后端概念)。\n// 表情本身的具体清单——纠正一处之前的误判:参考图`表情包展开(发送按钮默认状态).png`/`表情包\n// 发送页面.png`其实清楚画出了一套具体的经典\"黄脸\"贴图(微信/QQ经典表情那种视觉风格),不是没有\n// 图片依据。只是这个项目没有对应的贴图素材资源,做不到跟截图完全一致的视觉,退而求其次选了一组\n// 常见、覆盖面广的系统 Unicode 表情——这是素材缺口下的折中方案,不是\"没有依据、随便选的\"。\nconst EMOJI_LIST = ['😀', '😁', '😂', '🤣', '😃', '😄', '😅', '😆', '😉', '😊', '😋', '😎', '😍', '😘',\n '🥰', '😗', '😙', '😚', '🙂', '🤗', '🤩', '🤔', '🤨', '😐', '😑', '😶', '🙄', '😏', '😣', '😥', '😮',\n '🤐', '😯', '😪', '😫', '🥱', '😴', '😌', '😛', '😜', '😝', '🤤', '😒', '😓', '😔', '😕', '🙃', '🤑',\n '😲', '☹️', '🙁', '😖', '😞', '😟', '😤', '😢', '😭', '😦', '😧', '😨', '😩', '🤯', '😬', '😰', '😱',\n '🥵', '🥶', '😳', '🤪', '😵', '😡', '😠', '🤬', '😷', '🤒', '🤕', '🤢', '🤮', '🥳', '🥴', '🥺', '🤫',\n '🤭', '🧐', '🤓', '😈', '👿', '👍', '👎', '👏', '🙌', '🤝', '🙏', '💪', '❤️', '🧡', '💛', '💚', '💙',\n '💜', '🖤', '💔', '💕', '💯', '🔥', '🎉', '🎂', '🌹', '☀️', '🌙', '⭐'];\n// 跟 content-library-view.jsx 的 TYPE_LABEL 是同一套值(那边是 view 层,这边是 widget,不方便\n// 互相 import,就近各自维护一份小常量)。收藏摘要要优先读 snapshot.content.txt 这个结构化字段,\n// 不能像最初那版一样直接展示 snapshot.text——那是整条 content 原样 JSON.stringify 的结果\n// (例如 {\"txt\":\"...\"}),不是给人看的,之前联调时真被这个坑绊了一次才发现。\nconst FAVORITE_TYPE_LABEL = {image: '[图片]', video: '[视频]', voice: '[语音]', file: '[文件]', link: '[链接]'};\nfunction favoriteSummary(item) {\n const content = item.snapshot && item.snapshot.content;\n if (content && typeof content.txt === 'string' && content.txt) {\n return content.txt;\n }\n return FAVORITE_TYPE_LABEL[item.type] || item.type || item.favorite_id;\n}\nconst RECENT_EMOJI_KEY = 'im-recent-emoji';\nconst MAX_RECENT_EMOJI = 30;\nfunction loadRecentEmoji() {\n try {\n const raw = JSON.parse(localStorage.getItem(RECENT_EMOJI_KEY) || '[]');\n return Array.isArray(raw) ? raw : [];\n } catch (_) {\n return [];\n }\n}\nfunction pushRecentEmoji(emoji) {\n try {\n const list = [emoji].concat(loadRecentEmoji().filter(e => e !== emoji)).slice(0, MAX_RECENT_EMOJI);\n localStorage.setItem(RECENT_EMOJI_KEY, JSON.stringify(list));\n } catch (_) { /* ignore */ }\n}\n\nconst messages = defineMessages({\n messaging_disabled: {\n id: 'messaging_disabled_prompt',\n defaultMessage: 'Messaging disabled',\n description: 'Prompt in SendMessage in read-only topic'\n },\n type_new_message: {\n id: 'new_message_prompt',\n defaultMessage: 'New message',\n description: 'Prompt in send message field'\n },\n add_image_caption: {\n id: 'image_caption_prompt',\n defaultMessage: 'Image caption',\n description: 'Prompt in SendMessage for attached image'\n },\n file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n cannot_initiate_upload: {\n id: 'cannot_initiate_file_upload',\n defaultMessage: 'Cannot initiate file upload.',\n description: 'Generic error messagewhen attachment fails'\n },\n icon_title_record_voice: {\n id: 'icon_title_record_voice',\n defaultMessage: 'Record voice message',\n description: 'Icon tool tip for recording a voice message'\n },\n icon_title_attach_file: {\n id: 'icon_title_attach_file',\n defaultMessage: 'Attach file',\n description: 'Icon tool tip for attaching a file'\n },\n icon_title_add_image: {\n id: 'icon_title_add_image',\n defaultMessage: 'Add image',\n description: 'Icon tool tip for attaching an image'\n },\n icon_title_send: {\n id: 'icon_title_send',\n defaultMessage: 'Send message',\n description: 'Icon tool tip for sending a message'\n },\n});\n\nclass SendMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n quote: null,\n message: '',\n audioRec: false,\n audioAvailable: !!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia),\n // @提醒选择器:mentionQuery 非 null 时显示面板;mentionStart 是触发这次匹配的\"@\"在\n // message 里的字符下标(不是 fmt/grapheme 下标,纯 JS 字符串下标,跟 slice 配对用)。\n mentionQuery: null,\n mentionResults: [],\n mentionHighlight: 0,\n emojiOpen: false,\n emojiTab: 'emoji',\n recentEmoji: loadRecentEmoji(),\n attachOpen: false,\n cardPicker: null,\n favPicker: null,\n audioCancelling: false,\n };\n\n // Timestamp when the previous key press was sent to the server.\n this.keypressTimestamp = 0;\n\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n this.handleAttachImage = this.handleAttachImage.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachAudio = this.handleAttachAudio.bind(this);\n this.handleSend = this.handleSend.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleMessageTyping = this.handleMessageTyping.bind(this);\n this.handleDropAttach = this.handleDropAttach.bind(this);\n\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n this.selectMention = this.selectMention.bind(this);\n this.startHoldRecording = this.startHoldRecording.bind(this);\n this.handleHoldMove = this.handleHoldMove.bind(this);\n this.endHoldRecording = this.endHoldRecording.bind(this);\n this.handleHoldVisibilityChange = this.handleHoldVisibilityChange.bind(this);\n this.toggleEmojiPanel = this.toggleEmojiPanel.bind(this);\n this.insertEmoji = this.insertEmoji.bind(this);\n this.deleteLastChar = this.deleteLastChar.bind(this);\n this.toggleAttachPanel = this.toggleAttachPanel.bind(this);\n this.openCardPicker = this.openCardPicker.bind(this);\n this.openFavPicker = this.openFavPicker.bind(this);\n this.sendCard = this.sendCard.bind(this);\n this.sendFavorite = this.sendFavorite.bind(this);\n\n this.formatReply = this.formatReply.bind(this);\n }\n\n componentDidMount() {\n if (this.messageEditArea) {\n this.messageEditArea.addEventListener('paste', this.handlePasteEvent, false);\n if (window.getComputedStyle(this.messageEditArea).getPropertyValue('transition-property') == 'all') {\n // Set focus on desktop, but not on mobile: focus causes soft keyboard to pop up.\n this.messageEditArea.focus();\n }\n }\n\n this.setState({quote: this.formatReply()});\n }\n\n componentWillUnmount() {\n if (this.messageEditArea) {\n this.messageEditArea.removeEventListener('paste', this.handlePasteEvent, false);\n }\n if (this.mentionSearchTimer) {\n window.clearTimeout(this.mentionSearchTimer);\n }\n window.removeEventListener('mousemove', this.handleHoldMove);\n window.removeEventListener('mouseup', this.endHoldRecording);\n window.removeEventListener('touchmove', this.handleHoldMove);\n window.removeEventListener('touchend', this.endHoldRecording);\n window.removeEventListener('blur', this.endHoldRecording);\n document.removeEventListener('visibilitychange', this.handleHoldVisibilityChange);\n }\n\n componentDidUpdate(prevProps) {\n if (this.messageEditArea) {\n if (window.getComputedStyle(this.messageEditArea).getPropertyValue('transition-property') == 'all') {\n // Set focus on desktop, but not on mobile: focus causes soft keyboard to pop up.\n this.messageEditArea.focus();\n }\n\n // Adjust height of the message area for the amount of text.\n this.messageEditArea.style.height = '0px';\n this.messageEditArea.style.height = this.messageEditArea.scrollHeight + 'px';\n }\n\n if (prevProps.topicName != this.props.topicName) {\n this.setState({message: this.props.initMessage || '', audioRec: false, quote: null, mentionQuery: null,\n mentionResults: [], emojiOpen: false, attachOpen: false, cardPicker: null, favPicker: null});\n } else if (!prevProps.disabled && this.props.disabled && this.state.audioRec) {\n // isWriter/etc are real-time ACS bits (messages-view.jsx re-derives them from {pres}/{meta}),\n // so `disabled` can flip to true mid-recording -- the other party blocking you, being removed\n // from a group, or getting muted, all without the user releasing the hold-to-talk button first.\n // Unmounting here (rather than leaving it mounted under a now-hidden branch)\n // is what actually stops the mic via its componentWillUnmount; without this the recording just\n // sits there with `disabled` true and no surviving UI able to end it, and if `disabled` later\n // reverts to false in the same topic, this stale `true` would remount a fresh \n // with no user gesture at all -- silently starting to record again on its own.\n //\n // By the time this runs, React has already committed the `disabled` render and unmounted\n // (its ref callback nulled this.audioRecorderInstance), so endHoldRecording()'s\n // own handleDone/handleDelete call is a no-op here -- it's called anyway for the six\n // mousemove/mouseup/touchmove/touchend/blur/visibilitychange listeners startHoldRecording\n // registered on window/document, which endHoldRecording always removes unconditionally\n // regardless of whether the recorder instance is still around. Skipping this left them\n // dangling until the next real mouseup/touchend/blur/tab-switch happened to fire.\n this.endHoldRecording();\n this.setState({audioRec: false});\n } else if (prevProps.initMessage != this.props.initMessage) {\n const msg = this.props.initMessage || '';\n this.setState({message: msg}, _ => {\n // If there is text, scroll to bottom and set caret to the end.\n this.messageEditArea.scrollTop = this.messageEditArea.scrollHeight;\n this.messageEditArea.setSelectionRange(msg.length, msg.length);\n });\n }\n if (prevProps.reply != this.props.reply) {\n this.setState({quote: this.formatReply()});\n }\n }\n\n formatReply() {\n return this.props.reply ?\n Drafty.format(this.props.reply.content, replyFormatter, {\n formatMessage: this.props.intl.formatMessage.bind(this.props.intl),\n authorizeURL: this.props.tinode.authorizeURL.bind(this.props.tinode)\n }) : null;\n }\n\n handlePasteEvent(e) {\n if (this.props.disabled) {\n return;\n }\n // onAttachImage/onAttachFile are explicitly null while forwarding a message\n // (messages-view.jsx) -- pasting a file in that state used to throw\n // \"onAttachImage is not a function\" instead of just not attaching anything.\n // FIXME: handle large files too.\n if (filePasted(e,\n file => { if (this.props.onAttachImage) { this.props.onAttachImage(file); } },\n file => { if (this.props.onAttachFile) { this.props.onAttachFile(file); } },\n this.props.onError)) {\n\n // If a file was pasted, don't paste base64 data into input field.\n e.preventDefault();\n }\n }\n\n handleAttachImage(e) {\n if (e.target.files && e.target.files.length > 0 && this.props.onAttachImage) {\n this.props.onAttachImage(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleAttachFile(e) {\n if (e.target.files && e.target.files.length > 0 && this.props.onAttachFile) {\n this.props.onAttachFile(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleDropAttach(files) {\n if (files && files.length > 0 && this.props.onAttachFile) {\n this.props.onAttachFile(files[0]);\n }\n }\n\n handleAttachAudio(url, preview, duration) {\n this.setState({audioRec: false});\n if (this.props.onAttachAudio) {\n this.props.onAttachAudio(url, preview, duration);\n }\n }\n\n handleSend(e) {\n e.preventDefault();\n const message = this.state.message.trim();\n if (message || this.props.acceptBlank || this.props.noInput) {\n const result = this.props.onSendMessage(message);\n // onSendMessage may return a promise resolving to `false` when a pre-send risk check blocked\n // or the user cancelled it -- in that case keep the composer text so nothing typed is lost.\n if (result && typeof result.then == 'function') {\n result.then(sent => { if (sent !== false) this.setState({message: ''}); });\n } else {\n this.setState({message: ''});\n }\n }\n }\n\n /* Send on Enter key */\n handleKeyPress(e) {\n if (this.state.audioRec) {\n // Ignore key presses while audio is being recorded.\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n if (this.state.mentionQuery != null) {\n if (e.key === 'Escape') {\n e.preventDefault();\n this.setState({mentionQuery: null, mentionResults: []});\n return;\n }\n if (this.state.mentionResults.length > 0 && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n e.preventDefault();\n const delta = e.key === 'ArrowDown' ? 1 : -1;\n const count = this.state.mentionResults.length;\n this.setState({mentionHighlight: (this.state.mentionHighlight + delta + count) % count});\n return;\n }\n if (e.key === 'Enter' && this.state.mentionResults.length > 0) {\n e.preventDefault();\n e.stopPropagation();\n this.selectMention(this.state.mentionResults[this.state.mentionHighlight]);\n return;\n }\n }\n\n // Enter pressed: either send, or enter a new line.\n if (e.key === 'Enter') {\n if (this.props.sendOnEnter == 'plain') {\n // Have Shift-Enter insert a line break instead\n if (!e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n\n this.handleSend(e);\n }\n } else {\n if (e.ctrlKey || e.metaKey) {\n e.preventDefault();\n e.stopPropagation();\n\n this.handleSend(e);\n }\n }\n }\n }\n\n handleMessageTyping(e) {\n this.setState({message: e.target.value});\n this.updateMentionState(e.target.value, e.target.selectionStart);\n if (this.props.onMessageChange) {\n this.props.onMessageChange(e.target.value);\n }\n if (this.props.onKeyPress) {\n const now = new Date().getTime();\n if (now - this.keypressTimestamp > KEYPRESS_DELAY) {\n this.props.onKeyPress();\n this.keypressTimestamp = now;\n }\n }\n }\n\n // 4.2-4.3 @提醒:只在群聊里挂 onMentionSearch(messages-view.jsx 只给群话题传这个 prop)。\n // 触发条件是\"光标前最近一个'@','@'前面是空白或整段开头,'@'和光标之间没有空白\"——这样\n // \"联系xx@xx.com\"这种邮箱场景里的@不会被误当成提醒触发。\n updateMentionState(text, caret) {\n if (!this.props.onMentionSearch || caret == null) {\n return;\n }\n const before = text.slice(0, caret);\n const match = /(?:^|\\s)@([^\\s@]*)$/.exec(before);\n if (!match) {\n if (this.state.mentionQuery != null) {\n this.setState({mentionQuery: null, mentionResults: []});\n }\n return;\n }\n const query = match[1];\n const start = caret - query.length - 1;\n this.setState({mentionQuery: query, mentionStart: start, mentionHighlight: 0});\n if (this.mentionSearchTimer) {\n window.clearTimeout(this.mentionSearchTimer);\n }\n this.mentionSearchTimer = window.setTimeout(() => {\n this.props.onMentionSearch(query).then(results => {\n // mentionQuery may have moved on (user kept typing, or closed the picker) by the time this\n // resolves -- only apply it if we're still showing a picker at all, matching the same\n // stale-response guard used everywhere else responses race state.\n if (this.state.mentionQuery != null) {\n this.setState({mentionResults: results || []});\n }\n }).catch(() => {});\n }, 200);\n }\n\n selectMention(item) {\n const {message, mentionStart, mentionQuery} = this.state;\n if (mentionStart == null || mentionQuery == null) {\n return;\n }\n const name = item.group_nickname || item.display_name || item.user_id;\n const insertion = '@' + name + ' ';\n const end = mentionStart + 1 + mentionQuery.length;\n const newMessage = message.slice(0, mentionStart) + insertion + message.slice(end);\n const caretPos = mentionStart + insertion.length;\n this.setState({message: newMessage, mentionQuery: null, mentionResults: []});\n if (this.props.onMentionSelected) {\n this.props.onMentionSelected(item.user_id, name);\n }\n if (this.props.onMessageChange) {\n this.props.onMessageChange(newMessage);\n }\n // Textarea's own DOM value needs the same update -- setState alone re-renders with the right\n // `value` prop, but the caret placement below needs the element's real value/selection to\n // already match, and doing it in the same tick (rather than waiting on the render) avoids a\n // visible flash of the stale text with the caret in the wrong place.\n requestAnimationFrame(() => {\n if (this.messageEditArea) {\n this.messageEditArea.focus();\n this.messageEditArea.setSelectionRange(caretPos, caretPos);\n }\n });\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.reply && this.props.onQuoteClick) {\n const replyToSeq = this.props.reply.seq;\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n // 组合面板图标切换规律(核对图片确认):表情/附件两个入口固定在输入框右侧;哪个面板当前\n // 展开,对应的那个图标就变成\"⌨\"(点击收起换回键盘),另一个保持原样不变——不是两个一起变。\n // 这里只做了表情这一侧,附件面板(4.13/4.9-4.14)另外接线时要遵守同一条规则,不要各自发明。\n toggleEmojiPanel(e) {\n e.preventDefault();\n this.setState(s => ({emojiOpen: !s.emojiOpen, attachOpen: false, audioRec: false}));\n }\n\n insertEmoji(emoji) {\n const ta = this.messageEditArea;\n const start = ta ? ta.selectionStart : this.state.message.length;\n const end = ta ? ta.selectionEnd : this.state.message.length;\n const newMessage = this.state.message.slice(0, start) + emoji + this.state.message.slice(end);\n pushRecentEmoji(emoji);\n this.setState({message: newMessage, recentEmoji: loadRecentEmoji()});\n if (this.props.onMessageChange) {\n this.props.onMessageChange(newMessage);\n }\n const caretPosEmoji = start + emoji.length;\n requestAnimationFrame(() => {\n if (this.messageEditArea) {\n this.messageEditArea.focus();\n this.messageEditArea.setSelectionRange(caretPosEmoji, caretPosEmoji);\n }\n });\n }\n\n // 参考图的表情面板自带一个退格键,让\"只点表情不碰键盘\"这条路径也能删掉打错的字符——用\n // Array.from 而不是 slice(0,-1) 切最后一个 Unicode 码点,避免把一个占两个UTF-16码元的emoji\n // (比如复合肤色/家庭类emoji)齐腰斩断,删出半个乱码字符。\n deleteLastChar() {\n const ta = this.messageEditArea;\n const start = ta ? ta.selectionStart : this.state.message.length;\n const end = ta ? ta.selectionEnd : this.state.message.length;\n let newMessage, caretPos;\n if (start !== end) {\n newMessage = this.state.message.slice(0, start) + this.state.message.slice(end);\n caretPos = start;\n } else if (start > 0) {\n const before = Array.from(this.state.message.slice(0, start));\n before.pop();\n newMessage = before.join('') + this.state.message.slice(start);\n caretPos = before.join('').length;\n } else {\n return;\n }\n this.setState({message: newMessage});\n if (this.props.onMessageChange) {\n this.props.onMessageChange(newMessage);\n }\n requestAnimationFrame(() => {\n if (this.messageEditArea) {\n this.messageEditArea.focus();\n this.messageEditArea.setSelectionRange(caretPos, caretPos);\n }\n });\n }\n\n toggleAttachPanel(e) {\n e.preventDefault();\n this.setState(s => ({attachOpen: !s.attachOpen, emojiOpen: false}));\n }\n\n // 3.12/4.9-4.14 发名片:选一个好友,生成一张只含姓名+头像+该好友 uid 的名片消息发到当前会话。\n // uid 必须用 TheCard.setTinodeID 写进 comm 数组(vCard 的\"tinode\"协议项),不是随便塞进某个\n // 字段——widgets/the-card-mini.jsx 点开这张卡片时用 TheCard.getFirstTinodeID(card) 读这个\n // 协议项来判断\"发消息\"按钮该指向谁,写错地方那个按钮会永远不出现。\n openCardPicker(e) {\n e.preventDefault();\n this.setState({attachOpen: false, cardPicker: {loading: true}});\n getFriends().then(data => {\n this.setState({cardPicker: {loading: false, items: data.items || []}});\n }).catch(() => this.setState({cardPicker: {loading: false, items: [], error: true}}));\n }\n\n sendCard(item) {\n this.setState({cardPicker: null});\n const build = avatarUrl => {\n const card = new TheCard(item.display_name || item.user_id, avatarUrl);\n TheCard.setTinodeID(card, item.user_id);\n // Every other attachment sender (image/video/file/voice) threads a typeHint through to\n // messages-view.jsx's sendMessage(msg, uploadCompletionPromise, uploader, typeHint) so the\n // backend's imMessageType() classifier -- which only ever looks at head['x-im-type'] or a flat\n // content.file_id/url, never at real Drafty entities -- doesn't fall through to its \"text\"\n // default. This call was only ever passing the first argument, so every card message has been\n // silently misclassified as plain text (confirmed live: search/history summarize it as raw\n // Drafty JSON instead of a name).\n this.props.onSendMessage(Drafty.appendTheCard(null, card), undefined, undefined, 'card');\n };\n if (item.avatar_file_id) {\n getFileUrl(item.avatar_file_id).then(build).catch(() => build(undefined));\n } else {\n build(undefined);\n }\n }\n\n // 收藏发送:走的是 Ch.7 已有的 forwardFavorites REST 接口(转发收藏的同一个接口,目标只给\n // 当前会话一个),不经过 onSendMessage/Drafty——收藏本来就是后端已经存好快照的独立资源,\n // 不是本地新拼一条消息。\n openFavPicker(e) {\n e.preventDefault();\n this.setState({attachOpen: false, favPicker: {loading: true}});\n getFavorites({type: 'all'}).then(data => {\n this.setState({favPicker: {loading: false, items: data.items || []}});\n }).catch(() => this.setState({favPicker: {loading: false, items: [], error: true}}));\n }\n\n sendFavorite(item) {\n this.setState({favPicker: null});\n if (!this.props.topicName) {\n return;\n }\n // 这个接口恒定 200,真实成败要看 items[].status(跟批量收藏/批量转发是同一套设计,全局代码\n // 审查那一轮已经在其它几处调用点踩过同一个坑并修过——这是新写的这处,同样的坑要一起避开,\n // 不能只 .catch 网络层错误就当万事大吉。联调时真的用这条路径测出过 200 OK 但\n // items[0].status:\"failed\"、reason:\"PERMISSION_DENIED\" 的情况(对方是真实好友、这个会话\n // 本身正常能发消息),看起来是后端这个接口自己的权限判断有问题,不是本地能修的,如实报错\n // 而不是假装发送成功。\n forwardFavorites([item.favorite_id], [this.props.topicName]).then(result => {\n const failed = (result && result.items || []).filter(r => r.status === 'failed');\n if (failed.length && this.props.onError) {\n this.props.onError('发送失败:' + (translateReason(failed[0].reason) || failed[0].reason || '未知原因'), 'err');\n }\n }).catch(err => {\n if (this.props.onError) {\n this.props.onError((err && err.message) || '发送失败', 'err');\n }\n });\n }\n\n // 4.7-4.9 按住说话 + 上滑取消:mousedown/touchstart 直接挂载 AudioRecorder(挂载即开始录音,\n // 这一步跟原来点一下进入录音模式完全一样,没有改 AudioRecorder 自己的录音逻辑),松手时通过\n // ref 直接调它的 handleDone/handleDelete——这两个方法本来是绑给它自己按钮的 onClick,要求一个\n // 带 preventDefault 的事件对象,这里传一个最小的假事件满足这个要求,除此之外没有更深地伸手进\n // 它的内部状态。上滑距离阈值 80px 是参照大多数同类应用(微信等)的常见取值,没有对应的可验证\n // 数值来源,明确记录不是抄的哪个具体规格。\n startHoldRecording(e) {\n e.preventDefault();\n if (this.state.audioRec) {\n return;\n }\n this.holdStartY = 'touches' in e ? (e.touches[0] && e.touches[0].clientY) : e.clientY;\n this.setState({audioRec: true, audioCancelling: false, emojiOpen: false, attachOpen: false});\n window.addEventListener('mousemove', this.handleHoldMove);\n window.addEventListener('mouseup', this.endHoldRecording);\n window.addEventListener('touchmove', this.handleHoldMove, {passive: false});\n window.addEventListener('touchend', this.endHoldRecording);\n // mouseup/touchend only fire for a release point still inside this window/tab -- dragging the\n // pointer out of the browser entirely, switching tabs/apps, or a permission prompt stealing\n // focus (e.g. the very getUserMedia prompt this recording itself triggered, on a second call)\n // all leave the mic running with no further event this listener pair will ever see. Ending the\n // recording (same finish-or-cancel logic as a normal release, per the cancel-zone check) on\n // either signal is a safer default than waiting indefinitely for a mouseup that may never come.\n window.addEventListener('blur', this.endHoldRecording);\n document.addEventListener('visibilitychange', this.handleHoldVisibilityChange);\n }\n\n handleHoldVisibilityChange() {\n if (document.hidden) {\n this.endHoldRecording();\n }\n }\n\n handleHoldMove(e) {\n const y = 'touches' in e ? (e.touches[0] && e.touches[0].clientY) : e.clientY;\n if (y == null || this.holdStartY == null) {\n return;\n }\n const cancelling = (this.holdStartY - y) > 80;\n if (cancelling !== this.state.audioCancelling) {\n this.setState({audioCancelling: cancelling});\n }\n }\n\n endHoldRecording() {\n window.removeEventListener('mousemove', this.handleHoldMove);\n window.removeEventListener('mouseup', this.endHoldRecording);\n window.removeEventListener('touchmove', this.handleHoldMove);\n window.removeEventListener('touchend', this.endHoldRecording);\n window.removeEventListener('blur', this.endHoldRecording);\n document.removeEventListener('visibilitychange', this.handleHoldVisibilityChange);\n this.holdStartY = null;\n const fakeEvent = {preventDefault: () => {}};\n if (this.audioRecorderInstance) {\n if (this.state.audioCancelling) {\n this.audioRecorderInstance.handleDelete(fakeEvent);\n } else {\n this.audioRecorderInstance.handleDone(fakeEvent);\n }\n }\n }\n\n render() {\n const { formatMessage } = this.props.intl;\n const prompt = this.props.disabled ?\n formatMessage(messages.messaging_disabled) :\n (this.props.messagePrompt ?\n formatMessage(messages[this.props.messagePrompt]) :\n formatMessage(messages.type_new_message));\n\n const sendIcon = (this.props.reply && this.props.reply.editing) ?\n 'check_circle' : 'send';\n\n const quote = this.state.quote ?\n (\n
\n {this.state.quote}\n
) : null;\n const audioEnabled = this.state.audioAvailable && this.props.onAttachAudio;\n const mentionPanel = this.state.mentionQuery != null ?\n (\n {this.state.mentionResults.length === 0 ?\n
无匹配成员
:\n this.state.mentionResults.map((item, i) => (\n
{ e.preventDefault(); this.selectMention(item); }}\n onMouseEnter={() => this.setState({mentionHighlight: i})}>\n {item.group_nickname || item.display_name || item.user_id}\n
\n ))}\n
) : null;\n return (\n \n {this.state.emojiOpen ?\n \n
\n
\n {/* 参考图表情网格下方那一整行退格/发送专属控件——原来完全没做,\"只点表情不碰键盘\"\n 这条路径下用户还得把视线移出面板去点外面的发送图标。复用已有的 sendIcon/handleSend,\n 不重新发明发送逻辑。 */}\n \n
: null}\n {this.state.attachOpen ?\n : null}\n {this.state.cardPicker ?\n this.setState({cardPicker: null})}>\n
e.stopPropagation()}>\n \n \n \n
: null}\n {this.state.favPicker ?\n this.setState({favPicker: null})}>\n
e.stopPropagation()}>\n \n \n \n
: null}\n \n );\n }\n};\n\nexport default injectIntl(SendMessage);\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"src_views_messages-view_jsx.dev.js","mappings":"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","sources":["webpack://tinode-webapp/./src/views/logo-view.jsx","webpack://tinode-webapp/./src/views/messages-view.jsx","webpack://tinode-webapp/./src/widgets/attachment.jsx","webpack://tinode-webapp/./src/widgets/chat-message.jsx","webpack://tinode-webapp/./src/widgets/forward-bundle.jsx","webpack://tinode-webapp/./src/widgets/group-subs.jsx","webpack://tinode-webapp/./src/widgets/invitation.jsx","webpack://tinode-webapp/./src/widgets/meta-message.jsx","webpack://tinode-webapp/./src/widgets/pinned-messages.jsx","webpack://tinode-webapp/./src/widgets/received-marker.jsx","webpack://tinode-webapp/./src/widgets/send-message.jsx"],"sourcesContent":["/* Static placeholder shown in the message pane when no conversation is selected. */\nimport React from 'react';\n\nimport { BASE_APP_NAME } from '../config.js';\n\nfunction Icon({children}) { return {children} ; }\n\nexport default class LogoView extends React.PureComponent {\n render() {\n return (\n \n
\n
forum \n
{BASE_APP_NAME} \n
选择一个会话开始聊天
\n
\n
\n );\n }\n};\n","// Panel with a chat.\n\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\n\nimport { Drafty, Tinode, TheCard } from 'tinode-sdk';\n\nconst CallPanel = React.lazy(_ => import('../widgets/call-panel.jsx'));\nimport ChatMessage from '../widgets/chat-message.jsx';\nimport ContactBadges from '../widgets/contact-badges.jsx';\nconst DocPreview = React.lazy(_ => import('../widgets/doc-preview.jsx'));\nimport ErrorPanel from '../widgets/error-panel.jsx';\nimport GroupSubs from '../widgets/group-subs.jsx';\nconst ImagePreview = React.lazy(_ => import('../widgets/image-preview.jsx'));\nimport Invitation from '../widgets/invitation.jsx';\nimport LetterTile from '../widgets/letter-tile.jsx';\nimport LoadSpinner from '../widgets/load-spinner.jsx';\nimport LogoView from './logo-view.jsx';\nimport MetaMessage from '../widgets/meta-message.jsx';\nimport PinnedMessages from '../widgets/pinned-messages.jsx';\nimport { RiskConfirmDialog } from './security-support-view.jsx';\nimport SendMessage from '../widgets/send-message.jsx';\nconst TheCardPreview = React.lazy(_ => import('../widgets/the-card-preview.jsx'));\nconst VideoPreview = React.lazy(_ => import('../widgets/video-preview.jsx'));\n\nimport { DEFAULT_P2P_ACCESS_MODE, EDIT_PREVIEW_LENGTH, IMAGE_PREVIEW_DIM, IMMEDIATE_P2P_SUBSCRIPTION,\n DRAFTY_FR_MIME_TYPE_LEGACY, KEYPRESS_DELAY, MESSAGES_PAGE, MAX_EXTERN_ATTACHMENT_SIZE, MAX_IMAGE_DIM,\n MAX_INBAND_ATTACHMENT_SIZE, READ_DELAY, QUOTED_REPLY_LENGTH, VIDEO_PREVIEW_DIM } from '../config.js';\nimport { CALL_STATE_OUTGOING_INITATED, CALL_STATE_IN_PROGRESS } from '../constants.js';\nimport { blobToBase64, fileToBase64, imageScaled, importVCard, makeImageUrl } from '../lib/blob-helpers.js';\nimport { topicDisplayName } from '../lib/utils.js';\nimport { checkURL, confirmRiskChallenge, createChatUploader, favoriteMessages, getBootstrap, getConversationContext,\n getFavorites, getGroupJoinRequests, getGroupMembers, getLatestGroupAnnouncement, getTopicDraft, recallMessage,\n updateTopicDraft } from '../lib/im-api.js';\nimport HashNavigation from '../lib/navigation.js';\nimport { bytesToHumanSize, relativeDateFormat, shortDateFormat } from '../lib/strformat.js';\n\n// Run timer with this frequency (ms) for checking notification queue.\nconst NOTIFICATION_EXEC_INTERVAL = 300;\n// Scroll distance before [go to latest message] button is shown.\nconst SHOW_GO_TO_LAST_DIST = 100;\n// Sctoll distance from the top when fetching the page of earlier messages is triggered.\nconst FETCH_PAGE_TRIGGER = 40;\n\nconst messages = defineMessages({\n // 已存在于 src/i18n/*.json(zh: \"消息已删除\"),这里只是注册引用,不是新增待翻译串\n message_deleted: {\n id: 'message_deleted',\n defaultMessage: 'message deleted',\n description: 'Placeholder shown in the timeline where a message was recalled or deleted',\n },\n online_now: {\n id: 'online_now',\n defaultMessage: 'online now',\n description: 'Indicator that the user or topic is currently online',\n },\n last_seen: {\n id: 'last_seen_timestamp',\n defaultMessage: 'Last seen: {timestamp}',\n description: 'Label for the timestamp of when the user or topic was last online'\n },\n not_found: {\n id: 'title_not_found',\n defaultMessage: 'Not found',\n description: 'Title shown when topic is not found'\n },\n channel: {\n id: 'channel',\n defaultMessage: 'channel',\n description: 'Subtitle shown for channels in MessagesView instead of last seen'\n },\n file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n invalid_content: {\n id: 'invalid_content',\n defaultMessage: 'invalid content',\n description: 'Shown when the message is unreadable'\n },\n editing_message: {\n id: 'editing_message',\n defaultMessage: 'Editing',\n description: 'Title over message editing preview'\n },\n drag_file: {\n id: 'drag_file',\n defaultMessage: 'Drag file here',\n description: 'Prompt on the file drag-n-drop overlay banner'\n },\n self_topic_name: {\n id: 'self_topic_name',\n defaultMessage: 'Saved messages',\n description: 'Name of self topic for UI'\n },\n subscriber_count: {\n id: 'subscriber_count',\n defaultMessage: '{count, plural, ' +\n 'one {{count, number} subscriber} ' +\n 'two {{count, number} subscribers} ' +\n 'three {{count, number} subscribers} ' +\n 'few {{count, number} subscribers} ' +\n 'many {{count, number} subscribers} ' +\n 'other {{count, number} subscribers}}',\n description: 'Count of channel subscribers'\n },\n member_count: {\n id: 'member_count',\n defaultMessage: '{count, plural, ' +\n 'one {{count, number} member} ' +\n 'two {{count, number} members} ' +\n 'three {{count, number} members} ' +\n 'few {{count, number} members} ' +\n 'many {{count, number} members} ' +\n 'other {{count, number} members}}',\n description: 'Count of group topic members'\n },\n cannot_parse_vcard: {\n id: 'cannot_parse_vcard',\n defaultMessage: 'Cannot parse vCard file.',\n description: 'Error message when vCard file cannot be parsed'\n }\n});\n\n// Checks if the access permissions are granted but not yet accepted.\nfunction isUnconfirmed(acs) {\n if (acs) {\n const ex = acs.getExcessive() || '';\n return acs.isJoiner('given') && (ex.includes('R') || ex.includes('W'));\n }\n return false;\n}\n\nfunction isPeerRestricted(acs) {\n if (acs) {\n const ms = acs.getMissing() || '';\n return acs.isJoiner('want') && (ms.includes('R') || ms.includes('W'));\n }\n return false;\n}\n\n// Synthetic \"所有人\" entry in the @提醒 picker (mentionSearch below) -- not a real user_id, just a\n// marker mentionSelected/sendMessage recognize to set head.mention_all instead of resolving a\n// Drafty MN entity to it. Never sent to the server as an actual id.\nconst MENTION_ALL_UID = '__mention_all__';\n\nfunction shouldPresentCallPanel(callState) {\n // Show call panel if either:\n // - call is outgoing (and the client is waiting for the other side to pick up) or,\n // - call is already in progress.\n return callState == CALL_STATE_OUTGOING_INITATED || callState == CALL_STATE_IN_PROGRESS;\n}\n\nclass MessagesView extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = MessagesView.getDerivedStateFromProps(props, {});\n // Not topic-specific, fetched once in componentDidMount -- unlike the rest of state this\n // is intentionally not touched by getDerivedStateFromProps on topic change.\n this.state.messagePolicy = null;\n this.state.toast = null;\n this.state.riskDialog = null;\n this.mentionedUsers = [];\n this.mentionAllPending = false;\n\n this.componentSetup = this.componentSetup.bind(this);\n this.leave = this.leave.bind(this);\n this.sendMessage = this.sendMessage.bind(this);\n this.handleRiskConfirm = this.handleRiskConfirm.bind(this);\n this.handleRiskCancel = this.handleRiskCancel.bind(this);\n this.retrySend = this.retrySend.bind(this);\n this.sendImageAttachment = this.sendImageAttachment.bind(this);\n this.sendVideoAttachment = this.sendVideoAttachment.bind(this);\n this.sendFileAttachment = this.sendFileAttachment.bind(this);\n this.sendAudioAttachment = this.sendAudioAttachment.bind(this);\n this.sendTheCardAttachment = this.sendTheCardAttachment.bind(this);\n this.sendKeyPress = this.sendKeyPress.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.handleScrollReference = this.handleScrollReference.bind(this);\n this.mountDnDEvents = this.mountDnDEvents.bind(this);\n this.handleScrollEvent = this.handleScrollEvent.bind(this);\n this.handleDescChange = this.handleDescChange.bind(this);\n this.handleSubsUpdated = this.handleSubsUpdated.bind(this);\n this.handleMessageUpdate = this.handleMessageUpdate.bind(this);\n this.handleAuxUpdate = this.handleAuxUpdate.bind(this);\n this.handleAllMessagesReceived = this.handleAllMessagesReceived.bind(this);\n this.handleInfoReceipt = this.handleInfoReceipt.bind(this);\n this.handleExpandMedia = this.handleExpandMedia.bind(this);\n this.handleClosePreview = this.handleClosePreview.bind(this);\n this.handleCallPanelToggle = this.handleCallPanelToggle.bind(this);\n this.handleFormResponse = this.handleFormResponse.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleShowMessageContextMenu = this.handleShowMessageContextMenu.bind(this);\n this.handleNewChatAcceptance = this.handleNewChatAcceptance.bind(this);\n this.handleEnablePeer = this.handleEnablePeer.bind(this);\n this.loadRelationshipContext = this.loadRelationshipContext.bind(this);\n this.loadGroupContext = this.loadGroupContext.bind(this);\n this.loadDraft = this.loadDraft.bind(this);\n this.handleComposerChange = this.handleComposerChange.bind(this);\n this.clearDraft = this.clearDraft.bind(this);\n this.mentionSearch = this.mentionSearch.bind(this);\n this.mentionSelected = this.mentionSelected.bind(this);\n this.handleShowAnnouncement = this.handleShowAnnouncement.bind(this);\n this.handleShowJoinRequests = this.handleShowJoinRequests.bind(this);\n this.handleSendFriendVerification = this.handleSendFriendVerification.bind(this);\n this.handleBatchDelete = this.handleBatchDelete.bind(this);\n this.handleBatchFavorite = this.handleBatchFavorite.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachImageOrVideo = this.handleAttachImageOrVideo.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.postReadNotification = this.postReadNotification.bind(this);\n this.clearNotificationQueue = this.clearNotificationQueue.bind(this);\n this.goToLatestMessage = this.goToLatestMessage.bind(this);\n this.handleFileDrop = this.handleFileDrop.bind(this);\n\n this.handlePickReply = this.handlePickReply.bind(this);\n this.handleEditMessage = this.handleEditMessage.bind(this);\n this.handleCancelReply = this.handleCancelReply.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n this.jumpToMessage = this.jumpToMessage.bind(this);\n this.handleUnpinMessage = this.handleUnpinMessage.bind(this);\n this.handleCallHangup = this.handleCallHangup.bind(this);\n\n this.isDragEnabled = this.isDragEnabled.bind(this);\n this.handleDragStart = this.handleDragStart.bind(this);\n this.handleDragIn = this.handleDragIn.bind(this);\n this.handleDragOut = this.handleDragOut.bind(this);\n this.handleDrag = this.handleDrag.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n\n this.chatMessageRefs = [];\n this.getOrCreateMessageRef = this.getOrCreateMessageRef.bind(this);\n this.getVisibleMessageRange = this.getVisibleMessageRange.bind(this);\n\n // Keeps track of the drag event.\n // Need a counter b/c the browser's 'drag' events may fire multiple times\n // when the user takes the mouse pointer over the container:\n // for the component itself and for all nested/child elements.\n this.dragCounter = 0;\n this.dndRef = null;\n\n this.readNotificationQueue = [];\n this.readNotificationTimer = null;\n\n this.keyPressTimer = null;\n }\n\n getOrCreateMessageRef(seqId) {\n if (this.chatMessageRefs[seqId]) {\n return this.chatMessageRefs[seqId];\n }\n const ref = React.createRef();\n this.chatMessageRefs[seqId] = ref;\n return ref;\n }\n\n getVisibleMessageRange(holderRect) {\n let min = Number.MAX_SAFE_INTEGER, max = -1;\n let visibilityStatus = false;\n this.chatMessageRefs.every((ref, seq) => {\n if (ref.current) {\n const { top, bottom, height } = ref.current.getBoundingClientRect();\n const visible = top <= holderRect.top ? holderRect.top - top <= height : bottom - holderRect.bottom <= height;\n if (visible) {\n visibilityStatus = true;\n min = Math.min(min, seq);\n max = Math.max(max, seq);\n } else if (visibilityStatus) {\n // The remaining elements are no longer visible, no need to iterate them.\n return false;\n }\n }\n return true;\n });\n\n return max >= min ? {min: min, max: max} : {min: 0, max: 0};\n }\n\n componentDidMount() {\n if (this.messagesScroller) {\n this.messagesScroller.addEventListener('scroll', this.handleScrollEvent);\n }\n\n // Drag and drop events\n this.mountDnDEvents(this.dndRef);\n\n this.componentSetup({}, {});\n\n getBootstrap().then(data => {\n this.setState({messagePolicy: data.message_policy || null});\n }).catch(_ => {});\n }\n\n componentWillUnmount() {\n // componentSetup below has an identical guard for switching from one topic to another during an\n // active call -- but componentDidUpdate/componentSetup never runs on an actual unmount (leaving\n // the messaging section entirely for another chapter, or on mobile switching to the conversation\n // list while displayMobile). Without this, CallPanel's own componentWillUnmount only tears down\n // local media: it never notifies the peer or resets tinode-web.jsx's top-level callState/\n // callTopic, which then stay stuck at CALL_STATE_IN_PROGRESS. Navigating back to the call's topic\n // later remounts a \"zombie\" CallPanel -- its start() sees that stale CALL_STATE_IN_PROGRESS and\n // takes the \"we just accepted\" branch, which never calls getUserMedia(): no local media, every\n // control disabled, only hang-up works.\n if (this.state.rtcPanel) {\n this.handleCallHangup(this.state.topic, this.props.callSeq);\n }\n if (this.messagesScroller) {\n this.messagesScroller.removeEventListener('scroll', this.handleScrollEvent);\n }\n window.clearTimeout(this.toastTimer);\n\n // Flush all notifications.\n this.clearNotificationQueue();\n\n // Drag and drop events\n if (this.dndRef) {\n this.dndRef.removeEventListener('dragstart', this.handleDragStart);\n this.dndRef.removeEventListener('dragenter', this.handleDragIn);\n this.dndRef.removeEventListener('dragleave', this.handleDragOut);\n this.dndRef.removeEventListener('dragover', this.handleDrag);\n this.dndRef.removeEventListener('drop', this.handleDrop);\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n // Scroll last message into view on component update e.g. on message received\n // or vertical shrinking.\n if (this.messagesScroller &&\n (prevState.topic != this.state.topic || prevState.maxSeqId != this.state.maxSeqId ||\n prevState.minSeqId != this.state.minSeqId)) {\n // New message.\n if (this.state.scrollPosition < SHOW_GO_TO_LAST_DIST) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight -\n this.state.scrollPosition - this.messagesScroller.offsetHeight;\n }\n }\n\n if (!this.props.applicationVisible) {\n // If application is not visible, flush all unsent 'read' notifications.\n this.clearNotificationQueue();\n } else {\n // Otherwise assume there are unread messages.\n this.postReadNotification(0);\n }\n\n // Ch.7: jump to a message found via chat-history search (content-library-view.jsx's History),\n // passed in as a ?jumpseq= hash param rather than a normal prop since the navigation that gets us\n // here also has to change the *topic*, which content-library-view.jsx has no direct way to do.\n if (this.props.jumpToSeq && this.props.jumpToSeq != prevProps.jumpToSeq) {\n this.jumpToMessage(parseInt(this.props.jumpToSeq, 10));\n }\n\n this.componentSetup(prevProps, prevState);\n }\n\n componentSetup(prevProps, prevState) {\n const topic = this.props.tinode ? this.props.tinode.getTopic(this.state.topic) : undefined;\n if (this.state.topic != prevState.topic) {\n if (prevState.topic && !Tinode.isNewGroupTopicName(prevState.topic)) {\n this.leave(prevState.topic);\n if (prevState.rtcPanel) {\n this.handleCallHangup(prevState.topic, prevProps.callSeq);\n }\n }\n\n if (topic) {\n topic.onData = this.handleMessageUpdate;\n topic.onAllMessagesReceived = this.handleAllMessagesReceived;\n topic.onInfo = this.handleInfoReceipt;\n topic.onMetaDesc = this.handleDescChange;\n topic.onSubsUpdated = this.handleSubsUpdated;\n topic.onPres = this.handleSubsUpdated;\n topic.onAuxUpdated = this.handleAuxUpdate;\n }\n\n this.mentionedUsers = [];\n this.mentionAllPending = false;\n this.loadRelationshipContext(topic);\n this.loadGroupContext(topic);\n this.loadDraft(topic);\n }\n\n if (topic) {\n if ((this.state.topic != prevState.topic) || (this.props.myUserId && !prevProps.myUserId)) {\n // Don't immediately subscribe to a new p2p topic, wait for the first message.\n const newTopic = (this.props.newTopicParams && this.props.newTopicParams._topicName == this.props.topic);\n if (topic.isP2PType() && newTopic && !IMMEDIATE_P2P_SUBSCRIPTION) {\n topic.getMeta(topic.startMetaQuery().withDesc().build());\n } else if (this.props.myUserId) {\n this.subscribe(topic);\n }\n } else if (topic.isSubscribed() && this.state.isReader && !prevState.isReader) {\n // If reader status has changed and data became available.\n topic.getMeta(topic.startMetaQuery().withLaterData().build());\n } else if (!topic.isSubscribed() && this.props.ready && !prevProps.ready) {\n // Connection restored (e.g. wake from sleep): resubscribe to the currently open topic.\n this.subscribe(topic);\n }\n }\n }\n\n static getDerivedStateFromProps(nextProps, prevState) {\n let nextState = {};\n if (!nextProps.topic) {\n // Default state: no topic.\n nextState = {\n minSeqId: -1,\n maxSeqId: -1,\n latestClearId: -1,\n onlineSubs: [],\n topic: null,\n title: '',\n avatar: null,\n isVerified: false,\n isStaff: false,\n isDangerous: false,\n deleted: false,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n minimizedCallPanel: false,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n peerMessagingDisabled: false,\n channel: false,\n reply: null,\n contentToEdit: null,\n showGoToLastButton: false,\n dragging: false,\n pins: [],\n pinsLoaded: false,\n selectedPin: 0,\n subsVersion: 0,\n relationshipContext: null,\n groupRoles: null,\n myGroupRole: null,\n groupAnnouncement: null,\n pendingJoinRequests: 0,\n draftText: null,\n draftVersion: 0\n };\n } else if (nextProps.topic != prevState.topic) {\n const topic = nextProps.tinode.getTopic(nextProps.topic);\n\n nextState = {\n topic: nextProps.topic,\n deleted: topic._deleted,\n docPreview: null,\n imagePreview: null,\n imagePostview: null,\n videoPreview: null,\n videoPostview: null,\n rtcPanel: null,\n minimizedCallPanel: false,\n typingIndicator: false,\n scrollPosition: 0,\n fetchingMessages: false,\n showGoToLastButton: false,\n contentToEdit: null,\n dragging: false,\n selectedPin: 0,\n relationshipContext: null,\n groupRoles: null,\n myGroupRole: null,\n groupAnnouncement: null,\n pendingJoinRequests: 0,\n draftText: null,\n draftVersion: 0,\n // MessagesView isn't remounted on topic switch (no `key={topic}` at the call site in\n // tinode-web.jsx), so a pending risk-check dialog from the conversation just left would\n // otherwise survive the switch -- confirming it would then send the old topic's message\n // into whichever topic is now open, since doSend()'s `this.props.sendMessage` resolves the\n // topic to send to at call time, not at the time the dialog was raised.\n riskDialog: null\n };\n\n if (nextProps.forwardMessage) {\n if (nextProps.forwardMessage.content) {\n const content = nextProps.forwardMessage.content;\n const size = content?.length || (content?.size || 0);\n nextState.docPreview = {\n object: content,\n type: nextProps.forwardMessage.type,\n size: size\n };\n } else {\n // We are forwarding a message. Show preview.\n nextState.reply = {\n content: nextProps.forwardMessage.preview,\n seq: null\n };\n }\n } else {\n nextState.reply = null;\n }\n\n if (topic) {\n // Topic exists.\n const subs = [];\n\n if (nextProps.connected) {\n topic.subscribers((sub) => {\n if (sub.online && sub.user != nextProps.myUserId) {\n subs.push(sub);\n }\n });\n }\n\n Object.assign(nextState, {\n onlineSubs: subs\n });\n\n if (topic.isSelfType()) {\n Object.assign(nextState, {\n title: nextProps.intl.formatMessage(messages.self_topic_name),\n avatar: true\n });\n } else if (topic.public) {\n Object.assign(nextState, {\n title: topicDisplayName(topic.name, topic.public, ''),\n avatar: makeImageUrl(topic.public.photo)\n });\n } else {\n Object.assign(nextState, {\n title: '',\n avatar: null\n });\n }\n\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(nextState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (prevState.peerMessagingDisabled) {\n Object.assign(nextState, {\n peerMessagingDisabled: false\n });\n }\n Object.assign(nextState, {\n minSeqId: topic.minMsgSeq(),\n maxSeqId: topic.maxMsgSeq(),\n latestClearId: topic.maxClearId(),\n channel: topic.isChannelType(),\n pins: (topic.aux('pins') || []).slice(),\n pinsLoaded: false\n });\n\n if (nextProps.callTopic == topic.name && shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\n }\n } else {\n // Invalid topic.\n Object.assign(nextState, {\n minSeqId: -1,\n maxSeqId: -1,\n latestClearId: -1,\n onlineSubs: [],\n title: '',\n avatar: null,\n peerMessagingDisabled: false,\n channel: false,\n pins: [],\n pinsLoaded: false\n });\n }\n } else {\n // We are still in same topic. Show the call panel if necessary.\n if (nextProps.callTopic == prevState.topic && !prevState.rtcPanel &&\n shouldPresentCallPanel(nextProps.callState)) {\n nextState.rtcPanel = nextProps.callTopic;\n }\n }\n\n if (nextProps.acs) {\n if (nextProps.acs.isWriter() != prevState.isWriter) {\n nextState.isWriter = !prevState.isWriter;\n }\n if (nextProps.acs.isReader() != prevState.isReader) {\n nextState.isReader = !prevState.isReader;\n }\n if (nextProps.acs.isAdmin() != prevState.isAdmin) {\n nextState.isAdmin = !prevState.isAdmin;\n }\n if (!nextProps.acs.isReader('given') != prevState.readingBlocked) {\n nextState.readingBlocked = !prevState.readingBlocked;\n }\n if (nextProps.acs.isSharer() != prevState.isSharer) {\n nextState.isSharer = !prevState.isSharer;\n }\n } else {\n if (prevState.isWriter) {\n nextState.isWriter = false;\n }\n if (prevState.isReader) {\n nextState.isReader = false;\n }\n if (prevState.isAdmin) {\n nextState.isAdmin = false;\n }\n if (!prevState.readingBlocked) {\n nextState.readingBlocked = true;\n }\n if (prevState.isSharer) {\n nextState.isSharer = false;\n }\n }\n\n if (isUnconfirmed(nextProps.acs) == !prevState.unconformed) {\n nextState.unconfirmed = !prevState.unconformed;\n }\n\n // Clear subscribers online when there is no connection.\n if (!nextProps.connected && prevState.onlineSubs && prevState.onlineSubs.length > 0) {\n nextState.onlineSubs = [];\n }\n\n return nextState;\n }\n\n subscribe(topic) {\n if (topic.isSubscribed() || !this.props.ready) {\n return;\n }\n\n // Is this a new topic?\n const newTopic = (this.props.newTopicParams && this.props.newTopicParams._topicName == this.props.topic);\n // Don't request the tags. They are useless unless the user\n // is the owner and is editing the topic.\n let getQuery = topic.startMetaQuery().withLaterDesc().withLaterSub().withAux();\n if (this.state.isReader || newTopic) {\n // Reading is either permitted or we don't know because it's a new topic. Ask for messages.\n getQuery = getQuery.withLaterData(MESSAGES_PAGE);\n if (this.state.isReader) {\n getQuery = getQuery.withLaterDel();\n }\n // And show \"loading\" spinner.\n this.setState({ fetchingMessages: true });\n }\n\n const setQuery = newTopic ? this.props.newTopicParams : undefined;\n topic.subscribe(getQuery.build(), setQuery)\n .then(ctrl => {\n if (ctrl.code == 303) {\n // Redirect to another topic requested.\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', ctrl.params.topic));\n return;\n }\n if (this.state.topic != ctrl.topic) {\n this.setState({topic: ctrl.topic});\n }\n if (this.state.deleted) {\n this.setState({deleted: false});\n }\n this.props.onNewTopicCreated(this.props.topic, ctrl.topic);\n // If there are unsent messages (except hard-failed and video call messages),\n // try sending them now. Hard-failed and unsent video call messages will be dropped.\n let discard = [];\n topic.queuedMessages(pub => {\n if (pub._sending) {\n return;\n }\n if (pub._fatal || (pub.head && pub.head.webrtc)) {\n // Filter out unsent failed & video call messages.\n discard.push(pub.seq);\n return;\n }\n if (topic.isSubscribed()) {\n this.retrySend(pub);\n }\n });\n if (discard.length > 0) {\n topic.delMessagesList(discard, true);\n }\n })\n .catch(err => {\n console.error(\"Failed subscription to\", this.state.topic, err);\n this.props.onError(err.message, 'err');\n const blankState = MessagesView.getDerivedStateFromProps({}, {});\n blankState.title = this.props.intl.formatMessage(messages.not_found);\n this.setState(blankState);\n });\n }\n\n leave(oldTopicName) {\n if (!oldTopicName || !this.props.tinode.isTopicCached(oldTopicName)) {\n return;\n }\n\n const oldTopic = this.props.tinode.getTopic(oldTopicName);\n if (oldTopic && oldTopic.isSubscribed()) {\n oldTopic.leave(false)\n .catch(_ => { /* do nothing here */ })\n .finally(_ => {\n // We don't care if the request succeeded or failed.\n // The topic is dead regardless.\n this.setState({fetchingMessages: false});\n oldTopic.onData = undefined;\n oldTopic.onAllMessagesReceived = undefined;\n oldTopic.onInfo = undefined;\n oldTopic.onMetaDesc = undefined;\n oldTopic.onSubsUpdated = undefined;\n oldTopic.onPres = undefined;\n oldTopic.onAuxUpdated = undefined;\n });\n }\n }\n\n // Don't use React.createRef as the ref.current is not available in componentDidMount in this component.\n handleScrollReference(node) {\n if (node) {\n node.addEventListener('scroll', this.handleScrollEvent);\n this.messagesScroller = node;\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight -\n this.state.scrollPosition - this.messagesScroller.offsetHeight;\n }\n }\n\n // Get older messages and show/hide [go to latest message] button.\n handleScrollEvent(event) {\n const pos = event.target.scrollHeight - event.target.scrollTop - event.target.offsetHeight;\n this.setState({\n scrollPosition: pos,\n // Show [go to latest message] if far enough from bottom and scrolling down.\n showGoToLastButton: (pos > SHOW_GO_TO_LAST_DIST) && (pos < this.state.scrollPosition),\n });\n\n if (this.state.fetchingMessages || this.processingScrollEvent) {\n return;\n }\n\n if (event.target.scrollTop <= FETCH_PAGE_TRIGGER) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic && topic.isSubscribed()) {\n this.processingScrollEvent = true;\n const {min, max} = this.getVisibleMessageRange(event.target.getBoundingClientRect());\n const gaps = topic.msgHasMoreMessages(min, max, false);\n if (gaps.length > 0) {\n this.setState({fetchingMessages: true}, _ => {\n topic.getMessagesPage(MESSAGES_PAGE, gaps, min, max)\n .catch(err => this.props.onError(err.message, 'err'))\n .finally(_ => this.setState({fetchingMessages: false}));\n });\n }\n }\n }\n this.processingScrollEvent = false;\n }\n\n /* Mount drag and drop events */\n mountDnDEvents(dnd) {\n if (dnd) {\n dnd.addEventListener('dragstart', this.handleDragStart);\n dnd.addEventListener('dragenter', this.handleDragIn);\n dnd.addEventListener('dragleave', this.handleDragOut);\n dnd.addEventListener('dragover', this.handleDrag);\n dnd.addEventListener('drop', this.handleDrop);\n this.dndRef = dnd;\n }\n }\n\n goToLatestMessage() {\n this.setState({scrollPosition: 0});\n if (this.messagesScroller) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.messagesScroller.offsetHeight;\n }\n }\n\n handleDescChange(desc) {\n if (Tinode.isSelfTopicName(this.props.topic)) {\n this.setState({\n title: this.props.intl.formatMessage(messages.self_topic_name),\n avatar: true\n });\n } else if (desc.public) {\n this.setState({\n title: topicDisplayName(this.props.topic, desc.public, ''),\n avatar: makeImageUrl(desc.public.photo)\n });\n } else {\n this.setState({\n title: '',\n avatar: null\n });\n }\n\n if (desc.acs) {\n this.setState({\n isWriter: desc.acs.isWriter(),\n isReader: desc.acs.isReader(),\n isAdmin: desc.acs.isAdmin(),\n readingBlocked: !desc.acs.isReader('given'),\n unconfirmed: isUnconfirmed(desc.acs),\n });\n }\n }\n\n postReadNotification(seq) {\n // Ignore notifications if the app is invisible or topic is not yet available.\n if (!this.props.applicationVisible || !this.state.topic) {\n return;\n }\n\n // Set up the timer if it's not running already.\n if (!this.readNotificationTimer) {\n this.readNotificationTimer = setInterval(_ => {\n if (this.readNotificationQueue.length == 0) {\n // Shut down the timer if the queue is empty.\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n return;\n }\n\n let seq = -1;\n while (this.readNotificationQueue.length > 0) {\n const n = this.readNotificationQueue[0];\n if (n.topicName != this.state.topic) {\n // Topic has changed. Drop the notification.\n this.readNotificationQueue.shift();\n continue;\n }\n\n const now = new Date();\n if (n.sendAt <= now) {\n // Remove expired notification from queue.\n this.readNotificationQueue.shift();\n if (n.seq == 0 || Tinode.isServerAssignedSeq(n.seq)) {\n seq = Math.max(seq, n.seq);\n }\n } else {\n break;\n }\n }\n\n // Send only one notification for the whole batch of messages.\n if (seq >= 0) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic) {\n try {\n topic.noteRead(seq);\n } catch (err) {\n console.error(\"Failed to send read notification\", err);\n }\n }\n }\n }, NOTIFICATION_EXEC_INTERVAL);\n }\n\n const now = new Date();\n this.readNotificationQueue.push({\n topicName: this.state.topic,\n seq: seq,\n sendAt: now.setMilliseconds(now.getMilliseconds() + READ_DELAY)\n });\n }\n\n // Clear notification queue and timer.\n clearNotificationQueue() {\n this.readNotificationQueue = [];\n if (this.readNotificationTimer) {\n clearInterval(this.readNotificationTimer);\n this.readNotificationTimer = null;\n }\n }\n\n handleSubsUpdated() {\n if (this.state.topic) {\n const subs = [];\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.subscribers(sub => {\n if (sub.online && sub.user != this.props.myUserId) {\n subs.push(sub);\n }\n });\n const newState = {onlineSubs: subs, subsVersion: this.state.subsVersion + 1};\n const peer = topic.p2pPeerDesc();\n if (peer) {\n Object.assign(newState, {\n peerMessagingDisabled: isPeerRestricted(peer.acs)\n });\n } else if (this.state.peerMessagingDisabled) {\n Object.assign(newState, {\n peerMessagingDisabled: false\n });\n }\n this.setState(newState);\n }\n }\n\n // The 'msg' could be false-ish if some message ranges were deleted.\n handleMessageUpdate(msg) {\n if (!this.state.topic) {\n return;\n }\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (!msg) {\n // msg could be null if one or more messages were deleted.\n // Updating state to force redraw.\n this.setState({latestClearId: topic.maxClearId()});\n return;\n }\n\n clearTimeout(this.keyPressTimer)\n this.setState({maxSeqId: topic.maxMsgSeq(), minSeqId: topic.minMsgSeq(), typingIndicator: false}, _ => {\n // Scroll to the bottom if the message is added to the end of the message\n // list if already at the bottom, otherwise show [go to latest] button.\n // Implemented as a callback to be sure the scroll height has been updated.\n if (topic.isNewMessage(msg.seq)) {\n if (this.state.scrollPosition > SHOW_GO_TO_LAST_DIST) {\n this.setState({showGoToLastButton: true});\n } else {\n this.goToLatestMessage();\n }\n } else {\n if (this.messagesScroller) {\n this.messagesScroller.scrollTop = this.messagesScroller.scrollHeight - this.state.scrollPosition -\n this.messagesScroller.offsetHeight;\n }\n }\n });\n\n // Aknowledge messages except own messages. They are\n // automatically assumed to be read and recived.\n const status = topic.msgStatus(msg, true);\n if (status >= Tinode.MESSAGE_STATUS_SENT && msg.from != this.props.myUserId) {\n this.postReadNotification(msg.seq);\n }\n }\n\n handleAllMessagesReceived(count) {\n this.setState({fetchingMessages: false});\n if (!count) {\n // All messages received. Nothing left to receive.\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (topic) {\n // Send read notification for the absolute last message.\n this.postReadNotification(topic.seq);\n }\n return;\n }\n\n // Load pinned message too (if any);\n if (!this.state.pinsLoaded) {\n // This needs to be guarded to avoid an infinite loop.\n // The loop may happen if some pinned messages are deleted.\n const topic = this.props.tinode.getTopic(this.state.topic);\n this.setState({pinsLoaded: true}, _ => {\n topic.getPinnedMessages();\n });\n } else {\n this.setState({pinsLoaded: false});\n }\n }\n\n handleAuxUpdate(aux) {\n const pins = (aux['pins'] || []).slice();\n let selectedPin = this.state.selectedPin;\n if (pins.length > this.state.pins.length) {\n // New pins added, show the latest.\n selectedPin = 0;\n } else if (selectedPin >= pins.length) {\n selectedPin = Math.max(0, pins.length - 1);\n }\n this.setState({pins: pins, selectedPin: selectedPin});\n }\n\n handleInfoReceipt(info) {\n switch (info.what) {\n case 'kp': {\n clearTimeout(this.keyPressTimer);\n this.keyPressTimer = setTimeout(_ => this.setState({typingIndicator: false}), KEYPRESS_DELAY + 1000);\n if (!this.state.typingIndicator) {\n this.setState({typingIndicator: true});\n }\n break;\n }\n case 'read':\n case 'recv':\n // Redraw due to changed recv/read status.\n this.forceUpdate();\n break;\n default:\n console.info(\"Other change in topic: \", info.what);\n }\n }\n\n handleExpandMedia(content) {\n if (!content) {\n return;\n }\n\n if (content.video) {\n this.setState({videoPostview: content});\n } else {\n this.setState({imagePostview: content});\n }\n }\n\n handleClosePreview() {\n if (this.state.imagePreview && this.state.imagePreview.url) {\n URL.revokeObjectURL(this.state.imagePreview.url);\n }\n if (this.state.videoPreview && this.state.videoPreview.url) {\n URL.revokeObjectURL(this.state.videoPreview.url);\n }\n this.setState({\n imagePostview: null,\n imagePreview: null,\n docPreview: null,\n videoPreview: null,\n videoPostview: null,\n });\n this.props.onCancelForwardMessage();\n }\n\n handleFormResponse(action, text, data) {\n if (action == 'pub') {\n this.sendMessage(Drafty.attachJSON(Drafty.parse(text), data));\n } else if (action == 'url') {\n const url = new URL(data.ref);\n const params = url.searchParams;\n for (let key in data.resp) {\n if (data.resp.hasOwnProperty(key)) {\n params.set(key, data.resp[key]);\n }\n }\n ['name', 'seq'].forEach(key => {\n if (data[key]) {\n params.set(key, data[key]);\n }\n });\n params.set('uid', this.props.myUserId);\n params.set('topic', this.state.topic);\n url.search = params;\n window.open(url, '_blank');\n } else {\n console.info(\"Unknown action in form\", action);\n }\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n this.props.showContextMenu({ topicName: this.state.topic, y: e.pageY, x: e.pageX });\n }\n\n handleShowMessageContextMenu(params, messageSpecificMenuItems) {\n if (params.userFrom == 'chan') {\n params.userFrom = this.state.topic;\n params.userName = this.state.title;\n }\n params.topicName = this.state.topic;\n let menuItems = messageSpecificMenuItems || [];\n // Picking \"回复\" on some other message while already editing one (this.state.reply.editing)\n // silently abandons the edit: handlePickReply overwrites this.state.reply wholesale but never\n // touches contentToEdit, so the composer keeps showing the message being edited while the\n // header/send-icon quietly switch to reply mode -- sending then posts that text as a brand new\n // reply to the other message, and the original edit is lost with no confirmation. Simplest fix\n // is the same one already used for menu_item_edit's window check: just don't offer the option\n // that would cause it, rather than trying to reconcile the two states after the fact.\n if (this.state.reply && this.state.reply.editing) {\n menuItems = menuItems.filter(item => item !== 'menu_item_reply');\n }\n const topic = this.props.tinode.getTopic(params.topicName);\n if (topic) {\n // Edit (Ch.4): chat-message.jsx already gated 'menu_item_edit' on writer + non-attachment\n // content, but has no access to the server-configured edit window (that's session-level state\n // living here, not a per-message prop) -- unlike recall just below, this was never actually\n // filtered by age, so an edit attempt on a message well past the window would only fail at\n // send time instead of never showing the option. Same window-check shape as recall's, just\n // removing the item after the fact instead of adding it, since base eligibility already ran.\n const editWindow = this.state.messagePolicy ? this.state.messagePolicy.edit_window_seconds : 0;\n if (menuItems.includes('menu_item_edit') && !(editWindow > 0 && params.timestamp &&\n params.timestamp.getTime() > (new Date().getTime() - editWindow * 1000))) {\n menuItems = menuItems.filter(item => item !== 'menu_item_edit');\n }\n menuItems.push('menu_item_copy', 'menu_item_favorite');\n // Recall (Ch.4): own message, real seq, and still inside the server-configured window.\n // Distinct from delete -- see context-menu.jsx recallOwnMessage for why both exist.\n // A group admin/owner can also recall *other* members' messages within the same window --\n // server/im_http.go's serveIMMessageRecall calls authorizeIMMessageMutation with\n // allowAdmin=true, so the backend has always accepted this; the reference screenshot\n // (消息页面—长按弹出.png) lists \"群撤回\" as its own, always-shown menu item alongside \"撤回\" --\n // this was previously never offered at all since the only condition checked was authorship.\n const recallWindow = this.state.messagePolicy ? this.state.messagePolicy.recall_window_seconds : 0;\n const canRecallAsAdmin = topic.isGroupType() && topic.getAccessMode() && topic.getAccessMode().isAdmin();\n if ((params.userFrom == this.props.myUserId || canRecallAsAdmin) && params.seq > 0 && recallWindow > 0 &&\n params.timestamp && params.timestamp.getTime() > (new Date().getTime() - recallWindow * 1000)) {\n menuItems.push('menu_item_recall');\n }\n // Self -> (1) always hard-delete with [Delete] title.\n // P2P -> (1) hard-delete if allowed and not too old, (2) always soft-delete.\n // Group -> (1) hard-delete if allowed and not too old or owner, (2) always soft-delete.\n if (topic.isSelfType()) {\n // Hard-delete with plain [Delete] title.\n menuItems.push('message_delete_generic');\n } else {\n if (!topic.isChannelType()) {\n // P2P or normal group: always allow to soft-delete.\n menuItems.push('message_delete');\n }\n\n const acs = topic.getAccessMode();\n if (acs && acs.isDeleter()) {\n // Owner can always hard-delete regardless of age.\n let canDelete = acs.isOwner();\n if (!canDelete) {\n // Not owner: check message age if configured on the server.\n const maxDelAge = this.props.tinode.getServerParam(Tinode.MSG_DELETE_AGE, 0) | 0;\n // Make sure the message is not too old. This check is here just to make the UI\n // more user-friendly. The server will enforce the limit regardless of this.\n canDelete = maxDelAge == 0 || (maxDelAge > 0 && params.timestamp ?\n params.timestamp.getTime() > (new Date().getTime() - maxDelAge * 1000) : false);\n }\n if (canDelete) {\n // [Delete for All] title.\n menuItems.push('message_delete_hard');\n }\n }\n }\n }\n menuItems.push('menu_item_select');\n this.props.showContextMenu(params, menuItems);\n }\n\n handleNewChatAcceptance(action) {\n this.props.onNewChat(this.state.topic, action);\n }\n\n handleEnablePeer(e) {\n e.preventDefault();\n this.props.onChangePermissions(this.state.topic, DEFAULT_P2P_ACCESS_MODE, this.state.topic);\n }\n\n // Fetch the real friend/block/pending relationship state for a 1:1 topic so the UI can explain\n // (instead of silently disabling) why sending is restricted. Best-effort: a failed fetch just\n // leaves relationshipContext null and the existing isWriter-based disable stays in effect.\n loadRelationshipContext(topic) {\n if (!topic || !topic.isP2PType()) {\n return;\n }\n const topicName = topic.name;\n getConversationContext(topicName).then(data => {\n if (this.state.topic == topicName) {\n this.setState({relationshipContext: data});\n }\n }).catch(_ => {});\n }\n\n // Ch.6: role badges (docs/images/群标识.png) and the announcement/join-request banners at the top of a\n // group chat (docs/images/群公告状态.png, 新邀请进群申请.png) all need data no P2P topic has -- fetch it\n // once per group-topic-load, same best-effort pattern as loadRelationshipContext above. Every `topic`\n // field these Ch.6 endpoints return is a real grp-prefixed native Tinode name (verified against the Go\n // source), so there's no Ch.5-style translation needed anywhere here.\n loadGroupContext(topic) {\n if (!topic || !topic.isGroupType() || topic.isChannelType()) {\n return;\n }\n const topicName = topic.name;\n getGroupMembers(topicName).then(data => {\n if (this.state.topic != topicName) {\n return;\n }\n const roles = {};\n (data.items || []).forEach(m => { roles[m.user_id] = m.role; });\n this.setState({groupRoles: roles, myGroupRole: roles[this.props.myUserId] || null});\n // Pending join requests can only be resolved by an admin/owner -- only they can act on the banner,\n // and only they pass requireIMGroupMember's IsAdmin() check on the list endpoint itself.\n if (roles[this.props.myUserId] == 'owner' || roles[this.props.myUserId] == 'admin') {\n getGroupJoinRequests(topicName, 'pending').then(reqData => {\n if (this.state.topic == topicName) {\n this.setState({pendingJoinRequests: (reqData.items || []).length});\n }\n }).catch(_ => {});\n }\n }).catch(_ => {});\n getLatestGroupAnnouncement(topicName).then(data => {\n if (this.state.topic == topicName) {\n this.setState({groupAnnouncement: (data && data.content) ? data : null});\n }\n }).catch(_ => {});\n }\n\n // 4.2-4.3 @提醒:只对群话题开放(私聊提@没有意义,也没有可选的\"其他成员\")。返回给\n // send-message.jsx 的选择器渲染,真正的 uid 解析在 mentionSelected 里记下来,供发送时\n // applyMentionResolution 使用。\n mentionSearch(query) {\n const topic = this.props.tinode ? this.props.tinode.getTopic(this.state.topic) : null;\n if (!topic || !topic.isGroupType()) {\n return Promise.resolve([]);\n }\n return getGroupMembers(this.state.topic, {mentionable: true, query}).then(data => {\n const items = data.items || [];\n // \"所有人\" (参考图 @人员—选择提醒人.png 里排在真实成员最前面的合成选项) -- server/topic.go's\n // validateAndNormalizeMentions rejects head.mention_all from anyone who isn't admin\n // (ErrPermissionDenied), so this is only offered to accounts GET .../members already told us\n // can actually use it -- an ineligible account would otherwise see the option, pick it, and\n // have the server silently reject the send.\n const canMentionAll = !!(data.permissions && data.permissions.can_mention_all);\n if (canMentionAll && '所有人'.includes((query || '').trim())) {\n return [{user_id: MENTION_ALL_UID, display_name: '所有人'}, ...items];\n }\n return items;\n });\n }\n\n mentionSelected(uid, name) {\n if (uid === MENTION_ALL_UID) {\n // Not a real Drafty mention to resolve -- sendMessage below reads this flag directly to set\n // head.mention_all, independent of the this.mentionedUsers/applyMentionResolution machinery\n // single-person @提醒 uses. The \"@所有人\" text itself still gets auto-detected by Drafty.parse\n // into an ordinary (uid-less) MN entity and renders highlighted like any other mention --\n // that's just decorative here since the real \"notify everyone\" effect comes from the head flag.\n this.mentionAllPending = true;\n return;\n }\n this.mentionedUsers = (this.mentionedUsers || []).filter(m => m.name !== name);\n this.mentionedUsers.push({uid, name});\n }\n\n // 4.1 跨话题草稿:话题一切换就去问服务端这个会话有没有存过草稿。原生话题名(P2P 用对方\n // user_id)直接可用,接口内部自己会做订阅存在性校验,不需要额外归一化。\n loadDraft(topic) {\n if (!topic) {\n return;\n }\n const topicName = topic.name;\n getTopicDraft(topicName).then(data => {\n if (this.state.topic != topicName) {\n return;\n }\n this.setState({draftText: data.content || '', draftVersion: data.version || 0});\n }).catch(_ => {});\n }\n\n // 输入框每次变化都会调这个(不在这里节流——防抖延迟统一放这一处,跟日报/月报草稿已有的\n // 600ms 防抖是同一个数值,方便以后统一调整)。编辑已有消息、转发预填内容这两种情况下\n // SendMessage 的文本框也会触发 onChange,但那些不是\"新写的草稿\",不应该覆盖真正的草稿。\n //\n // 定时器按话题分开存(this.draftSaveTimers 是个 map),不能像原来那样用单个共享句柄——\n // 那样话题A打字触发的600ms保存,会在300ms后切到话题B打字时被 clearTimeout 直接取消掉,\n // A刚打的字就再也不会发给服务器了。\n //\n // version 在这里(调用的当下,this.state.topic 必然还是 topicName,因为 onMessageChange\n // 只有当前激活话题的 SendMessage 实例会触发)同步捕获进闭包,不能等定时器触发时才去读\n // this.state.draftVersion——那时用户很可能已经切到别的话题,届时重新读到的要么是无关话题\n // 的版本号,要么在判断不匹配时退化成硬编码的 0。后端 PUT .../draft 对 version=0 是\"无条件\n // 跳过乐观锁校验直接覆盖\"而不是\"仅当草稿真的不存在时才创建\"(见\n // docs/IM-后端问题清单-2026-09-04.md),这个 0 一旦被真的发出去,可能无声覆盖掉这段时间里\n // 别的标签页/设备写入的更新草稿。\n handleComposerChange(text) {\n if (this.state.reply && this.state.reply.editing) {\n return;\n }\n if (this.props.forwardMessage) {\n return;\n }\n const topicName = this.state.topic;\n if (!topicName) {\n return;\n }\n const version = this.state.draftVersion || 0;\n this.draftSaveTimers = this.draftSaveTimers || {};\n if (this.draftSaveTimers[topicName]) {\n window.clearTimeout(this.draftSaveTimers[topicName]);\n }\n this.draftSaveTimers[topicName] = window.setTimeout(() => {\n delete this.draftSaveTimers[topicName];\n updateTopicDraft(topicName, text, [], version).then(d => {\n if (this.state.topic == topicName) {\n this.setState({draftVersion: d.version});\n }\n }).catch(_ => {});\n }, 600);\n }\n\n // 消息真的发出去之后,把服务端存的草稿清空——不然重新打开这个会话会看到已经发送过的旧文字。\n // 单纯等下一次防抖自然把空字符串存上去也能达到同样效果,但那样在\"发送后立刻切走\"这个真实\n // 会发生的场景里会有一个几百毫秒的窗口,草稿还是旧内容,不如发送成功后立刻清。\n // knownVersion 由调用方(sendMessage)在发送发起的那一刻同步捕获传入,原因同上——避免在\n // 发送成功回调触发时(用户很可能已经切换话题)重新派生出不可靠的版本号。\n clearDraft(topicName, knownVersion) {\n if (this.draftSaveTimers && this.draftSaveTimers[topicName]) {\n window.clearTimeout(this.draftSaveTimers[topicName]);\n delete this.draftSaveTimers[topicName];\n }\n const version = knownVersion != null ? knownVersion :\n (this.state.topic == topicName) ? (this.state.draftVersion || 0) : 0;\n updateTopicDraft(topicName, '', [], version).then(d => {\n if (this.state.topic == topicName) {\n this.setState({draftText: '', draftVersion: d.version});\n }\n }).catch(_ => {});\n }\n\n // Note: setUrlSidePanel only overwrites path[0] -- called with window.location.hash while a topic is\n // open (path[1] is the open topic), it leaves that segment in place, producing e.g.\n // \"#group-announcement-detail/grpXXX?topic=grpXXX\". handleHashRoute then re-parses path[1] as a topic\n // selector on every hashchange, fighting with the sidepanel that's trying to open and leaving the\n // whole view blank. Build the target hash from an empty path instead of the current one.\n handleShowAnnouncement(e) {\n e.preventDefault();\n // `from=chat` lets Announcement (group-management-view.jsx) tell this entry point apart from\n // the one via group-settings -- both land on the identical path[0]/topic hash otherwise, so\n // without it the \"back\" button can't know whether to return to group-settings or to this chat.\n let hash = HashNavigation.addUrlParam(HashNavigation.setUrlSidePanel('', 'group-announcement-detail'), 'topic', this.state.topic);\n hash = HashNavigation.addUrlParam(hash, 'from', 'chat');\n HashNavigation.navigateTo(hash);\n }\n\n handleShowJoinRequests(e) {\n e.preventDefault();\n // `from=chat` mirrors handleShowAnnouncement above -- lets JoinRequests (group-management-view.jsx)\n // return to this chat instead of always landing on group-governance.\n let hash = HashNavigation.addUrlParam(HashNavigation.setUrlSidePanel('', 'group-join-requests'), 'topic', this.state.topic);\n hash = HashNavigation.addUrlParam(hash, 'from', 'chat');\n HashNavigation.navigateTo(hash);\n }\n\n handleSendFriendVerification(e) {\n e.preventDefault();\n // Same stray-path[1] hazard as handleShowAnnouncement above (build from an empty base, not the\n // current hash, since a topic is open) -- this one additionally never set `uid`, which the\n // friend-verification page needs (contact-management-view.jsx's Verification reads hashParams.uid)\n // to know who the verification is for; for a P2P topic that's simply the topic name itself.\n HashNavigation.navigateTo(HashNavigation.addUrlParam(\n HashNavigation.setUrlSidePanel('', 'friend-verification'), 'uid', this.state.topic));\n }\n\n showToast(text) {\n this.setState({toast: text});\n window.clearTimeout(this.toastTimer);\n // Matches div.toast.show's own fadein(0.5s) + hold(2.5s) + fadeout(0.5s) animation length,\n // so the class is removed right as the CSS fadeout finishes instead of cutting it short.\n this.toastTimer = window.setTimeout(() => this.setState({toast: null}), 3500);\n }\n\n handleBatchDelete() {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (!topic || !this.props.selectedSeqs.length) {\n return;\n }\n // A selected message may still be queued/uploading (no server-confirmed seq yet, same case\n // context-menu.jsx's single-message deleteMessages guards with cancelSend before falling\n // back to delMessagesList). delMessagesList's normalizeRanges silently drops local-only\n // seqs instead of cancelling them, so left unfiltered a still-uploading attachment would\n // survive \"delete\" and get sent normally once its upload finishes.\n const remaining = this.props.selectedSeqs.filter(seq => !topic.cancelSend(seq));\n if (!remaining.length) {\n this.props.onExitSelectMode();\n return;\n }\n topic.delMessagesList(remaining, true).then(_ => {\n this.props.onExitSelectMode();\n }).catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n // Per docs/images/多选-选中对话内容-收藏成功.png the selection stays visible behind the toast --\n // unlike delete, favoriting doesn't remove the messages, so there's no reason to exit select mode.\n handleBatchFavorite() {\n if (!this.props.selectedSeqs.length) {\n return;\n }\n const topicName = this.state.topic;\n const seqs = this.props.selectedSeqs.slice();\n favoriteMessages(seqs.map(seq => ({topic: topicName, seq}))).then(() => {\n // `result.failed` can't be trusted here: the batch-create endpoint reuses one request-level\n // Idempotency-Key across every message in the batch (docs/IM-后端问题清单-2026-09-04.md,\n // 新增1), so every item after the first silently no-ops via ON DUPLICATE KEY UPDATE and gets\n // folded into `existing_count` -- indistinguishable, from this response alone, from a message\n // that really was already favorited. Re-reading the actual favorites list and checking which\n // of the messages we just asked for really landed sidesteps that ambiguity entirely.\n return getFavorites({type: 'all', limit: 100}).then(data => {\n const items = (data && data.items) || [];\n const landed = new Set(items\n .filter(it => it.source && it.source.topic == topicName)\n .map(it => String(it.source.seq)));\n const missing = seqs.filter(seq => !landed.has(String(seq)));\n if (missing.length === seqs.length) {\n this.props.onError('收藏失败', 'err');\n } else if (missing.length) {\n this.showToast(`已收藏 ${seqs.length - missing.length}/${seqs.length} 条`);\n } else {\n this.showToast('收藏成功');\n }\n });\n }).catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n sendKeyPress(audio) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n if (!topic.isSubscribed()) {\n return;\n }\n if (audio) {\n // Doc's default for the \"user is recording voice\" indicator is OFF unless product opts in\n // (a non-persisted {note what:\"kpa\"} broadcast to every other group member) -- this was firing\n // unconditionally on every recording, contradicting that documented default. No product signal\n // to turn it on yet, so this is a deliberate no-op rather than a removed feature: re-enable by\n // restoring `topic.noteRecording(true);` here if/when that's confirmed wanted.\n return;\n }\n topic.noteKeyPress();\n }\n\n // sendMessage sends the message with an optional subscription to topic first.\n // typeHint (Ch.7): the backend's imMessageType() classifier -- which drives every type-filtered list\n // in this chapter (favorites tabs, chat-history search/media tabs) -- only recognizes a flat\n // content.file_id/content.url key or an explicit head['x-im-type'] hint; it never walks a real\n // Drafty entity array. Since every attachment this app actually sends uses the standard ent[]\n // format (Drafty.attachFile/insertImage/insertVideo), none of them carry a flat file_id, so without\n // this hint every image/video/file/voice message silently classifies as plain \"text\" server-side.\n // Mutates a parsed Drafty document in place, upgrading any auto-detected \"@name\" MN entity whose\n // raw matched text equals a name the user actually picked from the mention dropdown into a real,\n // uid-bearing mention. Entities that don't match anything tracked (a literal \"@word\" the user just\n // typed, or an edited/mismatched name) are left with their raw text value -- Tinode's own renderer\n // already falls back to displaying that gracefully, this only upgrades the ones it safely can.\n applyMentionResolution(parsed) {\n if (!parsed || !Array.isArray(parsed.ent) || !this.mentionedUsers || !this.mentionedUsers.length) {\n return;\n }\n parsed.ent.forEach(e => {\n if (e.tp === 'MN' && e.data && typeof e.data.val === 'string') {\n const match = this.mentionedUsers.find(m => m.name === e.data.val);\n if (match) {\n e.data.val = match.uid;\n }\n }\n });\n }\n\n sendMessage(msg, uploadCompletionPromise, uploader, typeHint) {\n // Captured before the reply/edit branches below possibly rewrite `msg` into a Drafty object\n // (Drafty.append(...) for a reply-with-quote) -- the URL risk check further down keys off\n // `typeof msg == 'string'`, so without this a plain-text reply containing a link would silently\n // skip the check entirely (a fresh, non-reply message with the same text does get checked).\n const originalText = typeof msg === 'string' ? msg : null;\n let head;\n if (!msg && this.props.forwardMessage) {\n // We are forwarding a message.\n msg = this.props.forwardMessage.msg;\n head = this.props.forwardMessage.head;\n this.handleCancelReply();\n } else if (this.state.reply) {\n if (this.state.reply.editing) {\n if (msg == this.state.contentToEdit) {\n // Message unchanged.\n this.handleCancelReply();\n return;\n }\n // Editing an existing message.\n head = {replace: ':' + this.state.reply.seq};\n } else if (this.state.reply.content) {\n // Replying to a message in this topic.\n // Turn it into Drafty so we can make a quoted Drafty object later.\n head = {reply: '' + this.state.reply.seq};\n if (typeof msg == 'string') {\n msg = Drafty.parse(msg);\n this.applyMentionResolution(msg);\n }\n msg = Drafty.append(Drafty.sanitizeEntities(this.state.reply.content), msg);\n }\n this.handleCancelReply();\n } else if (typeof msg == 'string' && this.mentionedUsers && this.mentionedUsers.length) {\n // 4.2-4.3 @提醒:Drafty.parse 本来就会把纯文本里的\"@word\"自动识别成 MN 实体,但\n // data.val 存的是匹配到的原始文字(tinode.dev.js 的 ENTITY_TYPES 表,pack: val =>\n // ({val: val.slice(1)})),不是 uid——那是纯文本解析器,不可能凭空知道 uid。真正的 uid\n // 只在用户从选择器里点选时才知道,记在 this.mentionedUsers 里;这里按显示名回填,把\n // 自动识别出的占位符换成真的 uid。没有任何选过的提醒时完全不碰 msg,维持字符串原样,\n // 交给 SDK 自己在更底层 parse(跟这次改动之前完全一样的行为,不引入任何差异)。\n const parsed = Drafty.parse(msg);\n this.applyMentionResolution(parsed);\n msg = parsed;\n }\n // Was only cleared on topic switch -- picking someone from the @提醒 picker once left them\n // resolvable for every later message in the same topic too, so literal text \"@张三\" typed by\n // hand, pasted, or quoted from someone else in a LATER, unrelated message would silently turn\n // into a real mention of whoever was last picked under that name. A retry of a failed send\n // (retrySend) reuses the already-resolved Drafty content stored on the failed pub, not this\n // array, so clearing it here doesn't affect retries.\n this.mentionedUsers = [];\n if (this.mentionAllPending) {\n // server/topic.go's validateAndNormalizeMentions reads head.mention_all directly -- it's a\n // separate signal from the Drafty MN entity the \"@所有人\" text itself auto-parses into (that\n // entity has no real uid and is purely decorative here, same as any other unresolved mention).\n // Reset immediately after reading, same lifecycle as this.mentionedUsers just above -- a\n // \"所有人\" pick should only apply to the one message being sent right now, not linger into\n // later ones in the same topic.\n head = {...(head || {}), mention_all: true};\n this.mentionAllPending = false;\n }\n if (typeHint) {\n head = {...(head || {}), 'x-im-type': typeHint};\n }\n\n const topicForDraft = this.state.topic;\n // Captured now, not re-read inside the .then() below -- by the time send actually resolves\n // the user may have switched topics, and clearDraft falling back to a hardcoded 0 runs into\n // the same backend version=0-skips-the-lock issue explained in handleComposerChange above.\n const draftVersionAtSend = this.state.draftVersion || 0;\n const doSend = () => {\n const result = this.props.sendMessage(msg, uploadCompletionPromise, uploader, head);\n // Only a plain-text compose (not a reply/edit/forward, all of which pass a Drafty object or\n // reuse contentToEdit rather than the persisted draft) has a server-side draft worth clearing.\n if (originalText != null && result && typeof result.then == 'function' && topicForDraft) {\n result.then(() => this.clearDraft(topicForDraft, draftVersionAtSend));\n }\n return result;\n };\n\n // Pre-send URL risk check (POST /security/urls/check) -- the only Ch.11 \"anti-fraud\" mechanism\n // with a real backend behind it. Only plain-text composed messages are checked (not forwards,\n // uploads, or already-Drafty content) since that's the one path a URL could plausibly be typed in.\n // Returns a promise resolving to `false` when the message was NOT sent (blocked/cancelled) so\n // send-message.jsx can leave the composer text intact instead of optimistically clearing it --\n // without this, a blocked message's text would just vanish with no failed-message trace to retry.\n // Was missing the `g` flag -- .match() without it only ever returns the FIRST url in the message,\n // so a second url (e.g. the phishing link in \"看这个 https://safe.example.com 但是别信这个\n // https://phish.example.com/login?token=abc\") never got checked at all as long as the first one\n // came back `allow`. Check every distinct url in the message and act on the riskiest verdict.\n const urlMatches = originalText && originalText.match(/https?:\\/\\/\\S+/g);\n if (urlMatches) {\n const RISK_RANK = {block: 2, warn: 1, allow: 0};\n const urls = Array.from(new Set(urlMatches));\n return Promise.all(urls.map(url => checkURL(url, 'message_compose'))).then(results => {\n const result = results.reduce((worst, r) => (RISK_RANK[r.decision] || 0) > (RISK_RANK[worst.decision] || 0) ? r : worst);\n if (result.decision === 'allow') {\n return doSend();\n }\n return new Promise(resolve => {\n // riskDialog is a single slot -- if an earlier risk check is still awaiting the user's\n // decision (two messages sent in quick succession, both flagged), overwriting it here\n // would leave that first promise permanently unresolved and its message silently dropped\n // with send-message.jsx never told to stop holding it as unsent. Resolving it `false` first\n // means it's treated the same as the user cancelling it -- lost, but not hung forever.\n if (this.state.riskDialog) this.state.riskDialog.resolve(false);\n this.setState({riskDialog: {blocked: result.decision === 'block', challengeId: result.risk_challenge_id, send: doSend, resolve}});\n });\n }).catch(_ => doSend()); // Don't let a risk-check failure block sending altogether.\n }\n\n return doSend();\n }\n\n handleRiskConfirm() {\n const dialog = this.state.riskDialog;\n if (!dialog) return;\n this.setState({riskDialog: null});\n const finish = () => dialog.resolve(dialog.send());\n if (dialog.challengeId) {\n confirmRiskChallenge(dialog.challengeId, 'continue').then(finish).catch(finish);\n } else {\n finish();\n }\n }\n\n handleRiskCancel() {\n const dialog = this.state.riskDialog;\n if (!dialog) return;\n this.setState({riskDialog: null});\n if (dialog.challengeId && !dialog.blocked) {\n confirmRiskChallenge(dialog.challengeId, 'cancel').catch(_ => {});\n }\n dialog.resolve(false);\n }\n\n // Retry sending a message.\n retrySend(pub) {\n this.props.sendMessage(pub.content, undefined, undefined, pub.head)\n .then(_ => {\n // All good. Remove the original message draft from the cache.\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.delMessagesList([pub.seq], true);\n });\n }\n\n // sendFileAttachment sends the file as Drafty message:\n // - if file is too large, upload it and send a s link.\n // - if file is small enough, just send it in-band.\n sendFileAttachment(file) {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (TheCard.isFileSupported(file.type, file.name) || file.type == TheCard.contentType) {\n // This is a vCard file, try to convert and send as TheCard.\n if (this.sendTheCardAttachment(file, maxInbandAttachmentSize)) {\n // Successfully sent as TheCard.\n return;\n }\n // Sending as TheCard failed, fall through to sending as generic file attachment.\n }\n\n // If the attachment is a JSON file, then use 'application/octet-stream' instead of 'application/json'.\n // This is a temporary workaround for the collision with the 'application/json' MIME type of form responses.\n // Remove this code in 2026 or so.\n const jsonMimeConverter = (fileType) => fileType === DRAFTY_FR_MIME_TYPE_LEGACY ? 'application/octet-stream' : fileType;\n\n if (file.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = createChatUploader(this.props.tinode);\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(file);\n const msg = Drafty.attachFile(null, {\n mime: jsonMimeConverter(file.type),\n filename: file.name,\n size: file.size,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader, 'file');\n } else {\n // Small enough to send inband.\n fileToBase64(file)\n .then(b64 => this.sendMessage(Drafty.attachFile(null, {\n mime: jsonMimeConverter(b64.mime),\n data: b64.bits,\n filename: b64.name,\n size: file.size\n }), undefined, undefined, 'file'))\n .catch(err => this.props.onError(err.message, 'err'));\n }\n }\n\n // Convert attached vCard to TheCard and send.\n sendTheCardAttachment(file, maxInbandAttachmentSize) {\n if (file.size > maxInbandAttachmentSize) {\n // Cannot convert to TheCard, send as a generic file attachment instead.\n return false;\n }\n\n if (file.type == TheCard.contentType) {\n // Already TheCard, no need to convert.\n this.sendMessage(Drafty.appendTheCard(null, file.object));\n return true;\n }\n\n importVCard(file)\n .then(card => {\n this.sendMessage(Drafty.appendTheCard(null, card));\n })\n .catch(err => {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_parse_vcard, {error: err.message}), 'err');\n });\n return true;\n }\n\n // handleAttachFile method is called when [Attach file] button is clicked: launch attachment preview.\n handleAttachFile(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.size > maxExternAttachmentSize) {\n // Too large.\n this.props.onError(this.props.intl.formatMessage(messages.file_attachment_too_large,\n {size: bytesToHumanSize(file.size), limit: bytesToHumanSize(maxExternAttachmentSize)}), 'err');\n } else {\n this.setState({\n docPreview: {\n file: file,\n name: file.name,\n size: file.size,\n type: file.type\n }\n });\n }\n }\n\n handleCallHangup(topic, seq) {\n this.props.onVideoCallClosed();\n this.setState({\n rtcPanel: null\n });\n this.props.onCallHangup(topic, seq);\n }\n\n handleCallPanelToggle() {\n this.setState({minimizedCallPanel: !this.state.minimizedCallPanel});\n }\n\n // sendImageAttachment sends the image bits as Drafty message.\n sendImageAttachment(caption, blob) {\n const mime = this.state.imagePreview.mime;\n const width = this.state.imagePreview.width;\n const height = this.state.imagePreview.height;\n const fname = this.state.imagePreview.filename;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n if (blob.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = createChatUploader(this.props.tinode);\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(blob);\n\n // Make small preview to show while uploading.\n imageScaled(blob, IMAGE_PREVIEW_DIM, IMAGE_PREVIEW_DIM, -1, false)\n // Convert tiny image into base64 for serialization and previewing.\n .then(scaled => blobToBase64(scaled.blob))\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: mime,\n _tempPreview: b64.bits, // This preview will not be serialized.\n bits: b64.bits, // Image thumbnail.\n width: width,\n height: height,\n filename: fname,\n size: blob.size,\n urlPromise: uploadCompletionPromise\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader, 'image');\n })\n .catch(err => this.props.onError(err, 'err'));\n return;\n }\n\n // Send the image inband if it's not too big. The image has been scaled already\n // in image preview.\n blobToBase64(blob)\n .then(b64 => {\n let msg = Drafty.insertImage(null, 0, {\n mime: b64.mime,\n bits: b64.bits,\n width: width,\n height: height,\n filename: fname,\n size: blob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n this.sendMessage(msg, undefined, undefined, 'image');\n });\n }\n\n // sendVideoAttachment sends the video bits as Drafty message.\n sendVideoAttachment(caption, videoBlob, previewBlob, params) {\n const width = params.width;\n const height = params.height;\n\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = (this.props.tinode.getServerParam('maxMessageSize',\n MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024) | 0;\n\n const uploads = [];\n let uploader;\n if ((videoBlob.size + previewBlob.size) > maxInbandAttachmentSize) {\n // One or both are too large to send inband. Uploading out of band and sending as a link.\n uploader = createChatUploader(this.props.tinode);\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n\n uploads[0] = videoBlob.size > maxInbandAttachmentSize * 0.675 ? uploader.upload(videoBlob) : null;\n uploads[1] = previewBlob.size > maxInbandAttachmentSize * 0.275 ? uploader.upload(previewBlob) : null;\n }\n\n if (uploads.length == 0) {\n // Both video and preview are small enough to send inband.\n Promise.all([blobToBase64(videoBlob), blobToBase64(previewBlob)])\n .then(b64s => {\n const [v64, i64] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: v64.mime,\n bits: v64.bits,\n preview: i64.bits,\n premime: i64.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size\n });\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n this.sendMessage(msg, undefined, undefined, 'video');\n });\n return;\n }\n\n const uploadCompletionPromise = Promise.all(uploads);\n\n const b64conv = [];\n // Small video converted to base64.\n b64conv[0] = uploads[0] ? null : blobToBase64(videoBlob);\n // Full-size preview fits inline.\n b64conv[1] = uploads[1] ? null : imageScaled(previewBlob, MAX_IMAGE_DIM, MAX_IMAGE_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n // Small preview to show while uploading.\n b64conv[2] = imageScaled(previewBlob, VIDEO_PREVIEW_DIM, VIDEO_PREVIEW_DIM, -1, false)\n .then(scaled => blobToBase64(scaled.blob));\n // Convert tiny image into base64 for serialization and previewing.\n Promise.all(b64conv)\n .then(b64s => {\n const [video, img, preview] = b64s;\n let msg = Drafty.insertVideo(null, 0, {\n mime: params.mime,\n bits: video ? video.bits : null,\n _tempPreview: preview.bits,\n preview: img ? img.bits : preview.bits,\n premime: img ? img.mime : preview.mime,\n width: width,\n height: height,\n duration: params.duration,\n filename: params.name,\n size: videoBlob.size,\n urlPromise: uploadCompletionPromise\n });\n\n if (caption) {\n msg = Drafty.appendLineBreak(msg);\n msg = Drafty.append(msg, Drafty.parse(caption));\n }\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader, 'video');\n })\n .catch(err => this.props.onError(err.message, 'err'));\n }\n\n // handleAttachImageOrVideo method is called when [Attach image or video] button is clicked: launch image or video preview.\n handleAttachImageOrVideo(file) {\n const maxExternAttachmentSize = this.props.tinode.getServerParam('maxFileUploadSize', MAX_EXTERN_ATTACHMENT_SIZE);\n\n if (file.type.startsWith('video/')) {\n this.setState({videoPreview: {\n url: URL.createObjectURL(file),\n blob: file,\n filename: file.name,\n size: file.size,\n mime: file.type\n }});\n return;\n }\n\n // Get image dimensions and size, optionally scale it down.\n imageScaled(file, MAX_IMAGE_DIM, MAX_IMAGE_DIM, maxExternAttachmentSize, false)\n .then(scaled => {\n this.setState({imagePreview: {\n url: URL.createObjectURL(scaled.blob),\n blob: scaled.blob,\n filename: scaled.name,\n width: scaled.width,\n height: scaled.height,\n size: scaled.blob.size,\n mime: scaled.mime\n }});\n }).catch(err => {\n this.props.onError(err.message, 'err');\n });\n }\n\n // handleFileDrop is called when the user drags & drops a file upon the message view.\n handleFileDrop(files) {\n if (!files || files.length == 0) {\n return;\n }\n const file = files[0];\n if (file.type && file.type.startsWith('image/')) {\n this.handleAttachImageOrVideo(file);\n } else {\n this.handleAttachFile(file);\n }\n }\n\n // sendAudioAttachment sends audio bits inband as Drafty message (no preview).\n sendAudioAttachment(url, preview, duration) {\n fetch(url)\n .then(result => result.blob())\n .then(blob => {\n // Server-provided limit reduced for base64 encoding and overhead.\n const maxInbandAttachmentSize = this.props.tinode.getServerParam('maxMessageSize', MAX_INBAND_ATTACHMENT_SIZE) * 0.75 - 1024;\n if (blob.size > maxInbandAttachmentSize) {\n // Too large to send inband - uploading out of band and sending as a link.\n const uploader = createChatUploader(this.props.tinode);\n if (!uploader) {\n this.props.onError(this.props.intl.formatMessage(messages.cannot_initiate_upload));\n return;\n }\n const uploadCompletionPromise = uploader.upload(blob);\n const msg = Drafty.appendAudio(null, {\n mime: blob.type,\n size: blob.size,\n duration: duration,\n preview: preview,\n urlPromise: uploadCompletionPromise\n });\n // Pass data and the uploader to the TinodeWeb.\n this.sendMessage(msg, uploadCompletionPromise, uploader, 'voice');\n } else {\n // Small enough to send inband.\n blobToBase64(blob)\n .then(b64 => {\n this.sendMessage(Drafty.appendAudio(null, {\n mime: b64.mime,\n bits: b64.bits,\n size: blob.size,\n duration: duration,\n preview: preview,\n }), undefined, undefined, 'voice')\n })\n }\n })\n .catch(err => {this.props.onError(err.message, 'err')});;\n }\n\n handleCancelUpload(seq, uploader) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const found = topic.findMessage(seq);\n if (found) {\n found._cancelled = true;\n }\n uploader.cancel();\n }\n\n // seq: seq ID of the source message\n // context: message content.\n // senderId: UID of the sender of the source message.\n // senderName: full name of the sender of the original message.\n handlePickReply(seq, content, senderId, senderName) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, QUOTED_REPLY_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(senderName, senderId, content),\n seq: seq\n }\n });\n this.props.onCancelForwardMessage();\n }\n\n // seq: seq ID of the message to edit.\n // context: message content.\n handleEditMessage(seq, content) {\n if (!seq || !content) {\n this.setState({reply: null});\n return;\n }\n\n content = typeof content == 'string' ? Drafty.init(content) : content;\n const editable = Drafty.toMarkdown(content);\n if (Drafty.isValid(content)) {\n content = Drafty.replyContent(content, EDIT_PREVIEW_LENGTH);\n } else {\n // /!\\ invalid content.\n content = Drafty.append(Drafty.init('\\u26A0 '),\n Drafty.wrapInto(this.props.intl.formatMessage(messages.invalid_content), 'EM'));\n }\n\n this.setState({\n reply: {\n content: Drafty.quote(this.props.intl.formatMessage(messages.editing_message), null, content),\n seq: seq,\n editing: true\n },\n contentToEdit: editable\n });\n this.props.onCancelForwardMessage();\n }\n\n\n handleCancelReply() {\n this.setState({reply: null, contentToEdit: null});\n this.props.onCancelForwardMessage();\n }\n\n handleQuoteClick(replyToSeq) {\n const ref = this.getOrCreateMessageRef(replyToSeq);\n if (ref && ref.current) {\n ref.current.scrollIntoView({block: \"center\", behavior: \"smooth\"});\n ref.current.classList.add('flash');\n setTimeout(_ => {ref.current.classList.remove('flash')} , 1000);\n } else {\n // Most commonly hit when the target message was deleted/recalled after being found by\n // Ch.7 chat-history search but before this click -- never gets a ref\n // (see jumpToMessage below), so without this the click did nothing visible at all.\n console.error(\"Unresolved message ref\", replyToSeq);\n if (this.props.onError) {\n this.props.onError('该消息已被删除或撤回', 'err');\n }\n }\n }\n\n // Ch.7 chat-history search result -> jump to the message in the real conversation. handleQuoteClick\n // only scrolls to a message already present in this topic's locally-cached message list (used\n // elsewhere for quoted-reply/pinned-message jumps, where that's always true); a search result can\n // point at a message far outside whatever window happens to be loaded, so fetch a window around it\n // first via the native SDK (not the REST search API -- handleQuoteClick reads refs off the SDK's own\n // local topic cache, so the data has to land there, which only getMeta does).\n jumpToMessage(seq) {\n const topic = this.props.tinode && this.props.topic ? this.props.tinode.getTopic(this.props.topic) : null;\n if (!topic || !seq || isNaN(seq)) {\n return;\n }\n HashNavigation.navigateTo(HashNavigation.removeUrlParam(window.location.hash, 'jumpseq'));\n const jump = () => window.setTimeout(() => this.handleQuoteClick(seq), 150);\n if (topic.findMessage(seq)) {\n jump();\n } else {\n topic.getMeta(topic.startMetaQuery().withData(Math.max(1, seq - 20), seq + 21, 41).build())\n .then(jump).catch(err => this.props.onError(err.message, 'err'));\n }\n }\n\n handleUnpinMessage(seq) {\n const topic = this.props.tinode.getTopic(this.state.topic);\n topic.pinMessage(seq, false);\n }\n\n isDragEnabled() {\n // Same editing-state guard as the attach-panel props in render() (see the `editingMessage`\n // local there) -- drag&drop is a second, independent path into handleFileDrop below, which\n // calls handleAttachImageOrVideo/handleAttachFile directly rather than through those props, so\n // gating only the props left this route as a full bypass of that guard: dropping a file while\n // editing a message (without touching the \"+\" button at all) still replaced the edited\n // message's content via sendMessage's head.replace, with no confirmation.\n const editingMessage = !!(this.state.reply && this.state.reply.editing);\n return this.state.isWriter && !this.state.unconfirmed && !this.props.forwardMessage &&\n !this.state.peerMessagingDisabled && !editingMessage;\n }\n\n handleDragStart(e) {\n e.preventDefault();\n e.stopPropagation();\n e.dataTransfer.clearData();\n }\n\n handleDragIn(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter++;\n if (e.dataTransfer.items && e.dataTransfer.items.length > 0) {\n this.setState({dragging: true});\n }\n }\n\n handleDragOut(e) {\n e.preventDefault();\n e.stopPropagation();\n this.dragCounter--;\n if (this.dragCounter <= 0) {\n this.setState({dragging: false});\n }\n }\n\n handleDrag(e) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n handleDrop(e) {\n e.preventDefault();\n e.stopPropagation();\n this.setState({dragging: false});\n if (this.isDragEnabled() && e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n this.handleFileDrop(e.dataTransfer.files);\n this.dragCounter = 0;\n }\n }\n\n render() {\n const {formatMessage} = this.props.intl;\n\n // P2P call is an overlay, not a separate component because it cannot be\n // re-mounted between full screen/minimized.\n const overlay = this.state.rtcPanel &&\n }>\n \n ;\n\n const riskDialog = this.state.riskDialog &&\n ;\n\n let component;\n if (!this.state.topic) {\n component = ;\n\n } else {\n let component2;\n if (this.state.imagePreview) {\n // Preview image before sending.\n component2 = (\n }>\n \n \n );\n } else if (this.state.videoPreview) {\n // Preview video.\n component2 = }>\n \n ;\n\n } else if (this.state.imagePostview) {\n // Expand received image.\n component2 = }>\n \n ;\n\n } else if (this.state.videoPostview) {\n // Play received video.\n component2 = }>\n \n ;\n\n } else if (this.state.docPreview) {\n // Preview attachment before sending.\n if (TheCard.isFileSupported(this.state.docPreview.type, this.state.docPreview.name) ||\n this.state.docPreview.type == TheCard.contentType) {\n component2 = }>\n \n ;\n } else {\n component2 = }>\n \n ;\n }\n } else {\n const topic = this.props.tinode.getTopic(this.state.topic);\n const isChannel = topic.isChannelType() || topic.chan;\n const groupTopic = topic.isGroupType() && !isChannel;\n const icon_badges = [];\n if (topic.trusted) {\n if (topic.trusted.verified) {\n icon_badges.push({icon: 'verified', color: 'badge-inv'});\n }\n if (topic.trusted.staff) {\n icon_badges.push({icon: 'staff', color: 'badge-inv'});\n }\n if (topic.trusted.danger) {\n icon_badges.push({icon: 'dangerous', color: 'badge-inv'});\n }\n }\n\n const pinnedMessages = [];\n this.state.pins.forEach(seq => pinnedMessages.push(topic.latestMsgVersion(seq) || topic.findMessage(seq)));\n\n const messageNodes = [];\n let previousFrom = null;\n let prevDate = null;\n let chatBoxClass = null;\n topic.messages((msg, prev, next, i) => {\n let nextFrom = next ? (next.from || 'chan') : null;\n\n let sequence = 'single';\n let thisFrom = msg.from || 'chan';\n if (thisFrom == previousFrom) {\n if (thisFrom == nextFrom) {\n sequence = 'middle';\n } else {\n sequence = 'last';\n }\n } else if (thisFrom == nextFrom) {\n sequence = 'first';\n }\n previousFrom = thisFrom;\n\n const isReply = !(thisFrom == this.props.myUserId);\n const deliveryStatus = topic.msgStatus(msg, true);\n\n let userFrom = thisFrom, userName, userAvatar;\n const user = topic.userDesc(thisFrom);\n if (user && user.public) {\n userName = user.public.fn;\n userAvatar = makeImageUrl(user.public.photo);\n }\n chatBoxClass = groupTopic ? 'chat-box group' : 'chat-box';\n\n // Ref for this chat message.\n const ref = this.getOrCreateMessageRef(msg.seq);\n let replyToSeq = msg.head ? parseInt(msg.head.reply) : null;\n if (!replyToSeq || isNaN(replyToSeq)) {\n replyToSeq = null;\n }\n\n if (msg.hi) {\n // Deleted message.\n messageNodes.push(\n \n );\n } else {\n const thisDate = new Date(msg.ts);\n // This message was sent on a different date than the previous.\n if (!prevDate || prevDate.toDateString() != thisDate.toDateString()) {\n messageNodes.push(\n \n );\n prevDate = thisDate;\n }\n messageNodes.push(\n \n );\n }\n });\n\n let lastSeen = null;\n if (isChannel) {\n if (topic.subcnt) {\n lastSeen = formatMessage(messages.subscriber_count, {count: topic.subcnt});\n }\n } else {\n const cont = this.props.tinode.getMeTopic().getContact(this.state.topic);\n if (cont) {\n if (Tinode.isP2PTopicName(cont.topic)) {\n if (cont.online) {\n lastSeen = formatMessage(messages.online_now);\n } else if (cont.seen) {\n lastSeen = formatMessage(messages.last_seen,\n {timestamp: shortDateFormat(cont.seen.when, this.props.intl.locale)});\n // TODO: also handle user agent in c.seen.ua\n }\n } else if (Tinode.isGroupTopicName(cont.topic)) {\n if (topic.subcnt) {\n lastSeen = formatMessage(messages.member_count, {count: topic.subcnt});\n }\n }\n }\n }\n const avatar = this.state.avatar || true;\n const online = this.state.deleted || topic.isSelfType() ? null :\n this.props.online ? 'online' + (this.state.typingIndicator ? ' typing' : '') : 'offline';\n\n const titleClass = 'panel-title' + (this.state.deleted ? ' deleted' : '');\n const darkModeClass = this.props.colorSchema == 'dark' ? 'dark' : '';\n // sendMessage() unconditionally sends whatever content it's given with head={replace:...}\n // while this.state.reply.editing is set (see sendMessage above) -- it has no way to tell\n // \"the user is still editing the original text\" apart from \"the user just picked a photo/\n // file/card/favorite from the attachment panel while that edit was still open\". Gating the\n // attach entry points closed here (same mechanism already used for forwardMessage below) is\n // simpler and safer than trying to teach sendMessage to distinguish those cases after the fact.\n const editingMessage = !!(this.state.reply && this.state.reply.editing);\n\n let messagesComponent = (\n <>\n {this.state.groupAnnouncement ?\n \n campaign \n {this.state.groupAnnouncement.content} \n chevron_right \n : null}\n {this.state.pendingJoinRequests > 0 ?\n \n person_add_alt \n 新邀请进群申请({this.state.pendingJoinRequests}) \n chevron_right \n : null}\n \n
\n arrow_downward \n \n
\n {!this.state.isReader ?\n
\n {this.state.readingBlocked ?\n
\n \n
\n : null }\n
\n : null }\n
\n check {this.state.toast}\n
\n
\n {this.state.peerMessagingDisabled && !this.state.unconfirmed ?\n : null}\n {!this.state.unconfirmed && this.state.relationshipContext &&\n this.state.relationshipContext.relationship == 'pending_inbound' ?\n 以上是打招呼的消息
: null}\n {!this.state.unconfirmed && this.state.relationshipContext &&\n this.state.relationshipContext.relationship == 'pending_outbound' ?\n 好友申请正在等待处理
: null}\n {!this.state.unconfirmed && this.state.relationshipContext &&\n this.state.relationshipContext.relationship == 'none' ?\n : null}\n {this.props.selectMode ?\n \n : this.state.unconfirmed ?\n \n :\n }\n >\n );\n\n component2 = (\n <>\n \n {this.props.displayMobile ?\n <>\n {this.state.pins.length > 0 ?\n this.setState({selectedPin: index})}\n onSelected={this.handleQuoteClick}\n onCancel={this.handleUnpinMessage} />\n : null\n }\n \n >\n : null}\n \n {messagesComponent}\n {this.state.dragging && this.isDragEnabled() ?\n {formatMessage(messages.drag_file)}
\n : null}\n >\n );\n }\n component = {component2}{overlay}{riskDialog}
\n }\n return component;\n }\n};\n\nexport default injectIntl(MessagesView);\n","import React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport FileProgress from './file-progress.jsx';\nimport { createFileDownloader } from '../lib/im-api.js';\nimport { bytesToHumanSize } from '../lib/strformat.js';\nimport { isUrlRelative, sanitizeUrl } from '../lib/utils.js';\n\n// Same broad-category icon+color convention already established for file cards elsewhere\n// (content-library-view.jsx / group-management-view.jsx's FILE_TYPE_META) -- this was the one place\n// that never adopted it and instead used the same generic gray icon for every attachment regardless\n// of type. This client-side mime sniff exists only because chat attachments (unlike a group file\n// or a favorite) don't carry a server-computed file_type field to look up directly.\nconst ATTACHMENT_TYPE_META = {image: ['image', '#3ba55c'], video: ['videocam', '#3b82c4'], audio: ['audiotrack', '#8b5cf6'], document: ['description', '#e05d44'], file: ['insert_drive_file', '#8a8f98']};\nfunction attachmentTypeFromMime(mime) {\n const m = (mime || '').toLowerCase();\n if (m.startsWith('image/')) return 'image';\n if (m.startsWith('video/')) return 'video';\n if (m.startsWith('audio/')) return 'audio';\n if (m === 'application/pdf' || m === 'text/plain' || m.includes('msword') || m.includes('wordprocessingml') ||\n m.includes('spreadsheetml') || m.includes('presentationml') || m === 'application/vnd.ms-excel' || m === 'application/vnd.ms-powerpoint') {\n return 'document';\n }\n return 'file';\n}\n\nexport default class Attachment extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n downloader: null,\n progress: 0\n };\n\n this.downloadFile = this.downloadFile.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n }\n\n downloadFile(url, filename, mimetype) {\n if (!url) {\n this.props.onError(\"Invalid download URL '\" + url + \"'\");\n return;\n }\n\n // Same wrong-header bug as content-library-view.jsx's DownloadPage (X-Tinode-APIKey/\n // X-Tinode-Auth, neither recognized by this backend) -- confirmed live: clicking \"保存\" on any\n // real chat file attachment 403'd with \"valid API key required\". createFileDownloader() is the\n // fixed-headers drop-in with the same download()/cancel() interface.\n const downloader = createFileDownloader(this.props.tinode);\n this.setState({downloader: downloader});\n downloader.download(url, filename, mimetype,\n loaded => this.setState({progress: loaded / this.props.size}),\n err => this.props.onError(err, 'err')\n )\n .then(_ => this.setState({downloader: null, progress: 0}))\n .catch(err => {\n if (err) {\n this.props.onError(\"Error downloading file: \" + err.message, 'err');\n }\n this.setState({downloader: null, progress: 0});\n });\n }\n\n handleCancel() {\n if (this.props.uploading) {\n this.props.onCancelUpload();\n } else if (this.state.downloader) {\n this.state.downloader.cancel();\n }\n }\n\n render() {\n let filename = this.props.filename || 'file_attachment';\n if (filename.length > 36) {\n filename = filename.substr(0, 16) + '...' + filename.substr(-16);\n }\n let size = this.props.size > 0 ?\n ({bytesToHumanSize(this.props.size)}) :\n null;\n\n // Detect if the download URL is relative or absolute.\n // If the URL is relative use LargeFileHelper to attach authentication\n // credentials to the request.\n let url, helperFunc;\n if (!this.props.uploading && !this.state.downloader && isUrlRelative(this.props.downloadUrl)) {\n // Relative URL. Use download helper.\n url = '#';\n helperFunc = (e) => {\n e.preventDefault();\n this.downloadFile(this.props.downloadUrl, this.props.filename, this.props.mimetype);\n };\n } else {\n url = sanitizeUrl(this.props.downloadUrl);\n helperFunc = null;\n }\n const downloadWidget = <>file_download >;\n const [icon, color] = ATTACHMENT_TYPE_META[attachmentTypeFromMime(this.props.mimetype)];\n return (\n \n
{icon}
\n
\n
{filename} {size}
\n {this.props.uploading || this.state.downloader ?\n
\n :\n
\n }\n
\n
\n );\n }\n};\n","// Single chat message bubble, sent or received.\n\nimport React from 'react';\nimport { FormattedMessage, injectIntl } from 'react-intl';\nimport { Drafty, Tinode, TheCard } from 'tinode-sdk';\n\nimport Attachment from './attachment.jsx';\nimport ForwardBundle from './forward-bundle.jsx';\nimport LetterTile from './letter-tile.jsx';\nimport ReceivedMarker from './received-marker.jsx'\n\nimport { fullFormatter } from '../lib/formatters.js';\nimport { sanitizeUrl } from '../lib/utils.js';\nimport HashNavigation from '../lib/navigation.js';\n\n// 4.9 语音未读红点:纯客户端概念,没有对应的后端字段——原生 Tinode 的 recv/read 只标记到\n// \"这条消息本身有没有被看到\",跟\"这条语音有没有被真的点开听过\"是两回事(文字消息看一眼就算\n// 读过,语音消息可能只是划过去、根本没点开播放)。按话题分别记一份\"已播放过的 seq 集合\"在\n// localStorage,跟\"最近使用表情\"是同一类不需要后端参与的本地小状态。\n// Key还要按登录账号分——P2P话题名本身就是对方user_id,跟\"我是谁\"无关;这个应用已知同一浏览器\n// origin下多个账号共享localStorage(多标签页各自登录不同账号),不带uid会导致账号A点开播放过\n// 的语音,在账号B自己与同一个人/同一个群的独立会话里也显示成\"已读\"。\nconst VOICE_PLAYED_KEY_PREFIX = 'im-voice-played:';\nfunction isVoicePlayed(myUid, topic, seq) {\n try {\n const list = JSON.parse(localStorage.getItem(VOICE_PLAYED_KEY_PREFIX + myUid + ':' + topic) || '[]');\n return Array.isArray(list) && list.includes(seq);\n } catch (_) {\n return false;\n }\n}\nfunction markVoicePlayed(myUid, topic, seq) {\n try {\n const key = VOICE_PLAYED_KEY_PREFIX + myUid + ':' + topic;\n const list = JSON.parse(localStorage.getItem(key) || '[]');\n const set = Array.isArray(list) ? list : [];\n if (!set.includes(seq)) {\n // Cap so a very long-lived topic doesn't grow this without bound.\n localStorage.setItem(key, JSON.stringify(set.concat(seq).slice(-500)));\n }\n } catch (_) { /* ignore */ }\n}\n\nclass BaseChatMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n progress: 0,\n voicePlayed: isVoicePlayed(props.tinode.getCurrentUserID(), props.topic, props.seq)\n };\n\n if (props.uploader) {\n props.uploader.onProgress = this.handleProgress.bind(this);\n }\n\n this.handleExpandImage = this.handleExpandImage.bind(this);\n this.handlePlayVideo = this.handlePlayVideo.bind(this);\n this.handleFormButtonClick = this.handleFormButtonClick.bind(this);\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n this.handleContextClick = this.handleContextClick.bind(this);\n this.handleCancelUpload = this.handleCancelUpload.bind(this);\n this.handleDraftyClick = this.handleDraftyClick.bind(this);\n this.handleVoicePlayed = this.handleVoicePlayed.bind(this);\n\n this.formatterContext = {\n formatMessage: props.intl.formatMessage.bind(props.intl),\n viewportWidth: props.viewportWidth,\n authorizeURL: props.tinode.authorizeURL.bind(props.tinode),\n\n onHandleClick: this.handleDraftyClick,\n // formatters.js's 'AU' case wires this to AudioPlayer's onPlay -- see handleVoicePlayed below\n // for why this needs to live on the instance (closes over this specific message's seq/topic)\n // rather than being a static, prop-derived value like the other formatterContext entries.\n onVoicePlayed: this.handleVoicePlayed\n };\n }\n\n handleDraftyClick = (e, action) => {\n switch (action) {\n case 'image':\n this.handleExpandImage(e);\n break;\n case 'video':\n this.handlePlayVideo(e);\n break;\n case 'form_button':\n this.handleFormButtonClick(e);\n break;\n case 'quote':\n this.handleQuoteClick(e);\n break;\n case 'contact_chat':\n e.preventDefault();\n try {\n // tinode:topic/usr123abc -> usr123abc\n const pathname = new URL(e.target.dataset.val)?.pathname;\n const parts = pathname.split('/').filter(Boolean);\n HashNavigation.navigateTo(HashNavigation.setUrlTopic('', parts.pop() || ''));\n } catch (error) {\n console.error(\"Invalid URL:\", error);\n }\n break;\n case 'contact_find':\n e.preventDefault();\n let hashUrl = HashNavigation.setUrlSidePanel(window.location.hash, 'newtpk');\n hashUrl = HashNavigation.addUrlParam(hashUrl, 'q', e.target.dataset.val);\n hashUrl = HashNavigation.addUrlParam(hashUrl, 'tab', 'find');\n HashNavigation.navigateTo(hashUrl);\n break;\n default:\n // No special handling; let the browser deal with it.\n console.info('Unhandled drafty action.', action, e.target.dataset);\n break;\n }\n }\n\n handleExpandImage(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n url: e.target.src,\n filename: e.target.dataset.name,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n\n handlePlayVideo(e) {\n e.preventDefault();\n this.props.onExpandMedia({\n video: true,\n url: e.target.dataset.src,\n preview: e.target.src,\n filename: e.target.dataset.name,\n width: e.target.dataset.width,\n height: e.target.dataset.height,\n duration: e.target.dataset.duration,\n size: e.target.dataset.size,\n type: e.target.dataset.mime\n });\n }\n\n handleFormButtonClick(e) {\n e.preventDefault();\n const data = {\n seq: this.props.seq\n };\n data.resp = {};\n if (e.target.dataset.name) {\n data.resp[e.target.dataset.name] = e.target.dataset.val ? e.target.dataset.val :\n e.target.dataset.val === undefined ? 1 : '' + e.target.dataset.val;\n }\n if (e.target.dataset.act == 'url') {\n data.ref = sanitizeUrl(e.target.dataset.ref) || 'about:blank';\n }\n const text = e.target.dataset.title || 'unknown';\n this.props.onFormResponse(e.target.dataset.act, text, data);\n }\n\n handleContextClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const menuItems = [];\n if (this.props.received == Tinode.MESSAGE_STATUS_FAILED) {\n menuItems.push('menu_item_send_retry');\n }\n if (this.props.received > Tinode.MESSAGE_STATUS_FATAL) {\n if (this.props.userIsWriter) {\n menuItems.push('menu_item_reply');\n if (!this.props.response) {\n let immutable = false;\n Drafty.entities(this.props.content, (_0, _1, tp) => {\n immutable = ['AU', 'EX', 'FM', 'IM', 'TC', 'VC', 'VD'].includes(tp);\n return immutable;\n });\n if (!immutable) {\n Drafty.styles(this.props.content, tp => {\n immutable = ['QQ'].includes(tp);\n return immutable;\n });\n }\n if (!immutable) {\n menuItems.push('menu_item_edit');\n }\n }\n }\n if (this.props.userIsAdmin) {\n menuItems.push(this.props.pinned ? 'menu_item_unpin' : 'menu_item_pin');\n }\n }\n menuItems.push('menu_item_forward');\n\n this.props.showContextMenu({\n seq: this.props.seq,\n replace: this.props.edited ? parseInt(this.props.edited.split(':')[1]) : 0,\n content: this.props.content,\n head: this.props.head,\n userFrom: this.props.userFrom,\n userName: this.props.userName,\n y: e.pageY,\n x: e.pageX,\n pickReply: this.props.pickReply,\n editMessage: this.props.editMessage,\n timestamp: this.props.timestamp,\n }, menuItems);\n }\n\n handleProgress(ratio) {\n this.setState({progress: ratio});\n }\n\n handleCancelUpload() {\n this.props.onCancelUpload(this.props.seq, this.props.uploader);\n }\n\n handleVoicePlayed() {\n if (this.state.voicePlayed) {\n return;\n }\n markVoicePlayed(this.props.tinode.getCurrentUserID(), this.props.topic, this.props.seq);\n this.setState({voicePlayed: true});\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n const replyToSeq = this.props.replyToSeq;\n if (replyToSeq) {\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n // Reason caption shown under a failed outgoing message in a 1:1 chat, based on the real\n // relationship state (see docs/images/个人对话—拉黑状态/已读状态.png and .../个人对话—删除状态.png).\n // Returns null for relationships that don't explain a send failure (friend, pending, unknown) so\n // a plain network failure doesn't get a misleading relationship-based caption.\n renderFailReason() {\n if (this.props.response ||\n (this.props.received != Tinode.MESSAGE_STATUS_FAILED && this.props.received != Tinode.MESSAGE_STATUS_FATAL)) {\n return null;\n }\n if (this.props.relationship == 'blocked_by_peer' || this.props.relationship == 'blocked_by_me') {\n return 消息已发送,但被对方拒收了
;\n }\n if (this.props.relationship == 'none') {\n return ;\n }\n return null;\n }\n\n render() {\n const sideClass = this.props.sequence + ' ' + (this.props.response ? 'left' : 'right');\n const bubbleClass = (this.props.sequence == 'single' || this.props.sequence == 'last') ? 'bubble tip' : 'bubble';\n const avatar = this.props.userAvatar || true;\n const isFailed = !this.props.response &&\n (this.props.received == Tinode.MESSAGE_STATUS_FAILED || this.props.received == Tinode.MESSAGE_STATUS_FATAL);\n const failReason = this.renderFailReason();\n // 4.9 语音未读红点:只对收到的(response=true)语音消息生效——自己发的语音不需要提醒自己听。\n let isVoiceMessage = false;\n if (this.props.response && this.props.mimeType == Drafty.getContentType() && Drafty.isValid(this.props.content)) {\n Drafty.entities(this.props.content, (_0, _1, tp) => {\n if (tp === 'AU') { isVoiceMessage = true; }\n return isVoiceMessage;\n });\n }\n const showVoiceUnreadDot = isVoiceMessage && !this.state.voicePlayed;\n let textSizeClass = 'message-content';\n const fullDisplay = (this.props.isGroup && this.props.response &&\n (this.props.sequence == 'single' || this.props.sequence == 'last'));\n\n let content = this.props.content;\n // Server-generated conversation notices (`system_notice`, e.g. `friend_added` sent once when two\n // users become friends -- see server's publishIMConversationSystemNotice) and group system-action\n // events (`system_action`, e.g. group_member_joined/join_request_approved/governance changes --\n // server/im_http.go's group event publishers) both carry a custom JSON shape\n // ({template, text, actors/actions, ...}), not Drafty and not a plain string, so without this\n // they fall through to the generic \"invalid content\" placeholder below -- a real, human-readable\n // message like \"有成员通过审批加入了群聊。\" was rendering as a bare warning icon. Reduce either to\n // its `text` upfront so the existing plain-string path renders it as an ordinary bubble -- these\n // are meant to read like a normal message, not a special banner.\n if (this.props.head && (this.props.head['x-im-type'] === 'system_notice' || this.props.head['x-im-type'] === 'system_action') &&\n content && typeof content == 'object' && typeof content.text == 'string') {\n content = content.text;\n }\n // 合并转发(服务端 mode=\"bundle\" 生成的消息)同样不是 Drafty,content 是\n // {bundle_id, title, item_count, preview, items, source_refs, comment}。不认这个类型的话\n // 一样会落到下面的 \"invalid content\" 兜底。渲染成一张可展开的\"聊天记录\"卡片。\n let bundleCard = null;\n if (this.props.head && this.props.head['x-im-type'] === 'forward_bundle' &&\n content && typeof content == 'object' && (content.items || content.preview)) {\n bundleCard = ;\n }\n const attachments = [];\n if (this.props.mimeType == Drafty.getContentType() && Drafty.isValid(content)) {\n Drafty.attachments(content, (att, i) => {\n if (Drafty.isFormResponseType(att.mime)) {\n // Don't show json drafty form response objects as attachments.\n // They are not meant for users.\n return;\n }\n attachments.push( );\n }, this);\n const tree = Drafty.format(content, fullFormatter, this.formatterContext);\n content = React.createElement(React.Fragment, null, tree);\n } else if (typeof content == 'string') {\n // Make font bigger for emoji-only messages.\n // Must use 'new RegExp(...)' because React does not like /{1-5}/.\n if (new RegExp('^\\\\p{RGI_Emoji}{1,5}$', 'v').test(content || '')) {\n // Content consists of 1-5 emoji characters. Count how many and use it to increase the font size.\n textSizeClass += ' emoji-' + (content || '').match(/\\p{RGI_Emoji}/vg).length;\n }\n } else {\n content = <>warning_amber \n >\n }\n\n return (\n \n {this.props.selectMode ?\n this.props.onToggleSelect(this.props.seq)}>\n {this.props.selected ? 'check_circle' : 'radio_button_unchecked'}\n : null}\n {this.props.isGroup && this.props.response ?\n \n {fullDisplay ?\n :\n null}\n
:\n null}\n {isFailed && failReason ?\n error : null}\n \n
\n {showVoiceUnreadDot ?
: null}\n
\n
\n {bundleCard || content}\n {attachments}\n
\n {this.props.timestamp ?\n
\n : null}\n
\n {this.props.showContextMenu && !this.props.selectMode ?\n
\n \n expand_more \n \n : null\n }\n
\n {failReason}\n {fullDisplay ?\n
\n {this.props.userName ||\n \n }\n {this.props.senderRole == 'owner' ? 群主 :\n this.props.senderRole == 'admin' ? 管理员 : null}\n
\n : null\n }\n
\n \n );\n }\n};\n\nconst IntlChatMessage = injectIntl(BaseChatMessage);\nconst ChatMessage = React.forwardRef((props, ref) => );\n\nexport default ChatMessage;\n","// 合并转发卡片(第4章 4.20)。\n//\n// 服务端在 `POST /v1/im/messages/forward` 的 mode=\"bundle\" 下会生成一条消息,\n// head 带 `x-im-type: \"forward_bundle\"`,content 形如:\n// {bundle_id, title, item_count, preview:[{from,type,summary,ts}], items:[...], source_refs, comment}\n// 这个结构不是 Drafty,所以不加这个渲染的话会落到 chat-message 的 \"invalid content\" 兜底。\n//\n// items[] 里已经带了每条被转发消息的完整快照,所以\"查看完整记录\"是就地展开,不需要额外请求。\nimport React from 'react';\n\n// 快照里的 from 是不带 usr 前缀的裸 uid(与收藏快照一致)。先补前缀再查本地会话缓存拿显示名,\n// 查不到就不显示发送者——宁可少一行,也不要把一串 uid 摆在摘要前面。\nfunction senderName(tinode, from) {\n const raw = (from || '').trim();\n if (!raw) return '';\n const uid = raw.startsWith('usr') ? raw : 'usr' + raw;\n const topic = tinode && tinode.getTopic ? tinode.getTopic(uid) : null;\n const pub = topic && topic.public;\n return (pub && (pub.fn || pub.name)) || '';\n}\n\nconst TYPE_LABEL = {image: '[图片]', video: '[视频]', voice: '[语音]', file: '[文件]', link: '[链接]'};\n\nfunction lineText(entry) {\n if (!entry) return '';\n const summary = (entry.summary || entry.text || '').trim();\n if (summary) return summary;\n return TYPE_LABEL[entry.type] || '';\n}\n\nexport default class ForwardBundle extends React.PureComponent {\n constructor(props) {\n super(props);\n this.state = {expanded: false};\n this.handleToggle = this.handleToggle.bind(this);\n }\n\n handleToggle(e) {\n e.preventDefault();\n e.stopPropagation();\n this.setState(s => ({expanded: !s.expanded}));\n }\n\n render() {\n const c = this.props.content || {};\n const count = Number(c.item_count) || (Array.isArray(c.items) ? c.items.length : 0);\n // 收起时用 preview(服务端已截到最多 3 条);展开时用 items(全量)。\n const rows = this.state.expanded ? (c.items || []) : (c.preview || []);\n const comment = (c.comment || '').trim();\n\n return \n
{c.title || '聊天记录'}
\n
\n {rows.map((entry, i) => {\n const who = senderName(this.props.tinode, entry.from);\n return \n {who ? {who}: : null}{lineText(entry)}\n ;\n })}\n \n {count > rows.length || this.state.expanded ?\n
\n {this.state.expanded ? '收起' : `查看完整记录(共 ${count} 条)`}\n :\n
共 {count} 条消息
}\n {comment ?
{comment}
: null}\n
;\n }\n}\n","// GroupSubs: a list of group subscribers currently online.\n// Show in the topic title bar\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport { MAX_ONLINE_IN_TOPIC } from '../config.js'\n\nimport LetterTile from './letter-tile.jsx';\nimport { makeImageUrl } from '../lib/blob-helpers.js';\n\nexport default class GroupSubs extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n const usersOnline = [];\n const totalCount = (this.props.subscribers || []).length;\n const countToShow = Math.min(MAX_ONLINE_IN_TOPIC, totalCount);\n\n (this.props.subscribers || []).some((sub) => {\n usersOnline.push(\n \n \n
\n );\n return usersOnline.length == countToShow;\n });\n if (usersOnline.length == 0) {\n return null;\n }\n return (\n {usersOnline} {totalCount > countToShow ?\n \n \n : null}\n
\n );\n }\n};\n","// A single topic or user.\nimport React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Invitation extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.handleButtonAction = this.handleButtonAction.bind(this);\n }\n\n handleButtonAction(evt, data) {\n evt.preventDefault();\n this.props.onAction(data);\n }\n\n render() {\n return (\n \n
\n \n
\n
\n { this.handleButtonAction(event, \"accept\"); }}>\n \n \n { this.handleButtonAction(event, \"delete\"); }}>\n \n \n { this.handleButtonAction(event, \"block\"); }}>\n \n \n
\n
\n );\n }\n};\n","// Message bubble with non-payload content, such as an indicator of deleted content or a date stamp.\n\nimport React from 'react';\n\nexport default class MetaMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n }\n\n render() {\n let content = null;\n let bubbleClass = 'bubble';\n if (this.props.date) {\n // A date badge.\n content = <>{this.props.date}>\n bubbleClass += ' date';\n } else if (this.props.deleted) {\n // 撤回/删除占位。messages-view.jsx 对 msg.hi 的消息一直在传 deleted={true},但这里从来\n // 没有处理过这个分支,于是整个组件走到下面的 `return null` —— 撤回一条消息之后时间线上\n // 什么都不剩,看不出这里曾经有过一条消息。文案复用已有的 message_deleted(\"消息已删除\")。\n content = {this.props.deletedText || '消息已删除'} ;\n bubbleClass += ' date';\n }\n\n if (!content) {\n return <>{null}>\n }\n\n return (\n \n \n \n );\n }\n};\n","// Send message form.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { Drafty } from 'tinode-sdk';\n\nimport { previewFormatter } from '../lib/formatters.js';\nimport { MIN_SWIPE_DISTANCE } from '../config.js';\n\nconst messages = defineMessages({\n message_not_found: {\n id: 'message_not_found',\n defaultMessage: 'message not found',\n description: 'Pinned message is not found'\n },\n message_deleted: {\n id: 'message_deleted',\n defaultMessage: 'message deleted',\n description: 'Pinned message is deleted'\n }\n});\n\nclass PinnedMessages extends React.PureComponent {\n constructor(props) {\n super(props);\n\n // Starting location of the touch gesture.\n this.touchX = null;\n this.touchY = null;\n\n this.touchSurface = React.createRef();\n\n this.getSelectedIndex = this.getSelectedIndex.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n this.handleSelected = this.handleSelected.bind(this);\n this.handleMoveNext = this.handleMoveNext.bind(this);\n this.handleMovePrev = this.handleMovePrev.bind(this);\n this.handleTouchEventStart = this.handleTouchEventStart.bind(this);\n this.handleTouchEventEnd = this.handleTouchEventEnd.bind(this);\n this.handleTouchCancel = this.handleTouchCancel.bind(this);\n }\n\n componentDidMount() {\n this.touchSurface.current.addEventListener('touchstart', this.handleTouchEventStart, {passive: true});\n this.touchSurface.current.addEventListener('touchend', this.handleTouchEventEnd, {passive: true});\n this.touchSurface.current.addEventListener('touchcancel', this.handleTouchCancel, {passive: true});\n }\n\n componentWillUnmount() {\n this.touchSurface.current.removeEventListener('touchstart', this.handleTouchEventStart);\n this.touchSurface.current.removeEventListener('touchend', this.handleTouchEventEnd);\n this.touchSurface.current.removeEventListener('touchcancel', this.handleTouchCancel);\n }\n getSelectedIndex() {\n const list = (this.props.pins || []);\n return list.length - this.props.selected - 1;\n }\n\n handleCancel(e) {\n e.preventDefault();\n this.props.onCancel(this.props.pins[this.getSelectedIndex()]);\n }\n\n handleSelected(e) {\n e.preventDefault();\n this.props.onSelected(this.props.pins[this.getSelectedIndex()]);\n }\n\n handleMoveNext(e, isTouch) {\n // Don't call preventDefault for touch events.\n isTouch || e.preventDefault();\n e.stopPropagation();\n const idx = Math.max(this.props.selected - 1, 0);\n if (idx != this.props.selected) {\n this.props.setSelected(idx);\n }\n }\n\n handleMovePrev(e, isTouch) {\n // Don't call preventDefault for touch events.\n isTouch || e.preventDefault();\n e.stopPropagation();\n const idx = Math.min(this.props.selected + 1, (this.props.pins || []).length - 1);\n if (idx != this.props.selected) {\n this.props.setSelected(idx);\n }\n }\n\n handleTouchEventStart(e) {\n if (e.touches.length == 1) {\n this.touchX = e.touches[0].clientX;\n this.touchY = e.touches[0].clientY;\n }\n }\n\n handleTouchEventEnd(e) {\n if (this.touchX === null || e.changedTouches.length != 1) {\n this.touchX = null;\n return;\n }\n\n const dX = this.touchX - e.changedTouches[0].clientX;\n const dY = this.touchY - e.changedTouches[0].clientY;\n this.touchX = null;\n\n if (Math.abs(dX) > Math.abs(dY) || Math.abs(dY) < MIN_SWIPE_DISTANCE) {\n // Horizontal swipe or too short vertical swipe.\n return;\n }\n\n if (dY > 0) {\n this.handleMovePrev(e, true);\n } else {\n this.handleMoveNext(e, true);\n }\n }\n\n handleTouchCancel() {\n this.touchX = null;\n }\n\n render() {\n const selected = this.getSelectedIndex();\n let messageShown = (this.props.messages || [])[selected];\n messageShown = messageShown ?\n messageShown._deleted ?\n {this.props.intl.formatMessage(messages.message_deleted)} \n :\n Drafty.format(messageShown.content, previewFormatter, {\n formatMessage: this.props.intl.formatMessage.bind(this.props.intl),\n authorizeURL: this.props.tinode.authorizeURL.bind(this.props.tinode)\n })\n :\n {this.props.intl.formatMessage(messages.message_not_found)} ;\n\n const dots = [];\n this.props.pins.forEach(seq => {\n const cn = dots.length == selected ? 'adot' : 'dot';\n dots.push(
);\n });\n\n return (\n \n {this.props.isAdmin ?\n
:\n
push_pin
\n }\n
{dots}
\n
\n
\n
\n );\n }\n}\n\nexport default injectIntl(PinnedMessages);\n","// Received/read indicator.\nimport React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nimport { Tinode } from 'tinode-sdk';\n\nimport { deliveryMarker } from '../lib/utils.js';\n\nconst messages = defineMessages({\n message_sending: {\n id: 'message_sending',\n defaultMessage: 'sending...',\n description: 'Message being sent, in place of time stamp'\n },\n message_sending_failed: {\n id: 'message_sending_failed',\n defaultMessage: 'failed',\n description: 'Failed to send message, in place of time stamp'\n },\n message_edited_marker: {\n id: 'message_edited_marker',\n defaultMessage: ', edited',\n description: 'Marker indicating that the message was edited'\n }\n});\n\nclass ReceivedMarker extends React.PureComponent {\n render() {\n const {formatMessage} = this.props.intl;\n let timestamp;\n if (this.props.received <= Tinode.MESSAGE_STATUS_SENDING) {\n timestamp = formatMessage(messages.message_sending);\n } else if (this.props.received == Tinode.MESSAGE_STATUS_FAILED ||\n this.props.received == Tinode.MESSAGE_STATUS_FATAL) {\n timestamp = formatMessage(messages.message_sending_failed);\n } else {\n timestamp = this.props.timestamp.toLocaleTimeString(this.props.intl.locale, { timeStyle: 'short' });\n }\n\n const icon = deliveryMarker(this.props.received);\n const marker = icon ? {icon.name} : null;\n const edited = this.props.edited ? formatMessage(messages.message_edited_marker) : null;\n\n return (\n \n {timestamp}{edited}{'\\u00a0'}{marker}\n \n );\n }\n};\n\nexport default injectIntl(ReceivedMarker);\n","// Send message form.\nimport React, { Suspense } from 'react';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport { Drafty, TheCard } from 'tinode-sdk';\n\n// Lazy-loading AudioRecorder because it's quite large due to\n// a dependency on webm-duration-fix.\nconst AudioRecorder = React.lazy(_ => import('./audio-recorder.jsx'));\n\nimport { KEYPRESS_DELAY } from '../config.js';\nimport { filePasted } from '../lib/blob-helpers.js';\nimport { replyFormatter } from '../lib/formatters.js';\nimport { forwardFavorites, getFavorites, getFileUrl, getFriends, translateReason } from '../lib/im-api.js';\n\n// 4.5-4.6 表情面板:参考图确认了\"只有2个tab\"(😊表情 / ♡)和\"发送按钮浅蓝禁用、深蓝启用\"这两点,\n// 但没有任何一张图能看清第二个tab具体展示什么内容——判断为\"常用\"(这是这类两tab设计里最常见的\n// 语义,也是本项目其它地方唯一有本地存储依据能撑起来的一种:不存在一个真实的\"收藏表情\"后端概念)。\n// 表情本身的具体清单——纠正一处之前的误判:参考图`表情包展开(发送按钮默认状态).png`/`表情包\n// 发送页面.png`其实清楚画出了一套具体的经典\"黄脸\"贴图(微信/QQ经典表情那种视觉风格),不是没有\n// 图片依据。只是这个项目没有对应的贴图素材资源,做不到跟截图完全一致的视觉,退而求其次选了一组\n// 常见、覆盖面广的系统 Unicode 表情——这是素材缺口下的折中方案,不是\"没有依据、随便选的\"。\nconst EMOJI_LIST = ['😀', '😁', '😂', '🤣', '😃', '😄', '😅', '😆', '😉', '😊', '😋', '😎', '😍', '😘',\n '🥰', '😗', '😙', '😚', '🙂', '🤗', '🤩', '🤔', '🤨', '😐', '😑', '😶', '🙄', '😏', '😣', '😥', '😮',\n '🤐', '😯', '😪', '😫', '🥱', '😴', '😌', '😛', '😜', '😝', '🤤', '😒', '😓', '😔', '😕', '🙃', '🤑',\n '😲', '☹️', '🙁', '😖', '😞', '😟', '😤', '😢', '😭', '😦', '😧', '😨', '😩', '🤯', '😬', '😰', '😱',\n '🥵', '🥶', '😳', '🤪', '😵', '😡', '😠', '🤬', '😷', '🤒', '🤕', '🤢', '🤮', '🥳', '🥴', '🥺', '🤫',\n '🤭', '🧐', '🤓', '😈', '👿', '👍', '👎', '👏', '🙌', '🤝', '🙏', '💪', '❤️', '🧡', '💛', '💚', '💙',\n '💜', '🖤', '💔', '💕', '💯', '🔥', '🎉', '🎂', '🌹', '☀️', '🌙', '⭐'];\n// 跟 content-library-view.jsx 的 TYPE_LABEL 是同一套值(那边是 view 层,这边是 widget,不方便\n// 互相 import,就近各自维护一份小常量)。收藏摘要要优先读 snapshot.content.txt 这个结构化字段,\n// 不能像最初那版一样直接展示 snapshot.text——那是整条 content 原样 JSON.stringify 的结果\n// (例如 {\"txt\":\"...\"}),不是给人看的,之前联调时真被这个坑绊了一次才发现。\nconst FAVORITE_TYPE_LABEL = {image: '[图片]', video: '[视频]', voice: '[语音]', file: '[文件]', link: '[链接]'};\nfunction favoriteSummary(item) {\n const content = item.snapshot && item.snapshot.content;\n if (content && typeof content.txt === 'string' && content.txt) {\n return content.txt;\n }\n return FAVORITE_TYPE_LABEL[item.type] || item.type || item.favorite_id;\n}\nconst RECENT_EMOJI_KEY = 'im-recent-emoji';\nconst MAX_RECENT_EMOJI = 30;\nfunction loadRecentEmoji() {\n try {\n const raw = JSON.parse(localStorage.getItem(RECENT_EMOJI_KEY) || '[]');\n return Array.isArray(raw) ? raw : [];\n } catch (_) {\n return [];\n }\n}\nfunction pushRecentEmoji(emoji) {\n try {\n const list = [emoji].concat(loadRecentEmoji().filter(e => e !== emoji)).slice(0, MAX_RECENT_EMOJI);\n localStorage.setItem(RECENT_EMOJI_KEY, JSON.stringify(list));\n } catch (_) { /* ignore */ }\n}\n\nconst messages = defineMessages({\n messaging_disabled: {\n id: 'messaging_disabled_prompt',\n defaultMessage: 'Messaging disabled',\n description: 'Prompt in SendMessage in read-only topic'\n },\n type_new_message: {\n id: 'new_message_prompt',\n defaultMessage: 'New message',\n description: 'Prompt in send message field'\n },\n add_image_caption: {\n id: 'image_caption_prompt',\n defaultMessage: 'Image caption',\n description: 'Prompt in SendMessage for attached image'\n },\n file_attachment_too_large: {\n id: 'file_attachment_too_large',\n defaultMessage: 'The file size {size} exceeds the {limit} limit.',\n description: 'Error message when attachment is too large'\n },\n cannot_initiate_upload: {\n id: 'cannot_initiate_file_upload',\n defaultMessage: 'Cannot initiate file upload.',\n description: 'Generic error messagewhen attachment fails'\n },\n icon_title_record_voice: {\n id: 'icon_title_record_voice',\n defaultMessage: 'Record voice message',\n description: 'Icon tool tip for recording a voice message'\n },\n icon_title_attach_file: {\n id: 'icon_title_attach_file',\n defaultMessage: 'Attach file',\n description: 'Icon tool tip for attaching a file'\n },\n icon_title_add_image: {\n id: 'icon_title_add_image',\n defaultMessage: 'Add image',\n description: 'Icon tool tip for attaching an image'\n },\n icon_title_send: {\n id: 'icon_title_send',\n defaultMessage: 'Send message',\n description: 'Icon tool tip for sending a message'\n },\n});\n\nclass SendMessage extends React.PureComponent {\n constructor(props) {\n super(props);\n\n this.state = {\n quote: null,\n message: '',\n audioRec: false,\n audioAvailable: !!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia),\n // @提醒选择器:mentionQuery 非 null 时显示面板;mentionStart 是触发这次匹配的\"@\"在\n // message 里的字符下标(不是 fmt/grapheme 下标,纯 JS 字符串下标,跟 slice 配对用)。\n mentionQuery: null,\n mentionResults: [],\n mentionHighlight: 0,\n emojiOpen: false,\n emojiTab: 'emoji',\n recentEmoji: loadRecentEmoji(),\n attachOpen: false,\n cardPicker: null,\n favPicker: null,\n audioCancelling: false,\n };\n\n // Timestamp when the previous key press was sent to the server.\n this.keypressTimestamp = 0;\n\n this.handlePasteEvent = this.handlePasteEvent.bind(this);\n this.handleAttachImage = this.handleAttachImage.bind(this);\n this.handleAttachFile = this.handleAttachFile.bind(this);\n this.handleAttachAudio = this.handleAttachAudio.bind(this);\n this.handleSend = this.handleSend.bind(this);\n this.handleKeyPress = this.handleKeyPress.bind(this);\n this.handleMessageTyping = this.handleMessageTyping.bind(this);\n this.handleDropAttach = this.handleDropAttach.bind(this);\n\n this.handleQuoteClick = this.handleQuoteClick.bind(this);\n this.selectMention = this.selectMention.bind(this);\n this.startHoldRecording = this.startHoldRecording.bind(this);\n this.handleHoldMove = this.handleHoldMove.bind(this);\n this.endHoldRecording = this.endHoldRecording.bind(this);\n this.handleHoldVisibilityChange = this.handleHoldVisibilityChange.bind(this);\n this.toggleEmojiPanel = this.toggleEmojiPanel.bind(this);\n this.insertEmoji = this.insertEmoji.bind(this);\n this.deleteLastChar = this.deleteLastChar.bind(this);\n this.toggleAttachPanel = this.toggleAttachPanel.bind(this);\n this.openCardPicker = this.openCardPicker.bind(this);\n this.openFavPicker = this.openFavPicker.bind(this);\n this.sendCard = this.sendCard.bind(this);\n this.sendFavorite = this.sendFavorite.bind(this);\n\n this.formatReply = this.formatReply.bind(this);\n }\n\n componentDidMount() {\n if (this.messageEditArea) {\n this.messageEditArea.addEventListener('paste', this.handlePasteEvent, false);\n if (window.getComputedStyle(this.messageEditArea).getPropertyValue('transition-property') == 'all') {\n // Set focus on desktop, but not on mobile: focus causes soft keyboard to pop up.\n this.messageEditArea.focus();\n }\n }\n\n this.setState({quote: this.formatReply()});\n }\n\n componentWillUnmount() {\n if (this.messageEditArea) {\n this.messageEditArea.removeEventListener('paste', this.handlePasteEvent, false);\n }\n if (this.mentionSearchTimer) {\n window.clearTimeout(this.mentionSearchTimer);\n }\n window.removeEventListener('mousemove', this.handleHoldMove);\n window.removeEventListener('mouseup', this.endHoldRecording);\n window.removeEventListener('touchmove', this.handleHoldMove);\n window.removeEventListener('touchend', this.endHoldRecording);\n window.removeEventListener('blur', this.endHoldRecording);\n document.removeEventListener('visibilitychange', this.handleHoldVisibilityChange);\n }\n\n componentDidUpdate(prevProps) {\n if (this.messageEditArea) {\n if (window.getComputedStyle(this.messageEditArea).getPropertyValue('transition-property') == 'all') {\n // Set focus on desktop, but not on mobile: focus causes soft keyboard to pop up.\n this.messageEditArea.focus();\n }\n\n // Adjust height of the message area for the amount of text.\n this.messageEditArea.style.height = '0px';\n this.messageEditArea.style.height = this.messageEditArea.scrollHeight + 'px';\n }\n\n if (prevProps.topicName != this.props.topicName) {\n this.setState({message: this.props.initMessage || '', audioRec: false, quote: null, mentionQuery: null,\n mentionResults: [], emojiOpen: false, attachOpen: false, cardPicker: null, favPicker: null});\n } else if (!prevProps.disabled && this.props.disabled && this.state.audioRec) {\n // isWriter/etc are real-time ACS bits (messages-view.jsx re-derives them from {pres}/{meta}),\n // so `disabled` can flip to true mid-recording -- the other party blocking you, being removed\n // from a group, or getting muted, all without the user releasing the hold-to-talk button first.\n // Unmounting here (rather than leaving it mounted under a now-hidden branch)\n // is what actually stops the mic via its componentWillUnmount; without this the recording just\n // sits there with `disabled` true and no surviving UI able to end it, and if `disabled` later\n // reverts to false in the same topic, this stale `true` would remount a fresh \n // with no user gesture at all -- silently starting to record again on its own.\n //\n // By the time this runs, React has already committed the `disabled` render and unmounted\n // (its ref callback nulled this.audioRecorderInstance), so endHoldRecording()'s\n // own handleDone/handleDelete call is a no-op here -- it's called anyway for the six\n // mousemove/mouseup/touchmove/touchend/blur/visibilitychange listeners startHoldRecording\n // registered on window/document, which endHoldRecording always removes unconditionally\n // regardless of whether the recorder instance is still around. Skipping this left them\n // dangling until the next real mouseup/touchend/blur/tab-switch happened to fire.\n this.endHoldRecording();\n this.setState({audioRec: false});\n } else if (prevProps.initMessage != this.props.initMessage) {\n const msg = this.props.initMessage || '';\n this.setState({message: msg}, _ => {\n // If there is text, scroll to bottom and set caret to the end.\n this.messageEditArea.scrollTop = this.messageEditArea.scrollHeight;\n this.messageEditArea.setSelectionRange(msg.length, msg.length);\n });\n }\n if (prevProps.reply != this.props.reply) {\n this.setState({quote: this.formatReply()});\n }\n }\n\n formatReply() {\n return this.props.reply ?\n Drafty.format(this.props.reply.content, replyFormatter, {\n formatMessage: this.props.intl.formatMessage.bind(this.props.intl),\n authorizeURL: this.props.tinode.authorizeURL.bind(this.props.tinode)\n }) : null;\n }\n\n handlePasteEvent(e) {\n if (this.props.disabled) {\n return;\n }\n // onAttachImage/onAttachFile are explicitly null while forwarding a message\n // (messages-view.jsx) -- pasting a file in that state used to throw\n // \"onAttachImage is not a function\" instead of just not attaching anything.\n // FIXME: handle large files too.\n if (filePasted(e,\n file => { if (this.props.onAttachImage) { this.props.onAttachImage(file); } },\n file => { if (this.props.onAttachFile) { this.props.onAttachFile(file); } },\n this.props.onError)) {\n\n // If a file was pasted, don't paste base64 data into input field.\n e.preventDefault();\n }\n }\n\n handleAttachImage(e) {\n if (e.target.files && e.target.files.length > 0 && this.props.onAttachImage) {\n this.props.onAttachImage(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleAttachFile(e) {\n if (e.target.files && e.target.files.length > 0 && this.props.onAttachFile) {\n this.props.onAttachFile(e.target.files[0]);\n }\n // Clear the value so the same file can be uploaded again.\n e.target.value = '';\n }\n\n handleDropAttach(files) {\n if (files && files.length > 0 && this.props.onAttachFile) {\n this.props.onAttachFile(files[0]);\n }\n }\n\n handleAttachAudio(url, preview, duration) {\n this.setState({audioRec: false});\n if (this.props.onAttachAudio) {\n this.props.onAttachAudio(url, preview, duration);\n }\n }\n\n handleSend(e) {\n e.preventDefault();\n const message = this.state.message.trim();\n if (message || this.props.acceptBlank || this.props.noInput) {\n const result = this.props.onSendMessage(message);\n // onSendMessage may return a promise resolving to `false` when a pre-send risk check blocked\n // or the user cancelled it -- in that case keep the composer text so nothing typed is lost.\n if (result && typeof result.then == 'function') {\n result.then(sent => { if (sent !== false) this.setState({message: ''}); });\n } else {\n this.setState({message: ''});\n }\n }\n }\n\n /* Send on Enter key */\n handleKeyPress(e) {\n if (this.state.audioRec) {\n // Ignore key presses while audio is being recorded.\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n if (this.state.mentionQuery != null) {\n if (e.key === 'Escape') {\n e.preventDefault();\n this.setState({mentionQuery: null, mentionResults: []});\n return;\n }\n if (this.state.mentionResults.length > 0 && (e.key === 'ArrowDown' || e.key === 'ArrowUp')) {\n e.preventDefault();\n const delta = e.key === 'ArrowDown' ? 1 : -1;\n const count = this.state.mentionResults.length;\n this.setState({mentionHighlight: (this.state.mentionHighlight + delta + count) % count});\n return;\n }\n if (e.key === 'Enter' && this.state.mentionResults.length > 0) {\n e.preventDefault();\n e.stopPropagation();\n this.selectMention(this.state.mentionResults[this.state.mentionHighlight]);\n return;\n }\n }\n\n // Enter pressed: either send, or enter a new line.\n if (e.key === 'Enter') {\n if (this.props.sendOnEnter == 'plain') {\n // Have Shift-Enter insert a line break instead\n if (!e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n\n this.handleSend(e);\n }\n } else {\n if (e.ctrlKey || e.metaKey) {\n e.preventDefault();\n e.stopPropagation();\n\n this.handleSend(e);\n }\n }\n }\n }\n\n handleMessageTyping(e) {\n this.setState({message: e.target.value});\n this.updateMentionState(e.target.value, e.target.selectionStart);\n if (this.props.onMessageChange) {\n this.props.onMessageChange(e.target.value);\n }\n if (this.props.onKeyPress) {\n const now = new Date().getTime();\n if (now - this.keypressTimestamp > KEYPRESS_DELAY) {\n this.props.onKeyPress();\n this.keypressTimestamp = now;\n }\n }\n }\n\n // 4.2-4.3 @提醒:只在群聊里挂 onMentionSearch(messages-view.jsx 只给群话题传这个 prop)。\n // 触发条件是\"光标前最近一个'@','@'前面是空白或整段开头,'@'和光标之间没有空白\"——这样\n // \"联系xx@xx.com\"这种邮箱场景里的@不会被误当成提醒触发。\n updateMentionState(text, caret) {\n if (!this.props.onMentionSearch || caret == null) {\n return;\n }\n const before = text.slice(0, caret);\n const match = /(?:^|\\s)@([^\\s@]*)$/.exec(before);\n if (!match) {\n if (this.state.mentionQuery != null) {\n this.setState({mentionQuery: null, mentionResults: []});\n }\n return;\n }\n const query = match[1];\n const start = caret - query.length - 1;\n this.setState({mentionQuery: query, mentionStart: start, mentionHighlight: 0});\n if (this.mentionSearchTimer) {\n window.clearTimeout(this.mentionSearchTimer);\n }\n this.mentionSearchTimer = window.setTimeout(() => {\n this.props.onMentionSearch(query).then(results => {\n // mentionQuery may have moved on (user kept typing, or closed the picker) by the time this\n // resolves -- only apply it if we're still showing a picker at all, matching the same\n // stale-response guard used everywhere else responses race state.\n if (this.state.mentionQuery != null) {\n this.setState({mentionResults: results || []});\n }\n }).catch(() => {});\n }, 200);\n }\n\n selectMention(item) {\n const {message, mentionStart, mentionQuery} = this.state;\n if (mentionStart == null || mentionQuery == null) {\n return;\n }\n const name = item.group_nickname || item.display_name || item.user_id;\n const insertion = '@' + name + ' ';\n const end = mentionStart + 1 + mentionQuery.length;\n const newMessage = message.slice(0, mentionStart) + insertion + message.slice(end);\n const caretPos = mentionStart + insertion.length;\n this.setState({message: newMessage, mentionQuery: null, mentionResults: []});\n if (this.props.onMentionSelected) {\n this.props.onMentionSelected(item.user_id, name);\n }\n if (this.props.onMessageChange) {\n this.props.onMessageChange(newMessage);\n }\n // Textarea's own DOM value needs the same update -- setState alone re-renders with the right\n // `value` prop, but the caret placement below needs the element's real value/selection to\n // already match, and doing it in the same tick (rather than waiting on the render) avoids a\n // visible flash of the stale text with the caret in the wrong place.\n requestAnimationFrame(() => {\n if (this.messageEditArea) {\n this.messageEditArea.focus();\n this.messageEditArea.setSelectionRange(caretPos, caretPos);\n }\n });\n }\n\n handleQuoteClick(e) {\n e.preventDefault();\n e.stopPropagation();\n if (this.props.reply && this.props.onQuoteClick) {\n const replyToSeq = this.props.reply.seq;\n this.props.onQuoteClick(replyToSeq);\n }\n }\n\n // 组合面板图标切换规律(核对图片确认):表情/附件两个入口固定在输入框右侧;哪个面板当前\n // 展开,对应的那个图标就变成\"⌨\"(点击收起换回键盘),另一个保持原样不变——不是两个一起变。\n // 这里只做了表情这一侧,附件面板(4.13/4.9-4.14)另外接线时要遵守同一条规则,不要各自发明。\n toggleEmojiPanel(e) {\n e.preventDefault();\n this.setState(s => ({emojiOpen: !s.emojiOpen, attachOpen: false, audioRec: false}));\n }\n\n insertEmoji(emoji) {\n const ta = this.messageEditArea;\n const start = ta ? ta.selectionStart : this.state.message.length;\n const end = ta ? ta.selectionEnd : this.state.message.length;\n const newMessage = this.state.message.slice(0, start) + emoji + this.state.message.slice(end);\n pushRecentEmoji(emoji);\n this.setState({message: newMessage, recentEmoji: loadRecentEmoji()});\n if (this.props.onMessageChange) {\n this.props.onMessageChange(newMessage);\n }\n const caretPosEmoji = start + emoji.length;\n requestAnimationFrame(() => {\n if (this.messageEditArea) {\n this.messageEditArea.focus();\n this.messageEditArea.setSelectionRange(caretPosEmoji, caretPosEmoji);\n }\n });\n }\n\n // 参考图的表情面板自带一个退格键,让\"只点表情不碰键盘\"这条路径也能删掉打错的字符——用\n // Array.from 而不是 slice(0,-1) 切最后一个 Unicode 码点,避免把一个占两个UTF-16码元的emoji\n // (比如复合肤色/家庭类emoji)齐腰斩断,删出半个乱码字符。\n deleteLastChar() {\n const ta = this.messageEditArea;\n const start = ta ? ta.selectionStart : this.state.message.length;\n const end = ta ? ta.selectionEnd : this.state.message.length;\n let newMessage, caretPos;\n if (start !== end) {\n newMessage = this.state.message.slice(0, start) + this.state.message.slice(end);\n caretPos = start;\n } else if (start > 0) {\n const before = Array.from(this.state.message.slice(0, start));\n before.pop();\n newMessage = before.join('') + this.state.message.slice(start);\n caretPos = before.join('').length;\n } else {\n return;\n }\n this.setState({message: newMessage});\n if (this.props.onMessageChange) {\n this.props.onMessageChange(newMessage);\n }\n requestAnimationFrame(() => {\n if (this.messageEditArea) {\n this.messageEditArea.focus();\n this.messageEditArea.setSelectionRange(caretPos, caretPos);\n }\n });\n }\n\n toggleAttachPanel(e) {\n e.preventDefault();\n this.setState(s => ({attachOpen: !s.attachOpen, emojiOpen: false}));\n }\n\n // 3.12/4.9-4.14 发名片:选一个好友,生成一张只含姓名+头像+该好友 uid 的名片消息发到当前会话。\n // uid 必须用 TheCard.setTinodeID 写进 comm 数组(vCard 的\"tinode\"协议项),不是随便塞进某个\n // 字段——widgets/the-card-mini.jsx 点开这张卡片时用 TheCard.getFirstTinodeID(card) 读这个\n // 协议项来判断\"发消息\"按钮该指向谁,写错地方那个按钮会永远不出现。\n openCardPicker(e) {\n e.preventDefault();\n this.setState({attachOpen: false, cardPicker: {loading: true}});\n getFriends().then(data => {\n this.setState({cardPicker: {loading: false, items: data.items || []}});\n }).catch(() => this.setState({cardPicker: {loading: false, items: [], error: true}}));\n }\n\n sendCard(item) {\n this.setState({cardPicker: null});\n const build = avatarUrl => {\n const card = new TheCard(item.display_name || item.user_id, avatarUrl);\n TheCard.setTinodeID(card, item.user_id);\n // Every other attachment sender (image/video/file/voice) threads a typeHint through to\n // messages-view.jsx's sendMessage(msg, uploadCompletionPromise, uploader, typeHint) so the\n // backend's imMessageType() classifier -- which only ever looks at head['x-im-type'] or a flat\n // content.file_id/url, never at real Drafty entities -- doesn't fall through to its \"text\"\n // default. This call was only ever passing the first argument, so every card message has been\n // silently misclassified as plain text (confirmed live: search/history summarize it as raw\n // Drafty JSON instead of a name).\n this.props.onSendMessage(Drafty.appendTheCard(null, card), undefined, undefined, 'card');\n };\n if (item.avatar_file_id) {\n getFileUrl(item.avatar_file_id).then(build).catch(() => build(undefined));\n } else {\n build(undefined);\n }\n }\n\n // 收藏发送:走的是 Ch.7 已有的 forwardFavorites REST 接口(转发收藏的同一个接口,目标只给\n // 当前会话一个),不经过 onSendMessage/Drafty——收藏本来就是后端已经存好快照的独立资源,\n // 不是本地新拼一条消息。\n openFavPicker(e) {\n e.preventDefault();\n this.setState({attachOpen: false, favPicker: {loading: true}});\n getFavorites({type: 'all'}).then(data => {\n this.setState({favPicker: {loading: false, items: data.items || []}});\n }).catch(() => this.setState({favPicker: {loading: false, items: [], error: true}}));\n }\n\n sendFavorite(item) {\n this.setState({favPicker: null});\n if (!this.props.topicName) {\n return;\n }\n // 这个接口恒定 200,真实成败要看 items[].status(跟批量收藏/批量转发是同一套设计,全局代码\n // 审查那一轮已经在其它几处调用点踩过同一个坑并修过——这是新写的这处,同样的坑要一起避开,\n // 不能只 .catch 网络层错误就当万事大吉。联调时真的用这条路径测出过 200 OK 但\n // items[0].status:\"failed\"、reason:\"PERMISSION_DENIED\" 的情况(对方是真实好友、这个会话\n // 本身正常能发消息),看起来是后端这个接口自己的权限判断有问题,不是本地能修的,如实报错\n // 而不是假装发送成功。\n forwardFavorites([item.favorite_id], [this.props.topicName]).then(result => {\n const failed = (result && result.items || []).filter(r => r.status === 'failed');\n if (failed.length && this.props.onError) {\n this.props.onError('发送失败:' + (translateReason(failed[0].reason) || failed[0].reason || '未知原因'), 'err');\n }\n }).catch(err => {\n if (this.props.onError) {\n this.props.onError((err && err.message) || '发送失败', 'err');\n }\n });\n }\n\n // 4.7-4.9 按住说话 + 上滑取消:mousedown/touchstart 直接挂载 AudioRecorder(挂载即开始录音,\n // 这一步跟原来点一下进入录音模式完全一样,没有改 AudioRecorder 自己的录音逻辑),松手时通过\n // ref 直接调它的 handleDone/handleDelete——这两个方法本来是绑给它自己按钮的 onClick,要求一个\n // 带 preventDefault 的事件对象,这里传一个最小的假事件满足这个要求,除此之外没有更深地伸手进\n // 它的内部状态。上滑距离阈值 80px 是参照大多数同类应用(微信等)的常见取值,没有对应的可验证\n // 数值来源,明确记录不是抄的哪个具体规格。\n startHoldRecording(e) {\n e.preventDefault();\n if (this.state.audioRec) {\n return;\n }\n this.holdStartY = 'touches' in e ? (e.touches[0] && e.touches[0].clientY) : e.clientY;\n this.setState({audioRec: true, audioCancelling: false, emojiOpen: false, attachOpen: false});\n window.addEventListener('mousemove', this.handleHoldMove);\n window.addEventListener('mouseup', this.endHoldRecording);\n window.addEventListener('touchmove', this.handleHoldMove, {passive: false});\n window.addEventListener('touchend', this.endHoldRecording);\n // mouseup/touchend only fire for a release point still inside this window/tab -- dragging the\n // pointer out of the browser entirely, switching tabs/apps, or a permission prompt stealing\n // focus (e.g. the very getUserMedia prompt this recording itself triggered, on a second call)\n // all leave the mic running with no further event this listener pair will ever see. Ending the\n // recording (same finish-or-cancel logic as a normal release, per the cancel-zone check) on\n // either signal is a safer default than waiting indefinitely for a mouseup that may never come.\n window.addEventListener('blur', this.endHoldRecording);\n document.addEventListener('visibilitychange', this.handleHoldVisibilityChange);\n }\n\n handleHoldVisibilityChange() {\n if (document.hidden) {\n this.endHoldRecording();\n }\n }\n\n handleHoldMove(e) {\n const y = 'touches' in e ? (e.touches[0] && e.touches[0].clientY) : e.clientY;\n if (y == null || this.holdStartY == null) {\n return;\n }\n const cancelling = (this.holdStartY - y) > 80;\n if (cancelling !== this.state.audioCancelling) {\n this.setState({audioCancelling: cancelling});\n }\n }\n\n endHoldRecording() {\n window.removeEventListener('mousemove', this.handleHoldMove);\n window.removeEventListener('mouseup', this.endHoldRecording);\n window.removeEventListener('touchmove', this.handleHoldMove);\n window.removeEventListener('touchend', this.endHoldRecording);\n window.removeEventListener('blur', this.endHoldRecording);\n document.removeEventListener('visibilitychange', this.handleHoldVisibilityChange);\n this.holdStartY = null;\n const fakeEvent = {preventDefault: () => {}};\n if (this.audioRecorderInstance) {\n if (this.state.audioCancelling) {\n this.audioRecorderInstance.handleDelete(fakeEvent);\n } else {\n this.audioRecorderInstance.handleDone(fakeEvent);\n }\n }\n }\n\n render() {\n const { formatMessage } = this.props.intl;\n const prompt = this.props.disabled ?\n formatMessage(messages.messaging_disabled) :\n (this.props.messagePrompt ?\n formatMessage(messages[this.props.messagePrompt]) :\n formatMessage(messages.type_new_message));\n\n const sendIcon = (this.props.reply && this.props.reply.editing) ?\n 'check_circle' : 'send';\n\n const quote = this.state.quote ?\n (\n
\n {this.state.quote}\n
) : null;\n const audioEnabled = this.state.audioAvailable && this.props.onAttachAudio;\n const mentionPanel = this.state.mentionQuery != null ?\n (\n {this.state.mentionResults.length === 0 ?\n
无匹配成员
:\n this.state.mentionResults.map((item, i) => (\n
{ e.preventDefault(); this.selectMention(item); }}\n onMouseEnter={() => this.setState({mentionHighlight: i})}>\n {item.group_nickname || item.display_name || item.user_id}\n
\n ))}\n
) : null;\n return (\n \n {this.state.emojiOpen ?\n \n
\n
\n {/* 参考图表情网格下方那一整行退格/发送专属控件——原来完全没做,\"只点表情不碰键盘\"\n 这条路径下用户还得把视线移出面板去点外面的发送图标。复用已有的 sendIcon/handleSend,\n 不重新发明发送逻辑。 */}\n \n
: null}\n {this.state.attachOpen ?\n : null}\n {this.state.cardPicker ?\n this.setState({cardPicker: null})}>\n
e.stopPropagation()}>\n \n \n \n
: null}\n {this.state.favPicker ?\n this.setState({favPicker: null})}>\n
e.stopPropagation()}>\n \n \n \n
: null}\n \n );\n }\n};\n\nexport default injectIntl(SendMessage);\n"],"names":[],"sourceRoot":""}
\ No newline at end of file