{"version":3,"sources":["../../src/sega/sega.ts","../../src/api/api.ts","../../src/common/accountInfo.ts","../../src/common/logger.ts","../../src/common/bignumber.ts","../../src/module/amount.ts","../../src/module/formatter.ts","../../src/module/fraction.ts","../../src/common/constant.ts","../../src/sega/token/constant.ts","../../src/module/token.ts","../../src/common/pubKey.ts","../../src/module/currency.ts","../../src/module/percent.ts","../../src/module/price.ts","../../src/common/utility.ts","../../src/common/lodash.ts","../../src/common/owner.ts","../../src/common/pda.ts","../../src/common/txTool/txUtils.ts","../../src/common/txTool/txType.ts","../../src/common/programId.ts","../../src/common/transfer.ts","../../src/common/txTool/lookupTable.ts","../../src/common/txTool/txTool.ts","../../src/common/network.ts","../../src/api/url.ts","../../src/api/utils.ts","../../src/common/error.ts","../../src/sega/account/account.ts","../../src/sega/moduleBase.ts","../../src/sega/account/instruction.ts","../../src/sega/account/util.ts","../../src/marshmallow/index.ts","../../src/marshmallow/buffer-layout.ts","../../src/sega/account/layout.ts","../../src/sega/cpmm/cpmm.ts","../../src/sega/cpmm/curve/calculator.ts","../../src/sega/cpmm/curve/constantProduct.ts","../../src/sega/cpmm/curve/fee.ts","../../src/sega/token/layout.ts","../../src/sega/token/utils.ts","../../src/sega/cpmm/instruction.ts","../../src/sega/cpmm/pda.ts","../../src/sega/cpmm/layout.ts","../../src/sega/utils1216/utils1216.ts","../../src/sega/token/token.ts"],"sourcesContent":["import { Connection, Keypair, PublicKey, EpochInfo, Commitment } from \"@solana/web3.js\";\nimport { merge } from \"lodash\";\n\nimport { Api, API_URL_CONFIG, ApiV3TokenRes, ApiV3Token, JupTokenType, AvailabilityCheckAPI3 } from \"../api\";\nimport { EMPTY_CONNECTION, EMPTY_OWNER } from \"../common/error\";\nimport { createLogger, Logger } from \"../common/logger\";\nimport { Owner } from \"../common/owner\";\nimport { Cluster } from \"../solana\";\n\nimport Account, { TokenAccountDataProp } from \"./account/account\";\nimport Cpmm from \"./cpmm/cpmm\";\nimport Utils1216 from \"./utils1216\";\n\nimport TokenModule from \"./token/token\";\nimport { SignAllTransactions } from \"./type\";\n\nexport interface SegaLoadParams extends TokenAccountDataProp, Omit<SegaApiBatchRequestParams, \"api\"> {\n  /* ================= solana ================= */\n  // solana web3 connection\n  connection: Connection;\n  // solana cluster/network/env\n  cluster?: Cluster;\n  // user public key\n  owner?: PublicKey | Keypair;\n  /* ================= api ================= */\n  // api request interval in ms, -1 means never request again, 0 means always use fresh data, default is 5 mins (5 * 60 * 1000)\n  apiRequestInterval?: number;\n  // api request timeout in ms, default is 10 secs (10 * 1000)\n  apiRequestTimeout?: number;\n  apiCacheTime?: number;\n  signAllTransactions?: SignAllTransactions;\n  urlConfigs?: API_URL_CONFIG;\n  logRequests?: boolean;\n  logCount?: number;\n  jupTokenType?: JupTokenType;\n  disableFeatureCheck?: boolean;\n  disableLoadToken?: boolean;\n  blockhashCommitment?: Commitment;\n  loopMultiTxStatus?: boolean;\n}\n\nexport interface SegaApiBatchRequestParams {\n  api: Api;\n  defaultChainTimeOffset?: number;\n  defaultChainTime?: number;\n}\n\nexport type SegaConstructorParams = Required<SegaLoadParams> & SegaApiBatchRequestParams;\n\ninterface DataBase<T> {\n  fetched: number;\n  data: T;\n  extInfo?: Record<string, any>;\n}\ninterface ApiData {\n  tokens?: DataBase<ApiV3Token[]>;\n\n  // v3 data\n  tokenList?: DataBase<ApiV3TokenRes>;\n  jupTokenList?: DataBase<ApiV3Token[]>;\n}\n\nexport class Sega {\n  public cluster: Cluster;\n  public account: Account;\n  public cpmm: Cpmm;\n  public utils1216: Utils1216;\n  public token: TokenModule;\n  public rawBalances: Map<string, string> = new Map();\n  public apiData: ApiData;\n  public availability: Partial<AvailabilityCheckAPI3>;\n  public blockhashCommitment: Commitment;\n  public loopMultiTxStatus?: boolean;\n\n  private _connection: Connection;\n  private _owner: Owner | undefined;\n  public api: Api;\n  private _apiCacheTime: number;\n  private _signAllTransactions?: SignAllTransactions;\n  private logger: Logger;\n  private _chainTime?: {\n    fetched: number;\n    value: {\n      chainTime: number;\n      offset: number;\n    };\n  };\n  private _epochInfo?: {\n    fetched: number;\n    value: EpochInfo;\n  };\n\n  constructor(config: SegaConstructorParams) {\n    const {\n      connection,\n      cluster,\n      owner,\n      api,\n      defaultChainTime,\n      defaultChainTimeOffset,\n      apiCacheTime,\n      blockhashCommitment = \"confirmed\",\n      loopMultiTxStatus,\n    } = config;\n\n    this._connection = connection;\n    this.cluster = cluster || \"mainnet\";\n    this._owner = owner ? new Owner(owner) : undefined;\n    this._signAllTransactions = config.signAllTransactions;\n    this.blockhashCommitment = blockhashCommitment;\n    this.loopMultiTxStatus = loopMultiTxStatus;\n\n    this.api = api;\n    this._apiCacheTime = apiCacheTime || 5 * 60 * 1000;\n    this.logger = createLogger(\"Sega\");\n    this.account = new Account({\n      scope: this,\n      moduleName: \"Sega_Account\",\n      tokenAccounts: config.tokenAccounts,\n      tokenAccountRawInfos: config.tokenAccountRawInfos,\n    });\n    this.token = new TokenModule({ scope: this, moduleName: \"Sega_tokenV2\" });\n    this.cpmm = new Cpmm({ scope: this, moduleName: \"Sega_cpmm\" });\n    this.utils1216 = new Utils1216({ scope: this, moduleName: \"Sega_utils1216\" });\n\n    this.availability = {};\n    const now = new Date().getTime();\n    this.apiData = {};\n\n    if (defaultChainTimeOffset)\n      this._chainTime = {\n        fetched: now,\n        value: {\n          chainTime: defaultChainTime || Date.now() - defaultChainTimeOffset,\n          offset: defaultChainTimeOffset,\n        },\n      };\n  }\n\n  static async load(config: SegaLoadParams): Promise<Sega> {\n    const custom: Required<SegaLoadParams> = merge(\n      // default\n      {\n        cluster: \"mainnet\",\n        owner: null,\n        apiRequestInterval: 5 * 60 * 1000,\n        apiRequestTimeout: 10 * 1000,\n      },\n      config,\n    );\n    const { cluster, apiRequestTimeout, logCount, logRequests, urlConfigs } = custom;\n\n    const api = new Api({ cluster, timeout: apiRequestTimeout, urlConfigs, logCount, logRequests });\n    const sega = new Sega({\n      ...custom,\n      api,\n    });\n\n    await sega.fetchAvailabilityStatus(config.disableFeatureCheck ?? true);\n    return sega;\n  }\n\n  get owner(): Owner | undefined {\n    return this._owner;\n  }\n  get ownerPubKey(): PublicKey {\n    if (!this._owner) throw new Error(EMPTY_OWNER);\n    return this._owner.publicKey;\n  }\n  public setOwner(owner?: PublicKey | Keypair): Sega {\n    this._owner = owner ? new Owner(owner) : undefined;\n    this.account.resetTokenAccounts();\n    return this;\n  }\n  get connection(): Connection {\n    if (!this._connection) throw new Error(EMPTY_CONNECTION);\n    return this._connection;\n  }\n  public setConnection(connection: Connection): Sega {\n    this._connection = connection;\n    return this;\n  }\n  get signAllTransactions(): SignAllTransactions | undefined {\n    return this._signAllTransactions;\n  }\n  public setSignAllTransactions(signAllTransactions?: SignAllTransactions): Sega {\n    this._signAllTransactions = signAllTransactions;\n    return this;\n  }\n\n  public checkOwner(): void {\n    if (!this.owner) {\n      console.error(EMPTY_OWNER);\n      throw new Error(EMPTY_OWNER);\n    }\n  }\n\n  private isCacheInvalidate(time: number): boolean {\n    return new Date().getTime() - time > this._apiCacheTime;\n  }\n\n  public async fetchChainTime(): Promise<void> {\n    try {\n      const data = await this.api.getChainTimeOffset();\n      this._chainTime = {\n        fetched: Date.now(),\n        value: {\n          chainTime: Date.now() + data.offset * 1000,\n          offset: data.offset * 1000,\n        },\n      };\n    } catch {\n      this._chainTime = undefined;\n    }\n  }\n\n  public async fetchV3TokenList(forceUpdate?: boolean): Promise<ApiV3TokenRes> {\n    if (this.apiData.tokenList && !this.isCacheInvalidate(this.apiData.tokenList.fetched) && !forceUpdate)\n      return this.apiData.tokenList.data;\n    try {\n      const segaList = await this.api.getTokenList();\n      const dataObject = {\n        fetched: Date.now(),\n        data: segaList,\n      };\n      this.apiData.tokenList = dataObject;\n\n      return dataObject.data;\n    } catch (e) {\n      console.error(e);\n      return {\n        mintList: [],\n        blacklist: [],\n        whiteList: [],\n      };\n    }\n  }\n\n  public async fetchJupTokenList(forceUpdate?: boolean): Promise<ApiV3Token[]> {\n    const prevFetched = this.apiData.jupTokenList;\n    if (prevFetched && !this.isCacheInvalidate(prevFetched.fetched) && !forceUpdate) return prevFetched.data;\n    try {\n      const jupList = await this.api.getJupTokenList();\n      this.apiData.jupTokenList = {\n        fetched: Date.now(),\n        data: jupList.map((t) => ({\n          ...t,\n          mintAuthority: t.mint_authority || undefined,\n          freezeAuthority: t.freeze_authority || undefined,\n        })),\n      };\n\n      return this.apiData.jupTokenList.data;\n    } catch (e) {\n      console.error(e);\n      return [];\n    }\n  }\n\n  get chainTimeData(): { offset: number; chainTime: number } | undefined {\n    return this._chainTime?.value;\n  }\n\n  public async chainTimeOffset(): Promise<number> {\n    if (this._chainTime && Date.now() - this._chainTime.fetched <= 1000 * 60 * 5) return this._chainTime.value.offset;\n    await this.fetchChainTime();\n    return this._chainTime?.value.offset || 0;\n  }\n\n  public async currentBlockChainTime(): Promise<number> {\n    if (this._chainTime && Date.now() - this._chainTime.fetched <= 1000 * 60 * 5)\n      return this._chainTime.value.chainTime;\n    await this.fetchChainTime();\n    return this._chainTime?.value.chainTime || Date.now();\n  }\n\n  public async fetchEpochInfo(): Promise<EpochInfo> {\n    if (this._epochInfo && Date.now() - this._epochInfo.fetched <= 1000 * 30) return this._epochInfo.value;\n    this._epochInfo = {\n      fetched: Date.now(),\n      value: await this.connection.getEpochInfo(),\n    };\n    return this._epochInfo.value;\n  }\n\n  public async fetchAvailabilityStatus(skipCheck?: boolean): Promise<Partial<AvailabilityCheckAPI3>> {\n    if (skipCheck) return {};\n    try {\n      const data = await this.api.fetchAvailabilityStatus();\n      const isAllDisabled = data.all === false;\n      this.availability = {\n        all: data.all,\n        swap: isAllDisabled ? false : data.swap,\n        createConcentratedPosition: isAllDisabled ? false : data.createConcentratedPosition,\n        addConcentratedPosition: isAllDisabled ? false : data.addConcentratedPosition,\n        addStandardPosition: isAllDisabled ? false : data.addStandardPosition,\n        removeConcentratedPosition: isAllDisabled ? false : data.removeConcentratedPosition,\n        removeStandardPosition: isAllDisabled ? false : data.removeStandardPosition,\n        addFarm: isAllDisabled ? false : data.addFarm,\n        removeFarm: isAllDisabled ? false : data.removeFarm,\n      };\n      return data;\n    } catch {\n      return {};\n    }\n  }\n}","import axios, { AxiosInstance } from \"axios\";\n\nimport { createLogger, sleep } from \"../common\";\nimport { Cluster } from \"../solana\";\n\nimport {\n  ApiCpmmConfigInfo,\n  ApiV3Token,\n  AvailabilityCheckAPI3,\n  PoolKeys,\n} from \"./type\";\nimport { API_URLS, API_URL_CONFIG } from \"./url\";\nimport { updateReqHistory } from \"./utils\";\nimport { PublicKey } from \"@solana/web3.js\";\n\nconst logger = createLogger(\"Sega_Api\");\nconst poolKeysCache: Map<string, PoolKeys> = new Map();\n\nexport async function endlessRetry<T>(name: string, call: () => Promise<T>, interval = 1000): Promise<T> {\n  let result: T | undefined;\n\n  while (result == undefined) {\n    try {\n      logger.debug(`Request ${name} through endlessRetry`);\n      result = await call();\n    } catch (err) {\n      logger.error(`Request ${name} failed, retry after ${interval} ms`, err);\n      await sleep(interval);\n    }\n  }\n\n  return result;\n}\n\nexport interface ApiProps {\n  cluster: Cluster;\n  timeout: number;\n  logRequests?: boolean;\n  logCount?: number;\n  urlConfigs?: API_URL_CONFIG;\n}\n\nexport class Api {\n  public cluster: Cluster;\n\n  public api: AxiosInstance;\n  public logCount: number;\n\n  public urlConfigs: API_URL_CONFIG;\n\n  constructor({ cluster, timeout, logRequests, logCount, urlConfigs }: ApiProps) {\n    this.cluster = cluster;\n    this.urlConfigs = urlConfigs || {};\n    this.logCount = logCount || 1000;\n\n    this.api = axios.create({ baseURL: this.urlConfigs.BASE_HOST || API_URLS.BASE_HOST, timeout });\n\n    this.api.interceptors.request.use(\n      (config) => {\n        // before request\n        const { method, baseURL, url } = config;\n\n        logger.debug(`${method?.toUpperCase()} ${baseURL}${url}`);\n\n        return config;\n      },\n      (error) => {\n        // request error\n        logger.error(`Request failed`);\n\n        return Promise.reject(error);\n      },\n    );\n    this.api.interceptors.response.use(\n      (response) => {\n        // 2xx\n        const { config, data, status } = response;\n        const { method, baseURL, url } = config;\n\n        if (logRequests) {\n          updateReqHistory({\n            status,\n            url: `${baseURL}${url}`,\n            params: config.params,\n            data,\n            logCount: this.logCount,\n          });\n        }\n\n        logger.debug(`${method?.toUpperCase()} ${baseURL}${url}  ${status}`);\n\n        return data;\n      },\n      (error) => {\n        // https://axios-http.com/docs/handling_errors\n        // not 2xx\n        const { config, response = {} } = error;\n        const { status } = response;\n        const { method, baseURL, url } = config;\n\n        if (logRequests) {\n          updateReqHistory({\n            status,\n            url: `${baseURL}${url}`,\n            params: config.params,\n            data: error.message,\n            logCount: this.logCount,\n          });\n        }\n\n        logger.error(`${method.toUpperCase()} ${baseURL}${url} ${status || error.message}`);\n\n        return Promise.reject(error);\n      },\n    );\n  }\n\n  async getCpmmConfigs(): Promise<ApiCpmmConfigInfo[]> {\n    const res = await this.api.get(this.urlConfigs.CPMM_CONFIG || API_URLS.CPMM_CONFIG);\n    return res.data;\n  }\n\n  async getBlockSlotCountForSecond(endpointUrl?: string): Promise<number> {\n    if (!endpointUrl) return 2;\n    const res: {\n      id: string;\n      jsonrpc: string;\n      result: { numSlots: number; numTransactions: number; samplePeriodSecs: number; slot: number }[];\n    } = await axios.post(endpointUrl, {\n      id: \"getRecentPerformanceSamples\",\n      jsonrpc: \"2.0\",\n      method: \"getRecentPerformanceSamples\",\n      params: [4],\n    });\n    const slotList = res.result.map((data) => data.numSlots);\n    return slotList.reduce((a, b) => a + b, 0) / slotList.length / 60;\n  }\n\n  async getChainTimeOffset(): Promise<{ offset: number }> {\n    const res = await this.api.get(this.urlConfigs.CHAIN_TIME || API_URLS.CHAIN_TIME);\n    return res.data;\n  }\n\n  async fetchPoolKeysById(props: { idList: string[] }): Promise<PoolKeys[]> {\n    const { idList } = props;\n\n    const cacheList: PoolKeys[] = [];\n\n    const readyList = idList.filter((poolId) => {\n      if (poolKeysCache.has(poolId)) {\n        cacheList.push(poolKeysCache.get(poolId)!);\n        return false;\n      }\n      return true;\n    });\n\n    let data: PoolKeys[] = [];\n    if (readyList.length) {\n      const res = await this.api.get<PoolKeys[]>(\n        (this.urlConfigs.POOL_KEY_BY_ID || API_URLS.POOL_KEY_BY_ID) + `?ids=${readyList.join(\",\")}`,\n      );\n      data = res.data.filter(Boolean);\n      data.forEach((poolKey) => {\n        poolKeysCache.set(poolKey.id, poolKey);\n      });\n    }\n\n    return cacheList.concat(data);\n  }\n\n\n  async getRpcs(): Promise<{\n    rpcs: { batch: boolean; name: string; url: string; weight: number }[];\n    strategy: string;\n  }> {\n    return this.api.get(this.urlConfigs.RPCS || API_URLS.RPCS);\n  }\n\n  async getTokenList(): Promise<{ mintList: ApiV3Token[]; blacklist: string[]; whiteList: string[] }> {\n    const res = await this.api.get(this.urlConfigs.TOKEN_LIST || API_URLS.TOKEN_LIST);\n    return res.data;\n  }\n\n  async getJupTokenList(): Promise<\n    (ApiV3Token & {\n      daily_volume: number;\n      freeze_authority: string | null;\n      mint_authority: string | null;\n    })[]\n  > {\n    return this.api.get(\"\", {\n      baseURL: this.urlConfigs.JUP_TOKEN_LIST || API_URLS.JUP_TOKEN_LIST,\n    });\n  }\n\n  async getTokenInfo(mint: (string | PublicKey)[]): Promise<ApiV3Token[]> {\n    const res = await this.api.get(\n      (this.urlConfigs.MINT_INFO_ID || API_URLS.MINT_INFO_ID) + `?mints=${mint.map((m) => m.toString()).join(\",\")}`,\n    );\n    return res.data;\n  }\n\n  async fetchAvailabilityStatus(): Promise<AvailabilityCheckAPI3> {\n    const res = await this.api.get<AvailabilityCheckAPI3>(\n      this.urlConfigs.CHECK_AVAILABILITY || API_URLS.CHECK_AVAILABILITY,\n    );\n    return res.data;\n  }\n}","import { AccountInfo, Commitment, Connection, PublicKey } from \"@solana/web3.js\";\nimport { ReturnTypeFetchMultipleMintInfos } from \"@/sega/type\";\nimport { WSOLMint, chunkArray, solToWSol } from \"./\";\nimport { createLogger } from \"./logger\";\nimport { MINT_SIZE, TOKEN_PROGRAM_ID, getTransferFeeConfig, unpackMint } from \"@solana/spl-token\";\n\ninterface MultipleAccountsJsonRpcResponse {\n  jsonrpc: string;\n  id: string;\n  error?: {\n    code: number;\n    message: string;\n  };\n  result: {\n    context: { slot: number };\n    value: { data: Array<string>; executable: boolean; lamports: number; owner: string; rentEpoch: number }[];\n  };\n}\n\nexport interface GetMultipleAccountsInfoConfig {\n  batchRequest?: boolean;\n  commitment?: Commitment;\n  chunkCount?: number;\n}\n\nconst logger = createLogger(\"Sega_accountInfo_util\");\n\nexport async function getMultipleAccountsInfo(\n  connection: Connection,\n  publicKeys: PublicKey[],\n  config?: GetMultipleAccountsInfoConfig,\n): Promise<(AccountInfo<Buffer> | null)[]> {\n  const {\n    batchRequest,\n    commitment = \"confirmed\",\n    chunkCount = 100,\n  } = {\n    batchRequest: false,\n    ...config,\n  };\n\n  const chunkedKeys = chunkArray(publicKeys, chunkCount);\n  let results: (AccountInfo<Buffer> | null)[][] = new Array(chunkedKeys.length).fill([]);\n\n  if (batchRequest) {\n    const batch = chunkedKeys.map((keys) => {\n      const args = connection._buildArgs([keys.map((key) => key.toBase58())], commitment, \"base64\");\n      return {\n        methodName: \"getMultipleAccounts\",\n        args,\n      };\n    });\n\n    const _batch = chunkArray(batch, 10);\n\n    const unsafeResponse: MultipleAccountsJsonRpcResponse[] = await (\n      await Promise.all(_batch.map(async (i) => await (connection as any)._rpcBatchRequest(i)))\n    ).flat();\n    results = unsafeResponse.map((unsafeRes: MultipleAccountsJsonRpcResponse) => {\n      if (unsafeRes.error)\n        logger.logWithError(`failed to get info for multiple accounts, RPC_ERROR, ${unsafeRes.error.message}`);\n\n      return unsafeRes.result.value.map((accountInfo) => {\n        if (accountInfo) {\n          const { data, executable, lamports, owner, rentEpoch } = accountInfo;\n\n          if (data.length !== 2 && data[1] !== \"base64\") logger.logWithError(`info must be base64 encoded, RPC_ERROR`);\n\n          return {\n            data: Buffer.from(data[0], \"base64\"),\n            executable,\n            lamports,\n            owner: new PublicKey(owner),\n            rentEpoch,\n          };\n        }\n        return null;\n      });\n    });\n  } else {\n    try {\n      results = (await Promise.all(\n        chunkedKeys.map((keys) => connection.getMultipleAccountsInfo(keys, commitment)),\n      )) as (AccountInfo<Buffer> | null)[][];\n    } catch (error) {\n      if (error instanceof Error) {\n        logger.logWithError(`failed to get info for multiple accounts, RPC_ERROR, ${error.message}`);\n      }\n    }\n  }\n\n  return results.flat();\n}\n\nexport async function getMultipleAccountsInfoWithCustomFlags<T extends { pubkey: PublicKey }>(\n  connection: Connection,\n  publicKeysWithCustomFlag: T[],\n  config?: GetMultipleAccountsInfoConfig,\n): Promise<({ accountInfo: AccountInfo<Buffer> | null } & T)[]> {\n  const multipleAccountsInfo = await getMultipleAccountsInfo(\n    connection,\n    publicKeysWithCustomFlag.map((o) => o.pubkey),\n    config,\n  );\n\n  return publicKeysWithCustomFlag.map((o, idx) => ({ ...o, accountInfo: multipleAccountsInfo[idx] }));\n}\n\nexport enum AccountType {\n  Uninitialized,\n  Mint,\n  Account,\n}\nexport const ACCOUNT_TYPE_SIZE = 1;\n\nexport async function fetchMultipleMintInfos({\n  connection,\n  mints,\n  config,\n}: {\n  connection: Connection;\n  mints: PublicKey[];\n  config?: { batchRequest?: boolean };\n}): Promise<ReturnTypeFetchMultipleMintInfos> {\n  if (mints.length === 0) return {};\n  const mintInfos = await getMultipleAccountsInfoWithCustomFlags(\n    connection,\n    mints.map((i) => ({ pubkey: solToWSol(i) })),\n    config,\n  );\n\n  const mintK: ReturnTypeFetchMultipleMintInfos = {};\n  for (const i of mintInfos) {\n    if (!i.accountInfo || i.accountInfo.data.length < MINT_SIZE) {\n      console.log(\"invalid mint account\", i.pubkey.toBase58());\n      continue;\n    }\n    const t = unpackMint(i.pubkey, i.accountInfo, i.accountInfo?.owner);\n    mintK[i.pubkey.toString()] = {\n      ...t,\n      programId: i.accountInfo?.owner || TOKEN_PROGRAM_ID,\n      feeConfig: getTransferFeeConfig(t) ?? undefined,\n    };\n  }\n  mintK[PublicKey.default.toBase58()] = mintK[WSOLMint.toBase58()];\n\n  return mintK;\n}\n","import { get, set } from \"lodash\";\n\nexport type ModuleName = \"Common.Api\";\n\nexport enum LogLevel {\n  Error,\n  Warning,\n  Info,\n  Debug,\n}\nexport class Logger {\n  private logLevel: LogLevel;\n  private name: string;\n  constructor(params: { name: string; logLevel?: LogLevel }) {\n    this.logLevel = params.logLevel !== undefined ? params.logLevel : LogLevel.Error;\n    this.name = params.name;\n  }\n\n  set level(logLevel: LogLevel) {\n    this.logLevel = logLevel;\n  }\n  get time(): string {\n    return Date.now().toString();\n  }\n  get moduleName(): string {\n    return this.name;\n  }\n\n  private isLogLevel(level: LogLevel): boolean {\n    return level <= this.logLevel;\n  }\n\n  public error(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Error)) return this;\n    console.error(this.time, this.name, \"sdk logger error\", ...props);\n    return this;\n  }\n\n  public logWithError(...props): Logger {\n    // this.error(...props)\n    const msg = props.map((arg) => (typeof arg === \"object\" ? JSON.stringify(arg) : arg)).join(\", \");\n    throw new Error(msg);\n  }\n\n  public warning(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Warning)) return this;\n    console.warn(this.time, this.name, \"sdk logger warning\", ...props);\n    return this;\n  }\n\n  public info(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Info)) return this;\n    console.info(this.time, this.name, \"sdk logger info\", ...props);\n    return this;\n  }\n\n  public debug(...props): Logger {\n    if (!this.isLogLevel(LogLevel.Debug)) return this;\n    console.debug(this.time, this.name, \"sdk logger debug\", ...props);\n    return this;\n  }\n}\n\nconst moduleLoggers: { [key in ModuleName]?: Logger } = {};\nconst moduleLevels: { [key in ModuleName]?: LogLevel } = {};\n\nexport function createLogger(moduleName: string): Logger {\n  let logger = get(moduleLoggers, moduleName);\n  if (!logger) {\n    // default level is error\n    const logLevel = get(moduleLevels, moduleName);\n\n    logger = new Logger({ name: moduleName, logLevel });\n    set(moduleLoggers, moduleName, logger);\n  }\n\n  return logger;\n}\n\nexport function setLoggerLevel(moduleName: string, level: LogLevel): void {\n  set(moduleLevels, moduleName, level);\n\n  const logger = get(moduleLoggers, moduleName);\n  if (logger) logger.level = level;\n}\n","import BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { CurrencyAmount, TokenAmount } from \"../module/amount\";\nimport { Currency } from \"../module/currency\";\nimport { Fraction } from \"../module/fraction\";\nimport { Percent } from \"../module/percent\";\nimport { Price } from \"../module/price\";\nimport { Token } from \"../module/token\";\nimport { SplToken, TokenJson } from \"@/sega/token/type\";\nimport { ReplaceType } from \"@/sega/type\";\nimport { parseBigNumberish } from \"./constant\";\nimport { mul } from \"./fractionUtil\";\nimport { notInnerObject } from \"./utility\";\n\nexport const BN_ZERO = new BN(0);\nexport const BN_ONE = new BN(1);\nexport const BN_TWO = new BN(2);\nexport const BN_THREE = new BN(3);\nexport const BN_FIVE = new BN(5);\nexport const BN_TEN = new BN(10);\nexport const BN_100 = new BN(100);\nexport const BN_1000 = new BN(1000);\nexport const BN_10000 = new BN(10000);\nexport type BigNumberish = BN | string | number | bigint;\nexport type Numberish = number | string | bigint | Fraction | BN;\n\n\nexport function tenExponential(shift: BigNumberish): BN {\n  return BN_TEN.pow(parseBigNumberish(shift));\n}\n\n/**\n *\n * @example\n * getIntInfo(0.34) => { numerator: '34', denominator: '100'}\n * getIntInfo('0.34') //=> { numerator: '34', denominator: '100'}\n */\nexport function parseNumberInfo(n: Numberish | undefined): {\n  denominator: string;\n  numerator: string;\n  sign?: string;\n  int?: string;\n  dec?: string;\n} {\n  if (n === undefined) return { denominator: \"1\", numerator: \"0\" };\n  if (n instanceof BN) {\n    return { numerator: n.toString(), denominator: \"1\" };\n  }\n\n  if (n instanceof Fraction) {\n    return { denominator: n.denominator.toString(), numerator: n.numerator.toString() };\n  }\n\n  const s = String(n);\n  const [, sign = \"\", int = \"\", dec = \"\"] = s.replace(\",\", \"\").match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n  const denominator = \"1\" + \"0\".repeat(dec.length);\n  const numerator = sign + (int === \"0\" ? \"\" : int) + dec || \"0\";\n  return { denominator, numerator, sign, int, dec };\n}\n\n// round up\nexport function divCeil(a: BN, b: BN): BN {\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  const dm = a.divmod(b);\n\n  // Fast case - exact division\n  if (dm.mod.isZero()) return dm.div;\n\n  // Round up\n  return dm.div.isNeg() ? dm.div.isubn(1) : dm.div.iaddn(1);\n}\n\nexport function shakeFractionDecimal(n: Fraction): string {\n  const [, sign = \"\", int = \"\"] = n.toFixed(2).match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n  return `${sign}${int}`;\n}\n\nexport function toBN(n: Numberish, decimal: BigNumberish = 0): BN {\n  if (n instanceof BN) return n;\n  return new BN(shakeFractionDecimal(toFraction(n).mul(BN_TEN.pow(new BN(String(decimal))))));\n}\n\nexport function toFraction(value: Numberish): Fraction {\n  //  to complete math format(may have decimal), not int\n  if (value instanceof Percent) return new Fraction(value.numerator, value.denominator);\n\n  if (value instanceof Price) return value.adjusted;\n\n  // to complete math format(may have decimal), not BN\n  if (value instanceof TokenAmount)\n    try {\n      return toFraction(value.toExact());\n    } catch {\n      return new Fraction(BN_ZERO);\n    }\n\n  // do not ideal with other fraction value\n  if (value instanceof Fraction) return value;\n\n  // wrap to Fraction\n  const n = String(value);\n  const details = parseNumberInfo(n);\n  return new Fraction(details.numerator, details.denominator);\n}\n\n/**\n * @example\n * toPercent(3.14) // => Percent { 314.00% }\n * toPercent(3.14, { alreadyDecimaled: true }) // => Percent {3.14%}\n */\nexport function toPercent(\n  n: Numberish,\n  options?: { /* usually used for backend data */ alreadyDecimaled?: boolean },\n): Percent {\n  const { numerator, denominator } = parseNumberInfo(n);\n  return new Percent(new BN(numerator), new BN(denominator).mul(options?.alreadyDecimaled ? new BN(100) : new BN(1)));\n}\n\nexport function toTokenPrice(params: {\n  token: TokenJson | Token | SplToken;\n  numberPrice: Numberish;\n  decimalDone?: boolean;\n}): Price {\n  const { token, numberPrice, decimalDone } = params;\n  const usdCurrency = new Token({ mint: \"\", decimals: 6, symbol: \"usd\", name: \"usd\", skipMint: true });\n  const { numerator, denominator } = parseNumberInfo(numberPrice);\n  const parsedNumerator = decimalDone ? new BN(numerator).mul(BN_TEN.pow(new BN(token.decimals))) : numerator;\n  const parsedDenominator = new BN(denominator).mul(BN_TEN.pow(new BN(usdCurrency.decimals)));\n\n  return new Price({\n    baseToken: usdCurrency,\n    denominator: parsedDenominator.toString(),\n    quoteToken: new Token({ ...token, skipMint: true, mint: \"\" }),\n    numerator: parsedNumerator.toString(),\n  });\n}\n\nexport function toUsdCurrency(amount: Numberish): CurrencyAmount {\n  const usdCurrency = new Currency({ decimals: 6, symbol: \"usd\", name: \"usd\" });\n  const amountBigNumber = toBN(mul(amount, 10 ** usdCurrency.decimals)!);\n  return new CurrencyAmount(usdCurrency, amountBigNumber);\n}\n\nexport function toTotalPrice(amount: Numberish | undefined, price: Price | undefined): CurrencyAmount {\n  if (!price || !amount) return toUsdCurrency(0);\n  return toUsdCurrency(mul(amount, price)!);\n}\n\nexport function decimalToFraction(n: Decimal | undefined): Fraction | undefined {\n  if (n == null) return undefined;\n  const { numerator, denominator } = parseNumberInfo(n.toString());\n  return new Fraction(numerator, denominator);\n}\n\nexport function isDecimal(val: unknown): boolean {\n  return val instanceof Decimal;\n}\nexport function recursivelyDecimalToFraction<T>(info: T): ReplaceType<T, Decimal, Fraction> {\n  return isDecimal(info)\n    ? decimalToFraction(info as any) as ReplaceType<T, Decimal, Fraction>\n    : Array.isArray(info)\n      ? info.map((k) => recursivelyDecimalToFraction(k)) as ReplaceType<T, Decimal, Fraction>\n      : notInnerObject(info)\n        ? Object.fromEntries(Object.entries(info as any).map(([k, v]) => [k, recursivelyDecimalToFraction(v)])) as ReplaceType<T, Decimal, Fraction>\n        : info as ReplaceType<T, Decimal, Fraction>;\n}\n","import _Big from \"big.js\";\nimport BN from \"bn.js\";\n\nimport { BigNumberish, BN_TEN } from \"../common/bignumber\";\nimport { createLogger, Logger } from \"../common/logger\";\n\nimport { parseBigNumberish, Rounding } from \"../common\";\nimport { Currency } from \"./currency\";\nimport toFormat, { WrappedBig } from \"./formatter\";\nimport { Fraction } from \"./fraction\";\nimport { Token } from \"./token\";\n\nconst logger = createLogger(\"Sega_amount\");\n\nconst Big = toFormat(_Big);\ntype Big = WrappedBig;\n\nexport function splitNumber(num: string, decimals: number): [string, string] {\n  let integral = \"0\";\n  let fractional = \"0\";\n\n  if (num.includes(\".\")) {\n    const splited = num.split(\".\");\n    if (splited.length === 2) {\n      [integral, fractional] = splited;\n      fractional = fractional.padEnd(decimals, \"0\");\n    } else {\n      logger.logWithError(`invalid number string, num: ${num}`);\n    }\n  } else {\n    integral = num;\n  }\n\n  // fix decimals is 0\n  return [integral, fractional.slice(0, decimals) || fractional];\n}\n\nexport class TokenAmount extends Fraction {\n  public readonly token: Token;\n  protected logger: Logger;\n\n  public constructor(token: Token, amount: BigNumberish, isRaw = true, name?: string) {\n    let parsedAmount = new BN(0);\n    const multiplier = BN_TEN.pow(new BN(token.decimals));\n\n    if (isRaw) {\n      parsedAmount = parseBigNumberish(amount);\n    } else {\n      let integralAmount = new BN(0);\n      let fractionalAmount = new BN(0);\n\n      // parse fractional string\n      if (typeof amount === \"string\" || typeof amount === \"number\" || typeof amount === \"bigint\") {\n        const [integral, fractional] = splitNumber(amount.toString(), token.decimals);\n        integralAmount = parseBigNumberish(integral);\n        fractionalAmount = parseBigNumberish(fractional);\n      }\n\n      integralAmount = integralAmount.mul(multiplier);\n      parsedAmount = integralAmount.add(fractionalAmount);\n    }\n\n    super(parsedAmount, multiplier);\n    this.logger = createLogger(name || \"TokenAmount\");\n    this.token = token;\n  }\n\n  public get raw(): BN {\n    return this.numerator;\n  }\n  public isZero(): boolean {\n    return this.raw.isZero();\n  }\n  public gt(other: TokenAmount): boolean {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"gt token not equals\");\n    return this.raw.gt(other.raw);\n  }\n\n  /**\n   * a less than b\n   */\n  public lt(other: TokenAmount): boolean {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"lt token not equals\");\n    return this.raw.lt(other.raw);\n  }\n\n  public add(other: TokenAmount): TokenAmount {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"add token not equals\");\n    return new TokenAmount(this.token, this.raw.add(other.raw));\n  }\n\n  public subtract(other: TokenAmount): TokenAmount {\n    if (!this.token.equals(other.token)) this.logger.logWithError(\"sub token not equals\");\n    return new TokenAmount(this.token, this.raw.sub(other.raw));\n  }\n\n  public toSignificant(\n    significantDigits = this.token.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    return super.toSignificant(significantDigits, format, rounding);\n  }\n\n  /**\n   * To fixed\n   *\n   * @example\n   * ```\n   * 1 -> 1.000000000\n   * 1.234 -> 1.234000000\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toFixed(\n    decimalPlaces = this.token.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    if (decimalPlaces > this.token.decimals) this.logger.logWithError(\"decimals overflow\");\n    return super.toFixed(decimalPlaces, format, rounding);\n  }\n\n  /**\n   * To exact\n   *\n   * @example\n   * ```\n   * 1 -> 1\n   * 1.234 -> 1.234\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toExact(format: object = { groupSeparator: \"\" }): string {\n    Big.DP = this.token.decimals;\n    return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format);\n  }\n}\n\nexport class CurrencyAmount extends Fraction {\n  public readonly currency: Currency;\n  protected logger: Logger;\n\n  public constructor(currency: Currency, amount: BigNumberish, isRaw = true, name?: string) {\n    let parsedAmount = new BN(0);\n    const multiplier = BN_TEN.pow(new BN(currency.decimals));\n\n    if (isRaw) {\n      parsedAmount = parseBigNumberish(amount);\n    } else {\n      let integralAmount = new BN(0);\n      let fractionalAmount = new BN(0);\n\n      // parse fractional string\n      if (typeof amount === \"string\" || typeof amount === \"number\" || typeof amount === \"bigint\") {\n        const [integral, fractional] = splitNumber(amount.toString(), currency.decimals);\n        integralAmount = parseBigNumberish(integral);\n        fractionalAmount = parseBigNumberish(fractional);\n      }\n\n      integralAmount = integralAmount.mul(multiplier);\n      parsedAmount = integralAmount.add(fractionalAmount);\n    }\n\n    super(parsedAmount, multiplier);\n    this.logger = createLogger(name || \"TokenAmount\");\n    this.currency = currency;\n  }\n\n  public get raw(): BN {\n    return this.numerator;\n  }\n\n  public isZero(): boolean {\n    return this.raw.isZero();\n  }\n\n  /**\n   * a greater than b\n   */\n  public gt(other: CurrencyAmount): boolean {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"gt currency not equals\");\n    return this.raw.gt(other.raw);\n  }\n\n  /**\n   * a less than b\n   */\n  public lt(other: CurrencyAmount): boolean {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"lt currency not equals\");\n    return this.raw.lt(other.raw);\n  }\n\n  public add(other: CurrencyAmount): CurrencyAmount {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"add currency not equals\");\n    return new CurrencyAmount(this.currency, this.raw.add(other.raw));\n  }\n\n  public sub(other: CurrencyAmount): CurrencyAmount {\n    if (!this.currency.equals(other.currency)) this.logger.logWithError(\"sub currency not equals\");\n    return new CurrencyAmount(this.currency, this.raw.sub(other.raw));\n  }\n\n  public toSignificant(\n    significantDigits = this.currency.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    return super.toSignificant(significantDigits, format, rounding);\n  }\n\n  /**\n   * To fixed\n   *\n   * @example\n   * ```\n   * 1 -> 1.000000000\n   * 1.234 -> 1.234000000\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toFixed(\n    decimalPlaces = this.currency.decimals,\n    format?: object,\n    rounding: Rounding = Rounding.ROUND_DOWN,\n  ): string {\n    if (decimalPlaces > this.currency.decimals) this.logger.logWithError(\"decimals overflow\");\n\n    return super.toFixed(decimalPlaces, format, rounding);\n  }\n\n  /**\n   * To exact\n   *\n   * @example\n   * ```\n   * 1 -> 1\n   * 1.234 -> 1.234\n   * 1.123456789876543 -> 1.123456789\n   * ```\n   */\n  public toExact(format: object = { groupSeparator: \"\" }): string {\n    Big.DP = this.currency.decimals;\n    return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format);\n  }\n}\n","import Big, { BigConstructor, BigSource, RoundingMode } from \"big.js\";\nimport Decimal, { Config, Numeric } from \"decimal.js-light\";\nimport _toFarmat from \"toformat\";\n\ntype TakeStatic<T> = { [P in keyof T]: T[P] };\ninterface FormatOptions {\n  decimalSeparator?: string;\n  groupSeparator?: string;\n  groupSize?: number;\n  fractionGroupSeparator?: string;\n  fractionGroupSize?: number;\n}\ninterface WrappedBigConstructor extends TakeStatic<BigConstructor> {\n  new (value: BigSource): WrappedBig;\n  (value: BigSource): WrappedBig;\n  (): WrappedBigConstructor;\n\n  format: FormatOptions;\n}\nexport interface WrappedBig extends Big {\n  add(n: BigSource): WrappedBig;\n  abs(): WrappedBig;\n  div(n: BigSource): WrappedBig;\n  minus(n: BigSource): WrappedBig;\n  mod(n: BigSource): WrappedBig;\n  mul(n: BigSource): WrappedBig;\n  plus(n: BigSource): WrappedBig;\n  pow(exp: number): WrappedBig;\n  round(dp?: number, rm?: RoundingMode): WrappedBig;\n  sqrt(): WrappedBig;\n  sub(n: BigSource): WrappedBig;\n  times(n: BigSource): WrappedBig;\n  toFormat(): string;\n  toFormat(options: FormatOptions): string;\n  toFormat(fractionLength: number): string;\n  toFormat(fractionLength: number, options: FormatOptions): string;\n  toFormat(fractionLength: number, missionUnknown: number): string;\n  toFormat(fractionLength: number, missionUnknown: number, options: FormatOptions): string;\n}\n\ntype DecimalConstructor = typeof Decimal;\ninterface WrappedDecimalConstructor extends TakeStatic<DecimalConstructor> {\n  new (value: Numeric): WrappedDecimal;\n  clone(config?: Config): WrappedDecimalConstructor;\n  config(config: Config): WrappedDecimal;\n  set(config: Config): WrappedDecimal;\n  format: FormatOptions;\n}\nexport interface WrappedDecimal extends Decimal {\n  absoluteValue(): WrappedDecimal;\n  abs(): WrappedDecimal;\n  dividedBy(y: Numeric): WrappedDecimal;\n  div(y: Numeric): WrappedDecimal;\n  dividedToIntegerBy(y: Numeric): WrappedDecimal;\n  idiv(y: Numeric): WrappedDecimal;\n  logarithm(base?: Numeric): WrappedDecimal;\n  log(base?: Numeric): WrappedDecimal;\n  minus(y: Numeric): WrappedDecimal;\n  sub(y: Numeric): WrappedDecimal;\n  modulo(y: Numeric): WrappedDecimal;\n  mod(y: Numeric): WrappedDecimal;\n  naturalExponetial(): WrappedDecimal;\n  exp(): WrappedDecimal;\n  naturalLogarithm(): WrappedDecimal;\n  ln(): WrappedDecimal;\n  negated(): WrappedDecimal;\n  neg(): WrappedDecimal;\n  plus(y: Numeric): WrappedDecimal;\n  add(y: Numeric): WrappedDecimal;\n  squareRoot(): WrappedDecimal;\n  sqrt(): WrappedDecimal;\n  times(y: Numeric): WrappedDecimal;\n  mul(y: Numeric): WrappedDecimal;\n  toWrappedDecimalPlaces(dp?: number, rm?: number): WrappedDecimal;\n  todp(dp?: number, rm?: number): WrappedDecimal;\n  toInteger(): WrappedDecimal;\n  toint(): WrappedDecimal;\n  toPower(y: Numeric): WrappedDecimal;\n  pow(y: Numeric): WrappedDecimal;\n  toSignificantDigits(sd?: number, rm?: number): WrappedDecimal;\n  tosd(sd?: number, rm?: number): WrappedDecimal;\n  toFormat(options: FormatOptions): string;\n  toFormat(fractionLength: number): string;\n  toFormat(fractionLength: number, options: FormatOptions): string;\n  toFormat(fractionLength: number, missionUnknown: number): string;\n  toFormat(fractionLength: number, missionUnknown: number, options: FormatOptions): string;\n}\n\nconst toFormat: {\n  (fn: BigConstructor): WrappedBigConstructor;\n  (fn: DecimalConstructor): WrappedDecimalConstructor;\n} = _toFarmat;\nexport default toFormat;\n","import _Big from \"big.js\";\nimport BN from \"bn.js\";\nimport _Decimal from \"decimal.js-light\";\n\nimport { BigNumberish } from \"../common/bignumber\";\nimport { createLogger } from \"../common/logger\";\n\nimport { parseBigNumberish, Rounding } from \"../common/constant\";\nimport toFormat, { WrappedBig } from \"./formatter\";\n\nconst logger = createLogger(\"module/fraction\");\n\nconst Big = toFormat(_Big);\ntype Big = WrappedBig;\n\nconst Decimal = toFormat(_Decimal);\n\nconst toSignificantRounding = {\n  [Rounding.ROUND_DOWN]: Decimal.ROUND_DOWN,\n  [Rounding.ROUND_HALF_UP]: Decimal.ROUND_HALF_UP,\n  [Rounding.ROUND_UP]: Decimal.ROUND_UP,\n};\n\nconst toFixedRounding = {\n  [Rounding.ROUND_DOWN]: _Big.roundDown,\n  [Rounding.ROUND_HALF_UP]: _Big.roundHalfUp,\n  [Rounding.ROUND_UP]: _Big.roundUp,\n};\n\nexport class Fraction {\n  public readonly numerator: BN;\n  public readonly denominator: BN;\n\n  public constructor(numerator: BigNumberish, denominator: BigNumberish = new BN(1)) {\n    this.numerator = parseBigNumberish(numerator);\n    this.denominator = parseBigNumberish(denominator);\n  }\n\n  public get quotient(): BN {\n    return this.numerator.div(this.denominator);\n  }\n\n  public invert(): Fraction {\n    return new Fraction(this.denominator, this.numerator);\n  }\n\n  public add(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    if (this.denominator.eq(otherParsed.denominator)) {\n      return new Fraction(this.numerator.add(otherParsed.numerator), this.denominator);\n    }\n\n    return new Fraction(\n      this.numerator.mul(otherParsed.denominator).add(otherParsed.numerator.mul(this.denominator)),\n      this.denominator.mul(otherParsed.denominator),\n    );\n  }\n\n  public sub(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    if (this.denominator.eq(otherParsed.denominator)) {\n      return new Fraction(this.numerator.sub(otherParsed.numerator), this.denominator);\n    }\n\n    return new Fraction(\n      this.numerator.mul(otherParsed.denominator).sub(otherParsed.numerator.mul(this.denominator)),\n      this.denominator.mul(otherParsed.denominator),\n    );\n  }\n\n  public mul(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    return new Fraction(this.numerator.mul(otherParsed.numerator), this.denominator.mul(otherParsed.denominator));\n  }\n\n  public div(other: Fraction | BigNumberish): Fraction {\n    const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigNumberish(other));\n\n    return new Fraction(this.numerator.mul(otherParsed.denominator), this.denominator.mul(otherParsed.numerator));\n  }\n\n  public toSignificant(\n    significantDigits: number,\n    format: object = { groupSeparator: \"\" },\n    rounding: Rounding = Rounding.ROUND_HALF_UP,\n  ): string {\n    if (!Number.isInteger(significantDigits)) logger.logWithError(`${significantDigits} is not an integer.`);\n    if (significantDigits <= 0) logger.logWithError(`${significantDigits} is not positive.`);\n\n    Decimal.set({ precision: significantDigits + 1, rounding: toSignificantRounding[rounding] });\n    const quotient = new Decimal(this.numerator.toString())\n      .div(this.denominator.toString())\n      .toSignificantDigits(significantDigits);\n    return quotient.toFormat(quotient.decimalPlaces(), format);\n  }\n\n  public toFixed(\n    decimalPlaces: number,\n    format: object = { groupSeparator: \"\" },\n    rounding: Rounding = Rounding.ROUND_HALF_UP,\n  ): string {\n    if (!Number.isInteger(decimalPlaces)) logger.logWithError(`${decimalPlaces} is not an integer.`);\n    if (decimalPlaces < 0) logger.logWithError(`${decimalPlaces} is negative.`);\n\n    Big.DP = decimalPlaces;\n    Big.RM = toFixedRounding[rounding] || 1;\n    return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(decimalPlaces, format);\n  }\n\n  public isZero(): boolean {\n    return this.numerator.isZero();\n  }\n}\n","import BN from \"bn.js\";\nimport { BigNumberish } from \"./bignumber\";\nimport { createLogger } from \"./logger\";\n\nexport enum Rounding {\n  ROUND_DOWN,\n  ROUND_HALF_UP,\n  ROUND_UP,\n}\n\nconst MAX_SAFE = 0x1fffffffffffff;\n\nexport function parseBigNumberish(value: BigNumberish): BN {\n  const logger = createLogger(\"Sega_parseBigNumberish\");\n  // BN\n  if (value instanceof BN) {\n    return value;\n  }\n\n  if (typeof value === \"string\") {\n    if (value.match(/^-?[0-9]+$/)) {\n      return new BN(value);\n    }\n    logger.logWithError(`invalid BigNumberish string: ${value}`);\n  }\n\n  if (typeof value === \"number\") {\n    if (value % 1) {\n      logger.logWithError(`BigNumberish number underflow: ${value}`);\n    }\n\n    if (value >= MAX_SAFE || value <= -MAX_SAFE) {\n      logger.logWithError(`BigNumberish number overflow: ${value}`);\n    }\n\n    return new BN(String(value));\n  }\n\n  if (typeof value === \"bigint\") {\n    return new BN(value.toString());\n  }\n  logger.error(`invalid BigNumberish value: ${value}`);\n  return new BN(0); // never reach, because logWithError will throw error\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { TokenInfo } from \"./type\";\n\nexport const SOL_INFO: TokenInfo = {\n  chainId: 101,\n  address: PublicKey.default.toBase58(),\n  programId: TOKEN_PROGRAM_ID.toBase58(),\n  decimals: 9,\n  symbol: \"SOL\",\n  name: \"solana\",\n  logoURI: `https://img-v1.raydium.io/icon/So11111111111111111111111111111111111111112.png`,\n  tags: [],\n  priority: 2,\n  type: \"sega\",\n  extensions: {\n    coingeckoId: \"solana\",\n  },\n};\n\nexport const TOKEN_WSOL: TokenInfo = {\n  chainId: 101,\n  address: \"So11111111111111111111111111111111111111112\",\n  programId: TOKEN_PROGRAM_ID.toBase58(),\n  decimals: 9,\n  symbol: \"WSOL\",\n  name: \"Wrapped SOL\",\n  logoURI: `https://img-v1.raydium.io/icon/So11111111111111111111111111111111111111112.png`,\n  tags: [],\n  priority: 2,\n  type: \"sega\",\n  extensions: {\n    coingeckoId: \"solana\",\n  },\n};\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { PublicKeyish, SOLMint, validateAndParsePublicKey } from \"../common/pubKey\";\nimport { TOKEN_WSOL } from \"@/sega/token/constant\";\n\n/**\n * A token is any fungible financial instrument on Solana, including SOL and all SPL tokens.\n */\nexport interface TokenProps {\n  mint: PublicKeyish;\n  decimals: number;\n  symbol?: string;\n  name?: string;\n  skipMint?: boolean;\n  isToken2022?: boolean;\n}\n\nexport class Token {\n  public readonly symbol?: string;\n  public readonly name?: string;\n  public readonly decimals: number;\n  public readonly isToken2022: boolean;\n\n  public readonly mint: PublicKey;\n  public static readonly WSOL: Token = new Token({\n    ...TOKEN_WSOL,\n    mint: TOKEN_WSOL.address,\n  });\n\n  /**\n   *\n   * @param mint - pass \"sol\" as mint will auto generate wsol token config\n   */\n  public constructor({ mint, decimals, symbol, name, skipMint = false, isToken2022 = false }: TokenProps) {\n    if (mint === SOLMint.toBase58() || (mint instanceof PublicKey && SOLMint.equals(mint))) {\n      this.decimals = TOKEN_WSOL.decimals;\n      this.symbol = TOKEN_WSOL.symbol;\n      this.name = TOKEN_WSOL.name;\n      this.mint = new PublicKey(TOKEN_WSOL.address);\n      this.isToken2022 = false;\n      return;\n    }\n\n    this.decimals = decimals;\n    this.symbol = symbol || mint.toString().substring(0, 6);\n    this.name = name || mint.toString().substring(0, 6);\n    this.mint = skipMint ? PublicKey.default : validateAndParsePublicKey({ publicKey: mint });\n    this.isToken2022 = isToken2022;\n  }\n\n  public equals(other: Token): boolean {\n    // short circuit on reference equality\n    if (this === other) {\n      return true;\n    }\n    return this.mint.equals(other.mint);\n  }\n}\n","import { AccountMeta, PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\ninterface AccountMetaProps {\n  pubkey: PublicKey;\n  isSigner?: boolean;\n  isWritable?: boolean;\n}\n\nexport function accountMeta({ pubkey, isSigner = false, isWritable = true }: AccountMetaProps): AccountMeta {\n  return {\n    pubkey,\n    isWritable,\n    isSigner,\n  };\n}\n\nexport const commonSystemAccountMeta = [\n  accountMeta({ pubkey: TOKEN_PROGRAM_ID, isWritable: false }),\n  accountMeta({ pubkey: SystemProgram.programId, isWritable: false }),\n  accountMeta({ pubkey: SYSVAR_RENT_PUBKEY, isWritable: false }),\n];\n\nexport type PublicKeyish = PublicKey | string;\n\nexport function validateAndParsePublicKey({\n  publicKey: orgPubKey,\n  transformSol,\n}: {\n  publicKey: PublicKeyish;\n  transformSol?: boolean;\n}): PublicKey {\n  const publicKey = tryParsePublicKey(orgPubKey.toString());\n\n  if (publicKey instanceof PublicKey) {\n    if (transformSol && publicKey.equals(SOLMint)) return WSOLMint;\n    return publicKey;\n  }\n\n  if (transformSol && publicKey.toString() === SOLMint.toBase58()) return WSOLMint;\n\n  if (typeof publicKey === \"string\") {\n    if (publicKey === PublicKey.default.toBase58()) return PublicKey.default;\n    try {\n      const key = new PublicKey(publicKey);\n      return key;\n    } catch {\n      throw new Error(\"invalid public key\");\n    }\n  }\n\n  throw new Error(\"invalid public key\");\n}\n\nexport function tryParsePublicKey(v: string): PublicKey | string {\n  try {\n    return new PublicKey(v);\n  } catch (e) {\n    return v;\n  }\n}\n\nexport const MEMO_PROGRAM_ID = new PublicKey(\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\");\nexport const MEMO_PROGRAM_ID2 = new PublicKey(\"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\");\nexport const RENT_PROGRAM_ID = new PublicKey(\"SysvarRent111111111111111111111111111111111\");\nexport const CLOCK_PROGRAM_ID = new PublicKey(\"SysvarC1ock11111111111111111111111111111111\");\nexport const METADATA_PROGRAM_ID = new PublicKey(\"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\");\nexport const INSTRUCTION_PROGRAM_ID = new PublicKey(\"Sysvar1nstructions1111111111111111111111111\");\nexport const SYSTEM_PROGRAM_ID = SystemProgram.programId;\n\nexport const RAYMint = new PublicKey(\"4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R\");\nexport const PAIMint = new PublicKey(\"Ea5SjE2Y6yvCeW5dYTn7PYMuW5ikXkvbGdcmSnXeaLjS\");\nexport const SRMMint = new PublicKey(\"SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt\");\nexport const USDCMint = new PublicKey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\");\nexport const USDTMint = new PublicKey(\"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB\");\nexport const mSOLMint = new PublicKey(\"mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So\");\nexport const stSOLMint = new PublicKey(\"7dHbWXmci3dT8UFYWYZweBLXgycu7Y3iL6trKn1Y7ARj\");\nexport const USDHMint = new PublicKey(\"USDH1SM1ojwWUga67PGrgFWUHibbjqMvuMaDkRJTgkX\");\nexport const NRVMint = new PublicKey(\"NRVwhjBQiUPYtfDT5zRBVJajzFQHaBUNtC7SNVvqRFa\");\nexport const ANAMint = new PublicKey(\"ANAxByE6G2WjFp7A4NqtWYXb3mgruyzZYg3spfxe6Lbo\");\nexport const ETHMint = new PublicKey(\"7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs\");\nexport const WSOLMint = new PublicKey(\"So11111111111111111111111111111111111111112\");\nexport const SOLMint = PublicKey.default;\n\nexport function solToWSol(mint: PublicKeyish): PublicKey {\n  return validateAndParsePublicKey({ publicKey: mint, transformSol: true });\n}\n","import { SOL_INFO } from \"@/sega/token/constant\";\n\nimport { Token } from \"./token\";\n\ninterface CurrencyProps {\n  decimals: number;\n  symbol?: string;\n  name?: string;\n}\n/**\n * A currency is any fungible financial instrument on Solana, including SOL and all SPL tokens.\n * The only instance of the base class `Currency` is SOL.\n */\nexport class Currency {\n  public readonly symbol?: string;\n  public readonly name?: string;\n  public readonly decimals: number;\n\n  /**\n   * The only instance of the base class `Currency`.\n   */\n  public static readonly SOL: Currency = new Currency(SOL_INFO);\n\n  /**\n   * Constructs an instance of the base class `Currency`. The only instance of the base class `Currency` is `Currency.SOL`.\n   * @param decimals - decimals of the currency\n   * @param symbol - symbol of the currency\n   * @param name - name of the currency\n   */\n  public constructor({ decimals, symbol = \"UNKNOWN\", name = \"UNKNOWN\" }: CurrencyProps) {\n    this.decimals = decimals;\n    this.symbol = symbol;\n    this.name = name;\n  }\n\n  public equals(other: Currency): boolean {\n    return this === other;\n  }\n}\n\n/**\n * Compares two currencies for equality\n */\nexport function currencyEquals(currencyA: Currency, currencyB: Currency): boolean {\n  if (currencyA instanceof Token && currencyB instanceof Token) {\n    return currencyA.equals(currencyB);\n  } else if (currencyA instanceof Token || currencyB instanceof Token) {\n    return false;\n  } else {\n    return currencyA === currencyB;\n  }\n}\n","import BN from \"bn.js\";\nimport { Rounding } from \"../common\";\nimport { Fraction } from \"./fraction\";\n\nexport const _100_PERCENT = new Fraction(new BN(100));\n\nexport class Percent extends Fraction {\n  public toSignificant(significantDigits = 5, format?: object, rounding?: Rounding): string {\n    return this.mul(_100_PERCENT).toSignificant(significantDigits, format, rounding);\n  }\n\n  public toFixed(decimalPlaces = 2, format?: object, rounding?: Rounding): string {\n    return this.mul(_100_PERCENT).toFixed(decimalPlaces, format, rounding);\n  }\n}\n","import { Rounding } from \"../common\";\nimport { BigNumberish, tenExponential } from \"../common/bignumber\";\nimport { createLogger } from \"../common/logger\";\n\nimport { Fraction } from \"./fraction\";\nimport { Token } from \"./token\";\n\nconst logger = createLogger(\"Sega_price\");\n\ninterface PriceProps {\n  baseToken: Token;\n  denominator: BigNumberish;\n  quoteToken: Token;\n  numerator: BigNumberish;\n}\n\nexport class Price extends Fraction {\n  public readonly baseToken: Token; // input i.e. denominator\n  public readonly quoteToken: Token; // output i.e. numerator\n  // used to adjust the raw fraction w/r/t the decimals of the {base,quote}Token\n  public readonly scalar: Fraction;\n\n  // denominator and numerator _must_ be raw, i.e. in the native representation\n  public constructor(params: PriceProps) {\n    const { baseToken, quoteToken, numerator, denominator } = params;\n    super(numerator, denominator);\n\n    this.baseToken = baseToken;\n    this.quoteToken = quoteToken;\n    this.scalar = new Fraction(tenExponential(baseToken.decimals), tenExponential(quoteToken.decimals));\n  }\n\n  public get raw(): Fraction {\n    return new Fraction(this.numerator, this.denominator);\n  }\n\n  public get adjusted(): Fraction {\n    return super.mul(this.scalar);\n  }\n\n  public invert(): Price {\n    return new Price({\n      baseToken: this.quoteToken,\n      quoteToken: this.baseToken,\n      denominator: this.numerator,\n      numerator: this.denominator,\n    });\n  }\n\n  public mul(other: Price): Price {\n    if (this.quoteToken !== other.baseToken) logger.logWithError(\"mul token not equals\");\n\n    const fraction = super.mul(other);\n    return new Price({\n      baseToken: this.baseToken,\n      quoteToken: other.quoteToken,\n      denominator: fraction.denominator,\n      numerator: fraction.numerator,\n    });\n  }\n\n  public toSignificant(significantDigits = this.quoteToken.decimals, format?: object, rounding?: Rounding): string {\n    return this.adjusted.toSignificant(significantDigits, format, rounding);\n  }\n\n  public toFixed(decimalPlaces = this.quoteToken.decimals, format?: object, rounding?: Rounding): string {\n    return this.adjusted.toFixed(decimalPlaces, format, rounding);\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\n\nimport { Fraction, Percent, Price, Token, TokenAmount } from \"../module\";\nimport { ReplaceType } from \"@/sega/type\";\n\nimport { tryParsePublicKey } from \"./pubKey\";\n\nexport async function sleep(ms: number): Promise<void> {\n  new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function getTimestamp(): number {\n  return new Date().getTime();\n}\n\nexport function notInnerObject(v: unknown): v is Record<string, any> {\n  return (\n    typeof v === \"object\" &&\n    v !== null &&\n    ![Token, TokenAmount, PublicKey, Fraction, BN, Price, Percent].some((o) => typeof o === \"object\" && v instanceof o)\n  );\n}\nexport function jsonInfo2PoolKeys<T>(jsonInfo: T): ReplaceType<T, string, PublicKey> {\n  return typeof jsonInfo === \"string\"\n    ? tryParsePublicKey(jsonInfo) as ReplaceType<T, string, PublicKey>\n    : Array.isArray(jsonInfo)\n      ? jsonInfo.map((k) => jsonInfo2PoolKeys(k)) as ReplaceType<T, string, PublicKey>\n      : notInnerObject(jsonInfo)\n        ? Object.fromEntries(Object.entries(jsonInfo).map(([k, v]) => [k, jsonInfo2PoolKeys(v)])) as ReplaceType<T, string, PublicKey>\n        : jsonInfo as ReplaceType<T, string, PublicKey>;\n}\n","/**\n * https://youmightnotneed.com/lodash/\n */\n\nexport function chunkArray<T>(arr: T[], chunkSize = 1, cache: T[][] = []): T[][] {\n  const tmp = [...arr];\n  if (chunkSize <= 0) return cache;\n  while (tmp.length) cache.push(tmp.splice(0, chunkSize));\n  return cache;\n}\n\nexport function intersection<T>(arr: T[], ...args: T[][]): T[] {\n  return arr.filter((item) => args.every((arr) => arr.includes(item)));\n}\n\nexport function xor<T>(arr: T[], ...args: T[][]): T[] {\n  return arr.filter((item) => args.every((arr) => !arr.includes(item)));\n}\n\nexport function uniq<T>(arr: T[]): T[] {\n  return [...new Set(arr)];\n}\n","import { Keypair, PublicKey, Signer } from \"@solana/web3.js\";\n\ntype _Owner = Keypair | PublicKey;\n\nexport class Owner {\n  private readonly _owner: _Owner;\n\n  constructor(owner: _Owner) {\n    this._owner = owner;\n  }\n\n  get publicKey(): PublicKey {\n    if (Owner.isKeyPair(this._owner)) {\n      return this._owner.publicKey;\n    }\n\n    return this._owner;\n  }\n\n  get signer(): Signer | undefined {\n    return Owner.isKeyPair(this._owner) ? this._owner : undefined;\n  }\n\n  get isKeyPair(): boolean {\n    return Owner.isKeyPair(this._owner);\n  }\n\n  get isPublicKey(): boolean {\n    return Owner.isPublicKey(this._owner);\n  }\n\n  static isKeyPair(owner: _Owner): owner is Keypair {\n    return (owner as Keypair).secretKey !== undefined;\n  }\n\n  static isPublicKey(owner: _Owner): owner is PublicKey {\n    return !Owner.isKeyPair(owner);\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { findProgramAddress } from \"./txTool/txUtils\";\nimport { METADATA_PROGRAM_ID } from \"@/common/pubKey\";\n\nexport function getATAAddress(\n  owner: PublicKey,\n  mint: PublicKey,\n  programId?: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress(\n    [owner.toBuffer(), (programId ?? TOKEN_PROGRAM_ID).toBuffer(), mint.toBuffer()],\n    new PublicKey(\"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL\"),\n  );\n}\n\nexport function getPdaMetadataKey(mint: PublicKey): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress(\n    [Buffer.from(\"metadata\", \"utf8\"), METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()],\n    METADATA_PROGRAM_ID,\n  );\n}\n","import {\n  Commitment,\n  ComputeBudgetProgram,\n  Connection,\n  EpochInfo,\n  Keypair,\n  PublicKey,\n  SimulatedTransactionResponse,\n  Transaction,\n  TransactionInstruction,\n  TransactionMessage,\n  VersionedTransaction,\n} from \"@solana/web3.js\";\n\nimport { createLogger } from \"../logger\";\nimport { CacheLTA } from \"./lookupTable\";\nimport { InstructionType } from \"./txType\";\n\nimport { ComputeBudgetConfig } from \"@/sega/type\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nconst logger = createLogger(\"Sega_txUtil\");\n\nexport const MAX_BASE64_SIZE = 1644;\n\nexport function addComputeBudget(config: ComputeBudgetConfig): {\n  instructions: TransactionInstruction[];\n  instructionTypes: string[];\n} {\n  const ins: TransactionInstruction[] = [];\n  const insTypes: string[] = [];\n  if (config.microLamports) {\n    ins.push(ComputeBudgetProgram.setComputeUnitPrice({ microLamports: config.microLamports }));\n    insTypes.push(InstructionType.SetComputeUnitPrice);\n  }\n  if (config.units) {\n    ins.push(ComputeBudgetProgram.setComputeUnitLimit({ units: config.units }));\n    insTypes.push(InstructionType.SetComputeUnitLimit);\n  }\n\n  return {\n    instructions: ins,\n    instructionTypes: insTypes,\n  };\n}\n\nexport async function getRecentBlockHash(connection: Connection, propsCommitment?: Commitment): Promise<string> {\n  const commitment = propsCommitment ?? \"confirmed\";\n  return (await connection.getLatestBlockhash?.({ commitment }))?.blockhash;\n}\n\nexport async function confirmTransaction(connection: Connection, txId: string): Promise<string> {\n  connection.getSignatureStatuses([txId]);\n  return new Promise((resolve, reject) => {\n    const id = setTimeout(reject, 60 * 1000);\n    connection.onSignature(\n      txId,\n      (signatureResult) => {\n        clearTimeout(id);\n        if (!signatureResult.err) {\n          resolve(\"\");\n          return;\n        }\n        reject(Object.assign(signatureResult.err, { txId }));\n      },\n      \"confirmed\",\n    );\n  });\n}\n\n/**\n * Forecast transaction size\n */\nexport function forecastTransactionSize(instructions: TransactionInstruction[], signers: PublicKey[]): boolean {\n  if (instructions.length < 1) logger.logWithError(`no instructions provided: ${instructions.toString()}`);\n  if (signers.length < 1) logger.logWithError(`no signers provided:, ${signers.toString()}`);\n\n  const transaction = new Transaction();\n  transaction.recentBlockhash = \"11111111111111111111111111111111\";\n  transaction.feePayer = signers[0];\n  transaction.add(...instructions);\n\n  try {\n    return Buffer.from(transaction.serialize({ verifySignatures: false })).toString(\"base64\").length < MAX_BASE64_SIZE;\n  } catch (error) {\n    return false;\n  }\n}\n\n/**\n * Simulates multiple instruction\n */\n/**\n * Simulates multiple instruction\n */\nexport async function simulateMultipleInstruction(\n  connection: Connection,\n  instructions: TransactionInstruction[],\n  keyword: string,\n  batchRequest = true,\n): Promise<string[]> {\n  const feePayer = new PublicKey(\"SegaSimuLateTransaction11111111111111111\");\n\n  const transactions: Transaction[] = [];\n\n  let transaction = new Transaction();\n  transaction.feePayer = feePayer;\n\n  for (const instruction of instructions) {\n    if (!forecastTransactionSize([...transaction.instructions, instruction], [feePayer])) {\n      transactions.push(transaction);\n      transaction = new Transaction();\n      transaction.feePayer = feePayer;\n    }\n    transaction.add(instruction);\n  }\n  if (transaction.instructions.length > 0) {\n    transactions.push(transaction);\n  }\n\n  let results: SimulatedTransactionResponse[] = [];\n\n  try {\n    results = await simulateTransaction(connection, transactions, batchRequest);\n    if (results.find((i) => i.err !== null)) throw Error(\"rpc simulateTransaction error\");\n  } catch (error) {\n    if (error instanceof Error) {\n      logger.logWithError(\"failed to simulate for instructions\", \"RPC_ERROR\", {\n        message: error.message,\n      });\n    }\n  }\n\n  const logs: string[] = [];\n  for (const result of results) {\n    logger.debug(\"simulate result:\", result);\n\n    if (result.logs) {\n      const filteredLog = result.logs.filter((log) => log && log.includes(keyword));\n      logger.debug(\"filteredLog:\", logs);\n      if (!filteredLog.length) logger.logWithError(\"simulate log not match keyword\", \"keyword\", keyword);\n      logs.push(...filteredLog);\n    }\n  }\n\n  return logs;\n}\n\nexport function parseSimulateLogToJson(log: string, keyword: string): any {\n  const results = log.match(/{[\"\\w:,]+}/g);\n  if (!results || results.length !== 1) {\n    return logger.logWithError(`simulate log fail to match json, keyword: ${keyword}`);\n  }\n\n  return results[0];\n}\n\nexport function parseSimulateValue(log: string, key: string): any {\n  const reg = new RegExp(`\"${key}\":(\\\\d+)`, \"g\");\n\n  const results = reg.exec(log);\n  if (!results || results.length !== 2) {\n    return logger.logWithError(`simulate log fail to match key\", key: ${key}`);\n  }\n\n  return results[1];\n}\n\nexport interface ProgramAddress {\n  publicKey: PublicKey;\n  nonce: number;\n}\nexport function findProgramAddress(\n  seeds: Array<Buffer | Uint8Array>,\n  programId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  const [publicKey, nonce] = PublicKey.findProgramAddressSync(seeds, programId);\n  return { publicKey, nonce };\n}\n\nexport async function simulateTransaction(\n  connection: Connection,\n  transactions: Transaction[],\n  batchRequest?: boolean,\n): Promise<any[]> {\n  let results: any[] = [];\n  if (batchRequest) {\n    const getLatestBlockhash = await connection.getLatestBlockhash();\n\n    const encodedTransactions: string[] = [];\n    for (const transaction of transactions) {\n      transaction.recentBlockhash = getLatestBlockhash.blockhash;\n      transaction.lastValidBlockHeight = getLatestBlockhash.lastValidBlockHeight;\n\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      const message = transaction._compile();\n      const signData = message.serialize();\n\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      const wireTransaction = transaction._serialize(signData);\n      const encodedTransaction = wireTransaction.toString(\"base64\");\n\n      encodedTransactions.push(encodedTransaction);\n    }\n\n    const batch = encodedTransactions.map((keys) => {\n      const args = connection._buildArgs([keys], undefined, \"base64\");\n      return {\n        methodName: \"simulateTransaction\",\n        args,\n      };\n    });\n\n    const reqData: { methodName: string; args: any[] }[][] = [];\n    const itemReqIndex = 20;\n    for (let i = 0; i < Math.ceil(batch.length / itemReqIndex); i++) {\n      reqData.push(batch.slice(i * itemReqIndex, (i + 1) * itemReqIndex));\n    }\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    results = await (\n      await Promise.all(\n        reqData.map(async (i) => (await (connection as any)._rpcBatchRequest(i)).map((ii) => ii.result.value)),\n      )\n    ).flat();\n  } else {\n    try {\n      results = await Promise.all(\n        transactions.map(async (transaction) => await (await connection.simulateTransaction(transaction)).value),\n      );\n    } catch (error) {\n      if (error instanceof Error) {\n        logger.logWithError(\"failed to get info for multiple accounts\", \"RPC_ERROR\", {\n          message: error.message,\n        });\n      }\n    }\n  }\n\n  return results;\n}\n\nexport function checkLegacyTxSize({\n  instructions,\n  payer,\n  signers,\n}: {\n  instructions: TransactionInstruction[];\n  payer: PublicKey;\n  signers: PublicKey[];\n}): boolean {\n  return forecastTransactionSize(instructions, [payer, ...signers]);\n}\n\nexport function checkV0TxSize({\n  instructions,\n  payer,\n  lookupTableAddressAccount,\n  recentBlockhash = Keypair.generate().publicKey.toString(),\n}: {\n  instructions: TransactionInstruction[];\n  payer: PublicKey;\n  lookupTableAddressAccount?: CacheLTA;\n  recentBlockhash?: string;\n}): boolean {\n  const transactionMessage = new TransactionMessage({\n    payerKey: payer,\n    recentBlockhash,\n    instructions,\n  });\n\n  const messageV0 = transactionMessage.compileToV0Message(Object.values(lookupTableAddressAccount ?? {}));\n  try {\n    const buildLength = Buffer.from(new VersionedTransaction(messageV0).serialize()).toString(\"base64\").length;\n    return buildLength < MAX_BASE64_SIZE;\n  } catch (error) {\n    return false;\n  }\n}\n\nlet epochInfoCache: { time: number; data?: EpochInfo } = {\n  time: 0,\n  data: undefined,\n};\n\nexport async function getEpochInfo(connection: Connection): Promise<EpochInfo> {\n  if (!epochInfoCache.data || (Date.now() - epochInfoCache.time) / 1000 > 30) {\n    const data = await connection.getEpochInfo();\n    epochInfoCache = {\n      time: Date.now(),\n      data,\n    };\n    return data;\n  } else {\n    return epochInfoCache.data;\n  }\n}\n\nexport const toBuffer = (arr: Buffer | Uint8Array | Array<number>): Buffer => {\n  if (Buffer.isBuffer(arr)) {\n    return arr;\n  } else if (arr instanceof Uint8Array) {\n    return Buffer.from(arr.buffer, arr.byteOffset, arr.byteLength);\n  } else {\n    return Buffer.from(arr);\n  }\n};\n\nexport const txToBase64 = (transaction: Transaction | VersionedTransaction): string => {\n  let serialized = transaction.serialize({ requireAllSignatures: false, verifySignatures: false });\n  if (transaction instanceof VersionedTransaction) serialized = toBuffer(serialized);\n  try {\n    return serialized instanceof Buffer ? serialized.toString(\"base64\") : Buffer.from(serialized).toString(\"base64\");\n  } catch {\n    return serialized.toString(\"base64\");\n  }\n};\n\nexport function printSimulate(transactions: Transaction[] | VersionedTransaction[]): string[] {\n  const allBase64: string[] = [];\n  transactions.forEach((transaction) => {\n    if (transaction instanceof Transaction) {\n      if (!transaction.recentBlockhash) transaction.recentBlockhash = TOKEN_PROGRAM_ID.toBase58();\n      if (!transaction.feePayer) transaction.feePayer = Keypair.generate().publicKey;\n    }\n    allBase64.push(txToBase64(transaction));\n  });\n  console.log(\"simulate tx string:\", allBase64);\n\n  return allBase64;\n}\n\nexport function transformTxToBase64(tx: Transaction | VersionedTransaction): string {\n  let serialized = tx.serialize({ requireAllSignatures: false, verifySignatures: false });\n  if (tx instanceof VersionedTransaction) serialized = toBuffer(serialized);\n  return serialized.toString(\"base64\");\n}\n","export enum TxVersion {\n  \"V0\",\n  \"LEGACY\",\n}\n\nexport const InstructionType = {\n  CreateAccount: \"CreateAccount\",\n  InitAccount: \"InitAccount\",\n  CreateATA: \"CreateATA\",\n  CloseAccount: \"CloseAccount\",\n  TransferAmount: \"TransferAmount\",\n  InitMint: \"InitMint\",\n  MintTo: \"MintTo\",\n\n  InitMarket: \"InitMarket\", // create market main ins\n  Util1216OwnerClaim: \"Util1216OwnerClaim\", // owner claim token ins\n\n  SetComputeUnitPrice: \"SetComputeUnitPrice\",\n  SetComputeUnitLimit: \"SetComputeUnitLimit\",\n\n  // CLMM\n  ClmmCreatePool: \"ClmmCreatePool\",\n  ClmmOpenPosition: \"ClmmOpenPosition\",\n  ClmmIncreasePosition: \"ClmmIncreasePosition\",\n  ClmmDecreasePosition: \"ClmmDecreasePosition\",\n  ClmmClosePosition: \"ClmmClosePosition\",\n  ClmmSwapBaseIn: \"ClmmSwapBaseIn\",\n  ClmmSwapBaseOut: \"ClmmSwapBaseOut\",\n  ClmmInitReward: \"ClmmInitReward\",\n  ClmmSetReward: \"ClmmSetReward\",\n  ClmmCollectReward: \"ClmmCollectReward\",\n  ClmmLockPosition: \"ClmmLockPosition\",\n  ClmmHarvestLockPosition: \"ClmmHarvestLockPosition\",\n\n  AmmV4Swap: \"AmmV4Swap\",\n  AmmV4AddLiquidity: \"AmmV4AddLiquidity\",\n  AmmV4RemoveLiquidity: \"AmmV4RemoveLiquidity\",\n  AmmV4SimulatePoolInfo: \"AmmV4SimulatePoolInfo\",\n  AmmV4SwapBaseIn: \"AmmV4SwapBaseIn\",\n  AmmV4SwapBaseOut: \"AmmV4SwapBaseOut\",\n  AmmV4CreatePool: \"AmmV4CreatePool\",\n  AmmV4InitPool: \"AmmV4InitPool\",\n\n  AmmV5AddLiquidity: \"AmmV5AddLiquidity\",\n  AmmV5RemoveLiquidity: \"AmmV5RemoveLiquidity\",\n  AmmV5SimulatePoolInfo: \"AmmV5SimulatePoolInfo\",\n  AmmV5SwapBaseIn: \"AmmV5SwapBaseIn\",\n  AmmV5SwapBaseOut: \"AmmV5SwapBaseOut\",\n\n  RouteSwap: \"RouteSwap\",\n  RouteSwap1: \"RouteSwap1\",\n  RouteSwap2: \"RouteSwap2\",\n\n  FarmV3Deposit: \"FarmV3Deposit\",\n  FarmV3Withdraw: \"FarmV3Withdraw\",\n  FarmV3CreateLedger: \"FarmV3CreateLedger\",\n\n  FarmV4Withdraw: \"FarmV4Withdraw\",\n\n  FarmV5Deposit: \"FarmV5Deposit\",\n  FarmV5Withdraw: \"FarmV5Withdraw\",\n  FarmV5CreateLedger: \"FarmV5CreateLedger\",\n\n  FarmV6Deposit: \"FarmV6Deposit\",\n  FarmV6Withdraw: \"FarmV6Withdraw\",\n  FarmV6Create: \"FarmV6Create\",\n  FarmV6Restart: \"FarmV6Restart\",\n  FarmV6CreatorAddReward: \"FarmV6CreatorAddReward\",\n  FarmV6CreatorWithdraw: \"FarmV6CreatorWithdraw\",\n\n  CpmmCreatePool: \"CpmmCreatePool\",\n  CpmmAddLiquidity: \"CpmmAddLiquidity\",\n  CpmmWithdrawLiquidity: \"CpmmWithdrawLiquidity\",\n  CpmmSwapBaseIn: \"CpmmSwapBaseIn\",\n  CpmmSwapBaseOut: \"CpmmSwapBaseOut\",\n\n  CpmmLockLp: \"CpmmLockLp\",\n  CpmmCollectLockFee: \"CpmmCollectLockFee\",\n  TransferTip: \"TransferTip\",\n};\n","import { PublicKey } from \"@solana/web3.js\";\n\nexport const CREATE_CPMM_POOL_PROGRAM = new PublicKey(\"SegazTQwbYWknDZkJ6j2Kgvm5gw3MrHGKtWstZdoNKZ\");\nexport const CREATE_CPMM_POOL_AUTH = new PublicKey(\"Ajk8d9bERSaFdeoT1d8JUVfaDayrYLnAdgeB47TFMUaG\");\nexport const CREATE_CPMM_POOL_FEE_ACC = new PublicKey(\"2HbjxVVKJ7Ct72Rcd8WK4VTqmwTXL5aAggkH1CHGFGmh\");\n\nexport const DEV_CREATE_CPMM_POOL_PROGRAM = new PublicKey(\"auetiVUVJkRxvNPLYEvVnz8UJSqQ1VgoA83PcicHVD1\");\nexport const DEV_CREATE_CPMM_POOL_AUTH = new PublicKey(\"GzqQwxPSmUZnTyCfX9YWqi32MJg43ujP786ZoacL559Y\");\nexport const DEV_CREATE_CPMM_POOL_FEE_ACC = new PublicKey(\"GzqQwxPSmUZnTyCfX9YWqi32MJg43ujP786ZoacL559Y\");\n\nexport const ALL_PROGRAM_ID = {\n  CREATE_CPMM_POOL_PROGRAM,\n  CREATE_CPMM_POOL_AUTH,\n  CREATE_CPMM_POOL_FEE_ACC,\n};\n\nexport type ProgramIdConfig = Partial<typeof ALL_PROGRAM_ID>;\n\nexport const DEVNET_PROGRAM_ID = {\n  SERUM_MARKET: PublicKey.default,\n  UTIL1216: PublicKey.default,\n  CREATE_CPMM_POOL_PROGRAM: DEV_CREATE_CPMM_POOL_PROGRAM,\n  CREATE_CPMM_POOL_AUTH: DEV_CREATE_CPMM_POOL_AUTH,\n  CREATE_CPMM_POOL_FEE_ACC: DEV_CREATE_CPMM_POOL_FEE_ACC,\n};\n","import { EpochInfo } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { TransferFee, TransferFeeConfig } from \"@solana/spl-token\";\n\nimport { TransferFeeDataBaseType } from \"../api/type\";\nimport { GetTransferAmountFee } from \"@/sega/type\";\n\nconst POINT = 10_000;\nexport function getTransferAmountFee(\n  amount: BN,\n  feeConfig: TransferFeeConfig | undefined,\n  epochInfo: EpochInfo,\n  addFee: boolean,\n): GetTransferAmountFee {\n  if (feeConfig === undefined) {\n    return {\n      amount,\n      fee: undefined,\n      expirationTime: undefined,\n    };\n  }\n\n  const nowFeeConfig: TransferFee =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch ? feeConfig.olderTransferFee : feeConfig.newerTransferFee;\n  const maxFee = new BN(nowFeeConfig.maximumFee.toString());\n  const expirationTime: number | undefined =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch\n      ? ((Number(feeConfig.newerTransferFee.epoch) * epochInfo.slotsInEpoch - epochInfo.absoluteSlot) * 400) / 1000\n      : undefined;\n\n  if (addFee) {\n    if (nowFeeConfig.transferFeeBasisPoints === POINT) {\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      return {\n        amount: amount.add(nowMaxFee),\n        fee: nowMaxFee,\n        expirationTime,\n      };\n    } else {\n      const _TAmount = BNDivCeil(amount.mul(new BN(POINT)), new BN(POINT - nowFeeConfig.transferFeeBasisPoints));\n\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      const TAmount = _TAmount.sub(amount).gt(nowMaxFee) ? amount.add(nowMaxFee) : _TAmount;\n\n      const _fee = BNDivCeil(TAmount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n      const fee = _fee.gt(maxFee) ? maxFee : _fee;\n      return {\n        amount: TAmount,\n        fee,\n        expirationTime,\n      };\n    }\n  } else {\n    const _fee = BNDivCeil(amount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n    const fee = _fee.gt(maxFee) ? maxFee : _fee;\n\n    return {\n      amount,\n      fee,\n      expirationTime,\n    };\n  }\n}\n\nexport function getTransferAmountFeeV2(\n  amount: BN,\n  _feeConfig: TransferFeeDataBaseType | undefined,\n  epochInfo: EpochInfo,\n  addFee: boolean,\n): GetTransferAmountFee {\n  if (_feeConfig === undefined) {\n    return {\n      amount,\n      fee: undefined,\n      expirationTime: undefined,\n    };\n  }\n  const feeConfig = {\n    ..._feeConfig,\n    olderTransferFee: {\n      epoch: BigInt(_feeConfig.olderTransferFee.epoch),\n      maximumFee: BigInt(_feeConfig.olderTransferFee.maximumFee),\n      transferFeeBasisPoints: _feeConfig.olderTransferFee.transferFeeBasisPoints,\n    },\n    newerTransferFee: {\n      epoch: BigInt(_feeConfig.newerTransferFee.epoch),\n      maximumFee: BigInt(_feeConfig.newerTransferFee.maximumFee),\n      transferFeeBasisPoints: _feeConfig.newerTransferFee.transferFeeBasisPoints,\n    },\n  };\n\n  const nowFeeConfig: TransferFee =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch ? feeConfig.olderTransferFee : feeConfig.newerTransferFee;\n  const maxFee = new BN(nowFeeConfig.maximumFee.toString());\n  const expirationTime: number | undefined =\n    epochInfo.epoch < feeConfig.newerTransferFee.epoch\n      ? ((Number(feeConfig.newerTransferFee.epoch) * epochInfo.slotsInEpoch - epochInfo.absoluteSlot) * 400) / 1000\n      : undefined;\n\n  if (addFee) {\n    if (nowFeeConfig.transferFeeBasisPoints === POINT) {\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      return {\n        amount: amount.add(nowMaxFee),\n        fee: nowMaxFee,\n        expirationTime,\n      };\n    } else {\n      const _TAmount = BNDivCeil(amount.mul(new BN(POINT)), new BN(POINT - nowFeeConfig.transferFeeBasisPoints));\n\n      const nowMaxFee = new BN(nowFeeConfig.maximumFee.toString());\n      const TAmount = _TAmount.sub(amount).gt(nowMaxFee) ? amount.add(nowMaxFee) : _TAmount;\n\n      const _fee = BNDivCeil(TAmount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n      const fee = _fee.gt(maxFee) ? maxFee : _fee;\n      return {\n        amount: TAmount,\n        fee,\n        expirationTime,\n      };\n    }\n  } else {\n    const _fee = BNDivCeil(amount.mul(new BN(nowFeeConfig.transferFeeBasisPoints)), new BN(POINT));\n    const fee = _fee.gt(maxFee) ? maxFee : _fee;\n\n    return {\n      amount,\n      fee,\n      expirationTime,\n    };\n  }\n}\n\nexport function minExpirationTime(\n  expirationTime1: number | undefined,\n  expirationTime2: number | undefined,\n): number | undefined {\n  if (expirationTime1 === undefined) return expirationTime2;\n  if (expirationTime2 === undefined) return expirationTime1;\n\n  return Math.min(expirationTime1, expirationTime2);\n}\n\nexport function BNDivCeil(bn1: BN, bn2: BN): BN {\n  const { div, mod } = bn1.divmod(bn2);\n\n  if (mod.gt(new BN(0))) {\n    return div.add(new BN(1));\n  } else {\n    return div;\n  }\n}\n","import { Connection, PublicKey, AddressLookupTableAccount } from \"@solana/web3.js\";\nimport { getMultipleAccountsInfo } from \"../accountInfo\";\n\nexport interface CacheLTA {\n  [key: string]: AddressLookupTableAccount;\n}\n\nexport async function getMultipleLookupTableInfo({\n  connection,\n  address,\n}: {\n  connection: Connection;\n  address: PublicKey[];\n}): Promise<CacheLTA> {\n  const dataInfos = await getMultipleAccountsInfo(\n    connection,\n    [...new Set<string>(address.map((i) => i.toString()))].map((i) => new PublicKey(i)),\n  );\n\n  const outDict: CacheLTA = {};\n  for (let i = 0; i < address.length; i++) {\n    const info = dataInfos[i];\n    const key = address[i];\n    if (!info) continue;\n    const lookupAccount = new AddressLookupTableAccount({\n      key,\n      state: AddressLookupTableAccount.deserialize(info.data),\n    });\n    outDict[key.toString()] = lookupAccount;\n    LOOKUP_TABLE_CACHE[key.toString()] = lookupAccount;\n  }\n\n  return outDict;\n}\n\nexport const LOOKUP_TABLE_CACHE: CacheLTA = {};\n","import {\n  Commitment,\n  Connection,\n  PublicKey,\n  sendAndConfirmTransaction,\n  SignatureResult,\n  Signer,\n  SystemProgram,\n  Transaction,\n  TransactionInstruction,\n  TransactionMessage,\n  VersionedTransaction,\n} from \"@solana/web3.js\";\nimport axios from \"axios\";\n\nimport { Api } from \"../../api\";\nimport { ComputeBudgetConfig, SignAllTransactions, TxTipConfig } from \"@/sega/type\";\nimport { Cluster } from \"../../solana\";\nimport { Owner } from \"../owner\";\nimport { CacheLTA, getMultipleLookupTableInfo, LOOKUP_TABLE_CACHE } from \"./lookupTable\";\nimport { InstructionType, TxVersion } from \"./txType\";\nimport {\n  addComputeBudget,\n  checkLegacyTxSize,\n  checkV0TxSize,\n  confirmTransaction,\n  getRecentBlockHash,\n  printSimulate,\n} from \"./txUtils\";\n\ninterface SolanaFeeInfo {\n  min: number;\n  max: number;\n  avg: number;\n  priorityTx: number;\n  nonVotes: number;\n  priorityRatio: number;\n  avgCuPerBlock: number;\n  blockspaceUsageRatio: number;\n}\ntype SolanaFeeInfoJson = {\n  \"1\": SolanaFeeInfo;\n  \"5\": SolanaFeeInfo;\n  \"15\": SolanaFeeInfo;\n};\n\ninterface ExecuteParams {\n  skipPreflight?: boolean;\n  recentBlockHash?: string;\n  sendAndConfirm?: boolean;\n}\n\ninterface TxBuilderInit {\n  connection: Connection;\n  feePayer: PublicKey;\n  cluster: Cluster;\n  owner?: Owner;\n  blockhashCommitment?: Commitment;\n  loopMultiTxStatus?: boolean;\n  api?: Api;\n  signAllTransactions?: SignAllTransactions;\n}\n\nexport interface AddInstructionParam {\n  addresses?: Record<string, PublicKey>;\n  instructions?: TransactionInstruction[];\n  endInstructions?: TransactionInstruction[];\n  lookupTableAddress?: string[];\n  signers?: Signer[];\n  instructionTypes?: string[];\n  endInstructionTypes?: string[];\n}\n\nexport interface TxBuildData<T = Record<string, any>> {\n  builder: TxBuilder;\n  transaction: Transaction;\n  instructionTypes: string[];\n  signers: Signer[];\n  execute: (params?: ExecuteParams) => Promise<{ txId: string; signedTx: Transaction }>;\n  extInfo: T;\n}\n\nexport interface TxV0BuildData<T = Record<string, any>> extends Omit<TxBuildData<T>, \"transaction\" | \"execute\"> {\n  builder: TxBuilder;\n  transaction: VersionedTransaction;\n  buildProps?: {\n    lookupTableCache?: CacheLTA;\n    lookupTableAddress?: string[];\n  };\n  execute: (params?: ExecuteParams) => Promise<{ txId: string; signedTx: VersionedTransaction }>;\n}\n\ntype TxUpdateParams = {\n  txId: string;\n  status: \"success\" | \"error\" | \"sent\";\n  signedTx: Transaction | VersionedTransaction;\n};\nexport interface MultiTxExecuteParam extends ExecuteParams {\n  sequentially: boolean;\n  skipTxCount?: number;\n  onTxUpdate?: (completeTxs: TxUpdateParams[]) => void;\n}\nexport interface MultiTxBuildData<T = Record<string, any>> {\n  builder: TxBuilder;\n  transactions: Transaction[];\n  instructionTypes: string[];\n  signers: Signer[][];\n  execute: (executeParams?: MultiTxExecuteParam) => Promise<{ txIds: string[]; signedTxs: Transaction[] }>;\n  extInfo: T;\n}\n\nexport interface MultiTxV0BuildData<T = Record<string, any>>\n  extends Omit<MultiTxBuildData<T>, \"transactions\" | \"execute\"> {\n  builder: TxBuilder;\n  transactions: VersionedTransaction[];\n  buildProps?: {\n    lookupTableCache?: CacheLTA;\n    lookupTableAddress?: string[];\n  };\n  execute: (executeParams?: MultiTxExecuteParam) => Promise<{ txIds: string[]; signedTxs: VersionedTransaction[] }>;\n}\n\nexport type MakeMultiTxData<T = TxVersion.LEGACY, O = Record<string, any>> = T extends TxVersion.LEGACY\n  ? MultiTxBuildData<O>\n  : MultiTxV0BuildData<O>;\n\nexport type MakeTxData<T = TxVersion.LEGACY, O = Record<string, any>> = T extends TxVersion.LEGACY\n  ? TxBuildData<O>\n  : TxV0BuildData<O>;\n\nconst LOOP_INTERVAL = 2000;\n\nexport class TxBuilder {\n  private connection: Connection;\n  private owner?: Owner;\n  private instructions: TransactionInstruction[] = [];\n  private endInstructions: TransactionInstruction[] = [];\n  private lookupTableAddress: string[] = [];\n  private signers: Signer[] = [];\n  private instructionTypes: string[] = [];\n  private endInstructionTypes: string[] = [];\n  private feePayer: PublicKey;\n  private cluster: Cluster;\n  private signAllTransactions?: SignAllTransactions;\n  private blockhashCommitment?: Commitment;\n  private loopMultiTxStatus: boolean;\n\n  constructor(params: TxBuilderInit) {\n    this.connection = params.connection;\n    this.feePayer = params.feePayer;\n    this.signAllTransactions = params.signAllTransactions;\n    this.owner = params.owner;\n    this.cluster = params.cluster;\n    this.blockhashCommitment = params.blockhashCommitment;\n    this.loopMultiTxStatus = !!params.loopMultiTxStatus;\n  }\n\n  get AllTxData(): {\n    instructions: TransactionInstruction[];\n    endInstructions: TransactionInstruction[];\n    signers: Signer[];\n    instructionTypes: string[];\n    endInstructionTypes: string[];\n    lookupTableAddress: string[];\n  } {\n    return {\n      instructions: this.instructions,\n      endInstructions: this.endInstructions,\n      signers: this.signers,\n      instructionTypes: this.instructionTypes,\n      endInstructionTypes: this.endInstructionTypes,\n      lookupTableAddress: this.lookupTableAddress,\n    };\n  }\n\n  get allInstructions(): TransactionInstruction[] {\n    return [...this.instructions, ...this.endInstructions];\n  }\n\n  public async getComputeBudgetConfig(): Promise<ComputeBudgetConfig | undefined> {\n    const json = (\n      await axios.get<SolanaFeeInfoJson>(`https://solanacompass.com/api/fees?cacheFreshTime=${5 * 60 * 1000}`)\n    ).data;\n    const { avg } = json?.[15] ?? {};\n    if (!avg) return undefined;\n    return {\n      units: 600000,\n      microLamports: Math.min(Math.ceil((avg * 1000000) / 600000), 25000),\n    };\n  }\n\n  public addCustomComputeBudget(config?: ComputeBudgetConfig): boolean {\n    if (config) {\n      const { instructions, instructionTypes } = addComputeBudget(config);\n      this.instructions.unshift(...instructions);\n      this.instructionTypes.unshift(...instructionTypes);\n      return true;\n    }\n    return false;\n  }\n\n  public addTipInstruction(tipConfig?: TxTipConfig): boolean {\n    if (tipConfig) {\n      this.endInstructions.push(\n        SystemProgram.transfer({\n          fromPubkey: tipConfig.feePayer ?? this.feePayer,\n          toPubkey: new PublicKey(tipConfig.address),\n          lamports: BigInt(tipConfig.amount.toString()),\n        }),\n      );\n      this.endInstructionTypes.push(InstructionType.TransferTip);\n      return true;\n    }\n    return false;\n  }\n\n  public async calComputeBudget({\n    config: propConfig,\n    defaultIns,\n  }: {\n    config?: ComputeBudgetConfig;\n    defaultIns?: TransactionInstruction[];\n  }): Promise<void> {\n    try {\n      const config = propConfig || (await this.getComputeBudgetConfig());\n      if (this.addCustomComputeBudget(config)) return;\n      defaultIns && this.instructions.unshift(...defaultIns);\n    } catch {\n      defaultIns && this.instructions.unshift(...defaultIns);\n    }\n  }\n\n  public addInstruction({\n    instructions = [],\n    endInstructions = [],\n    signers = [],\n    instructionTypes = [],\n    endInstructionTypes = [],\n    lookupTableAddress = [],\n  }: AddInstructionParam): TxBuilder {\n    this.instructions.push(...instructions);\n    this.endInstructions.push(...endInstructions);\n    this.signers.push(...signers);\n    this.instructionTypes.push(...instructionTypes);\n    this.endInstructionTypes.push(...endInstructionTypes);\n    this.lookupTableAddress.push(...lookupTableAddress.filter((address) => address !== PublicKey.default.toString()));\n    return this;\n  }\n\n  public async versionBuild<O = Record<string, any>>({\n    txVersion,\n    extInfo,\n  }: {\n    txVersion?: TxVersion;\n    extInfo?: O;\n  }): Promise<MakeTxData<TxVersion.LEGACY, O> | MakeTxData<TxVersion.V0, O>> {\n    if (txVersion === TxVersion.V0) return (await this.buildV0({ ...(extInfo || {}) })) as MakeTxData<TxVersion.V0, O>;\n    return this.build<O>(extInfo) as MakeTxData<TxVersion.LEGACY, O>;\n  }\n\n  public build<O = Record<string, any>>(extInfo?: O): MakeTxData<TxVersion.LEGACY, O> {\n    const transaction = new Transaction();\n    if (this.allInstructions.length) transaction.add(...this.allInstructions);\n    transaction.feePayer = this.feePayer;\n    if (this.owner?.signer && !this.signers.some((s) => s.publicKey.equals(this.owner!.publicKey)))\n      this.signers.push(this.owner.signer);\n\n    return {\n      builder: this,\n      transaction,\n      signers: this.signers,\n      instructionTypes: [...this.instructionTypes, ...this.endInstructionTypes],\n      execute: async (params) => {\n        const { recentBlockHash: propBlockHash, skipPreflight = true, sendAndConfirm } = params || {};\n        const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n        transaction.recentBlockhash = recentBlockHash;\n        if (this.signers.length) transaction.sign(...this.signers);\n\n        printSimulate([transaction]);\n        if (this.owner?.isKeyPair) {\n          const txId = sendAndConfirm\n            ? await sendAndConfirmTransaction(\n              this.connection,\n              transaction,\n              this.signers.find((s) => s.publicKey.equals(this.owner!.publicKey))\n                ? this.signers\n                : [...this.signers, this.owner.signer!],\n              { skipPreflight },\n            )\n            : await this.connection.sendRawTransaction(transaction.serialize(), { skipPreflight });\n\n          return {\n            txId,\n            signedTx: transaction,\n          };\n        }\n        if (this.signAllTransactions) {\n          const txs = await this.signAllTransactions([transaction]);\n          if (this.signers.length) {\n            for (const item of txs) {\n              try {\n                item.sign(...this.signers)\n              } catch (e) {\n                //\n              }\n            }\n          }\n          return {\n            txId: await this.connection.sendRawTransaction(txs[0].serialize(), { skipPreflight }),\n            signedTx: txs[0],\n          };\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || ({} as O),\n    };\n  }\n\n  public buildMultiTx<T = Record<string, any>>(params: {\n    extraPreBuildData?: MakeTxData<TxVersion.LEGACY>[];\n    extInfo?: T;\n  }): MultiTxBuildData {\n    const { extraPreBuildData = [], extInfo } = params;\n    const { transaction } = this.build(extInfo);\n\n    const filterExtraBuildData = extraPreBuildData.filter((data) => data.transaction.instructions.length > 0);\n\n    const allTransactions: Transaction[] = [transaction, ...filterExtraBuildData.map((data) => data.transaction)];\n    const allSigners: Signer[][] = [this.signers, ...filterExtraBuildData.map((data) => data.signers)];\n    const allInstructionTypes: string[] = [\n      ...this.instructionTypes,\n      ...filterExtraBuildData.map((data) => data.instructionTypes).flat(),\n    ];\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) this.signers.push(this.owner!.signer!);\n      });\n    }\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      signers: allSigners,\n      instructionTypes: allInstructionTypes,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const {\n          sequentially,\n          onTxUpdate,\n          skipTxCount = 0,\n          recentBlockHash: propBlockHash,\n          skipPreflight = true,\n        } = executeParams || {};\n        const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            const txIds: string[] = [];\n            let i = 0;\n            for (const tx of allTransactions) {\n              ++i;\n              if (i <= skipTxCount) continue;\n              const txId = await sendAndConfirmTransaction(\n                this.connection,\n                tx,\n                this.signers.find((s) => s.publicKey.equals(this.owner!.publicKey))\n                  ? this.signers\n                  : [...this.signers, this.owner.signer!],\n                { skipPreflight },\n              );\n              txIds.push(txId);\n            }\n\n            return {\n              txIds,\n              signedTxs: allTransactions,\n            };\n          }\n          return {\n            txIds: await await Promise.all(\n              allTransactions.map(async (tx) => {\n                tx.recentBlockhash = recentBlockHash;\n                return await this.connection.sendRawTransaction(tx.serialize(), { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n\n        if (this.signAllTransactions) {\n          const partialSignedTxs = allTransactions.map((tx, idx) => {\n            tx.recentBlockhash = recentBlockHash;\n            if (allSigners[idx].length) tx.sign(...allSigners[idx]);\n            return tx;\n          });\n          printSimulate(partialSignedTxs);\n          const signedTxs = await this.signAllTransactions(partialSignedTxs);\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n              let confirmed = false;\n              // eslint-disable-next-line\n              let intervalId: any = null,\n                subSignatureId: number | null = null;\n              const cbk = (signatureResult: SignatureResult): void => {\n                intervalId !== null && clearInterval(intervalId);\n                subSignatureId !== null && this.connection.removeSignatureListener(subSignatureId);\n                const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                if (targetTxIdx > -1) {\n                  if (processedTxs[targetTxIdx].status === \"error\" || processedTxs[targetTxIdx].status === \"success\")\n                    return;\n                  processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                }\n                onTxUpdate?.([...processedTxs]);\n                if (!signatureResult.err) checkSendTx();\n              };\n\n              if (this.loopMultiTxStatus)\n                intervalId = setInterval(async () => {\n                  if (confirmed) {\n                    clearInterval(intervalId!);\n                    return;\n                  }\n                  try {\n                    const r = await this.connection.getTransaction(txId, {\n                      commitment: \"confirmed\",\n                      maxSupportedTransactionVersion: TxVersion.V0,\n                    });\n                    if (r) {\n                      confirmed = true;\n                      clearInterval(intervalId!);\n                      cbk({ err: r.meta?.err || null });\n                      console.log(\"tx status from getTransaction:\", txId);\n                    }\n                  } catch (e) {\n                    confirmed = true;\n                    clearInterval(intervalId!);\n                    console.error(\"getTransaction timeout:\", e, txId);\n                  }\n                }, LOOP_INTERVAL);\n\n              subSignatureId = this.connection.onSignature(\n                txId,\n                (result) => {\n                  if (confirmed) {\n                    this.connection.removeSignatureListener(subSignatureId!);\n                    return;\n                  }\n                  confirmed = true;\n                  cbk(result);\n                },\n                \"confirmed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            await checkSendTx();\n            return {\n              txIds: processedTxs.map((d) => d.txId),\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              txIds.push(txId);\n            }\n            return {\n              txIds,\n              signedTxs,\n            };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || {},\n    };\n  }\n\n  public async versionMultiBuild<T extends TxVersion, O = Record<string, any>>({\n    extraPreBuildData,\n    txVersion,\n    extInfo,\n  }: {\n    extraPreBuildData?: MakeTxData<TxVersion.V0>[] | MakeTxData<TxVersion.LEGACY>[];\n    txVersion?: T;\n    extInfo?: O;\n  }): Promise<MakeMultiTxData<T, O>> {\n    if (txVersion === TxVersion.V0)\n      return (await this.buildV0MultiTx({\n        extraPreBuildData: extraPreBuildData as MakeTxData<TxVersion.V0>[],\n        buildProps: extInfo || {},\n      })) as MakeMultiTxData<T, O>;\n    return this.buildMultiTx<O>({\n      extraPreBuildData: extraPreBuildData as MakeTxData<TxVersion.LEGACY>[],\n      extInfo,\n    }) as MakeMultiTxData<T, O>;\n  }\n\n  public async buildV0<O = Record<string, any>>(\n    props?: O & {\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n      forerunCreate?: boolean;\n      recentBlockhash?: string;\n    },\n  ): Promise<MakeTxData<TxVersion.V0, O>> {\n    const {\n      lookupTableCache = {},\n      lookupTableAddress = [],\n      forerunCreate,\n      recentBlockhash: propRecentBlockhash,\n      ...extInfo\n    } = props || {};\n    const lookupTableAddressAccount = {\n      ...(this.cluster === \"devnet\" ? {} : LOOKUP_TABLE_CACHE),\n      ...lookupTableCache,\n    };\n    const allLTA = Array.from(new Set<string>([...lookupTableAddress, ...this.lookupTableAddress]));\n    const needCacheLTA: PublicKey[] = [];\n    for (const item of allLTA) {\n      if (lookupTableAddressAccount[item] === undefined) needCacheLTA.push(new PublicKey(item));\n    }\n    const newCacheLTA = await getMultipleLookupTableInfo({ connection: this.connection, address: needCacheLTA });\n    for (const [key, value] of Object.entries(newCacheLTA)) lookupTableAddressAccount[key] = value;\n\n    const recentBlockhash = forerunCreate\n      ? PublicKey.default.toBase58()\n      : propRecentBlockhash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n\n    const messageV0 = new TransactionMessage({\n      payerKey: this.feePayer,\n      recentBlockhash,\n      instructions: [...this.allInstructions],\n    }).compileToV0Message(Object.values(lookupTableAddressAccount));\n\n    if (this.owner?.signer && !this.signers.some((s) => s.publicKey.equals(this.owner!.publicKey)))\n      this.signers.push(this.owner.signer);\n    const transaction = new VersionedTransaction(messageV0);\n    transaction.sign(this.signers);\n    return {\n      builder: this,\n      transaction,\n      signers: this.signers,\n      instructionTypes: [...this.instructionTypes, ...this.endInstructionTypes],\n      execute: async (params) => {\n        const { skipPreflight = true, sendAndConfirm } = params || {};\n        printSimulate([transaction]);\n        if (this.owner?.isKeyPair) {\n          const txId = await this.connection.sendTransaction(transaction, { skipPreflight });\n          if (sendAndConfirm) {\n            await confirmTransaction(this.connection, txId);\n          }\n\n          return {\n            txId,\n            signedTx: transaction,\n          };\n        }\n        if (this.signAllTransactions) {\n          const txs = await this.signAllTransactions<VersionedTransaction>([transaction]);\n          if (this.signers.length) {\n            for (const item of txs) {\n              try {\n                item.sign(this.signers)\n              } catch (e) {\n                //\n              }\n            }\n          }\n          return {\n            txId: await this.connection.sendTransaction(txs[0], { skipPreflight }),\n            signedTx: txs[0],\n          };\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: (extInfo || {}) as O,\n    };\n  }\n\n  public async buildV0MultiTx<T = Record<string, any>>(params: {\n    extraPreBuildData?: MakeTxData<TxVersion.V0>[];\n    buildProps?: T & {\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n      forerunCreate?: boolean;\n      recentBlockhash?: string;\n    };\n  }): Promise<MultiTxV0BuildData> {\n    const { extraPreBuildData = [], buildProps } = params;\n    const { transaction } = await this.buildV0(buildProps);\n\n    const filterExtraBuildData = extraPreBuildData.filter((data) => data.builder.instructions.length > 0);\n\n    const allTransactions: VersionedTransaction[] = [\n      transaction,\n      ...filterExtraBuildData.map((data) => data.transaction),\n    ];\n    const allSigners: Signer[][] = [this.signers, ...filterExtraBuildData.map((data) => data.signers)];\n    const allInstructionTypes: string[] = [\n      ...this.instructionTypes,\n      ...filterExtraBuildData.map((data) => data.instructionTypes).flat(),\n    ];\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) this.signers.push(this.owner!.signer!);\n      });\n    }\n\n    allTransactions.forEach(async (tx, idx) => {\n      tx.sign(allSigners[idx]);\n    });\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      signers: allSigners,\n      instructionTypes: allInstructionTypes,\n      buildProps,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const { sequentially, onTxUpdate, recentBlockHash: propBlockHash, skipPreflight = true } = executeParams || {};\n        if (propBlockHash) allTransactions.forEach((tx) => (tx.message.recentBlockhash = propBlockHash));\n        printSimulate(allTransactions);\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            const txIds: string[] = [];\n            for (const tx of allTransactions) {\n              const txId = await this.connection.sendTransaction(tx, { skipPreflight });\n              await confirmTransaction(this.connection, txId);\n              txIds.push(txId);\n            }\n\n            return { txIds, signedTxs: allTransactions };\n          }\n\n          return {\n            txIds: await Promise.all(\n              allTransactions.map(async (tx) => {\n                return await this.connection.sendTransaction(tx, { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n\n        if (this.signAllTransactions) {\n          const signedTxs = await this.signAllTransactions(allTransactions);\n\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n\n              let confirmed = false;\n              // eslint-disable-next-line\n              let intervalId: NodeJS.Timer | null = null,\n                subSignatureId: number | null = null;\n              const cbk = (signatureResult: SignatureResult): void => {\n                intervalId !== null && clearInterval(intervalId);\n                subSignatureId !== null && this.connection.removeSignatureListener(subSignatureId);\n                const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                if (targetTxIdx > -1) {\n                  if (processedTxs[targetTxIdx].status === \"error\" || processedTxs[targetTxIdx].status === \"success\")\n                    return;\n                  processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                }\n                onTxUpdate?.([...processedTxs]);\n                if (!signatureResult.err) checkSendTx();\n              };\n\n              if (this.loopMultiTxStatus)\n                intervalId = setInterval(async () => {\n                  if (confirmed) {\n                    clearInterval(intervalId!);\n                    return;\n                  }\n                  try {\n                    const r = await this.connection.getTransaction(txId, {\n                      commitment: \"confirmed\",\n                      maxSupportedTransactionVersion: TxVersion.V0,\n                    });\n                    if (r) {\n                      confirmed = true;\n                      clearInterval(intervalId!);\n                      cbk({ err: r.meta?.err || null });\n                      console.log(\"tx status from getTransaction:\", txId);\n                    }\n                  } catch (e) {\n                    confirmed = true;\n                    clearInterval(intervalId!);\n                    console.error(\"getTransaction timeout:\", e, txId);\n                  }\n                }, LOOP_INTERVAL);\n\n              subSignatureId = this.connection.onSignature(\n                txId,\n                (result) => {\n                  if (confirmed) {\n                    this.connection.removeSignatureListener(subSignatureId!);\n                    return;\n                  }\n                  confirmed = true;\n                  cbk(result);\n                },\n                \"confirmed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            checkSendTx();\n            return {\n              txIds: [],\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              txIds.push(txId);\n            }\n            return { txIds, signedTxs };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: buildProps || {},\n    };\n  }\n\n  public async sizeCheckBuild(\n    props?: Record<string, any> & { computeBudgetConfig?: ComputeBudgetConfig; splitIns?: TransactionInstruction[] },\n  ): Promise<MultiTxBuildData> {\n    const { splitIns = [], computeBudgetConfig, ...extInfo } = props || {};\n    const computeBudgetData: { instructions: TransactionInstruction[]; instructionTypes: string[] } =\n      computeBudgetConfig\n        ? addComputeBudget(computeBudgetConfig)\n        : {\n          instructions: [],\n          instructionTypes: [],\n        };\n\n    const signerKey: { [key: string]: Signer } = this.signers.reduce(\n      (acc, cur) => ({ ...acc, [cur.publicKey.toBase58()]: cur }),\n      {},\n    );\n\n    const allTransactions: Transaction[] = [];\n    const allSigners: Signer[][] = [];\n\n    let instructionQueue: TransactionInstruction[] = [];\n    let splitInsIdx = 0;\n    this.allInstructions.forEach((item) => {\n      const _itemIns = [...instructionQueue, item];\n      const _itemInsWithCompute = computeBudgetConfig ? [...computeBudgetData.instructions, ..._itemIns] : _itemIns;\n      const _signerStrs = new Set<string>(\n        _itemIns.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signer = [..._signerStrs.values()].map((i) => new PublicKey(i));\n\n      if (\n        item !== splitIns[splitInsIdx] &&\n        instructionQueue.length < 12 &&\n        (checkLegacyTxSize({ instructions: _itemInsWithCompute, payer: this.feePayer, signers: _signer }) ||\n          checkLegacyTxSize({ instructions: _itemIns, payer: this.feePayer, signers: _signer }))\n      ) {\n        // current ins add to queue still not exceed tx size limit\n        instructionQueue.push(item);\n      } else {\n        if (instructionQueue.length === 0) throw Error(\"item ins too big\");\n        splitInsIdx += item === splitIns[splitInsIdx] ? 1 : 0;\n        // if add computeBudget still not exceed tx size limit\n        if (\n          checkLegacyTxSize({\n            instructions: computeBudgetConfig\n              ? [...computeBudgetData.instructions, ...instructionQueue]\n              : [...instructionQueue],\n            payer: this.feePayer,\n            signers: _signer,\n          })\n        ) {\n          allTransactions.push(new Transaction().add(...computeBudgetData.instructions, ...instructionQueue));\n        } else {\n          allTransactions.push(new Transaction().add(...instructionQueue));\n        }\n        allSigners.push(\n          Array.from(\n            new Set<string>(\n              instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n            ),\n          )\n            .map((i) => signerKey[i])\n            .filter((i) => i !== undefined),\n        );\n        instructionQueue = [item];\n      }\n    });\n\n    if (instructionQueue.length > 0) {\n      const _signerStrs = new Set<string>(\n        instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signers = [..._signerStrs.values()].map((i) => signerKey[i]).filter((i) => i !== undefined);\n\n      if (\n        checkLegacyTxSize({\n          instructions: computeBudgetConfig\n            ? [...computeBudgetData.instructions, ...instructionQueue]\n            : [...instructionQueue],\n          payer: this.feePayer,\n          signers: _signers.map((s) => s.publicKey),\n        })\n      ) {\n        allTransactions.push(new Transaction().add(...computeBudgetData.instructions, ...instructionQueue));\n      } else {\n        allTransactions.push(new Transaction().add(...instructionQueue));\n      }\n      allSigners.push(_signers);\n    }\n    allTransactions.forEach((tx) => (tx.feePayer = this.feePayer));\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) signers.push(this.owner!.signer!);\n      });\n    }\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      signers: allSigners,\n      instructionTypes: this.instructionTypes,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const {\n          sequentially,\n          onTxUpdate,\n          skipTxCount = 0,\n          recentBlockHash: propBlockHash,\n          skipPreflight = true,\n        } = executeParams || {};\n        const recentBlockHash = propBlockHash ?? (await getRecentBlockHash(this.connection, this.blockhashCommitment));\n        allTransactions.forEach(async (tx, idx) => {\n          tx.recentBlockhash = recentBlockHash;\n          if (allSigners[idx].length) tx.sign(...allSigners[idx]);\n        });\n        printSimulate(allTransactions);\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            let i = 0;\n            const txIds: string[] = [];\n            for (const tx of allTransactions) {\n              ++i;\n              if (i <= skipTxCount) {\n                txIds.push(\"tx skipped\");\n                continue;\n              }\n              const txId = await sendAndConfirmTransaction(\n                this.connection,\n                tx,\n                this.signers.find((s) => s.publicKey.equals(this.owner!.publicKey))\n                  ? this.signers\n                  : [...this.signers, this.owner.signer!],\n                { skipPreflight },\n              );\n              txIds.push(txId);\n            }\n\n            return {\n              txIds,\n              signedTxs: allTransactions,\n            };\n          }\n          return {\n            txIds: await Promise.all(\n              allTransactions.map(async (tx) => {\n                return await this.connection.sendRawTransaction(tx.serialize(), { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n        if (this.signAllTransactions) {\n          const needSignedTx = await this.signAllTransactions(\n            allTransactions.slice(skipTxCount, allTransactions.length),\n          );\n          const signedTxs = [...allTransactions.slice(0, skipTxCount), ...needSignedTx];\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              if (i < skipTxCount) {\n                // success before, do not send again\n                processedTxs.push({ txId: \"\", status: \"success\", signedTx: signedTxs[i] });\n                onTxUpdate?.([...processedTxs]);\n                i++;\n                checkSendTx();\n              }\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n\n              let confirmed = false;\n              // eslint-disable-next-line\n              let intervalId: NodeJS.Timer | null = null,\n                subSignatureId: number | null = null;\n              const cbk = (signatureResult: SignatureResult): void => {\n                intervalId !== null && clearInterval(intervalId);\n                subSignatureId !== null && this.connection.removeSignatureListener(subSignatureId);\n                const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                if (targetTxIdx > -1) {\n                  if (processedTxs[targetTxIdx].status === \"error\" || processedTxs[targetTxIdx].status === \"success\")\n                    return;\n                  processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                }\n                onTxUpdate?.([...processedTxs]);\n                if (!signatureResult.err) checkSendTx();\n              };\n\n              if (this.loopMultiTxStatus)\n                intervalId = setInterval(async () => {\n                  if (confirmed) {\n                    clearInterval(intervalId!);\n                    return;\n                  }\n                  try {\n                    const r = await this.connection.getTransaction(txId, {\n                      commitment: \"confirmed\",\n                      maxSupportedTransactionVersion: TxVersion.V0,\n                    });\n                    if (r) {\n                      confirmed = true;\n                      clearInterval(intervalId!);\n                      cbk({ err: r.meta?.err || null });\n                      console.log(\"tx status from getTransaction:\", txId);\n                    }\n                  } catch (e) {\n                    confirmed = true;\n                    clearInterval(intervalId!);\n                    console.error(\"getTransaction timeout:\", e, txId);\n                  }\n                }, LOOP_INTERVAL);\n\n              subSignatureId = this.connection.onSignature(\n                txId,\n                (result) => {\n                  if (confirmed) {\n                    this.connection.removeSignatureListener(subSignatureId!);\n                    return;\n                  }\n                  confirmed = true;\n                  cbk(result);\n                },\n                \"confirmed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            await checkSendTx();\n            return {\n              txIds: processedTxs.map((d) => d.txId),\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendRawTransaction(signedTxs[i].serialize(), { skipPreflight });\n              txIds.push(txId);\n            }\n            return { txIds, signedTxs };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || {},\n    };\n  }\n\n  public async sizeCheckBuildV0(\n    props?: Record<string, any> & {\n      computeBudgetConfig?: ComputeBudgetConfig;\n      lookupTableCache?: CacheLTA;\n      lookupTableAddress?: string[];\n      splitIns?: TransactionInstruction[];\n    },\n  ): Promise<MultiTxV0BuildData> {\n    const {\n      computeBudgetConfig,\n      splitIns = [],\n      lookupTableCache = {},\n      lookupTableAddress = [],\n      ...extInfo\n    } = props || {};\n    const lookupTableAddressAccount = {\n      ...(this.cluster === \"devnet\" ? {} : LOOKUP_TABLE_CACHE),\n      ...lookupTableCache,\n    };\n    const allLTA = Array.from(new Set<string>([...this.lookupTableAddress, ...lookupTableAddress]));\n    const needCacheLTA: PublicKey[] = [];\n    for (const item of allLTA) {\n      if (lookupTableAddressAccount[item] === undefined) needCacheLTA.push(new PublicKey(item));\n    }\n    const newCacheLTA = await getMultipleLookupTableInfo({ connection: this.connection, address: needCacheLTA });\n    for (const [key, value] of Object.entries(newCacheLTA)) lookupTableAddressAccount[key] = value;\n\n    const computeBudgetData: { instructions: TransactionInstruction[]; instructionTypes: string[] } =\n      computeBudgetConfig\n        ? addComputeBudget(computeBudgetConfig)\n        : {\n          instructions: [],\n          instructionTypes: [],\n        };\n\n    const blockHash = await getRecentBlockHash(this.connection, this.blockhashCommitment);\n\n    const signerKey: { [key: string]: Signer } = this.signers.reduce(\n      (acc, cur) => ({ ...acc, [cur.publicKey.toBase58()]: cur }),\n      {},\n    );\n    const allTransactions: VersionedTransaction[] = [];\n    const allSigners: Signer[][] = [];\n\n    let instructionQueue: TransactionInstruction[] = [];\n    let splitInsIdx = 0;\n    this.allInstructions.forEach((item) => {\n      const _itemIns = [...instructionQueue, item];\n      const _itemInsWithCompute = computeBudgetConfig ? [...computeBudgetData.instructions, ..._itemIns] : _itemIns;\n      if (\n        item !== splitIns[splitInsIdx] &&\n        instructionQueue.length < 12 &&\n        (checkV0TxSize({ instructions: _itemInsWithCompute, payer: this.feePayer, lookupTableAddressAccount }) ||\n          checkV0TxSize({ instructions: _itemIns, payer: this.feePayer, lookupTableAddressAccount }))\n      ) {\n        // current ins add to queue still not exceed tx size limit\n        instructionQueue.push(item);\n      } else {\n        if (instructionQueue.length === 0) throw Error(\"item ins too big\");\n        splitInsIdx += item === splitIns[splitInsIdx] ? 1 : 0;\n        const lookupTableAddress: undefined | CacheLTA = {};\n        for (const item of [...new Set<string>(allLTA)]) {\n          if (lookupTableAddressAccount[item] !== undefined) lookupTableAddress[item] = lookupTableAddressAccount[item];\n        }\n        // if add computeBudget still not exceed tx size limit\n        if (\n          computeBudgetConfig &&\n          checkV0TxSize({\n            instructions: [...computeBudgetData.instructions, ...instructionQueue],\n            payer: this.feePayer,\n            lookupTableAddressAccount,\n            recentBlockhash: blockHash,\n          })\n        ) {\n          const messageV0 = new TransactionMessage({\n            payerKey: this.feePayer,\n            recentBlockhash: blockHash,\n\n            instructions: [...computeBudgetData.instructions, ...instructionQueue],\n          }).compileToV0Message(Object.values(lookupTableAddressAccount));\n          allTransactions.push(new VersionedTransaction(messageV0));\n        } else {\n          const messageV0 = new TransactionMessage({\n            payerKey: this.feePayer,\n            recentBlockhash: blockHash,\n            instructions: [...instructionQueue],\n          }).compileToV0Message(Object.values(lookupTableAddressAccount));\n          allTransactions.push(new VersionedTransaction(messageV0));\n        }\n        allSigners.push(\n          Array.from(\n            new Set<string>(\n              instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n            ),\n          )\n            .map((i) => signerKey[i])\n            .filter((i) => i !== undefined),\n        );\n        instructionQueue = [item];\n      }\n    });\n\n    if (instructionQueue.length > 0) {\n      const _signerStrs = new Set<string>(\n        instructionQueue.map((i) => i.keys.filter((ii) => ii.isSigner).map((ii) => ii.pubkey.toString())).flat(),\n      );\n      const _signers = [..._signerStrs.values()].map((i) => signerKey[i]).filter((i) => i !== undefined);\n\n      if (\n        computeBudgetConfig &&\n        checkV0TxSize({\n          instructions: [...computeBudgetData.instructions, ...instructionQueue],\n          payer: this.feePayer,\n          lookupTableAddressAccount,\n          recentBlockhash: blockHash,\n        })\n      ) {\n        const messageV0 = new TransactionMessage({\n          payerKey: this.feePayer,\n          recentBlockhash: blockHash,\n          instructions: [...computeBudgetData.instructions, ...instructionQueue],\n        }).compileToV0Message(Object.values(lookupTableAddressAccount));\n        allTransactions.push(new VersionedTransaction(messageV0));\n      } else {\n        const messageV0 = new TransactionMessage({\n          payerKey: this.feePayer,\n          recentBlockhash: blockHash,\n          instructions: [...instructionQueue],\n        }).compileToV0Message(Object.values(lookupTableAddressAccount));\n        allTransactions.push(new VersionedTransaction(messageV0));\n      }\n      allSigners.push(_signers);\n    }\n\n    if (this.owner?.signer) {\n      allSigners.forEach((signers) => {\n        if (!signers.some((s) => s.publicKey.equals(this.owner!.publicKey))) signers.push(this.owner!.signer!);\n      });\n    }\n\n    return {\n      builder: this,\n      transactions: allTransactions,\n      buildProps: props,\n      signers: allSigners,\n      instructionTypes: this.instructionTypes,\n      execute: async (executeParams?: MultiTxExecuteParam) => {\n        const {\n          sequentially,\n          onTxUpdate,\n          skipTxCount = 0,\n          recentBlockHash: propBlockHash,\n          skipPreflight = true,\n        } = executeParams || {};\n        allTransactions.map(async (tx, idx) => {\n          if (allSigners[idx].length) tx.sign(allSigners[idx]);\n          if (propBlockHash) tx.message.recentBlockhash = propBlockHash;\n        });\n        printSimulate(allTransactions);\n        if (this.owner?.isKeyPair) {\n          if (sequentially) {\n            let i = 0;\n            const txIds: string[] = [];\n            for (const tx of allTransactions) {\n              ++i;\n              if (i <= skipTxCount) {\n                console.log(\"skip tx: \", i);\n                txIds.push(\"tx skipped\");\n                continue;\n              }\n              const txId = await this.connection.sendTransaction(tx, { skipPreflight });\n              await confirmTransaction(this.connection, txId);\n\n              txIds.push(txId);\n            }\n\n            return { txIds, signedTxs: allTransactions };\n          }\n\n          return {\n            txIds: await Promise.all(\n              allTransactions.map(async (tx) => {\n                return await this.connection.sendTransaction(tx, { skipPreflight });\n              }),\n            ),\n            signedTxs: allTransactions,\n          };\n        }\n        if (this.signAllTransactions) {\n          const needSignedTx = await this.signAllTransactions(\n            allTransactions.slice(skipTxCount, allTransactions.length),\n          );\n          const signedTxs = [...allTransactions.slice(0, skipTxCount), ...needSignedTx];\n          if (sequentially) {\n            let i = 0;\n            const processedTxs: TxUpdateParams[] = [];\n            const checkSendTx = async (): Promise<void> => {\n              if (!signedTxs[i]) return;\n              if (i < skipTxCount) {\n                // success before, do not send again\n                processedTxs.push({ txId: \"\", status: \"success\", signedTx: signedTxs[i] });\n                onTxUpdate?.([...processedTxs]);\n                i++;\n                checkSendTx();\n                return;\n              }\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              processedTxs.push({ txId, status: \"sent\", signedTx: signedTxs[i] });\n              onTxUpdate?.([...processedTxs]);\n              i++;\n\n              let confirmed = false;\n              // eslint-disable-next-line\n              let intervalId: NodeJS.Timer | null = null,\n                subSignatureId: number | null = null;\n              const cbk = (signatureResult: SignatureResult): void => {\n                intervalId !== null && clearInterval(intervalId);\n                subSignatureId !== null && this.connection.removeSignatureListener(subSignatureId);\n                const targetTxIdx = processedTxs.findIndex((tx) => tx.txId === txId);\n                if (targetTxIdx > -1) {\n                  if (processedTxs[targetTxIdx].status === \"error\" || processedTxs[targetTxIdx].status === \"success\")\n                    return;\n                  processedTxs[targetTxIdx].status = signatureResult.err ? \"error\" : \"success\";\n                }\n                onTxUpdate?.([...processedTxs]);\n                if (!signatureResult.err) checkSendTx();\n              };\n\n              if (this.loopMultiTxStatus)\n                intervalId = setInterval(async () => {\n                  if (confirmed) {\n                    clearInterval(intervalId!);\n                    return;\n                  }\n                  try {\n                    const r = await this.connection.getTransaction(txId, {\n                      commitment: \"confirmed\",\n                      maxSupportedTransactionVersion: TxVersion.V0,\n                    });\n                    if (r) {\n                      confirmed = true;\n                      clearInterval(intervalId!);\n                      cbk({ err: r.meta?.err || null });\n                      console.log(\"tx status from getTransaction:\", txId);\n                    }\n                  } catch (e) {\n                    confirmed = true;\n                    clearInterval(intervalId!);\n                    console.error(\"getTransaction timeout:\", e, txId);\n                  }\n                }, LOOP_INTERVAL);\n\n              subSignatureId = this.connection.onSignature(\n                txId,\n                (result) => {\n                  if (confirmed) {\n                    this.connection.removeSignatureListener(subSignatureId!);\n                    return;\n                  }\n                  confirmed = true;\n                  cbk(result);\n                },\n                \"confirmed\",\n              );\n              this.connection.getSignatureStatus(txId);\n            };\n            checkSendTx();\n            return {\n              txIds: [],\n              signedTxs,\n            };\n          } else {\n            const txIds: string[] = [];\n            for (let i = 0; i < signedTxs.length; i += 1) {\n              const txId = await this.connection.sendTransaction(signedTxs[i], { skipPreflight });\n              txIds.push(txId);\n            }\n            return { txIds, signedTxs };\n          }\n        }\n        throw new Error(\"please provide owner in keypair format or signAllTransactions function\");\n      },\n      extInfo: extInfo || {},\n    };\n  }\n}\n","import { Connection } from '@solana/web3.js'\n\nexport enum Network {\n  SonicMainnet = 'SonicMainnet',\n  SonicTestnetV1 = 'SonicTestnetV1',\n}\n\nexport function getConnection(networkName: string, isArchive = true): Connection {\n  const isMainnet = networkName === Network.SonicMainnet\n  const network = isMainnet ? Network.SonicMainnet : Network.SonicTestnetV1\n  return new Connection(isArchive ? archiveRpcs[network] : rpcs[network])\n}\n\nconst rpcs: Record<Network, string> = {\n  [Network.SonicMainnet]: 'https://api.mainnet-alpha.sonic.game',\n  [Network.SonicTestnetV1]: 'https://api.testnet.v1.sonic.game',\n}\n\nconst archiveRpcs: Record<Network, string> = {\n  [Network.SonicMainnet]: 'https://archival-mainnet.sonic.game',\n  [Network.SonicTestnetV1]: 'https://archival-testnet.sonic.game',\n}\n","export const API_URLS = {\n  BASE_HOST: \"https://api.sega.so/api\",\n\n  SEND_TRANSACTION: \"/send-transaction\",\n  FARM_ARP: \"/main/farm/info\",\n  FARM_ARP_LINE: \"/main/farm-apr-tv\",\n\n  CLMM_CONFIG: \"/main/clmm-config\",\n  CPMM_CONFIG: \"/main/cpmm-config\",\n\n  VERSION: \"/main/version\",\n\n  // api v3\n  CHECK_AVAILABILITY: \"/v3/main/AvailabilityCheckAPI\",\n  RPCS: \"/main/rpcs\",\n  INFO: \"/main/info\",\n  STAKE_POOLS: \"/main/stake-pools\",\n  CHAIN_TIME: \"/main/chain-time\",\n\n  TOKEN_LIST: \"/mint/list\",\n  MINT_INFO_ID: \"/mint/ids\",\n\n  JUP_TOKEN_LIST: \"https://tokens.jup.ag/tokens?tags=lst,community\",\n  /**\n   * poolType: {all, concentrated, standard, allFarm, concentratedFarm, standardFarm}\n   * poolSortField: {liquidity | volume_24h / 7d / 30d | fee_24h / 7d / 30d | apr_24h / 7d / 30d}\n   * sortType: {desc/asc}\n   * page: number\n   * pageSize: number\n   */\n  POOL_LIST: \"/pools/info/list\",\n  /**\n   * ?ids=idList.join(',')\n   */\n  POOL_SEARCH_BY_ID: \"/pools/info/ids\",\n  /**\n   * mint1/mint2: search pool by mint\n   * poolSortField: {liquidity | volume_24h / 7d / 30d | fee_24h / 7d / 30d | apr_24h / 7d / 30d}\n   * poolType: {all, concentrated, standard, allFarm, concentratedFarm, standardFarm}\n   * sortType: {desc/asc}\n   * page: number\n   * pageSize: number\n   */\n  POOL_SEARCH_MINT: \"/pools/info/mint\",\n  /** ?lps=lpList.join(',') */\n  POOL_SEARCH_LP: \"/pools/info/lps\",\n  /** ?ids=idList.join(',') */\n  POOL_KEY_BY_ID: \"/pools/key/ids\",\n  /** ?id=string */\n  POOL_LIQUIDITY_LINE: \"/pools/line/liquidity\",\n  POOL_POSITION_LINE: \"/pools/line/position\",\n\n  FARM_INFO: \"/farms/info/ids\",\n  /** ?lp=string&pageSize=100&page=number */\n  FARM_LP_INFO: \"/farms/info/lp\",\n  FARM_KEYS: \"/farms/key/ids\",\n\n  OWNER_CREATED_FARM: \"/create-pool/{owner}\",\n  OWNER_IDO: \"/main/ido/{owner}\",\n  OWNER_STAKE_FARMS: \"/position/stake/{owner}\",\n  OWNER_LOCK_POSITION: \"/position/clmm-lock/{owner}\",\n  IDO_KEYS: \"/ido/key/ids\",\n  SWAP_COMPUTE: \"/compute/\",\n  SWAP_TX: \"/transaction/\",\n  MINT_PRICE: \"/mint/price\",\n  MIGRATE_CONFIG: \"/main/migrate-lp\",\n  PRIORITY_FEE: \"/main/auto-fee\",\n};\n\nexport const DEV_API_URLS = {\n  ...API_URLS,\n};\n\nexport type API_URL_CONFIG = Partial<typeof API_URLS>;","export const SESSION_KEY = \"ray_tab_hash\";\nexport const STORAGE_KEY = \"ray_req_hash\";\n\nexport const getSessionKey = (): string => {\n  if (typeof window === undefined) return \"\";\n  let key = sessionStorage.getItem(SESSION_KEY);\n\n  // new a session key\n  if (!key) {\n    key = `ray-${Date.now()}`;\n    sessionStorage.setItem(SESSION_KEY, key);\n  }\n  return key;\n};\n\nexport interface ResHistory {\n  status: number;\n  url: string;\n  params?: any;\n  data: any;\n  logCount?: number;\n  time: number;\n  session: string;\n  removeLastLog?: boolean;\n}\n\nexport const updateReqHistory = async ({\n  logCount = 1000,\n  removeLastLog,\n  ...resData\n}: Omit<ResHistory, \"time\" | \"session\">): Promise<void> => {\n  if (typeof window === undefined) return new Promise((resolve) => resolve());\n  const data: ResHistory[] = JSON.parse(localStorage.getItem(STORAGE_KEY) || \"[]\").slice(0, logCount - 1);\n\n  // means retry last save error\n  if (removeLastLog) data.pop();\n\n  // if data > 1kb\n  if (new Blob([JSON.stringify(resData.data)]).size > 1024)\n    resData.data = JSON.stringify(resData.data).substring(0, 200) + \"...\";\n  data.unshift({ ...resData, time: Date.now(), session: getSessionKey() });\n\n  try {\n    localStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n  } catch {\n    // if retry failed, empty request data\n    if (removeLastLog) {\n      let success = false;\n      const resStr = JSON.stringify(resData.data).substring(0, 100);\n      data[0].data = resStr + (resStr.length > 100 ? \"...\" : \"\");\n      while (!success) {\n        data.pop();\n        const resStr = JSON.stringify(resData.data).substring(0, 100);\n        data[0].data = resStr + (resStr.length > 100 ? \"...\" : \"\");\n        try {\n          localStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n          success = true;\n        } catch {\n          success = false;\n        }\n      }\n      return new Promise((resolve) => resolve());\n    }\n    return updateReqHistory({\n      ...resData,\n      logCount,\n      removeLastLog: true,\n    });\n  }\n};","export const EMPTY_OWNER =\n  \"please provide owner in load() initialization or you can set by calling sega.setOwner(owner)\";\n\nexport const EMPTY_CONNECTION =\n  \"please provide connection in load() initialization or set it by sega.setConnection(connection)\";\n","import { Commitment, PublicKey, SystemProgram, TransactionInstruction } from \"@solana/web3.js\";\nimport { BigNumberish, getATAAddress, InstructionType, WSOLMint } from \"@/common\";\nimport {\n  AccountLayout,\n  createAssociatedTokenAccountInstruction,\n  TOKEN_PROGRAM_ID,\n  TOKEN_2022_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { AddInstructionParam } from \"@/common/txTool/txTool\";\n\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport {\n  closeAccountInstruction,\n  createWSolAccountInstructions,\n  initTokenAccountInstruction,\n  makeTransferInstruction,\n} from \"./instruction\";\nimport { GetOrCreateTokenAccountParams, HandleTokenAccountParams, TokenAccount, TokenAccountRaw } from \"./types\";\nimport { generatePubKey, parseTokenAccountResp } from \"./util\";\n\nexport interface TokenAccountDataProp {\n  tokenAccounts?: TokenAccount[];\n  tokenAccountRawInfos?: TokenAccountRaw[];\n  notSubscribeAccountChange?: boolean;\n}\nexport default class Account extends ModuleBase {\n  private _tokenAccounts: TokenAccount[] = [];\n  private _tokenAccountRawInfos: TokenAccountRaw[] = [];\n  private _accountChangeListenerId?: number;\n  private _accountListener: ((data: TokenAccountDataProp) => void)[] = [];\n  private _clientOwnedToken = false;\n  private _notSubscribeAccountChange = false;\n  private _accountFetchTime = 0;\n\n  constructor(params: TokenAccountDataProp & ModuleBaseProps) {\n    super(params);\n    const { tokenAccounts, tokenAccountRawInfos, notSubscribeAccountChange } = params;\n    this._tokenAccounts = tokenAccounts || [];\n    this._tokenAccountRawInfos = tokenAccountRawInfos || [];\n    this._notSubscribeAccountChange = notSubscribeAccountChange ?? true;\n    this._clientOwnedToken = !!(tokenAccounts || tokenAccountRawInfos);\n  }\n\n  get tokenAccounts(): TokenAccount[] {\n    return this._tokenAccounts;\n  }\n  get tokenAccountRawInfos(): TokenAccountRaw[] {\n    return this._tokenAccountRawInfos;\n  }\n\n  set notSubscribeAccountChange(subscribe: boolean) {\n    this._notSubscribeAccountChange = subscribe;\n  }\n\n  public updateTokenAccount({ tokenAccounts, tokenAccountRawInfos }: TokenAccountDataProp): Account {\n    if (tokenAccounts) this._tokenAccounts = tokenAccounts;\n    if (tokenAccountRawInfos) this._tokenAccountRawInfos = tokenAccountRawInfos;\n    this._accountChangeListenerId && this.scope.connection.removeAccountChangeListener(this._accountChangeListenerId);\n    this._accountChangeListenerId = undefined;\n    this._clientOwnedToken = true;\n    return this;\n  }\n\n  public addAccountChangeListener(cbk: (data: TokenAccountDataProp) => void): Account {\n    this._accountListener.push(cbk);\n    return this;\n  }\n\n  public removeAccountChangeListener(cbk: (data: TokenAccountDataProp) => void): Account {\n    this._accountListener = this._accountListener.filter((listener) => listener !== cbk);\n    return this;\n  }\n\n  public getAssociatedTokenAccount(mint: PublicKey, programId?: PublicKey): PublicKey {\n    return getATAAddress(this.scope.ownerPubKey, mint, programId).publicKey;\n  }\n\n  public resetTokenAccounts(): void {\n    if (this._clientOwnedToken) return;\n    this._tokenAccounts = [];\n    this._tokenAccountRawInfos = [];\n  }\n\n  public async fetchWalletTokenAccounts(config?: { forceUpdate?: boolean; commitment?: Commitment }): Promise<{\n    tokenAccounts: TokenAccount[];\n    tokenAccountRawInfos: TokenAccountRaw[];\n  }> {\n    if (\n      this._clientOwnedToken ||\n      (!config?.forceUpdate &&\n        this._tokenAccounts.length &&\n        Date.now() - this._accountFetchTime < (this._notSubscribeAccountChange ? 1000 * 5 : 1000 * 60 * 3))\n    ) {\n      return {\n        tokenAccounts: this._tokenAccounts,\n        tokenAccountRawInfos: this._tokenAccountRawInfos,\n      };\n    }\n    this.scope.checkOwner();\n\n    const defaultConfig = {};\n    const customConfig = { ...defaultConfig, ...config };\n\n    const [solAccountResp, ownerTokenAccountResp, ownerToken2022AccountResp] = await Promise.all([\n      this.scope.connection.getAccountInfo(this.scope.ownerPubKey, customConfig.commitment),\n      this.scope.connection.getTokenAccountsByOwner(\n        this.scope.ownerPubKey,\n        { programId: TOKEN_PROGRAM_ID },\n        customConfig.commitment,\n      ),\n      this.scope.connection.getTokenAccountsByOwner(\n        this.scope.ownerPubKey,\n        { programId: TOKEN_2022_PROGRAM_ID },\n        customConfig.commitment,\n      ),\n    ]);\n\n    const { tokenAccounts, tokenAccountRawInfos } = parseTokenAccountResp({\n      owner: this.scope.ownerPubKey,\n      solAccountResp,\n      tokenAccountResp: {\n        context: ownerTokenAccountResp.context,\n        value: [...ownerTokenAccountResp.value, ...ownerToken2022AccountResp.value],\n      },\n    });\n\n    this._tokenAccounts = tokenAccounts;\n    this._tokenAccountRawInfos = tokenAccountRawInfos;\n\n    this._accountFetchTime = Date.now();\n\n    if (!this._notSubscribeAccountChange) {\n      this._accountChangeListenerId && this.scope.connection.removeAccountChangeListener(this._accountChangeListenerId);\n      this._accountChangeListenerId = this.scope.connection.onAccountChange(\n        this.scope.ownerPubKey,\n        () => {\n          this.fetchWalletTokenAccounts({ forceUpdate: true });\n          this._accountListener.forEach((cb) =>\n            cb({ tokenAccounts: this._tokenAccounts, tokenAccountRawInfos: this._tokenAccountRawInfos }),\n          );\n        },\n        { commitment: config?.commitment },\n      );\n    }\n\n    return { tokenAccounts, tokenAccountRawInfos };\n  }\n\n  public clearAccountChangeCkb(): void {\n    if (this._accountChangeListenerId !== undefined)\n      this.scope.connection.removeAccountChangeListener(this._accountChangeListenerId);\n  }\n\n  // user token account needed, old _selectTokenAccount\n  public async getCreatedTokenAccount({\n    mint,\n    programId = TOKEN_PROGRAM_ID,\n    associatedOnly = true,\n  }: {\n    mint: PublicKey;\n    programId?: PublicKey;\n    associatedOnly?: boolean;\n  }): Promise<PublicKey | undefined> {\n    await this.fetchWalletTokenAccounts();\n    const tokenAccounts = this._tokenAccounts\n      .filter(({ mint: accountMint }) => accountMint?.equals(mint))\n      // sort by balance\n      .sort((a, b) => (a.amount.lt(b.amount) ? 1 : -1));\n\n    const ata = this.getAssociatedTokenAccount(mint, programId);\n    for (const tokenAccount of tokenAccounts) {\n      const { publicKey } = tokenAccount;\n      if (publicKey) {\n        if (!associatedOnly || (associatedOnly && ata.equals(publicKey))) return publicKey;\n      }\n    }\n  }\n\n  // old _selectOrCreateTokenAccount\n  public async getOrCreateTokenAccount(params: GetOrCreateTokenAccountParams): Promise<{\n    account?: PublicKey;\n    instructionParams?: AddInstructionParam;\n  }> {\n    await this.fetchWalletTokenAccounts();\n    const {\n      mint,\n      createInfo,\n      associatedOnly,\n      owner,\n      notUseTokenAccount = false,\n      skipCloseAccount = false,\n      checkCreateATAOwner = false,\n      assignSeed,\n    } = params;\n    const tokenProgram = new PublicKey(params.tokenProgram || TOKEN_PROGRAM_ID);\n    const ata = this.getAssociatedTokenAccount(mint, new PublicKey(tokenProgram));\n    const accounts = (notUseTokenAccount ? [] : this.tokenAccountRawInfos)\n      .filter((i) => i.accountInfo.mint.equals(mint) && (!associatedOnly || i.pubkey.equals(ata)))\n      .sort((a, b) => (a.accountInfo.amount.lt(b.accountInfo.amount) ? 1 : -1));\n    // find token or don't need create\n    if (createInfo === undefined || accounts.length > 0) {\n      return accounts.length > 0 ? { account: accounts[0].pubkey } : {};\n    }\n\n    const newTxInstructions: AddInstructionParam = {\n      instructions: [],\n      endInstructions: [],\n      signers: [],\n      instructionTypes: [],\n      endInstructionTypes: [],\n    };\n\n    if (associatedOnly) {\n      const _createATAIns = createAssociatedTokenAccountInstruction(owner, ata, owner, mint, tokenProgram);\n      const _ataInTokenAcc = this.tokenAccountRawInfos.find((i) => i.pubkey.equals(ata))\n      if (checkCreateATAOwner) {\n        const ataInfo = await this.scope.connection.getAccountInfo(ata);\n        if (ataInfo === null) {\n          newTxInstructions.instructions?.push(_createATAIns);\n          newTxInstructions.instructionTypes!.push(InstructionType.CreateATA);\n        } else if (\n          ataInfo.owner.equals(tokenProgram) &&\n          AccountLayout.decode(ataInfo.data).mint.equals(mint) &&\n          AccountLayout.decode(ataInfo.data).owner.equals(owner)\n        ) {\n          /* empty */\n        } else {\n          throw Error(`create ata check error -> mint: ${mint.toString()}, ata: ${ata.toString()}`);\n        }\n      } else if (_ataInTokenAcc === undefined) {\n        newTxInstructions.instructions!.push(_createATAIns);\n        newTxInstructions.instructionTypes!.push(InstructionType.CreateATA);\n      }\n      if (mint.equals(WSOLMint) && createInfo.amount) {\n        const txInstruction = await createWSolAccountInstructions({\n          connection: this.scope.connection,\n          owner: this.scope.ownerPubKey,\n          payer: createInfo.payer || this.scope.ownerPubKey,\n          amount: createInfo.amount ?? 0,\n          skipCloseAccount,\n        });\n        newTxInstructions.instructions!.push(...(txInstruction.instructions || []));\n        newTxInstructions.endInstructions!.push(...(txInstruction.endInstructions || []));\n        newTxInstructions.instructionTypes!.push(...(txInstruction.instructionTypes || []));\n        newTxInstructions.endInstructionTypes!.push(...(txInstruction.endInstructionTypes || []));\n\n        if (createInfo.amount) {\n          newTxInstructions.instructions!.push(\n            makeTransferInstruction({\n              source: txInstruction.addresses.newAccount,\n              destination: ata,\n              owner: this.scope.ownerPubKey,\n              amount: createInfo.amount,\n              tokenProgram: TOKEN_PROGRAM_ID,\n            }),\n          );\n          newTxInstructions.instructionTypes!.push(InstructionType.TransferAmount);\n        }\n      }\n\n      if (!skipCloseAccount && _ataInTokenAcc === undefined) {\n        newTxInstructions.endInstructions!.push(\n          closeAccountInstruction({\n            owner,\n            payer: createInfo.payer || owner,\n            tokenAccount: ata,\n            programId: tokenProgram,\n          }),\n        );\n        newTxInstructions.endInstructionTypes!.push(InstructionType.CloseAccount);\n      }\n\n      return { account: ata, instructionParams: newTxInstructions };\n    } else {\n      const newTokenAccount = generatePubKey({ fromPublicKey: owner, programId: tokenProgram, assignSeed });\n      const balanceNeeded = await this.scope.connection.getMinimumBalanceForRentExemption(AccountLayout.span);\n\n      const createAccountIns = SystemProgram.createAccountWithSeed({\n        fromPubkey: owner,\n        basePubkey: owner,\n        seed: newTokenAccount.seed,\n        newAccountPubkey: newTokenAccount.publicKey,\n        lamports: balanceNeeded + Number(createInfo.amount?.toString() ?? 0),\n        space: AccountLayout.span,\n        programId: tokenProgram,\n      });\n\n      newTxInstructions.instructions!.push(\n        createAccountIns,\n        initTokenAccountInstruction({\n          mint,\n          tokenAccount: newTokenAccount.publicKey,\n          owner: this.scope.ownerPubKey,\n          programId: tokenProgram,\n        }),\n      );\n      newTxInstructions.instructionTypes!.push(InstructionType.CreateAccount);\n      newTxInstructions.instructionTypes!.push(InstructionType.InitAccount);\n      if (!skipCloseAccount) {\n        newTxInstructions.endInstructions!.push(\n          closeAccountInstruction({\n            owner,\n            payer: createInfo.payer || owner,\n            tokenAccount: newTokenAccount.publicKey,\n            programId: tokenProgram,\n          }),\n        );\n        newTxInstructions.endInstructionTypes!.push(InstructionType.CloseAccount);\n      }\n      return { account: newTokenAccount.publicKey, instructionParams: newTxInstructions };\n    }\n    // }\n  }\n\n  public async checkOrCreateAta({\n    mint,\n    programId = TOKEN_PROGRAM_ID,\n    autoUnwrapWSOLToSOL,\n  }: {\n    mint: PublicKey;\n    programId?: PublicKey;\n    autoUnwrapWSOLToSOL?: boolean;\n  }): Promise<{ pubKey: PublicKey; newInstructions: AddInstructionParam }> {\n    await this.fetchWalletTokenAccounts();\n    let tokenAccountAddress = this.scope.account.tokenAccounts.find(\n      ({ mint: accountTokenMint }) => accountTokenMint?.toBase58() === mint.toBase58(),\n    )?.publicKey;\n\n    const owner = this.scope.ownerPubKey;\n    const newTxInstructions: AddInstructionParam = {};\n\n    if (!tokenAccountAddress) {\n      const ataAddress = this.getAssociatedTokenAccount(mint, programId);\n      const instruction = await createAssociatedTokenAccountInstruction(owner, ataAddress, owner, mint, programId);\n      newTxInstructions.instructions = [instruction];\n      newTxInstructions.instructionTypes = [InstructionType.CreateATA];\n      tokenAccountAddress = ataAddress;\n    }\n    if (autoUnwrapWSOLToSOL && WSOLMint.toBase58() === mint.toBase58()) {\n      newTxInstructions.endInstructions = [\n        closeAccountInstruction({ owner, payer: owner, tokenAccount: tokenAccountAddress, programId }),\n      ];\n      newTxInstructions.endInstructionTypes = [InstructionType.CloseAccount];\n    }\n\n    return {\n      pubKey: tokenAccountAddress,\n      newInstructions: newTxInstructions,\n    };\n  }\n\n  // old _handleTokenAccount\n  public async handleTokenAccount(\n    params: HandleTokenAccountParams,\n  ): Promise<AddInstructionParam & { tokenAccount: PublicKey }> {\n    const {\n      side,\n      amount,\n      mint,\n      programId = TOKEN_PROGRAM_ID,\n      tokenAccount,\n      payer = this.scope.ownerPubKey,\n      bypassAssociatedCheck,\n      skipCloseAccount,\n      checkCreateATAOwner,\n    } = params;\n\n    const ata = this.getAssociatedTokenAccount(mint, programId);\n\n    if (new PublicKey(WSOLMint).equals(mint)) {\n      const txInstruction = await createWSolAccountInstructions({\n        connection: this.scope.connection,\n        owner: this.scope.ownerPubKey,\n        payer,\n        amount,\n        skipCloseAccount,\n      });\n      return { tokenAccount: txInstruction.addresses.newAccount, ...txInstruction };\n    } else if (!tokenAccount || (side === \"out\" && !ata.equals(tokenAccount) && !bypassAssociatedCheck)) {\n      const instructions: TransactionInstruction[] = [];\n      const _createATAIns = createAssociatedTokenAccountInstruction(\n        this.scope.ownerPubKey,\n        ata,\n        this.scope.ownerPubKey,\n        mint,\n        programId,\n      );\n\n      if (checkCreateATAOwner) {\n        const ataInfo = await this.scope.connection.getAccountInfo(ata);\n        if (ataInfo === null) {\n          instructions.push(_createATAIns);\n        } else if (\n          ataInfo.owner.equals(TOKEN_PROGRAM_ID) &&\n          AccountLayout.decode(ataInfo.data).mint.equals(mint) &&\n          AccountLayout.decode(ataInfo.data).owner.equals(this.scope.ownerPubKey)\n        ) {\n          /* empty */\n        } else {\n          throw Error(`create ata check error -> mint: ${mint.toString()}, ata: ${ata.toString()}`);\n        }\n      } else {\n        instructions.push(_createATAIns);\n      }\n\n      return {\n        tokenAccount: ata,\n        instructions,\n        instructionTypes: [InstructionType.CreateATA],\n      };\n    }\n\n    return { tokenAccount };\n  }\n\n  public async processTokenAccount(props: {\n    mint: PublicKey;\n    programId?: PublicKey;\n    amount?: BigNumberish;\n    useSOLBalance?: boolean;\n    handleTokenAccount?: boolean;\n    feePayer?: PublicKey;\n  }): Promise<Promise<AddInstructionParam & { tokenAccount?: PublicKey }>> {\n    const { mint, programId = TOKEN_PROGRAM_ID, amount, useSOLBalance, handleTokenAccount, feePayer } = props;\n    let tokenAccount: PublicKey | undefined;\n    const txBuilder = this.createTxBuilder(feePayer);\n\n    if (mint.equals(new PublicKey(WSOLMint)) && useSOLBalance) {\n      // mintA\n      const { tokenAccount: _tokenAccount, ...instructions } = await this.handleTokenAccount({\n        side: \"in\",\n        amount: amount || 0,\n        mint,\n        bypassAssociatedCheck: true,\n        programId,\n      });\n      tokenAccount = _tokenAccount;\n      txBuilder.addInstruction(instructions);\n    } else {\n      tokenAccount = await this.getCreatedTokenAccount({\n        mint,\n        associatedOnly: false,\n        programId,\n      });\n      if (!tokenAccount && handleTokenAccount) {\n        const { tokenAccount: _tokenAccount, ...instructions } = await this.scope.account.handleTokenAccount({\n          side: \"in\",\n          amount: 0,\n          mint,\n          bypassAssociatedCheck: true,\n          programId,\n        });\n        tokenAccount = _tokenAccount;\n        txBuilder.addInstruction(instructions);\n      }\n    }\n\n    return { tokenAccount, ...txBuilder.AllTxData };\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\n\nimport { createLogger, Logger } from \"../common/logger\";\nimport { TxBuilder } from \"../common/txTool/txTool\";\n\nimport { Sega } from \"./\";\n\nexport interface ModuleBaseProps {\n  scope: Sega;\n  moduleName: string;\n}\n\nconst joinMsg = (...args: (string | number | Record<string, any>)[]): string =>\n  args\n    .map((arg) => {\n      try {\n        return typeof arg === \"object\" ? JSON.stringify(arg) : arg;\n      } catch {\n        return arg;\n      }\n    })\n    .join(\", \");\nexport default class ModuleBase {\n  public scope: Sega;\n  private disabled = false;\n  protected logger: Logger;\n\n  constructor({ scope, moduleName }: ModuleBaseProps) {\n    this.scope = scope;\n    this.logger = createLogger(moduleName);\n  }\n\n  protected createTxBuilder(feePayer?: PublicKey): TxBuilder {\n    this.scope.checkOwner();\n    return new TxBuilder({\n      connection: this.scope.connection,\n      feePayer: feePayer || this.scope.ownerPubKey,\n      cluster: this.scope.cluster,\n      owner: this.scope.owner,\n      blockhashCommitment: this.scope.blockhashCommitment,\n      loopMultiTxStatus: this.scope.loopMultiTxStatus,\n      api: this.scope.api,\n      signAllTransactions: this.scope.signAllTransactions,\n    });\n  }\n\n  public logDebug(...args: (string | number | Record<string, any>)[]): void {\n    this.logger.debug(joinMsg(args));\n  }\n\n  public logInfo(...args: (string | number | Record<string, any>)[]): void {\n    this.logger.info(joinMsg(args));\n  }\n\n  public logAndCreateError(...args: (string | number | Record<string, any>)[]): void {\n    const message = joinMsg(args);\n    throw new Error(message);\n  }\n\n  public checkDisabled(): void {\n    if (this.disabled || !this.scope) this.logAndCreateError(\"module not working\");\n  }\n}\n","import { Commitment, Connection, PublicKey, Signer, SystemProgram, TransactionInstruction } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { BigNumberish, parseBigNumberish } from \"@/common\";\nimport {\n  createCloseAccountInstruction,\n  createInitializeAccountInstruction,\n  createTransferInstruction,\n  TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { AddInstructionParam } from \"@/common/txTool/txTool\";\nimport { InstructionType } from \"@/common/txTool/txType\";\nimport { TOKEN_WSOL } from \"../token/constant\";\nimport { generatePubKey } from \"./util\";\n\nimport { splAccountLayout } from \"./layout\";\n\nexport function initTokenAccountInstruction(params: {\n  mint: PublicKey;\n  tokenAccount: PublicKey;\n  owner: PublicKey;\n  programId?: PublicKey;\n}): TransactionInstruction {\n  const { mint, tokenAccount, owner, programId = TOKEN_PROGRAM_ID } = params;\n  return createInitializeAccountInstruction(tokenAccount, mint, owner, programId);\n}\n\nexport function closeAccountInstruction(params: {\n  tokenAccount: PublicKey;\n  payer: PublicKey;\n  multiSigners?: Signer[];\n  owner: PublicKey;\n  programId?: PublicKey;\n}): TransactionInstruction {\n  const { tokenAccount, payer, multiSigners = [], owner, programId = TOKEN_PROGRAM_ID } = params;\n  return createCloseAccountInstruction(tokenAccount, payer, owner, multiSigners, programId);\n}\n\ninterface CreateWSolTokenAccount {\n  connection: Connection;\n  payer: PublicKey;\n  owner: PublicKey;\n  amount: BigNumberish;\n  commitment?: Commitment;\n  skipCloseAccount?: boolean;\n}\n/**\n * WrappedNative account = wsol account\n */\nexport async function createWSolAccountInstructions(params: CreateWSolTokenAccount): Promise<\n  AddInstructionParam & {\n    addresses: { newAccount: PublicKey };\n  }\n> {\n  const { connection, amount, commitment, payer, owner, skipCloseAccount } = params;\n\n  const balanceNeeded = await connection.getMinimumBalanceForRentExemption(splAccountLayout.span, commitment);\n  const lamports = parseBigNumberish(amount).add(new BN(balanceNeeded));\n  const newAccount = generatePubKey({ fromPublicKey: payer, programId: TOKEN_PROGRAM_ID });\n\n  return {\n    addresses: { newAccount: newAccount.publicKey },\n    signers: [],\n    instructions: [\n      SystemProgram.createAccountWithSeed({\n        fromPubkey: payer,\n        basePubkey: payer,\n        seed: newAccount.seed,\n        newAccountPubkey: newAccount.publicKey,\n        lamports: lamports.toNumber(),\n        space: splAccountLayout.span,\n        programId: TOKEN_PROGRAM_ID,\n      }),\n      initTokenAccountInstruction({\n        mint: new PublicKey(TOKEN_WSOL.address),\n        tokenAccount: newAccount.publicKey,\n        owner,\n        programId: TOKEN_PROGRAM_ID,\n      }),\n    ],\n    instructionTypes: [InstructionType.CreateAccount, InstructionType.InitAccount],\n    endInstructionTypes: skipCloseAccount ? [] : [InstructionType.CloseAccount],\n    endInstructions: skipCloseAccount\n      ? []\n      : [\n          closeAccountInstruction({\n            tokenAccount: newAccount.publicKey,\n            payer,\n            owner,\n          }),\n        ],\n  };\n}\n\nexport function makeTransferInstruction({\n  source,\n  destination,\n  owner,\n  amount,\n  multiSigners = [],\n  tokenProgram = TOKEN_PROGRAM_ID,\n}: {\n  source: PublicKey;\n  destination: PublicKey;\n  owner: PublicKey;\n  amount: BigNumberish;\n  multiSigners?: Signer[];\n  tokenProgram?: PublicKey;\n}): TransactionInstruction {\n  return createTransferInstruction(source, destination, owner, BigInt(String(amount)), multiSigners, tokenProgram);\n}","import { AccountInfo, GetProgramAccountsResponse, Keypair, PublicKey, RpcResponseAndContext } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport { createLogger, getATAAddress } from \"../../common\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { splAccountLayout } from \"./layout\";\nimport { TokenAccount, TokenAccountRaw } from \"./types\";\n\nconst logger = createLogger(\"Sega_Util\");\n\nexport interface ParseTokenAccount {\n  owner: PublicKey;\n  solAccountResp?: AccountInfo<Buffer> | null;\n  tokenAccountResp: RpcResponseAndContext<GetProgramAccountsResponse>;\n}\n\nexport function parseTokenAccountResp({ owner, solAccountResp, tokenAccountResp }: ParseTokenAccount): {\n  tokenAccounts: TokenAccount[];\n  tokenAccountRawInfos: TokenAccountRaw[];\n} {\n  const tokenAccounts: TokenAccount[] = [];\n  const tokenAccountRawInfos: TokenAccountRaw[] = [];\n\n  for (const { pubkey, account } of tokenAccountResp.value) {\n    const accountInfo = splAccountLayout.decode(account.data);\n    const { mint, amount } = accountInfo;\n    tokenAccounts.push({\n      publicKey: pubkey,\n      mint,\n      amount,\n      isAssociated: getATAAddress(owner, mint, account.owner).publicKey.equals(pubkey),\n      isNative: false,\n      programId: account.owner,\n    });\n    // todo programId should get from api\n    tokenAccountRawInfos.push({ pubkey, accountInfo, programId: account.owner });\n  }\n\n  if (solAccountResp) {\n    tokenAccounts.push({\n      mint: PublicKey.default,\n      amount: new BN(String(solAccountResp.lamports)),\n      isNative: true,\n      programId: solAccountResp.owner,\n    });\n  }\n\n  return {\n    tokenAccounts,\n    tokenAccountRawInfos,\n  };\n}\n\nexport function generatePubKey({\n  fromPublicKey,\n  programId = TOKEN_PROGRAM_ID,\n  assignSeed,\n}: {\n  fromPublicKey: PublicKey;\n  programId: PublicKey;\n  assignSeed?: string;\n}): { publicKey: PublicKey; seed: string } {\n  const seed = assignSeed ? btoa(assignSeed).slice(0, 32) : Keypair.generate().publicKey.toBase58().slice(0, 32);\n  const publicKey = createWithSeed(fromPublicKey, seed, programId);\n  return { publicKey, seed };\n}\n\nfunction createWithSeed(fromPublicKey: PublicKey, seed: string, programId: PublicKey): PublicKey {\n  const buffer = Buffer.concat([fromPublicKey.toBuffer(), Buffer.from(seed), programId.toBuffer()]);\n  const publicKeyBytes = sha256(buffer);\n  return new PublicKey(publicKeyBytes);\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN, { isBN } from \"bn.js\";\n\nimport {\n  bits,\n  blob,\n  Blob,\n  Layout,\n  offset as _offset,\n  seq as _seq,\n  Structure as _Structure,\n  u32 as _u32,\n  u8 as _u8,\n  UInt,\n  union as _union,\n  Union as _Union,\n} from \"./buffer-layout\";\n\nexport * from \"./buffer-layout\";\nexport { blob };\n\nexport class BNLayout<P extends string = \"\"> extends Layout<BN, P> {\n  blob: Layout<Buffer>;\n  signed: boolean;\n\n  constructor(span: number, signed: boolean, property?: P) {\n    //@ts-expect-error type wrong for super()'s type different from extends, but it desn't matter\n    super(span, property);\n    this.blob = blob(span);\n    this.signed = signed;\n  }\n\n  /** @override */\n  decode(b: Buffer, offset = 0): BN {\n    const num = new BN(this.blob.decode(b, offset), 10, \"le\");\n    if (this.signed) {\n      return num.fromTwos(this.span * 8).clone();\n    }\n    return num;\n  }\n\n  /** @override */\n  encode(src: BN, b: Buffer, offset = 0): number {\n    if (typeof src === \"number\") src = new BN(src); // src will pass a number accidently in union\n    if (this.signed) {\n      src = src.toTwos(this.span * 8);\n    }\n    return this.blob.encode(src.toArrayLike(Buffer, \"le\", this.span), b, offset);\n  }\n}\n\nexport class WideBits<P extends string = \"\"> extends Layout<Record<string, boolean>, P> {\n  _lower: any;\n  _upper: any;\n  // TODO: unknown\n  constructor(property?: P) {\n    //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n    super(8, property);\n    this._lower = bits(_u32(), false);\n    this._upper = bits(_u32(), false);\n  }\n\n  addBoolean(property: string): void {\n    if (this._lower.fields.length < 32) {\n      this._lower.addBoolean(property);\n    } else {\n      this._upper.addBoolean(property);\n    }\n  }\n\n  decode(b: Buffer, offset = 0): Record<string, boolean> {\n    const lowerDecoded = this._lower.decode(b, offset);\n    const upperDecoded = this._upper.decode(b, offset + this._lower.span);\n    return { ...lowerDecoded, ...upperDecoded };\n  }\n\n  encode(src: any /* TEMP */, b: Buffer, offset = 0): any {\n    return this._lower.encode(src, b, offset) + this._upper.encode(src, b, offset + this._lower.span);\n  }\n}\n\nexport function u8<P extends string = \"\">(property?: P): UInt<number, P> {\n  return new UInt(1, property);\n}\n\nexport function u32<P extends string = \"\">(property?: P): UInt<number, P> {\n  return new UInt(4, property);\n}\n\nexport function u64<P extends string = \"\">(property?: P): BNLayout<P> {\n  return new BNLayout(8, false, property);\n}\n\nexport function u128<P extends string = \"\">(property?: P): BNLayout<P> {\n  return new BNLayout(16, false, property);\n}\n\nexport function i8<P extends string = \"\">(property?: P): BNLayout<P> {\n  return new BNLayout(1, true, property);\n}\n\nexport function i64<P extends string = \"\">(property?: P): BNLayout<P> {\n  return new BNLayout(8, true, property);\n}\n\nexport function i128<P extends string = \"\">(property?: P): BNLayout<P> {\n  return new BNLayout(16, true, property);\n}\n\nexport class WrappedLayout<T, U, P extends string = \"\"> extends Layout<U, P> {\n  layout: Layout<T>;\n  decoder: (data: T) => U;\n  encoder: (src: U) => T;\n\n  constructor(layout: Layout<T>, decoder: (data: T) => U, encoder: (src: U) => T, property?: P) {\n    //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n    super(layout.span, property);\n    this.layout = layout;\n    this.decoder = decoder;\n    this.encoder = encoder;\n  }\n\n  decode(b: Buffer, offset?: number): U {\n    return this.decoder(this.layout.decode(b, offset));\n  }\n\n  encode(src: U, b: Buffer, offset?: number): number {\n    return this.layout.encode(this.encoder(src), b, offset);\n  }\n\n  getSpan(b: Buffer, offset?: number): number {\n    return this.layout.getSpan(b, offset);\n  }\n}\n\nexport function publicKey<P extends string = \"\">(property?: P): Layout<PublicKey, P> {\n  return new WrappedLayout(\n    blob(32),\n    (b: Buffer) => new PublicKey(b),\n    (key: PublicKey) => key.toBuffer(),\n    property,\n  );\n}\n\nexport class OptionLayout<T, P> extends Layout<T | null, P> {\n  layout: Layout<T>;\n  discriminator: Layout<number>;\n\n  constructor(layout: Layout<T>, property?: P) {\n    //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n    super(-1, property);\n    this.layout = layout;\n    this.discriminator = _u8();\n  }\n\n  encode(src: T | null, b: Buffer, offset = 0): number {\n    if (src === null || src === undefined) {\n      return this.discriminator.encode(0, b, offset);\n    }\n    this.discriminator.encode(1, b, offset);\n    return this.layout.encode(src, b, offset + 1) + 1;\n  }\n\n  decode(b: Buffer, offset = 0): T | null {\n    const discriminator = this.discriminator.decode(b, offset);\n    if (discriminator === 0) {\n      return null;\n    } else if (discriminator === 1) {\n      return this.layout.decode(b, offset + 1);\n    }\n    throw new Error(\"Invalid option \" + this.property);\n  }\n\n  getSpan(b: Buffer, offset = 0): number {\n    const discriminator = this.discriminator.decode(b, offset);\n    if (discriminator === 0) {\n      return 1;\n    } else if (discriminator === 1) {\n      return this.layout.getSpan(b, offset + 1) + 1;\n    }\n    throw new Error(\"Invalid option \" + this.property);\n  }\n}\n\nexport function option<T, P extends string = \"\">(layout: Layout<T>, property?: P): Layout<T | null, P> {\n  return new OptionLayout<T, P>(layout, property);\n}\n\nexport function bool<P extends string = \"\">(property?: P): Layout<boolean, P> {\n  return new WrappedLayout(_u8(), decodeBool, encodeBool, property);\n}\n\nexport function decodeBool(value: number): boolean {\n  if (value === 0) {\n    return false;\n  } else if (value === 1) {\n    return true;\n  }\n  throw new Error(\"Invalid bool: \" + value);\n}\n\nexport function encodeBool(value: boolean): number {\n  return value ? 1 : 0;\n}\n\nexport function vec<T, P extends string = \"\">(elementLayout: Layout<T>, property?: P): Layout<T[], P> {\n  const length = _u32(\"length\");\n  const layout: Layout<{ values: T[] }> = struct([\n    length,\n    seq(elementLayout, _offset(length, -length.span), \"values\"),\n  ]) as any; // Something I don't know\n  return new WrappedLayout(\n    layout,\n    ({ values }) => values,\n    (values) => ({ values }),\n    property,\n  );\n}\n\nexport function tagged<T, P extends string = \"\">(tag: BN, layout: Layout<T>, property?: P): Layout<T, P> {\n  const wrappedLayout: Layout<{ tag: BN; data: T }> = struct([u64(\"tag\"), layout.replicate(\"data\")]) as any; // Something I don't know\n\n  function decodeTag({ tag: receivedTag, data }: { tag: BN; data: T }): T {\n    if (!receivedTag.eq(tag)) {\n      throw new Error(\"Invalid tag, expected: \" + tag.toString(\"hex\") + \", got: \" + receivedTag.toString(\"hex\"));\n    }\n    return data;\n  }\n\n  return new WrappedLayout(wrappedLayout, decodeTag, (data) => ({ tag, data }), property);\n}\n\nexport function vecU8<P extends string = \"\">(property?: P): Layout<Buffer, P> {\n  const length = _u32(\"length\");\n  const layout: Layout<{ data: Buffer }> = struct([length, blob(_offset(length, -length.span), \"data\")]) as any; // Something I don't know\n  return new WrappedLayout(\n    layout,\n    ({ data }) => data,\n    (data) => ({ data }),\n    property,\n  );\n}\n\nexport function str<P extends string = \"\">(property?: P): Layout<string, P> {\n  return new WrappedLayout(\n    vecU8(),\n    (data) => data.toString(\"utf-8\"),\n    (s) => Buffer.from(s, \"utf-8\"),\n    property,\n  );\n}\n\nexport interface EnumLayout<T, P extends string = \"\"> extends Layout<T, P> {\n  registry: Record<string, Layout<any>>;\n}\n\nexport function rustEnum<T, P extends string = \"\">(variants: Layout<any>[], property?: P): EnumLayout<T, P> {\n  const unionLayout = _union(_u8(), property);\n  variants.forEach((variant, index) => unionLayout.addVariant(index, variant, variant.property));\n  return unionLayout as any; // ?why use UnionLayout? This must be a fault\n}\n\nexport function array<T, P extends string = \"\">(\n  elementLayout: Layout<T>,\n  length: number,\n  property?: P,\n): Layout<T[], P> {\n  const layout = struct([seq(elementLayout, length, \"values\")]) as any as Layout<{ values: T[] }>; // Something I don't know\n  return new WrappedLayout(\n    layout,\n    ({ values }) => values,\n    (values) => ({ values }),\n    property,\n  );\n}\n\nexport class Structure<T, P, D extends { [key: string]: any; }> extends _Structure<T, P, D> {\n  /** @override */\n  decode(b: Buffer, offset?: number): D {\n    return super.decode(b, offset);\n  }\n}\n\nexport function struct<T, P extends string = \"\">(\n  fields: T,\n  property?: P,\n  decodePrefixes?: boolean,\n): T extends Layout<infer Value, infer Property>[]\n  ? Structure<\n    Value,\n    P,\n    {\n      [K in Exclude<Extract<Property, string>, \"\">]: Extract<T[number], Layout<any, K>> extends Layout<infer V, any>\n      ? V\n      : any;\n    }\n  >\n  : any {\n  //@ts-expect-error this type is not quite satisfied the define, but, never no need to worry about.\n  return new Structure(fields, property, decodePrefixes);\n}\n\nexport type GetLayoutSchemaFromStructure<T extends Structure<any, any, any>> = T extends Structure<any, any, infer S>\n  ? S\n  : any;\nexport type GetStructureFromLayoutSchema<S extends { [key: string]: any; }> = Structure<any, any, S>;\n\nexport class Union<Schema extends { [key: string]: any; }> extends _Union<Schema> {\n  encodeInstruction(instruction: any): Buffer {\n    const instructionMaxSpan = Math.max(...Object.values(this.registry).map((r) => r.span));\n    const b = Buffer.alloc(instructionMaxSpan);\n    return b.slice(0, this.encode(instruction, b));\n  }\n\n  decodeInstruction(instruction: any): Partial<Schema> {\n    return this.decode(instruction);\n  }\n}\nexport function union<UnionSchema extends { [key: string]: any } = any>(\n  discr: any,\n  defaultLayout?: any,\n  property?: string,\n): Union<UnionSchema> {\n  return new Union(discr, defaultLayout, property);\n}\n\nclass Zeros extends Blob {\n  decode(b: Buffer, offset: number): Buffer {\n    const slice = super.decode(b, offset);\n    if (!slice.every((v) => v === 0)) {\n      throw new Error(\"nonzero padding bytes\");\n    }\n    return slice;\n  }\n}\n\nexport function zeros(length: number): Zeros {\n  return new Zeros(length);\n}\n\nexport function seq<T, P extends string = \"\", AnotherP extends string = \"\">(\n  elementLayout: Layout<T, P>,\n  count: number | BN | Layout<BN | number, P>,\n  property?: AnotherP,\n): Layout<T[], AnotherP> {\n  let parsedCount: number;\n  const superCount =\n    typeof count === \"number\"\n      ? count\n      : isBN(count)\n        ? count.toNumber()\n        : new Proxy(count as unknown as Layout<number> /* pretend to be Layout<number> */, {\n          get(target, property): any {\n            if (!parsedCount) {\n              // get count in targetLayout. note that count may be BN\n              const countProperty = Reflect.get(target, \"count\");\n\n              // let targetLayout's  property:count be a number\n              parsedCount = isBN(countProperty) ? countProperty.toNumber() : countProperty;\n\n              // record the count\n              Reflect.set(target, \"count\", parsedCount);\n            }\n            return Reflect.get(target, property);\n          },\n          set(target, property, value): any {\n            if (property === \"count\") {\n              parsedCount = value;\n            }\n            return Reflect.set(target, property, value);\n          },\n        });\n\n  // @ts-expect-error force type\n  return _seq(elementLayout, superCount, property);\n}\n","import {\n  bits as _bits,\n  BitStructure as _BitStructure,\n  blob as _blob,\n  Blob as _Blob,\n  cstr as _cstr,\n  f32 as _f32,\n  f32be as _f32be,\n  f64 as _f64,\n  f64be as _f64be,\n  greedy as _greedy,\n  Layout as _Layout,\n  ns64 as _ns64,\n  ns64be as _ns64be,\n  nu64 as _nu64,\n  nu64be as _nu64be,\n  offset as _offset,\n  s16 as _s16,\n  s16be as _s16be,\n  s24 as _s24,\n  s24be as _s24be,\n  s32 as _s32,\n  s32be as _s32be,\n  s40 as _s40,\n  s40be as _s40be,\n  s48 as _s48,\n  s48be as _s48be,\n  s8 as _s8,\n  seq as _seq,\n  struct as _struct,\n  Structure as _Structure,\n  u16 as _u16,\n  u16be as _u16be,\n  u24 as _u24,\n  u24be as _u24be,\n  u32 as _u32,\n  u32be as _u32be,\n  u40 as _u40,\n  u40be as _u40be,\n  u48 as _u48,\n  u48be as _u48be,\n  u8 as _u8,\n  UInt as _UInt,\n  union as _union,\n  Union as _Union,\n  unionLayoutDiscriminator as _unionLayoutDiscriminator,\n  utf8 as _utf8,\n} from \"@solana/buffer-layout\";\n\n//#region ------------------- Layout -------------------\nexport interface Layout<T = any, P = \"\"> {\n  span: number;\n  property?: P;\n  decode(b: Buffer, offset?: number): T;\n  encode(src: T, b: Buffer, offset?: number): number;\n  getSpan(b: Buffer, offset?: number): number;\n  replicate<AP extends string>(name: AP): Layout<T, AP>;\n}\nexport interface LayoutConstructor {\n  new <T, P>(): Layout<T, P>; // for class extends syntex\n  new <T, P>(span?: T, property?: P): Layout<T, P>;\n  readonly prototype: Layout;\n}\nexport const Layout = _Layout as unknown as LayoutConstructor;\n//#endregion\n\n//#region ------------------- Structure -------------------\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface Structure<T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>\n  extends Layout<DecodeSchema, P> {\n  span: number;\n  decode(b: Buffer, offset?: number): DecodeSchema;\n  layoutFor<AP extends string>(property: AP): Layout<DecodeSchema[AP]>;\n  offsetOf<AP extends string>(property: AP): number;\n}\ninterface StructureConstructor {\n  new <T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>(): Structure<T, P, DecodeSchema>;\n  new <T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>(\n    fields: T,\n    property?: P,\n    decodePrefixes?: boolean,\n  ): Structure<T, P, DecodeSchema>;\n}\nexport const Structure = _Structure as unknown as StructureConstructor;\n//#endregion\n\n//#region ------------------- Union -------------------\nexport interface Union<UnionSchema extends { [key: string]: any } = any> extends Layout {\n  registry: object;\n  decode(b: Buffer, offset?: number): Partial<UnionSchema>;\n  addVariant(\n    variant: number,\n    layout: Structure<any, any, Partial<UnionSchema>> | Layout<any, keyof UnionSchema>,\n    property?: string,\n  ): any /* TEMP: code in Layout.js 1809 */;\n}\ninterface UnionConstructor {\n  new <UnionSchema extends { [key: string]: any } = any>(): Union<UnionSchema>;\n  new <UnionSchema extends { [key: string]: any } = any>(\n    discr: Layout<any, any>,\n    defaultLayout: Layout<any, any>,\n    property?: string,\n  ): Union<UnionSchema>;\n}\nexport const Union = _Union as unknown as UnionConstructor;\n//#endregion\n\n//#region ------------------- BitStructure -------------------\nexport type BitStructure<T = unknown /* TEMP */, P = \"\"> = Layout<T, P>;\ninterface BitStructureConstructor {\n  new (...params: any[]): BitStructure;\n}\nexport const BitStructure = _BitStructure as BitStructureConstructor;\n//#endregion\n\n//#region ------------------- UInt -------------------\nexport type UInt<T = any, P = \"\"> = Layout<T, P>;\ninterface UIntConstructor {\n  new <T, P>(span?: T, property?: P): UInt<T, P>;\n}\nexport const UInt = _UInt as UIntConstructor;\n//#endregion\n\n//#region ------------------- Blob -------------------\nexport type Blob<P extends string = \"\"> = Layout<Buffer, P>;\ninterface BlobConstructor {\n  new (...params: ConstructorParameters<LayoutConstructor>): Blob;\n}\nexport const Blob = _Blob as unknown as BlobConstructor;\n//#endregion\n\nexport const greedy = _greedy as <P extends string = \"\">(elementSpan?: number, property?: P) => Layout<number, P>;\nexport const u8 = _u8 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u16 = _u16 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u24 = _u24 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u32 = _u32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u40 = _u40 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u48 = _u48 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const nu64 = _nu64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u16be = _u16be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u24be = _u24be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u32be = _u32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u40be = _u40be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u48be = _u48be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const nu64be = _nu64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s8 = _s8 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s16 = _s16 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s24 = _s24 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s32 = _s32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s40 = _s40 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s48 = _s48 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const ns64 = _ns64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s16be = _s16be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s24be = _s24be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s32be = _s32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s40be = _s40be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s48be = _s48be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const ns64be = _ns64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f32 = _f32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f32be = _f32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f64 = _f64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f64be = _f64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\n\nexport const struct = _struct as <T, P extends string = \"\">(\n  fields: T,\n  property?: P,\n  decodePrefixes?: boolean,\n) => T extends Layout<infer Value, infer Property>[]\n  ? Structure<\n      Value,\n      P,\n      {\n        [K in Exclude<Extract<Property, string>, \"\">]: Extract<T[number], Layout<any, K>> extends Layout<infer V, any>\n          ? V\n          : any;\n      }\n    >\n  : any;\n\nexport const seq = _seq as unknown as <T, P>(\n  elementLayout: Layout<T, string>,\n  count: number | Layout<number, string>,\n  property?: P,\n) => Layout<T[]>;\nexport const union = _union as <UnionSchema extends { [key: string]: any } = any>(\n  discr: Layout<any, any>,\n  defaultLayout?: any,\n  property?: string,\n) => Union<UnionSchema>;\nexport const unionLayoutDiscriminator = _unionLayoutDiscriminator as <P extends string = \"\">(\n  layout: Layout<any, P>,\n  property?: P,\n) => any;\nexport const blob = _blob as unknown as <P extends string = \"\">(\n  length: number | Layout<number, P>,\n  property?: P,\n) => Blob<P>;\nexport const cstr = _cstr as <P extends string = \"\">(property?: P) => Layout<string, P>;\nexport const utf8 = _utf8 as <P extends string = \"\">(maxSpan: number, property?: P) => Layout<string, P>;\nexport const bits = _bits as unknown as <T, P extends string = \"\">(\n  word: Layout<T>,\n  msb?: boolean,\n  property?: P,\n) => BitStructure<T, P>; // TODO: not quite sure\nexport const offset = _offset as unknown as <T, P extends string = \"\">(\n  layout: Layout<T, P>,\n  offset?: number,\n  property?: P,\n) => Layout<T, P>;\n\nexport type GetStructureSchema<T extends Structure> = T extends Structure<any, any, infer S> ? S : unknown;\n","import { publicKey, struct, u32, u64, u8 } from \"../../marshmallow\";\n\nexport const splAccountLayout = struct([\n  publicKey(\"mint\"),\n  publicKey(\"owner\"),\n  u64(\"amount\"),\n  u32(\"delegateOption\"),\n  publicKey(\"delegate\"),\n  u8(\"state\"),\n  u32(\"isNativeOption\"),\n  u64(\"isNative\"),\n  u64(\"delegatedAmount\"),\n  u32(\"closeAuthorityOption\"),\n  publicKey(\"closeAuthority\"),\n]);\n","import { PublicKey } from \"@solana/web3.js\";\nimport { ApiV3PoolInfoStandardItemCpmm, CpmmKeys } from \"../../api/type\";\nimport { AccountLayout, NATIVE_MINT, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { BN_ZERO } from \"@/common/bignumber\";\nimport { getATAAddress } from \"@/common/pda\";\nimport { WSOLMint } from \"@/common/pubKey\";\nimport { MakeTxData } from \"@/common/txTool/txTool\";\nimport { InstructionType, TxVersion } from \"@/common/txTool/txType\";\nimport { Percent } from \"../../module\";\nimport { CurveCalculator } from \"./curve/calculator\";\n\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport {\n  fetchMultipleMintInfos,\n  getMultipleAccountsInfoWithCustomFlags,\n  getTransferAmountFeeV2,\n} from \"@/common\";\nimport { GetTransferAmountFee, ReturnTypeFetchMultipleMintInfos } from \"@/sega/type\";\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport { toApiV3Token, toFeeConfig } from \"../token\";\nimport {\n  makeCreateCpmmPoolInInstruction,\n  makeDepositCpmmInInstruction,\n  makeSwapCpmmBaseInInstruction,\n  makeSwapCpmmBaseOutInstruction,\n  makeWithdrawCpmmInInstruction,\n  makeCpmmLockInstruction,\n  collectCpFeeInstruction,\n} from \"./instruction\";\nimport { CpmmConfigInfoLayout, CpmmPoolInfoLayout } from \"./layout\";\nimport { getCreatePoolKeys, getPdaObservationId, getPdaPoolAuthority } from \"./pda\";\nimport {\n  AddCpmmLiquidityParams,\n  ComputePairAmountParams,\n  CpmmComputeData,\n  CpmmLockExtInfo,\n  CpmmRpcData,\n  CpmmSwapParams,\n  CreateCpmmPoolAddress,\n  CreateCpmmPoolParam,\n  LockCpmmLpParams,\n  HarvestLockCpmmLpParams,\n  WithdrawCpmmLiquidityParams,\n} from \"./type\";\nimport { getCpLockPda } from \"./pda\";\n\nexport default class CpmmModule extends ModuleBase {\n  constructor(params: ModuleBaseProps) {\n    super(params);\n  }\n\n  public async load(): Promise<void> {\n    this.checkDisabled();\n  }\n\n  public async getCpmmPoolKeys(poolId: string): Promise<CpmmKeys> {\n    return ((await this.scope.api.fetchPoolKeysById({ idList: [poolId] })) as CpmmKeys[])[0];\n  }\n\n  public async getRpcPoolInfo(poolId: string, fetchConfigInfo?: boolean): Promise<CpmmRpcData> {\n    return (await this.getRpcPoolInfos([poolId], fetchConfigInfo))[poolId];\n  }\n\n  public async getRpcPoolInfos(\n    poolIds: string[],\n    fetchConfigInfo?: boolean,\n  ): Promise<{\n    [poolId: string]: CpmmRpcData;\n  }> {\n    const accounts = await getMultipleAccountsInfoWithCustomFlags(\n      this.scope.connection,\n      poolIds.map((i) => ({ pubkey: new PublicKey(i) })),\n    );\n    const poolInfos: { [poolId: string]: ReturnType<typeof CpmmPoolInfoLayout.decode> & { programId: PublicKey } } = {};\n\n    const needFetchConfigId = new Set<string>();\n    const needFetchVaults: PublicKey[] = [];\n\n    for (let i = 0; i < poolIds.length; i++) {\n      const item = accounts[i];\n      if (item.accountInfo === null) throw Error(\"fetch pool info error: \" + String(poolIds[i]));\n      const rpc = CpmmPoolInfoLayout.decode(item.accountInfo.data);\n      poolInfos[String(poolIds[i])] = {\n        ...rpc,\n        programId: item.accountInfo.owner,\n      };\n      needFetchConfigId.add(String(rpc.configId));\n\n      needFetchVaults.push(rpc.vaultA, rpc.vaultB);\n    }\n\n    const configInfo: { [configId: string]: ReturnType<typeof CpmmConfigInfoLayout.decode> } = {};\n\n    if (fetchConfigInfo) {\n      const configIds = [...needFetchConfigId];\n      const configState = await getMultipleAccountsInfoWithCustomFlags(\n        this.scope.connection,\n        configIds.map((i) => ({ pubkey: new PublicKey(i) })),\n      );\n\n      for (let i = 0; i < configIds.length; i++) {\n        const configItemInfo = configState[i].accountInfo;\n        if (configItemInfo === null) throw Error(\"fetch pool config error: \" + configIds[i]);\n        configInfo[configIds[i]] = CpmmConfigInfoLayout.decode(configItemInfo.data);\n      }\n    }\n\n    const vaultInfo: { [vaultId: string]: BN } = {};\n\n    const vaultAccountInfo = await getMultipleAccountsInfoWithCustomFlags(\n      this.scope.connection,\n      needFetchVaults.map((i) => ({ pubkey: new PublicKey(i) })),\n    );\n\n    for (let i = 0; i < needFetchVaults.length; i++) {\n      const vaultItemInfo = vaultAccountInfo[i].accountInfo;\n      if (vaultItemInfo === null) throw Error(\"fetch vault info error: \" + needFetchVaults[i]);\n\n      vaultInfo[String(needFetchVaults[i])] = new BN(AccountLayout.decode(vaultItemInfo.data).amount.toString());\n    }\n\n    const returnData: { [poolId: string]: CpmmRpcData } = {};\n\n    for (const [id, info] of Object.entries(poolInfos)) {\n      const baseReserve = vaultInfo[info.vaultA.toString()].sub(info.protocolFeesMintA).sub(info.fundFeesMintA);\n      const quoteReserve = vaultInfo[info.vaultB.toString()].sub(info.protocolFeesMintB).sub(info.fundFeesMintB);\n      returnData[id] = {\n        ...info,\n        baseReserve,\n        quoteReserve,\n        vaultAAmount: vaultInfo[info.vaultA.toString()],\n        vaultBAmount: vaultInfo[info.vaultB.toString()],\n        configInfo: configInfo[info.configId.toString()],\n        poolPrice: new Decimal(quoteReserve.toString())\n          .div(new Decimal(10).pow(info.mintDecimalB))\n          .div(new Decimal(baseReserve.toString()).div(new Decimal(10).pow(info.mintDecimalA))),\n      };\n    }\n\n    return returnData;\n  }\n\n  public toComputePoolInfos({\n    pools,\n    mintInfos,\n  }: {\n    pools: Record<string, CpmmRpcData>;\n    mintInfos: ReturnTypeFetchMultipleMintInfos;\n  }): Record<string, CpmmComputeData> {\n    return Object.keys(pools).reduce((acc, cur) => {\n      const pool = pools[cur];\n      const [mintA, mintB] = [pool.mintA.toBase58(), pool.mintB.toBase58()];\n\n      return {\n        ...acc,\n        [cur]: {\n          ...pool,\n          id: new PublicKey(cur),\n          configInfo: pool.configInfo!,\n          version: 7 as const,\n          authority: getPdaPoolAuthority(pool.programId).publicKey,\n          mintA: toApiV3Token({\n            address: mintA,\n            decimals: pool.mintDecimalA,\n            programId: pool.mintProgramA.toBase58(),\n            extensions: {\n              feeConfig: mintInfos[mintA]?.feeConfig ? toFeeConfig(mintInfos[mintA]?.feeConfig) : undefined,\n            },\n          }),\n          mintB: toApiV3Token({\n            address: mintB,\n            decimals: pool.mintDecimalB,\n            programId: pool.mintProgramB.toBase58(),\n            extensions: {\n              feeConfig: mintInfos[mintB]?.feeConfig ? toFeeConfig(mintInfos[mintB]?.feeConfig) : undefined,\n            },\n          }),\n        },\n      };\n    }, {} as Record<string, CpmmComputeData>);\n  }\n\n  public async getPoolInfoFromRpc(poolId: string): Promise<{\n    poolInfo: ApiV3PoolInfoStandardItemCpmm;\n    poolKeys: CpmmKeys;\n    rpcData: CpmmRpcData;\n  }> {\n    const rpcData = await this.getRpcPoolInfo(poolId, true);\n    const mintInfos = await fetchMultipleMintInfos({\n      connection: this.scope.connection,\n      mints: [rpcData.mintA, rpcData.mintB],\n    });\n\n    const mintA = toApiV3Token({\n      address: rpcData.mintA.toBase58(),\n      decimals: rpcData.mintDecimalA,\n      programId: rpcData.mintProgramA.toBase58(),\n      extensions: {\n        feeConfig: mintInfos[rpcData.mintA.toBase58()].feeConfig\n          ? toFeeConfig(mintInfos[rpcData.mintA.toBase58()].feeConfig)\n          : undefined,\n      },\n    });\n    const mintB = toApiV3Token({\n      address: rpcData.mintB.toBase58(),\n      decimals: rpcData.mintDecimalB,\n      programId: rpcData.mintProgramB.toBase58(),\n      extensions: {\n        feeConfig: mintInfos[rpcData.mintB.toBase58()].feeConfig\n          ? toFeeConfig(mintInfos[rpcData.mintB.toBase58()].feeConfig)\n          : undefined,\n      },\n    });\n\n    const lpMint = toApiV3Token({\n      address: rpcData.mintLp.toBase58(),\n      decimals: rpcData.lpDecimals,\n      programId: TOKEN_PROGRAM_ID.toBase58(),\n    });\n\n    const configInfo = {\n      id: rpcData.configId.toBase58(),\n      index: rpcData.configInfo!.index,\n      protocolFeeRate: rpcData.configInfo!.protocolFeeRate.toNumber(),\n      tradeFeeRate: rpcData.configInfo!.tradeFeeRate.toNumber(),\n      fundFeeRate: rpcData.configInfo!.fundFeeRate.toNumber(),\n      createPoolFee: rpcData.configInfo!.createPoolFee.toString(),\n    };\n\n    const mockRewardData = {\n      volume: 0,\n      volumeQuote: 0,\n      volumeFee: 0,\n      apr: 0,\n      feeApr: 0,\n      priceMin: 0,\n      priceMax: 0,\n      rewardApr: [],\n    };\n\n    return {\n      poolInfo: {\n        programId: rpcData.programId.toBase58(),\n        id: poolId,\n        type: \"Standard\",\n        lpMint,\n        lpPrice: 0,\n        lpAmount: rpcData.lpAmount.toNumber(),\n        config: configInfo,\n        mintA,\n        mintB,\n        rewardDefaultPoolInfos: \"Ecosystem\",\n        price: rpcData.poolPrice.toNumber(),\n        mintAmountA: new Decimal(rpcData.vaultAAmount.toString()).div(10 ** mintA.decimals).toNumber(),\n        mintAmountB: new Decimal(rpcData.vaultBAmount.toString()).div(10 ** mintB.decimals).toNumber(),\n        feeRate: rpcData.configInfo!.tradeFeeRate.toNumber(),\n        openTime: rpcData.openTime.toString(),\n        tvl: 0,\n        burnPercent: 0,\n\n        day: mockRewardData,\n        week: mockRewardData,\n        month: mockRewardData,\n        pooltype: [],\n\n        farmUpcomingCount: 0,\n        farmOngoingCount: 0,\n        farmFinishedCount: 0,\n      },\n      poolKeys: {\n        programId: rpcData.programId.toBase58(),\n        id: poolId,\n        mintA,\n        mintB,\n        openTime: rpcData.openTime.toString(),\n        vault: { A: rpcData.vaultA.toBase58(), B: rpcData.vaultB.toBase58() },\n        authority: getPdaPoolAuthority(rpcData.programId).publicKey.toBase58(),\n        mintLp: lpMint,\n        config: configInfo,\n        observationId: getPdaObservationId(rpcData.programId, new PublicKey(poolId)).publicKey.toBase58(),\n      },\n      rpcData,\n    };\n  }\n\n  public async createPool<T extends TxVersion>({\n    poolId,\n    programId,\n    poolFeeAccount,\n    startTime,\n    ownerInfo,\n    associatedOnly = false,\n    checkCreateATAOwner = false,\n    txVersion,\n    feeConfig,\n    computeBudgetConfig,\n    txTipConfig,\n    feePayer,\n    ...params\n  }: CreateCpmmPoolParam<T>): Promise<MakeTxData<T, { address: CreateCpmmPoolAddress }>> {\n    const payer = ownerInfo.feePayer || this.scope.owner?.publicKey;\n    const isFront = new BN(new PublicKey(params.mintA.address).toBuffer()).lte(\n      new BN(new PublicKey(params.mintB.address).toBuffer()),\n    );\n\n    const [mintA, mintB] = isFront ? [params.mintA, params.mintB] : [params.mintB, params.mintA];\n    const [mintAAmount, mintBAmount] = isFront\n      ? [params.mintAAmount, params.mintBAmount]\n      : [params.mintBAmount, params.mintAAmount];\n\n    const mintAUseSOLBalance = ownerInfo.useSOLBalance && mintA.address === NATIVE_MINT.toBase58();\n    const mintBUseSOLBalance = ownerInfo.useSOLBalance && mintB.address === NATIVE_MINT.toBase58();\n    const [mintAPubkey, mintBPubkey] = [new PublicKey(mintA.address), new PublicKey(mintB.address)];\n    const txBuilder = this.createTxBuilder(feePayer);\n\n    const { account: userVaultA, instructionParams: userVaultAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: mintAPubkey,\n        tokenProgram: mintA.programId,\n        owner: this.scope.ownerPubKey,\n        createInfo: mintAUseSOLBalance\n          ? {\n            payer: payer!,\n            amount: mintAAmount,\n          }\n          : undefined,\n        notUseTokenAccount: mintAUseSOLBalance,\n        skipCloseAccount: !mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    txBuilder.addInstruction(userVaultAInstruction || {});\n    const { account: userVaultB, instructionParams: userVaultBInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: new PublicKey(mintB.address),\n        tokenProgram: mintB.programId,\n        owner: this.scope.ownerPubKey,\n        createInfo: mintBUseSOLBalance\n          ? {\n            payer: payer!,\n            amount: mintBAmount,\n          }\n          : undefined,\n\n        notUseTokenAccount: mintBUseSOLBalance,\n        skipCloseAccount: !mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    txBuilder.addInstruction(userVaultBInstruction || {});\n\n    if (userVaultA === undefined || userVaultB === undefined) throw Error(\"you don't has some token account\");\n\n    const poolKeys = getCreatePoolKeys({\n      poolId,\n      programId,\n      configId: new PublicKey(feeConfig.id),\n      mintA: mintAPubkey,\n      mintB: mintBPubkey,\n    });\n\n    txBuilder.addInstruction({\n      instructions: [\n        makeCreateCpmmPoolInInstruction(\n          programId,\n          this.scope.ownerPubKey,\n          new PublicKey(feeConfig.id),\n          poolKeys.authority,\n          poolKeys.poolId,\n          mintAPubkey,\n          mintBPubkey,\n          poolKeys.lpMint,\n          userVaultA,\n          userVaultB,\n          getATAAddress(this.scope.ownerPubKey, poolKeys.lpMint).publicKey,\n          poolKeys.vaultA,\n          poolKeys.vaultB,\n          poolFeeAccount,\n          new PublicKey(mintA.programId ?? TOKEN_PROGRAM_ID),\n          new PublicKey(mintB.programId ?? TOKEN_PROGRAM_ID),\n          poolKeys.observationId,\n          mintAAmount,\n          mintBAmount,\n          startTime,\n        ),\n      ],\n      instructionTypes: [InstructionType.CpmmCreatePool],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild({\n      txVersion,\n      extInfo: {\n        address: { ...poolKeys, mintA, mintB, programId, poolFeeAccount, feeConfig },\n      },\n    }) as Promise<MakeTxData<T, { address: CreateCpmmPoolAddress }>>;\n  }\n\n  public async addLiquidity<T extends TxVersion>(params: AddCpmmLiquidityParams<T>): Promise<MakeTxData<T>> {\n    const {\n      poolInfo,\n      poolKeys: propPoolKeys,\n      inputAmount,\n      baseIn,\n      slippage,\n      computeResult,\n      computeBudgetConfig,\n      txTipConfig,\n      config,\n      txVersion,\n      feePayer,\n    } = params;\n\n    if (this.scope.availability.addStandardPosition === false)\n      this.logAndCreateError(\"add liquidity feature disabled in your region\");\n\n    if (inputAmount.isZero())\n      this.logAndCreateError(\"amounts must greater than zero\", \"amountInA\", {\n        amountInA: inputAmount.toString(),\n      });\n    const { account } = this.scope;\n    const { bypassAssociatedCheck, checkCreateATAOwner } = {\n      // default\n      ...{ bypassAssociatedCheck: false, checkCreateATAOwner: false },\n      // custom\n      ...config,\n    };\n    const rpcPoolData = computeResult ? undefined : await this.getRpcPoolInfo(poolInfo.id);\n\n    const {\n      liquidity,\n      inputAmountFee,\n      anotherAmount: _anotherAmount,\n    } = computeResult ||\n      this.computePairAmount({\n        poolInfo: {\n          ...poolInfo,\n          lpAmount: new Decimal(rpcPoolData!.lpAmount.toString()).div(10 ** poolInfo.lpMint.decimals).toNumber(),\n        },\n        baseReserve: rpcPoolData!.baseReserve,\n        quoteReserve: rpcPoolData!.quoteReserve,\n        slippage: new Percent(0),\n        baseIn,\n        epochInfo: await this.scope.fetchEpochInfo(),\n        amount: new Decimal(inputAmount.toString()).div(\n          10 ** (baseIn ? poolInfo.mintA.decimals : poolInfo.mintB.decimals),\n        ),\n      });\n\n    const anotherAmount = _anotherAmount.amount;\n    const mintAUseSOLBalance = poolInfo.mintA.address === NATIVE_MINT.toString();\n    const mintBUseSOLBalance = poolInfo.mintB.address === NATIVE_MINT.toString();\n\n    const txBuilder = this.createTxBuilder(feePayer);\n    const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n\n    const { account: tokenAccountA, instructionParams: _tokenAccountAInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintA.programId,\n        mint: new PublicKey(poolInfo.mintA.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintAUseSOLBalance || (baseIn ? inputAmount : anotherAmount).isZero()\n            ? {\n              payer: this.scope.ownerPubKey,\n              amount: baseIn ? inputAmount : anotherAmount,\n            }\n            : undefined,\n        skipCloseAccount: !mintAUseSOLBalance,\n        notUseTokenAccount: mintAUseSOLBalance,\n        associatedOnly: false,\n        checkCreateATAOwner,\n      });\n\n    txBuilder.addInstruction(_tokenAccountAInstruction || {});\n\n    const { account: tokenAccountB, instructionParams: _tokenAccountBInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintB.programId,\n        mint: new PublicKey(poolInfo.mintB.address),\n        owner: this.scope.ownerPubKey,\n\n        createInfo:\n          mintBUseSOLBalance || (baseIn ? anotherAmount : inputAmount).isZero()\n            ? {\n              payer: this.scope.ownerPubKey,\n              amount: baseIn ? anotherAmount : inputAmount,\n            }\n            : undefined,\n        skipCloseAccount: !mintBUseSOLBalance,\n        notUseTokenAccount: mintBUseSOLBalance,\n        associatedOnly: false,\n        checkCreateATAOwner,\n      });\n\n    txBuilder.addInstruction(_tokenAccountBInstruction || {});\n\n    if (!tokenAccountA && !tokenAccountB)\n      this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", account.tokenAccounts);\n    const lpTokenAccount = await account.getCreatedTokenAccount({\n      mint: new PublicKey(poolInfo.lpMint.address),\n    });\n    const { tokenAccount: _lpTokenAccount, ...lpInstruction } = await account.handleTokenAccount({\n      side: \"out\",\n      amount: 0,\n      mint: new PublicKey(poolInfo.lpMint.address),\n      tokenAccount: lpTokenAccount,\n      bypassAssociatedCheck,\n      checkCreateATAOwner,\n    });\n    txBuilder.addInstruction(lpInstruction);\n    const poolKeys = propPoolKeys ?? (await this.getCpmmPoolKeys(poolInfo.id));\n    const _slippage = new Percent(new BN(1)).sub(slippage);\n\n    txBuilder.addInstruction({\n      instructions: [\n        makeDepositCpmmInInstruction(\n          new PublicKey(poolInfo.programId),\n          this.scope.ownerPubKey,\n          new PublicKey(poolKeys.authority),\n          new PublicKey(poolInfo.id),\n          _lpTokenAccount!,\n          tokenAccountA!,\n          tokenAccountB!,\n          new PublicKey(poolKeys.vault.A),\n          new PublicKey(poolKeys.vault.B),\n          mintA,\n          mintB,\n          new PublicKey(poolInfo.lpMint.address),\n\n          computeResult ? computeResult?.liquidity : _slippage.mul(liquidity).quotient,\n          baseIn ? inputAmountFee.amount : anotherAmount,\n          baseIn ? anotherAmount : inputAmountFee.amount,\n        ),\n      ],\n      instructionTypes: [InstructionType.CpmmAddLiquidity],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    });\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async withdrawLiquidity<T extends TxVersion>(params: WithdrawCpmmLiquidityParams<T>): Promise<MakeTxData<T>> {\n    const {\n      poolInfo,\n      poolKeys: propPoolKeys,\n      lpAmount,\n      slippage,\n      computeBudgetConfig,\n      txTipConfig,\n      txVersion,\n      feePayer,\n      closeWsol = true,\n    } = params;\n\n    if (this.scope.availability.addStandardPosition === false)\n      this.logAndCreateError(\"add liquidity feature disabled in your region\");\n\n    const _slippage = new Percent(new BN(1)).sub(slippage);\n\n    const rpcPoolData = await this.getRpcPoolInfo(poolInfo.id);\n    const [amountMintA, amountMintB] = [\n      _slippage.mul(lpAmount.mul(rpcPoolData.baseReserve).div(rpcPoolData.lpAmount)).quotient,\n      _slippage.mul(lpAmount.mul(rpcPoolData.quoteReserve).div(rpcPoolData.lpAmount)).quotient,\n    ];\n\n    const epochInfo = await this.scope.fetchEpochInfo();\n    const [mintAAmountFee, mintBAmountFee] = [\n      getTransferAmountFeeV2(amountMintA, poolInfo.mintA.extensions.feeConfig, epochInfo, false),\n      getTransferAmountFeeV2(amountMintB, poolInfo.mintB.extensions.feeConfig, epochInfo, false),\n    ];\n\n    const { account } = this.scope;\n    const txBuilder = this.createTxBuilder(feePayer);\n    const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n\n    const mintAUseSOLBalance = mintA.equals(WSOLMint);\n    const mintBUseSOLBalance = mintB.equals(WSOLMint);\n\n    let tokenAccountA: PublicKey | undefined = undefined;\n    let tokenAccountB: PublicKey | undefined = undefined;\n    const { account: _ownerTokenAccountA, instructionParams: accountAInstructions } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintA.programId,\n        mint: new PublicKey(poolInfo.mintA.address),\n        notUseTokenAccount: mintAUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        createInfo: {\n          payer: this.scope.ownerPubKey,\n          amount: 0,\n        },\n        skipCloseAccount: !(mintAUseSOLBalance && closeWsol),\n        associatedOnly: mintAUseSOLBalance ? false : true,\n        checkCreateATAOwner: false,\n      });\n    tokenAccountA = _ownerTokenAccountA;\n    accountAInstructions && txBuilder.addInstruction(accountAInstructions);\n\n    const { account: _ownerTokenAccountB, instructionParams: accountBInstructions } =\n      await this.scope.account.getOrCreateTokenAccount({\n        tokenProgram: poolInfo.mintB.programId,\n        mint: new PublicKey(poolInfo.mintB.address),\n        notUseTokenAccount: mintBUseSOLBalance,\n        owner: this.scope.ownerPubKey,\n        createInfo: {\n          payer: this.scope.ownerPubKey,\n          amount: 0,\n        },\n        skipCloseAccount: !(mintBUseSOLBalance && closeWsol),\n        associatedOnly: mintBUseSOLBalance ? false : true,\n        checkCreateATAOwner: false,\n      });\n    tokenAccountB = _ownerTokenAccountB;\n    accountBInstructions && txBuilder.addInstruction(accountBInstructions);\n\n    if (!tokenAccountA || !tokenAccountB)\n      this.logAndCreateError(\"cannot found target token accounts\", \"tokenAccounts\", account.tokenAccounts);\n\n    const lpTokenAccount = await account.getCreatedTokenAccount({\n      mint: new PublicKey(poolInfo.lpMint.address),\n    });\n\n    if (!lpTokenAccount)\n      this.logAndCreateError(\"cannot found lp token account\", \"tokenAccounts\", account.tokenAccounts);\n    const poolKeys = propPoolKeys ?? (await this.getCpmmPoolKeys(poolInfo.id));\n    txBuilder.addInstruction({\n      instructions: [\n        makeWithdrawCpmmInInstruction(\n          new PublicKey(poolInfo.programId),\n          this.scope.ownerPubKey,\n          new PublicKey(poolKeys.authority),\n          new PublicKey(poolInfo.id),\n          lpTokenAccount!,\n          tokenAccountA!,\n          tokenAccountB!,\n          new PublicKey(poolKeys.vault.A),\n          new PublicKey(poolKeys.vault.B),\n          mintA,\n          mintB,\n          new PublicKey(poolInfo.lpMint.address),\n\n          lpAmount,\n          amountMintA.sub(mintAAmountFee.fee ?? new BN(0)),\n          amountMintB.sub(mintBAmountFee.fee ?? new BN(0)),\n        ),\n      ],\n      instructionTypes: [InstructionType.CpmmWithdrawLiquidity],\n      lookupTableAddress: poolKeys.lookupTableAccount ? [poolKeys.lookupTableAccount] : [],\n    });\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public async swap<T extends TxVersion>(params: CpmmSwapParams<T>): Promise<MakeTxData<T>> {\n    const {\n      poolInfo,\n      poolKeys: propPoolKeys,\n      baseIn,\n      fixedOut,\n      inputAmount,\n      swapResult,\n      slippage = 0,\n      config,\n      computeBudgetConfig,\n      txTipConfig,\n      txVersion,\n      feePayer,\n    } = params;\n\n    const { bypassAssociatedCheck, checkCreateATAOwner, associatedOnly } = {\n      // default\n      ...{ bypassAssociatedCheck: false, checkCreateATAOwner: false, associatedOnly: true },\n      // custom\n      ...config,\n    };\n\n    const txBuilder = this.createTxBuilder(feePayer);\n\n    const [mintA, mintB] = [new PublicKey(poolInfo.mintA.address), new PublicKey(poolInfo.mintB.address)];\n\n    if (!fixedOut) {\n      swapResult.destinationAmountSwapped = swapResult.destinationAmountSwapped\n        .mul(new BN((1 - slippage) * 10000))\n        .div(new BN(10000));\n    } else {\n      swapResult.sourceAmountSwapped = swapResult.sourceAmountSwapped\n        .mul(new BN((1 + slippage) * 10000))\n        .div(new BN(10000));\n    }\n\n    const mintAUseSOLBalance = poolInfo.mintA.address === WSOLMint.toBase58();\n    const mintBUseSOLBalance = poolInfo.mintB.address === WSOLMint.toBase58();\n    const { account: mintATokenAcc, instructionParams: mintATokenAccInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: mintA,\n        tokenProgram: new PublicKey(poolInfo.mintA.programId ?? TOKEN_PROGRAM_ID),\n        owner: this.scope.ownerPubKey,\n        createInfo:\n          mintAUseSOLBalance || !baseIn\n            ? {\n              payer: this.scope.ownerPubKey,\n              amount: baseIn ? swapResult.sourceAmountSwapped : 0,\n            }\n            : undefined,\n        notUseTokenAccount: mintAUseSOLBalance,\n        skipCloseAccount: !mintAUseSOLBalance,\n        associatedOnly: mintAUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    mintATokenAccInstruction && txBuilder.addInstruction(mintATokenAccInstruction);\n\n    const { account: mintBTokenAcc, instructionParams: mintBTokenAccInstruction } =\n      await this.scope.account.getOrCreateTokenAccount({\n        mint: mintB,\n        tokenProgram: new PublicKey(poolInfo.mintB.programId ?? TOKEN_PROGRAM_ID),\n        owner: this.scope.ownerPubKey,\n        createInfo:\n          mintBUseSOLBalance || baseIn\n            ? {\n              payer: this.scope.ownerPubKey,\n              amount: baseIn ? 0 : swapResult.sourceAmountSwapped,\n            }\n            : undefined,\n        notUseTokenAccount: mintBUseSOLBalance,\n        skipCloseAccount: !mintBUseSOLBalance,\n        associatedOnly: mintBUseSOLBalance ? false : associatedOnly,\n        checkCreateATAOwner,\n      });\n    mintBTokenAccInstruction && txBuilder.addInstruction(mintBTokenAccInstruction);\n\n    if (!mintATokenAcc || !mintBTokenAcc)\n      this.logAndCreateError(\"user do not have token account\", {\n        mintA: poolInfo.mintA.symbol || poolInfo.mintA.address,\n        mintB: poolInfo.mintB.symbol || poolInfo.mintB.address,\n        mintATokenAcc,\n        mintBTokenAcc,\n        mintAUseSOLBalance,\n        mintBUseSOLBalance,\n        associatedOnly,\n      });\n\n    const poolKeys = propPoolKeys ?? (await this.getCpmmPoolKeys(poolInfo.id));\n\n    txBuilder.addInstruction({\n      instructions: [\n        !fixedOut\n          ? makeSwapCpmmBaseInInstruction(\n            new PublicKey(poolInfo.programId),\n            this.scope.ownerPubKey,\n            new PublicKey(poolKeys.authority),\n            new PublicKey(poolKeys.config.id),\n            new PublicKey(poolInfo.id),\n            baseIn ? mintATokenAcc! : mintBTokenAcc!,\n            baseIn ? mintBTokenAcc! : mintATokenAcc!,\n            new PublicKey(poolKeys.vault[baseIn ? \"A\" : \"B\"]),\n            new PublicKey(poolKeys.vault[baseIn ? \"B\" : \"A\"]),\n            new PublicKey(poolInfo[baseIn ? \"mintA\" : \"mintB\"].programId ?? TOKEN_PROGRAM_ID),\n            new PublicKey(poolInfo[baseIn ? \"mintB\" : \"mintA\"].programId ?? TOKEN_PROGRAM_ID),\n            baseIn ? mintA : mintB,\n            baseIn ? mintB : mintA,\n            getPdaObservationId(new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)).publicKey,\n\n            inputAmount,\n            swapResult.destinationAmountSwapped,\n          )\n          : makeSwapCpmmBaseOutInstruction(\n            new PublicKey(poolInfo.programId),\n            this.scope.ownerPubKey,\n            new PublicKey(poolKeys.authority),\n            new PublicKey(poolKeys.config.id),\n            new PublicKey(poolInfo.id),\n\n            baseIn ? mintATokenAcc! : mintBTokenAcc!,\n            baseIn ? mintBTokenAcc! : mintATokenAcc!,\n\n            new PublicKey(poolKeys.vault[baseIn ? \"A\" : \"B\"]),\n            new PublicKey(poolKeys.vault[baseIn ? \"B\" : \"A\"]),\n            new PublicKey(poolInfo[baseIn ? \"mintA\" : \"mintB\"].programId ?? TOKEN_PROGRAM_ID),\n            new PublicKey(poolInfo[baseIn ? \"mintB\" : \"mintA\"].programId ?? TOKEN_PROGRAM_ID),\n            baseIn ? mintA : mintB,\n            baseIn ? mintB : mintA,\n\n            getPdaObservationId(new PublicKey(poolInfo.programId), new PublicKey(poolInfo.id)).publicKey,\n\n            swapResult.sourceAmountSwapped,\n            swapResult.destinationAmountSwapped,\n          ),\n      ],\n      instructionTypes: [fixedOut ? InstructionType.CpmmSwapBaseOut : InstructionType.ClmmSwapBaseIn],\n    });\n\n    txBuilder.addCustomComputeBudget(computeBudgetConfig);\n    txBuilder.addTipInstruction(txTipConfig);\n    return txBuilder.versionBuild({ txVersion }) as Promise<MakeTxData<T>>;\n  }\n\n  public computeSwapAmount({\n    pool,\n    amountIn,\n    outputMint,\n    slippage,\n  }: {\n    pool: CpmmComputeData;\n    amountIn: BN;\n    outputMint: string | PublicKey;\n    slippage: number;\n  }): {\n    allTrade: boolean;\n    amountIn: BN;\n    amountOut: BN;\n    minAmountOut: BN;\n    fee: BN;\n    executionPrice: Decimal;\n    priceImpact: any;\n  } {\n    const isBaseIn = outputMint.toString() === pool.mintB.address;\n\n    const swapResult = CurveCalculator.swap(\n      amountIn,\n      isBaseIn ? pool.baseReserve : pool.quoteReserve,\n      isBaseIn ? pool.quoteReserve : pool.baseReserve,\n      pool.configInfo.tradeFeeRate,\n    );\n\n    const executionPrice = new Decimal(swapResult.destinationAmountSwapped.toString()).div(\n      swapResult.sourceAmountSwapped.toString(),\n    );\n\n    const minAmountOut = swapResult.destinationAmountSwapped.mul(new BN((1 - slippage) * 10000)).div(new BN(10000));\n\n    return {\n      allTrade: swapResult.sourceAmountSwapped.eq(amountIn),\n      amountIn,\n      amountOut: swapResult.destinationAmountSwapped,\n      minAmountOut,\n      executionPrice,\n      fee: swapResult.tradeFee,\n      priceImpact: pool.poolPrice.sub(executionPrice).div(pool.poolPrice),\n    };\n  }\n\n  public computePairAmount({\n    poolInfo,\n    baseReserve,\n    quoteReserve,\n    amount,\n    slippage,\n    epochInfo,\n    baseIn,\n  }: ComputePairAmountParams): {\n    inputAmountFee: GetTransferAmountFee;\n    anotherAmount: GetTransferAmountFee;\n    maxAnotherAmount: GetTransferAmountFee;\n    minAnotherAmount: GetTransferAmountFee;\n    liquidity: BN;\n  } {\n    const coefficient = 1 - Number(slippage.toSignificant()) / 100;\n    const inputAmount = new BN(\n      new Decimal(amount)\n        .mul(10 ** poolInfo[baseIn ? \"mintA\" : \"mintB\"].decimals)\n        .mul(coefficient)\n        .toFixed(0),\n    );\n    const inputAmountFee = getTransferAmountFeeV2(\n      inputAmount,\n      poolInfo[baseIn ? \"mintA\" : \"mintB\"].extensions.feeConfig,\n      epochInfo,\n      false,\n    );\n    const _inputAmountWithoutFee = inputAmount.sub(inputAmountFee.fee ?? new BN(0));\n\n    const lpAmount = new BN(\n      new Decimal(poolInfo.lpAmount).mul(10 ** poolInfo.lpMint.decimals).toFixed(0, Decimal.ROUND_DOWN),\n    );\n    this.logDebug(\"baseReserve:\", baseReserve.toString(), \"quoteReserve:\", quoteReserve.toString());\n\n    this.logDebug(\n      \"tokenIn:\",\n      baseIn ? poolInfo.mintA.symbol : poolInfo.mintB.symbol,\n      \"amountIn:\",\n      inputAmount.toString(),\n      \"amountInFee:\",\n      inputAmountFee.fee?.toString() ?? 0,\n      \"anotherToken:\",\n      baseIn ? poolInfo.mintB.symbol : poolInfo.mintA.symbol,\n      \"slippage:\",\n      `${slippage.toSignificant()}%`,\n    );\n\n    // input is fixed\n    const input = baseIn ? \"base\" : \"quote\";\n    this.logDebug(\"input side:\", input);\n\n    const liquidity = _inputAmountWithoutFee.mul(lpAmount).div(input === \"base\" ? baseReserve : quoteReserve);\n    let anotherAmountFee: GetTransferAmountFee = {\n      amount: BN_ZERO,\n      fee: undefined,\n      expirationTime: undefined,\n    };\n    if (!_inputAmountWithoutFee.isZero()) {\n      const lpAmountData = lpToAmount(liquidity, baseReserve, quoteReserve, lpAmount);\n      this.logDebug(\"lpAmountData:\", {\n        amountA: lpAmountData.amountA.toString(),\n        amountB: lpAmountData.amountB.toString(),\n      });\n      anotherAmountFee = getTransferAmountFeeV2(\n        lpAmountData[baseIn ? \"amountB\" : \"amountA\"],\n        poolInfo[baseIn ? \"mintB\" : \"mintA\"].extensions.feeConfig,\n        epochInfo,\n        true,\n      );\n    }\n\n    const _slippage = new Percent(new BN(1)).add(slippage);\n    const _slippageMin = new Percent(new BN(1)).sub(slippage);\n    const slippageAdjustedAmount = getTransferAmountFeeV2(\n      _slippage.mul(anotherAmountFee.amount.sub(anotherAmountFee.fee ?? new BN(0))).quotient,\n      poolInfo[baseIn ? \"mintB\" : \"mintA\"].extensions.feeConfig,\n      epochInfo,\n      true,\n    );\n    const slippageAdjustedMinAmount = getTransferAmountFeeV2(\n      _slippageMin.mul(anotherAmountFee.amount.sub(anotherAmountFee.fee ?? new BN(0))).quotient,\n      poolInfo[baseIn ? \"mintB\" : \"mintA\"].extensions.feeConfig,\n      epochInfo,\n      true,\n    );\n\n    this.logDebug(\n      \"anotherAmount:\",\n      anotherAmountFee.amount.toString(),\n      \"anotherAmountFee:\",\n      anotherAmountFee.fee?.toString() ?? 0,\n      \"maxAnotherAmount:\",\n      slippageAdjustedAmount.amount.toString(),\n      \"maxAnotherAmountFee:\",\n      slippageAdjustedAmount.fee?.toString() ?? 0,\n    );\n\n    return {\n      inputAmountFee,\n      anotherAmount: anotherAmountFee,\n      maxAnotherAmount: slippageAdjustedAmount,\n      minAnotherAmount: slippageAdjustedMinAmount,\n      liquidity,\n    };\n  }\n}\n\nfunction lpToAmount(lp: BN, poolAmountA: BN, poolAmountB: BN, supply: BN): { amountA: BN; amountB: BN } {\n  let amountA = lp.mul(poolAmountA).div(supply);\n  if (!amountA.isZero() && !lp.mul(poolAmountA).mod(supply).isZero()) amountA = amountA.add(new BN(1));\n  let amountB = lp.mul(poolAmountB).div(supply);\n  if (!amountB.isZero() && !lp.mul(poolAmountB).mod(supply).isZero()) amountB = amountB.add(new BN(1));\n\n  return {\n    amountA,\n    amountB,\n  };\n}","import { PublicKey } from \"@solana/web3.js\";\nimport BN from \"bn.js\";\nimport Decimal from \"decimal.js-light\";\nimport { ApiV3Token } from \"../../../api/type\";\nimport { BNDivCeil } from \"../../../common\";\nimport { ConstantProductCurve } from \"./constantProduct\";\nimport { CpmmFee } from \"./fee\";\n\nexport enum RoundDirection {\n  Floor,\n  Ceiling,\n}\n\nexport type SwapWithoutFeesResult = { destinationAmountSwapped: BN };\n\nexport type TradingTokenResult = { tokenAmount0: BN; tokenAmount1: BN };\n\nexport type SwapResult = {\n  newSwapDestinationAmount: BN;\n  sourceAmountSwapped: BN;\n  destinationAmountSwapped: BN;\n  tradeFee: BN;\n};\n\nexport class CurveCalculator {\n  static validate_supply(tokenAmount0: BN, tokenAmount1: BN): void {\n    if (tokenAmount0.isZero()) throw Error(\"tokenAmount0 is zero\");\n    if (tokenAmount1.isZero()) throw Error(\"tokenAmount1 is zero\");\n  }\n\n  static swap(sourceAmount: BN, swapSourceAmount: BN, swapDestinationAmount: BN, tradeFeeRate: BN): SwapResult {\n    const tradeFee = CpmmFee.tradingFee(sourceAmount, tradeFeeRate);\n\n    const sourceAmountLessFees = sourceAmount.sub(tradeFee);\n\n    const { destinationAmountSwapped } = ConstantProductCurve.swapWithoutFees(\n      sourceAmountLessFees,\n      swapSourceAmount,\n      swapDestinationAmount,\n    );\n\n    return {\n      newSwapDestinationAmount: swapDestinationAmount.sub(destinationAmountSwapped),\n      sourceAmountSwapped: sourceAmount,\n      destinationAmountSwapped,\n      tradeFee,\n    };\n  }\n\n  static swapBaseOut({\n    poolMintA,\n    poolMintB,\n    tradeFeeRate,\n    baseReserve,\n    quoteReserve,\n    outputMint,\n    outputAmount,\n  }: {\n    poolMintA: ApiV3Token;\n    poolMintB: ApiV3Token;\n    tradeFeeRate: BN;\n    baseReserve: BN;\n    quoteReserve: BN;\n    outputMint: string | PublicKey;\n    outputAmount: BN;\n  }): {\n    amountRealOut: BN;\n\n    amountIn: BN;\n    amountInWithoutFee: BN;\n\n    tradeFee: BN;\n    priceImpact: number;\n  } {\n    const [reserveInAmount, reserveOutAmount, reserveInDecimals, reserveOutDecimals, inputMint] =\n      poolMintB.address === outputMint.toString()\n        ? [baseReserve, quoteReserve, poolMintA.decimals, poolMintB.decimals, poolMintA.address]\n        : [quoteReserve, baseReserve, poolMintB.decimals, poolMintA.decimals, poolMintB.address];\n    const currentPrice = new Decimal(reserveOutAmount.toString())\n      .div(10 ** reserveOutDecimals)\n      .div(new Decimal(reserveInAmount.toString()).div(10 ** reserveInDecimals));\n    const amountRealOut = outputAmount.gte(reserveOutAmount) ? reserveOutAmount.sub(new BN(1)) : outputAmount;\n\n    const denominator = reserveOutAmount.sub(amountRealOut);\n    const amountInWithoutFee = BNDivCeil(reserveInAmount.mul(amountRealOut), denominator);\n    const amountIn = BNDivCeil(amountInWithoutFee.mul(new BN(1_000_000)), new BN(1_000_000).sub(tradeFeeRate));\n    const fee = amountIn.sub(amountInWithoutFee);\n    const executionPrice = new Decimal(amountRealOut.toString())\n      .div(10 ** reserveOutDecimals)\n      .div(new Decimal(amountIn.toString()).div(10 ** reserveInDecimals));\n    const priceImpact = currentPrice.isZero() ? 0 : executionPrice.sub(currentPrice).div(currentPrice).abs().toNumber();\n\n    return {\n      amountRealOut,\n\n      amountIn,\n      amountInWithoutFee,\n\n      tradeFee: fee,\n      priceImpact,\n    };\n  }\n}\n","import BN from \"bn.js\";\nimport { RoundDirection, SwapWithoutFeesResult, TradingTokenResult } from \"./calculator\";\n\nfunction checkedRem(dividend: BN, divisor: BN): BN {\n  if (divisor.isZero()) throw Error(\"divisor is zero\");\n\n  const result = dividend.mod(divisor);\n  return result;\n}\n\nfunction checkedCeilDiv(dividend: BN, rhs: BN): BN[] {\n  if (rhs.isZero()) throw Error(\"rhs is zero\");\n\n  let quotient = dividend.div(rhs);\n\n  if (quotient.isZero()) throw Error(\"quotient is zero\");\n\n  let remainder = checkedRem(dividend, rhs);\n\n  if (remainder.gt(ZERO)) {\n    quotient = quotient.add(new BN(1));\n\n    rhs = dividend.div(quotient);\n    remainder = checkedRem(dividend, quotient);\n    if (remainder.gt(ZERO)) {\n      rhs = rhs.add(new BN(1));\n    }\n  }\n  return [quotient, rhs];\n}\n\nconst ZERO = new BN(0);\n\nexport class ConstantProductCurve {\n  static swapWithoutFees(sourceAmount: BN, swapSourceAmount: BN, swapDestinationAmount: BN): SwapWithoutFeesResult {\n    const invariant = swapSourceAmount.mul(swapDestinationAmount);\n\n    const newSwapSourceAmount = swapSourceAmount.add(sourceAmount);\n    const [newSwapDestinationAmount] = checkedCeilDiv(invariant, newSwapSourceAmount);\n\n    const destinationAmountSwapped = swapDestinationAmount.sub(newSwapDestinationAmount);\n    if (destinationAmountSwapped.isZero()) throw Error(\"destinationAmountSwapped is zero\");\n\n    return {\n      destinationAmountSwapped,\n    };\n  }\n\n  static lpTokensToTradingTokens(\n    lpTokenAmount: BN,\n    lpTokenSupply: BN,\n    swapTokenAmount0: BN,\n    swapTokenAmount1: BN,\n    roundDirection: RoundDirection,\n  ): TradingTokenResult {\n    let tokenAmount0 = lpTokenAmount.mul(swapTokenAmount0).div(lpTokenSupply);\n    let tokenAmount1 = lpTokenAmount.mul(swapTokenAmount1).div(lpTokenSupply);\n\n    if (roundDirection === RoundDirection.Floor) {\n      return { tokenAmount0, tokenAmount1 };\n    } else if (roundDirection === RoundDirection.Ceiling) {\n      const tokenRemainder0 = checkedRem(lpTokenAmount.mul(swapTokenAmount0), lpTokenSupply);\n\n      if (tokenRemainder0.gt(ZERO) && tokenAmount0.gt(ZERO)) {\n        tokenAmount0 = tokenAmount0.add(new BN(1));\n      }\n\n      const token1Remainder = checkedRem(lpTokenAmount.mul(swapTokenAmount1), lpTokenSupply);\n\n      if (token1Remainder.gt(ZERO) && tokenAmount1.gt(ZERO)) {\n        tokenAmount1 = tokenAmount1.add(new BN(1));\n      }\n\n      return { tokenAmount0, tokenAmount1 };\n    }\n    throw Error(\"roundDirection value error\");\n  }\n}\n","import BN from \"bn.js\";\n\nexport const FEE_RATE_DENOMINATOR_VALUE = new BN(1_000_000);\n\nexport function ceilDiv(tokenAmount: BN, feeNumerator: BN, feeDenominator: BN): BN {\n  return tokenAmount.mul(feeNumerator).add(feeDenominator).sub(new BN(1)).div(feeDenominator);\n}\n\nexport function floorDiv(tokenAmount: BN, feeNumerator: BN, feeDenominator: BN): BN {\n  return tokenAmount.mul(feeNumerator).div(feeDenominator);\n}\n\nexport class CpmmFee {\n  static tradingFee(amount: BN, tradeFeeRate: BN): BN {\n    return ceilDiv(amount, tradeFeeRate, FEE_RATE_DENOMINATOR_VALUE);\n  }\n  static protocolFee(amount: BN, protocolFeeRate: BN): BN {\n    return floorDiv(amount, protocolFeeRate, FEE_RATE_DENOMINATOR_VALUE);\n  }\n  static fundFee(amount: BN, fundFeeRate: BN): BN {\n    return floorDiv(amount, fundFeeRate, FEE_RATE_DENOMINATOR_VALUE);\n  }\n}\n","import { publicKey, struct, u32, u64, u8 } from \"../../marshmallow\";\n\nexport const SPL_MINT_LAYOUT = struct([\n  u32(\"mintAuthorityOption\"),\n  publicKey(\"mintAuthority\"),\n  u64(\"supply\"),\n  u8(\"decimals\"),\n  u8(\"isInitialized\"),\n  u32(\"freezeAuthorityOption\"),\n  publicKey(\"freezeAuthority\"),\n]);\n\nexport type SplMintLayout = typeof SPL_MINT_LAYOUT;\n","import { Connection, PublicKey } from \"@solana/web3.js\";\nimport { MintLayout, RawMint, TOKEN_PROGRAM_ID, TransferFeeConfigLayout } from \"@solana/spl-token\";\nimport { BigNumberish } from \"@/common/bignumber\";\nimport { Token, TokenAmount } from \"../../module\";\nimport { SOL_INFO, TOKEN_WSOL } from \"./constant\";\nimport { TokenInfo } from \"./type\";\n\nimport { ApiV3Token } from \"../../api\";\nimport { solToWSol } from \"@/common\";\n\nexport const parseTokenInfo = async ({\n  connection,\n  mint,\n}: {\n  connection: Connection;\n  mint: PublicKey | string;\n}): Promise<RawMint | undefined> => {\n  const accountData = await connection.getAccountInfo(new PublicKey(mint));\n  if (!accountData || accountData.data.length !== MintLayout.span) return;\n  const tokenInfo = MintLayout.decode(accountData.data);\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  //@ts-ignore\n  return tokenInfo;\n};\n\nexport const toTokenInfo = ({\n  mint,\n  decimals,\n  programId = TOKEN_PROGRAM_ID,\n  logoURI = \"\",\n  priority = 3,\n}: {\n  mint: PublicKey;\n  decimals: number;\n  programId?: PublicKey | string;\n  priority?: number;\n  logoURI?: string;\n}): TokenInfo => {\n  const pubStr = mint.toBase58().substring(0, 6);\n  return {\n    address: mint.toBase58(),\n    decimals,\n    symbol: pubStr,\n    logoURI,\n    extensions: {},\n    chainId: 101,\n    programId: programId.toString(),\n    name: pubStr,\n    tags: [],\n    priority,\n  };\n};\n\nexport const toToken = (props: Omit<TokenInfo, \"priority\">): Token =>\n  new Token({\n    mint: props.address,\n    decimals: props.decimals,\n    symbol: props.symbol,\n    name: props.name,\n  });\n\nexport const toTokenAmount = ({\n  amount,\n  isRaw,\n  name,\n  ...props\n}: Omit<TokenInfo, \"priority\"> & {\n  amount: BigNumberish;\n  isRaw?: boolean;\n  name?: string;\n}): TokenAmount =>\n  new TokenAmount(\n    new Token({\n      mint: solToWSol(props.address).toBase58(),\n      decimals: props.decimals,\n      symbol: props.symbol,\n      name,\n    }),\n    amount,\n    isRaw,\n    name,\n  );\n\nexport function solToWSolToken<T extends ApiV3Token | TokenInfo>(token: T): T {\n  if (token.address === SOL_INFO.address) return TOKEN_WSOL as T;\n  return token;\n}\n\nexport function wSolToSolToken<T extends ApiV3Token | TokenInfo>(token: T): T {\n  if (token.address === TOKEN_WSOL.address) return SOL_INFO as T;\n  return token;\n}\n\nexport const toApiV3Token = ({\n  address,\n  programId,\n  decimals,\n  ...props\n}: {\n  address: string;\n  programId: string;\n  decimals: number;\n} & Partial<ApiV3Token>): ApiV3Token => ({\n  chainId: 101,\n  address: solToWSol(address).toBase58(),\n  programId,\n  logoURI: \"\",\n  symbol: \"\",\n  name: \"\",\n  decimals,\n  tags: [],\n  extensions: props.extensions || {},\n  ...props,\n});\n\nexport const toFeeConfig = (\n  config?: ReturnType<typeof TransferFeeConfigLayout.decode> | undefined | null,\n): ApiV3Token[\"extensions\"][\"feeConfig\"] | undefined =>\n  config\n    ? {\n        ...config,\n        transferFeeConfigAuthority: config.transferFeeConfigAuthority.toBase58(),\n        withdrawWithheldAuthority: config.withdrawWithheldAuthority.toBase58(),\n        withheldAmount: config.withheldAmount.toString(),\n        olderTransferFee: {\n          ...config.olderTransferFee,\n          epoch: config.olderTransferFee.epoch.toString(),\n          maximumFee: config.olderTransferFee.maximumFee.toString(),\n        },\n        newerTransferFee: {\n          ...config.newerTransferFee,\n          epoch: config.newerTransferFee.epoch.toString(),\n          maximumFee: config.newerTransferFee.maximumFee.toString(),\n        },\n      }\n    : undefined;\n","import BN from \"bn.js\";\n\nimport { AccountMeta, PublicKey, TransactionInstruction, Signer, Keypair, SystemProgram } from \"@solana/web3.js\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport {\n  MEMO_PROGRAM_ID2,\n  RENT_PROGRAM_ID,\n  SYSTEM_PROGRAM_ID,\n  METADATA_PROGRAM_ID,\n  createLogger,\n  CREATE_CPMM_POOL_PROGRAM,\n  CREATE_CPMM_POOL_AUTH,\n  InstructionType, getPdaMetadataKey,\n} from \"@/common\";\nimport { getCpmmPdaPoolId, getCpLockPda } from \"./pda\";\n\nimport { struct, u64, bool } from \"@/marshmallow\";\nimport { ReturnTypeMakeInstructions } from \"@/sega/type\";\nimport { ApiV3PoolInfoStandardItemCpmm, CpmmKeys } from \"@/api\";\nimport { getATAAddress } from \"@/common\";\nimport { CpmmLockExtInfo } from \"./type\";\n\nconst logger = createLogger(\"Sega_cpmm\");\nconst anchorDataBuf = {\n  initialize: [175, 175, 109, 31, 13, 152, 155, 237],\n  deposit: [242, 35, 198, 137, 82, 225, 242, 182],\n  withdraw: [183, 18, 70, 156, 148, 109, 161, 34],\n  swapBaseInput: [143, 190, 90, 218, 196, 30, 51, 222],\n  swapBaseOutput: [55, 217, 98, 86, 163, 74, 180, 173],\n  lockCpLiquidity: [216, 157, 29, 78, 38, 51, 31, 26],\n  collectCpFee: [8, 30, 51, 199, 209, 184, 247, 133],\n};\n\nexport function makeCreateCpmmPoolInInstruction(\n  programId: PublicKey,\n  creator: PublicKey,\n  configId: PublicKey,\n  authority: PublicKey,\n  poolId: PublicKey,\n  mintA: PublicKey,\n  mintB: PublicKey,\n  lpMint: PublicKey,\n  userVaultA: PublicKey,\n  userVaultB: PublicKey,\n  userLpAccount: PublicKey,\n  vaultA: PublicKey,\n  vaultB: PublicKey,\n  createPoolFeeAccount: PublicKey,\n  mintProgramA: PublicKey,\n  mintProgramB: PublicKey,\n  observationId: PublicKey,\n\n  amountMaxA: BN,\n  amountMaxB: BN,\n  openTime: BN,\n): TransactionInstruction {\n  const dataLayout = struct([u64(\"amountMaxA\"), u64(\"amountMaxB\"), u64(\"openTime\")]);\n\n  const pdaPoolId = getCpmmPdaPoolId(programId, configId, mintA, mintB).publicKey;\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: creator, isSigner: true, isWritable: false },\n    { pubkey: configId, isSigner: false, isWritable: false },\n    { pubkey: authority, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: !poolId.equals(pdaPoolId), isWritable: true },\n    { pubkey: mintA, isSigner: false, isWritable: false },\n    { pubkey: mintB, isSigner: false, isWritable: false },\n    { pubkey: lpMint, isSigner: false, isWritable: true },\n    { pubkey: userVaultA, isSigner: false, isWritable: true },\n    { pubkey: userVaultB, isSigner: false, isWritable: true },\n    { pubkey: userLpAccount, isSigner: false, isWritable: true },\n    { pubkey: vaultA, isSigner: false, isWritable: true },\n    { pubkey: vaultB, isSigner: false, isWritable: true },\n    { pubkey: createPoolFeeAccount, isSigner: false, isWritable: true },\n    { pubkey: observationId, isSigner: false, isWritable: true },\n\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: mintProgramA, isSigner: false, isWritable: false },\n    { pubkey: mintProgramB, isSigner: false, isWritable: false },\n    { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: SYSTEM_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      amountMaxA,\n      amountMaxB,\n      openTime,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.initialize, ...data]),\n  });\n}\n\nexport function makeDepositCpmmInInstruction(\n  programId: PublicKey,\n  owner: PublicKey,\n  authority: PublicKey,\n  poolId: PublicKey,\n  userLpAccount: PublicKey,\n  userVaultA: PublicKey,\n  userVaultB: PublicKey,\n  vaultA: PublicKey,\n  vaultB: PublicKey,\n  mintA: PublicKey,\n  mintB: PublicKey,\n  lpMint: PublicKey,\n\n  lpAmount: BN,\n  amountMaxA: BN,\n  amountMaxB: BN,\n): TransactionInstruction {\n  const dataLayout = struct([u64(\"lpAmount\"), u64(\"amountMaxA\"), u64(\"amountMaxB\")]);\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: owner, isSigner: true, isWritable: false },\n    { pubkey: authority, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n    { pubkey: userLpAccount, isSigner: false, isWritable: true },\n    { pubkey: userVaultA, isSigner: false, isWritable: true },\n    { pubkey: userVaultB, isSigner: false, isWritable: true },\n    { pubkey: vaultA, isSigner: false, isWritable: true },\n    { pubkey: vaultB, isSigner: false, isWritable: true },\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: mintA, isSigner: false, isWritable: false },\n    { pubkey: mintB, isSigner: false, isWritable: false },\n    { pubkey: lpMint, isSigner: false, isWritable: true },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  logger.debug(\"cpmm deposit data\", {\n    lpAmount: lpAmount.toString(),\n    amountMaxA: amountMaxA.toString(),\n    amountMaxB: amountMaxB.toString(),\n  });\n  dataLayout.encode(\n    {\n      lpAmount,\n      amountMaxA,\n      amountMaxB,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.deposit, ...data]),\n  });\n}\n\nexport function makeWithdrawCpmmInInstruction(\n  programId: PublicKey,\n  owner: PublicKey,\n  authority: PublicKey,\n  poolId: PublicKey,\n  userLpAccount: PublicKey,\n  userVaultA: PublicKey,\n  userVaultB: PublicKey,\n  vaultA: PublicKey,\n  vaultB: PublicKey,\n  mintA: PublicKey,\n  mintB: PublicKey,\n  lpMint: PublicKey,\n\n  lpAmount: BN,\n  amountMinA: BN,\n  amountMinB: BN,\n): TransactionInstruction {\n  const dataLayout = struct([u64(\"lpAmount\"), u64(\"amountMinA\"), u64(\"amountMinB\")]);\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: owner, isSigner: true, isWritable: false },\n    { pubkey: authority, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n    { pubkey: userLpAccount, isSigner: false, isWritable: true },\n    { pubkey: userVaultA, isSigner: false, isWritable: true },\n    { pubkey: userVaultB, isSigner: false, isWritable: true },\n    { pubkey: vaultA, isSigner: false, isWritable: true },\n    { pubkey: vaultB, isSigner: false, isWritable: true },\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: mintA, isSigner: false, isWritable: false },\n    { pubkey: mintB, isSigner: false, isWritable: false },\n    { pubkey: lpMint, isSigner: false, isWritable: true },\n    { pubkey: MEMO_PROGRAM_ID2, isSigner: false, isWritable: false },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      lpAmount,\n      amountMinA,\n      amountMinB,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.withdraw, ...data]),\n  });\n}\n\nexport function makeSwapCpmmBaseInInstruction(\n  programId: PublicKey,\n  payer: PublicKey,\n  authority: PublicKey,\n  configId: PublicKey,\n  poolId: PublicKey,\n  userInputAccount: PublicKey,\n  userOutputAccount: PublicKey,\n  inputVault: PublicKey,\n  outputVault: PublicKey,\n  inputTokenProgram: PublicKey,\n  outputTokenProgram: PublicKey,\n  inputMint: PublicKey,\n  outputMint: PublicKey,\n  observationId: PublicKey,\n\n  amountIn: BN,\n  amounOutMin: BN,\n): TransactionInstruction {\n  const dataLayout = struct([u64(\"amountIn\"), u64(\"amounOutMin\")]);\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: payer, isSigner: true, isWritable: false },\n    { pubkey: authority, isSigner: false, isWritable: false },\n    { pubkey: configId, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n    { pubkey: userInputAccount, isSigner: false, isWritable: true },\n    { pubkey: userOutputAccount, isSigner: false, isWritable: true },\n    { pubkey: inputVault, isSigner: false, isWritable: true },\n    { pubkey: outputVault, isSigner: false, isWritable: true },\n    { pubkey: inputTokenProgram, isSigner: false, isWritable: false },\n    { pubkey: outputTokenProgram, isSigner: false, isWritable: false },\n    { pubkey: inputMint, isSigner: false, isWritable: false },\n    { pubkey: outputMint, isSigner: false, isWritable: false },\n    { pubkey: observationId, isSigner: false, isWritable: true },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      amountIn,\n      amounOutMin,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.swapBaseInput, ...data]),\n  });\n}\nexport function makeSwapCpmmBaseOutInstruction(\n  programId: PublicKey,\n  payer: PublicKey,\n  authority: PublicKey,\n  configId: PublicKey,\n  poolId: PublicKey,\n  userInputAccount: PublicKey,\n  userOutputAccount: PublicKey,\n  inputVault: PublicKey,\n  outputVault: PublicKey,\n  inputTokenProgram: PublicKey,\n  outputTokenProgram: PublicKey,\n  inputMint: PublicKey,\n  outputMint: PublicKey,\n  observationId: PublicKey,\n\n  amountInMax: BN,\n  amountOut: BN,\n): TransactionInstruction {\n  const dataLayout = struct([u64(\"amountInMax\"), u64(\"amountOut\")]);\n\n  const keys: Array<AccountMeta> = [\n    { pubkey: payer, isSigner: true, isWritable: false },\n    { pubkey: authority, isSigner: false, isWritable: false },\n    { pubkey: configId, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n    { pubkey: userInputAccount, isSigner: false, isWritable: true },\n    { pubkey: userOutputAccount, isSigner: false, isWritable: true },\n    { pubkey: inputVault, isSigner: false, isWritable: true },\n    { pubkey: outputVault, isSigner: false, isWritable: true },\n    { pubkey: inputTokenProgram, isSigner: false, isWritable: false },\n    { pubkey: outputTokenProgram, isSigner: false, isWritable: false },\n    { pubkey: inputMint, isSigner: false, isWritable: false },\n    { pubkey: outputMint, isSigner: false, isWritable: false },\n    { pubkey: observationId, isSigner: false, isWritable: true },\n  ];\n\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      amountInMax,\n      amountOut,\n    },\n    data,\n  );\n\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: Buffer.from([...anchorDataBuf.swapBaseOutput, ...data]),\n  });\n}\n\nexport async function makeCpmmLockInstruction(props: {\n  poolInfo: ApiV3PoolInfoStandardItemCpmm;\n  poolKeys: CpmmKeys;\n  ownerInfo: {\n    feePayer: PublicKey;\n    wallet: PublicKey;\n  };\n  feeNftOwner: PublicKey;\n\n  lockProgram: PublicKey;\n  lockAuthProgram: PublicKey;\n  lpAmount: BN;\n  withMetadata?: boolean;\n  getEphemeralSigners?: (k: number) => any;\n}): Promise<ReturnTypeMakeInstructions<CpmmLockExtInfo>> {\n  const { ownerInfo, poolInfo, poolKeys, feeNftOwner, getEphemeralSigners } = props;\n\n  const signers: Signer[] = [];\n  const [poolId, lpMint] = [new PublicKey(poolInfo.id), new PublicKey(poolInfo.lpMint.address)];\n\n  let nftMintAccount: PublicKey;\n  if (getEphemeralSigners) {\n    nftMintAccount = new PublicKey((await getEphemeralSigners(1))[0]);\n  } else {\n    const _k = Keypair.generate();\n    signers.push(_k);\n    nftMintAccount = _k.publicKey;\n  }\n\n  const { publicKey: nftAccount } = getATAAddress(feeNftOwner, nftMintAccount, TOKEN_PROGRAM_ID);\n  const { publicKey: metadataAccount } = getPdaMetadataKey(nftMintAccount);\n  const { publicKey: lockPda } = getCpLockPda(props.lockProgram, nftMintAccount);\n\n  const { publicKey: userLpVault } = getATAAddress(ownerInfo.wallet, lpMint, TOKEN_PROGRAM_ID);\n  const { publicKey: lockLpVault } = getATAAddress(props.lockAuthProgram, lpMint, TOKEN_PROGRAM_ID);\n\n  const ins = cpmmLockPositionInstruction({\n    programId: props.lockProgram,\n    auth: props.lockAuthProgram,\n    payer: ownerInfo.feePayer,\n    liquidityOwner: ownerInfo.wallet,\n    nftOwner: feeNftOwner,\n    nftMint: nftMintAccount,\n    nftAccount,\n    poolId,\n    lockPda,\n    mintLp: lpMint,\n    userLpVault,\n    lockLpVault,\n    poolVaultA: new PublicKey(poolKeys.vault.A),\n    poolVaultB: new PublicKey(poolKeys.vault.B),\n    metadataAccount,\n    lpAmount: props.lpAmount,\n    withMetadata: props.withMetadata ?? true,\n  });\n\n  return {\n    address: {\n      nftMint: nftMintAccount,\n      nftAccount,\n      metadataAccount,\n      lockPda,\n      userLpVault,\n      lockLpVault,\n    },\n    instructions: [ins],\n    signers,\n    instructionTypes: [InstructionType.CpmmLockLp],\n    lookupTableAddress: [],\n  };\n}\n\nexport function cpmmLockPositionInstruction({\n  programId,\n  auth,\n  payer,\n  liquidityOwner,\n  nftOwner,\n  nftMint,\n  nftAccount,\n  poolId,\n  lockPda,\n  mintLp,\n  userLpVault,\n  lockLpVault,\n  poolVaultA,\n  poolVaultB,\n  metadataAccount,\n  lpAmount,\n  withMetadata,\n}: {\n  programId: PublicKey;\n  auth: PublicKey;\n  payer: PublicKey;\n  liquidityOwner: PublicKey;\n  nftOwner: PublicKey;\n  nftMint: PublicKey;\n  nftAccount: PublicKey;\n  poolId: PublicKey;\n  lockPda: PublicKey;\n  mintLp: PublicKey;\n  userLpVault: PublicKey;\n  lockLpVault: PublicKey;\n  poolVaultA: PublicKey;\n  poolVaultB: PublicKey;\n  metadataAccount: PublicKey;\n  lpAmount: BN;\n  withMetadata: boolean;\n}): TransactionInstruction {\n  const keys = [\n    { pubkey: auth, isSigner: false, isWritable: false },\n    { pubkey: payer, isSigner: true, isWritable: true },\n    { pubkey: liquidityOwner, isSigner: true, isWritable: false },\n    { pubkey: nftOwner, isSigner: false, isWritable: false },\n    { pubkey: nftMint, isSigner: true, isWritable: true },\n    { pubkey: nftAccount, isSigner: false, isWritable: true },\n    { pubkey: poolId, isSigner: false, isWritable: false },\n    { pubkey: lockPda, isSigner: false, isWritable: true },\n    { pubkey: mintLp, isSigner: false, isWritable: false },\n    { pubkey: userLpVault, isSigner: false, isWritable: true },\n    { pubkey: lockLpVault, isSigner: false, isWritable: true },\n    { pubkey: poolVaultA, isSigner: false, isWritable: true },\n    { pubkey: poolVaultB, isSigner: false, isWritable: true },\n    { pubkey: metadataAccount, isSigner: false, isWritable: true },\n    { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: METADATA_PROGRAM_ID, isSigner: false, isWritable: false },\n  ];\n  const dataLayout = struct([u64(\"lpAmount\"), bool(\"withMetadata\")]);\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      lpAmount,\n      withMetadata,\n    },\n    data,\n  );\n  const aData = Buffer.from([...anchorDataBuf.lockCpLiquidity, ...data]);\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: aData,\n  });\n}\n\nexport function collectCpFeeInstruction({\n  programId,\n  nftOwner,\n  auth,\n  nftAccount,\n  lockPda,\n  poolId,\n  mintLp,\n  userVaultA,\n  userVaultB,\n  poolVaultA,\n  poolVaultB,\n  mintA,\n  mintB,\n  lockLpVault,\n  lpFeeAmount,\n  cpmmProgram,\n  cpmmAuthProgram,\n}: {\n  programId: PublicKey;\n  nftOwner: PublicKey;\n  auth: PublicKey;\n  nftMint: PublicKey;\n  nftAccount: PublicKey;\n  lockPda: PublicKey;\n  poolId: PublicKey;\n  mintLp: PublicKey;\n  userVaultA: PublicKey;\n  userVaultB: PublicKey;\n  poolVaultA: PublicKey;\n  poolVaultB: PublicKey;\n  mintA: PublicKey;\n  mintB: PublicKey;\n  lockLpVault: PublicKey;\n  lpFeeAmount: BN;\n  cpmmProgram?: PublicKey;\n  cpmmAuthProgram?: PublicKey;\n}): TransactionInstruction {\n  const keys = [\n    { pubkey: auth, isSigner: false, isWritable: false },\n    { pubkey: nftOwner, isSigner: true, isWritable: false },\n    // { pubkey: nftMint, isSigner: false, isWritable: true },\n    { pubkey: nftAccount, isSigner: false, isWritable: true },\n    { pubkey: lockPda, isSigner: false, isWritable: true },\n    { pubkey: cpmmProgram ?? CREATE_CPMM_POOL_PROGRAM, isSigner: false, isWritable: false },\n    { pubkey: cpmmAuthProgram ?? CREATE_CPMM_POOL_AUTH, isSigner: false, isWritable: false },\n    { pubkey: poolId, isSigner: false, isWritable: true },\n    { pubkey: mintLp, isSigner: false, isWritable: true },\n    { pubkey: userVaultA, isSigner: false, isWritable: true },\n    { pubkey: userVaultB, isSigner: false, isWritable: true },\n    { pubkey: poolVaultA, isSigner: false, isWritable: true },\n    { pubkey: poolVaultB, isSigner: false, isWritable: true },\n    { pubkey: mintA, isSigner: false, isWritable: false },\n    { pubkey: mintB, isSigner: false, isWritable: false },\n    { pubkey: lockLpVault, isSigner: false, isWritable: true },\n    // { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },\n    { pubkey: MEMO_PROGRAM_ID2, isSigner: false, isWritable: false },\n  ];\n  const dataLayout = struct([u64(\"lpFeeAmount\")]);\n  const data = Buffer.alloc(dataLayout.span);\n  dataLayout.encode(\n    {\n      lpFeeAmount,\n    },\n    data,\n  );\n  const aData = Buffer.from([...anchorDataBuf.collectCpFee, ...data]);\n  return new TransactionInstruction({\n    keys,\n    programId,\n    data: aData,\n  });\n}","import { PublicKey } from \"@solana/web3.js\";\nimport { findProgramAddress } from \"../../common/txTool/txUtils\";\n\nconst AUTH_SEED = Buffer.from(\"vault_and_lp_mint_auth_seed\", \"utf8\");\nconst AMM_CONFIG_SEED = Buffer.from(\"amm_config\", \"utf8\");\nconst POOL_SEED = Buffer.from(\"pool\", \"utf8\");\nconst POOL_LP_MINT_SEED = Buffer.from(\"pool_lp_mint\", \"utf8\");\nconst POOL_VAULT_SEED = Buffer.from(\"pool_vault\", \"utf8\");\nconst OBSERVATION_SEED = Buffer.from(\"observation\", \"utf8\");\n\nexport function getPdaPoolAuthority(programId: PublicKey): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([AUTH_SEED], programId);\n}\n\nexport function getCpmmPdaAmmConfigId(\n  programId: PublicKey,\n  index: number,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([AMM_CONFIG_SEED, u16ToBytes(index)], programId);\n}\n\nexport function getCpmmPdaPoolId(\n  programId: PublicKey,\n  ammConfigId: PublicKey,\n  mintA: PublicKey,\n  mintB: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_SEED, ammConfigId.toBuffer(), mintA.toBuffer(), mintB.toBuffer()], programId);\n}\n\nexport function getPdaLpMint(\n  programId: PublicKey,\n  poolId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_LP_MINT_SEED, poolId.toBuffer()], programId);\n}\n\nexport function getPdaVault(\n  programId: PublicKey,\n  poolId: PublicKey,\n  mint: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([POOL_VAULT_SEED, poolId.toBuffer(), mint.toBuffer()], programId);\n}\n\nexport function getPdaObservationId(\n  programId: PublicKey,\n  poolId: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([OBSERVATION_SEED, poolId.toBuffer()], programId);\n}\n\nfunction u16ToBytes(num: number): Uint8Array {\n  const arr = new ArrayBuffer(2);\n  const view = new DataView(arr);\n  view.setUint16(0, num, false);\n  return new Uint8Array(arr);\n}\n\nexport function getCreatePoolKeys({\n  poolId: propPoolId,\n  programId,\n  configId,\n  mintA,\n  mintB,\n}: {\n  poolId?: PublicKey;\n  programId: PublicKey;\n  configId: PublicKey;\n  mintA: PublicKey;\n  mintB: PublicKey;\n}): {\n  poolId: PublicKey;\n  configId: PublicKey;\n  authority: PublicKey;\n  lpMint: PublicKey;\n  vaultA: PublicKey;\n  vaultB: PublicKey;\n  observationId: PublicKey;\n} {\n  // const configId = getCpmmPdaAmmConfigId(programId, 0).publicKey;\n  const authority = getPdaPoolAuthority(programId).publicKey;\n  const poolId = propPoolId || getCpmmPdaPoolId(programId, configId, mintA, mintB).publicKey;\n  const lpMint = getPdaLpMint(programId, poolId).publicKey;\n  const vaultA = getPdaVault(programId, poolId, mintA).publicKey;\n  const vaultB = getPdaVault(programId, poolId, mintB).publicKey;\n  const observationId = getPdaObservationId(programId, poolId).publicKey;\n\n  return {\n    poolId,\n    configId,\n    authority,\n    lpMint,\n    vaultA,\n    vaultB,\n    observationId,\n  };\n}\n\nexport const LOCK_LIQUIDITY_SEED = Buffer.from(\"locked_liquidity\", \"utf8\");\n\nexport function getCpLockPda(\n  programId: PublicKey,\n  mint: PublicKey,\n): {\n  publicKey: PublicKey;\n  nonce: number;\n} {\n  return findProgramAddress([LOCK_LIQUIDITY_SEED, mint.toBuffer()], programId);\n}\n","import { blob, bool, publicKey, seq, struct, u16, u64, u8, u128 } from \"../../marshmallow\";\n\nexport const CpmmConfigInfoLayout = struct([\n  blob(8),\n  u8(\"bump\"),\n  bool(\"disableCreatePool\"),\n  u16(\"index\"),\n  u64(\"tradeFeeRate\"),\n  u64(\"protocolFeeRate\"),\n  u64(\"fundFeeRate\"),\n  u64(\"createPoolFee\"),\n\n  publicKey(\"protocolOwner\"),\n  publicKey(\"fundOwner\"),\n  seq(u64(), 16),\n]);\n\nexport const CpmmPoolInfoLayout = struct([\n  blob(8),\n\n  publicKey(\"configId\"),\n  publicKey(\"poolCreator\"),\n  publicKey(\"vaultA\"),\n  publicKey(\"vaultB\"),\n\n  publicKey(\"mintLp\"),\n  publicKey(\"mintA\"),\n  publicKey(\"mintB\"),\n\n  publicKey(\"mintProgramA\"),\n  publicKey(\"mintProgramB\"),\n\n  publicKey(\"observationId\"),\n\n  u8(\"bump\"),\n  u8(\"status\"),\n\n  u8(\"lpDecimals\"),\n  u8(\"mintDecimalA\"),\n  u8(\"mintDecimalB\"),\n\n  u64(\"lpAmount\"),\n  u64(\"protocolFeesMintA\"),\n  u64(\"protocolFeesMintB\"),\n  u64(\"fundFeesMintA\"),\n  u64(\"fundFeesMintB\"),\n  u64(\"openTime\"),\n\n  seq(u64(), 32),\n]);\n","import { Connection, PublicKey, Signer, Transaction, TransactionInstruction } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport BN from \"bn.js\";\nimport { findProgramAddress, forecastTransactionSize, getMultipleAccountsInfo } from \"@/common\";\nimport { blob, publicKey, seq, struct, u64, u8 } from \"@/marshmallow\";\nimport { Token } from \"@/module\";\nimport ModuleBase from \"../moduleBase\";\n\nexport interface SHOW_INFO {\n  programId: PublicKey;\n  poolId: PublicKey;\n  ammId: PublicKey;\n  ownerAccountId: PublicKey;\n  snapshotLpAmount: BN;\n\n  openTime: number;\n  endTime: number;\n\n  project: typeof Utils1216.VERSION_PROJECT[number];\n\n  canClaim: boolean;\n  canClaimErrorType: canClaimErrorType;\n\n  tokenInfo: {\n    mintAddress: PublicKey;\n    mintVault: PublicKey;\n    mintDecimals: number;\n    perLpLoss: BN;\n    debtAmount: BN;\n  }[];\n}\n\nexport type canClaimErrorType = \"outOfOperationalTime\" | \"alreadyClaimIt\" | undefined;\n\nexport default class Utils1216 extends ModuleBase {\n  static CLAIMED_NUM = 3;\n  static POOL_LAYOUT = struct([\n    blob(8),\n    u8(\"bump\"),\n    u8(\"status\"),\n    u64(\"openTime\"),\n    u64(\"endTime\"),\n    publicKey(\"ammId\"),\n\n    seq(\n      struct([\n        u8(\"mintDecimals\"),\n        publicKey(\"mintAddress\"),\n        publicKey(\"mintVault\"),\n        u64(\"perLpLoss\"),\n        u64(\"totalClaimedAmount\"),\n      ]),\n      Utils1216.CLAIMED_NUM,\n      \"tokenInfo\",\n    ),\n    seq(u64(), 10, \"padding\"),\n  ]);\n\n  static OWNER_LAYOUT = struct([\n    blob(8),\n    u8(\"bump\"),\n    u8(\"version\"),\n    publicKey(\"poolId\"),\n    publicKey(\"owner\"),\n    u64(\"lpAmount\"),\n\n    seq(\n      struct([publicKey(\"mintAddress\"), u64(\"debtAmount\"), u64(\"claimedAmount\")]),\n      Utils1216.CLAIMED_NUM,\n      \"tokenInfo\",\n    ),\n    seq(u64(), 4, \"padding\"),\n  ]);\n\n  static DEFAULT_POOL_ID = [\n    \"58oQChx4yWmvKdwLLZzBi4ChoCc2fqCUWBkwMihLYQo2\",\n    \"6UmmUiYoBjSrhakAobJw8BvkmJtDVxaeBtbt7rxWo1mg\",\n    \"AVs9TA4nWDzfPJE9gGVNJMVhcQy3V9PGazuz33BfG2RA\",\n    \"DVa7Qmb5ct9RCpaU7UTpSaf3GVMYz17vNVU67XpdCRut\",\n    \"7XawhbbxtsRcQA8KTkHT9f9nc6d69UwqCDh6U5EEbEmX\",\n    \"6a1CsrpeZubDjEJE9s1CMVheB6HWM5d7m1cj2jkhyXhj\",\n    \"EoNrn8iUhwgJySD1pHu8Qxm5gSQqLK3za4m8xzD2RuEb\",\n    \"AceAyRTWt4PyB2pHqf2qhDgNZDtKVNaxgL8Ru3V4aN1P\",\n    \"6tmFJbMk5yVHFcFy7X2K8RwHjKLr6KVFLYXpgpBNeAxB\",\n  ].map((i) => new PublicKey(i));\n\n  static SEED_CONFIG = {\n    pool: {\n      id: Buffer.from(\"pool_seed\", \"utf8\"),\n    },\n    owner: {\n      id: Buffer.from(\"user_claim_seed\", \"utf8\"),\n    },\n  };\n\n  static VERSION_PROJECT = [undefined, \"Francium\", \"Tulip\", \"Larix\"] as const;\n\n  // pda\n  static getPdaPoolId(\n    programId: PublicKey,\n    ammId: PublicKey,\n  ): {\n    publicKey: PublicKey;\n    nonce: number;\n  } {\n    return findProgramAddress([Utils1216.SEED_CONFIG.pool.id, ammId.toBuffer()], programId);\n  }\n\n  static getPdaOwnerId(\n    programId: PublicKey,\n    poolId: PublicKey,\n    owner: PublicKey,\n    version: number,\n  ): {\n    publicKey: PublicKey;\n    nonce: number;\n  } {\n    return findProgramAddress(\n      [\n        Utils1216.SEED_CONFIG.owner.id,\n        poolId.toBuffer(),\n        owner.toBuffer(),\n        // new BN(version).toBuffer()\n        Buffer.from(new BN(version).toArray()),\n      ],\n      programId,\n    );\n  }\n\n  static async getAllInfo({\n    connection,\n    programId,\n    poolIds,\n    wallet,\n    chainTime,\n  }: {\n    connection: Connection;\n    programId: PublicKey;\n    poolIds: PublicKey[];\n    wallet: PublicKey;\n    chainTime: number;\n  }): Promise<SHOW_INFO[]> {\n    if (poolIds.length === 0) return [];\n\n    const allPoolPda = poolIds.map((id) => Utils1216.getPdaPoolId(programId, id).publicKey);\n\n    const allOwnerPda: PublicKey[] = [];\n    for (let itemVersion = 0; itemVersion < Utils1216.VERSION_PROJECT.length; itemVersion++) {\n      allOwnerPda.push(\n        ...allPoolPda.map((id) => Utils1216.getPdaOwnerId(programId, id, wallet, itemVersion).publicKey),\n      );\n    }\n\n    const pdaInfo = await getMultipleAccountsInfo(connection, [...allPoolPda, ...allOwnerPda]);\n\n    const info: SHOW_INFO[] = [];\n    for (let index = 0; index < pdaInfo.length; index++) {\n      const version = Math.floor(index / poolIds.length);\n      const i = index % poolIds.length;\n\n      const itemPoolId = allPoolPda[i];\n      const itemOwnerId = allOwnerPda[index];\n      const itemPoolInfoS = pdaInfo[i];\n      const itemOwnerInfoS = pdaInfo[poolIds.length + index];\n      if (!(itemPoolInfoS && itemOwnerInfoS)) continue;\n      if (\n        itemPoolInfoS.data.length !== Utils1216.POOL_LAYOUT.span ||\n        itemOwnerInfoS.data.length !== Utils1216.OWNER_LAYOUT.span\n      )\n        continue;\n\n      const itemPoolInfo = Utils1216.POOL_LAYOUT.decode(itemPoolInfoS.data);\n      const itemOwnerInfo = Utils1216.OWNER_LAYOUT.decode(itemOwnerInfoS.data);\n\n      const openTime = itemPoolInfo.openTime.toNumber();\n      const endTime = itemPoolInfo.endTime.toNumber();\n\n      const hasCanClaimToken =\n        itemOwnerInfo.tokenInfo.map((i) => i.debtAmount.gt(new BN(0))).filter((i) => !i).length !== 3;\n      const inCanClaimTime = chainTime > openTime && chainTime < endTime && itemPoolInfo.status === 1;\n\n      const canClaim = hasCanClaimToken && inCanClaimTime;\n\n      info.push({\n        programId,\n        poolId: itemPoolId,\n        ammId: itemPoolInfo.ammId,\n        ownerAccountId: itemOwnerId,\n        snapshotLpAmount: itemOwnerInfo.lpAmount,\n\n        project: Utils1216.VERSION_PROJECT[version],\n\n        openTime,\n        endTime,\n\n        canClaim,\n        canClaimErrorType: !hasCanClaimToken ? \"alreadyClaimIt\" : !inCanClaimTime ? \"outOfOperationalTime\" : undefined,\n\n        tokenInfo: itemPoolInfo.tokenInfo.map((itemPoolToken, i) => ({\n          mintAddress: itemPoolToken.mintAddress,\n          mintVault: itemPoolToken.mintVault,\n          mintDecimals: itemPoolToken.mintDecimals,\n          perLpLoss: itemPoolToken.perLpLoss,\n          debtAmount: itemOwnerInfo.tokenInfo[i].debtAmount.add(itemOwnerInfo.tokenInfo[i].claimedAmount),\n        })),\n      });\n    }\n\n    return info;\n  }\n\n  public async makeClaimTransaction({\n    poolInfo,\n    ownerInfo,\n    feePayer,\n  }: {\n    connection: Connection;\n    poolInfo: SHOW_INFO;\n    ownerInfo: {\n      wallet?: PublicKey;\n      associatedOnly: boolean;\n    };\n    feePayer?: PublicKey;\n  }): Promise<\n    {\n      transaction: Transaction;\n      signer: Signer[];\n    }[]\n  > {\n    if (!ownerInfo.wallet) this.scope.checkOwner();\n    const txBuilder = this.createTxBuilder(feePayer);\n    const wallet = ownerInfo.wallet || this.scope.ownerPubKey;\n\n    const ownerVaultList: PublicKey[] = [];\n    for (const itemToken of poolInfo.tokenInfo) {\n      const { account, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n        mint: itemToken.mintAddress,\n        owner: this.scope.ownerPubKey,\n        notUseTokenAccount: itemToken.mintAddress.equals(Token.WSOL.mint),\n        createInfo: {\n          payer: wallet,\n          amount: 0,\n        },\n        skipCloseAccount: !itemToken.mintAddress.equals(Token.WSOL.mint),\n\n        associatedOnly: itemToken.mintAddress.equals(Token.WSOL.mint) ? false : ownerInfo.associatedOnly,\n      });\n      instructionParams && txBuilder.addInstruction(instructionParams);\n      ownerVaultList.push(account!);\n    }\n\n    txBuilder.addInstruction({\n      instructions: [\n        Utils1216.makeClaimInstruction({\n          programId: poolInfo.programId,\n          poolInfo,\n          ownerInfo: {\n            wallet,\n            ownerPda: poolInfo.ownerAccountId,\n            claimAddress: ownerVaultList,\n          },\n        }),\n      ],\n    });\n    const { transaction, signers } = txBuilder.build();\n\n    return [\n      {\n        transaction,\n        signer: signers,\n      },\n    ];\n  }\n\n  public async makeClaimAllTransaction({\n    poolInfos,\n    ownerInfo,\n    feePayer,\n  }: {\n    poolInfos: SHOW_INFO[];\n    ownerInfo: {\n      wallet?: PublicKey;\n      associatedOnly: boolean;\n    };\n    feePayer?: PublicKey;\n  }): Promise<\n    {\n      transaction: Transaction;\n      signer: Signer[];\n    }[]\n  > {\n    const txBuilder = this.createTxBuilder(feePayer);\n    const wallet = ownerInfo.wallet || this.scope.ownerPubKey;\n\n    const tempNewVault: { [mint: string]: PublicKey } = {};\n\n    for (const poolInfo of poolInfos) {\n      const ownerVaultList: PublicKey[] = [];\n      for (const itemToken of poolInfo.tokenInfo) {\n        const { account: tempVault, instructionParams } = await this.scope.account.getOrCreateTokenAccount({\n          mint: itemToken.mintAddress,\n          owner: this.scope.ownerPubKey,\n          notUseTokenAccount: itemToken.mintAddress.equals(Token.WSOL.mint),\n          createInfo: {\n            payer: wallet,\n            amount: 0,\n          },\n          skipCloseAccount: !itemToken.mintAddress.equals(Token.WSOL.mint),\n\n          associatedOnly: itemToken.mintAddress.equals(Token.WSOL.mint) ? false : ownerInfo.associatedOnly,\n        });\n        instructionParams && txBuilder.addInstruction(instructionParams);\n\n        if (tempVault) {\n          tempNewVault[itemToken.mintAddress.toString()] = tempVault;\n          ownerVaultList.push(tempVault);\n        }\n      }\n\n      txBuilder.addInstruction({\n        instructions: [\n          Utils1216.makeClaimInstruction({\n            programId: poolInfo.programId,\n            poolInfo,\n            ownerInfo: {\n              wallet,\n              ownerPda: poolInfo.ownerAccountId,\n              claimAddress: ownerVaultList,\n            },\n          }),\n        ],\n      });\n    }\n\n    const { transaction, signers } = txBuilder.build();\n    const instructions = txBuilder.allInstructions;\n\n    if (forecastTransactionSize(instructions, [wallet, ...signers.map((s) => s.publicKey)])) {\n      return [\n        {\n          transaction,\n          signer: signers,\n        },\n      ];\n    } else {\n      return [\n        {\n          transaction: new Transaction().add(...instructions.slice(0, txBuilder.AllTxData.instructions.length - 1)),\n          signer: signers,\n        },\n        {\n          transaction: new Transaction().add(...instructions.slice(txBuilder.AllTxData.instructions.length - 1)),\n          signer: [],\n        },\n        { transaction: new Transaction().add(...txBuilder.AllTxData.endInstructions), signer: [] },\n      ];\n    }\n  }\n\n  static makeClaimInstruction({\n    programId,\n    poolInfo,\n    ownerInfo,\n  }: {\n    programId: PublicKey;\n\n    poolInfo: SHOW_INFO;\n    ownerInfo: {\n      wallet: PublicKey;\n      ownerPda: PublicKey;\n      claimAddress: PublicKey[];\n    };\n  }): TransactionInstruction {\n    const dataLayout = struct([]);\n\n    const keys = [\n      { pubkey: ownerInfo.wallet, isSigner: true, isWritable: true },\n      { pubkey: poolInfo.poolId, isSigner: false, isWritable: true },\n      { pubkey: ownerInfo.ownerPda, isSigner: false, isWritable: true },\n\n      ...ownerInfo.claimAddress.map((i) => ({ pubkey: i, isSigner: false, isWritable: true })),\n      ...poolInfo.tokenInfo.map(({ mintVault }) => ({ pubkey: mintVault, isSigner: false, isWritable: true })),\n\n      { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n    ];\n\n    const data = Buffer.alloc(dataLayout.span);\n    dataLayout.encode({}, data);\n    const aData = Buffer.from([...[10, 66, 208, 184, 161, 6, 191, 98], ...data]);\n\n    return new TransactionInstruction({\n      keys,\n      programId,\n      data: aData,\n    });\n  }\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport { MintLayout, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\n\nimport { ApiV3Token, JupTokenType } from \"@/api/type\";\nimport ModuleBase, { ModuleBaseProps } from \"../moduleBase\";\nimport { LoadParams } from \"../type\";\n\nimport { SOL_INFO } from \"./constant\";\nimport { TokenInfo } from \"./type\";\n\nexport default class TokenModule extends ModuleBase {\n  private _tokenList: TokenInfo[] = [];\n  private _tokenMap: Map<string, TokenInfo> = new Map();\n  private _blackTokenMap: Set<string> = new Set();\n  private _mintGroup: { official: Set<string>; jup: Set<string>; extra: Set<string> } = {\n    official: new Set(),\n    jup: new Set(),\n    extra: new Set(),\n  };\n  private _whiteMap: Set<string> = new Set();\n  private _extraTokenList: TokenInfo[] = [];\n\n  constructor(params: ModuleBaseProps) {\n    super(params);\n  }\n\n  public async load(params?: LoadParams & { type?: JupTokenType }): Promise<void> {\n    this.checkDisabled();\n    const { forceUpdate = false, type = JupTokenType.Strict } = params || {};\n    const { mintList, blacklist, whiteList } = await this.scope.fetchV3TokenList(forceUpdate);\n    const jup = await this.scope.fetchJupTokenList(forceUpdate);\n    // reset all data\n    this._tokenList = [];\n    this._tokenMap = new Map();\n    this._blackTokenMap = new Set(blacklist);\n    this._mintGroup = { official: new Set(), jup: new Set(), extra: new Set() };\n    this._whiteMap = new Set(whiteList);\n\n    this._tokenMap.set(SOL_INFO.address, SOL_INFO);\n    this._mintGroup.official.add(SOL_INFO.address);\n\n    mintList.forEach((token) => {\n      if (this._blackTokenMap.has(token.address)) return;\n      this._tokenMap.set(token.address, {\n        ...token,\n        type: \"sega\",\n        priority: 2,\n        programId:\n          token.programId ??\n          (token.tags.includes(\"token-2022\") ? TOKEN_2022_PROGRAM_ID.toBase58() : TOKEN_PROGRAM_ID.toBase58()),\n      });\n      this._mintGroup.official.add(token.address);\n    });\n\n    jup.forEach((token) => {\n      if (this._blackTokenMap.has(token.address) || this._tokenMap.has(token.address)) return;\n      this._tokenMap.set(token.address, {\n        ...token,\n        type: \"jupiter\",\n        priority: 1,\n        programId:\n          token.programId ??\n          (token.tags.includes(\"token-2022\") ? TOKEN_2022_PROGRAM_ID.toBase58() : TOKEN_PROGRAM_ID.toBase58()),\n        tags: token.freezeAuthority ? [...(token.tags || []), \"hasFreeze\"] : token.tags,\n      });\n      this._mintGroup.jup.add(token.address);\n    });\n\n    this._extraTokenList.forEach((token) => {\n      if (this._blackTokenMap.has(token.address) || this._tokenMap.has(token.address)) return;\n      this._tokenMap.set(token.address, {\n        ...token,\n        type: \"extra\",\n        priority: 1,\n        programId:\n          token.programId || token.tags.includes(\"token-2022\")\n            ? TOKEN_2022_PROGRAM_ID.toBase58()\n            : TOKEN_PROGRAM_ID.toBase58(),\n      });\n      this._mintGroup.extra.add(token.address);\n    });\n\n    this._tokenList = Array.from(this._tokenMap).map((data) => data[1]);\n  }\n\n  get tokenList(): TokenInfo[] {\n    return this._tokenList;\n  }\n  get tokenMap(): Map<string, TokenInfo> {\n    return this._tokenMap;\n  }\n  get blackTokenMap(): Set<string> {\n    return this._blackTokenMap;\n  }\n  get mintGroup(): { official: Set<string>; jup: Set<string> } {\n    return this._mintGroup;\n  }\n  get whiteListMap(): Set<string> {\n    return this._whiteMap;\n  }\n\n  /** === util functions === */\n\n  public async getTokenInfo(mint: string | PublicKey): Promise<ApiV3Token> {\n    if (!mint) throw new Error(\"please input mint\");\n    const mintStr = mint.toString();\n    const info = this._tokenMap.get(mintStr);\n    if (info) return info;\n    if (mintStr.toLocaleUpperCase() === \"SOL\") return SOL_INFO;\n\n    const apiTokenInfo = (await this.scope.api.getTokenInfo([mintStr]))[0];\n    if (apiTokenInfo) {\n      this._mintGroup.extra.add(mintStr);\n      this._tokenMap.set(mintStr, { ...apiTokenInfo, priority: 2 });\n      return apiTokenInfo;\n    }\n\n    const onlineInfo = await this.scope.connection.getAccountInfo(new PublicKey(mintStr));\n    if (!onlineInfo) throw new Error(`mint address not found: ${mintStr}`);\n    const data = MintLayout.decode(onlineInfo.data);\n    const mintSymbol = mintStr.toString().substring(0, 6);\n    const fullInfo = {\n      chainId: 101,\n      address: mintStr,\n      programId: onlineInfo.owner.toBase58(),\n      logoURI: \"\",\n      symbol: mintSymbol,\n      name: mintSymbol,\n      decimals: data.decimals,\n      tags: [],\n      extensions: {},\n      priority: 0,\n      type: \"unknown\",\n    };\n    this._mintGroup.extra.add(mintStr);\n    this._tokenMap.set(mintStr, fullInfo);\n    return fullInfo;\n  }\n}\n"],"mappings":"2zBACA,OAAS,SAAAA,OAAa,SCDtB,OAAOC,OAA8B,QCArC,OAA8C,aAAAC,OAAiB,kBCA/D,OAAS,OAAAC,GAAK,OAAAC,OAAW,SAUlB,IAAMC,GAAN,KAAa,CAGlB,YAAYC,EAA+C,CACzD,KAAK,SAAWA,EAAO,WAAa,OAAYA,EAAO,SAAW,EAClE,KAAK,KAAOA,EAAO,IACrB,CAEA,IAAI,MAAMC,EAAoB,CAC5B,KAAK,SAAWA,CAClB,CACA,IAAI,MAAe,CACjB,OAAO,KAAK,IAAI,EAAE,SAAS,CAC7B,CACA,IAAI,YAAqB,CACvB,OAAO,KAAK,IACd,CAEQ,WAAWC,EAA0B,CAC3C,OAAOA,GAAS,KAAK,QACvB,CAEO,SAASC,EAAe,CAC7B,OAAK,KAAK,WAAW,CAAc,GACnC,QAAQ,MAAM,KAAK,KAAM,KAAK,KAAM,mBAAoB,GAAGA,CAAK,EACzD,MAFsC,IAG/C,CAEO,gBAAgBA,EAAe,CAEpC,IAAMC,EAAMD,EAAM,IAAKE,GAAS,OAAOA,GAAQ,SAAW,KAAK,UAAUA,CAAG,EAAIA,CAAI,EAAE,KAAK,IAAI,EAC/F,MAAM,IAAI,MAAMD,CAAG,CACrB,CAEO,WAAWD,EAAe,CAC/B,OAAK,KAAK,WAAW,CAAgB,GACrC,QAAQ,KAAK,KAAK,KAAM,KAAK,KAAM,qBAAsB,GAAGA,CAAK,EAC1D,MAFwC,IAGjD,CAEO,QAAQA,EAAe,CAC5B,OAAK,KAAK,WAAW,CAAa,GAClC,QAAQ,KAAK,KAAK,KAAM,KAAK,KAAM,kBAAmB,GAAGA,CAAK,EACvD,MAFqC,IAG9C,CAEO,SAASA,EAAe,CAC7B,OAAK,KAAK,WAAW,CAAc,GACnC,QAAQ,MAAM,KAAK,KAAM,KAAK,KAAM,mBAAoB,GAAGA,CAAK,EACzD,MAFsC,IAG/C,CACF,EAEMG,GAAkD,CAAC,EACnDC,GAAmD,CAAC,EAEnD,SAASC,EAAaC,EAA4B,CACvD,IAAIC,EAASC,GAAIL,GAAeG,CAAU,EAC1C,GAAI,CAACC,EAAQ,CAEX,IAAMT,EAAWU,GAAIJ,GAAcE,CAAU,EAE7CC,EAAS,IAAIX,GAAO,CAAE,KAAMU,EAAY,SAAAR,CAAS,CAAC,EAClDW,GAAIN,GAAeG,EAAYC,CAAM,CACvC,CAEA,OAAOA,CACT,CDzEA,OAAS,aAAAG,GAAW,oBAAAC,GAAkB,wBAAAC,GAAsB,cAAAC,OAAkB,oBAqB9E,IAAMC,GAASC,EAAa,uBAAuB,EAEnD,SAAsBC,GACpBC,EACAC,EACAC,EACyC,QAAAC,EAAA,sBACzC,GAAM,CACJ,aAAAC,EACA,WAAAC,EAAa,YACb,WAAAC,EAAa,GACf,EAAIC,EAAA,CACF,aAAc,IACXL,GAGCM,EAAcC,GAAWR,EAAYK,CAAU,EACjDI,EAA4C,IAAI,MAAMF,EAAY,MAAM,EAAE,KAAK,CAAC,CAAC,EAErF,GAAIJ,EAAc,CAChB,IAAMO,EAAQH,EAAY,IAAKI,IAEtB,CACL,WAAY,sBACZ,KAHWZ,EAAW,WAAW,CAACY,EAAK,IAAKC,GAAQA,EAAI,SAAS,CAAC,CAAC,EAAGR,EAAY,QAAQ,CAI5F,EACD,EAEKS,EAASL,GAAWE,EAAO,EAAE,EAKnCD,GAH0D,MACxD,MAAM,QAAQ,IAAII,EAAO,IAAWC,GAAGZ,EAAA,sBAAG,aAAOH,EAAmB,iBAAiBe,CAAC,GAAC,CAAC,GACxF,KAAK,GACkB,IAAKC,IACxBA,EAAU,OACZnB,GAAO,aAAa,wDAAwDmB,EAAU,MAAM,OAAO,EAAE,EAEhGA,EAAU,OAAO,MAAM,IAAKC,GAAgB,CACjD,GAAIA,EAAa,CACf,GAAM,CAAE,KAAAC,EAAM,WAAAC,EAAY,SAAAC,EAAU,MAAAC,EAAO,UAAAC,CAAU,EAAIL,EAEzD,OAAIC,EAAK,SAAW,GAAKA,EAAK,CAAC,IAAM,UAAUrB,GAAO,aAAa,wCAAwC,EAEpG,CACL,KAAM,OAAO,KAAKqB,EAAK,CAAC,EAAG,QAAQ,EACnC,WAAAC,EACA,SAAAC,EACA,MAAO,IAAIG,GAAUF,CAAK,EAC1B,UAAAC,CACF,CACF,CACA,OAAO,IACT,CAAC,EACF,CACH,KACE,IAAI,CACFZ,EAAW,MAAM,QAAQ,IACvBF,EAAY,IAAKI,GAASZ,EAAW,wBAAwBY,EAAMP,CAAU,CAAC,CAChF,CACF,OAASmB,EAAO,CACVA,aAAiB,OACnB3B,GAAO,aAAa,wDAAwD2B,EAAM,OAAO,EAAE,CAE/F,CAGF,OAAOd,EAAQ,KAAK,CACtB,GAEA,SAAsBe,GACpBzB,EACA0B,EACAxB,EAC8D,QAAAC,EAAA,sBAC9D,IAAMwB,EAAuB,MAAM5B,GACjCC,EACA0B,EAAyB,IAAKE,GAAMA,EAAE,MAAM,EAC5C1B,CACF,EAEA,OAAOwB,EAAyB,IAAI,CAACE,EAAGC,IAASC,EAAAvB,EAAA,GAAKqB,GAAL,CAAQ,YAAaD,EAAqBE,CAAG,CAAE,EAAE,CACpG,GASA,SAAsBE,GAAuBC,EAQC,QAAAC,EAAA,yBARD,CAC3C,WAAAC,EACA,MAAAC,EACA,OAAAC,CACF,EAI8C,CA3H9C,IAAAC,EAAAC,EAAAC,EA4HE,GAAIJ,EAAM,SAAW,EAAG,MAAO,CAAC,EAChC,IAAMK,EAAY,MAAMC,GACtBP,EACAC,EAAM,IAAKO,IAAO,CAAE,OAAQC,GAAUD,CAAC,CAAE,EAAE,EAC3CN,CACF,EAEMQ,EAA0C,CAAC,EACjD,QAAWF,KAAKF,EAAW,CACzB,GAAI,CAACE,EAAE,aAAeA,EAAE,YAAY,KAAK,OAASG,GAAW,CAC3D,QAAQ,IAAI,uBAAwBH,EAAE,OAAO,SAAS,CAAC,EACvD,QACF,CACA,IAAMI,EAAIC,GAAWL,EAAE,OAAQA,EAAE,aAAaL,EAAAK,EAAE,cAAF,YAAAL,EAAe,KAAK,EAClEO,EAAMF,EAAE,OAAO,SAAS,CAAC,EAAIM,EAAAC,EAAA,GACxBH,GADwB,CAE3B,YAAWR,EAAAI,EAAE,cAAF,YAAAJ,EAAe,QAASY,GACnC,WAAWX,EAAAY,GAAqBL,CAAC,IAAtB,KAAAP,EAA2B,MACxC,EACF,CACA,OAAAK,EAAMQ,GAAU,QAAQ,SAAS,CAAC,EAAIR,EAAMS,EAAS,SAAS,CAAC,EAExDT,CACT,GEnJA,OAAOU,OAAQ,QACf,OAAOC,OAAa,aCDpB,OAAOC,OAAU,SACjB,OAAOC,OAAQ,QCCf,OAAOC,OAAe,WAsFtB,IAAMC,GAGFD,GACGE,GAAQD,GC5Ff,OAAOE,OAAU,SACjB,OAAOC,OAAQ,QACf,OAAOC,OAAc,mBCFrB,OAAOC,OAAQ,QAUf,IAAMC,GAAW,iBAEV,SAASC,EAAkBC,EAAyB,CACzD,IAAMC,EAASC,EAAa,wBAAwB,EAEpD,GAAIF,aAAiBG,GACnB,OAAOH,EAGT,GAAI,OAAOA,GAAU,SAAU,CAC7B,GAAIA,EAAM,MAAM,YAAY,EAC1B,OAAO,IAAIG,GAAGH,CAAK,EAErBC,EAAO,aAAa,gCAAgCD,CAAK,EAAE,CAC7D,CAEA,OAAI,OAAOA,GAAU,UACfA,EAAQ,GACVC,EAAO,aAAa,kCAAkCD,CAAK,EAAE,GAG3DA,GAASF,IAAYE,GAAS,CAACF,KACjCG,EAAO,aAAa,iCAAiCD,CAAK,EAAE,EAGvD,IAAIG,GAAG,OAAOH,CAAK,CAAC,GAGzB,OAAOA,GAAU,SACZ,IAAIG,GAAGH,EAAM,SAAS,CAAC,GAEhCC,EAAO,MAAM,+BAA+BD,CAAK,EAAE,EAC5C,IAAIG,GAAG,CAAC,EACjB,CDjCA,IAAMC,GAASC,EAAa,iBAAiB,EAEvCC,GAAMC,GAASC,EAAI,EAGnBC,GAAUF,GAASG,EAAQ,EAE3BC,GAAwB,CAC3B,EAAsBF,GAAQ,WAC9B,EAAyBA,GAAQ,cACjC,EAAoBA,GAAQ,QAC/B,EAEMG,GAAkB,CACrB,EAAsBJ,GAAK,UAC3B,EAAyBA,GAAK,YAC9B,EAAoBA,GAAK,OAC5B,EAEaK,GAAN,MAAMC,CAAS,CAIb,YAAYC,EAAyBC,EAA4B,IAAIC,GAAG,CAAC,EAAG,CACjF,KAAK,UAAYC,EAAkBH,CAAS,EAC5C,KAAK,YAAcG,EAAkBF,CAAW,CAClD,CAEA,IAAW,UAAe,CACxB,OAAO,KAAK,UAAU,IAAI,KAAK,WAAW,CAC5C,CAEO,QAAmB,CACxB,OAAO,IAAIF,EAAS,KAAK,YAAa,KAAK,SAAS,CACtD,CAEO,IAAIK,EAA0C,CACnD,IAAMC,EAAcD,aAAiBL,EAAWK,EAAQ,IAAIL,EAASI,EAAkBC,CAAK,CAAC,EAE7F,OAAI,KAAK,YAAY,GAAGC,EAAY,WAAW,EACtC,IAAIN,EAAS,KAAK,UAAU,IAAIM,EAAY,SAAS,EAAG,KAAK,WAAW,EAG1E,IAAIN,EACT,KAAK,UAAU,IAAIM,EAAY,WAAW,EAAE,IAAIA,EAAY,UAAU,IAAI,KAAK,WAAW,CAAC,EAC3F,KAAK,YAAY,IAAIA,EAAY,WAAW,CAC9C,CACF,CAEO,IAAID,EAA0C,CACnD,IAAMC,EAAcD,aAAiBL,EAAWK,EAAQ,IAAIL,EAASI,EAAkBC,CAAK,CAAC,EAE7F,OAAI,KAAK,YAAY,GAAGC,EAAY,WAAW,EACtC,IAAIN,EAAS,KAAK,UAAU,IAAIM,EAAY,SAAS,EAAG,KAAK,WAAW,EAG1E,IAAIN,EACT,KAAK,UAAU,IAAIM,EAAY,WAAW,EAAE,IAAIA,EAAY,UAAU,IAAI,KAAK,WAAW,CAAC,EAC3F,KAAK,YAAY,IAAIA,EAAY,WAAW,CAC9C,CACF,CAEO,IAAID,EAA0C,CACnD,IAAMC,EAAcD,aAAiBL,EAAWK,EAAQ,IAAIL,EAASI,EAAkBC,CAAK,CAAC,EAE7F,OAAO,IAAIL,EAAS,KAAK,UAAU,IAAIM,EAAY,SAAS,EAAG,KAAK,YAAY,IAAIA,EAAY,WAAW,CAAC,CAC9G,CAEO,IAAID,EAA0C,CACnD,IAAMC,EAAcD,aAAiBL,EAAWK,EAAQ,IAAIL,EAASI,EAAkBC,CAAK,CAAC,EAE7F,OAAO,IAAIL,EAAS,KAAK,UAAU,IAAIM,EAAY,WAAW,EAAG,KAAK,YAAY,IAAIA,EAAY,SAAS,CAAC,CAC9G,CAEO,cACLC,EACAC,EAAiB,CAAE,eAAgB,EAAG,EACtCC,IACQ,CACH,OAAO,UAAUF,CAAiB,GAAGjB,GAAO,aAAa,GAAGiB,CAAiB,qBAAqB,EACnGA,GAAqB,GAAGjB,GAAO,aAAa,GAAGiB,CAAiB,mBAAmB,EAEvFZ,GAAQ,IAAI,CAAE,UAAWY,EAAoB,EAAG,SAAUV,GAAsBY,CAAQ,CAAE,CAAC,EAC3F,IAAMC,EAAW,IAAIf,GAAQ,KAAK,UAAU,SAAS,CAAC,EACnD,IAAI,KAAK,YAAY,SAAS,CAAC,EAC/B,oBAAoBY,CAAiB,EACxC,OAAOG,EAAS,SAASA,EAAS,cAAc,EAAGF,CAAM,CAC3D,CAEO,QACLG,EACAH,EAAiB,CAAE,eAAgB,EAAG,EACtCC,IACQ,CACR,OAAK,OAAO,UAAUE,CAAa,GAAGrB,GAAO,aAAa,GAAGqB,CAAa,qBAAqB,EAC3FA,EAAgB,GAAGrB,GAAO,aAAa,GAAGqB,CAAa,eAAe,EAE1EnB,GAAI,GAAKmB,EACTnB,GAAI,GAAKM,GAAgBW,CAAQ,GAAK,EAC/B,IAAIjB,GAAI,KAAK,UAAU,SAAS,CAAC,EAAE,IAAI,KAAK,YAAY,SAAS,CAAC,EAAE,SAASmB,EAAeH,CAAM,CAC3G,CAEO,QAAkB,CACvB,OAAO,KAAK,UAAU,OAAO,CAC/B,CACF,EFvGA,IAAMI,GAASC,EAAa,aAAa,EAEnCC,GAAMC,GAASC,EAAI,EIdzB,OAAS,aAAAC,OAAiB,kBAC1B,OAAS,oBAAAC,OAAwB,oBAG1B,IAAMC,GAAsB,CACjC,QAAS,IACT,QAASF,GAAU,QAAQ,SAAS,EACpC,UAAWC,GAAiB,SAAS,EACrC,SAAU,EACV,OAAQ,MACR,KAAM,SACN,QAAS,iFACT,KAAM,CAAC,EACP,SAAU,EACV,KAAM,OACN,WAAY,CACV,YAAa,QACf,CACF,EAEaE,GAAwB,CACnC,QAAS,IACT,QAAS,8CACT,UAAWF,GAAiB,SAAS,EACrC,SAAU,EACV,OAAQ,OACR,KAAM,cACN,QAAS,iFACT,KAAM,CAAC,EACP,SAAU,EACV,KAAM,OACN,WAAY,CACV,YAAa,QACf,CACF,EClCA,OAAS,aAAAG,OAAiB,kBCA1B,OAAsB,aAAAC,EAAW,iBAAAC,GAAe,sBAAAC,OAA0B,kBAC1E,OAAS,oBAAAC,OAAwB,oBAQ1B,SAASC,GAAY,CAAE,OAAAC,EAAQ,SAAAC,EAAW,GAAO,WAAAC,EAAa,EAAK,EAAkC,CAC1G,MAAO,CACL,OAAAF,EACA,WAAAE,EACA,SAAAD,CACF,CACF,CAEO,IAAME,GAA0B,CACrCJ,GAAY,CAAE,OAAQD,GAAkB,WAAY,EAAM,CAAC,EAC3DC,GAAY,CAAE,OAAQH,GAAc,UAAW,WAAY,EAAM,CAAC,EAClEG,GAAY,CAAE,OAAQF,GAAoB,WAAY,EAAM,CAAC,CAC/D,EAIO,SAASO,GAA0B,CACxC,UAAWC,EACX,aAAAC,CACF,EAGc,CACZ,IAAMC,EAAYC,GAAkBH,EAAU,SAAS,CAAC,EAExD,GAAIE,aAAqBZ,EACvB,OAAIW,GAAgBC,EAAU,OAAOE,EAAO,EAAUC,EAC/CH,EAGT,GAAID,GAAgBC,EAAU,SAAS,IAAME,GAAQ,SAAS,EAAG,OAAOC,EAExE,GAAI,OAAOH,GAAc,SAAU,CACjC,GAAIA,IAAcZ,EAAU,QAAQ,SAAS,EAAG,OAAOA,EAAU,QACjE,GAAI,CAEF,OADY,IAAIA,EAAUY,CAAS,CAErC,OAAQI,EAAA,CACN,MAAM,IAAI,MAAM,oBAAoB,CACtC,CACF,CAEA,MAAM,IAAI,MAAM,oBAAoB,CACtC,CAEO,SAASH,GAAkBI,EAA+B,CAC/D,GAAI,CACF,OAAO,IAAIjB,EAAUiB,CAAC,CACxB,OAASD,EAAG,CACV,OAAOC,CACT,CACF,CAEO,IAAMC,GAAkB,IAAIlB,EAAU,6CAA6C,EAC7EmB,GAAmB,IAAInB,EAAU,6CAA6C,EAC9EoB,GAAkB,IAAIpB,EAAU,6CAA6C,EAC7EqB,GAAmB,IAAIrB,EAAU,6CAA6C,EAC9EsB,GAAsB,IAAItB,EAAU,6CAA6C,EACjFuB,GAAyB,IAAIvB,EAAU,6CAA6C,EACpFwB,GAAoBvB,GAAc,UAElCwB,GAAU,IAAIzB,EAAU,8CAA8C,EACtE0B,GAAU,IAAI1B,EAAU,8CAA8C,EACtE2B,GAAU,IAAI3B,EAAU,6CAA6C,EACrE4B,GAAW,IAAI5B,EAAU,8CAA8C,EACvE6B,GAAW,IAAI7B,EAAU,8CAA8C,EACvE8B,GAAW,IAAI9B,EAAU,6CAA6C,EACtE+B,GAAY,IAAI/B,EAAU,8CAA8C,EACxEgC,GAAW,IAAIhC,EAAU,6CAA6C,EACtEiC,GAAU,IAAIjC,EAAU,6CAA6C,EACrEkC,GAAU,IAAIlC,EAAU,8CAA8C,EACtEmC,GAAU,IAAInC,EAAU,8CAA8C,EACtEe,EAAW,IAAIf,EAAU,6CAA6C,EACtEc,GAAUd,EAAU,QAE1B,SAASoC,GAAUC,EAA+B,CACvD,OAAO5B,GAA0B,CAAE,UAAW4B,EAAM,aAAc,EAAK,CAAC,CAC1E,CDrEO,IAAMC,GAAN,MAAMA,EAAM,CAgBV,YAAY,CAAE,KAAAC,EAAM,SAAAC,EAAU,OAAAC,EAAQ,KAAAC,EAAM,SAAAC,EAAW,GAAO,YAAAC,EAAc,EAAM,EAAe,CACtG,GAAIL,IAASM,GAAQ,SAAS,GAAMN,aAAgBO,IAAaD,GAAQ,OAAON,CAAI,EAAI,CACtF,KAAK,SAAWQ,GAAW,SAC3B,KAAK,OAASA,GAAW,OACzB,KAAK,KAAOA,GAAW,KACvB,KAAK,KAAO,IAAID,GAAUC,GAAW,OAAO,EAC5C,KAAK,YAAc,GACnB,MACF,CAEA,KAAK,SAAWP,EAChB,KAAK,OAASC,GAAUF,EAAK,SAAS,EAAE,UAAU,EAAG,CAAC,EACtD,KAAK,KAAOG,GAAQH,EAAK,SAAS,EAAE,UAAU,EAAG,CAAC,EAClD,KAAK,KAAOI,EAAWG,GAAU,QAAUE,GAA0B,CAAE,UAAWT,CAAK,CAAC,EACxF,KAAK,YAAcK,CACrB,CAEO,OAAOK,EAAuB,CAEnC,OAAI,OAASA,EACJ,GAEF,KAAK,KAAK,OAAOA,EAAM,IAAI,CACpC,CACF,EAxCaX,GAOY,KAAc,IAAIA,GAAMY,EAAAC,EAAA,GAC1CJ,IAD0C,CAE7C,KAAMA,GAAW,OACnB,EAAC,EAVI,IAAMK,EAANd,GEJA,IAAMe,GAAN,MAAMA,EAAS,CAgBb,YAAY,CAAE,SAAAC,EAAU,OAAAC,EAAS,UAAW,KAAAC,EAAO,SAAU,EAAkB,CACpF,KAAK,SAAWF,EAChB,KAAK,OAASC,EACd,KAAK,KAAOC,CACd,CAEO,OAAOC,EAA0B,CACtC,OAAO,OAASA,CAClB,CACF,EAzBaJ,GAQY,IAAgB,IAAIA,GAASK,EAAQ,EARvD,IAAMC,GAANN,GCbP,OAAOO,OAAQ,QAIR,IAAMC,GAAe,IAAIC,GAAS,IAAIC,GAAG,GAAG,CAAC,EAEvCC,GAAN,cAAsBF,EAAS,CAC7B,cAAcG,EAAoB,EAAGC,EAAiBC,EAA6B,CACxF,OAAO,KAAK,IAAIN,EAAY,EAAE,cAAcI,EAAmBC,EAAQC,CAAQ,CACjF,CAEO,QAAQC,EAAgB,EAAGF,EAAiBC,EAA6B,CAC9E,OAAO,KAAK,IAAIN,EAAY,EAAE,QAAQO,EAAeF,EAAQC,CAAQ,CACvE,CACF,ECPA,IAAME,GAASC,EAAa,YAAY,ECPxC,OAAS,aAAAC,OAAiB,kBAC1B,OAAOC,OAAQ,QXaR,IAAMC,GAAU,IAAIC,GAAG,CAAC,EAClBC,GAAS,IAAID,GAAG,CAAC,EACjBE,GAAS,IAAIF,GAAG,CAAC,EACjBG,GAAW,IAAIH,GAAG,CAAC,EACnBI,GAAU,IAAIJ,GAAG,CAAC,EAClBK,GAAS,IAAIL,GAAG,EAAE,EAClBM,GAAS,IAAIN,GAAG,GAAG,EACnBO,GAAU,IAAIP,GAAG,GAAI,EACrBQ,GAAW,IAAIR,GAAG,GAAK,EYlB7B,SAASS,GAAcC,EAAUC,EAAY,EAAGC,EAAe,CAAC,EAAU,CAC/E,IAAMC,EAAM,CAAC,GAAGH,CAAG,EACnB,GAAIC,GAAa,EAAG,OAAOC,EAC3B,KAAOC,EAAI,QAAQD,EAAM,KAAKC,EAAI,OAAO,EAAGF,CAAS,CAAC,EACtD,OAAOC,CACT,CCLO,IAAME,GAAN,MAAMC,CAAM,CAGjB,YAAYC,EAAe,CACzB,KAAK,OAASA,CAChB,CAEA,IAAI,WAAuB,CACzB,OAAID,EAAM,UAAU,KAAK,MAAM,EACtB,KAAK,OAAO,UAGd,KAAK,MACd,CAEA,IAAI,QAA6B,CAC/B,OAAOA,EAAM,UAAU,KAAK,MAAM,EAAI,KAAK,OAAS,MACtD,CAEA,IAAI,WAAqB,CACvB,OAAOA,EAAM,UAAU,KAAK,MAAM,CACpC,CAEA,IAAI,aAAuB,CACzB,OAAOA,EAAM,YAAY,KAAK,MAAM,CACtC,CAEA,OAAO,UAAUC,EAAiC,CAChD,OAAQA,EAAkB,YAAc,MAC1C,CAEA,OAAO,YAAYA,EAAmC,CACpD,MAAO,CAACD,EAAM,UAAUC,CAAK,CAC/B,CACF,ECtCA,OAAS,aAAAC,OAAiB,kBAE1B,OAAS,oBAAAC,OAAwB,oBCFjC,OAEE,wBAAAC,GAGA,WAAAC,GACA,aAAAC,GAEA,eAAAC,GAEA,sBAAAC,GACA,wBAAAC,OACK,kBCPA,IAAMC,EAAkB,CAC7B,cAAe,gBACf,YAAa,cACb,UAAW,YACX,aAAc,eACd,eAAgB,iBAChB,SAAU,WACV,OAAQ,SAER,WAAY,aACZ,mBAAoB,qBAEpB,oBAAqB,sBACrB,oBAAqB,sBAGrB,eAAgB,iBAChB,iBAAkB,mBAClB,qBAAsB,uBACtB,qBAAsB,uBACtB,kBAAmB,oBACnB,eAAgB,iBAChB,gBAAiB,kBACjB,eAAgB,iBAChB,cAAe,gBACf,kBAAmB,oBACnB,iBAAkB,mBAClB,wBAAyB,0BAEzB,UAAW,YACX,kBAAmB,oBACnB,qBAAsB,uBACtB,sBAAuB,wBACvB,gBAAiB,kBACjB,iBAAkB,mBAClB,gBAAiB,kBACjB,cAAe,gBAEf,kBAAmB,oBACnB,qBAAsB,uBACtB,sBAAuB,wBACvB,gBAAiB,kBACjB,iBAAkB,mBAElB,UAAW,YACX,WAAY,aACZ,WAAY,aAEZ,cAAe,gBACf,eAAgB,iBAChB,mBAAoB,qBAEpB,eAAgB,iBAEhB,cAAe,gBACf,eAAgB,iBAChB,mBAAoB,qBAEpB,cAAe,gBACf,eAAgB,iBAChB,aAAc,eACd,cAAe,gBACf,uBAAwB,yBACxB,sBAAuB,wBAEvB,eAAgB,iBAChB,iBAAkB,mBAClB,sBAAuB,wBACvB,eAAgB,iBAChB,gBAAiB,kBAEjB,WAAY,aACZ,mBAAoB,qBACpB,YAAa,aACf,ED5DA,OAAS,oBAAAC,OAAwB,oBAEjC,IAAMC,GAASC,EAAa,aAAa,EAE5BC,GAAkB,KAExB,SAASC,GAAiBC,EAG/B,CACA,IAAMC,EAAgC,CAAC,EACjCC,EAAqB,CAAC,EAC5B,OAAIF,EAAO,gBACTC,EAAI,KAAKE,GAAqB,oBAAoB,CAAE,cAAeH,EAAO,aAAc,CAAC,CAAC,EAC1FE,EAAS,KAAKE,EAAgB,mBAAmB,GAE/CJ,EAAO,QACTC,EAAI,KAAKE,GAAqB,oBAAoB,CAAE,MAAOH,EAAO,KAAM,CAAC,CAAC,EAC1EE,EAAS,KAAKE,EAAgB,mBAAmB,GAG5C,CACL,aAAcH,EACd,iBAAkBC,CACpB,CACF,CAEA,SAAsBG,GAAmBC,EAAwBC,EAA+C,QAAAC,EAAA,sBA9ChH,IAAAC,EAAAC,EA+CE,IAAMC,EAAaJ,GAAA,KAAAA,EAAmB,YACtC,OAAQG,EAAA,MAAMD,EAAAH,EAAW,qBAAX,YAAAG,EAAA,KAAAH,EAAgC,CAAE,WAAAK,CAAW,KAAnD,YAAAD,EAAwD,SAClE,GAEA,SAAsBE,GAAmBN,EAAwBO,EAA+B,QAAAL,EAAA,sBAC9F,OAAAF,EAAW,qBAAqB,CAACO,CAAI,CAAC,EAC/B,IAAI,QAAQ,CAACC,EAASC,IAAW,CACtC,IAAMC,EAAK,WAAWD,EAAQ,GAAS,EACvCT,EAAW,YACTO,EACCI,GAAoB,CAEnB,GADA,aAAaD,CAAE,EACX,CAACC,EAAgB,IAAK,CACxBH,EAAQ,EAAE,EACV,MACF,CACAC,EAAO,OAAO,OAAOE,EAAgB,IAAK,CAAE,KAAAJ,CAAK,CAAC,CAAC,CACrD,EACA,WACF,CACF,CAAC,CACH,GAKO,SAASK,GAAwBC,EAAwCC,EAA+B,CACzGD,EAAa,OAAS,GAAGvB,GAAO,aAAa,6BAA6BuB,EAAa,SAAS,CAAC,EAAE,EACnGC,EAAQ,OAAS,GAAGxB,GAAO,aAAa,yBAAyBwB,EAAQ,SAAS,CAAC,EAAE,EAEzF,IAAMC,EAAc,IAAIC,GACxBD,EAAY,gBAAkB,mCAC9BA,EAAY,SAAWD,EAAQ,CAAC,EAChCC,EAAY,IAAI,GAAGF,CAAY,EAE/B,GAAI,CACF,OAAO,OAAO,KAAKE,EAAY,UAAU,CAAE,iBAAkB,EAAM,CAAC,CAAC,EAAE,SAAS,QAAQ,EAAE,OAASvB,EACrG,OAASyB,EAAO,CACd,MAAO,EACT,CACF,CAqFO,SAASC,GACdC,EACAC,EAIA,CACA,GAAM,CAACC,EAAWC,CAAK,EAAIC,GAAU,uBAAuBJ,EAAOC,CAAS,EAC5E,MAAO,CAAE,UAAAC,EAAW,MAAAC,CAAM,CAC5B,CAkEO,SAASE,GAAkB,CAChC,aAAAC,EACA,MAAAC,EACA,QAAAC,CACF,EAIY,CACV,OAAOC,GAAwBH,EAAc,CAACC,EAAO,GAAGC,CAAO,CAAC,CAClE,CAEO,SAASE,GAAc,CAC5B,aAAAJ,EACA,MAAAC,EACA,0BAAAI,EACA,gBAAAC,EAAkBC,GAAQ,SAAS,EAAE,UAAU,SAAS,CAC1D,EAKY,CAOV,IAAMC,EANqB,IAAIC,GAAmB,CAChD,SAAUR,EACV,gBAAAK,EACA,aAAAN,CACF,CAAC,EAEoC,mBAAmB,OAAO,OAAOK,GAAA,KAAAA,EAA6B,CAAC,CAAC,CAAC,EACtG,GAAI,CAEF,OADoB,OAAO,KAAK,IAAIK,GAAqBF,CAAS,EAAE,UAAU,CAAC,EAAE,SAAS,QAAQ,EAAE,OAC/EG,EACvB,OAASC,EAAO,CACd,MAAO,EACT,CACF,CAoBO,IAAMC,GAAYC,GACnB,OAAO,SAASA,CAAG,EACdA,EACEA,aAAe,WACjB,OAAO,KAAKA,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAEtD,OAAO,KAAKA,CAAG,EAIbC,GAAcC,GAA4D,CACrF,IAAIC,EAAaD,EAAY,UAAU,CAAE,qBAAsB,GAAO,iBAAkB,EAAM,CAAC,EAC3FA,aAAuBE,KAAsBD,EAAaJ,GAASI,CAAU,GACjF,GAAI,CACF,OAAOA,aAAsB,OAASA,EAAW,SAAS,QAAQ,EAAI,OAAO,KAAKA,CAAU,EAAE,SAAS,QAAQ,CACjH,OAAQ,GACN,OAAOA,EAAW,SAAS,QAAQ,CACrC,CACF,EAEO,SAASE,GAAcC,EAAgE,CAC5F,IAAMC,EAAsB,CAAC,EAC7B,OAAAD,EAAa,QAASJ,GAAgB,CAChCA,aAAuBM,KACpBN,EAAY,kBAAiBA,EAAY,gBAAkBO,GAAiB,SAAS,GACrFP,EAAY,WAAUA,EAAY,SAAWQ,GAAQ,SAAS,EAAE,YAEvEH,EAAU,KAAKN,GAAWC,CAAW,CAAC,CACxC,CAAC,EACD,QAAQ,IAAI,sBAAuBK,CAAS,EAErCA,CACT,CDzUO,SAASI,GACdC,EACAC,EACAC,EAIA,CACA,OAAOC,GACL,CAACH,EAAM,SAAS,GAAIE,GAAA,KAAAA,EAAaE,IAAkB,SAAS,EAAGH,EAAK,SAAS,CAAC,EAC9E,IAAII,GAAU,8CAA8C,CAC9D,CACF,CGlBA,OAAS,aAAAC,OAAiB,kBAEnB,IAAMC,GAA2B,IAAID,GAAU,6CAA6C,EACtFE,GAAwB,IAAIF,GAAU,8CAA8C,EACpFG,GAA2B,IAAIH,GAAU,8CAA8C,EAEvFI,GAA+B,IAAIJ,GAAU,6CAA6C,EAC1FK,GAA4B,IAAIL,GAAU,8CAA8C,EACxFM,GAA+B,IAAIN,GAAU,8CAA8C,EAUjG,IAAMO,GAAoB,CAC/B,aAAcC,GAAU,QACxB,SAAUA,GAAU,QACpB,yBAA0BC,GAC1B,sBAAuBC,GACvB,yBAA0BC,EAC5B,ECvBA,OAAOC,OAAQ,QAMf,IAAMC,GAAQ,IAyDP,SAASC,GACdC,EACAC,EACAC,EACAC,EACsB,CACtB,GAAIF,IAAe,OACjB,MAAO,CACL,OAAAD,EACA,IAAK,OACL,eAAgB,MAClB,EAEF,IAAMI,EAAYC,EAAAC,EAAA,GACbL,GADa,CAEhB,iBAAkB,CAChB,MAAO,OAAOA,EAAW,iBAAiB,KAAK,EAC/C,WAAY,OAAOA,EAAW,iBAAiB,UAAU,EACzD,uBAAwBA,EAAW,iBAAiB,sBACtD,EACA,iBAAkB,CAChB,MAAO,OAAOA,EAAW,iBAAiB,KAAK,EAC/C,WAAY,OAAOA,EAAW,iBAAiB,UAAU,EACzD,uBAAwBA,EAAW,iBAAiB,sBACtD,CACF,GAEMM,EACJL,EAAU,MAAQE,EAAU,iBAAiB,MAAQA,EAAU,iBAAmBA,EAAU,iBACxFI,EAAS,IAAIC,GAAGF,EAAa,WAAW,SAAS,CAAC,EAClDG,EACJR,EAAU,MAAQE,EAAU,iBAAiB,OACvC,OAAOA,EAAU,iBAAiB,KAAK,EAAIF,EAAU,aAAeA,EAAU,cAAgB,IAAO,IACvG,OAEN,GAAIC,EACF,GAAII,EAAa,yBAA2BI,GAAO,CACjD,IAAMC,EAAY,IAAIH,GAAGF,EAAa,WAAW,SAAS,CAAC,EAC3D,MAAO,CACL,OAAQP,EAAO,IAAIY,CAAS,EAC5B,IAAKA,EACL,eAAAF,CACF,CACF,KAAO,CACL,IAAMG,EAAWC,GAAUd,EAAO,IAAI,IAAIS,GAAGE,EAAK,CAAC,EAAG,IAAIF,GAAGE,GAAQJ,EAAa,sBAAsB,CAAC,EAEnGK,EAAY,IAAIH,GAAGF,EAAa,WAAW,SAAS,CAAC,EACrDQ,EAAUF,EAAS,IAAIb,CAAM,EAAE,GAAGY,CAAS,EAAIZ,EAAO,IAAIY,CAAS,EAAIC,EAEvEG,EAAOF,GAAUC,EAAQ,IAAI,IAAIN,GAAGF,EAAa,sBAAsB,CAAC,EAAG,IAAIE,GAAGE,EAAK,CAAC,EACxFM,EAAMD,EAAK,GAAGR,CAAM,EAAIA,EAASQ,EACvC,MAAO,CACL,OAAQD,EACR,IAAAE,EACA,eAAAP,CACF,CACF,KACK,CACL,IAAMM,EAAOF,GAAUd,EAAO,IAAI,IAAIS,GAAGF,EAAa,sBAAsB,CAAC,EAAG,IAAIE,GAAGE,EAAK,CAAC,EACvFM,EAAMD,EAAK,GAAGR,CAAM,EAAIA,EAASQ,EAEvC,MAAO,CACL,OAAAhB,EACA,IAAAiB,EACA,eAAAP,CACF,CACF,CACF,CAYO,SAASQ,GAAUC,EAASC,EAAa,CAC9C,GAAM,CAAE,IAAAC,EAAK,IAAAC,CAAI,EAAIH,EAAI,OAAOC,CAAG,EAEnC,OAAIE,EAAI,GAAG,IAAIC,GAAG,CAAC,CAAC,EACXF,EAAI,IAAI,IAAIE,GAAG,CAAC,CAAC,EAEjBF,CAEX,CCvJA,OAAqB,aAAAG,GAAW,6BAAAC,OAAiC,kBAOjE,SAAsBC,GAA2BC,EAM3B,QAAAC,EAAA,yBAN2B,CAC/C,WAAAC,EACA,QAAAC,CACF,EAGsB,CACpB,IAAMC,EAAY,MAAMC,GACtBH,EACA,CAAC,GAAG,IAAI,IAAYC,EAAQ,IAAKG,GAAMA,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAKA,GAAM,IAAIC,GAAUD,CAAC,CAAC,CACpF,EAEME,EAAoB,CAAC,EAC3B,QAASF,EAAI,EAAGA,EAAIH,EAAQ,OAAQG,IAAK,CACvC,IAAMG,EAAOL,EAAUE,CAAC,EAClBI,EAAMP,EAAQG,CAAC,EACrB,GAAI,CAACG,EAAM,SACX,IAAME,EAAgB,IAAIC,GAA0B,CAClD,IAAAF,EACA,MAAOE,GAA0B,YAAYH,EAAK,IAAI,CACxD,CAAC,EACDD,EAAQE,EAAI,SAAS,CAAC,EAAIC,EAC1BE,GAAmBH,EAAI,SAAS,CAAC,EAAIC,CACvC,CAEA,OAAOH,CACT,GAEO,IAAMK,GAA+B,CAAC,ECnC7C,OAGE,aAAAC,GACA,6BAAAC,GAGA,iBAAAC,GACA,eAAAC,GAEA,sBAAAC,GACA,wBAAAC,OACK,kBACP,OAAOC,OAAW,QAqHlB,IAAMC,GAAgB,IAETC,GAAN,KAAgB,CAerB,YAAYC,EAAuB,CAZnC,KAAQ,aAAyC,CAAC,EAClD,KAAQ,gBAA4C,CAAC,EACrD,KAAQ,mBAA+B,CAAC,EACxC,KAAQ,QAAoB,CAAC,EAC7B,KAAQ,iBAA6B,CAAC,EACtC,KAAQ,oBAAgC,CAAC,EAQvC,KAAK,WAAaA,EAAO,WACzB,KAAK,SAAWA,EAAO,SACvB,KAAK,oBAAsBA,EAAO,oBAClC,KAAK,MAAQA,EAAO,MACpB,KAAK,QAAUA,EAAO,QACtB,KAAK,oBAAsBA,EAAO,oBAClC,KAAK,kBAAoB,CAAC,CAACA,EAAO,iBACpC,CAEA,IAAI,WAOF,CACA,MAAO,CACL,aAAc,KAAK,aACnB,gBAAiB,KAAK,gBACtB,QAAS,KAAK,QACd,iBAAkB,KAAK,iBACvB,oBAAqB,KAAK,oBAC1B,mBAAoB,KAAK,kBAC3B,CACF,CAEA,IAAI,iBAA4C,CAC9C,MAAO,CAAC,GAAG,KAAK,aAAc,GAAG,KAAK,eAAe,CACvD,CAEa,wBAAmE,QAAAC,EAAA,sBAnLlF,IAAAC,EAoLI,IAAMC,GACJ,MAAMC,GAAM,IAAuB,0DAAoE,GACvG,KACI,CAAE,IAAAC,CAAI,GAAIH,EAAAC,GAAA,YAAAA,EAAO,MAAP,KAAAD,EAAc,CAAC,EAC/B,GAAKG,EACL,MAAO,CACL,MAAO,IACP,cAAe,KAAK,IAAI,KAAK,KAAMA,EAAM,IAAW,GAAM,EAAG,IAAK,CACpE,CACF,GAEO,uBAAuBC,EAAuC,CACnE,GAAIA,EAAQ,CACV,GAAM,CAAE,aAAAC,EAAc,iBAAAC,CAAiB,EAAIC,GAAiBH,CAAM,EAClE,YAAK,aAAa,QAAQ,GAAGC,CAAY,EACzC,KAAK,iBAAiB,QAAQ,GAAGC,CAAgB,EAC1C,EACT,CACA,MAAO,EACT,CAEO,kBAAkBE,EAAkC,CAzM7D,IAAAR,EA0MI,OAAIQ,GACF,KAAK,gBAAgB,KACnBC,GAAc,SAAS,CACrB,YAAYT,EAAAQ,EAAU,WAAV,KAAAR,EAAsB,KAAK,SACvC,SAAU,IAAIU,GAAUF,EAAU,OAAO,EACzC,SAAU,OAAOA,EAAU,OAAO,SAAS,CAAC,CAC9C,CAAC,CACH,EACA,KAAK,oBAAoB,KAAKG,EAAgB,WAAW,EAClD,IAEF,EACT,CAEa,iBAAiBC,EAMZ,QAAAb,EAAA,yBANY,CAC5B,OAAQc,EACR,WAAAC,CACF,EAGkB,CAChB,GAAI,CACF,IAAMV,EAASS,IAAe,MAAM,KAAK,uBAAuB,GAChE,GAAI,KAAK,uBAAuBT,CAAM,EAAG,OACzCU,GAAc,KAAK,aAAa,QAAQ,GAAGA,CAAU,CACvD,OAAQC,EAAA,CACND,GAAc,KAAK,aAAa,QAAQ,GAAGA,CAAU,CACvD,CACF,GAEO,eAAe,CACpB,aAAAT,EAAe,CAAC,EAChB,gBAAAW,EAAkB,CAAC,EACnB,QAAAC,EAAU,CAAC,EACX,iBAAAX,EAAmB,CAAC,EACpB,oBAAAY,EAAsB,CAAC,EACvB,mBAAAC,EAAqB,CAAC,CACxB,EAAmC,CACjC,YAAK,aAAa,KAAK,GAAGd,CAAY,EACtC,KAAK,gBAAgB,KAAK,GAAGW,CAAe,EAC5C,KAAK,QAAQ,KAAK,GAAGC,CAAO,EAC5B,KAAK,iBAAiB,KAAK,GAAGX,CAAgB,EAC9C,KAAK,oBAAoB,KAAK,GAAGY,CAAmB,EACpD,KAAK,mBAAmB,KAAK,GAAGC,EAAmB,OAAQC,GAAYA,IAAYV,GAAU,QAAQ,SAAS,CAAC,CAAC,EACzG,IACT,CAEa,aAAsCE,EAMwB,QAAAb,EAAA,yBANxB,CACjD,UAAAsB,EACA,QAAAC,CACF,EAG2E,CACzE,OAAID,IAAc,EAAsB,MAAM,KAAK,QAAQE,EAAA,GAAMD,GAAW,CAAC,EAAI,EAC1E,KAAK,MAASA,CAAO,CAC9B,GAEO,MAA+BA,EAA8C,CApQtF,IAAAtB,EAqQI,IAAMwB,EAAc,IAAIC,GACxB,OAAI,KAAK,gBAAgB,QAAQD,EAAY,IAAI,GAAG,KAAK,eAAe,EACxEA,EAAY,SAAW,KAAK,UACxBxB,EAAA,KAAK,QAAL,MAAAA,EAAY,QAAU,CAAC,KAAK,QAAQ,KAAM0B,GAAMA,EAAE,UAAU,OAAO,KAAK,MAAO,SAAS,CAAC,GAC3F,KAAK,QAAQ,KAAK,KAAK,MAAM,MAAM,EAE9B,CACL,QAAS,KACT,YAAAF,EACA,QAAS,KAAK,QACd,iBAAkB,CAAC,GAAG,KAAK,iBAAkB,GAAG,KAAK,mBAAmB,EACxE,QAAgB1B,GAAWC,EAAA,sBAhRjC,IAAAC,EAiRQ,GAAM,CAAE,gBAAiB2B,EAAe,cAAAC,EAAgB,GAAM,eAAAC,CAAe,EAAI/B,GAAU,CAAC,EACtFgC,EAAkBH,GAAA,KAAAA,EAAkB,MAAMI,GAAmB,KAAK,WAAY,KAAK,mBAAmB,EAK5G,GAJAP,EAAY,gBAAkBM,EAC1B,KAAK,QAAQ,QAAQN,EAAY,KAAK,GAAG,KAAK,OAAO,EAEzDQ,GAAc,CAACR,CAAW,CAAC,GACvBxB,EAAA,KAAK,QAAL,MAAAA,EAAY,UAYd,MAAO,CACL,KAZW6B,EACT,MAAMI,GACN,KAAK,WACLT,EACA,KAAK,QAAQ,KAAME,GAAMA,EAAE,UAAU,OAAO,KAAK,MAAO,SAAS,CAAC,EAC9D,KAAK,QACL,CAAC,GAAG,KAAK,QAAS,KAAK,MAAM,MAAO,EACxC,CAAE,cAAAE,CAAc,CAClB,EACE,MAAM,KAAK,WAAW,mBAAmBJ,EAAY,UAAU,EAAG,CAAE,cAAAI,CAAc,CAAC,EAIrF,SAAUJ,CACZ,EAEF,GAAI,KAAK,oBAAqB,CAC5B,IAAMU,EAAM,MAAM,KAAK,oBAAoB,CAACV,CAAW,CAAC,EACxD,GAAI,KAAK,QAAQ,OACf,QAAWW,KAAQD,EACjB,GAAI,CACFC,EAAK,KAAK,GAAG,KAAK,OAAO,CAC3B,OAASpB,EAAG,CAEZ,CAGJ,MAAO,CACL,KAAM,MAAM,KAAK,WAAW,mBAAmBmB,EAAI,CAAC,EAAE,UAAU,EAAG,CAAE,cAAAN,CAAc,CAAC,EACpF,SAAUM,EAAI,CAAC,CACjB,CACF,CACA,MAAM,IAAI,MAAM,wEAAwE,CAC1F,GACA,QAASZ,GAAY,CAAC,CACxB,CACF,CAEO,aAAsCxB,EAGxB,CAjUvB,IAAAE,EAkUI,GAAM,CAAE,kBAAAoC,EAAoB,CAAC,EAAG,QAAAd,CAAQ,EAAIxB,EACtC,CAAE,YAAA0B,CAAY,EAAI,KAAK,MAAMF,CAAO,EAEpCe,EAAuBD,EAAkB,OAAQE,GAASA,EAAK,YAAY,aAAa,OAAS,CAAC,EAElGC,EAAiC,CAACf,EAAa,GAAGa,EAAqB,IAAKC,GAASA,EAAK,WAAW,CAAC,EACtGE,EAAyB,CAAC,KAAK,QAAS,GAAGH,EAAqB,IAAKC,GAASA,EAAK,OAAO,CAAC,EAC3FG,EAAgC,CACpC,GAAG,KAAK,iBACR,GAAGJ,EAAqB,IAAKC,GAASA,EAAK,gBAAgB,EAAE,KAAK,CACpE,EAEA,OAAItC,EAAA,KAAK,QAAL,MAAAA,EAAY,QACdwC,EAAW,QAASvB,GAAY,CACzBA,EAAQ,KAAMS,GAAMA,EAAE,UAAU,OAAO,KAAK,MAAO,SAAS,CAAC,GAAG,KAAK,QAAQ,KAAK,KAAK,MAAO,MAAO,CAC5G,CAAC,EAGI,CACL,QAAS,KACT,aAAca,EACd,QAASC,EACT,iBAAkBC,EAClB,QAAgBC,GAAwC3C,EAAA,sBAzV9D,IAAAC,EA0VQ,GAAM,CACJ,aAAA2C,EACA,WAAAC,EACA,YAAAC,EAAc,EACd,gBAAiBlB,EACjB,cAAAC,EAAgB,EAClB,EAAIc,GAAiB,CAAC,EAChBZ,EAAkBH,GAAA,KAAAA,EAAkB,MAAMI,GAAmB,KAAK,WAAY,KAAK,mBAAmB,EAC5G,IAAI/B,EAAA,KAAK,QAAL,MAAAA,EAAY,UAAW,CACzB,GAAI2C,EAAc,CAChB,IAAMG,EAAkB,CAAC,EACrBC,EAAI,EACR,QAAWC,KAAMT,EAAiB,CAEhC,GADA,EAAEQ,EACEA,GAAKF,EAAa,SACtB,IAAMI,EAAO,MAAMhB,GACjB,KAAK,WACLe,EACA,KAAK,QAAQ,KAAMtB,GAAMA,EAAE,UAAU,OAAO,KAAK,MAAO,SAAS,CAAC,EAC9D,KAAK,QACL,CAAC,GAAG,KAAK,QAAS,KAAK,MAAM,MAAO,EACxC,CAAE,cAAAE,CAAc,CAClB,EACAkB,EAAM,KAAKG,CAAI,CACjB,CAEA,MAAO,CACL,MAAAH,EACA,UAAWP,CACb,CACF,CACA,MAAO,CACL,MAAO,MAAM,MAAM,QAAQ,IACzBA,EAAgB,IAAWS,GAAOjD,EAAA,sBAChC,OAAAiD,EAAG,gBAAkBlB,EACd,MAAM,KAAK,WAAW,mBAAmBkB,EAAG,UAAU,EAAG,CAAE,cAAApB,CAAc,CAAC,CACnF,EAAC,CACH,EACA,UAAWW,CACb,CACF,CAEA,GAAI,KAAK,oBAAqB,CAC5B,IAAMW,EAAmBX,EAAgB,IAAI,CAACS,EAAIG,KAChDH,EAAG,gBAAkBlB,EACjBU,EAAWW,CAAG,EAAE,QAAQH,EAAG,KAAK,GAAGR,EAAWW,CAAG,CAAC,EAC/CH,EACR,EACDhB,GAAckB,CAAgB,EAC9B,IAAME,EAAY,MAAM,KAAK,oBAAoBF,CAAgB,EACjE,GAAIP,EAAc,CAChB,IAAII,EAAI,EACFM,EAAiC,CAAC,EAClCC,EAAc,IAA2BvD,EAAA,sBAC7C,GAAI,CAACqD,EAAUL,CAAC,EAAG,OACnB,IAAME,EAAO,MAAM,KAAK,WAAW,mBAAmBG,EAAUL,CAAC,EAAE,UAAU,EAAG,CAAE,cAAAnB,CAAc,CAAC,EACjGyB,EAAa,KAAK,CAAE,KAAAJ,EAAM,OAAQ,OAAQ,SAAUG,EAAUL,CAAC,CAAE,CAAC,EAClEH,GAAA,MAAAA,EAAa,CAAC,GAAGS,CAAY,GAC7BN,IACA,IAAIQ,EAAY,GAEZC,EAAkB,KACpBC,EAAgC,KAC5BC,EAAOC,GAA2C,CACtDH,IAAe,MAAQ,cAAcA,CAAU,EAC/CC,IAAmB,MAAQ,KAAK,WAAW,wBAAwBA,CAAc,EACjF,IAAMG,EAAcP,EAAa,UAAWL,GAAOA,EAAG,OAASC,CAAI,EACnE,GAAIW,EAAc,GAAI,CACpB,GAAIP,EAAaO,CAAW,EAAE,SAAW,SAAWP,EAAaO,CAAW,EAAE,SAAW,UACvF,OACFP,EAAaO,CAAW,EAAE,OAASD,EAAgB,IAAM,QAAU,SACrE,CACAf,GAAA,MAAAA,EAAa,CAAC,GAAGS,CAAY,GACxBM,EAAgB,KAAKL,EAAY,CACxC,EAEI,KAAK,oBACPE,EAAa,YAAY,IAAYzD,EAAA,sBAvarD,IAAAC,EAwakB,GAAIuD,EAAW,CACb,cAAcC,CAAW,EACzB,MACF,CACA,GAAI,CACF,IAAMK,EAAI,MAAM,KAAK,WAAW,eAAeZ,EAAM,CACnD,WAAY,YACZ,gCACF,CAAC,EACGY,IACFN,EAAY,GACZ,cAAcC,CAAW,EACzBE,EAAI,CAAE,MAAK1D,EAAA6D,EAAE,OAAF,YAAA7D,EAAQ,MAAO,IAAK,CAAC,EAChC,QAAQ,IAAI,iCAAkCiD,CAAI,EAEtD,OAASlC,EAAG,CACVwC,EAAY,GACZ,cAAcC,CAAW,EACzB,QAAQ,MAAM,0BAA2BzC,EAAGkC,CAAI,CAClD,CACF,GAAGrD,EAAa,GAElB6D,EAAiB,KAAK,WAAW,YAC/BR,EACCa,GAAW,CACV,GAAIP,EAAW,CACb,KAAK,WAAW,wBAAwBE,CAAe,EACvD,MACF,CACAF,EAAY,GACZG,EAAII,CAAM,CACZ,EACA,WACF,EACA,KAAK,WAAW,mBAAmBb,CAAI,CACzC,GACA,aAAMK,EAAY,EACX,CACL,MAAOD,EAAa,IAAKU,GAAMA,EAAE,IAAI,EACrC,UAAAX,CACF,CACF,KAAO,CACL,IAAMN,EAAkB,CAAC,EACzB,QAASC,EAAI,EAAGA,EAAIK,EAAU,OAAQL,GAAK,EAAG,CAC5C,IAAME,EAAO,MAAM,KAAK,WAAW,mBAAmBG,EAAUL,CAAC,EAAE,UAAU,EAAG,CAAE,cAAAnB,CAAc,CAAC,EACjGkB,EAAM,KAAKG,CAAI,CACjB,CACA,MAAO,CACL,MAAAH,EACA,UAAAM,CACF,CACF,CACF,CACA,MAAM,IAAI,MAAM,wEAAwE,CAC1F,GACA,QAAS9B,GAAW,CAAC,CACvB,CACF,CAEa,kBAAgEV,EAQ1C,QAAAb,EAAA,yBAR0C,CAC3E,kBAAAqC,EACA,UAAAf,EACA,QAAAC,CACF,EAImC,CACjC,OAAID,IAAc,EACR,MAAM,KAAK,eAAe,CAChC,kBAAmBe,EACnB,WAAYd,GAAW,CAAC,CAC1B,CAAC,EACI,KAAK,aAAgB,CAC1B,kBAAmBc,EACnB,QAAAd,CACF,CAAC,CACH,GAEa,QACX0C,EAMsC,QAAAjE,EAAA,sBA9f1C,IAAAkE,EA+fI,IAMIjE,EAAAgE,GAAS,CAAC,EALZ,kBAAAE,EAAmB,CAAC,EACpB,mBAAA/C,EAAqB,CAAC,EACtB,cAAAgD,EACA,gBAAiBC,CAngBvB,EAqgBQpE,EADCsB,EAAA+C,EACDrE,EADC,CAJH,mBACA,qBACA,gBACA,oBAGIsE,EAA4B/C,IAAA,GAC5B,KAAK,UAAY,SAAW,CAAC,EAAIgD,IAClCL,GAECM,EAAS,MAAM,KAAK,IAAI,IAAY,CAAC,GAAGrD,EAAoB,GAAG,KAAK,kBAAkB,CAAC,CAAC,EACxFsD,EAA4B,CAAC,EACnC,QAAWtC,KAAQqC,EACbF,EAA0BnC,CAAI,IAAM,QAAWsC,EAAa,KAAK,IAAI/D,GAAUyB,CAAI,CAAC,EAE1F,IAAMuC,EAAc,MAAMC,GAA2B,CAAE,WAAY,KAAK,WAAY,QAASF,CAAa,CAAC,EAC3G,OAAW,CAACG,EAAKC,CAAK,IAAK,OAAO,QAAQH,CAAW,EAAGJ,EAA0BM,CAAG,EAAIC,EAEzF,IAAMC,EAAkBX,EACpBzD,GAAU,QAAQ,SAAS,EAC3B0D,GAAA,KAAAA,EAAwB,MAAMrC,GAAmB,KAAK,WAAY,KAAK,mBAAmB,EAExFgD,EAAY,IAAIC,GAAmB,CACvC,SAAU,KAAK,SACf,gBAAAF,EACA,aAAc,CAAC,GAAG,KAAK,eAAe,CACxC,CAAC,EAAE,mBAAmB,OAAO,OAAOR,CAAyB,CAAC,GAE1DL,EAAA,KAAK,QAAL,MAAAA,EAAY,QAAU,CAAC,KAAK,QAAQ,KAAMvC,GAAMA,EAAE,UAAU,OAAO,KAAK,MAAO,SAAS,CAAC,GAC3F,KAAK,QAAQ,KAAK,KAAK,MAAM,MAAM,EACrC,IAAMF,EAAc,IAAIyD,GAAqBF,CAAS,EACtD,OAAAvD,EAAY,KAAK,KAAK,OAAO,EACtB,CACL,QAAS,KACT,YAAAA,EACA,QAAS,KAAK,QACd,iBAAkB,CAAC,GAAG,KAAK,iBAAkB,GAAG,KAAK,mBAAmB,EACxE,QAAgB1B,GAAWC,EAAA,sBAriBjC,IAAAC,EAsiBQ,GAAM,CAAE,cAAA4B,EAAgB,GAAM,eAAAC,CAAe,EAAI/B,GAAU,CAAC,EAE5D,GADAkC,GAAc,CAACR,CAAW,CAAC,GACvBxB,EAAA,KAAK,QAAL,MAAAA,EAAY,UAAW,CACzB,IAAMiD,EAAO,MAAM,KAAK,WAAW,gBAAgBzB,EAAa,CAAE,cAAAI,CAAc,CAAC,EACjF,OAAIC,IACF,MAAMqD,GAAmB,KAAK,WAAYjC,CAAI,GAGzC,CACL,KAAAA,EACA,SAAUzB,CACZ,CACF,CACA,GAAI,KAAK,oBAAqB,CAC5B,IAAMU,EAAM,MAAM,KAAK,oBAA0C,CAACV,CAAW,CAAC,EAC9E,GAAI,KAAK,QAAQ,OACf,QAAWW,KAAQD,EACjB,GAAI,CACFC,EAAK,KAAK,KAAK,OAAO,CACxB,OAASpB,EAAG,CAEZ,CAGJ,MAAO,CACL,KAAM,MAAM,KAAK,WAAW,gBAAgBmB,EAAI,CAAC,EAAG,CAAE,cAAAN,CAAc,CAAC,EACrE,SAAUM,EAAI,CAAC,CACjB,CACF,CACA,MAAM,IAAI,MAAM,wEAAwE,CAC1F,GACA,QAAUZ,GAAW,CAAC,CACxB,CACF,GAEa,eAAwCxB,EAQrB,QAAAC,EAAA,sBAjlBlC,IAAAC,EAklBI,GAAM,CAAE,kBAAAoC,EAAoB,CAAC,EAAG,WAAA+C,CAAW,EAAIrF,EACzC,CAAE,YAAA0B,CAAY,EAAI,MAAM,KAAK,QAAQ2D,CAAU,EAE/C9C,EAAuBD,EAAkB,OAAQE,GAASA,EAAK,QAAQ,aAAa,OAAS,CAAC,EAE9FC,EAA0C,CAC9Cf,EACA,GAAGa,EAAqB,IAAKC,GAASA,EAAK,WAAW,CACxD,EACME,EAAyB,CAAC,KAAK,QAAS,GAAGH,EAAqB,IAAKC,GAASA,EAAK,OAAO,CAAC,EAC3FG,EAAgC,CACpC,GAAG,KAAK,iBACR,GAAGJ,EAAqB,IAAKC,GAASA,EAAK,gBAAgB,EAAE,KAAK,CACpE,EAEA,OAAItC,EAAA,KAAK,QAAL,MAAAA,EAAY,QACdwC,EAAW,QAASvB,GAAY,CACzBA,EAAQ,KAAMS,GAAMA,EAAE,UAAU,OAAO,KAAK,MAAO,SAAS,CAAC,GAAG,KAAK,QAAQ,KAAK,KAAK,MAAO,MAAO,CAC5G,CAAC,EAGHa,EAAgB,QAAQ,CAAOS,EAAIG,IAAQpD,EAAA,sBACzCiD,EAAG,KAAKR,EAAWW,CAAG,CAAC,CACzB,EAAC,EAEM,CACL,QAAS,KACT,aAAcZ,EACd,QAASC,EACT,iBAAkBC,EAClB,WAAA0C,EACA,QAAgBzC,GAAwC3C,EAAA,sBAjnB9D,IAAAC,EAknBQ,GAAM,CAAE,aAAA2C,EAAc,WAAAC,EAAY,gBAAiBjB,EAAe,cAAAC,EAAgB,EAAK,EAAIc,GAAiB,CAAC,EAG7G,GAFIf,GAAeY,EAAgB,QAASS,GAAQA,EAAG,QAAQ,gBAAkBrB,CAAc,EAC/FK,GAAcO,CAAe,GACzBvC,EAAA,KAAK,QAAL,MAAAA,EAAY,UAAW,CACzB,GAAI2C,EAAc,CAChB,IAAMG,EAAkB,CAAC,EACzB,QAAWE,KAAMT,EAAiB,CAChC,IAAMU,EAAO,MAAM,KAAK,WAAW,gBAAgBD,EAAI,CAAE,cAAApB,CAAc,CAAC,EACxE,MAAMsD,GAAmB,KAAK,WAAYjC,CAAI,EAC9CH,EAAM,KAAKG,CAAI,CACjB,CAEA,MAAO,CAAE,MAAAH,EAAO,UAAWP,CAAgB,CAC7C,CAEA,MAAO,CACL,MAAO,MAAM,QAAQ,IACnBA,EAAgB,IAAWS,GAAOjD,EAAA,sBAChC,OAAO,MAAM,KAAK,WAAW,gBAAgBiD,EAAI,CAAE,cAAApB,CAAc,CAAC,CACpE,EAAC,CACH,EACA,UAAWW,CACb,CACF,CAEA,GAAI,KAAK,oBAAqB,CAC5B,IAAMa,EAAY,MAAM,KAAK,oBAAoBb,CAAe,EAEhE,GAAII,EAAc,CAChB,IAAII,EAAI,EACFM,EAAiC,CAAC,EAClCC,EAAc,IAA2BvD,EAAA,sBAC7C,GAAI,CAACqD,EAAUL,CAAC,EAAG,OACnB,IAAME,EAAO,MAAM,KAAK,WAAW,gBAAgBG,EAAUL,CAAC,EAAG,CAAE,cAAAnB,CAAc,CAAC,EAClFyB,EAAa,KAAK,CAAE,KAAAJ,EAAM,OAAQ,OAAQ,SAAUG,EAAUL,CAAC,CAAE,CAAC,EAClEH,GAAA,MAAAA,EAAa,CAAC,GAAGS,CAAY,GAC7BN,IAEA,IAAIQ,EAAY,GAEZC,EAAkC,KACpCC,EAAgC,KAC5BC,EAAOC,GAA2C,CACtDH,IAAe,MAAQ,cAAcA,CAAU,EAC/CC,IAAmB,MAAQ,KAAK,WAAW,wBAAwBA,CAAc,EACjF,IAAMG,EAAcP,EAAa,UAAWL,GAAOA,EAAG,OAASC,CAAI,EACnE,GAAIW,EAAc,GAAI,CACpB,GAAIP,EAAaO,CAAW,EAAE,SAAW,SAAWP,EAAaO,CAAW,EAAE,SAAW,UACvF,OACFP,EAAaO,CAAW,EAAE,OAASD,EAAgB,IAAM,QAAU,SACrE,CACAf,GAAA,MAAAA,EAAa,CAAC,GAAGS,CAAY,GACxBM,EAAgB,KAAKL,EAAY,CACxC,EAEI,KAAK,oBACPE,EAAa,YAAY,IAAYzD,EAAA,sBA1qBrD,IAAAC,EA2qBkB,GAAIuD,EAAW,CACb,cAAcC,CAAW,EACzB,MACF,CACA,GAAI,CACF,IAAMK,EAAI,MAAM,KAAK,WAAW,eAAeZ,EAAM,CACnD,WAAY,YACZ,gCACF,CAAC,EACGY,IACFN,EAAY,GACZ,cAAcC,CAAW,EACzBE,EAAI,CAAE,MAAK1D,EAAA6D,EAAE,OAAF,YAAA7D,EAAQ,MAAO,IAAK,CAAC,EAChC,QAAQ,IAAI,iCAAkCiD,CAAI,EAEtD,OAASlC,EAAG,CACVwC,EAAY,GACZ,cAAcC,CAAW,EACzB,QAAQ,MAAM,0BAA2BzC,EAAGkC,CAAI,CAClD,CACF,GAAGrD,EAAa,GAElB6D,EAAiB,KAAK,WAAW,YAC/BR,EACCa,GAAW,CACV,GAAIP,EAAW,CACb,KAAK,WAAW,wBAAwBE,CAAe,EACvD,MACF,CACAF,EAAY,GACZG,EAAII,CAAM,CACZ,EACA,WACF,EACA,KAAK,WAAW,mBAAmBb,CAAI,CACzC,GACA,OAAAK,EAAY,EACL,CACL,MAAO,CAAC,EACR,UAAAF,CACF,CACF,KAAO,CACL,IAAMN,EAAkB,CAAC,EACzB,QAASC,EAAI,EAAGA,EAAIK,EAAU,OAAQL,GAAK,EAAG,CAC5C,IAAME,EAAO,MAAM,KAAK,WAAW,gBAAgBG,EAAUL,CAAC,EAAG,CAAE,cAAAnB,CAAc,CAAC,EAClFkB,EAAM,KAAKG,CAAI,CACjB,CACA,MAAO,CAAE,MAAAH,EAAO,UAAAM,CAAU,CAC5B,CACF,CACA,MAAM,IAAI,MAAM,wEAAwE,CAC1F,GACA,QAAS+B,GAAc,CAAC,CAC1B,CACF,GAEa,eACXnB,EAC2B,QAAAjE,EAAA,sBAruB/B,IAAAkE,EAsuBI,IAA2DjE,EAAAgE,GAAS,CAAC,EAA7D,UAAAoB,EAAW,CAAC,EAAG,oBAAAC,CAtuB3B,EAsuB+DrF,EAAZsB,EAAA+C,EAAYrE,EAAZ,CAAvC,WAAe,wBACjBsF,EACJD,EACI9E,GAAiB8E,CAAmB,EACpC,CACA,aAAc,CAAC,EACf,iBAAkB,CAAC,CACrB,EAEEE,EAAuC,KAAK,QAAQ,OACxD,CAACC,EAAKC,IAASC,EAAAnE,EAAA,GAAKiE,GAAL,CAAU,CAACC,EAAI,UAAU,SAAS,CAAC,EAAGA,CAAI,GACzD,CAAC,CACH,EAEMlD,EAAiC,CAAC,EAClCC,EAAyB,CAAC,EAE5BmD,EAA6C,CAAC,EAC9CC,EAAc,EA+ClB,GA9CA,KAAK,gBAAgB,QAASzD,GAAS,CACrC,IAAM0D,EAAW,CAAC,GAAGF,EAAkBxD,CAAI,EACrC2D,EAAsBT,EAAsB,CAAC,GAAGC,EAAkB,aAAc,GAAGO,CAAQ,EAAIA,EAI/FE,EAAU,CAAC,GAHG,IAAI,IACtBF,EAAS,IAAK9C,GAAMA,EAAE,KAAK,OAAQiD,GAAOA,EAAG,QAAQ,EAAE,IAAKA,GAAOA,EAAG,OAAO,SAAS,CAAC,CAAC,EAAE,KAAK,CACjG,EACgC,OAAO,CAAC,EAAE,IAAKjD,GAAM,IAAIrC,GAAUqC,CAAC,CAAC,EAErE,GACEZ,IAASiD,EAASQ,CAAW,GAC7BD,EAAiB,OAAS,KACzBM,GAAkB,CAAE,aAAcH,EAAqB,MAAO,KAAK,SAAU,QAASC,CAAQ,CAAC,GAC9FE,GAAkB,CAAE,aAAcJ,EAAU,MAAO,KAAK,SAAU,QAASE,CAAQ,CAAC,GAGtFJ,EAAiB,KAAKxD,CAAI,MACrB,CACL,GAAIwD,EAAiB,SAAW,EAAG,MAAM,MAAM,kBAAkB,EACjEC,GAAezD,IAASiD,EAASQ,CAAW,EAAI,EAAI,EAGlDK,GAAkB,CAChB,aAAcZ,EACV,CAAC,GAAGC,EAAkB,aAAc,GAAGK,CAAgB,EACvD,CAAC,GAAGA,CAAgB,EACxB,MAAO,KAAK,SACZ,QAASI,CACX,CAAC,EAEDxD,EAAgB,KAAK,IAAId,GAAY,EAAE,IAAI,GAAG6D,EAAkB,aAAc,GAAGK,CAAgB,CAAC,EAElGpD,EAAgB,KAAK,IAAId,GAAY,EAAE,IAAI,GAAGkE,CAAgB,CAAC,EAEjEnD,EAAW,KACT,MAAM,KACJ,IAAI,IACFmD,EAAiB,IAAK5C,GAAMA,EAAE,KAAK,OAAQiD,GAAOA,EAAG,QAAQ,EAAE,IAAKA,GAAOA,EAAG,OAAO,SAAS,CAAC,CAAC,EAAE,KAAK,CACzG,CACF,EACG,IAAKjD,GAAMwC,EAAUxC,CAAC,CAAC,EACvB,OAAQA,GAAMA,IAAM,MAAS,CAClC,EACA4C,EAAmB,CAACxD,CAAI,CAC1B,CACF,CAAC,EAEGwD,EAAiB,OAAS,EAAG,CAI/B,IAAMO,EAAW,CAAC,GAHE,IAAI,IACtBP,EAAiB,IAAK5C,GAAMA,EAAE,KAAK,OAAQiD,GAAOA,EAAG,QAAQ,EAAE,IAAKA,GAAOA,EAAG,OAAO,SAAS,CAAC,CAAC,EAAE,KAAK,CACzG,EACiC,OAAO,CAAC,EAAE,IAAKjD,GAAMwC,EAAUxC,CAAC,CAAC,EAAE,OAAQA,GAAMA,IAAM,MAAS,EAG/FkD,GAAkB,CAChB,aAAcZ,EACV,CAAC,GAAGC,EAAkB,aAAc,GAAGK,CAAgB,EACvD,CAAC,GAAGA,CAAgB,EACxB,MAAO,KAAK,SACZ,QAASO,EAAS,IAAKxE,GAAMA,EAAE,SAAS,CAC1C,CAAC,EAEDa,EAAgB,KAAK,IAAId,GAAY,EAAE,IAAI,GAAG6D,EAAkB,aAAc,GAAGK,CAAgB,CAAC,EAElGpD,EAAgB,KAAK,IAAId,GAAY,EAAE,IAAI,GAAGkE,CAAgB,CAAC,EAEjEnD,EAAW,KAAK0D,CAAQ,CAC1B,CACA,OAAA3D,EAAgB,QAASS,GAAQA,EAAG,SAAW,KAAK,QAAS,GAEzDiB,EAAA,KAAK,QAAL,MAAAA,EAAY,QACdzB,EAAW,QAASvB,GAAY,CACzBA,EAAQ,KAAMS,GAAMA,EAAE,UAAU,OAAO,KAAK,MAAO,SAAS,CAAC,GAAGT,EAAQ,KAAK,KAAK,MAAO,MAAO,CACvG,CAAC,EAGI,CACL,QAAS,KACT,aAAcsB,EACd,QAASC,EACT,iBAAkB,KAAK,iBACvB,QAAgBE,GAAwC3C,EAAA,sBAz0B9D,IAAAC,EA00BQ,GAAM,CACJ,aAAA2C,EACA,WAAAC,EACA,YAAAC,EAAc,EACd,gBAAiBlB,EACjB,cAAAC,EAAgB,EAClB,EAAIc,GAAiB,CAAC,EAChBZ,EAAkBH,GAAA,KAAAA,EAAkB,MAAMI,GAAmB,KAAK,WAAY,KAAK,mBAAmB,EAM5G,GALAQ,EAAgB,QAAQ,CAAOS,EAAIG,IAAQpD,EAAA,sBACzCiD,EAAG,gBAAkBlB,EACjBU,EAAWW,CAAG,EAAE,QAAQH,EAAG,KAAK,GAAGR,EAAWW,CAAG,CAAC,CACxD,EAAC,EACDnB,GAAcO,CAAe,GACzBvC,EAAA,KAAK,QAAL,MAAAA,EAAY,UAAW,CACzB,GAAI2C,EAAc,CAChB,IAAII,EAAI,EACFD,EAAkB,CAAC,EACzB,QAAWE,KAAMT,EAAiB,CAEhC,GADA,EAAEQ,EACEA,GAAKF,EAAa,CACpBC,EAAM,KAAK,YAAY,EACvB,QACF,CACA,IAAMG,EAAO,MAAMhB,GACjB,KAAK,WACLe,EACA,KAAK,QAAQ,KAAMtB,GAAMA,EAAE,UAAU,OAAO,KAAK,MAAO,SAAS,CAAC,EAC9D,KAAK,QACL,CAAC,GAAG,KAAK,QAAS,KAAK,MAAM,MAAO,EACxC,CAAE,cAAAE,CAAc,CAClB,EACAkB,EAAM,KAAKG,CAAI,CACjB,CAEA,MAAO,CACL,MAAAH,EACA,UAAWP,CACb,CACF,CACA,MAAO,CACL,MAAO,MAAM,QAAQ,IACnBA,EAAgB,IAAWS,GAAOjD,EAAA,sBAChC,OAAO,MAAM,KAAK,WAAW,mBAAmBiD,EAAG,UAAU,EAAG,CAAE,cAAApB,CAAc,CAAC,CACnF,EAAC,CACH,EACA,UAAWW,CACb,CACF,CACA,GAAI,KAAK,oBAAqB,CAC5B,IAAM4D,EAAe,MAAM,KAAK,oBAC9B5D,EAAgB,MAAMM,EAAaN,EAAgB,MAAM,CAC3D,EACMa,EAAY,CAAC,GAAGb,EAAgB,MAAM,EAAGM,CAAW,EAAG,GAAGsD,CAAY,EAC5E,GAAIxD,EAAc,CAChB,IAAII,EAAI,EACFM,EAAiC,CAAC,EAClCC,EAAc,IAA2BvD,EAAA,sBAC7C,GAAI,CAACqD,EAAUL,CAAC,EAAG,OACfA,EAAIF,IAENQ,EAAa,KAAK,CAAE,KAAM,GAAI,OAAQ,UAAW,SAAUD,EAAUL,CAAC,CAAE,CAAC,EACzEH,GAAA,MAAAA,EAAa,CAAC,GAAGS,CAAY,GAC7BN,IACAO,EAAY,GAEd,IAAML,EAAO,MAAM,KAAK,WAAW,mBAAmBG,EAAUL,CAAC,EAAE,UAAU,EAAG,CAAE,cAAAnB,CAAc,CAAC,EACjGyB,EAAa,KAAK,CAAE,KAAAJ,EAAM,OAAQ,OAAQ,SAAUG,EAAUL,CAAC,CAAE,CAAC,EAClEH,GAAA,MAAAA,EAAa,CAAC,GAAGS,CAAY,GAC7BN,IAEA,IAAIQ,EAAY,GAEZC,EAAkC,KACpCC,EAAgC,KAC5BC,EAAOC,GAA2C,CACtDH,IAAe,MAAQ,cAAcA,CAAU,EAC/CC,IAAmB,MAAQ,KAAK,WAAW,wBAAwBA,CAAc,EACjF,IAAMG,EAAcP,EAAa,UAAWL,GAAOA,EAAG,OAASC,CAAI,EACnE,GAAIW,EAAc,GAAI,CACpB,GAAIP,EAAaO,CAAW,EAAE,SAAW,SAAWP,EAAaO,CAAW,EAAE,SAAW,UACvF,OACFP,EAAaO,CAAW,EAAE,OAASD,EAAgB,IAAM,QAAU,SACrE,CACAf,GAAA,MAAAA,EAAa,CAAC,GAAGS,CAAY,GACxBM,EAAgB,KAAKL,EAAY,CACxC,EAEI,KAAK,oBACPE,EAAa,YAAY,IAAYzD,EAAA,sBAl6BrD,IAAAC,EAm6BkB,GAAIuD,EAAW,CACb,cAAcC,CAAW,EACzB,MACF,CACA,GAAI,CACF,IAAMK,EAAI,MAAM,KAAK,WAAW,eAAeZ,EAAM,CACnD,WAAY,YACZ,gCACF,CAAC,EACGY,IACFN,EAAY,GACZ,cAAcC,CAAW,EACzBE,EAAI,CAAE,MAAK1D,EAAA6D,EAAE,OAAF,YAAA7D,EAAQ,MAAO,IAAK,CAAC,EAChC,QAAQ,IAAI,iCAAkCiD,CAAI,EAEtD,OAASlC,EAAG,CACVwC,EAAY,GACZ,cAAcC,CAAW,EACzB,QAAQ,MAAM,0BAA2BzC,EAAGkC,CAAI,CAClD,CACF,GAAGrD,EAAa,GAElB6D,EAAiB,KAAK,WAAW,YAC/BR,EACCa,GAAW,CACV,GAAIP,EAAW,CACb,KAAK,WAAW,wBAAwBE,CAAe,EACvD,MACF,CACAF,EAAY,GACZG,EAAII,CAAM,CACZ,EACA,WACF,EACA,KAAK,WAAW,mBAAmBb,CAAI,CACzC,GACA,aAAMK,EAAY,EACX,CACL,MAAOD,EAAa,IAAKU,GAAMA,EAAE,IAAI,EACrC,UAAAX,CACF,CACF,KAAO,CACL,IAAMN,EAAkB,CAAC,EACzB,QAASC,EAAI,EAAGA,EAAIK,EAAU,OAAQL,GAAK,EAAG,CAC5C,IAAME,EAAO,MAAM,KAAK,WAAW,mBAAmBG,EAAUL,CAAC,EAAE,UAAU,EAAG,CAAE,cAAAnB,CAAc,CAAC,EACjGkB,EAAM,KAAKG,CAAI,CACjB,CACA,MAAO,CAAE,MAAAH,EAAO,UAAAM,CAAU,CAC5B,CACF,CACA,MAAM,IAAI,MAAM,wEAAwE,CAC1F,GACA,QAAS9B,GAAW,CAAC,CACvB,CACF,GAEa,iBACX0C,EAM6B,QAAAjE,EAAA,sBAl+BjC,IAAAkE,EAm+BI,IAMIjE,EAAAgE,GAAS,CAAC,EALZ,qBAAAqB,EACA,SAAAD,EAAW,CAAC,EACZ,iBAAAlB,EAAmB,CAAC,EACpB,mBAAA/C,EAAqB,CAAC,CAv+B5B,EAy+BQnB,EADCsB,EAAA+C,EACDrE,EADC,CAJH,sBACA,WACA,mBACA,uBAGIsE,EAA4B/C,IAAA,GAC5B,KAAK,UAAY,SAAW,CAAC,EAAIgD,IAClCL,GAECM,EAAS,MAAM,KAAK,IAAI,IAAY,CAAC,GAAG,KAAK,mBAAoB,GAAGrD,CAAkB,CAAC,CAAC,EACxFsD,EAA4B,CAAC,EACnC,QAAWtC,KAAQqC,EACbF,EAA0BnC,CAAI,IAAM,QAAWsC,EAAa,KAAK,IAAI/D,GAAUyB,CAAI,CAAC,EAE1F,IAAMuC,EAAc,MAAMC,GAA2B,CAAE,WAAY,KAAK,WAAY,QAASF,CAAa,CAAC,EAC3G,OAAW,CAACG,EAAKC,CAAK,IAAK,OAAO,QAAQH,CAAW,EAAGJ,EAA0BM,CAAG,EAAIC,EAEzF,IAAMS,EACJD,EACI9E,GAAiB8E,CAAmB,EACpC,CACA,aAAc,CAAC,EACf,iBAAkB,CAAC,CACrB,EAEEe,EAAY,MAAMrE,GAAmB,KAAK,WAAY,KAAK,mBAAmB,EAE9EwD,EAAuC,KAAK,QAAQ,OACxD,CAACC,EAAKC,IAASC,EAAAnE,EAAA,GAAKiE,GAAL,CAAU,CAACC,EAAI,UAAU,SAAS,CAAC,EAAGA,CAAI,GACzD,CAAC,CACH,EACMlD,EAA0C,CAAC,EAC3CC,EAAyB,CAAC,EAE5BmD,EAA6C,CAAC,EAC9CC,EAAc,EAyDlB,GAxDA,KAAK,gBAAgB,QAASzD,GAAS,CACrC,IAAM0D,EAAW,CAAC,GAAGF,EAAkBxD,CAAI,EACrC2D,EAAsBT,EAAsB,CAAC,GAAGC,EAAkB,aAAc,GAAGO,CAAQ,EAAIA,EACrG,GACE1D,IAASiD,EAASQ,CAAW,GAC7BD,EAAiB,OAAS,KACzBU,GAAc,CAAE,aAAcP,EAAqB,MAAO,KAAK,SAAU,0BAAAxB,CAA0B,CAAC,GACnG+B,GAAc,CAAE,aAAcR,EAAU,MAAO,KAAK,SAAU,0BAAAvB,CAA0B,CAAC,GAG3FqB,EAAiB,KAAKxD,CAAI,MACrB,CACL,GAAIwD,EAAiB,SAAW,EAAG,MAAM,MAAM,kBAAkB,EACjEC,GAAezD,IAASiD,EAASQ,CAAW,EAAI,EAAI,EACpD,IAAMzE,EAA2C,CAAC,EAClD,QAAWgB,IAAQ,CAAC,GAAG,IAAI,IAAYqC,CAAM,CAAC,EACxCF,EAA0BnC,CAAI,IAAM,SAAWhB,EAAmBgB,CAAI,EAAImC,EAA0BnC,CAAI,GAG9G,GACEkD,GACAgB,GAAc,CACZ,aAAc,CAAC,GAAGf,EAAkB,aAAc,GAAGK,CAAgB,EACrE,MAAO,KAAK,SACZ,0BAAArB,EACA,gBAAiB8B,CACnB,CAAC,EACD,CACA,IAAMrB,EAAY,IAAIC,GAAmB,CACvC,SAAU,KAAK,SACf,gBAAiBoB,EAEjB,aAAc,CAAC,GAAGd,EAAkB,aAAc,GAAGK,CAAgB,CACvE,CAAC,EAAE,mBAAmB,OAAO,OAAOrB,CAAyB,CAAC,EAC9D/B,EAAgB,KAAK,IAAI0C,GAAqBF,CAAS,CAAC,CAC1D,KAAO,CACL,IAAMA,EAAY,IAAIC,GAAmB,CACvC,SAAU,KAAK,SACf,gBAAiBoB,EACjB,aAAc,CAAC,GAAGT,CAAgB,CACpC,CAAC,EAAE,mBAAmB,OAAO,OAAOrB,CAAyB,CAAC,EAC9D/B,EAAgB,KAAK,IAAI0C,GAAqBF,CAAS,CAAC,CAC1D,CACAvC,EAAW,KACT,MAAM,KACJ,IAAI,IACFmD,EAAiB,IAAK5C,GAAMA,EAAE,KAAK,OAAQiD,GAAOA,EAAG,QAAQ,EAAE,IAAKA,GAAOA,EAAG,OAAO,SAAS,CAAC,CAAC,EAAE,KAAK,CACzG,CACF,EACG,IAAKjD,GAAMwC,EAAUxC,CAAC,CAAC,EACvB,OAAQA,GAAMA,IAAM,MAAS,CAClC,EACA4C,EAAmB,CAACxD,CAAI,CAC1B,CACF,CAAC,EAEGwD,EAAiB,OAAS,EAAG,CAI/B,IAAMO,EAAW,CAAC,GAHE,IAAI,IACtBP,EAAiB,IAAK5C,GAAMA,EAAE,KAAK,OAAQiD,GAAOA,EAAG,QAAQ,EAAE,IAAKA,GAAOA,EAAG,OAAO,SAAS,CAAC,CAAC,EAAE,KAAK,CACzG,EACiC,OAAO,CAAC,EAAE,IAAKjD,GAAMwC,EAAUxC,CAAC,CAAC,EAAE,OAAQA,GAAMA,IAAM,MAAS,EAEjG,GACEsC,GACAgB,GAAc,CACZ,aAAc,CAAC,GAAGf,EAAkB,aAAc,GAAGK,CAAgB,EACrE,MAAO,KAAK,SACZ,0BAAArB,EACA,gBAAiB8B,CACnB,CAAC,EACD,CACA,IAAMrB,EAAY,IAAIC,GAAmB,CACvC,SAAU,KAAK,SACf,gBAAiBoB,EACjB,aAAc,CAAC,GAAGd,EAAkB,aAAc,GAAGK,CAAgB,CACvE,CAAC,EAAE,mBAAmB,OAAO,OAAOrB,CAAyB,CAAC,EAC9D/B,EAAgB,KAAK,IAAI0C,GAAqBF,CAAS,CAAC,CAC1D,KAAO,CACL,IAAMA,EAAY,IAAIC,GAAmB,CACvC,SAAU,KAAK,SACf,gBAAiBoB,EACjB,aAAc,CAAC,GAAGT,CAAgB,CACpC,CAAC,EAAE,mBAAmB,OAAO,OAAOrB,CAAyB,CAAC,EAC9D/B,EAAgB,KAAK,IAAI0C,GAAqBF,CAAS,CAAC,CAC1D,CACAvC,EAAW,KAAK0D,CAAQ,CAC1B,CAEA,OAAIjC,EAAA,KAAK,QAAL,MAAAA,EAAY,QACdzB,EAAW,QAASvB,GAAY,CACzBA,EAAQ,KAAMS,GAAMA,EAAE,UAAU,OAAO,KAAK,MAAO,SAAS,CAAC,GAAGT,EAAQ,KAAK,KAAK,MAAO,MAAO,CACvG,CAAC,EAGI,CACL,QAAS,KACT,aAAcsB,EACd,WAAYyB,EACZ,QAASxB,EACT,iBAAkB,KAAK,iBACvB,QAAgBE,GAAwC3C,EAAA,sBA7mC9D,IAAAC,EA8mCQ,GAAM,CACJ,aAAA2C,EACA,WAAAC,EACA,YAAAC,EAAc,EACd,gBAAiBlB,EACjB,cAAAC,EAAgB,EAClB,EAAIc,GAAiB,CAAC,EAMtB,GALAH,EAAgB,IAAI,CAAOS,EAAIG,IAAQpD,EAAA,sBACjCyC,EAAWW,CAAG,EAAE,QAAQH,EAAG,KAAKR,EAAWW,CAAG,CAAC,EAC/CxB,IAAeqB,EAAG,QAAQ,gBAAkBrB,EAClD,EAAC,EACDK,GAAcO,CAAe,GACzBvC,EAAA,KAAK,QAAL,MAAAA,EAAY,UAAW,CACzB,GAAI2C,EAAc,CAChB,IAAII,EAAI,EACFD,EAAkB,CAAC,EACzB,QAAWE,KAAMT,EAAiB,CAEhC,GADA,EAAEQ,EACEA,GAAKF,EAAa,CACpB,QAAQ,IAAI,YAAaE,CAAC,EAC1BD,EAAM,KAAK,YAAY,EACvB,QACF,CACA,IAAMG,EAAO,MAAM,KAAK,WAAW,gBAAgBD,EAAI,CAAE,cAAApB,CAAc,CAAC,EACxE,MAAMsD,GAAmB,KAAK,WAAYjC,CAAI,EAE9CH,EAAM,KAAKG,CAAI,CACjB,CAEA,MAAO,CAAE,MAAAH,EAAO,UAAWP,CAAgB,CAC7C,CAEA,MAAO,CACL,MAAO,MAAM,QAAQ,IACnBA,EAAgB,IAAWS,GAAOjD,EAAA,sBAChC,OAAO,MAAM,KAAK,WAAW,gBAAgBiD,EAAI,CAAE,cAAApB,CAAc,CAAC,CACpE,EAAC,CACH,EACA,UAAWW,CACb,CACF,CACA,GAAI,KAAK,oBAAqB,CAC5B,IAAM4D,EAAe,MAAM,KAAK,oBAC9B5D,EAAgB,MAAMM,EAAaN,EAAgB,MAAM,CAC3D,EACMa,EAAY,CAAC,GAAGb,EAAgB,MAAM,EAAGM,CAAW,EAAG,GAAGsD,CAAY,EAC5E,GAAIxD,EAAc,CAChB,IAAII,EAAI,EACFM,EAAiC,CAAC,EAClCC,EAAc,IAA2BvD,EAAA,sBAC7C,GAAI,CAACqD,EAAUL,CAAC,EAAG,OACnB,GAAIA,EAAIF,EAAa,CAEnBQ,EAAa,KAAK,CAAE,KAAM,GAAI,OAAQ,UAAW,SAAUD,EAAUL,CAAC,CAAE,CAAC,EACzEH,GAAA,MAAAA,EAAa,CAAC,GAAGS,CAAY,GAC7BN,IACAO,EAAY,EACZ,MACF,CACA,IAAML,EAAO,MAAM,KAAK,WAAW,gBAAgBG,EAAUL,CAAC,EAAG,CAAE,cAAAnB,CAAc,CAAC,EAClFyB,EAAa,KAAK,CAAE,KAAAJ,EAAM,OAAQ,OAAQ,SAAUG,EAAUL,CAAC,CAAE,CAAC,EAClEH,GAAA,MAAAA,EAAa,CAAC,GAAGS,CAAY,GAC7BN,IAEA,IAAIQ,EAAY,GAEZC,EAAkC,KACpCC,GAAgC,KAC5BC,GAAOC,IAA2C,CACtDH,IAAe,MAAQ,cAAcA,CAAU,EAC/CC,KAAmB,MAAQ,KAAK,WAAW,wBAAwBA,EAAc,EACjF,IAAMG,GAAcP,EAAa,UAAWL,IAAOA,GAAG,OAASC,CAAI,EACnE,GAAIW,GAAc,GAAI,CACpB,GAAIP,EAAaO,EAAW,EAAE,SAAW,SAAWP,EAAaO,EAAW,EAAE,SAAW,UACvF,OACFP,EAAaO,EAAW,EAAE,OAASD,GAAgB,IAAM,QAAU,SACrE,CACAf,GAAA,MAAAA,EAAa,CAAC,GAAGS,CAAY,GACxBM,GAAgB,KAAKL,EAAY,CACxC,EAEI,KAAK,oBACPE,EAAa,YAAY,IAAYzD,EAAA,sBAhsCrD,IAAAC,GAisCkB,GAAIuD,EAAW,CACb,cAAcC,CAAW,EACzB,MACF,CACA,GAAI,CACF,IAAMK,GAAI,MAAM,KAAK,WAAW,eAAeZ,EAAM,CACnD,WAAY,YACZ,gCACF,CAAC,EACGY,KACFN,EAAY,GACZ,cAAcC,CAAW,EACzBE,GAAI,CAAE,MAAK1D,GAAA6D,GAAE,OAAF,YAAA7D,GAAQ,MAAO,IAAK,CAAC,EAChC,QAAQ,IAAI,iCAAkCiD,CAAI,EAEtD,OAASlC,GAAG,CACVwC,EAAY,GACZ,cAAcC,CAAW,EACzB,QAAQ,MAAM,0BAA2BzC,GAAGkC,CAAI,CAClD,CACF,GAAGrD,EAAa,GAElB6D,GAAiB,KAAK,WAAW,YAC/BR,EACCa,IAAW,CACV,GAAIP,EAAW,CACb,KAAK,WAAW,wBAAwBE,EAAe,EACvD,MACF,CACAF,EAAY,GACZG,GAAII,EAAM,CACZ,EACA,WACF,EACA,KAAK,WAAW,mBAAmBb,CAAI,CACzC,GACA,OAAAK,EAAY,EACL,CACL,MAAO,CAAC,EACR,UAAAF,CACF,CACF,KAAO,CACL,IAAMN,EAAkB,CAAC,EACzB,QAASC,EAAI,EAAGA,EAAIK,EAAU,OAAQL,GAAK,EAAG,CAC5C,IAAME,EAAO,MAAM,KAAK,WAAW,gBAAgBG,EAAUL,CAAC,EAAG,CAAE,cAAAnB,CAAc,CAAC,EAClFkB,EAAM,KAAKG,CAAI,CACjB,CACA,MAAO,CAAE,MAAAH,EAAO,UAAAM,CAAU,CAC5B,CACF,CACA,MAAM,IAAI,MAAM,wEAAwE,CAC1F,GACA,QAAS9B,GAAW,CAAC,CACvB,CACF,GACF,ECxvCA,OAAS,cAAAgF,OAAkB,kBCApB,IAAMC,GAAW,CACtB,UAAW,0BAEX,iBAAkB,oBAClB,SAAU,kBACV,cAAe,oBAEf,YAAa,oBACb,YAAa,oBAEb,QAAS,gBAGT,mBAAoB,gCACpB,KAAM,aACN,KAAM,aACN,YAAa,oBACb,WAAY,mBAEZ,WAAY,aACZ,aAAc,YAEd,eAAgB,kDAQhB,UAAW,mBAIX,kBAAmB,kBASnB,iBAAkB,mBAElB,eAAgB,kBAEhB,eAAgB,iBAEhB,oBAAqB,wBACrB,mBAAoB,uBAEpB,UAAW,kBAEX,aAAc,iBACd,UAAW,iBAEX,mBAAoB,uBACpB,UAAW,oBACX,kBAAmB,0BACnB,oBAAqB,8BACrB,SAAU,eACV,aAAc,YACd,QAAS,gBACT,WAAY,cACZ,eAAgB,mBAChB,aAAc,gBAChB,EAEaC,GAAeC,EAAA,GACvBF,ICtEE,IAAMG,GAAc,eACdC,GAAc,eAEdC,GAAgB,IAAc,CACzC,GAAI,OAAO,SAAW,OAAW,MAAO,GACxC,IAAIC,EAAM,eAAe,QAAQH,EAAW,EAG5C,OAAKG,IACHA,EAAM,OAAO,KAAK,IAAI,CAAC,GACvB,eAAe,QAAQH,GAAaG,CAAG,GAElCA,CACT,EAaaC,GAA0BC,GAIoBC,EAAA,wBAJpB,IAAAC,EAAAF,EACrC,UAAAG,EAAW,IACX,cAAAC,CA5BF,EA0BuCF,EAGlCG,EAAAC,EAHkCJ,EAGlC,CAFH,WACA,kBAGA,GAAI,OAAO,SAAW,OAAW,OAAO,IAAI,QAASK,GAAYA,EAAQ,CAAC,EAC1E,IAAMC,EAAqB,KAAK,MAAM,aAAa,QAAQZ,EAAW,GAAK,IAAI,EAAE,MAAM,EAAGO,EAAW,CAAC,EAGlGC,GAAeI,EAAK,IAAI,EAGxB,IAAI,KAAK,CAAC,KAAK,UAAUH,EAAQ,IAAI,CAAC,CAAC,EAAE,KAAO,OAClDA,EAAQ,KAAO,KAAK,UAAUA,EAAQ,IAAI,EAAE,UAAU,EAAG,GAAG,EAAI,OAClEG,EAAK,QAAQC,EAAAC,EAAA,GAAKL,GAAL,CAAc,KAAM,KAAK,IAAI,EAAG,QAASR,GAAc,CAAE,EAAC,EAEvE,GAAI,CACF,aAAa,QAAQD,GAAa,KAAK,UAAUY,CAAI,CAAC,CACxD,OAAQG,EAAA,CAEN,GAAIP,EAAe,CACjB,IAAIQ,EAAU,GACRC,EAAS,KAAK,UAAUR,EAAQ,IAAI,EAAE,UAAU,EAAG,GAAG,EAE5D,IADAG,EAAK,CAAC,EAAE,KAAOK,GAAUA,EAAO,OAAS,IAAM,MAAQ,IAChD,CAACD,GAAS,CACfJ,EAAK,IAAI,EACT,IAAMK,EAAS,KAAK,UAAUR,EAAQ,IAAI,EAAE,UAAU,EAAG,GAAG,EAC5DG,EAAK,CAAC,EAAE,KAAOK,GAAUA,EAAO,OAAS,IAAM,MAAQ,IACvD,GAAI,CACF,aAAa,QAAQjB,GAAa,KAAK,UAAUY,CAAI,CAAC,EACtDI,EAAU,EACZ,OAAQD,EAAA,CACNC,EAAU,EACZ,CACF,CACA,OAAO,IAAI,QAASL,GAAYA,EAAQ,CAAC,CAC3C,CACA,OAAOR,GAAiBU,EAAAC,EAAA,GACnBL,GADmB,CAEtB,SAAAF,EACA,cAAe,EACjB,EAAC,CACH,CACF,G1BtDA,IAAMW,GAASC,EAAa,UAAU,EAChCC,GAAuC,IAAI,IA0B1C,IAAMC,GAAN,KAAU,CAQf,YAAY,CAAE,QAAAC,EAAS,QAAAC,EAAS,YAAAC,EAAa,SAAAC,EAAU,WAAAC,CAAW,EAAa,CAC7E,KAAK,QAAUJ,EACf,KAAK,WAAaI,GAAc,CAAC,EACjC,KAAK,SAAWD,GAAY,IAE5B,KAAK,IAAME,GAAM,OAAO,CAAE,QAAS,KAAK,WAAW,WAAaC,GAAS,UAAW,QAAAL,CAAQ,CAAC,EAE7F,KAAK,IAAI,aAAa,QAAQ,IAC3BM,GAAW,CAEV,GAAM,CAAE,OAAAC,EAAQ,QAAAC,EAAS,IAAAC,CAAI,EAAIH,EAEjC,OAAAI,GAAO,MAAM,GAAGH,GAAA,YAAAA,EAAQ,aAAa,IAAIC,CAAO,GAAGC,CAAG,EAAE,EAEjDH,CACT,EACCK,IAECD,GAAO,MAAM,gBAAgB,EAEtB,QAAQ,OAAOC,CAAK,EAE/B,EACA,KAAK,IAAI,aAAa,SAAS,IAC5BC,GAAa,CAEZ,GAAM,CAAE,OAAAN,EAAQ,KAAAO,EAAM,OAAAC,CAAO,EAAIF,EAC3B,CAAE,OAAAL,EAAQ,QAAAC,EAAS,IAAAC,CAAI,EAAIH,EAEjC,OAAIL,GACFc,GAAiB,CACf,OAAAD,EACA,IAAK,GAAGN,CAAO,GAAGC,CAAG,GACrB,OAAQH,EAAO,OACf,KAAAO,EACA,SAAU,KAAK,QACjB,CAAC,EAGHH,GAAO,MAAM,GAAGH,GAAA,YAAAA,EAAQ,aAAa,IAAIC,CAAO,GAAGC,CAAG,KAAKK,CAAM,EAAE,EAE5DD,CACT,EACCF,GAAU,CAGT,GAAM,CAAE,OAAAL,EAAQ,SAAAM,EAAW,CAAC,CAAE,EAAID,EAC5B,CAAE,OAAAG,CAAO,EAAIF,EACb,CAAE,OAAAL,EAAQ,QAAAC,EAAS,IAAAC,CAAI,EAAIH,EAEjC,OAAIL,GACFc,GAAiB,CACf,OAAAD,EACA,IAAK,GAAGN,CAAO,GAAGC,CAAG,GACrB,OAAQH,EAAO,OACf,KAAMK,EAAM,QACZ,SAAU,KAAK,QACjB,CAAC,EAGHD,GAAO,MAAM,GAAGH,EAAO,YAAY,CAAC,IAAIC,CAAO,GAAGC,CAAG,IAAIK,GAAUH,EAAM,OAAO,EAAE,EAE3E,QAAQ,OAAOA,CAAK,CAC7B,CACF,CACF,CAEM,gBAA+C,QAAAK,EAAA,sBAEnD,OADY,MAAM,KAAK,IAAI,IAAI,KAAK,WAAW,aAAeX,GAAS,WAAW,GACvE,IACb,GAEM,2BAA2BY,EAAuC,QAAAD,EAAA,sBACtE,GAAI,CAACC,EAAa,MAAO,GAWzB,IAAMC,GANF,MAAMd,GAAM,KAAKa,EAAa,CAChC,GAAI,8BACJ,QAAS,MACT,OAAQ,8BACR,OAAQ,CAAC,CAAC,CACZ,CAAC,GACoB,OAAO,IAAKJ,GAASA,EAAK,QAAQ,EACvD,OAAOK,EAAS,OAAO,CAACC,EAAGC,IAAMD,EAAIC,EAAG,CAAC,EAAIF,EAAS,OAAS,EACjE,GAEM,oBAAkD,QAAAF,EAAA,sBAEtD,OADY,MAAM,KAAK,IAAI,IAAI,KAAK,WAAW,YAAcX,GAAS,UAAU,GACrE,IACb,GAEM,kBAAkBgB,EAAkD,QAAAL,EAAA,sBACxE,GAAM,CAAE,OAAAM,CAAO,EAAID,EAEbE,EAAwB,CAAC,EAEzBC,EAAYF,EAAO,OAAQG,GAC3BC,GAAc,IAAID,CAAM,GAC1BF,EAAU,KAAKG,GAAc,IAAID,CAAM,CAAE,EAClC,IAEF,EACR,EAEGZ,EAAmB,CAAC,EACxB,OAAIW,EAAU,SAIZX,GAHY,MAAM,KAAK,IAAI,KACxB,KAAK,WAAW,gBAAkBR,GAAS,gBAAkB,QAAQmB,EAAU,KAAK,GAAG,CAAC,EAC3F,GACW,KAAK,OAAO,OAAO,EAC9BX,EAAK,QAASc,GAAY,CACxBD,GAAc,IAAIC,EAAQ,GAAIA,CAAO,CACvC,CAAC,GAGIJ,EAAU,OAAOV,CAAI,CAC9B,GAGM,SAGH,QAAAG,EAAA,sBACD,OAAO,KAAK,IAAI,IAAI,KAAK,WAAW,MAAQX,GAAS,IAAI,CAC3D,GAEM,cAA8F,QAAAW,EAAA,sBAElG,OADY,MAAM,KAAK,IAAI,IAAI,KAAK,WAAW,YAAcX,GAAS,UAAU,GACrE,IACb,GAEM,iBAMJ,QAAAW,EAAA,sBACA,OAAO,KAAK,IAAI,IAAI,GAAI,CACtB,QAAS,KAAK,WAAW,gBAAkBX,GAAS,cACtD,CAAC,CACH,GAEM,aAAauB,EAAqD,QAAAZ,EAAA,sBAItE,OAHY,MAAM,KAAK,IAAI,KACxB,KAAK,WAAW,cAAgBX,GAAS,cAAgB,UAAUuB,EAAK,IAAKC,GAAMA,EAAE,SAAS,CAAC,EAAE,KAAK,GAAG,CAAC,EAC7G,GACW,IACb,GAEM,yBAA0D,QAAAb,EAAA,sBAI9D,OAHY,MAAM,KAAK,IAAI,IACzB,KAAK,WAAW,oBAAsBX,GAAS,kBACjD,GACW,IACb,GACF,E2BhNO,IAAMyB,GACX,+FAEWC,GACX,iGCJF,OAAqB,aAAAC,GAAW,iBAAAC,OAA6C,kBAE7E,OACE,iBAAAC,GACA,2CAAAC,GACA,oBAAAC,GACA,yBAAAC,OACK,oBCKP,IAAMC,GAAU,IAAIC,IAClBA,EACG,IAAKC,GAAQ,CACZ,GAAI,CACF,OAAO,OAAOA,GAAQ,SAAW,KAAK,UAAUA,CAAG,EAAIA,CACzD,OAAQ,GACN,OAAOA,CACT,CACF,CAAC,EACA,KAAK,IAAI,EACOC,GAArB,KAAgC,CAK9B,YAAY,CAAE,MAAAC,EAAO,WAAAC,CAAW,EAAoB,CAHpD,KAAQ,SAAW,GAIjB,KAAK,MAAQD,EACb,KAAK,OAASE,EAAaD,CAAU,CACvC,CAEU,gBAAgBE,EAAiC,CACzD,YAAK,MAAM,WAAW,EACf,IAAIC,GAAU,CACnB,WAAY,KAAK,MAAM,WACvB,SAAUD,GAAY,KAAK,MAAM,YACjC,QAAS,KAAK,MAAM,QACpB,MAAO,KAAK,MAAM,MAClB,oBAAqB,KAAK,MAAM,oBAChC,kBAAmB,KAAK,MAAM,kBAC9B,IAAK,KAAK,MAAM,IAChB,oBAAqB,KAAK,MAAM,mBAClC,CAAC,CACH,CAEO,YAAYN,EAAuD,CACxE,KAAK,OAAO,MAAMD,GAAQC,CAAI,CAAC,CACjC,CAEO,WAAWA,EAAuD,CACvE,KAAK,OAAO,KAAKD,GAAQC,CAAI,CAAC,CAChC,CAEO,qBAAqBA,EAAuD,CACjF,IAAMQ,EAAUT,GAAQC,CAAI,EAC5B,MAAM,IAAI,MAAMQ,CAAO,CACzB,CAEO,eAAsB,EACvB,KAAK,UAAY,CAAC,KAAK,QAAO,KAAK,kBAAkB,oBAAoB,CAC/E,CACF,EC9DA,OAAiC,aAAAC,GAAmB,iBAAAC,OAA6C,kBACjG,OAAOC,OAAQ,QAEf,OACE,iCAAAC,GACA,sCAAAC,GACA,6BAAAC,GACA,oBAAAC,OACK,oBCRP,OAAkD,WAAAC,GAAS,aAAAC,OAAwC,kBACnG,OAAOC,OAAQ,QAEf,OAAS,oBAAAC,OAAwB,oBACjC,OAAS,UAAAC,OAAc,uBCJvB,OAAS,aAAAC,OAAiB,kBAC1B,OAAOC,IAAM,QAAAC,OAAY,QCDzB,OACE,QAAQC,GACR,gBAAgBC,GAChB,QAAQC,GACR,QAAQC,GACR,QAAQC,GACR,OAAOC,GACP,SAASC,GACT,OAAOC,GACP,SAASC,GACT,UAAUC,GACV,UAAUC,GACV,QAAQC,GACR,UAAUC,GACV,QAAQC,GACR,UAAUC,GACV,UAAUC,GACV,OAAOC,GACP,SAASC,GACT,OAAOC,GACP,SAASC,GACT,OAAOC,GACP,SAASC,GACT,OAAOC,GACP,SAASC,GACT,OAAOC,GACP,SAASC,GACT,MAAMC,GACN,OAAOC,GACP,UAAUC,GACV,aAAaC,GACb,OAAOC,GACP,SAASC,GACT,OAAOC,GACP,SAASC,GACT,OAAOC,GACP,SAASC,GACT,OAAOC,GACP,SAASC,GACT,OAAOC,GACP,SAASC,GACT,MAAMC,GACN,QAAQC,GACR,SAASC,GACT,SAASC,GACT,4BAA4BC,GAC5B,QAAQC,OACH,wBAgBA,IAAMC,GAASpC,GAoBTqC,GAAYlB,GAqClB,IAAMmB,GAAOC,GAYb,IAAMC,GAAKC,GACLC,GAAMC,GA8CZ,IAAMC,GAAMC,GAcZ,IAAMC,GAAOC,GD5Kb,IAAMC,GAAN,cAA8CC,EAAc,CAIjE,YAAYC,EAAcC,EAAiBC,EAAc,CAEvD,MAAMF,EAAME,CAAQ,EACpB,KAAK,KAAOC,GAAKH,CAAI,EACrB,KAAK,OAASC,CAChB,CAGA,OAAOG,EAAWC,EAAS,EAAO,CAChC,IAAMC,EAAM,IAAIC,GAAG,KAAK,KAAK,OAAOH,EAAGC,CAAM,EAAG,GAAI,IAAI,EACxD,OAAI,KAAK,OACAC,EAAI,SAAS,KAAK,KAAO,CAAC,EAAE,MAAM,EAEpCA,CACT,CAGA,OAAOE,EAASJ,EAAWC,EAAS,EAAW,CAC7C,OAAI,OAAOG,GAAQ,WAAUA,EAAM,IAAID,GAAGC,CAAG,GACzC,KAAK,SACPA,EAAMA,EAAI,OAAO,KAAK,KAAO,CAAC,GAEzB,KAAK,KAAK,OAAOA,EAAI,YAAY,OAAQ,KAAM,KAAK,IAAI,EAAGJ,EAAGC,CAAM,CAC7E,CACF,EAgCO,SAASI,EAA0BC,EAA+B,CACvE,OAAO,IAAIC,GAAK,EAAGD,CAAQ,CAC7B,CAEO,SAASE,GAA2BF,EAA+B,CACxE,OAAO,IAAIC,GAAK,EAAGD,CAAQ,CAC7B,CAEO,SAASG,EAA2BH,EAA2B,CACpE,OAAO,IAAII,GAAS,EAAG,GAAOJ,CAAQ,CACxC,CAkBO,IAAMK,GAAN,cAAyDC,EAAa,CAK3E,YAAYC,EAAmBC,EAAyBC,EAAwBC,EAAc,CAE5F,MAAMH,EAAO,KAAMG,CAAQ,EAC3B,KAAK,OAASH,EACd,KAAK,QAAUC,EACf,KAAK,QAAUC,CACjB,CAEA,OAAOE,EAAWC,EAAoB,CACpC,OAAO,KAAK,QAAQ,KAAK,OAAO,OAAOD,EAAGC,CAAM,CAAC,CACnD,CAEA,OAAOC,EAAQF,EAAWC,EAAyB,CACjD,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQC,CAAG,EAAGF,EAAGC,CAAM,CACxD,CAEA,QAAQD,EAAWC,EAAyB,CAC1C,OAAO,KAAK,OAAO,QAAQD,EAAGC,CAAM,CACtC,CACF,EAEO,SAASE,EAAiCJ,EAAoC,CACnF,OAAO,IAAIL,GACTU,GAAK,EAAE,EACNJ,GAAc,IAAIK,GAAUL,CAAC,EAC7BM,GAAmBA,EAAI,SAAS,EACjCP,CACF,CACF,CA8CO,SAASQ,GAA4BC,EAAkC,CAC5E,OAAO,IAAIC,GAAcC,GAAI,EAAGC,GAAYC,GAAYJ,CAAQ,CAClE,CAEO,SAASG,GAAWE,EAAwB,CACjD,GAAIA,IAAU,EACZ,MAAO,GACF,GAAIA,IAAU,EACnB,MAAO,GAET,MAAM,IAAI,MAAM,iBAAmBA,CAAK,CAC1C,CAEO,SAASD,GAAWC,EAAwB,CACjD,OAAOA,EAAQ,EAAI,CACrB,CAyEO,IAAMC,GAAN,cAAiEA,EAAoB,CAE1F,OAAOC,EAAWC,EAAoB,CACpC,OAAO,MAAM,OAAOD,EAAGC,CAAM,CAC/B,CACF,EAEO,SAASC,EACdC,EACAC,EACAC,EAWM,CAEN,OAAO,IAAIN,GAAUI,EAAQC,EAAUC,CAAc,CACvD,CAwCO,SAASC,GACdC,EACAC,EACAC,EACuB,CACvB,IAAIC,EACEC,EACJ,OAAOH,GAAU,SACbA,EACAI,GAAKJ,CAAK,EACRA,EAAM,SAAS,EACf,IAAI,MAAMA,EAAuE,CACjF,IAAIK,EAAQJ,EAAe,CACzB,GAAI,CAACC,EAAa,CAEhB,IAAMI,EAAgB,QAAQ,IAAID,EAAQ,OAAO,EAGjDH,EAAcE,GAAKE,CAAa,EAAIA,EAAc,SAAS,EAAIA,EAG/D,QAAQ,IAAID,EAAQ,QAASH,CAAW,CAC1C,CACA,OAAO,QAAQ,IAAIG,EAAQJ,CAAQ,CACrC,EACA,IAAII,EAAQJ,EAAUM,EAAY,CAChC,OAAIN,IAAa,UACfC,EAAcK,GAET,QAAQ,IAAIF,EAAQJ,EAAUM,CAAK,CAC5C,CACF,CAAC,EAGP,OAAOT,GAAKC,EAAeI,EAAYF,CAAQ,CACjD,CErXO,IAAMO,GAAmBC,EAAO,CACrCC,EAAU,MAAM,EAChBA,EAAU,OAAO,EACjBC,EAAI,QAAQ,EACZC,GAAI,gBAAgB,EACpBF,EAAU,UAAU,EACpBG,EAAG,OAAO,EACVD,GAAI,gBAAgB,EACpBD,EAAI,UAAU,EACdA,EAAI,iBAAiB,EACrBC,GAAI,sBAAsB,EAC1BF,EAAU,gBAAgB,CAC5B,CAAC,EHND,IAAMI,GAASC,EAAa,WAAW,EAQhC,SAASC,GAAsB,CAAE,MAAAC,EAAO,eAAAC,EAAgB,iBAAAC,CAAiB,EAG9E,CACA,IAAMC,EAAgC,CAAC,EACjCC,EAA0C,CAAC,EAEjD,OAAW,CAAE,OAAAC,EAAQ,QAAAC,CAAQ,IAAKJ,EAAiB,MAAO,CACxD,IAAMK,EAAcC,GAAiB,OAAOF,EAAQ,IAAI,EAClD,CAAE,KAAAG,EAAM,OAAAC,CAAO,EAAIH,EACzBJ,EAAc,KAAK,CACjB,UAAWE,EACX,KAAAI,EACA,OAAAC,EACA,aAAcC,GAAcX,EAAOS,EAAMH,EAAQ,KAAK,EAAE,UAAU,OAAOD,CAAM,EAC/E,SAAU,GACV,UAAWC,EAAQ,KACrB,CAAC,EAEDF,EAAqB,KAAK,CAAE,OAAAC,EAAQ,YAAAE,EAAa,UAAWD,EAAQ,KAAM,CAAC,CAC7E,CAEA,OAAIL,GACFE,EAAc,KAAK,CACjB,KAAMS,GAAU,QAChB,OAAQ,IAAIC,GAAG,OAAOZ,EAAe,QAAQ,CAAC,EAC9C,SAAU,GACV,UAAWA,EAAe,KAC5B,CAAC,EAGI,CACL,cAAAE,EACA,qBAAAC,CACF,CACF,CAEO,SAASU,GAAe,CAC7B,cAAAC,EACA,UAAAC,EAAYC,GACZ,WAAAC,CACF,EAI2C,CACzC,IAAMC,EAAOD,EAAa,KAAKA,CAAU,EAAE,MAAM,EAAG,EAAE,EAAIE,GAAQ,SAAS,EAAE,UAAU,SAAS,EAAE,MAAM,EAAG,EAAE,EAE7G,MAAO,CAAE,UADSC,GAAeN,EAAeI,EAAMH,CAAS,EAC3C,KAAAG,CAAK,CAC3B,CAEA,SAASE,GAAeN,EAA0BI,EAAcH,EAAiC,CAC/F,IAAMM,EAAS,OAAO,OAAO,CAACP,EAAc,SAAS,EAAG,OAAO,KAAKI,CAAI,EAAGH,EAAU,SAAS,CAAC,CAAC,EAC1FO,EAAiBC,GAAOF,CAAM,EACpC,OAAO,IAAIV,GAAUW,CAAc,CACrC,CDvDO,SAASE,GAA4BC,EAKjB,CACzB,GAAM,CAAE,KAAAC,EAAM,aAAAC,EAAc,MAAAC,EAAO,UAAAC,EAAYC,EAAiB,EAAIL,EACpE,OAAOM,GAAmCJ,EAAcD,EAAME,EAAOC,CAAS,CAChF,CAEO,SAASG,GAAwBP,EAMb,CACzB,GAAM,CAAE,aAAAE,EAAc,MAAAM,EAAO,aAAAC,EAAe,CAAC,EAAG,MAAAN,EAAO,UAAAC,EAAYC,EAAiB,EAAIL,EACxF,OAAOU,GAA8BR,EAAcM,EAAOL,EAAOM,EAAcL,CAAS,CAC1F,CAaA,SAAsBO,GAA8BX,EAIlD,QAAAY,EAAA,sBACA,GAAM,CAAE,WAAAC,EAAY,OAAAC,EAAQ,WAAAC,EAAY,MAAAP,EAAO,MAAAL,EAAO,iBAAAa,CAAiB,EAAIhB,EAErEiB,EAAgB,MAAMJ,EAAW,kCAAkCK,GAAiB,KAAMH,CAAU,EACpGI,EAAWC,EAAkBN,CAAM,EAAE,IAAI,IAAIO,GAAGJ,CAAa,CAAC,EAC9DK,EAAaC,GAAe,CAAE,cAAef,EAAO,UAAWH,EAAiB,CAAC,EAEvF,MAAO,CACL,UAAW,CAAE,WAAYiB,EAAW,SAAU,EAC9C,QAAS,CAAC,EACV,aAAc,CACZE,GAAc,sBAAsB,CAClC,WAAYhB,EACZ,WAAYA,EACZ,KAAMc,EAAW,KACjB,iBAAkBA,EAAW,UAC7B,SAAUH,EAAS,SAAS,EAC5B,MAAOD,GAAiB,KACxB,UAAWb,EACb,CAAC,EACDN,GAA4B,CAC1B,KAAM,IAAI0B,GAAUC,GAAW,OAAO,EACtC,aAAcJ,EAAW,UACzB,MAAAnB,EACA,UAAWE,EACb,CAAC,CACH,EACA,iBAAkB,CAACsB,EAAgB,cAAeA,EAAgB,WAAW,EAC7E,oBAAqBX,EAAmB,CAAC,EAAI,CAACW,EAAgB,YAAY,EAC1E,gBAAiBX,EACb,CAAC,EACD,CACET,GAAwB,CACtB,aAAce,EAAW,UACzB,MAAAd,EACA,MAAAL,CACF,CAAC,CACH,CACN,CACF,GAEO,SAASyB,GAAwB,CACtC,OAAAC,EACA,YAAAC,EACA,MAAA3B,EACA,OAAAW,EACA,aAAAL,EAAe,CAAC,EAChB,aAAAsB,EAAe1B,EACjB,EAO2B,CACzB,OAAO2B,GAA0BH,EAAQC,EAAa3B,EAAO,OAAO,OAAOW,CAAM,CAAC,EAAGL,EAAcsB,CAAY,CACjH,CFpFA,IAAqBE,GAArB,cAAqCC,EAAW,CAS9C,YAAYC,EAAgD,CAC1D,MAAMA,CAAM,EATd,KAAQ,eAAiC,CAAC,EAC1C,KAAQ,sBAA2C,CAAC,EAEpD,KAAQ,iBAA6D,CAAC,EACtE,KAAQ,kBAAoB,GAC5B,KAAQ,2BAA6B,GACrC,KAAQ,kBAAoB,EAI1B,GAAM,CAAE,cAAAC,EAAe,qBAAAC,EAAsB,0BAAAC,CAA0B,EAAIH,EAC3E,KAAK,eAAiBC,GAAiB,CAAC,EACxC,KAAK,sBAAwBC,GAAwB,CAAC,EACtD,KAAK,2BAA6BC,GAAA,KAAAA,EAA6B,GAC/D,KAAK,kBAAoB,CAAC,EAAEF,GAAiBC,EAC/C,CAEA,IAAI,eAAgC,CAClC,OAAO,KAAK,cACd,CACA,IAAI,sBAA0C,CAC5C,OAAO,KAAK,qBACd,CAEA,IAAI,0BAA0BE,EAAoB,CAChD,KAAK,2BAA6BA,CACpC,CAEO,mBAAmB,CAAE,cAAAH,EAAe,qBAAAC,CAAqB,EAAkC,CAChG,OAAID,IAAe,KAAK,eAAiBA,GACrCC,IAAsB,KAAK,sBAAwBA,GACvD,KAAK,0BAA4B,KAAK,MAAM,WAAW,4BAA4B,KAAK,wBAAwB,EAChH,KAAK,yBAA2B,OAChC,KAAK,kBAAoB,GAClB,IACT,CAEO,yBAAyBG,EAAoD,CAClF,YAAK,iBAAiB,KAAKA,CAAG,EACvB,IACT,CAEO,4BAA4BA,EAAoD,CACrF,YAAK,iBAAmB,KAAK,iBAAiB,OAAQC,GAAaA,IAAaD,CAAG,EAC5E,IACT,CAEO,0BAA0BE,EAAiBC,EAAkC,CAClF,OAAOC,GAAc,KAAK,MAAM,YAAaF,EAAMC,CAAS,EAAE,SAChE,CAEO,oBAA2B,CAC5B,KAAK,oBACT,KAAK,eAAiB,CAAC,EACvB,KAAK,sBAAwB,CAAC,EAChC,CAEa,yBAAyBE,EAGnC,QAAAC,EAAA,sBACD,GACE,KAAK,mBACJ,EAACD,GAAA,MAAAA,EAAQ,cACR,KAAK,eAAe,QACpB,KAAK,IAAI,EAAI,KAAK,mBAAqB,KAAK,2BAA6B,IAAO,EAAI,IAAO,GAAK,GAElG,MAAO,CACL,cAAe,KAAK,eACpB,qBAAsB,KAAK,qBAC7B,EAEF,KAAK,MAAM,WAAW,EAGtB,IAAME,EAAeC,IAAA,GADC,CAAC,GACqBH,GAEtC,CAACI,EAAgBC,EAAuBC,CAAyB,EAAI,MAAM,QAAQ,IAAI,CAC3F,KAAK,MAAM,WAAW,eAAe,KAAK,MAAM,YAAaJ,EAAa,UAAU,EACpF,KAAK,MAAM,WAAW,wBACpB,KAAK,MAAM,YACX,CAAE,UAAWK,EAAiB,EAC9BL,EAAa,UACf,EACA,KAAK,MAAM,WAAW,wBACpB,KAAK,MAAM,YACX,CAAE,UAAWM,EAAsB,EACnCN,EAAa,UACf,CACF,CAAC,EAEK,CAAE,cAAAX,EAAe,qBAAAC,CAAqB,EAAIiB,GAAsB,CACpE,MAAO,KAAK,MAAM,YAClB,eAAAL,EACA,iBAAkB,CAChB,QAASC,EAAsB,QAC/B,MAAO,CAAC,GAAGA,EAAsB,MAAO,GAAGC,EAA0B,KAAK,CAC5E,CACF,CAAC,EAED,YAAK,eAAiBf,EACtB,KAAK,sBAAwBC,EAE7B,KAAK,kBAAoB,KAAK,IAAI,EAE7B,KAAK,6BACR,KAAK,0BAA4B,KAAK,MAAM,WAAW,4BAA4B,KAAK,wBAAwB,EAChH,KAAK,yBAA2B,KAAK,MAAM,WAAW,gBACpD,KAAK,MAAM,YACX,IAAM,CACJ,KAAK,yBAAyB,CAAE,YAAa,EAAK,CAAC,EACnD,KAAK,iBAAiB,QAASkB,GAC7BA,EAAG,CAAE,cAAe,KAAK,eAAgB,qBAAsB,KAAK,qBAAsB,CAAC,CAC7F,CACF,EACA,CAAE,WAAYV,GAAA,YAAAA,EAAQ,UAAW,CACnC,GAGK,CAAE,cAAAT,EAAe,qBAAAC,CAAqB,CAC/C,GAEO,uBAA8B,CAC/B,KAAK,2BAA6B,QACpC,KAAK,MAAM,WAAW,4BAA4B,KAAK,wBAAwB,CACnF,CAGa,uBAAuBmB,EAQD,QAAAV,EAAA,yBARC,CAClC,KAAAJ,EACA,UAAAC,EAAYS,GACZ,eAAAK,EAAiB,EACnB,EAImC,CACjC,MAAM,KAAK,yBAAyB,EACpC,IAAMrB,EAAgB,KAAK,eACxB,OAAO,CAAC,CAAE,KAAMsB,CAAY,IAAMA,GAAA,YAAAA,EAAa,OAAOhB,EAAK,EAE3D,KAAK,CAACiB,EAAGC,IAAOD,EAAE,OAAO,GAAGC,EAAE,MAAM,EAAI,EAAI,EAAG,EAE5CC,EAAM,KAAK,0BAA0BnB,EAAMC,CAAS,EAC1D,QAAWmB,KAAgB1B,EAAe,CACxC,GAAM,CAAE,UAAA2B,CAAU,EAAID,EACtB,GAAIC,IACE,CAACN,GAAmBA,GAAkBI,EAAI,OAAOE,CAAS,GAAI,OAAOA,CAE7E,CACF,GAGa,wBAAwB5B,EAGlC,QAAAW,EAAA,sBAtLL,IAAAkB,EAAAC,EAAAC,EAAAC,EAuLI,MAAM,KAAK,yBAAyB,EACpC,GAAM,CACJ,KAAAzB,EACA,WAAA0B,EACA,eAAAX,EACA,MAAAY,EACA,mBAAAC,EAAqB,GACrB,iBAAAC,EAAmB,GACnB,oBAAAC,EAAsB,GACtB,WAAAC,CACF,EAAItC,EACEuC,EAAe,IAAIC,GAAUxC,EAAO,cAAgBiB,EAAgB,EACpES,EAAM,KAAK,0BAA0BnB,EAAM,IAAIiC,GAAUD,CAAY,CAAC,EACtEE,GAAYN,EAAqB,CAAC,EAAI,KAAK,sBAC9C,OAAQO,GAAMA,EAAE,YAAY,KAAK,OAAOnC,CAAI,IAAM,CAACe,GAAkBoB,EAAE,OAAO,OAAOhB,CAAG,EAAE,EAC1F,KAAK,CAACF,EAAGC,IAAOD,EAAE,YAAY,OAAO,GAAGC,EAAE,YAAY,MAAM,EAAI,EAAI,EAAG,EAE1E,GAAIQ,IAAe,QAAaQ,EAAS,OAAS,EAChD,OAAOA,EAAS,OAAS,EAAI,CAAE,QAASA,EAAS,CAAC,EAAE,MAAO,EAAI,CAAC,EAGlE,IAAME,EAAyC,CAC7C,aAAc,CAAC,EACf,gBAAiB,CAAC,EAClB,QAAS,CAAC,EACV,iBAAkB,CAAC,EACnB,oBAAqB,CAAC,CACxB,EAEA,GAAIrB,EAAgB,CAClB,IAAMsB,EAAgBC,GAAwCX,EAAOR,EAAKQ,EAAO3B,EAAMgC,CAAY,EAC7FO,EAAiB,KAAK,qBAAqB,KAAMJ,GAAMA,EAAE,OAAO,OAAOhB,CAAG,CAAC,EACjF,GAAIW,EAAqB,CACvB,IAAMU,EAAU,MAAM,KAAK,MAAM,WAAW,eAAerB,CAAG,EAC9D,GAAIqB,IAAY,MACdlB,EAAAc,EAAkB,eAAlB,MAAAd,EAAgC,KAAKe,GACrCD,EAAkB,iBAAkB,KAAKK,EAAgB,SAAS,UAElE,EAAAD,EAAQ,MAAM,OAAOR,CAAY,GACjCU,GAAc,OAAOF,EAAQ,IAAI,EAAE,KAAK,OAAOxC,CAAI,GACnD0C,GAAc,OAAOF,EAAQ,IAAI,EAAE,MAAM,OAAOb,CAAK,GAIrD,MAAM,MAAM,mCAAmC3B,EAAK,SAAS,CAAC,UAAUmB,EAAI,SAAS,CAAC,EAAE,CAE5F,MAAWoB,IAAmB,SAC5BH,EAAkB,aAAc,KAAKC,CAAa,EAClDD,EAAkB,iBAAkB,KAAKK,EAAgB,SAAS,GAEpE,GAAIzC,EAAK,OAAO2C,CAAQ,GAAKjB,EAAW,OAAQ,CAC9C,IAAMkB,EAAgB,MAAMC,GAA8B,CACxD,WAAY,KAAK,MAAM,WACvB,MAAO,KAAK,MAAM,YAClB,MAAOnB,EAAW,OAAS,KAAK,MAAM,YACtC,QAAQH,EAAAG,EAAW,SAAX,KAAAH,EAAqB,EAC7B,iBAAAM,CACF,CAAC,EACDO,EAAkB,aAAc,KAAK,GAAIQ,EAAc,cAAgB,CAAC,CAAE,EAC1ER,EAAkB,gBAAiB,KAAK,GAAIQ,EAAc,iBAAmB,CAAC,CAAE,EAChFR,EAAkB,iBAAkB,KAAK,GAAIQ,EAAc,kBAAoB,CAAC,CAAE,EAClFR,EAAkB,oBAAqB,KAAK,GAAIQ,EAAc,qBAAuB,CAAC,CAAE,EAEpFlB,EAAW,SACbU,EAAkB,aAAc,KAC9BU,GAAwB,CACtB,OAAQF,EAAc,UAAU,WAChC,YAAazB,EACb,MAAO,KAAK,MAAM,YAClB,OAAQO,EAAW,OACnB,aAAchB,EAChB,CAAC,CACH,EACA0B,EAAkB,iBAAkB,KAAKK,EAAgB,cAAc,EAE3E,CAEA,MAAI,CAACZ,GAAoBU,IAAmB,SAC1CH,EAAkB,gBAAiB,KACjCW,GAAwB,CACtB,MAAApB,EACA,MAAOD,EAAW,OAASC,EAC3B,aAAcR,EACd,UAAWa,CACb,CAAC,CACH,EACAI,EAAkB,oBAAqB,KAAKK,EAAgB,YAAY,GAGnE,CAAE,QAAStB,EAAK,kBAAmBiB,CAAkB,CAC9D,KAAO,CACL,IAAMY,EAAkBC,GAAe,CAAE,cAAetB,EAAO,UAAWK,EAAc,WAAAD,CAAW,CAAC,EAC9FmB,EAAgB,MAAM,KAAK,MAAM,WAAW,kCAAkCR,GAAc,IAAI,EAEhGS,EAAmBC,GAAc,sBAAsB,CAC3D,WAAYzB,EACZ,WAAYA,EACZ,KAAMqB,EAAgB,KACtB,iBAAkBA,EAAgB,UAClC,SAAUE,EAAgB,QAAOzB,GAAAD,EAAAE,EAAW,SAAX,YAAAF,EAAmB,aAAnB,KAAAC,EAAiC,CAAC,EACnE,MAAOiB,GAAc,KACrB,UAAWV,CACb,CAAC,EAED,OAAAI,EAAkB,aAAc,KAC9Be,EACAE,GAA4B,CAC1B,KAAArD,EACA,aAAcgD,EAAgB,UAC9B,MAAO,KAAK,MAAM,YAClB,UAAWhB,CACb,CAAC,CACH,EACAI,EAAkB,iBAAkB,KAAKK,EAAgB,aAAa,EACtEL,EAAkB,iBAAkB,KAAKK,EAAgB,WAAW,EAC/DZ,IACHO,EAAkB,gBAAiB,KACjCW,GAAwB,CACtB,MAAApB,EACA,MAAOD,EAAW,OAASC,EAC3B,aAAcqB,EAAgB,UAC9B,UAAWhB,CACb,CAAC,CACH,EACAI,EAAkB,oBAAqB,KAAKK,EAAgB,YAAY,GAEnE,CAAE,QAASO,EAAgB,UAAW,kBAAmBZ,CAAkB,CACpF,CAEF,GAEa,iBAAiBtB,EAQ2C,QAAAV,EAAA,yBAR3C,CAC5B,KAAAJ,EACA,UAAAC,EAAYS,GACZ,oBAAA4C,CACF,EAIyE,CAlU3E,IAAAhC,EAmUI,MAAM,KAAK,yBAAyB,EACpC,IAAIiC,GAAsBjC,EAAA,KAAK,MAAM,QAAQ,cAAc,KACzD,CAAC,CAAE,KAAMkC,CAAiB,KAAMA,GAAA,YAAAA,EAAkB,cAAexD,EAAK,SAAS,CACjF,IAF0B,YAAAsB,EAEvB,UAEGK,EAAQ,KAAK,MAAM,YACnBS,EAAyC,CAAC,EAEhD,GAAI,CAACmB,EAAqB,CACxB,IAAME,EAAa,KAAK,0BAA0BzD,EAAMC,CAAS,EAC3DyD,EAAc,MAAMpB,GAAwCX,EAAO8B,EAAY9B,EAAO3B,EAAMC,CAAS,EAC3GmC,EAAkB,aAAe,CAACsB,CAAW,EAC7CtB,EAAkB,iBAAmB,CAACK,EAAgB,SAAS,EAC/Dc,EAAsBE,CACxB,CACA,OAAIH,GAAuBX,EAAS,SAAS,IAAM3C,EAAK,SAAS,IAC/DoC,EAAkB,gBAAkB,CAClCW,GAAwB,CAAE,MAAApB,EAAO,MAAOA,EAAO,aAAc4B,EAAqB,UAAAtD,CAAU,CAAC,CAC/F,EACAmC,EAAkB,oBAAsB,CAACK,EAAgB,YAAY,GAGhE,CACL,OAAQc,EACR,gBAAiBnB,CACnB,CACF,GAGa,mBACX3C,EAC4D,QAAAW,EAAA,sBAC5D,GAAM,CACJ,KAAAuD,EACA,OAAAC,EACA,KAAA5D,EACA,UAAAC,EAAYS,GACZ,aAAAU,EACA,MAAAyC,EAAQ,KAAK,MAAM,YACnB,sBAAAC,EACA,iBAAAjC,EACA,oBAAAC,CACF,EAAIrC,EAEE0B,EAAM,KAAK,0BAA0BnB,EAAMC,CAAS,EAE1D,GAAI,IAAIgC,GAAUU,CAAQ,EAAE,OAAO3C,CAAI,EAAG,CACxC,IAAM4C,EAAgB,MAAMC,GAA8B,CACxD,WAAY,KAAK,MAAM,WACvB,MAAO,KAAK,MAAM,YAClB,MAAAgB,EACA,OAAAD,EACA,iBAAA/B,CACF,CAAC,EACD,OAAOvB,EAAA,CAAE,aAAcsC,EAAc,UAAU,YAAeA,EAChE,SAAW,CAACxB,GAAiBuC,IAAS,OAAS,CAACxC,EAAI,OAAOC,CAAY,GAAK,CAAC0C,EAAwB,CACnG,IAAMC,EAAyC,CAAC,EAC1C1B,EAAgBC,GACpB,KAAK,MAAM,YACXnB,EACA,KAAK,MAAM,YACXnB,EACAC,CACF,EAEA,GAAI6B,EAAqB,CACvB,IAAMU,EAAU,MAAM,KAAK,MAAM,WAAW,eAAerB,CAAG,EAC9D,GAAIqB,IAAY,KACduB,EAAa,KAAK1B,CAAa,UAE/B,EAAAG,EAAQ,MAAM,OAAO9B,EAAgB,GACrCgC,GAAc,OAAOF,EAAQ,IAAI,EAAE,KAAK,OAAOxC,CAAI,GACnD0C,GAAc,OAAOF,EAAQ,IAAI,EAAE,MAAM,OAAO,KAAK,MAAM,WAAW,GAItE,MAAM,MAAM,mCAAmCxC,EAAK,SAAS,CAAC,UAAUmB,EAAI,SAAS,CAAC,EAAE,CAE5F,MACE4C,EAAa,KAAK1B,CAAa,EAGjC,MAAO,CACL,aAAclB,EACd,aAAA4C,EACA,iBAAkB,CAACtB,EAAgB,SAAS,CAC9C,CACF,CAEA,MAAO,CAAE,aAAArB,CAAa,CACxB,GAEa,oBAAoB4C,EAOwC,QAAA5D,EAAA,sBACvE,GAAM,CAAE,KAAAJ,EAAM,UAAAC,EAAYS,GAAkB,OAAAkD,EAAQ,cAAAK,EAAe,mBAAAC,EAAoB,SAAAC,CAAS,EAAIH,EAChG5C,EACEgD,EAAY,KAAK,gBAAgBD,CAAQ,EAE/C,GAAInE,EAAK,OAAO,IAAIiC,GAAUU,CAAQ,CAAC,GAAKsB,EAAe,CAEzD,IAAyD3C,EAAA,MAAM,KAAK,mBAAmB,CACrF,KAAM,KACN,OAAQsC,GAAU,EAClB,KAAA5D,EACA,sBAAuB,GACvB,UAAAC,CACF,CAAC,EANO,cAAcoE,CA7a5B,EA6a+D/C,EAAjByC,EAAAO,EAAiBhD,EAAjB,CAAhC,iBAORF,EAAeiD,EACfD,EAAU,eAAeL,CAAY,CACvC,SACE3C,EAAe,MAAM,KAAK,uBAAuB,CAC/C,KAAApB,EACA,eAAgB,GAChB,UAAAC,CACF,CAAC,EACG,CAACmB,GAAgB8C,EAAoB,CACvC,IAAyD3C,EAAA,MAAM,KAAK,MAAM,QAAQ,mBAAmB,CACnG,KAAM,KACN,OAAQ,EACR,KAAAvB,EACA,sBAAuB,GACvB,UAAAC,CACF,CAAC,EANO,cAAcoE,CA7b9B,EA6biE9C,EAAjBwC,EAAAO,EAAiB/C,EAAjB,CAAhC,iBAORH,EAAeiD,EACfD,EAAU,eAAeL,CAAY,CACvC,CAGF,OAAOzD,EAAA,CAAE,aAAAc,GAAiBgD,EAAU,UACtC,GACF,EO3cA,OAAS,aAAAG,MAAiB,kBAE1B,OAAS,iBAAAC,GAAe,eAAAC,GAAa,oBAAAC,OAAwB,oBCD7D,OAAOC,OAAQ,QACf,OAAOC,OAAa,mBCFpB,OAAOC,OAAQ,QAGf,SAASC,GAAWC,EAAcC,EAAiB,CACjD,GAAIA,EAAQ,OAAO,EAAG,MAAM,MAAM,iBAAiB,EAGnD,OADeD,EAAS,IAAIC,CAAO,CAErC,CAEA,SAASC,GAAeF,EAAcG,EAAe,CACnD,GAAIA,EAAI,OAAO,EAAG,MAAM,MAAM,aAAa,EAE3C,IAAIC,EAAWJ,EAAS,IAAIG,CAAG,EAE/B,GAAIC,EAAS,OAAO,EAAG,MAAM,MAAM,kBAAkB,EAErD,IAAIC,EAAYN,GAAWC,EAAUG,CAAG,EAExC,OAAIE,EAAU,GAAGC,EAAI,IACnBF,EAAWA,EAAS,IAAI,IAAIG,GAAG,CAAC,CAAC,EAEjCJ,EAAMH,EAAS,IAAII,CAAQ,EAC3BC,EAAYN,GAAWC,EAAUI,CAAQ,EACrCC,EAAU,GAAGC,EAAI,IACnBH,EAAMA,EAAI,IAAI,IAAII,GAAG,CAAC,CAAC,IAGpB,CAACH,EAAUD,CAAG,CACvB,CAEA,IAAMG,GAAO,IAAIC,GAAG,CAAC,EAERC,GAAN,KAA2B,CAChC,OAAO,gBAAgBC,EAAkBC,EAAsBC,EAAkD,CAC/G,IAAMC,EAAYF,EAAiB,IAAIC,CAAqB,EAEtDE,EAAsBH,EAAiB,IAAID,CAAY,EACvD,CAACK,CAAwB,EAAIZ,GAAeU,EAAWC,CAAmB,EAE1EE,EAA2BJ,EAAsB,IAAIG,CAAwB,EACnF,GAAIC,EAAyB,OAAO,EAAG,MAAM,MAAM,kCAAkC,EAErF,MAAO,CACL,yBAAAA,CACF,CACF,CAEA,OAAO,wBACLC,EACAC,EACAC,EACAC,EACAC,EACoB,CACpB,IAAIC,EAAeL,EAAc,IAAIE,CAAgB,EAAE,IAAID,CAAa,EACpEK,EAAeN,EAAc,IAAIG,CAAgB,EAAE,IAAIF,CAAa,EAExE,GAAIG,IAAmB,EACrB,MAAO,CAAE,aAAAC,EAAc,aAAAC,CAAa,EAC/B,GAAIF,IAAmB,EAG5B,OAFwBrB,GAAWiB,EAAc,IAAIE,CAAgB,EAAGD,CAAa,EAEjE,GAAGX,EAAI,GAAKe,EAAa,GAAGf,EAAI,IAClDe,EAAeA,EAAa,IAAI,IAAId,GAAG,CAAC,CAAC,GAGnBR,GAAWiB,EAAc,IAAIG,CAAgB,EAAGF,CAAa,EAEjE,GAAGX,EAAI,GAAKgB,EAAa,GAAGhB,EAAI,IAClDgB,EAAeA,EAAa,IAAI,IAAIf,GAAG,CAAC,CAAC,GAGpC,CAAE,aAAAc,EAAc,aAAAC,CAAa,EAEtC,MAAM,MAAM,4BAA4B,CAC1C,CACF,EC7EA,OAAOC,OAAQ,QAER,IAAMC,GAA6B,IAAID,GAAG,GAAS,EAEnD,SAASE,GAAQC,EAAiBC,EAAkBC,EAAwB,CACjF,OAAOF,EAAY,IAAIC,CAAY,EAAE,IAAIC,CAAc,EAAE,IAAI,IAAIL,GAAG,CAAC,CAAC,EAAE,IAAIK,CAAc,CAC5F,CAEO,SAASC,GAASH,EAAiBC,EAAkBC,EAAwB,CAClF,OAAOF,EAAY,IAAIC,CAAY,EAAE,IAAIC,CAAc,CACzD,CAEO,IAAME,GAAN,KAAc,CACnB,OAAO,WAAWC,EAAYC,EAAsB,CAClD,OAAOP,GAAQM,EAAQC,EAAcR,EAA0B,CACjE,CACA,OAAO,YAAYO,EAAYE,EAAyB,CACtD,OAAOJ,GAASE,EAAQE,EAAiBT,EAA0B,CACrE,CACA,OAAO,QAAQO,EAAYG,EAAqB,CAC9C,OAAOL,GAASE,EAAQG,EAAaV,EAA0B,CACjE,CACF,EFEO,IAAMW,GAAN,KAAsB,CAC3B,OAAO,gBAAgBC,EAAkBC,EAAwB,CAC/D,GAAID,EAAa,OAAO,EAAG,MAAM,MAAM,sBAAsB,EAC7D,GAAIC,EAAa,OAAO,EAAG,MAAM,MAAM,sBAAsB,CAC/D,CAEA,OAAO,KAAKC,EAAkBC,EAAsBC,EAA2BC,EAA8B,CAC3G,IAAMC,EAAWC,GAAQ,WAAWL,EAAcG,CAAY,EAExDG,EAAuBN,EAAa,IAAII,CAAQ,EAEhD,CAAE,yBAAAG,CAAyB,EAAIC,GAAqB,gBACxDF,EACAL,EACAC,CACF,EAEA,MAAO,CACL,yBAA0BA,EAAsB,IAAIK,CAAwB,EAC5E,oBAAqBP,EACrB,yBAAAO,EACA,SAAAH,CACF,CACF,CAEA,OAAO,YAAY,CACjB,UAAAK,EACA,UAAAC,EACA,aAAAP,EACA,YAAAQ,EACA,aAAAC,EACA,WAAAC,EACA,aAAAC,CACF,EAgBE,CACA,GAAM,CAACC,EAAiBC,EAAkBC,EAAmBC,EAAoBC,CAAS,EACxFT,EAAU,UAAYG,EAAW,SAAS,EACtC,CAACF,EAAaC,EAAcH,EAAU,SAAUC,EAAU,SAAUD,EAAU,OAAO,EACrF,CAACG,EAAcD,EAAaD,EAAU,SAAUD,EAAU,SAAUC,EAAU,OAAO,EACrFU,EAAe,IAAIC,GAAQL,EAAiB,SAAS,CAAC,EACzD,IAAIM,EAAA,GAAMJ,EAAkB,EAC5B,IAAI,IAAIG,GAAQN,EAAgB,SAAS,CAAC,EAAE,IAAIO,EAAA,GAAML,EAAiB,CAAC,EACrEM,EAAgBT,EAAa,IAAIE,CAAgB,EAAIA,EAAiB,IAAI,IAAIQ,GAAG,CAAC,CAAC,EAAIV,EAEvFW,EAAcT,EAAiB,IAAIO,CAAa,EAChDG,EAAqBC,GAAUZ,EAAgB,IAAIQ,CAAa,EAAGE,CAAW,EAC9EG,EAAWD,GAAUD,EAAmB,IAAI,IAAIF,GAAG,GAAS,CAAC,EAAG,IAAIA,GAAG,GAAS,EAAE,IAAIrB,CAAY,CAAC,EACnG0B,EAAMD,EAAS,IAAIF,CAAkB,EACrCI,EAAiB,IAAIT,GAAQE,EAAc,SAAS,CAAC,EACxD,IAAID,EAAA,GAAMJ,EAAkB,EAC5B,IAAI,IAAIG,GAAQO,EAAS,SAAS,CAAC,EAAE,IAAIN,EAAA,GAAML,EAAiB,CAAC,EAC9Dc,EAAcX,EAAa,OAAO,EAAI,EAAIU,EAAe,IAAIV,CAAY,EAAE,IAAIA,CAAY,EAAE,IAAI,EAAE,SAAS,EAElH,MAAO,CACL,cAAAG,EAEA,SAAAK,EACA,mBAAAF,EAEA,SAAUG,EACV,YAAAE,CACF,CACF,CACF,ED3FA,OAAOC,MAAQ,QACf,OAAOC,MAAa,aIVb,IAAMC,GAAkBC,EAAO,CACpCC,GAAI,qBAAqB,EACzBC,EAAU,eAAe,EACzBC,EAAI,QAAQ,EACZC,EAAG,UAAU,EACbA,EAAG,eAAe,EAClBH,GAAI,uBAAuB,EAC3BC,EAAU,iBAAiB,CAC7B,CAAC,ECVD,OAAqB,aAAAG,OAAiB,kBACtC,OAAS,cAAAC,GAAqB,oBAAAC,OAAiD,oBA4FxE,IAAMC,GAAgBC,GASQ,CATR,IAAAC,EAAAD,EAC3B,SAAAE,EACA,UAAAC,EACA,SAAAC,CAhGF,EA6F6BH,EAIxBI,EAAAC,EAJwBL,EAIxB,CAHH,UACA,YACA,aAMuC,OAAAM,EAAA,CACvC,QAAS,IACT,QAASC,GAAUN,CAAO,EAAE,SAAS,EACrC,UAAAC,EACA,QAAS,GACT,OAAQ,GACR,KAAM,GACN,SAAAC,EACA,KAAM,CAAC,EACP,WAAYC,EAAM,YAAc,CAAC,GAC9BA,IAGQI,GACXC,GAEAA,EACIC,EAAAJ,EAAA,GACKG,GADL,CAEE,2BAA4BA,EAAO,2BAA2B,SAAS,EACvE,0BAA2BA,EAAO,0BAA0B,SAAS,EACrE,eAAgBA,EAAO,eAAe,SAAS,EAC/C,iBAAkBC,EAAAJ,EAAA,GACbG,EAAO,kBADM,CAEhB,MAAOA,EAAO,iBAAiB,MAAM,SAAS,EAC9C,WAAYA,EAAO,iBAAiB,WAAW,SAAS,CAC1D,GACA,iBAAkBC,EAAAJ,EAAA,GACbG,EAAO,kBADM,CAEhB,MAAOA,EAAO,iBAAiB,MAAM,SAAS,EAC9C,WAAYA,EAAO,iBAAiB,WAAW,SAAS,CAC1D,EACF,GACA,OCrIN,OAAsB,aAAAE,GAAW,0BAAAC,GAAgC,WAAAC,GAAS,iBAAAC,OAAqB,kBAC/F,OAAS,+BAAAC,GAA6B,yBAAAC,GAAuB,oBAAAC,OAAwB,oBCArF,IAAMC,GAAY,OAAO,KAAK,8BAA+B,MAAM,EAC7DC,GAAkB,OAAO,KAAK,aAAc,MAAM,EAClDC,GAAY,OAAO,KAAK,OAAQ,MAAM,EACtCC,GAAoB,OAAO,KAAK,eAAgB,MAAM,EACtDC,GAAkB,OAAO,KAAK,aAAc,MAAM,EAClDC,GAAmB,OAAO,KAAK,cAAe,MAAM,EAEnD,SAASC,GAAoBC,EAGlC,CACA,OAAOC,GAAmB,CAACR,EAAS,EAAGO,CAAS,CAClD,CAYO,SAASE,GACdC,EACAC,EACAC,EACAC,EAIA,CACA,OAAOC,GAAmB,CAACC,GAAWJ,EAAY,SAAS,EAAGC,EAAM,SAAS,EAAGC,EAAM,SAAS,CAAC,EAAGH,CAAS,CAC9G,CAEO,SAASM,GACdN,EACAO,EAIA,CACA,OAAOH,GAAmB,CAACI,GAAmBD,EAAO,SAAS,CAAC,EAAGP,CAAS,CAC7E,CAEO,SAASS,GACdT,EACAO,EACAG,EAIA,CACA,OAAON,GAAmB,CAACO,GAAiBJ,EAAO,SAAS,EAAGG,EAAK,SAAS,CAAC,EAAGV,CAAS,CAC5F,CAEO,SAASY,GACdZ,EACAO,EAIA,CACA,OAAOH,GAAmB,CAACS,GAAkBN,EAAO,SAAS,CAAC,EAAGP,CAAS,CAC5E,CASO,SAASc,GAAkB,CAChC,OAAQC,EACR,UAAAC,EACA,SAAAC,EACA,MAAAC,EACA,MAAAC,CACF,EAcE,CAEA,IAAMC,EAAYC,GAAoBL,CAAS,EAAE,UAC3CM,EAASP,GAAcQ,GAAiBP,EAAWC,EAAUC,EAAOC,CAAK,EAAE,UAC3EK,EAASC,GAAaT,EAAWM,CAAM,EAAE,UACzCI,EAASC,GAAYX,EAAWM,EAAQJ,CAAK,EAAE,UAC/CU,EAASD,GAAYX,EAAWM,EAAQH,CAAK,EAAE,UAC/CU,EAAgBC,GAAoBd,EAAWM,CAAM,EAAE,UAE7D,MAAO,CACL,OAAAA,EACA,SAAAL,EACA,UAAAG,EACA,OAAAI,EACA,OAAAE,EACA,OAAAE,EACA,cAAAC,CACF,CACF,CAEO,IAAME,GAAsB,OAAO,KAAK,mBAAoB,MAAM,ED/FzE,IAAMC,GAASC,EAAa,WAAW,EACjCC,GAAgB,CACpB,WAAY,CAAC,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAG,EACjD,QAAS,CAAC,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAG,EAC9C,SAAU,CAAC,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,EAAE,EAC9C,cAAe,CAAC,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAG,EACnD,eAAgB,CAAC,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAG,EACnD,gBAAiB,CAAC,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,EAClD,aAAc,CAAC,EAAG,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAG,CACnD,EAEO,SAASC,GACdC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAEAC,EACAC,EACAC,EACwB,CACxB,IAAMC,EAAaC,EAAO,CAACC,EAAI,YAAY,EAAGA,EAAI,YAAY,EAAGA,EAAI,UAAU,CAAC,CAAC,EAE3EC,EAAYC,GAAiBxB,EAAWE,EAAUG,EAAOC,CAAK,EAAE,UAEhEmB,EAA2B,CAC/B,CAAE,OAAQxB,EAAS,SAAU,GAAM,WAAY,EAAM,EACrD,CAAE,OAAQC,EAAU,SAAU,GAAO,WAAY,EAAM,EACvD,CAAE,OAAQC,EAAW,SAAU,GAAO,WAAY,EAAM,EACxD,CAAE,OAAQC,EAAQ,SAAU,CAACA,EAAO,OAAOmB,CAAS,EAAG,WAAY,EAAK,EACxE,CAAE,OAAQlB,EAAO,SAAU,GAAO,WAAY,EAAM,EACpD,CAAE,OAAQC,EAAO,SAAU,GAAO,WAAY,EAAM,EACpD,CAAE,OAAQC,EAAQ,SAAU,GAAO,WAAY,EAAK,EACpD,CAAE,OAAQC,EAAY,SAAU,GAAO,WAAY,EAAK,EACxD,CAAE,OAAQC,EAAY,SAAU,GAAO,WAAY,EAAK,EACxD,CAAE,OAAQC,EAAe,SAAU,GAAO,WAAY,EAAK,EAC3D,CAAE,OAAQC,EAAQ,SAAU,GAAO,WAAY,EAAK,EACpD,CAAE,OAAQC,EAAQ,SAAU,GAAO,WAAY,EAAK,EACpD,CAAE,OAAQC,EAAsB,SAAU,GAAO,WAAY,EAAK,EAClE,CAAE,OAAQG,EAAe,SAAU,GAAO,WAAY,EAAK,EAE3D,CAAE,OAAQU,GAAkB,SAAU,GAAO,WAAY,EAAM,EAC/D,CAAE,OAAQZ,EAAc,SAAU,GAAO,WAAY,EAAM,EAC3D,CAAE,OAAQC,EAAc,SAAU,GAAO,WAAY,EAAM,EAC3D,CAAE,OAAQY,GAA6B,SAAU,GAAO,WAAY,EAAM,EAC1E,CAAE,OAAQC,GAAmB,SAAU,GAAO,WAAY,EAAM,EAChE,CAAE,OAAQC,GAAiB,SAAU,GAAO,WAAY,EAAM,CAChE,EAEMC,EAAO,OAAO,MAAMV,EAAW,IAAI,EACzC,OAAAA,EAAW,OACT,CACE,WAAAH,EACA,WAAAC,EACA,SAAAC,CACF,EACAW,CACF,EAEO,IAAIC,GAAuB,CAChC,KAAAN,EACA,UAAAzB,EACA,KAAM,OAAO,KAAK,CAAC,GAAGF,GAAc,WAAY,GAAGgC,CAAI,CAAC,CAC1D,CAAC,CACH,CAEO,SAASE,GACdhC,EACAiC,EACA9B,EACAC,EACAM,EACAF,EACAC,EACAE,EACAC,EACAP,EACAC,EACAC,EAEA2B,EACAjB,EACAC,EACwB,CACxB,IAAME,EAAaC,EAAO,CAACC,EAAI,UAAU,EAAGA,EAAI,YAAY,EAAGA,EAAI,YAAY,CAAC,CAAC,EAE3EG,EAA2B,CAC/B,CAAE,OAAQQ,EAAO,SAAU,GAAM,WAAY,EAAM,EACnD,CAAE,OAAQ9B,EAAW,SAAU,GAAO,WAAY,EAAM,EACxD,CAAE,OAAQC,EAAQ,SAAU,GAAO,WAAY,EAAK,EACpD,CAAE,OAAQM,EAAe,SAAU,GAAO,WAAY,EAAK,EAC3D,CAAE,OAAQF,EAAY,SAAU,GAAO,WAAY,EAAK,EACxD,CAAE,OAAQC,EAAY,SAAU,GAAO,WAAY,EAAK,EACxD,CAAE,OAAQE,EAAQ,SAAU,GAAO,WAAY,EAAK,EACpD,CAAE,OAAQC,EAAQ,SAAU,GAAO,WAAY,EAAK,EACpD,CAAE,OAAQc,GAAkB,SAAU,GAAO,WAAY,EAAM,EAC/D,CAAE,OAAQS,GAAuB,SAAU,GAAO,WAAY,EAAM,EACpE,CAAE,OAAQ9B,EAAO,SAAU,GAAO,WAAY,EAAM,EACpD,CAAE,OAAQC,EAAO,SAAU,GAAO,WAAY,EAAM,EACpD,CAAE,OAAQC,EAAQ,SAAU,GAAO,WAAY,EAAK,CACtD,EAEMuB,EAAO,OAAO,MAAMV,EAAW,IAAI,EACzC,OAAAxB,GAAO,MAAM,oBAAqB,CAChC,SAAUsC,EAAS,SAAS,EAC5B,WAAYjB,EAAW,SAAS,EAChC,WAAYC,EAAW,SAAS,CAClC,CAAC,EACDE,EAAW,OACT,CACE,SAAAc,EACA,WAAAjB,EACA,WAAAC,CACF,EACAY,CACF,EAEO,IAAIC,GAAuB,CAChC,KAAAN,EACA,UAAAzB,EACA,KAAM,OAAO,KAAK,CAAC,GAAGF,GAAc,QAAS,GAAGgC,CAAI,CAAC,CACvD,CAAC,CACH,CAEO,SAASM,GACdpC,EACAiC,EACA9B,EACAC,EACAM,EACAF,EACAC,EACAE,EACAC,EACAP,EACAC,EACAC,EAEA2B,EACAG,EACAC,EACwB,CACxB,IAAMlB,EAAaC,EAAO,CAACC,EAAI,UAAU,EAAGA,EAAI,YAAY,EAAGA,EAAI,YAAY,CAAC,CAAC,EAE3EG,EAA2B,CAC/B,CAAE,OAAQQ,EAAO,SAAU,GAAM,WAAY,EAAM,EACnD,CAAE,OAAQ9B,EAAW,SAAU,GAAO,WAAY,EAAM,EACxD,CAAE,OAAQC,EAAQ,SAAU,GAAO,WAAY,EAAK,EACpD,CAAE,OAAQM,EAAe,SAAU,GAAO,WAAY,EAAK,EAC3D,CAAE,OAAQF,EAAY,SAAU,GAAO,WAAY,EAAK,EACxD,CAAE,OAAQC,EAAY,SAAU,GAAO,WAAY,EAAK,EACxD,CAAE,OAAQE,EAAQ,SAAU,GAAO,WAAY,EAAK,EACpD,CAAE,OAAQC,EAAQ,SAAU,GAAO,WAAY,EAAK,EACpD,CAAE,OAAQc,GAAkB,SAAU,GAAO,WAAY,EAAM,EAC/D,CAAE,OAAQS,GAAuB,SAAU,GAAO,WAAY,EAAM,EACpE,CAAE,OAAQ9B,EAAO,SAAU,GAAO,WAAY,EAAM,EACpD,CAAE,OAAQC,EAAO,SAAU,GAAO,WAAY,EAAM,EACpD,CAAE,OAAQC,EAAQ,SAAU,GAAO,WAAY,EAAK,EACpD,CAAE,OAAQgC,GAAkB,SAAU,GAAO,WAAY,EAAM,CACjE,EAEMT,EAAO,OAAO,MAAMV,EAAW,IAAI,EACzC,OAAAA,EAAW,OACT,CACE,SAAAc,EACA,WAAAG,EACA,WAAAC,CACF,EACAR,CACF,EAEO,IAAIC,GAAuB,CAChC,KAAAN,EACA,UAAAzB,EACA,KAAM,OAAO,KAAK,CAAC,GAAGF,GAAc,SAAU,GAAGgC,CAAI,CAAC,CACxD,CAAC,CACH,CAEO,SAASU,GACdxC,EACAyC,EACAtC,EACAD,EACAE,EACAsC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjC,EAEAkC,EACAC,EACwB,CACxB,IAAM/B,EAAaC,EAAO,CAACC,EAAI,UAAU,EAAGA,EAAI,aAAa,CAAC,CAAC,EAEzDG,EAA2B,CAC/B,CAAE,OAAQgB,EAAO,SAAU,GAAM,WAAY,EAAM,EACnD,CAAE,OAAQtC,EAAW,SAAU,GAAO,WAAY,EAAM,EACxD,CAAE,OAAQD,EAAU,SAAU,GAAO,WAAY,EAAM,EACvD,CAAE,OAAQE,EAAQ,SAAU,GAAO,WAAY,EAAK,EACpD,CAAE,OAAQsC,EAAkB,SAAU,GAAO,WAAY,EAAK,EAC9D,CAAE,OAAQC,EAAmB,SAAU,GAAO,WAAY,EAAK,EAC/D,CAAE,OAAQC,EAAY,SAAU,GAAO,WAAY,EAAK,EACxD,CAAE,OAAQC,EAAa,SAAU,GAAO,WAAY,EAAK,EACzD,CAAE,OAAQC,EAAmB,SAAU,GAAO,WAAY,EAAM,EAChE,CAAE,OAAQC,EAAoB,SAAU,GAAO,WAAY,EAAM,EACjE,CAAE,OAAQC,EAAW,SAAU,GAAO,WAAY,EAAM,EACxD,CAAE,OAAQC,EAAY,SAAU,GAAO,WAAY,EAAM,EACzD,CAAE,OAAQjC,EAAe,SAAU,GAAO,WAAY,EAAK,CAC7D,EAEMc,EAAO,OAAO,MAAMV,EAAW,IAAI,EACzC,OAAAA,EAAW,OACT,CACE,SAAA8B,EACA,YAAAC,CACF,EACArB,CACF,EAEO,IAAIC,GAAuB,CAChC,KAAAN,EACA,UAAAzB,EACA,KAAM,OAAO,KAAK,CAAC,GAAGF,GAAc,cAAe,GAAGgC,CAAI,CAAC,CAC7D,CAAC,CACH,CACO,SAASsB,GACdpD,EACAyC,EACAtC,EACAD,EACAE,EACAsC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjC,EAEAqC,EACAC,EACwB,CACxB,IAAMlC,EAAaC,EAAO,CAACC,EAAI,aAAa,EAAGA,EAAI,WAAW,CAAC,CAAC,EAE1DG,EAA2B,CAC/B,CAAE,OAAQgB,EAAO,SAAU,GAAM,WAAY,EAAM,EACnD,CAAE,OAAQtC,EAAW,SAAU,GAAO,WAAY,EAAM,EACxD,CAAE,OAAQD,EAAU,SAAU,GAAO,WAAY,EAAM,EACvD,CAAE,OAAQE,EAAQ,SAAU,GAAO,WAAY,EAAK,EACpD,CAAE,OAAQsC,EAAkB,SAAU,GAAO,WAAY,EAAK,EAC9D,CAAE,OAAQC,EAAmB,SAAU,GAAO,WAAY,EAAK,EAC/D,CAAE,OAAQC,EAAY,SAAU,GAAO,WAAY,EAAK,EACxD,CAAE,OAAQC,EAAa,SAAU,GAAO,WAAY,EAAK,EACzD,CAAE,OAAQC,EAAmB,SAAU,GAAO,WAAY,EAAM,EAChE,CAAE,OAAQC,EAAoB,SAAU,GAAO,WAAY,EAAM,EACjE,CAAE,OAAQC,EAAW,SAAU,GAAO,WAAY,EAAM,EACxD,CAAE,OAAQC,EAAY,SAAU,GAAO,WAAY,EAAM,EACzD,CAAE,OAAQjC,EAAe,SAAU,GAAO,WAAY,EAAK,CAC7D,EAEMc,EAAO,OAAO,MAAMV,EAAW,IAAI,EACzC,OAAAA,EAAW,OACT,CACE,YAAAiC,EACA,UAAAC,CACF,EACAxB,CACF,EAEO,IAAIC,GAAuB,CAChC,KAAAN,EACA,UAAAzB,EACA,KAAM,OAAO,KAAK,CAAC,GAAGF,GAAc,eAAgB,GAAGgC,CAAI,CAAC,CAC9D,CAAC,CACH,CE1TO,IAAMyB,GAAuBC,EAAO,CACzCC,GAAK,CAAC,EACNC,EAAG,MAAM,EACTC,GAAK,mBAAmB,EACxBC,GAAI,OAAO,EACXC,EAAI,cAAc,EAClBA,EAAI,iBAAiB,EACrBA,EAAI,aAAa,EACjBA,EAAI,eAAe,EAEnBC,EAAU,eAAe,EACzBA,EAAU,WAAW,EACrBC,GAAIF,EAAI,EAAG,EAAE,CACf,CAAC,EAEYG,GAAqBR,EAAO,CACvCC,GAAK,CAAC,EAENK,EAAU,UAAU,EACpBA,EAAU,aAAa,EACvBA,EAAU,QAAQ,EAClBA,EAAU,QAAQ,EAElBA,EAAU,QAAQ,EAClBA,EAAU,OAAO,EACjBA,EAAU,OAAO,EAEjBA,EAAU,cAAc,EACxBA,EAAU,cAAc,EAExBA,EAAU,eAAe,EAEzBJ,EAAG,MAAM,EACTA,EAAG,QAAQ,EAEXA,EAAG,YAAY,EACfA,EAAG,cAAc,EACjBA,EAAG,cAAc,EAEjBG,EAAI,UAAU,EACdA,EAAI,mBAAmB,EACvBA,EAAI,mBAAmB,EACvBA,EAAI,eAAe,EACnBA,EAAI,eAAe,EACnBA,EAAI,UAAU,EAEdE,GAAIF,EAAI,EAAG,EAAE,CACf,CAAC,ERFD,IAAqBI,GAArB,cAAwCC,EAAW,CACjD,YAAYC,EAAyB,CACnC,MAAMA,CAAM,CACd,CAEa,MAAsB,QAAAC,EAAA,sBACjC,KAAK,cAAc,CACrB,GAEa,gBAAgBC,EAAmC,QAAAD,EAAA,sBAC9D,OAAS,MAAM,KAAK,MAAM,IAAI,kBAAkB,CAAE,OAAQ,CAACC,CAAM,CAAE,CAAC,GAAkB,CAAC,CACzF,GAEa,eAAeA,EAAgBC,EAAiD,QAAAF,EAAA,sBAC3F,OAAQ,MAAM,KAAK,gBAAgB,CAACC,CAAM,EAAGC,CAAe,GAAGD,CAAM,CACvE,GAEa,gBACXE,EACAD,EAGC,QAAAF,EAAA,sBACD,IAAMI,EAAW,MAAMC,GACrB,KAAK,MAAM,WACXF,EAAQ,IAAKG,IAAO,CAAE,OAAQ,IAAIC,EAAUD,CAAC,CAAE,EAAE,CACnD,EACME,EAA2G,CAAC,EAE5GC,EAAoB,IAAI,IACxBC,EAA+B,CAAC,EAEtC,QAASJ,EAAI,EAAGA,EAAIH,EAAQ,OAAQG,IAAK,CACvC,IAAMK,EAAOP,EAASE,CAAC,EACvB,GAAIK,EAAK,cAAgB,KAAM,MAAM,MAAM,0BAA4B,OAAOR,EAAQG,CAAC,CAAC,CAAC,EACzF,IAAMM,EAAMC,GAAmB,OAAOF,EAAK,YAAY,IAAI,EAC3DH,EAAU,OAAOL,EAAQG,CAAC,CAAC,CAAC,EAAIQ,EAAAC,EAAA,GAC3BH,GAD2B,CAE9B,UAAWD,EAAK,YAAY,KAC9B,GACAF,EAAkB,IAAI,OAAOG,EAAI,QAAQ,CAAC,EAE1CF,EAAgB,KAAKE,EAAI,OAAQA,EAAI,MAAM,CAC7C,CAEA,IAAMI,EAAqF,CAAC,EAE5F,GAAId,EAAiB,CACnB,IAAMe,EAAY,CAAC,GAAGR,CAAiB,EACjCS,EAAc,MAAMb,GACxB,KAAK,MAAM,WACXY,EAAU,IAAKX,IAAO,CAAE,OAAQ,IAAIC,EAAUD,CAAC,CAAE,EAAE,CACrD,EAEA,QAASA,EAAI,EAAGA,EAAIW,EAAU,OAAQX,IAAK,CACzC,IAAMa,EAAiBD,EAAYZ,CAAC,EAAE,YACtC,GAAIa,IAAmB,KAAM,MAAM,MAAM,4BAA8BF,EAAUX,CAAC,CAAC,EACnFU,EAAWC,EAAUX,CAAC,CAAC,EAAIc,GAAqB,OAAOD,EAAe,IAAI,CAC5E,CACF,CAEA,IAAME,EAAuC,CAAC,EAExCC,EAAmB,MAAMjB,GAC7B,KAAK,MAAM,WACXK,EAAgB,IAAKJ,IAAO,CAAE,OAAQ,IAAIC,EAAUD,CAAC,CAAE,EAAE,CAC3D,EAEA,QAASA,EAAI,EAAGA,EAAII,EAAgB,OAAQJ,IAAK,CAC/C,IAAMiB,EAAgBD,EAAiBhB,CAAC,EAAE,YAC1C,GAAIiB,IAAkB,KAAM,MAAM,MAAM,2BAA6Bb,EAAgBJ,CAAC,CAAC,EAEvFe,EAAU,OAAOX,EAAgBJ,CAAC,CAAC,CAAC,EAAI,IAAIkB,EAAGC,GAAc,OAAOF,EAAc,IAAI,EAAE,OAAO,SAAS,CAAC,CAC3G,CAEA,IAAMG,EAAgD,CAAC,EAEvD,OAAW,CAACC,EAAIC,CAAI,IAAK,OAAO,QAAQpB,CAAS,EAAG,CAClD,IAAMqB,EAAcR,EAAUO,EAAK,OAAO,SAAS,CAAC,EAAE,IAAIA,EAAK,iBAAiB,EAAE,IAAIA,EAAK,aAAa,EAClGE,EAAeT,EAAUO,EAAK,OAAO,SAAS,CAAC,EAAE,IAAIA,EAAK,iBAAiB,EAAE,IAAIA,EAAK,aAAa,EACzGF,EAAWC,CAAE,EAAIb,EAAAC,EAAA,GACZa,GADY,CAEf,YAAAC,EACA,aAAAC,EACA,aAAcT,EAAUO,EAAK,OAAO,SAAS,CAAC,EAC9C,aAAcP,EAAUO,EAAK,OAAO,SAAS,CAAC,EAC9C,WAAYZ,EAAWY,EAAK,SAAS,SAAS,CAAC,EAC/C,UAAW,IAAIG,EAAQD,EAAa,SAAS,CAAC,EAC3C,IAAI,IAAIC,EAAQ,EAAE,EAAE,IAAIH,EAAK,YAAY,CAAC,EAC1C,IAAI,IAAIG,EAAQF,EAAY,SAAS,CAAC,EAAE,IAAI,IAAIE,EAAQ,EAAE,EAAE,IAAIH,EAAK,YAAY,CAAC,CAAC,CACxF,EACF,CAEA,OAAOF,CACT,GAEO,mBAAmB,CACxB,MAAAM,EACA,UAAAC,CACF,EAGoC,CAClC,OAAO,OAAO,KAAKD,CAAK,EAAE,OAAO,CAACE,EAAKC,IAAQ,CAtJnD,IAAAC,EAAAC,EAAAC,EAAAC,EAuJM,IAAMC,EAAOR,EAAMG,CAAG,EAChB,CAACM,EAAOC,CAAK,EAAI,CAACF,EAAK,MAAM,SAAS,EAAGA,EAAK,MAAM,SAAS,CAAC,EAEpE,OAAO1B,EAAAC,EAAA,GACFmB,GADE,CAEL,CAACC,CAAG,EAAGrB,EAAAC,EAAA,GACFyB,GADE,CAEL,GAAI,IAAIjC,EAAU4B,CAAG,EACrB,WAAYK,EAAK,WACjB,QAAS,EACT,UAAWG,GAAoBH,EAAK,SAAS,EAAE,UAC/C,MAAOI,GAAa,CAClB,QAASH,EACT,SAAUD,EAAK,aACf,UAAWA,EAAK,aAAa,SAAS,EACtC,WAAY,CACV,WAAWJ,EAAAH,EAAUQ,CAAK,IAAf,MAAAL,EAAkB,UAAYS,IAAYR,EAAAJ,EAAUQ,CAAK,IAAf,YAAAJ,EAAkB,SAAS,EAAI,MACtF,CACF,CAAC,EACD,MAAOO,GAAa,CAClB,QAASF,EACT,SAAUF,EAAK,aACf,UAAWA,EAAK,aAAa,SAAS,EACtC,WAAY,CACV,WAAWF,EAAAL,EAAUS,CAAK,IAAf,MAAAJ,EAAkB,UAAYO,IAAYN,EAAAN,EAAUS,CAAK,IAAf,YAAAH,EAAkB,SAAS,EAAI,MACtF,CACF,CAAC,CACH,EACF,EACF,EAAG,CAAC,CAAoC,CAC1C,CAEa,mBAAmBtC,EAI7B,QAAAD,EAAA,sBACD,IAAM8C,EAAU,MAAM,KAAK,eAAe7C,EAAQ,EAAI,EAChDgC,EAAY,MAAMc,GAAuB,CAC7C,WAAY,KAAK,MAAM,WACvB,MAAO,CAACD,EAAQ,MAAOA,EAAQ,KAAK,CACtC,CAAC,EAEKL,EAAQG,GAAa,CACzB,QAASE,EAAQ,MAAM,SAAS,EAChC,SAAUA,EAAQ,aAClB,UAAWA,EAAQ,aAAa,SAAS,EACzC,WAAY,CACV,UAAWb,EAAUa,EAAQ,MAAM,SAAS,CAAC,EAAE,UAC3CD,GAAYZ,EAAUa,EAAQ,MAAM,SAAS,CAAC,EAAE,SAAS,EACzD,MACN,CACF,CAAC,EACKJ,EAAQE,GAAa,CACzB,QAASE,EAAQ,MAAM,SAAS,EAChC,SAAUA,EAAQ,aAClB,UAAWA,EAAQ,aAAa,SAAS,EACzC,WAAY,CACV,UAAWb,EAAUa,EAAQ,MAAM,SAAS,CAAC,EAAE,UAC3CD,GAAYZ,EAAUa,EAAQ,MAAM,SAAS,CAAC,EAAE,SAAS,EACzD,MACN,CACF,CAAC,EAEKE,EAASJ,GAAa,CAC1B,QAASE,EAAQ,OAAO,SAAS,EACjC,SAAUA,EAAQ,WAClB,UAAWG,GAAiB,SAAS,CACvC,CAAC,EAEKjC,EAAa,CACjB,GAAI8B,EAAQ,SAAS,SAAS,EAC9B,MAAOA,EAAQ,WAAY,MAC3B,gBAAiBA,EAAQ,WAAY,gBAAgB,SAAS,EAC9D,aAAcA,EAAQ,WAAY,aAAa,SAAS,EACxD,YAAaA,EAAQ,WAAY,YAAY,SAAS,EACtD,cAAeA,EAAQ,WAAY,cAAc,SAAS,CAC5D,EAEMI,EAAiB,CACrB,OAAQ,EACR,YAAa,EACb,UAAW,EACX,IAAK,EACL,OAAQ,EACR,SAAU,EACV,SAAU,EACV,UAAW,CAAC,CACd,EAEA,MAAO,CACL,SAAU,CACR,UAAWJ,EAAQ,UAAU,SAAS,EACtC,GAAI7C,EACJ,KAAM,WACN,OAAA+C,EACA,QAAS,EACT,SAAUF,EAAQ,SAAS,SAAS,EACpC,OAAQ9B,EACR,MAAAyB,EACA,MAAAC,EACA,uBAAwB,YACxB,MAAOI,EAAQ,UAAU,SAAS,EAClC,YAAa,IAAIf,EAAQe,EAAQ,aAAa,SAAS,CAAC,EAAE,IAAIK,EAAA,GAAMV,EAAM,SAAQ,EAAE,SAAS,EAC7F,YAAa,IAAIV,EAAQe,EAAQ,aAAa,SAAS,CAAC,EAAE,IAAIK,EAAA,GAAMT,EAAM,SAAQ,EAAE,SAAS,EAC7F,QAASI,EAAQ,WAAY,aAAa,SAAS,EACnD,SAAUA,EAAQ,SAAS,SAAS,EACpC,IAAK,EACL,YAAa,EAEb,IAAKI,EACL,KAAMA,EACN,MAAOA,EACP,SAAU,CAAC,EAEX,kBAAmB,EACnB,iBAAkB,EAClB,kBAAmB,CACrB,EACA,SAAU,CACR,UAAWJ,EAAQ,UAAU,SAAS,EACtC,GAAI7C,EACJ,MAAAwC,EACA,MAAAC,EACA,SAAUI,EAAQ,SAAS,SAAS,EACpC,MAAO,CAAE,EAAGA,EAAQ,OAAO,SAAS,EAAG,EAAGA,EAAQ,OAAO,SAAS,CAAE,EACpE,UAAWH,GAAoBG,EAAQ,SAAS,EAAE,UAAU,SAAS,EACrE,OAAQE,EACR,OAAQhC,EACR,cAAeoC,GAAoBN,EAAQ,UAAW,IAAIvC,EAAUN,CAAM,CAAC,EAAE,UAAU,SAAS,CAClG,EACA,QAAA6C,CACF,CACF,GAEa,WAAgCV,EAc0C,QAAApC,EAAA,sBAd1C,IAAAqC,EAAAD,EAC3C,QAAAnC,EACA,UAAAoD,EACA,eAAAC,EACA,UAAAC,EACA,UAAAC,EACA,eAAAC,EAAiB,GACjB,oBAAAC,EAAsB,GACtB,UAAAC,EACA,UAAAC,EACA,oBAAAC,EACA,YAAAC,EACA,SAAAC,CA1SJ,EA8R+C1B,EAaxCtC,EAAAiE,EAbwC3B,EAaxC,CAZH,SACA,YACA,iBACA,YACA,YACA,iBACA,sBACA,YACA,YACA,sBACA,cACA,aA1SJ,IAAAD,EAAAC,EAAAC,EA6SI,IAAM2B,EAAQT,EAAU,YAAYpB,EAAA,KAAK,MAAM,QAAX,YAAAA,EAAkB,WAChD8B,EAAU,IAAI1C,EAAG,IAAIjB,EAAUR,EAAO,MAAM,OAAO,EAAE,SAAS,CAAC,EAAE,IACrE,IAAIyB,EAAG,IAAIjB,EAAUR,EAAO,MAAM,OAAO,EAAE,SAAS,CAAC,CACvD,EAEM,CAAC0C,EAAOC,CAAK,EAAIwB,EAAU,CAACnE,EAAO,MAAOA,EAAO,KAAK,EAAI,CAACA,EAAO,MAAOA,EAAO,KAAK,EACrF,CAACoE,EAAaC,CAAW,EAAIF,EAC/B,CAACnE,EAAO,YAAaA,EAAO,WAAW,EACvC,CAACA,EAAO,YAAaA,EAAO,WAAW,EAErCsE,EAAqBb,EAAU,eAAiBf,EAAM,UAAY6B,GAAY,SAAS,EACvFC,EAAqBf,EAAU,eAAiBd,EAAM,UAAY4B,GAAY,SAAS,EACvF,CAACE,EAAaC,CAAW,EAAI,CAAC,IAAIlE,EAAUkC,EAAM,OAAO,EAAG,IAAIlC,EAAUmC,EAAM,OAAO,CAAC,EACxFgC,EAAY,KAAK,gBAAgBX,CAAQ,EAEzC,CAAE,QAASY,EAAY,kBAAmBC,CAAsB,EACpE,MAAM,KAAK,MAAM,QAAQ,wBAAwB,CAC/C,KAAMJ,EACN,aAAc/B,EAAM,UACpB,MAAO,KAAK,MAAM,YAClB,WAAY4B,EACR,CACA,MAAOJ,EACP,OAAQE,CACV,EACE,OACJ,mBAAoBE,EACpB,iBAAkB,CAACA,EACnB,eAAgBA,EAAqB,GAAQZ,EAC7C,oBAAAC,CACF,CAAC,EACHgB,EAAU,eAAeE,GAAyB,CAAC,CAAC,EACpD,GAAM,CAAE,QAASC,EAAY,kBAAmBC,CAAsB,EACpE,MAAM,KAAK,MAAM,QAAQ,wBAAwB,CAC/C,KAAM,IAAIvE,EAAUmC,EAAM,OAAO,EACjC,aAAcA,EAAM,UACpB,MAAO,KAAK,MAAM,YAClB,WAAY6B,EACR,CACA,MAAON,EACP,OAAQG,CACV,EACE,OAEJ,mBAAoBG,EACpB,iBAAkB,CAACA,EACnB,eAAgBA,EAAqB,GAAQd,EAC7C,oBAAAC,CACF,CAAC,EAGH,GAFAgB,EAAU,eAAeI,GAAyB,CAAC,CAAC,EAEhDH,IAAe,QAAaE,IAAe,OAAW,MAAM,MAAM,kCAAkC,EAExG,IAAME,EAAWC,GAAkB,CACjC,OAAA/E,EACA,UAAAoD,EACA,SAAU,IAAI9C,EAAUqD,EAAU,EAAE,EACpC,MAAOY,EACP,MAAOC,CACT,CAAC,EAED,OAAAC,EAAU,eAAe,CACvB,aAAc,CACZO,GACE5B,EACA,KAAK,MAAM,YACX,IAAI9C,EAAUqD,EAAU,EAAE,EAC1BmB,EAAS,UACTA,EAAS,OACTP,EACAC,EACAM,EAAS,OACTJ,EACAE,EACAK,GAAc,KAAK,MAAM,YAAaH,EAAS,MAAM,EAAE,UACvDA,EAAS,OACTA,EAAS,OACTzB,EACA,IAAI/C,GAAU8B,EAAAI,EAAM,YAAN,KAAAJ,EAAmBY,EAAgB,EACjD,IAAI1C,GAAU+B,EAAAI,EAAM,YAAN,KAAAJ,EAAmBW,EAAgB,EACjD8B,EAAS,cACTZ,EACAC,EACAb,CACF,CACF,EACA,iBAAkB,CAAC4B,EAAgB,cAAc,CACnD,CAAC,EAEDT,EAAU,uBAAuBb,CAAmB,EACpDa,EAAU,kBAAkBZ,CAAW,EAChCY,EAAU,aAAa,CAC5B,UAAAf,EACA,QAAS,CACP,QAAS7C,EAAAC,EAAA,GAAKgE,GAAL,CAAe,MAAAtC,EAAO,MAAAC,EAAO,UAAAW,EAAW,eAAAC,EAAgB,UAAAM,CAAU,EAC7E,CACF,CAAC,CACH,GAEa,aAAkC7D,EAA2D,QAAAC,EAAA,sBACxG,GAAM,CACJ,SAAAoF,EACA,SAAUC,EACV,YAAAC,EACA,OAAAC,EACA,SAAAC,EACA,cAAAC,EACA,oBAAA5B,EACA,YAAAC,EACA,OAAA4B,EACA,UAAA/B,EACA,SAAAI,CACF,EAAIhE,EAEA,KAAK,MAAM,aAAa,sBAAwB,IAClD,KAAK,kBAAkB,+CAA+C,EAEpEuF,EAAY,OAAO,GACrB,KAAK,kBAAkB,iCAAkC,YAAa,CACpE,UAAWA,EAAY,SAAS,CAClC,CAAC,EACH,GAAM,CAAE,QAAAK,CAAQ,EAAI,KAAK,MACnB,CAAE,sBAAAC,EAAuB,oBAAAlC,CAAoB,EAAI3C,EAAA,CAEhD,sBAAuB,GAAO,oBAAqB,IAErD2E,GAECG,EAAcJ,EAAgB,OAAY,MAAM,KAAK,eAAeL,EAAS,EAAE,EAE/E,CACJ,UAAAU,EACA,eAAAC,EACA,cAAeC,CACjB,EAAIP,GACF,KAAK,kBAAkB,CACrB,SAAU3E,EAAAC,EAAA,GACLqE,GADK,CAER,SAAU,IAAIrD,EAAQ8D,EAAa,SAAS,SAAS,CAAC,EAAE,IAAI1C,EAAA,GAAMiC,EAAS,OAAO,SAAQ,EAAE,SAAS,CACvG,GACA,YAAaS,EAAa,YAC1B,aAAcA,EAAa,aAC3B,SAAU,IAAII,GAAQ,CAAC,EACvB,OAAAV,EACA,UAAW,MAAM,KAAK,MAAM,eAAe,EAC3C,OAAQ,IAAIxD,EAAQuD,EAAY,SAAS,CAAC,EAAE,IAC1CnC,EAAA,GAAOoC,EAASH,EAAS,MAAM,SAAWA,EAAS,MAAM,SAC3D,CACF,CAAC,EAEGc,EAAgBF,EAAe,OAC/B3B,EAAqBe,EAAS,MAAM,UAAYd,GAAY,SAAS,EACrEC,EAAqBa,EAAS,MAAM,UAAYd,GAAY,SAAS,EAErEI,EAAY,KAAK,gBAAgBX,CAAQ,EACzC,CAACtB,EAAOC,CAAK,EAAI,CAAC,IAAInC,EAAU6E,EAAS,MAAM,OAAO,EAAG,IAAI7E,EAAU6E,EAAS,MAAM,OAAO,CAAC,EAE9F,CAAE,QAASe,EAAe,kBAAmBC,CAA0B,EAC3E,MAAM,KAAK,MAAM,QAAQ,wBAAwB,CAC/C,aAAchB,EAAS,MAAM,UAC7B,KAAM,IAAI7E,EAAU6E,EAAS,MAAM,OAAO,EAC1C,MAAO,KAAK,MAAM,YAElB,WACEf,IAAuBkB,EAASD,EAAcY,GAAe,OAAO,EAChE,CACA,MAAO,KAAK,MAAM,YAClB,OAAQX,EAASD,EAAcY,CACjC,EACE,OACN,iBAAkB,CAAC7B,EACnB,mBAAoBA,EACpB,eAAgB,GAChB,oBAAAX,CACF,CAAC,EAEHgB,EAAU,eAAe0B,GAA6B,CAAC,CAAC,EAExD,GAAM,CAAE,QAASC,EAAe,kBAAmBC,CAA0B,EAC3E,MAAM,KAAK,MAAM,QAAQ,wBAAwB,CAC/C,aAAclB,EAAS,MAAM,UAC7B,KAAM,IAAI7E,EAAU6E,EAAS,MAAM,OAAO,EAC1C,MAAO,KAAK,MAAM,YAElB,WACEb,IAAuBgB,EAASW,EAAgBZ,GAAa,OAAO,EAChE,CACA,MAAO,KAAK,MAAM,YAClB,OAAQC,EAASW,EAAgBZ,CACnC,EACE,OACN,iBAAkB,CAACf,EACnB,mBAAoBA,EACpB,eAAgB,GAChB,oBAAAb,CACF,CAAC,EAEHgB,EAAU,eAAe4B,GAA6B,CAAC,CAAC,EAEpD,CAACH,GAAiB,CAACE,GACrB,KAAK,kBAAkB,qCAAsC,gBAAiBV,EAAQ,aAAa,EACrG,IAAMY,EAAiB,MAAMZ,EAAQ,uBAAuB,CAC1D,KAAM,IAAIpF,EAAU6E,EAAS,OAAO,OAAO,CAC7C,CAAC,EAC2DhD,GAAA,MAAMuD,EAAQ,mBAAmB,CAC3F,KAAM,MACN,OAAQ,EACR,KAAM,IAAIpF,EAAU6E,EAAS,OAAO,OAAO,EAC3C,aAAcmB,EACd,sBAAAX,EACA,oBAAAlC,CACF,CAAC,EAPO,cAAc8C,CAzf1B,EAyfgEpE,GAAlBqE,EAAAzC,EAAkB5B,GAAlB,CAAlC,iBAQRsC,EAAU,eAAe+B,CAAa,EACtC,IAAM1B,EAAWM,GAAA,KAAAA,EAAiB,MAAM,KAAK,gBAAgBD,EAAS,EAAE,EAClEsB,EAAY,IAAIT,GAAQ,IAAIzE,EAAG,CAAC,CAAC,EAAE,IAAIgE,CAAQ,EAErD,OAAAd,EAAU,eAAe,CACvB,aAAc,CACZiC,GACE,IAAIpG,EAAU6E,EAAS,SAAS,EAChC,KAAK,MAAM,YACX,IAAI7E,EAAUwE,EAAS,SAAS,EAChC,IAAIxE,EAAU6E,EAAS,EAAE,EACzBoB,EACAL,EACAE,EACA,IAAI9F,EAAUwE,EAAS,MAAM,CAAC,EAC9B,IAAIxE,EAAUwE,EAAS,MAAM,CAAC,EAC9BtC,EACAC,EACA,IAAInC,EAAU6E,EAAS,OAAO,OAAO,EAErCK,EAAgBA,GAAA,YAAAA,EAAe,UAAYiB,EAAU,IAAIZ,CAAS,EAAE,SACpEP,EAASQ,EAAe,OAASG,EACjCX,EAASW,EAAgBH,EAAe,MAC1C,CACF,EACA,iBAAkB,CAACZ,EAAgB,gBAAgB,EACnD,mBAAoBJ,EAAS,mBAAqB,CAACA,EAAS,kBAAkB,EAAI,CAAC,CACrF,CAAC,EACDL,EAAU,uBAAuBb,CAAmB,EACpDa,EAAU,kBAAkBZ,CAAW,EAChCY,EAAU,aAAa,CAAE,UAAAf,CAAU,CAAC,CAC7C,GAEa,kBAAuC5D,EAAgE,QAAAC,EAAA,sBAliBtH,IAAAoC,EAAAC,EAmiBI,GAAM,CACJ,SAAA+C,EACA,SAAUC,EACV,SAAAuB,EACA,SAAApB,EACA,oBAAA3B,EACA,YAAAC,EACA,UAAAH,EACA,SAAAI,EACA,UAAA8C,EAAY,EACd,EAAI9G,EAEA,KAAK,MAAM,aAAa,sBAAwB,IAClD,KAAK,kBAAkB,+CAA+C,EAExE,IAAM2G,EAAY,IAAIT,GAAQ,IAAIzE,EAAG,CAAC,CAAC,EAAE,IAAIgE,CAAQ,EAE/CK,EAAc,MAAM,KAAK,eAAeT,EAAS,EAAE,EACnD,CAAC0B,EAAaC,CAAW,EAAI,CACjCL,EAAU,IAAIE,EAAS,IAAIf,EAAY,WAAW,EAAE,IAAIA,EAAY,QAAQ,CAAC,EAAE,SAC/Ea,EAAU,IAAIE,EAAS,IAAIf,EAAY,YAAY,EAAE,IAAIA,EAAY,QAAQ,CAAC,EAAE,QAClF,EAEMmB,EAAY,MAAM,KAAK,MAAM,eAAe,EAC5C,CAACC,EAAgBC,CAAc,EAAI,CACvCC,GAAuBL,EAAa1B,EAAS,MAAM,WAAW,UAAW4B,EAAW,EAAK,EACzFG,GAAuBJ,EAAa3B,EAAS,MAAM,WAAW,UAAW4B,EAAW,EAAK,CAC3F,EAEM,CAAE,QAAArB,CAAQ,EAAI,KAAK,MACnBjB,EAAY,KAAK,gBAAgBX,CAAQ,EACzC,CAACtB,EAAOC,CAAK,EAAI,CAAC,IAAInC,EAAU6E,EAAS,MAAM,OAAO,EAAG,IAAI7E,EAAU6E,EAAS,MAAM,OAAO,CAAC,EAE9Ff,EAAqB5B,EAAM,OAAO2E,CAAQ,EAC1C7C,EAAqB7B,EAAM,OAAO0E,CAAQ,EAE5CjB,EACAE,EACE,CAAE,QAASgB,EAAqB,kBAAmBC,CAAqB,EAC5E,MAAM,KAAK,MAAM,QAAQ,wBAAwB,CAC/C,aAAclC,EAAS,MAAM,UAC7B,KAAM,IAAI7E,EAAU6E,EAAS,MAAM,OAAO,EAC1C,mBAAoBf,EACpB,MAAO,KAAK,MAAM,YAClB,WAAY,CACV,MAAO,KAAK,MAAM,YAClB,OAAQ,CACV,EACA,iBAAkB,EAAEA,GAAsBwC,GAC1C,eAAgB,CAAAxC,EAChB,oBAAqB,EACvB,CAAC,EACH8B,EAAgBkB,EAChBC,GAAwB5C,EAAU,eAAe4C,CAAoB,EAErE,GAAM,CAAE,QAASC,EAAqB,kBAAmBC,CAAqB,EAC5E,MAAM,KAAK,MAAM,QAAQ,wBAAwB,CAC/C,aAAcpC,EAAS,MAAM,UAC7B,KAAM,IAAI7E,EAAU6E,EAAS,MAAM,OAAO,EAC1C,mBAAoBb,EACpB,MAAO,KAAK,MAAM,YAClB,WAAY,CACV,MAAO,KAAK,MAAM,YAClB,OAAQ,CACV,EACA,iBAAkB,EAAEA,GAAsBsC,GAC1C,eAAgB,CAAAtC,EAChB,oBAAqB,EACvB,CAAC,EACH8B,EAAgBkB,EAChBC,GAAwB9C,EAAU,eAAe8C,CAAoB,GAEjE,CAACrB,GAAiB,CAACE,IACrB,KAAK,kBAAkB,qCAAsC,gBAAiBV,EAAQ,aAAa,EAErG,IAAMY,EAAiB,MAAMZ,EAAQ,uBAAuB,CAC1D,KAAM,IAAIpF,EAAU6E,EAAS,OAAO,OAAO,CAC7C,CAAC,EAEImB,GACH,KAAK,kBAAkB,gCAAiC,gBAAiBZ,EAAQ,aAAa,EAChG,IAAMZ,EAAWM,GAAA,KAAAA,EAAiB,MAAM,KAAK,gBAAgBD,EAAS,EAAE,EACxE,OAAAV,EAAU,eAAe,CACvB,aAAc,CACZ+C,GACE,IAAIlH,EAAU6E,EAAS,SAAS,EAChC,KAAK,MAAM,YACX,IAAI7E,EAAUwE,EAAS,SAAS,EAChC,IAAIxE,EAAU6E,EAAS,EAAE,EACzBmB,EACAJ,EACAE,EACA,IAAI9F,EAAUwE,EAAS,MAAM,CAAC,EAC9B,IAAIxE,EAAUwE,EAAS,MAAM,CAAC,EAC9BtC,EACAC,EACA,IAAInC,EAAU6E,EAAS,OAAO,OAAO,EAErCwB,EACAE,EAAY,KAAI1E,EAAA6E,EAAe,MAAf,KAAA7E,EAAsB,IAAIZ,EAAG,CAAC,CAAC,EAC/CuF,EAAY,KAAI1E,EAAA6E,EAAe,MAAf,KAAA7E,EAAsB,IAAIb,EAAG,CAAC,CAAC,CACjD,CACF,EACA,iBAAkB,CAAC2D,EAAgB,qBAAqB,EACxD,mBAAoBJ,EAAS,mBAAqB,CAACA,EAAS,kBAAkB,EAAI,CAAC,CACrF,CAAC,EACDL,EAAU,uBAAuBb,CAAmB,EACpDa,EAAU,kBAAkBZ,CAAW,EAChCY,EAAU,aAAa,CAAE,UAAAf,CAAU,CAAC,CAC7C,GAEa,KAA0B5D,EAAmD,QAAAC,EAAA,sBAlpB5F,IAAAoC,EAAAC,EAAAC,EAAAC,EAAAmF,EAAAC,EAmpBI,GAAM,CACJ,SAAAvC,EACA,SAAUC,EACV,OAAAE,EACA,SAAAqC,EACA,YAAAtC,EACA,WAAAuC,EACA,SAAArC,EAAW,EACX,OAAAE,EACA,oBAAA7B,EACA,YAAAC,EACA,UAAAH,EACA,SAAAI,CACF,EAAIhE,EAEE,CAAE,sBAAA6F,EAAuB,oBAAAlC,EAAqB,eAAAD,CAAe,EAAI1C,EAAA,CAEhE,sBAAuB,GAAO,oBAAqB,GAAO,eAAgB,IAE5E2E,GAGChB,EAAY,KAAK,gBAAgBX,CAAQ,EAEzC,CAACtB,EAAOC,CAAK,EAAI,CAAC,IAAInC,EAAU6E,EAAS,MAAM,OAAO,EAAG,IAAI7E,EAAU6E,EAAS,MAAM,OAAO,CAAC,EAE/FwC,EAKHC,EAAW,oBAAsBA,EAAW,oBACzC,IAAI,IAAIrG,GAAI,EAAIgE,GAAY,GAAK,CAAC,EAClC,IAAI,IAAIhE,EAAG,GAAK,CAAC,EANpBqG,EAAW,yBAA2BA,EAAW,yBAC9C,IAAI,IAAIrG,GAAI,EAAIgE,GAAY,GAAK,CAAC,EAClC,IAAI,IAAIhE,EAAG,GAAK,CAAC,EAOtB,IAAM6C,EAAqBe,EAAS,MAAM,UAAYgC,EAAS,SAAS,EAClE7C,EAAqBa,EAAS,MAAM,UAAYgC,EAAS,SAAS,EAClE,CAAE,QAASU,EAAe,kBAAmBC,CAAyB,EAC1E,MAAM,KAAK,MAAM,QAAQ,wBAAwB,CAC/C,KAAMtF,EACN,aAAc,IAAIlC,GAAU6B,EAAAgD,EAAS,MAAM,YAAf,KAAAhD,EAA4Ba,EAAgB,EACxE,MAAO,KAAK,MAAM,YAClB,WACEoB,GAAsB,CAACkB,EACnB,CACA,MAAO,KAAK,MAAM,YAClB,OAAQA,EAASsC,EAAW,oBAAsB,CACpD,EACE,OACN,mBAAoBxD,EACpB,iBAAkB,CAACA,EACnB,eAAgBA,EAAqB,GAAQZ,EAC7C,oBAAAC,CACF,CAAC,EACHqE,GAA4BrD,EAAU,eAAeqD,CAAwB,EAE7E,GAAM,CAAE,QAASC,EAAe,kBAAmBC,CAAyB,EAC1E,MAAM,KAAK,MAAM,QAAQ,wBAAwB,CAC/C,KAAMvF,EACN,aAAc,IAAInC,GAAU8B,EAAA+C,EAAS,MAAM,YAAf,KAAA/C,EAA4BY,EAAgB,EACxE,MAAO,KAAK,MAAM,YAClB,WACEsB,GAAsBgB,EAClB,CACA,MAAO,KAAK,MAAM,YAClB,OAAQA,EAAS,EAAIsC,EAAW,mBAClC,EACE,OACN,mBAAoBtD,EACpB,iBAAkB,CAACA,EACnB,eAAgBA,EAAqB,GAAQd,EAC7C,oBAAAC,CACF,CAAC,EACHuE,GAA4BvD,EAAU,eAAeuD,CAAwB,GAEzE,CAACH,GAAiB,CAACE,IACrB,KAAK,kBAAkB,iCAAkC,CACvD,MAAO5C,EAAS,MAAM,QAAUA,EAAS,MAAM,QAC/C,MAAOA,EAAS,MAAM,QAAUA,EAAS,MAAM,QAC/C,cAAA0C,EACA,cAAAE,EACA,mBAAA3D,EACA,mBAAAE,EACA,eAAAd,CACF,CAAC,EAEH,IAAMsB,EAAWM,GAAA,KAAAA,EAAiB,MAAM,KAAK,gBAAgBD,EAAS,EAAE,EAExE,OAAAV,EAAU,eAAe,CACvB,aAAc,CACXkD,EAoBGM,GACA,IAAI3H,EAAU6E,EAAS,SAAS,EAChC,KAAK,MAAM,YACX,IAAI7E,EAAUwE,EAAS,SAAS,EAChC,IAAIxE,EAAUwE,EAAS,OAAO,EAAE,EAChC,IAAIxE,EAAU6E,EAAS,EAAE,EAEzBG,EAASuC,EAAiBE,EAC1BzC,EAASyC,EAAiBF,EAE1B,IAAIvH,EAAUwE,EAAS,MAAMQ,EAAS,IAAM,GAAG,CAAC,EAChD,IAAIhF,EAAUwE,EAAS,MAAMQ,EAAS,IAAM,GAAG,CAAC,EAChD,IAAIhF,GAAUmH,EAAAtC,EAASG,EAAS,QAAU,OAAO,EAAE,YAArC,KAAAmC,EAAkDzE,EAAgB,EAChF,IAAI1C,GAAUoH,EAAAvC,EAASG,EAAS,QAAU,OAAO,EAAE,YAArC,KAAAoC,EAAkD1E,EAAgB,EAChFsC,EAAS9C,EAAQC,EACjB6C,EAAS7C,EAAQD,EAEjBW,GAAoB,IAAI7C,EAAU6E,EAAS,SAAS,EAAG,IAAI7E,EAAU6E,EAAS,EAAE,CAAC,EAAE,UAEnFyC,EAAW,oBACXA,EAAW,wBACb,EAxCEM,GACA,IAAI5H,EAAU6E,EAAS,SAAS,EAChC,KAAK,MAAM,YACX,IAAI7E,EAAUwE,EAAS,SAAS,EAChC,IAAIxE,EAAUwE,EAAS,OAAO,EAAE,EAChC,IAAIxE,EAAU6E,EAAS,EAAE,EACzBG,EAASuC,EAAiBE,EAC1BzC,EAASyC,EAAiBF,EAC1B,IAAIvH,EAAUwE,EAAS,MAAMQ,EAAS,IAAM,GAAG,CAAC,EAChD,IAAIhF,EAAUwE,EAAS,MAAMQ,EAAS,IAAM,GAAG,CAAC,EAChD,IAAIhF,GAAU+B,EAAA8C,EAASG,EAAS,QAAU,OAAO,EAAE,YAArC,KAAAjD,EAAkDW,EAAgB,EAChF,IAAI1C,GAAUgC,EAAA6C,EAASG,EAAS,QAAU,OAAO,EAAE,YAArC,KAAAhD,EAAkDU,EAAgB,EAChFsC,EAAS9C,EAAQC,EACjB6C,EAAS7C,EAAQD,EACjBW,GAAoB,IAAI7C,EAAU6E,EAAS,SAAS,EAAG,IAAI7E,EAAU6E,EAAS,EAAE,CAAC,EAAE,UAEnFE,EACAuC,EAAW,wBACb,CAuBJ,EACA,iBAAkB,CAACD,EAAWzC,EAAgB,gBAAkBA,EAAgB,cAAc,CAChG,CAAC,EAEDT,EAAU,uBAAuBb,CAAmB,EACpDa,EAAU,kBAAkBZ,CAAW,EAChCY,EAAU,aAAa,CAAE,UAAAf,CAAU,CAAC,CAC7C,GAEO,kBAAkB,CACvB,KAAAnB,EACA,SAAA4F,EACA,WAAAC,EACA,SAAA7C,CACF,EAaE,CACA,IAAM8C,EAAWD,EAAW,SAAS,IAAM7F,EAAK,MAAM,QAEhDqF,EAAaU,GAAgB,KACjCH,EACAE,EAAW9F,EAAK,YAAcA,EAAK,aACnC8F,EAAW9F,EAAK,aAAeA,EAAK,YACpCA,EAAK,WAAW,YAClB,EAEMgG,EAAiB,IAAIzG,EAAQ8F,EAAW,yBAAyB,SAAS,CAAC,EAAE,IACjFA,EAAW,oBAAoB,SAAS,CAC1C,EAEMY,EAAeZ,EAAW,yBAAyB,IAAI,IAAIrG,GAAI,EAAIgE,GAAY,GAAK,CAAC,EAAE,IAAI,IAAIhE,EAAG,GAAK,CAAC,EAE9G,MAAO,CACL,SAAUqG,EAAW,oBAAoB,GAAGO,CAAQ,EACpD,SAAAA,EACA,UAAWP,EAAW,yBACtB,aAAAY,EACA,eAAAD,EACA,IAAKX,EAAW,SAChB,YAAarF,EAAK,UAAU,IAAIgG,CAAc,EAAE,IAAIhG,EAAK,SAAS,CACpE,CACF,CAEO,kBAAkB,CACvB,SAAA4C,EACA,YAAAvD,EACA,aAAAC,EACA,OAAA4G,EACA,SAAAlD,EACA,UAAAwB,EACA,OAAAzB,CACF,EAME,CA51BJ,IAAAnD,EAAAC,EAAAC,EAAAC,EAAAmF,EAAAC,EAAAgB,EAAAC,EAAAC,EA61BI,IAAMC,EAAc,EAAI,OAAOtD,EAAS,cAAc,CAAC,EAAI,IACrDF,EAAc,IAAI9D,EACtB,IAAIO,EAAQ2G,CAAM,EACf,IAAIvF,EAAA,GAAMiC,EAASG,EAAS,QAAU,OAAO,EAAE,SAAQ,EACvD,IAAIuD,CAAW,EACf,QAAQ,CAAC,CACd,EACM/C,EAAiBoB,GACrB7B,EACAF,EAASG,EAAS,QAAU,OAAO,EAAE,WAAW,UAChDyB,EACA,EACF,EACM+B,EAAyBzD,EAAY,KAAIlD,EAAA2D,EAAe,MAAf,KAAA3D,EAAsB,IAAIZ,EAAG,CAAC,CAAC,EAExEoF,EAAW,IAAIpF,EACnB,IAAIO,EAAQqD,EAAS,QAAQ,EAAE,IAAIjC,EAAA,GAAMiC,EAAS,OAAO,SAAQ,EAAE,QAAQ,EAAGrD,EAAQ,UAAU,CAClG,EACA,KAAK,SAAS,eAAgBF,EAAY,SAAS,EAAG,gBAAiBC,EAAa,SAAS,CAAC,EAE9F,KAAK,SACH,WACAyD,EAASH,EAAS,MAAM,OAASA,EAAS,MAAM,OAChD,YACAE,EAAY,SAAS,EACrB,gBACAhD,GAAAD,EAAA0D,EAAe,MAAf,YAAA1D,EAAoB,aAApB,KAAAC,EAAkC,EAClC,gBACAiD,EAASH,EAAS,MAAM,OAASA,EAAS,MAAM,OAChD,YACA,GAAGI,EAAS,cAAc,CAAC,GAC7B,EAGA,IAAMwD,EAAQzD,EAAS,OAAS,QAChC,KAAK,SAAS,cAAeyD,CAAK,EAElC,IAAMlD,EAAYiD,EAAuB,IAAInC,CAAQ,EAAE,IAAIoC,IAAU,OAASnH,EAAcC,CAAY,EACpGmH,EAAyC,CAC3C,OAAQC,GACR,IAAK,OACL,eAAgB,MAClB,EACA,GAAI,CAACH,EAAuB,OAAO,EAAG,CACpC,IAAMI,EAAeC,GAAWtD,EAAWjE,EAAaC,EAAc8E,CAAQ,EAC9E,KAAK,SAAS,gBAAiB,CAC7B,QAASuC,EAAa,QAAQ,SAAS,EACvC,QAASA,EAAa,QAAQ,SAAS,CACzC,CAAC,EACDF,EAAmB9B,GACjBgC,EAAa5D,EAAS,UAAY,SAAS,EAC3CH,EAASG,EAAS,QAAU,OAAO,EAAE,WAAW,UAChDyB,EACA,EACF,CACF,CAEA,IAAMN,EAAY,IAAIT,GAAQ,IAAIzE,EAAG,CAAC,CAAC,EAAE,IAAIgE,CAAQ,EAC/C6D,EAAe,IAAIpD,GAAQ,IAAIzE,EAAG,CAAC,CAAC,EAAE,IAAIgE,CAAQ,EAClD8D,EAAyBnC,GAC7BT,EAAU,IAAIuC,EAAiB,OAAO,KAAI1G,EAAA0G,EAAiB,MAAjB,KAAA1G,EAAwB,IAAIf,EAAG,CAAC,CAAC,CAAC,EAAE,SAC9E4D,EAASG,EAAS,QAAU,OAAO,EAAE,WAAW,UAChDyB,EACA,EACF,EACMuC,EAA4BpC,GAChCkC,EAAa,IAAIJ,EAAiB,OAAO,KAAIvB,EAAAuB,EAAiB,MAAjB,KAAAvB,EAAwB,IAAIlG,EAAG,CAAC,CAAC,CAAC,EAAE,SACjF4D,EAASG,EAAS,QAAU,OAAO,EAAE,WAAW,UAChDyB,EACA,EACF,EAEA,YAAK,SACH,iBACAiC,EAAiB,OAAO,SAAS,EACjC,qBACAN,GAAAhB,EAAAsB,EAAiB,MAAjB,YAAAtB,EAAsB,aAAtB,KAAAgB,EAAoC,EACpC,oBACAW,EAAuB,OAAO,SAAS,EACvC,wBACAT,GAAAD,EAAAU,EAAuB,MAAvB,YAAAV,EAA4B,aAA5B,KAAAC,EAA0C,CAC5C,EAEO,CACL,eAAA9C,EACA,cAAekD,EACf,iBAAkBK,EAClB,iBAAkBC,EAClB,UAAAzD,CACF,CACF,CACF,EAEA,SAASsD,GAAWI,EAAQC,EAAiBC,EAAiBC,EAA0C,CACtG,IAAIC,EAAUJ,EAAG,IAAIC,CAAW,EAAE,IAAIE,CAAM,EACxC,CAACC,EAAQ,OAAO,GAAK,CAACJ,EAAG,IAAIC,CAAW,EAAE,IAAIE,CAAM,EAAE,OAAO,IAAGC,EAAUA,EAAQ,IAAI,IAAIpI,EAAG,CAAC,CAAC,GACnG,IAAIqI,EAAUL,EAAG,IAAIE,CAAW,EAAE,IAAIC,CAAM,EAC5C,MAAI,CAACE,EAAQ,OAAO,GAAK,CAACL,EAAG,IAAIE,CAAW,EAAE,IAAIC,CAAM,EAAE,OAAO,IAAGE,EAAUA,EAAQ,IAAI,IAAIrI,EAAG,CAAC,CAAC,GAE5F,CACL,QAAAoI,EACA,QAAAC,CACF,CACF,CSp8BA,OAAqB,aAAAC,GAAmB,eAAAC,GAAa,0BAAAC,OAA8B,kBACnF,OAAS,oBAAAC,OAAwB,oBACjC,OAAOC,OAAQ,QAgCf,IAAqBC,EAArB,MAAqBA,UAAkBC,EAAW,CAgEhD,OAAO,aACLC,EACAC,EAIA,CACA,OAAOC,GAAmB,CAACJ,EAAU,YAAY,KAAK,GAAIG,EAAM,SAAS,CAAC,EAAGD,CAAS,CACxF,CAEA,OAAO,cACLA,EACAG,EACAC,EACAC,EAIA,CACA,OAAOH,GACL,CACEJ,EAAU,YAAY,MAAM,GAC5BK,EAAO,SAAS,EAChBC,EAAM,SAAS,EAEf,OAAO,KAAK,IAAIE,GAAGD,CAAO,EAAE,QAAQ,CAAC,CACvC,EACAL,CACF,CACF,CAEA,OAAa,WAAWO,EAYC,QAAAC,EAAA,yBAZD,CACtB,WAAAC,EACA,UAAAT,EACA,QAAAU,EACA,OAAAC,EACA,UAAAC,CACF,EAMyB,CACvB,GAAIF,EAAQ,SAAW,EAAG,MAAO,CAAC,EAElC,IAAMG,EAAaH,EAAQ,IAAKI,GAAOhB,EAAU,aAAaE,EAAWc,CAAE,EAAE,SAAS,EAEhFC,EAA2B,CAAC,EAClC,QAASC,EAAc,EAAGA,EAAclB,EAAU,gBAAgB,OAAQkB,IACxED,EAAY,KACV,GAAGF,EAAW,IAAKC,GAAOhB,EAAU,cAAcE,EAAWc,EAAIH,EAAQK,CAAW,EAAE,SAAS,CACjG,EAGF,IAAMC,EAAU,MAAMC,GAAwBT,EAAY,CAAC,GAAGI,EAAY,GAAGE,CAAW,CAAC,EAEnFI,EAAoB,CAAC,EAC3B,QAASC,EAAQ,EAAGA,EAAQH,EAAQ,OAAQG,IAAS,CACnD,IAAMf,EAAU,KAAK,MAAMe,EAAQV,EAAQ,MAAM,EAC3CW,EAAID,EAAQV,EAAQ,OAEpBY,EAAaT,EAAWQ,CAAC,EACzBE,EAAcR,EAAYK,CAAK,EAC/BI,EAAgBP,EAAQI,CAAC,EACzBI,EAAiBR,EAAQP,EAAQ,OAASU,CAAK,EAErD,GADI,EAAEI,GAAiBC,IAErBD,EAAc,KAAK,SAAW1B,EAAU,YAAY,MACpD2B,EAAe,KAAK,SAAW3B,EAAU,aAAa,KAEtD,SAEF,IAAM4B,EAAe5B,EAAU,YAAY,OAAO0B,EAAc,IAAI,EAC9DG,EAAgB7B,EAAU,aAAa,OAAO2B,EAAe,IAAI,EAEjEG,EAAWF,EAAa,SAAS,SAAS,EAC1CG,EAAUH,EAAa,QAAQ,SAAS,EAExCI,EACJH,EAAc,UAAU,IAAKN,GAAMA,EAAE,WAAW,GAAG,IAAIf,GAAG,CAAC,CAAC,CAAC,EAAE,OAAQe,GAAM,CAACA,CAAC,EAAE,SAAW,EACxFU,EAAiBnB,EAAYgB,GAAYhB,EAAYiB,GAAWH,EAAa,SAAW,EAExFM,EAAWF,GAAoBC,EAErCZ,EAAK,KAAK,CACR,UAAAnB,EACA,OAAQsB,EACR,MAAOI,EAAa,MACpB,eAAgBH,EAChB,iBAAkBI,EAAc,SAEhC,QAAS7B,EAAU,gBAAgBO,CAAO,EAE1C,SAAAuB,EACA,QAAAC,EAEA,SAAAG,EACA,kBAAoBF,EAAuCC,EAA0C,OAAzB,uBAArC,iBAEvC,UAAWL,EAAa,UAAU,IAAI,CAACO,EAAeZ,KAAO,CAC3D,YAAaY,EAAc,YAC3B,UAAWA,EAAc,UACzB,aAAcA,EAAc,aAC5B,UAAWA,EAAc,UACzB,WAAYN,EAAc,UAAUN,CAAC,EAAE,WAAW,IAAIM,EAAc,UAAUN,CAAC,EAAE,aAAa,CAChG,EAAE,CACJ,CAAC,CACH,CAEA,OAAOF,CACT,GAEa,qBAAqBZ,EAiBhC,QAAAC,EAAA,yBAjBgC,CAChC,SAAA0B,EACA,UAAAC,EACA,SAAAC,CACF,EAaE,CACKD,EAAU,QAAQ,KAAK,MAAM,WAAW,EAC7C,IAAME,EAAY,KAAK,gBAAgBD,CAAQ,EACzCzB,EAASwB,EAAU,QAAU,KAAK,MAAM,YAExCG,EAA8B,CAAC,EACrC,QAAWC,KAAaL,EAAS,UAAW,CAC1C,GAAM,CAAE,QAAAM,EAAS,kBAAAC,CAAkB,EAAI,MAAM,KAAK,MAAM,QAAQ,wBAAwB,CACtF,KAAMF,EAAU,YAChB,MAAO,KAAK,MAAM,YAClB,mBAAoBA,EAAU,YAAY,OAAOG,EAAM,KAAK,IAAI,EAChE,WAAY,CACV,MAAO/B,EACP,OAAQ,CACV,EACA,iBAAkB,CAAC4B,EAAU,YAAY,OAAOG,EAAM,KAAK,IAAI,EAE/D,eAAgBH,EAAU,YAAY,OAAOG,EAAM,KAAK,IAAI,EAAI,GAAQP,EAAU,cACpF,CAAC,EACDM,GAAqBJ,EAAU,eAAeI,CAAiB,EAC/DH,EAAe,KAAKE,CAAQ,CAC9B,CAEAH,EAAU,eAAe,CACvB,aAAc,CACZvC,EAAU,qBAAqB,CAC7B,UAAWoC,EAAS,UACpB,SAAAA,EACA,UAAW,CACT,OAAAvB,EACA,SAAUuB,EAAS,eACnB,aAAcI,CAChB,CACF,CAAC,CACH,CACF,CAAC,EACD,GAAM,CAAE,YAAAK,EAAa,QAAAC,CAAQ,EAAIP,EAAU,MAAM,EAEjD,MAAO,CACL,CACE,YAAAM,EACA,OAAQC,CACV,CACF,CACF,GAEa,wBAAwBrC,EAgBnC,QAAAC,EAAA,yBAhBmC,CACnC,UAAAqC,EACA,UAAAV,EACA,SAAAC,CACF,EAYE,CACA,IAAMC,EAAY,KAAK,gBAAgBD,CAAQ,EACzCzB,EAASwB,EAAU,QAAU,KAAK,MAAM,YAExCW,EAA8C,CAAC,EAErD,QAAWZ,KAAYW,EAAW,CAChC,IAAMP,EAA8B,CAAC,EACrC,QAAWC,KAAaL,EAAS,UAAW,CAC1C,GAAM,CAAE,QAASa,EAAW,kBAAAN,CAAkB,EAAI,MAAM,KAAK,MAAM,QAAQ,wBAAwB,CACjG,KAAMF,EAAU,YAChB,MAAO,KAAK,MAAM,YAClB,mBAAoBA,EAAU,YAAY,OAAOG,EAAM,KAAK,IAAI,EAChE,WAAY,CACV,MAAO/B,EACP,OAAQ,CACV,EACA,iBAAkB,CAAC4B,EAAU,YAAY,OAAOG,EAAM,KAAK,IAAI,EAE/D,eAAgBH,EAAU,YAAY,OAAOG,EAAM,KAAK,IAAI,EAAI,GAAQP,EAAU,cACpF,CAAC,EACDM,GAAqBJ,EAAU,eAAeI,CAAiB,EAE3DM,IACFD,EAAaP,EAAU,YAAY,SAAS,CAAC,EAAIQ,EACjDT,EAAe,KAAKS,CAAS,EAEjC,CAEAV,EAAU,eAAe,CACvB,aAAc,CACZvC,EAAU,qBAAqB,CAC7B,UAAWoC,EAAS,UACpB,SAAAA,EACA,UAAW,CACT,OAAAvB,EACA,SAAUuB,EAAS,eACnB,aAAcI,CAChB,CACF,CAAC,CACH,CACF,CAAC,CACH,CAEA,GAAM,CAAE,YAAAK,EAAa,QAAAC,CAAQ,EAAIP,EAAU,MAAM,EAC3CW,EAAeX,EAAU,gBAE/B,OAAIY,GAAwBD,EAAc,CAACrC,EAAQ,GAAGiC,EAAQ,IAAKM,GAAMA,EAAE,SAAS,CAAC,CAAC,EAC7E,CACL,CACE,YAAAP,EACA,OAAQC,CACV,CACF,EAEO,CACL,CACE,YAAa,IAAIO,GAAY,EAAE,IAAI,GAAGH,EAAa,MAAM,EAAGX,EAAU,UAAU,aAAa,OAAS,CAAC,CAAC,EACxG,OAAQO,CACV,EACA,CACE,YAAa,IAAIO,GAAY,EAAE,IAAI,GAAGH,EAAa,MAAMX,EAAU,UAAU,aAAa,OAAS,CAAC,CAAC,EACrG,OAAQ,CAAC,CACX,EACA,CAAE,YAAa,IAAIc,GAAY,EAAE,IAAI,GAAGd,EAAU,UAAU,eAAe,EAAG,OAAQ,CAAC,CAAE,CAC3F,CAEJ,GAEA,OAAO,qBAAqB,CAC1B,UAAArC,EACA,SAAAkC,EACA,UAAAC,CACF,EAS2B,CACzB,IAAMiB,EAAaC,EAAO,CAAC,CAAC,EAEtBC,EAAO,CACX,CAAE,OAAQnB,EAAU,OAAQ,SAAU,GAAM,WAAY,EAAK,EAC7D,CAAE,OAAQD,EAAS,OAAQ,SAAU,GAAO,WAAY,EAAK,EAC7D,CAAE,OAAQC,EAAU,SAAU,SAAU,GAAO,WAAY,EAAK,EAEhE,GAAGA,EAAU,aAAa,IAAKd,IAAO,CAAE,OAAQA,EAAG,SAAU,GAAO,WAAY,EAAK,EAAE,EACvF,GAAGa,EAAS,UAAU,IAAI,CAAC,CAAE,UAAAqB,CAAU,KAAO,CAAE,OAAQA,EAAW,SAAU,GAAO,WAAY,EAAK,EAAE,EAEvG,CAAE,OAAQC,GAAkB,SAAU,GAAO,WAAY,EAAM,CACjE,EAEMC,EAAO,OAAO,MAAML,EAAW,IAAI,EACzCA,EAAW,OAAO,CAAC,EAAGK,CAAI,EAC1B,IAAMC,EAAQ,OAAO,KAAK,CAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,GAAK,GAAGD,CAAI,CAAC,EAE3E,OAAO,IAAIE,GAAuB,CAChC,KAAAL,EACA,UAAAtD,EACA,KAAM0D,CACR,CAAC,CACH,CACF,EA1WqB5D,EACZ,YAAc,EADFA,EAEZ,YAAcuD,EAAO,CAC1BO,GAAK,CAAC,EACNC,EAAG,MAAM,EACTA,EAAG,QAAQ,EACXC,EAAI,UAAU,EACdA,EAAI,SAAS,EACbC,EAAU,OAAO,EAEjBC,GACEX,EAAO,CACLQ,EAAG,cAAc,EACjBE,EAAU,aAAa,EACvBA,EAAU,WAAW,EACrBD,EAAI,WAAW,EACfA,EAAI,oBAAoB,CAC1B,CAAC,EACDhE,EAAU,YACV,WACF,EACAkE,GAAIF,EAAI,EAAG,GAAI,SAAS,CAC1B,CAAC,EAtBkBhE,EAwBZ,aAAeuD,EAAO,CAC3BO,GAAK,CAAC,EACNC,EAAG,MAAM,EACTA,EAAG,SAAS,EACZE,EAAU,QAAQ,EAClBA,EAAU,OAAO,EACjBD,EAAI,UAAU,EAEdE,GACEX,EAAO,CAACU,EAAU,aAAa,EAAGD,EAAI,YAAY,EAAGA,EAAI,eAAe,CAAC,CAAC,EAC1EhE,EAAU,YACV,WACF,EACAkE,GAAIF,EAAI,EAAG,EAAG,SAAS,CACzB,CAAC,EAtCkBhE,EAwCZ,gBAAkB,CACvB,+CACA,+CACA,+CACA,+CACA,+CACA,+CACA,+CACA,+CACA,8CACF,EAAE,IAAKuB,GAAM,IAAI4C,GAAU5C,CAAC,CAAC,EAlDVvB,EAoDZ,YAAc,CACnB,KAAM,CACJ,GAAI,OAAO,KAAK,YAAa,MAAM,CACrC,EACA,MAAO,CACL,GAAI,OAAO,KAAK,kBAAmB,MAAM,CAC3C,CACF,EA3DmBA,EA6DZ,gBAAkB,CAAC,OAAW,WAAY,QAAS,OAAO,EA7DnE,IAAqBoE,GAArBpE,EClCA,OAAS,aAAAqE,OAAiB,kBAC1B,OAAS,cAAAC,GAAY,yBAAAC,GAAuB,oBAAAC,OAAwB,oBASpE,IAAqBC,GAArB,cAAyCC,EAAW,CAYlD,YAAYC,EAAyB,CACnC,MAAMA,CAAM,EAZd,KAAQ,WAA0B,CAAC,EACnC,KAAQ,UAAoC,IAAI,IAChD,KAAQ,eAA8B,IAAI,IAC1C,KAAQ,WAA8E,CACpF,SAAU,IAAI,IACd,IAAK,IAAI,IACT,MAAO,IAAI,GACb,EACA,KAAQ,UAAyB,IAAI,IACrC,KAAQ,gBAA+B,CAAC,CAIxC,CAEa,KAAKA,EAA8D,QAAAC,EAAA,sBAC9E,KAAK,cAAc,EACnB,GAAM,CAAE,YAAAC,EAAc,GAAO,KAAAC,UAA2B,EAAIH,GAAU,CAAC,EACjE,CAAE,SAAAI,EAAU,UAAAC,EAAW,UAAAC,CAAU,EAAI,MAAM,KAAK,MAAM,iBAAiBJ,CAAW,EAClFK,EAAM,MAAM,KAAK,MAAM,kBAAkBL,CAAW,EAE1D,KAAK,WAAa,CAAC,EACnB,KAAK,UAAY,IAAI,IACrB,KAAK,eAAiB,IAAI,IAAIG,CAAS,EACvC,KAAK,WAAa,CAAE,SAAU,IAAI,IAAO,IAAK,IAAI,IAAO,MAAO,IAAI,GAAM,EAC1E,KAAK,UAAY,IAAI,IAAIC,CAAS,EAElC,KAAK,UAAU,IAAIE,GAAS,QAASA,EAAQ,EAC7C,KAAK,WAAW,SAAS,IAAIA,GAAS,OAAO,EAE7CJ,EAAS,QAASK,GAAU,CAzChC,IAAAC,EA0CU,KAAK,eAAe,IAAID,EAAM,OAAO,IACzC,KAAK,UAAU,IAAIA,EAAM,QAASE,EAAAC,EAAA,GAC7BH,GAD6B,CAEhC,KAAM,OACN,SAAU,EACV,WACEC,EAAAD,EAAM,YAAN,KAAAC,EACCD,EAAM,KAAK,SAAS,YAAY,EAAII,GAAsB,SAAS,EAAIC,GAAiB,SAAS,CACtG,EAAC,EACD,KAAK,WAAW,SAAS,IAAIL,EAAM,OAAO,EAC5C,CAAC,EAEDF,EAAI,QAASE,GAAU,CAtD3B,IAAAC,EAuDU,KAAK,eAAe,IAAID,EAAM,OAAO,GAAK,KAAK,UAAU,IAAIA,EAAM,OAAO,IAC9E,KAAK,UAAU,IAAIA,EAAM,QAASE,EAAAC,EAAA,GAC7BH,GAD6B,CAEhC,KAAM,UACN,SAAU,EACV,WACEC,EAAAD,EAAM,YAAN,KAAAC,EACCD,EAAM,KAAK,SAAS,YAAY,EAAII,GAAsB,SAAS,EAAIC,GAAiB,SAAS,EACpG,KAAML,EAAM,gBAAkB,CAAC,GAAIA,EAAM,MAAQ,CAAC,EAAI,WAAW,EAAIA,EAAM,IAC7E,EAAC,EACD,KAAK,WAAW,IAAI,IAAIA,EAAM,OAAO,EACvC,CAAC,EAED,KAAK,gBAAgB,QAASA,GAAU,CAClC,KAAK,eAAe,IAAIA,EAAM,OAAO,GAAK,KAAK,UAAU,IAAIA,EAAM,OAAO,IAC9E,KAAK,UAAU,IAAIA,EAAM,QAASE,EAAAC,EAAA,GAC7BH,GAD6B,CAEhC,KAAM,QACN,SAAU,EACV,UACEA,EAAM,WAAaA,EAAM,KAAK,SAAS,YAAY,EAC/CI,GAAsB,SAAS,EAC/BC,GAAiB,SAAS,CAClC,EAAC,EACD,KAAK,WAAW,MAAM,IAAIL,EAAM,OAAO,EACzC,CAAC,EAED,KAAK,WAAa,MAAM,KAAK,KAAK,SAAS,EAAE,IAAKM,GAASA,EAAK,CAAC,CAAC,CACpE,GAEA,IAAI,WAAyB,CAC3B,OAAO,KAAK,UACd,CACA,IAAI,UAAmC,CACrC,OAAO,KAAK,SACd,CACA,IAAI,eAA6B,CAC/B,OAAO,KAAK,cACd,CACA,IAAI,WAAyD,CAC3D,OAAO,KAAK,UACd,CACA,IAAI,cAA4B,CAC9B,OAAO,KAAK,SACd,CAIa,aAAaC,EAA+C,QAAAf,EAAA,sBACvE,GAAI,CAACe,EAAM,MAAM,IAAI,MAAM,mBAAmB,EAC9C,IAAMC,EAAUD,EAAK,SAAS,EACxBE,EAAO,KAAK,UAAU,IAAID,CAAO,EACvC,GAAIC,EAAM,OAAOA,EACjB,GAAID,EAAQ,kBAAkB,IAAM,MAAO,OAAOT,GAElD,IAAMW,GAAgB,MAAM,KAAK,MAAM,IAAI,aAAa,CAACF,CAAO,CAAC,GAAG,CAAC,EACrE,GAAIE,EACF,YAAK,WAAW,MAAM,IAAIF,CAAO,EACjC,KAAK,UAAU,IAAIA,EAASN,EAAAC,EAAA,GAAKO,GAAL,CAAmB,SAAU,CAAE,EAAC,EACrDA,EAGT,IAAMC,EAAa,MAAM,KAAK,MAAM,WAAW,eAAe,IAAIC,GAAUJ,CAAO,CAAC,EACpF,GAAI,CAACG,EAAY,MAAM,IAAI,MAAM,2BAA2BH,CAAO,EAAE,EACrE,IAAMF,EAAOO,GAAW,OAAOF,EAAW,IAAI,EACxCG,EAAaN,EAAQ,SAAS,EAAE,UAAU,EAAG,CAAC,EAC9CO,EAAW,CACf,QAAS,IACT,QAASP,EACT,UAAWG,EAAW,MAAM,SAAS,EACrC,QAAS,GACT,OAAQG,EACR,KAAMA,EACN,SAAUR,EAAK,SACf,KAAM,CAAC,EACP,WAAY,CAAC,EACb,SAAU,EACV,KAAM,SACR,EACA,YAAK,WAAW,MAAM,IAAIE,CAAO,EACjC,KAAK,UAAU,IAAIA,EAASO,CAAQ,EAC7BA,CACT,GACF,E9C5EO,IAAMC,GAAN,MAAMC,CAAK,CA8BhB,YAAYC,EAA+B,CAxB3C,KAAO,YAAmC,IAAI,IAyB5C,GAAM,CACJ,WAAAC,EACA,QAAAC,EACA,MAAAC,EACA,IAAAC,EACA,iBAAAC,EACA,uBAAAC,EACA,aAAAC,EACA,oBAAAC,EAAsB,YACtB,kBAAAC,CACF,EAAIT,EAEJ,KAAK,YAAcC,EACnB,KAAK,QAAUC,GAAW,UAC1B,KAAK,OAASC,EAAQ,IAAIO,GAAMP,CAAK,EAAI,OACzC,KAAK,qBAAuBH,EAAO,oBACnC,KAAK,oBAAsBQ,EAC3B,KAAK,kBAAoBC,EAEzB,KAAK,IAAML,EACX,KAAK,cAAgBG,GAAgB,EAAI,GAAK,IAC9C,KAAK,OAASI,EAAa,MAAM,EACjC,KAAK,QAAU,IAAIC,GAAQ,CACzB,MAAO,KACP,WAAY,eACZ,cAAeZ,EAAO,cACtB,qBAAsBA,EAAO,oBAC/B,CAAC,EACD,KAAK,MAAQ,IAAIa,GAAY,CAAE,MAAO,KAAM,WAAY,cAAe,CAAC,EACxE,KAAK,KAAO,IAAIC,GAAK,CAAE,MAAO,KAAM,WAAY,WAAY,CAAC,EAC7D,KAAK,UAAY,IAAIC,GAAU,CAAE,MAAO,KAAM,WAAY,gBAAiB,CAAC,EAE5E,KAAK,aAAe,CAAC,EACrB,IAAMC,EAAM,IAAI,KAAK,EAAE,QAAQ,EAC/B,KAAK,QAAU,CAAC,EAEZV,IACF,KAAK,WAAa,CAChB,QAASU,EACT,MAAO,CACL,UAAWX,GAAoB,KAAK,IAAI,EAAIC,EAC5C,OAAQA,CACV,CACF,EACJ,CAEA,OAAa,KAAKN,EAAuC,QAAAiB,EAAA,sBA3I3D,IAAAC,EA4II,IAAMC,EAAmCC,GAEvC,CACE,QAAS,UACT,MAAO,KACP,mBAAoB,IACpB,kBAAmB,GACrB,EACApB,CACF,EACM,CAAE,QAAAE,EAAS,kBAAAmB,EAAmB,SAAAC,EAAU,YAAAC,EAAa,WAAAC,CAAW,EAAIL,EAEpEf,EAAM,IAAIqB,GAAI,CAAE,QAAAvB,EAAS,QAASmB,EAAmB,WAAAG,EAAY,SAAAF,EAAU,YAAAC,CAAY,CAAC,EACxFG,EAAO,IAAI3B,EAAK4B,EAAAC,EAAA,GACjBT,GADiB,CAEpB,IAAAf,CACF,EAAC,EAED,aAAMsB,EAAK,yBAAwBR,EAAAlB,EAAO,sBAAP,KAAAkB,EAA8B,EAAI,EAC9DQ,CACT,GAEA,IAAI,OAA2B,CAC7B,OAAO,KAAK,MACd,CACA,IAAI,aAAyB,CAC3B,GAAI,CAAC,KAAK,OAAQ,MAAM,IAAI,MAAMG,EAAW,EAC7C,OAAO,KAAK,OAAO,SACrB,CACO,SAAS1B,EAAmC,CACjD,YAAK,OAASA,EAAQ,IAAIO,GAAMP,CAAK,EAAI,OACzC,KAAK,QAAQ,mBAAmB,EACzB,IACT,CACA,IAAI,YAAyB,CAC3B,GAAI,CAAC,KAAK,YAAa,MAAM,IAAI,MAAM2B,EAAgB,EACvD,OAAO,KAAK,WACd,CACO,cAAc7B,EAA8B,CACjD,YAAK,YAAcA,EACZ,IACT,CACA,IAAI,qBAAuD,CACzD,OAAO,KAAK,oBACd,CACO,uBAAuB8B,EAAiD,CAC7E,YAAK,qBAAuBA,EACrB,IACT,CAEO,YAAmB,CACxB,GAAI,CAAC,KAAK,MACR,cAAQ,MAAMF,EAAW,EACnB,IAAI,MAAMA,EAAW,CAE/B,CAEQ,kBAAkBG,EAAuB,CAC/C,OAAO,IAAI,KAAK,EAAE,QAAQ,EAAIA,EAAO,KAAK,aAC5C,CAEa,gBAAgC,QAAAf,EAAA,sBAC3C,GAAI,CACF,IAAMgB,EAAO,MAAM,KAAK,IAAI,mBAAmB,EAC/C,KAAK,WAAa,CAChB,QAAS,KAAK,IAAI,EAClB,MAAO,CACL,UAAW,KAAK,IAAI,EAAIA,EAAK,OAAS,IACtC,OAAQA,EAAK,OAAS,GACxB,CACF,CACF,OAAQC,EAAA,CACN,KAAK,WAAa,MACpB,CACF,GAEa,iBAAiBC,EAA+C,QAAAlB,EAAA,sBAC3E,GAAI,KAAK,QAAQ,WAAa,CAAC,KAAK,kBAAkB,KAAK,QAAQ,UAAU,OAAO,GAAK,CAACkB,EACxF,OAAO,KAAK,QAAQ,UAAU,KAChC,GAAI,CACF,IAAMC,EAAW,MAAM,KAAK,IAAI,aAAa,EACvCC,EAAa,CACjB,QAAS,KAAK,IAAI,EAClB,KAAMD,CACR,EACA,YAAK,QAAQ,UAAYC,EAElBA,EAAW,IACpB,OAAS,EAAG,CACV,eAAQ,MAAM,CAAC,EACR,CACL,SAAU,CAAC,EACX,UAAW,CAAC,EACZ,UAAW,CAAC,CACd,CACF,CACF,GAEa,kBAAkBF,EAA8C,QAAAlB,EAAA,sBAC3E,IAAMqB,EAAc,KAAK,QAAQ,aACjC,GAAIA,GAAe,CAAC,KAAK,kBAAkBA,EAAY,OAAO,GAAK,CAACH,EAAa,OAAOG,EAAY,KACpG,GAAI,CACF,IAAMC,EAAU,MAAM,KAAK,IAAI,gBAAgB,EAC/C,YAAK,QAAQ,aAAe,CAC1B,QAAS,KAAK,IAAI,EAClB,KAAMA,EAAQ,IAAKC,GAAOb,EAAAC,EAAA,GACrBY,GADqB,CAExB,cAAeA,EAAE,gBAAkB,OACnC,gBAAiBA,EAAE,kBAAoB,MACzC,EAAE,CACJ,EAEO,KAAK,QAAQ,aAAa,IACnC,OAASN,EAAG,CACV,eAAQ,MAAMA,CAAC,EACR,CAAC,CACV,CACF,GAEA,IAAI,eAAmE,CAnQzE,IAAAhB,EAoQI,OAAOA,EAAA,KAAK,aAAL,YAAAA,EAAiB,KAC1B,CAEa,iBAAmC,QAAAD,EAAA,sBAvQlD,IAAAC,EAwQI,OAAI,KAAK,YAAc,KAAK,IAAI,EAAI,KAAK,WAAW,SAAW,IAAO,GAAK,EAAU,KAAK,WAAW,MAAM,QAC3G,MAAM,KAAK,eAAe,IACnBA,EAAA,KAAK,aAAL,YAAAA,EAAiB,MAAM,SAAU,EAC1C,GAEa,uBAAyC,QAAAD,EAAA,sBA7QxD,IAAAC,EA8QI,OAAI,KAAK,YAAc,KAAK,IAAI,EAAI,KAAK,WAAW,SAAW,IAAO,GAAK,EAClE,KAAK,WAAW,MAAM,WAC/B,MAAM,KAAK,eAAe,IACnBA,EAAA,KAAK,aAAL,YAAAA,EAAiB,MAAM,YAAa,KAAK,IAAI,EACtD,GAEa,gBAAqC,QAAAD,EAAA,sBAChD,OAAI,KAAK,YAAc,KAAK,IAAI,EAAI,KAAK,WAAW,SAAW,IAAO,GAAW,KAAK,WAAW,OACjG,KAAK,WAAa,CAChB,QAAS,KAAK,IAAI,EAClB,MAAO,MAAM,KAAK,WAAW,aAAa,CAC5C,EACO,KAAK,WAAW,MACzB,GAEa,wBAAwBwB,EAA8D,QAAAxB,EAAA,sBACjG,GAAIwB,EAAW,MAAO,CAAC,EACvB,GAAI,CACF,IAAMR,EAAO,MAAM,KAAK,IAAI,wBAAwB,EAC9CS,EAAgBT,EAAK,MAAQ,GACnC,YAAK,aAAe,CAClB,IAAKA,EAAK,IACV,KAAMS,EAAgB,GAAQT,EAAK,KACnC,2BAA4BS,EAAgB,GAAQT,EAAK,2BACzD,wBAAyBS,EAAgB,GAAQT,EAAK,wBACtD,oBAAqBS,EAAgB,GAAQT,EAAK,oBAClD,2BAA4BS,EAAgB,GAAQT,EAAK,2BACzD,uBAAwBS,EAAgB,GAAQT,EAAK,uBACrD,QAASS,EAAgB,GAAQT,EAAK,QACtC,WAAYS,EAAgB,GAAQT,EAAK,UAC3C,EACOA,CACT,OAAQ,GACN,MAAO,CAAC,CACV,CACF,GACF","names":["merge","axios","PublicKey","get","set","Logger","params","logLevel","level","props","msg","arg","moduleLoggers","moduleLevels","createLogger","moduleName","logger","get","set","MINT_SIZE","TOKEN_PROGRAM_ID","getTransferFeeConfig","unpackMint","logger","createLogger","getMultipleAccountsInfo","connection","publicKeys","config","__async","batchRequest","commitment","chunkCount","__spreadValues","chunkedKeys","chunkArray","results","batch","keys","key","_batch","i","unsafeRes","accountInfo","data","executable","lamports","owner","rentEpoch","PublicKey","error","getMultipleAccountsInfoWithCustomFlags","publicKeysWithCustomFlag","multipleAccountsInfo","o","idx","__spreadProps","fetchMultipleMintInfos","_0","__async","connection","mints","config","_a","_b","_c","mintInfos","getMultipleAccountsInfoWithCustomFlags","i","solToWSol","mintK","MINT_SIZE","t","unpackMint","__spreadProps","__spreadValues","TOKEN_PROGRAM_ID","getTransferFeeConfig","PublicKey","WSOLMint","BN","Decimal","_Big","BN","_toFarmat","toFormat","formatter_default","_Big","BN","_Decimal","BN","MAX_SAFE","parseBigNumberish","value","logger","createLogger","BN","logger","createLogger","Big","formatter_default","_Big","Decimal","_Decimal","toSignificantRounding","toFixedRounding","Fraction","_Fraction","numerator","denominator","BN","parseBigNumberish","other","otherParsed","significantDigits","format","rounding","quotient","decimalPlaces","logger","createLogger","Big","formatter_default","_Big","PublicKey","TOKEN_PROGRAM_ID","SOL_INFO","TOKEN_WSOL","PublicKey","PublicKey","SystemProgram","SYSVAR_RENT_PUBKEY","TOKEN_PROGRAM_ID","accountMeta","pubkey","isSigner","isWritable","commonSystemAccountMeta","validateAndParsePublicKey","orgPubKey","transformSol","publicKey","tryParsePublicKey","SOLMint","WSOLMint","e","v","MEMO_PROGRAM_ID","MEMO_PROGRAM_ID2","RENT_PROGRAM_ID","CLOCK_PROGRAM_ID","METADATA_PROGRAM_ID","INSTRUCTION_PROGRAM_ID","SYSTEM_PROGRAM_ID","RAYMint","PAIMint","SRMMint","USDCMint","USDTMint","mSOLMint","stSOLMint","USDHMint","NRVMint","ANAMint","ETHMint","solToWSol","mint","_Token","mint","decimals","symbol","name","skipMint","isToken2022","SOLMint","PublicKey","TOKEN_WSOL","validateAndParsePublicKey","other","__spreadProps","__spreadValues","Token","_Currency","decimals","symbol","name","other","SOL_INFO","Currency","BN","_100_PERCENT","Fraction","BN","Percent","significantDigits","format","rounding","decimalPlaces","logger","createLogger","PublicKey","BN","BN_ZERO","BN","BN_ONE","BN_TWO","BN_THREE","BN_FIVE","BN_TEN","BN_100","BN_1000","BN_10000","chunkArray","arr","chunkSize","cache","tmp","Owner","_Owner","owner","PublicKey","TOKEN_PROGRAM_ID","ComputeBudgetProgram","Keypair","PublicKey","Transaction","TransactionMessage","VersionedTransaction","InstructionType","TOKEN_PROGRAM_ID","logger","createLogger","MAX_BASE64_SIZE","addComputeBudget","config","ins","insTypes","ComputeBudgetProgram","InstructionType","getRecentBlockHash","connection","propsCommitment","__async","_a","_b","commitment","confirmTransaction","txId","resolve","reject","id","signatureResult","forecastTransactionSize","instructions","signers","transaction","Transaction","error","findProgramAddress","seeds","programId","publicKey","nonce","PublicKey","checkLegacyTxSize","instructions","payer","signers","forecastTransactionSize","checkV0TxSize","lookupTableAddressAccount","recentBlockhash","Keypair","messageV0","TransactionMessage","VersionedTransaction","MAX_BASE64_SIZE","error","toBuffer","arr","txToBase64","transaction","serialized","VersionedTransaction","printSimulate","transactions","allBase64","Transaction","TOKEN_PROGRAM_ID","Keypair","getATAAddress","owner","mint","programId","findProgramAddress","TOKEN_PROGRAM_ID","PublicKey","PublicKey","CREATE_CPMM_POOL_PROGRAM","CREATE_CPMM_POOL_AUTH","CREATE_CPMM_POOL_FEE_ACC","DEV_CREATE_CPMM_POOL_PROGRAM","DEV_CREATE_CPMM_POOL_AUTH","DEV_CREATE_CPMM_POOL_FEE_ACC","DEVNET_PROGRAM_ID","PublicKey","DEV_CREATE_CPMM_POOL_PROGRAM","DEV_CREATE_CPMM_POOL_AUTH","DEV_CREATE_CPMM_POOL_FEE_ACC","BN","POINT","getTransferAmountFeeV2","amount","_feeConfig","epochInfo","addFee","feeConfig","__spreadProps","__spreadValues","nowFeeConfig","maxFee","BN","expirationTime","POINT","nowMaxFee","_TAmount","BNDivCeil","TAmount","_fee","fee","BNDivCeil","bn1","bn2","div","mod","BN","PublicKey","AddressLookupTableAccount","getMultipleLookupTableInfo","_0","__async","connection","address","dataInfos","getMultipleAccountsInfo","i","PublicKey","outDict","info","key","lookupAccount","AddressLookupTableAccount","LOOKUP_TABLE_CACHE","PublicKey","sendAndConfirmTransaction","SystemProgram","Transaction","TransactionMessage","VersionedTransaction","axios","LOOP_INTERVAL","TxBuilder","params","__async","_a","json","axios","avg","config","instructions","instructionTypes","addComputeBudget","tipConfig","SystemProgram","PublicKey","InstructionType","_0","propConfig","defaultIns","e","endInstructions","signers","endInstructionTypes","lookupTableAddress","address","txVersion","extInfo","__spreadValues","transaction","Transaction","s","propBlockHash","skipPreflight","sendAndConfirm","recentBlockHash","getRecentBlockHash","printSimulate","sendAndConfirmTransaction","txs","item","extraPreBuildData","filterExtraBuildData","data","allTransactions","allSigners","allInstructionTypes","executeParams","sequentially","onTxUpdate","skipTxCount","txIds","i","tx","txId","partialSignedTxs","idx","signedTxs","processedTxs","checkSendTx","confirmed","intervalId","subSignatureId","cbk","signatureResult","targetTxIdx","r","result","d","props","_b","lookupTableCache","forerunCreate","propRecentBlockhash","__objRest","lookupTableAddressAccount","LOOKUP_TABLE_CACHE","allLTA","needCacheLTA","newCacheLTA","getMultipleLookupTableInfo","key","value","recentBlockhash","messageV0","TransactionMessage","VersionedTransaction","confirmTransaction","buildProps","splitIns","computeBudgetConfig","computeBudgetData","signerKey","acc","cur","__spreadProps","instructionQueue","splitInsIdx","_itemIns","_itemInsWithCompute","_signer","ii","checkLegacyTxSize","_signers","needSignedTx","blockHash","checkV0TxSize","Connection","API_URLS","DEV_API_URLS","__spreadValues","SESSION_KEY","STORAGE_KEY","getSessionKey","key","updateReqHistory","_a","__async","_b","logCount","removeLastLog","resData","__objRest","resolve","data","__spreadProps","__spreadValues","e","success","resStr","logger","createLogger","poolKeysCache","Api","cluster","timeout","logRequests","logCount","urlConfigs","axios","API_URLS","config","method","baseURL","url","logger","error","response","data","status","updateReqHistory","__async","endpointUrl","slotList","a","b","props","idList","cacheList","readyList","poolId","poolKeysCache","poolKey","mint","m","EMPTY_OWNER","EMPTY_CONNECTION","PublicKey","SystemProgram","AccountLayout","createAssociatedTokenAccountInstruction","TOKEN_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","joinMsg","args","arg","ModuleBase","scope","moduleName","createLogger","feePayer","TxBuilder","message","PublicKey","SystemProgram","BN","createCloseAccountInstruction","createInitializeAccountInstruction","createTransferInstruction","TOKEN_PROGRAM_ID","Keypair","PublicKey","BN","TOKEN_PROGRAM_ID","sha256","PublicKey","BN","isBN","_bits","_BitStructure","_blob","_Blob","_cstr","_f32","_f32be","_f64","_f64be","_greedy","_Layout","_ns64","_ns64be","_nu64","_nu64be","_offset","_s16","_s16be","_s24","_s24be","_s32","_s32be","_s40","_s40be","_s48","_s48be","_s8","_seq","_struct","_Structure","_u16","_u16be","_u24","_u24be","_u32","_u32be","_u40","_u40be","_u48","_u48be","_u8","_UInt","_union","_Union","_unionLayoutDiscriminator","_utf8","Layout","Structure","UInt","_UInt","u8","_u8","u16","_u16","seq","_seq","blob","_blob","BNLayout","Layout","span","signed","property","blob","b","offset","num","BN","src","u8","property","UInt","u32","u64","BNLayout","WrappedLayout","Layout","layout","decoder","encoder","property","b","offset","src","publicKey","blob","PublicKey","key","bool","property","WrappedLayout","u8","decodeBool","encodeBool","value","Structure","b","offset","struct","fields","property","decodePrefixes","seq","elementLayout","count","property","parsedCount","superCount","isBN","target","countProperty","value","splAccountLayout","struct","publicKey","u64","u32","u8","logger","createLogger","parseTokenAccountResp","owner","solAccountResp","tokenAccountResp","tokenAccounts","tokenAccountRawInfos","pubkey","account","accountInfo","splAccountLayout","mint","amount","getATAAddress","PublicKey","BN","generatePubKey","fromPublicKey","programId","TOKEN_PROGRAM_ID","assignSeed","seed","Keypair","createWithSeed","buffer","publicKeyBytes","sha256","initTokenAccountInstruction","params","mint","tokenAccount","owner","programId","TOKEN_PROGRAM_ID","createInitializeAccountInstruction","closeAccountInstruction","payer","multiSigners","createCloseAccountInstruction","createWSolAccountInstructions","__async","connection","amount","commitment","skipCloseAccount","balanceNeeded","splAccountLayout","lamports","parseBigNumberish","BN","newAccount","generatePubKey","SystemProgram","PublicKey","TOKEN_WSOL","InstructionType","makeTransferInstruction","source","destination","tokenProgram","createTransferInstruction","Account","ModuleBase","params","tokenAccounts","tokenAccountRawInfos","notSubscribeAccountChange","subscribe","cbk","listener","mint","programId","getATAAddress","config","__async","customConfig","__spreadValues","solAccountResp","ownerTokenAccountResp","ownerToken2022AccountResp","TOKEN_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","parseTokenAccountResp","cb","_0","associatedOnly","accountMint","a","b","ata","tokenAccount","publicKey","_a","_b","_c","_d","createInfo","owner","notUseTokenAccount","skipCloseAccount","checkCreateATAOwner","assignSeed","tokenProgram","PublicKey","accounts","i","newTxInstructions","_createATAIns","createAssociatedTokenAccountInstruction","_ataInTokenAcc","ataInfo","InstructionType","AccountLayout","WSOLMint","txInstruction","createWSolAccountInstructions","makeTransferInstruction","closeAccountInstruction","newTokenAccount","generatePubKey","balanceNeeded","createAccountIns","SystemProgram","initTokenAccountInstruction","autoUnwrapWSOLToSOL","tokenAccountAddress","accountTokenMint","ataAddress","instruction","side","amount","payer","bypassAssociatedCheck","instructions","props","useSOLBalance","handleTokenAccount","feePayer","txBuilder","_tokenAccount","__objRest","PublicKey","AccountLayout","NATIVE_MINT","TOKEN_PROGRAM_ID","BN","Decimal","BN","checkedRem","dividend","divisor","checkedCeilDiv","rhs","quotient","remainder","ZERO","BN","ConstantProductCurve","sourceAmount","swapSourceAmount","swapDestinationAmount","invariant","newSwapSourceAmount","newSwapDestinationAmount","destinationAmountSwapped","lpTokenAmount","lpTokenSupply","swapTokenAmount0","swapTokenAmount1","roundDirection","tokenAmount0","tokenAmount1","BN","FEE_RATE_DENOMINATOR_VALUE","ceilDiv","tokenAmount","feeNumerator","feeDenominator","floorDiv","CpmmFee","amount","tradeFeeRate","protocolFeeRate","fundFeeRate","CurveCalculator","tokenAmount0","tokenAmount1","sourceAmount","swapSourceAmount","swapDestinationAmount","tradeFeeRate","tradeFee","CpmmFee","sourceAmountLessFees","destinationAmountSwapped","ConstantProductCurve","poolMintA","poolMintB","baseReserve","quoteReserve","outputMint","outputAmount","reserveInAmount","reserveOutAmount","reserveInDecimals","reserveOutDecimals","inputMint","currentPrice","Decimal","__pow","amountRealOut","BN","denominator","amountInWithoutFee","BNDivCeil","amountIn","fee","executionPrice","priceImpact","BN","Decimal","SPL_MINT_LAYOUT","struct","u32","publicKey","u64","u8","PublicKey","MintLayout","TOKEN_PROGRAM_ID","toApiV3Token","_a","_b","address","programId","decimals","props","__objRest","__spreadValues","solToWSol","toFeeConfig","config","__spreadProps","PublicKey","TransactionInstruction","Keypair","SystemProgram","ASSOCIATED_TOKEN_PROGRAM_ID","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","AUTH_SEED","AMM_CONFIG_SEED","POOL_SEED","POOL_LP_MINT_SEED","POOL_VAULT_SEED","OBSERVATION_SEED","getPdaPoolAuthority","programId","findProgramAddress","getCpmmPdaPoolId","programId","ammConfigId","mintA","mintB","findProgramAddress","POOL_SEED","getPdaLpMint","poolId","POOL_LP_MINT_SEED","getPdaVault","mint","POOL_VAULT_SEED","getPdaObservationId","OBSERVATION_SEED","getCreatePoolKeys","propPoolId","programId","configId","mintA","mintB","authority","getPdaPoolAuthority","poolId","getCpmmPdaPoolId","lpMint","getPdaLpMint","vaultA","getPdaVault","vaultB","observationId","getPdaObservationId","LOCK_LIQUIDITY_SEED","logger","createLogger","anchorDataBuf","makeCreateCpmmPoolInInstruction","programId","creator","configId","authority","poolId","mintA","mintB","lpMint","userVaultA","userVaultB","userLpAccount","vaultA","vaultB","createPoolFeeAccount","mintProgramA","mintProgramB","observationId","amountMaxA","amountMaxB","openTime","dataLayout","struct","u64","pdaPoolId","getCpmmPdaPoolId","keys","TOKEN_PROGRAM_ID","ASSOCIATED_TOKEN_PROGRAM_ID","SYSTEM_PROGRAM_ID","RENT_PROGRAM_ID","data","TransactionInstruction","makeDepositCpmmInInstruction","owner","lpAmount","TOKEN_2022_PROGRAM_ID","makeWithdrawCpmmInInstruction","amountMinA","amountMinB","MEMO_PROGRAM_ID2","makeSwapCpmmBaseInInstruction","payer","userInputAccount","userOutputAccount","inputVault","outputVault","inputTokenProgram","outputTokenProgram","inputMint","outputMint","amountIn","amounOutMin","makeSwapCpmmBaseOutInstruction","amountInMax","amountOut","CpmmConfigInfoLayout","struct","blob","u8","bool","u16","u64","publicKey","seq","CpmmPoolInfoLayout","CpmmModule","ModuleBase","params","__async","poolId","fetchConfigInfo","poolIds","accounts","getMultipleAccountsInfoWithCustomFlags","i","PublicKey","poolInfos","needFetchConfigId","needFetchVaults","item","rpc","CpmmPoolInfoLayout","__spreadProps","__spreadValues","configInfo","configIds","configState","configItemInfo","CpmmConfigInfoLayout","vaultInfo","vaultAccountInfo","vaultItemInfo","BN","AccountLayout","returnData","id","info","baseReserve","quoteReserve","Decimal","pools","mintInfos","acc","cur","_a","_b","_c","_d","pool","mintA","mintB","getPdaPoolAuthority","toApiV3Token","toFeeConfig","rpcData","fetchMultipleMintInfos","lpMint","TOKEN_PROGRAM_ID","mockRewardData","__pow","getPdaObservationId","programId","poolFeeAccount","startTime","ownerInfo","associatedOnly","checkCreateATAOwner","txVersion","feeConfig","computeBudgetConfig","txTipConfig","feePayer","__objRest","payer","isFront","mintAAmount","mintBAmount","mintAUseSOLBalance","NATIVE_MINT","mintBUseSOLBalance","mintAPubkey","mintBPubkey","txBuilder","userVaultA","userVaultAInstruction","userVaultB","userVaultBInstruction","poolKeys","getCreatePoolKeys","makeCreateCpmmPoolInInstruction","getATAAddress","InstructionType","poolInfo","propPoolKeys","inputAmount","baseIn","slippage","computeResult","config","account","bypassAssociatedCheck","rpcPoolData","liquidity","inputAmountFee","_anotherAmount","Percent","anotherAmount","tokenAccountA","_tokenAccountAInstruction","tokenAccountB","_tokenAccountBInstruction","lpTokenAccount","_lpTokenAccount","lpInstruction","_slippage","makeDepositCpmmInInstruction","lpAmount","closeWsol","amountMintA","amountMintB","epochInfo","mintAAmountFee","mintBAmountFee","getTransferAmountFeeV2","WSOLMint","_ownerTokenAccountA","accountAInstructions","_ownerTokenAccountB","accountBInstructions","makeWithdrawCpmmInInstruction","_e","_f","fixedOut","swapResult","mintATokenAcc","mintATokenAccInstruction","mintBTokenAcc","mintBTokenAccInstruction","makeSwapCpmmBaseOutInstruction","makeSwapCpmmBaseInInstruction","amountIn","outputMint","isBaseIn","CurveCalculator","executionPrice","minAmountOut","amount","_g","_h","_i","coefficient","_inputAmountWithoutFee","input","anotherAmountFee","BN_ZERO","lpAmountData","lpToAmount","_slippageMin","slippageAdjustedAmount","slippageAdjustedMinAmount","lp","poolAmountA","poolAmountB","supply","amountA","amountB","PublicKey","Transaction","TransactionInstruction","TOKEN_PROGRAM_ID","BN","_Utils1216","ModuleBase","programId","ammId","findProgramAddress","poolId","owner","version","BN","_0","__async","connection","poolIds","wallet","chainTime","allPoolPda","id","allOwnerPda","itemVersion","pdaInfo","getMultipleAccountsInfo","info","index","i","itemPoolId","itemOwnerId","itemPoolInfoS","itemOwnerInfoS","itemPoolInfo","itemOwnerInfo","openTime","endTime","hasCanClaimToken","inCanClaimTime","canClaim","itemPoolToken","poolInfo","ownerInfo","feePayer","txBuilder","ownerVaultList","itemToken","account","instructionParams","Token","transaction","signers","poolInfos","tempNewVault","tempVault","instructions","forecastTransactionSize","s","Transaction","dataLayout","struct","keys","mintVault","TOKEN_PROGRAM_ID","data","aData","TransactionInstruction","blob","u8","u64","publicKey","seq","PublicKey","Utils1216","PublicKey","MintLayout","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","TokenModule","ModuleBase","params","__async","forceUpdate","type","mintList","blacklist","whiteList","jup","SOL_INFO","token","_a","__spreadProps","__spreadValues","TOKEN_2022_PROGRAM_ID","TOKEN_PROGRAM_ID","data","mint","mintStr","info","apiTokenInfo","onlineInfo","PublicKey","MintLayout","mintSymbol","fullInfo","Sega","_Sega","config","connection","cluster","owner","api","defaultChainTime","defaultChainTimeOffset","apiCacheTime","blockhashCommitment","loopMultiTxStatus","Owner","createLogger","Account","TokenModule","CpmmModule","Utils1216","now","__async","_a","custom","merge","apiRequestTimeout","logCount","logRequests","urlConfigs","Api","sega","__spreadProps","__spreadValues","EMPTY_OWNER","EMPTY_CONNECTION","signAllTransactions","time","data","e","forceUpdate","segaList","dataObject","prevFetched","jupList","t","skipCheck","isAllDisabled"]}