{"version":3,"file":"hasReturnValue.cjs","names":[],"sources":["../../src/utils/hasReturnValue.js"],"sourcesContent":["/**\n * @typedef {import('estree').Node|\n *   import('@typescript-eslint/types').TSESTree.Node} ESTreeOrTypeScriptNode\n */\n\n/**\n * Checks if a node is a promise but has no resolve value or an empty value.\n * An `undefined` resolve does not count.\n * @param {ESTreeOrTypeScriptNode|undefined|null} node\n * @returns {boolean|undefined|null}\n */\nconst isNewPromiseExpression = (node) => {\n  return node && node.type === 'NewExpression' && node.callee.type === 'Identifier' &&\n    node.callee.name === 'Promise';\n};\n\n/**\n * @param {ESTreeOrTypeScriptNode|null|undefined} node\n * @returns {boolean}\n */\nconst isVoidPromise = (node) => {\n  return /** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */ (node)?.typeArguments?.params?.[0]?.type === 'TSVoidKeyword'\n    /* c8 ignore next 5 */\n    // eslint-disable-next-line @stylistic/operator-linebreak -- c8\n    || /** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */ (\n      node\n    // @ts-expect-error Ok\n    )?.typeParameters?.params?.[0]?.type === 'TSVoidKeyword';\n};\n\nconst undefinedKeywords = new Set([\n  'TSNeverKeyword', 'TSUndefinedKeyword', 'TSVoidKeyword',\n]);\n\n/**\n * Checks if a node has a return statement. Void return does not count.\n * @param {ESTreeOrTypeScriptNode|undefined|null} node\n * @param {boolean} [throwOnNullReturn]\n * @param {PromiseFilter} [promFilter]\n * @returns {boolean|undefined}\n */\n// eslint-disable-next-line complexity\nconst hasReturnValue = (node, throwOnNullReturn, promFilter) => {\n  if (!node) {\n    return false;\n  }\n\n  switch (node.type) {\n    case 'ArrowFunctionExpression':\n    case 'FunctionDeclaration':\n    case 'FunctionExpression': {\n      return 'expression' in node && node.expression && (!isNewPromiseExpression(\n        node.body,\n      ) || !isVoidPromise(node.body)) ||\n      hasReturnValue(node.body, throwOnNullReturn, promFilter);\n    }\n\n    case 'BlockStatement': {\n      return node.body.some((bodyNode) => {\n        return bodyNode.type !== 'FunctionDeclaration' && hasReturnValue(bodyNode, throwOnNullReturn, promFilter);\n      });\n    }\n\n    case 'DoWhileStatement':\n    case 'ForInStatement':\n    case 'ForOfStatement':\n\n    case 'ForStatement':\n\n    case 'LabeledStatement':\n    case 'WhileStatement':\n    case 'WithStatement': {\n      return hasReturnValue(node.body, throwOnNullReturn, promFilter);\n    }\n\n    case 'IfStatement': {\n      return hasReturnValue(node.consequent, throwOnNullReturn, promFilter) ||\n      hasReturnValue(node.alternate, throwOnNullReturn, promFilter);\n    }\n\n    case 'MethodDefinition':\n      return hasReturnValue(node.value, throwOnNullReturn, promFilter);\n    case 'ReturnStatement': {\n    // void return does not count.\n      if (node.argument === null) {\n        if (throwOnNullReturn) {\n          throw new Error('Null return');\n        }\n\n        return false;\n      }\n\n      if (promFilter && isNewPromiseExpression(node.argument)) {\n      // Let caller decide how to filter, but this is, at the least,\n      //   a return of sorts and truthy\n        return promFilter(node.argument);\n      }\n\n      return true;\n    }\n\n    case 'SwitchStatement': {\n      return node.cases.some(\n        (someCase) => {\n          return someCase.consequent.some((nde) => {\n            return hasReturnValue(nde, throwOnNullReturn, promFilter);\n          });\n        },\n      );\n    }\n\n    case 'TryStatement': {\n      return hasReturnValue(node.block, throwOnNullReturn, promFilter) ||\n      hasReturnValue(node.handler && node.handler.body, throwOnNullReturn, promFilter) ||\n      hasReturnValue(node.finalizer, throwOnNullReturn, promFilter);\n    }\n\n    case 'TSDeclareFunction':\n\n    case 'TSFunctionType':\n\n    case 'TSMethodSignature': {\n      const type = node?.returnType?.typeAnnotation?.type;\n      return type && !undefinedKeywords.has(type);\n    }\n\n    default: {\n      return false;\n    }\n  }\n};\n\n/**\n * Checks if a node has a return statement. Void return does not count.\n * @param {ESTreeOrTypeScriptNode|null|undefined} node\n * @param {PromiseFilter} promFilter\n * @returns {undefined|boolean|ESTreeOrTypeScriptNode}\n */\n// eslint-disable-next-line complexity\nconst allBrancheshaveReturnValues = (node, promFilter) => {\n  if (!node) {\n    return false;\n  }\n\n  switch (node.type) {\n    // case 'MethodDefinition':\n    //   return allBrancheshaveReturnValues(node.value, promFilter);\n    case 'ArrowFunctionExpression':\n    case 'FunctionDeclaration':\n    case 'FunctionExpression': {\n      return 'expression' in node && node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) ||\n      allBrancheshaveReturnValues(node.body, promFilter) ||\n      /** @type {import('@typescript-eslint/types').TSESTree.BlockStatement} */\n      (node.body).body.some((nde) => {\n        return nde.type === 'ReturnStatement';\n      });\n    }\n\n    case 'BlockStatement': {\n      const lastBodyNode = node.body.slice(-1)[0];\n      return allBrancheshaveReturnValues(lastBodyNode, promFilter);\n    }\n\n    case 'DoWhileStatement':\n    case 'WhileStatement':\n      if (\n      /**\n       * @type {import('@typescript-eslint/types').TSESTree.Literal}\n       */\n        (node.test).value === true\n      ) {\n      // If this is an infinite loop, we assume only one branch\n      //   is needed to provide a return\n        return hasReturnValue(node.body, false, promFilter);\n      }\n\n    // Fallthrough\n    case 'ForStatement':\n      if (node.test === null) {\n      // If this is an infinite loop, we assume only one branch\n      //   is needed to provide a return\n        return hasReturnValue(node.body, false, promFilter);\n      }\n\n    case 'ForInStatement':\n    case 'ForOfStatement':\n\n    case 'LabeledStatement':\n\n    case 'WithStatement': {\n      return allBrancheshaveReturnValues(node.body, promFilter);\n    }\n\n    case 'IfStatement': {\n      return allBrancheshaveReturnValues(node.consequent, promFilter) &&\n      allBrancheshaveReturnValues(node.alternate, promFilter);\n    }\n\n    case 'ReturnStatement': {\n    // void return does not count.\n      if (node.argument === null) {\n        return false;\n      }\n\n      if (promFilter && isNewPromiseExpression(node.argument)) {\n      // Let caller decide how to filter, but this is, at the least,\n      //   a return of sorts and truthy\n        return promFilter(node.argument);\n      }\n\n      return true;\n    }\n\n    case 'SwitchStatement': {\n      return /** @type {import('@typescript-eslint/types').TSESTree.SwitchStatement} */ (node).cases.every(\n        (someCase) => {\n          return !someCase.consequent.some((consNode) => {\n            return consNode.type === 'BreakStatement' ||\n            consNode.type === 'ReturnStatement' && consNode.argument === null;\n          });\n        },\n      );\n    }\n\n    case 'ThrowStatement': {\n      return true;\n    }\n\n    case 'TryStatement': {\n    // If `finally` returns, all return\n      return node.finalizer && allBrancheshaveReturnValues(node.finalizer, promFilter) ||\n      // Return in `try`/`catch` may still occur despite `finally`\n      allBrancheshaveReturnValues(node.block, promFilter) &&\n        (!node.handler ||\n          allBrancheshaveReturnValues(node.handler && node.handler.body, promFilter)) &&\n          (!node.finalizer || (() => {\n            try {\n              hasReturnValue(node.finalizer, true, promFilter);\n            } catch (error) {\n              if (/** @type {Error} */ (error).message === 'Null return') {\n                return false;\n              }\n              /* c8 ignore next 3 */\n              // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8\n              throw error;\n            }\n\n            // As long as not an explicit empty return, then return true\n            return true;\n          })());\n    }\n\n    case 'TSDeclareFunction':\n\n    case 'TSFunctionType':\n\n    case 'TSMethodSignature': {\n      const type = node?.returnType?.typeAnnotation?.type;\n      return type && !undefinedKeywords.has(type);\n    }\n\n    default: {\n      return false;\n    }\n  }\n};\n\n/**\n * @callback PromiseFilter\n * @param {ESTreeOrTypeScriptNode|undefined} node\n * @returns {boolean}\n */\n\n/**\n * Avoids further checking child nodes if a nested function shadows the\n * resolver, but otherwise, if name is used (by call or passed in as an\n * argument to another function), will be considered as non-empty.\n *\n * This could check for redeclaration of the resolver, but as such is\n * unlikely, we avoid the performance cost of checking everywhere for\n * (re)declarations or assignments.\n * @param {import('@typescript-eslint/types').TSESTree.Node|null|undefined} node\n * @param {string} resolverName\n * @returns {boolean}\n */\n// eslint-disable-next-line complexity\nconst hasNonEmptyResolverCall = (node, resolverName) => {\n  if (!node) {\n    return false;\n  }\n\n  // Arrow function without block\n  switch (node.type) {\n    case 'ArrayExpression':\n    case 'ArrayPattern':\n      return node.elements.some((element) => {\n        return hasNonEmptyResolverCall(element, resolverName);\n      });\n    case 'ArrowFunctionExpression':\n    case 'FunctionDeclaration':\n    case 'FunctionExpression': {\n    // Shadowing\n      if (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n        node.params[0]\n      )?.name === resolverName) {\n        return false;\n      }\n\n      return hasNonEmptyResolverCall(node.body, resolverName);\n    }\n\n    case 'AssignmentExpression':\n    case 'BinaryExpression':\n    case 'LogicalExpression': {\n      return hasNonEmptyResolverCall(node.left, resolverName) ||\n      hasNonEmptyResolverCall(node.right, resolverName);\n    }\n\n    case 'AssignmentPattern':\n      return hasNonEmptyResolverCall(node.right, resolverName);\n    case 'AwaitExpression':\n\n    case 'SpreadElement':\n    case 'UnaryExpression':\n    case 'YieldExpression':\n      return hasNonEmptyResolverCall(node.argument, resolverName);\n    case 'BlockStatement':\n    case 'ClassBody':\n      return node.body.some((bodyNode) => {\n        return hasNonEmptyResolverCall(bodyNode, resolverName);\n      });\n      /* c8 ignore next 2 -- In Babel? */\n    case 'CallExpression':\n      // @ts-expect-error Babel?\n    case 'OptionalCallExpression':\n      return /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n        node.callee\n      ).name === resolverName && (\n\n      // Implicit or explicit undefined\n        node.arguments.length > 1 || node.arguments[0] !== undefined\n      ) ||\n      node.arguments.some((nde) => {\n        // Being passed in to another function (which might invoke it)\n        return nde.type === 'Identifier' && nde.name === resolverName ||\n\n          // Handle nested items\n          hasNonEmptyResolverCall(nde, resolverName);\n      });\n\n    case 'ChainExpression':\n    case 'Decorator':\n\n    case 'ExpressionStatement':\n      return hasNonEmptyResolverCall(node.expression, resolverName);\n\n    case 'ClassDeclaration':\n\n    case 'ClassExpression':\n      return hasNonEmptyResolverCall(node.body, resolverName);\n      /* c8 ignore next 2 -- In Babel? */\n      // @ts-expect-error Babel?\n    case 'ClassMethod':\n\n    case 'MethodDefinition':\n      return node.decorators && node.decorators.some((decorator) => {\n        return hasNonEmptyResolverCall(decorator, resolverName);\n      }) ||\n      node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||\n      hasNonEmptyResolverCall(node.value, resolverName);\n\n    /* c8 ignore next 2 -- In Babel? */\n      // @ts-expect-error Babel?\n    case 'ClassProperty':\n    /* c8 ignore next 2 -- In Babel? */\n    // @ts-expect-error Babel?\n    case 'ObjectProperty':\n    case 'Property':\n\n    case 'PropertyDefinition':\n      return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||\n      hasNonEmptyResolverCall(node.value, resolverName);\n    case 'ConditionalExpression':\n\n    case 'IfStatement': {\n      return hasNonEmptyResolverCall(node.test, resolverName) ||\n      hasNonEmptyResolverCall(node.consequent, resolverName) ||\n      hasNonEmptyResolverCall(node.alternate, resolverName);\n    }\n\n    case 'DoWhileStatement':\n    case 'ForInStatement':\n    case 'ForOfStatement':\n\n    case 'ForStatement':\n    case 'LabeledStatement':\n    case 'WhileStatement':\n    case 'WithStatement': {\n      return hasNonEmptyResolverCall(node.body, resolverName);\n    }\n\n    /* c8 ignore next 2 -- In Babel? */\n    // @ts-expect-error Babel?\n    case 'Import':\n\n    case 'ImportExpression':\n      return hasNonEmptyResolverCall(node.source, resolverName);\n      // ?.\n      /* c8 ignore next 2 -- In Babel? */\n    case 'MemberExpression':\n\n    // @ts-expect-error Babel?\n    case 'OptionalMemberExpression':\n      return hasNonEmptyResolverCall(node.object, resolverName) ||\n      hasNonEmptyResolverCall(node.property, resolverName);\n    case 'ObjectExpression':\n    case 'ObjectPattern':\n      return node.properties.some((property) => {\n        return hasNonEmptyResolverCall(property, resolverName);\n      });\n    /* c8 ignore next 2 -- In Babel? */\n      // @ts-expect-error Babel?\n    case 'ObjectMethod':\n    /* c8 ignore next 6 -- In Babel? */\n    // @ts-expect-error\n      return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||\n      // @ts-expect-error\n      node.arguments.some((nde) => {\n        return hasNonEmptyResolverCall(nde, resolverName);\n      });\n\n    case 'ReturnStatement': {\n      if (node.argument === null) {\n        return false;\n      }\n\n      return hasNonEmptyResolverCall(node.argument, resolverName);\n    }\n\n    // Comma\n    case 'SequenceExpression':\n\n    case 'TemplateLiteral':\n      return node.expressions.some((subExpression) => {\n        return hasNonEmptyResolverCall(subExpression, resolverName);\n      });\n\n    case 'SwitchStatement': {\n      return node.cases.some(\n        (someCase) => {\n          return someCase.consequent.some((nde) => {\n            return hasNonEmptyResolverCall(nde, resolverName);\n          });\n        },\n      );\n    }\n\n    case 'TaggedTemplateExpression':\n      return hasNonEmptyResolverCall(node.quasi, resolverName);\n\n    case 'TryStatement': {\n      return hasNonEmptyResolverCall(node.block, resolverName) ||\n      hasNonEmptyResolverCall(node.handler && node.handler.body, resolverName) ||\n      hasNonEmptyResolverCall(node.finalizer, resolverName);\n    }\n\n    case 'VariableDeclaration': {\n      return node.declarations.some((nde) => {\n        return hasNonEmptyResolverCall(nde, resolverName);\n      });\n    }\n\n    case 'VariableDeclarator': {\n      return hasNonEmptyResolverCall(node.id, resolverName) ||\n      hasNonEmptyResolverCall(node.init, resolverName);\n    }\n\n    /*\n  // Shouldn't need to parse literals/literal components, etc.\n\n  case 'Identifier':\n  case 'TemplateElement':\n  case 'Super':\n  // Exports not relevant in this context\n  */\n    default:\n      return false;\n  }\n};\n\n/**\n * Checks if a Promise executor has no resolve value or an empty value.\n * An `undefined` resolve does not count.\n * @param {ESTreeOrTypeScriptNode} node\n * @param {boolean} anyPromiseAsReturn\n * @param {boolean} [allBranches]\n * @returns {boolean}\n */\nconst hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, allBranches) => {\n  const hasReturnMethod = allBranches ?\n    /**\n     * @param {ESTreeOrTypeScriptNode} nde\n     * @param {PromiseFilter} promiseFilter\n     * @returns {boolean}\n     */\n    (nde, promiseFilter) => {\n      let hasReturn;\n      try {\n        hasReturn = hasReturnValue(nde, true, promiseFilter);\n      } catch (error) {\n        // c8 ignore else\n        if (/** @type {Error} */ (error).message === 'Null return') {\n          return false;\n        }\n        /* c8 ignore next 3 */\n        // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8\n        throw error;\n      }\n\n      // `hasReturn` check needed since `throw` treated as valid return by\n      //   `allBrancheshaveReturnValues`\n      return Boolean(hasReturn && allBrancheshaveReturnValues(nde, promiseFilter));\n    } :\n    /**\n     * @param {ESTreeOrTypeScriptNode} nde\n     * @param {PromiseFilter} promiseFilter\n     * @returns {boolean}\n     */\n    (nde, promiseFilter) => {\n      return Boolean(hasReturnValue(nde, false, promiseFilter));\n    };\n\n  return hasReturnMethod(node, (prom) => {\n    if (anyPromiseAsReturn) {\n      return true;\n    }\n\n    if (isVoidPromise(prom)) {\n      return false;\n    }\n\n    const {\n      body,\n      params,\n    } =\n    /**\n     * @type {import('@typescript-eslint/types').TSESTree.FunctionExpression|\n     * import('@typescript-eslint/types').TSESTree.ArrowFunctionExpression}\n     */ (\n      /** @type {import('@typescript-eslint/types').TSESTree.NewExpression} */ (\n          prom\n        ).arguments[0]\n      ) || {};\n\n    if (!params?.length) {\n      return false;\n    }\n\n    const {\n      name: resolverName,\n    } = /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n      params[0]\n    );\n\n    return hasNonEmptyResolverCall(body, resolverName);\n  });\n};\n\nexport {\n  hasReturnValue,\n  hasValueOrExecutorHasNonEmptyResolveValue,\n};\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,sBAAsB,GAAI,IAAI,IAAK;EACvC,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,IAC/E,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS;AAClC,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,aAAa,GAAI,IAAI,IAAK;EAC9B,OAAO,0EAA4E,IAAI,EAAG,aAAa,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK;EAC7H;EACA;EAAA,GACG,0EACD;EACF;EAAA,EACG,cAAc,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,eAAe;AAC5D,CAAC;AAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAChC,gBAAgB,EAAE,oBAAoB,EAAE,eAAe,CACxD,CAAC;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,iBAAiB,EAAE,UAAU,KAAK;EAC9D,IAAI,CAAC,IAAI,EAAE;IACT,OAAO,KAAK;EACd;EAEA,QAAQ,IAAI,CAAC,IAAI;IACf,KAAK,yBAAyB;IAC9B,KAAK,qBAAqB;IAC1B,KAAK,oBAAoB;MAAE;QACzB,OAAO,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,sBAAsB,CACxE,IAAI,CAAC,IACP,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAC/B,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,UAAU,CAAC;MAC1D;IAEA,KAAK,gBAAgB;MAAE;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAE,QAAQ,IAAK;UAClC,OAAO,QAAQ,CAAC,IAAI,KAAK,qBAAqB,IAAI,cAAc,CAAC,QAAQ,EAAE,iBAAiB,EAAE,UAAU,CAAC;QAC3G,CAAC,CAAC;MACJ;IAEA,KAAK,kBAAkB;IACvB,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;IAErB,KAAK,cAAc;IAEnB,KAAK,kBAAkB;IACvB,KAAK,gBAAgB;IACrB,KAAK,eAAe;MAAE;QACpB,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,UAAU,CAAC;MACjE;IAEA,KAAK,aAAa;MAAE;QAClB,OAAO,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,EAAE,UAAU,CAAC,IACrE,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,UAAU,CAAC;MAC/D;IAEA,KAAK,kBAAkB;MACrB,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,CAAC;IAClE,KAAK,iBAAiB;MAAE;QACxB;QACE,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE;UAC1B,IAAI,iBAAiB,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC;UAChC;UAEA,OAAO,KAAK;QACd;QAEA,IAAI,UAAU,IAAI,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;UACzD;UACA;UACE,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;QAClC;QAEA,OAAO,IAAI;MACb;IAEA,KAAK,iBAAiB;MAAE;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CACnB,QAAQ,IAAK;UACZ,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAE,GAAG,IAAK;YACvC,OAAO,cAAc,CAAC,GAAG,EAAE,iBAAiB,EAAE,UAAU,CAAC;UAC3D,CAAC,CAAC;QACJ,CACF,CAAC;MACH;IAEA,KAAK,cAAc;MAAE;QACnB,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,CAAC,IAChE,cAAc,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,EAAE,UAAU,CAAC,IAChF,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,UAAU,CAAC;MAC/D;IAEA,KAAK,mBAAmB;IAExB,KAAK,gBAAgB;IAErB,KAAK,mBAAmB;MAAE;QACxB,MAAM,IAAI,GAAG,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI;QACnD,OAAO,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;MAC7C;IAEA;MAAS;QACP,OAAO,KAAK;MACd;EACF;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA,MAAM,2BAA2B,GAAG,CAAC,IAAI,EAAE,UAAU,KAAK;EACxD,IAAI,CAAC,IAAI,EAAE;IACT,OAAO,KAAK;EACd;EAEA,QAAQ,IAAI,CAAC,IAAI;IACf;IACA;IACA,KAAK,yBAAyB;IAC9B,KAAK,qBAAqB;IAC1B,KAAK,oBAAoB;MAAE;QACzB,OAAO,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IACnH,2BAA2B,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,IAClD;QACC,IAAI,CAAC,IAAI,CAAE,IAAI,CAAC,IAAI,CAAE,GAAG,IAAK;UAC7B,OAAO,GAAG,CAAC,IAAI,KAAK,iBAAiB;QACvC,CAAC,CAAC;MACJ;IAEA,KAAK,gBAAgB;MAAE;QACrB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,2BAA2B,CAAC,YAAY,EAAE,UAAU,CAAC;MAC9D;IAEA,KAAK,kBAAkB;IACvB,KAAK,gBAAgB;MACnB;MACA;AACN;AACA;MACS,IAAI,CAAC,IAAI,CAAE,KAAK,KAAK,IAAI,EAC1B;QACF;QACA;QACE,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC;MACrD;;IAEF;IACA,KAAK,cAAc;MACjB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE;QACxB;QACA;QACE,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC;MACrD;IAEF,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;IAErB,KAAK,kBAAkB;IAEvB,KAAK,eAAe;MAAE;QACpB,OAAO,2BAA2B,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;MAC3D;IAEA,KAAK,aAAa;MAAE;QAClB,OAAO,2BAA2B,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,IAC/D,2BAA2B,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;MACzD;IAEA,KAAK,iBAAiB;MAAE;QACxB;QACE,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE;UAC1B,OAAO,KAAK;QACd;QAEA,IAAI,UAAU,IAAI,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;UACzD;UACA;UACE,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;QAClC;QAEA,OAAO,IAAI;MACb;IAEA,KAAK,iBAAiB;MAAE;QACtB,OAAO,0EAA4E,IAAI,CAAE,KAAK,CAAC,KAAK,CACjG,QAAQ,IAAK;UACZ,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAE,QAAQ,IAAK;YAC7C,OAAO,QAAQ,CAAC,IAAI,KAAK,gBAAgB,IACzC,QAAQ,CAAC,IAAI,KAAK,iBAAiB,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI;UACnE,CAAC,CAAC;QACJ,CACF,CAAC;MACH;IAEA,KAAK,gBAAgB;MAAE;QACrB,OAAO,IAAI;MACb;IAEA,KAAK,cAAc;MAAE;QACrB;QACE,OAAO,IAAI,CAAC,SAAS,IAAI,2BAA2B,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;QAChF;QACA,2BAA2B,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,KAChD,CAAC,IAAI,CAAC,OAAO,IACZ,2BAA2B,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,KAC1E,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM;UACzB,IAAI;YACF,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC;UAClD,CAAC,CAAC,OAAO,KAAK,EAAE;YACd,IAAI,oBAAsB,KAAK,CAAE,OAAO,KAAK,aAAa,EAAE;cAC1D,OAAO,KAAK;YACd;YACA;YACA;YACA,MAAM,KAAK;UACb;;UAEA;UACA,OAAO,IAAI;QACb,CAAC,EAAE,CAAC,CAAC;MACX;IAEA,KAAK,mBAAmB;IAExB,KAAK,gBAAgB;IAErB,KAAK,mBAAmB;MAAE;QACxB,MAAM,IAAI,GAAG,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI;QACnD,OAAO,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;MAC7C;IAEA;MAAS;QACP,OAAO,KAAK;MACd;EACF;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,uBAAuB,GAAG,CAAC,IAAI,EAAE,YAAY,KAAK;EACtD,IAAI,CAAC,IAAI,EAAE;IACT,OAAO,KAAK;EACd;;EAEA;EACA,QAAQ,IAAI,CAAC,IAAI;IACf,KAAK,iBAAiB;IACtB,KAAK,cAAc;MACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAE,OAAO,IAAK;QACrC,OAAO,uBAAuB,CAAC,OAAO,EAAE,YAAY,CAAC;MACvD,CAAC,CAAC;IACJ,KAAK,yBAAyB;IAC9B,KAAK,qBAAqB;IAC1B,KAAK,oBAAoB;MAAE;QAC3B;QACE,IAAI,qEACF,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EACb,IAAI,KAAK,YAAY,EAAE;UACxB,OAAO,KAAK;QACd;QAEA,OAAO,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;MACzD;IAEA,KAAK,sBAAsB;IAC3B,KAAK,kBAAkB;IACvB,KAAK,mBAAmB;MAAE;QACxB,OAAO,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,IACvD,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC;MACnD;IAEA,KAAK,mBAAmB;MACtB,OAAO,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC;IAC1D,KAAK,iBAAiB;IAEtB,KAAK,eAAe;IACpB,KAAK,iBAAiB;IACtB,KAAK,iBAAiB;MACpB,OAAO,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;IAC7D,KAAK,gBAAgB;IACrB,KAAK,WAAW;MACd,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAE,QAAQ,IAAK;QAClC,OAAO,uBAAuB,CAAC,QAAQ,EAAE,YAAY,CAAC;MACxD,CAAC,CAAC;IACF;IACF,KAAK,gBAAgB;IACnB;IACF,KAAK,wBAAwB;MAC3B,OAAO,qEACL,IAAI,CAAC,MAAM,CACX,IAAI,KAAK,YAAY;MAEvB;MACE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAC7D,IACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAE,GAAG,IAAK;QAC3B;QACA,OAAO,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY;QAE3D;QACA,uBAAuB,CAAC,GAAG,EAAE,YAAY,CAAC;MAC9C,CAAC,CAAC;IAEJ,KAAK,iBAAiB;IACtB,KAAK,WAAW;IAEhB,KAAK,qBAAqB;MACxB,OAAO,uBAAuB,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;IAE/D,KAAK,kBAAkB;IAEvB,KAAK,iBAAiB;MACpB,OAAO,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;IACvD;IACA;IACF,KAAK,aAAa;IAElB,KAAK,kBAAkB;MACrB,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAE,SAAS,IAAK;QAC5D,OAAO,uBAAuB,CAAC,SAAS,EAAE,YAAY,CAAC;MACzD,CAAC,CAAC,IACF,IAAI,CAAC,QAAQ,IAAI,uBAAuB,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,IAChE,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC;;IAEnD;IACE;IACF,KAAK,eAAe;IACpB;IACA;IACA,KAAK,gBAAgB;IACrB,KAAK,UAAU;IAEf,KAAK,oBAAoB;MACvB,OAAO,IAAI,CAAC,QAAQ,IAAI,uBAAuB,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,IACvE,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC;IACnD,KAAK,uBAAuB;IAE5B,KAAK,aAAa;MAAE;QAClB,OAAO,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,IACvD,uBAAuB,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,IACtD,uBAAuB,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;MACvD;IAEA,KAAK,kBAAkB;IACvB,KAAK,gBAAgB;IACrB,KAAK,gBAAgB;IAErB,KAAK,cAAc;IACnB,KAAK,kBAAkB;IACvB,KAAK,gBAAgB;IACrB,KAAK,eAAe;MAAE;QACpB,OAAO,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;MACzD;;IAEA;IACA;IACA,KAAK,QAAQ;IAEb,KAAK,kBAAkB;MACrB,OAAO,uBAAuB,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;IACzD;IACA;IACF,KAAK,kBAAkB;;IAEvB;IACA,KAAK,0BAA0B;MAC7B,OAAO,uBAAuB,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,IACzD,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;IACtD,KAAK,kBAAkB;IACvB,KAAK,eAAe;MAClB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAE,QAAQ,IAAK;QACxC,OAAO,uBAAuB,CAAC,QAAQ,EAAE,YAAY,CAAC;MACxD,CAAC,CAAC;IACJ;IACE;IACF,KAAK,cAAc;MACnB;MACA;MACE,OAAO,IAAI,CAAC,QAAQ,IAAI,uBAAuB,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC;MACvE;MACA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAE,GAAG,IAAK;QAC3B,OAAO,uBAAuB,CAAC,GAAG,EAAE,YAAY,CAAC;MACnD,CAAC,CAAC;IAEJ,KAAK,iBAAiB;MAAE;QACtB,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE;UAC1B,OAAO,KAAK;QACd;QAEA,OAAO,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;MAC7D;;IAEA;IACA,KAAK,oBAAoB;IAEzB,KAAK,iBAAiB;MACpB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAE,aAAa,IAAK;QAC9C,OAAO,uBAAuB,CAAC,aAAa,EAAE,YAAY,CAAC;MAC7D,CAAC,CAAC;IAEJ,KAAK,iBAAiB;MAAE;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CACnB,QAAQ,IAAK;UACZ,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAE,GAAG,IAAK;YACvC,OAAO,uBAAuB,CAAC,GAAG,EAAE,YAAY,CAAC;UACnD,CAAC,CAAC;QACJ,CACF,CAAC;MACH;IAEA,KAAK,0BAA0B;MAC7B,OAAO,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC;IAE1D,KAAK,cAAc;MAAE;QACnB,OAAO,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,IACxD,uBAAuB,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,IACxE,uBAAuB,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC;MACvD;IAEA,KAAK,qBAAqB;MAAE;QAC1B,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAE,GAAG,IAAK;UACrC,OAAO,uBAAuB,CAAC,GAAG,EAAE,YAAY,CAAC;QACnD,CAAC,CAAC;MACJ;IAEA,KAAK,oBAAoB;MAAE;QACzB,OAAO,uBAAuB,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,IACrD,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;MAClD;;IAEA;AACJ;AACA;AACA;AACA;AACA;AACA;IAEI;MACE,OAAO,KAAK;EAChB;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,yCAAyC,GAAG,CAAC,IAAI,EAAE,kBAAkB,EAAE,WAAW,KAAK;EAC3F,MAAM,eAAe,GAAG,WAAW;EACjC;AACJ;AACA;AACA;AACA;EACI,CAAC,GAAG,EAAE,aAAa,KAAK;IACtB,IAAI,SAAS;IACb,IAAI;MACF,SAAS,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC;IACtD,CAAC,CAAC,OAAO,KAAK,EAAE;MACd;MACA,IAAI,oBAAsB,KAAK,CAAE,OAAO,KAAK,aAAa,EAAE;QAC1D,OAAO,KAAK;MACd;MACA;MACA;MACA,MAAM,KAAK;IACb;;IAEA;IACA;IACA,OAAO,OAAO,CAAC,SAAS,IAAI,2BAA2B,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;EAC9E,CAAC;EACD;AACJ;AACA;AACA;AACA;EACI,CAAC,GAAG,EAAE,aAAa,KAAK;IACtB,OAAO,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;EAC3D,CAAC;EAEH,OAAO,eAAe,CAAC,IAAI,EAAG,IAAI,IAAK;IACrC,IAAI,kBAAkB,EAAE;MACtB,OAAO,IAAI;IACb;IAEA,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE;MACvB,OAAO,KAAK;IACd;IAEA,MAAM;MACJ,IAAI;MACJ;IACF,CAAC;IACD;AACJ;AACA;AACA;IAAQ,CACF,wEACI,IAAI,CACJ,SAAS,CAAC,CAAC,CAAC,KACX,CAAC,CAAC;IAET,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE;MACnB,OAAO,KAAK;IACd;IAEA,MAAM;MACJ,IAAI,EAAE;IACR,CAAC,GAAG;IACF,MAAM,CAAC,CAAC,CACT;IAED,OAAO,uBAAuB,CAAC,IAAI,EAAE,YAAY,CAAC;EACpD,CAAC,CAAC;AACJ,CAAC;AAAC","ignoreList":[]}