@stoatx/client 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/Client.ts","../src/gateway/GatewayManager.ts","../src/structures/Base.ts","../src/structures/Message.ts","../src/structures/Attachment.ts","../src/utils/Collector.ts","../src/utils/Collection.ts","../src/structures/MessageReaction.ts","../src/utils/ReactionCollector.ts","../src/structures/User.ts","../src/structures/ClientUser.ts","../src/rest/RESTManager.ts","../src/managers/MessageManager.ts","../src/managers/BaseManager.ts","../src/utils/MessageCollector.ts","../src/structures/BaseChannel.ts","../src/structures/TextChannel.ts","../src/structures/UnknownChannel.ts","../src/structures/DMChannel.ts","../src/structures/GroupChannel.ts","../src/utils/ChannelFactory.ts","../src/utils/permissions.ts","../src/managers/ChannelManager.ts","../src/structures/Member.ts","../src/managers/MemberRoleManager.ts","../src/utils/Constants.ts","../src/managers/MemberManager.ts","../src/managers/ServerChannelManager.ts","../src/structures/Role.ts","../src/managers/RoleManager.ts","../src/structures/ServerInvite.ts","../src/managers/ServerInviteManager.ts","../src/structures/ServerBan.ts","../src/managers/ServerBanManager.ts","../src/structures/Emoji.ts","../src/managers/EmojiManager.ts","../src/structures/Server.ts","../src/managers/ServerManager.ts","../src/managers/UserManager.ts","../src/managers/SweepManager.ts","../src/builders/EmbedBuilder.ts"],"sourcesContent":["import { EventEmitter } from \"events\";\nimport { GatewayManager } from \"../gateway/GatewayManager\";\nimport { RESTManager } from \"../rest/RESTManager\";\nimport { Message } from \"../structures/Message\";\nimport { ChannelManager } from \"../managers/ChannelManager\";\nimport { BaseChannel } from \"../structures/BaseChannel\";\nimport { ServerManager } from \"../managers/ServerManager\";\nimport { Server } from \"../structures/Server\";\nimport { UserManager } from \"../managers/UserManager\";\nimport { User } from \"../structures/User\";\nimport { ClientUser } from \"../structures/ClientUser\";\nimport { Member } from \"../structures/Member\";\nimport { SweeperManager, SweeperOptions } from \"../managers/SweepManager\";\nimport { EmojiManager } from \"../managers/EmojiManager\";\n\nexport interface ClientEvents {\n ready: [data: any];\n messageCreate: [message: Message];\n messageUpdate: [oldMessage: null | Message, newMessage: Message];\n messageDelete: [message: Message | { id: string; channelId: string }];\n messageReact: [message: Message | { id: string; channelId: string }, emojiId: string, userId: string];\n messageUnreact: [message: Message | { id: string; channelId: string }, emojiId: string, userId: string];\n messageRemoveReaction: [message: Message | { id: string; channelId: string }, emojiId: string];\n error: [error: Error];\n debug: [message: string];\n raw: [data: any];\n channelCreate: [channel: BaseChannel];\n channelUpdate: [oldChannel: BaseChannel | null, newChannel: BaseChannel];\n channelDelete: [channel: BaseChannel | string];\n serverCreate: [server: Server];\n serverUpdate: [oldServer: Server | null, newServer: Server];\n serverDelete: [server: Server | string];\n userUpdate: [oldUser: User, newUser: User];\n serverMemberJoin: [member: Member];\n serverMemberLeave: [member: Member];\n}\n\nexport interface ClientOptions {\n sweepers?: SweeperOptions;\n cacheLimits?: {\n users?: number;\n servers?: number;\n channels?: number;\n emojis?: number;\n };\n}\n\nexport class Client extends EventEmitter {\n public rest: RESTManager;\n public gateway: GatewayManager;\n public channels: ChannelManager;\n public servers: ServerManager;\n public users: UserManager;\n public sweepers: SweeperManager;\n public emojis: EmojiManager;\n public user: ClientUser | null = null;\n\n constructor(public options: ClientOptions = {}) {\n super({ captureRejections: true });\n this.rest = new RESTManager(this);\n this.gateway = new GatewayManager(this);\n this.channels = new ChannelManager(this, options.cacheLimits?.channels);\n this.servers = new ServerManager(this, options.cacheLimits?.servers);\n this.users = new UserManager(this, options.cacheLimits?.users);\n this.emojis = new EmojiManager(this, undefined, options.cacheLimits?.emojis);\n\n this.sweepers = new SweeperManager(this, options.sweepers ?? {});\n }\n\n /**\n * Connects the bot to the Stoat Gateway\n */\n public async login(token: string): Promise<any> {\n if (!token) throw new Error(\"A valid token must be provided.\");\n this.sweepers.start();\n this.rest.setToken(token);\n return this.gateway.connect(token);\n }\n\n [Symbol.for(\"nodejs.rejection\")](error: Error) {\n this.emit(\"error\", error);\n }\n\n public override on<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void): this {\n return super.on(event, listener as any);\n }\n\n public override once<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void): this {\n return super.once(event, listener as any);\n }\n\n public override emit<K extends keyof ClientEvents>(event: K, ...args: ClientEvents[K]): boolean {\n return super.emit(event, ...args);\n }\n}\n","import WebSocket from \"ws\";\nimport { Client } from \"../client/Client\";\nimport { Message } from \"../structures/Message\";\nimport { TextChannel } from \"../structures/TextChannel\";\nimport { ClientUser } from \"../structures/ClientUser\";\n\nexport class GatewayManager {\n private ws: WebSocket | null = null;\n private pingInterval: NodeJS.Timeout | null = null;\n private token: string | null = null;\n\n private reconnectAttempts: number = 0;\n private readonly maxReconnectWait: number = 60000; // Cap at 60s\n private isIntentionalClose: boolean = false;\n\n constructor(private client: Client) {}\n\n public async connect(token: string): Promise<void> {\n this.token = token;\n this.isIntentionalClose = false;\n this.client.emit(\"debug\", \"Connecting to Stoat Gateway...\");\n\n if (this.ws) {\n this.ws.removeAllListeners();\n this.ws = null;\n }\n\n const baseUrl = \"wss://stoat.chat/events\";\n const url = `${baseUrl}?version=1&format=json&token=${this.token}`;\n\n this.ws = new WebSocket(url);\n\n this.ws.on(\"open\", () => {\n this.client.emit(\"debug\", \"WebSocket Opened. Starting ping loop...\");\n this.reconnectAttempts = 0;\n this.startPingLoop();\n });\n\n this.ws.on(\"message\", (data) => this.handleMessage(data));\n\n this.ws.on(\"close\", (code, reason) => {\n this.client.emit(\"debug\", `WebSocket closed: ${code} - ${reason.toString()}`);\n if (this.pingInterval) clearInterval(this.pingInterval);\n if (!this.isIntentionalClose) {\n this.reconnect();\n }\n });\n\n this.ws.on(\"error\", (error) => {\n this.client.emit(\"error\", error);\n });\n }\n\n private handleMessage(rawData: WebSocket.RawData) {\n const payload = JSON.parse(rawData.toString());\n const eventType = payload.type;\n\n switch (eventType) {\n case \"Error\":\n this.client.emit(\"error\", new Error(`Gateway Error: ${payload.error || JSON.stringify(payload)}`));\n break;\n\n case \"Authenticated\":\n this.client.emit(\"debug\", \"Successfully authenticated with Stoat.\");\n break;\n\n case \"Ready\": {\n if (payload.channels) {\n for (const rawChannel of payload.channels) {\n this.client.channels._add(rawChannel);\n }\n }\n\n if (payload.servers) {\n for (const rawServer of payload.servers) {\n this.client.servers._add(rawServer);\n }\n }\n\n if (payload.users) {\n for (const rawUser of payload.users) {\n this.client.users._add(rawUser);\n if (rawUser.relationship === \"User\" && !this.client.user) {\n this.client.user = new ClientUser(this.client, rawUser);\n }\n }\n }\n\n if (payload.emojis) {\n for (const rawEmoji of payload.emojis) {\n const emoji = this.client.emojis._add(rawEmoji);\n if (rawEmoji.parent && rawEmoji.parent.type === \"Server\") {\n const server = this.client.servers.cache.get(rawEmoji.parent.id);\n if (server) {\n server.emojis._add(emoji);\n }\n }\n }\n }\n\n this.client.emit(\"ready\", payload);\n break;\n }\n\n case \"Message\": {\n if (payload.user) this.client.users._add(payload.user);\n\n const channel = this.client.channels.cache.get(payload.channel);\n let message;\n\n if (channel) {\n message = channel.messages._add(payload);\n\n if (\"serverId\" in channel) {\n const serverId = (channel as TextChannel).serverId;\n const server = this.client.servers.cache.get(serverId);\n if (server && payload.member && payload.user) {\n server.members._add({ ...payload.member, user: payload.user });\n }\n }\n } else {\n message = new Message(this.client, payload);\n }\n\n this.client.emit(\"messageCreate\", message);\n break;\n }\n\n case \"MessageUpdate\": {\n const channel = this.client.channels.cache.get(payload.channel);\n const existing = channel?.messages.cache.get(payload.id);\n\n if (existing) {\n const oldMessage = existing._clone();\n existing._patch(payload.data);\n this.client.emit(\"messageUpdate\", oldMessage, existing);\n } else {\n const newMessage = new Message(this.client, { id: payload.id, channelId: payload.channel, ...payload.data });\n this.client.emit(\"messageUpdate\", null, newMessage);\n }\n break;\n }\n\n case \"MessageAppend\": {\n const channel = this.client.channels.cache.get(payload.channel);\n const message = channel?.messages.cache.get(payload.id);\n\n if (message && payload.append.embeds) {\n const oldMessage = message._clone();\n message.embeds.push(...payload.append.embeds);\n this.client.emit(\"messageUpdate\", oldMessage, message);\n }\n break;\n }\n\n case \"MessageDelete\": {\n const channel = this.client.channels.cache.get(payload.channel);\n\n let message;\n\n if (channel) {\n message = channel.messages.cache.get(payload.id);\n channel.messages.cache.delete(payload.id);\n }\n\n if (message) {\n this.client.emit(\"messageDelete\", message);\n } else {\n this.client.emit(\"messageDelete\", { id: payload.id, channelId: payload.channel });\n }\n\n break;\n }\n\n case \"MessageReact\": {\n const channel = this.client.channels.cache.get(payload.channel_id);\n const message = channel?.messages.cache.get(payload.id);\n\n if (message) {\n if (!message.reactions) message.reactions = {};\n if (!message.reactions[payload.emoji_id]) {\n message.reactions[payload.emoji_id] = [];\n }\n const reactions = message.reactions[payload.emoji_id];\n if (reactions && !reactions.includes(payload.user_id)) {\n reactions.push(payload.user_id);\n }\n }\n\n this.client.emit(\n \"messageReact\",\n message || { id: payload.id, channelId: payload.channel_id },\n payload.emoji_id,\n payload.user_id,\n );\n break;\n }\n\n case \"MessageUnreact\": {\n const channel = this.client.channels.cache.get(payload.channel_id);\n const message = channel?.messages.cache.get(payload.id);\n\n if (message && message.reactions && message.reactions[payload.emoji_id]) {\n const reactions = message.reactions[payload.emoji_id];\n if (reactions) {\n message.reactions[payload.emoji_id] = reactions.filter((userId) => userId !== payload.user_id);\n\n if (message.reactions[payload.emoji_id]!.length === 0) {\n delete message.reactions[payload.emoji_id];\n }\n }\n }\n\n this.client.emit(\n \"messageUnreact\",\n message || { id: payload.id, channelId: payload.channel_id },\n payload.emoji_id,\n payload.user_id,\n );\n break;\n }\n\n case \"MessageRemoveReaction\": {\n const channel = this.client.channels.cache.get(payload.channel_id);\n const message = channel?.messages.cache.get(payload.id);\n\n if (message && message.reactions) {\n delete message.reactions[payload.emoji_id];\n }\n\n this.client.emit(\n \"messageRemoveReaction\",\n message || { id: payload.id, channelId: payload.channel_id },\n payload.emoji_id,\n );\n break;\n }\n\n case \"Pong\":\n this.client.emit(\"debug\", \"Received Pong from server.\");\n break;\n\n case \"ChannelCreate\": {\n const channel = this.client.channels._add(payload);\n\n this.client.emit(\"channelCreate\", channel);\n break;\n }\n\n case \"ChannelUpdate\": {\n const existing = this.client.channels.cache.get(payload.id);\n\n if (existing) {\n const oldChannel = existing._clone();\n\n if (\"_patch\" in existing) {\n (existing as any)._patch(payload.data, payload.clear);\n }\n\n this.client.emit(\"channelUpdate\", oldChannel, existing);\n } else {\n const newChannel = this.client.channels._add({ id: payload.id, ...payload.data });\n this.client.emit(\"channelUpdate\", null, newChannel);\n }\n break;\n }\n\n case \"ChannelDelete\": {\n const channel = this.client.channels.cache.get(payload.id);\n if (channel) {\n this.client.channels.cache.delete(channel.id);\n this.client.emit(\"channelDelete\", channel);\n }\n break;\n }\n\n case \"ServerCreate\": {\n const server = this.client.servers._add(payload);\n this.client.emit(\"serverCreate\", server);\n break;\n }\n\n case \"ServerUpdate\": {\n const existing = this.client.servers.cache.get(payload.id);\n\n if (existing) {\n const oldServer = existing._clone();\n\n existing._patch(payload.data, payload.clear);\n\n this.client.emit(\"serverUpdate\", oldServer, existing);\n } else {\n const newServer = this.client.servers._add({ id: payload.id, ...payload.data });\n this.client.emit(\"serverUpdate\", null, newServer);\n }\n break;\n }\n\n case \"ServerDelete\": {\n const server = this.client.servers.cache.get(payload.id);\n if (server) {\n this.client.servers.cache.delete(payload.id);\n this.client.emit(\"serverDelete\", server);\n } else {\n this.client.emit(\"serverDelete\", payload.id);\n }\n break;\n }\n\n case \"ServerMemberJoin\": {\n const server = this.client.servers.cache.get(payload.id);\n if (server) {\n const member = server.members._add({ user: payload.user });\n this.client.emit(\"serverMemberJoin\", member);\n }\n break;\n }\n\n case \"ServerMemberLeave\": {\n const server = this.client.servers.cache.get(payload.id);\n if (server) {\n const member = server.members.cache.get(payload.user);\n if (member) {\n server.members.cache.delete(payload.user);\n this.client.emit(\"serverMemberLeave\", member);\n }\n }\n break;\n }\n\n case \"EmojiCreate\": {\n const emoji = this.client.emojis._add(payload);\n if (payload.parent?.type === \"Server\") {\n const server = this.client.servers.cache.get(payload.parent.id);\n if (server) {\n server.emojis._add(emoji);\n }\n }\n break;\n }\n\n case \"EmojiDelete\": {\n this.client.emojis.cache.delete(payload.id);\n\n // Find which server has this emoji\n for (const server of this.client.servers.cache.values()) {\n const emoji = server.emojis.cache.get(payload.id);\n if (emoji) {\n server.emojis.cache.delete(payload.id);\n break;\n }\n }\n break;\n }\n\n case \"UserUpdate\": {\n const existing = this.client.users.cache.get(payload.id);\n if (existing) {\n const oldUser = existing._clone();\n existing._patch(payload.data, payload.clear);\n this.client.emit(\"userUpdate\", oldUser, existing);\n }\n break;\n }\n\n default:\n this.client.emit(\"raw\", payload);\n }\n }\n\n private startPingLoop() {\n if (this.pingInterval) clearInterval(this.pingInterval);\n\n this.pingInterval = setInterval(() => {\n this.client.emit(\"debug\", \"Sending Ping...\");\n this.send({ type: \"Ping\", data: Date.now() });\n }, 20000);\n }\n\n private send(payload: any) {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(payload));\n }\n }\n\n private reconnect(): void {\n if (!this.token) {\n this.client.emit(\"error\", new Error(\"RECONNECT_FAILED: No token available.\"));\n return;\n }\n\n let waitTime = Math.pow(2, this.reconnectAttempts) * 1000;\n\n const jitter = waitTime * 0.2 * Math.random();\n waitTime = Math.min(waitTime + jitter, this.maxReconnectWait);\n\n this.reconnectAttempts++;\n\n this.client.emit(\n \"debug\",\n `Attempting to reconnect in ${Math.round(waitTime / 1000)}s... (Attempt ${this.reconnectAttempts})`,\n );\n\n setTimeout(() => {\n void this.connect(this.token!);\n }, waitTime);\n }\n\n public disconnect() {\n this.isIntentionalClose = true;\n if (this.pingInterval) clearInterval(this.pingInterval);\n if (this.ws) {\n this.ws.close(1000, \"Client disconnected gracefully\");\n this.ws.removeAllListeners();\n this.ws = null;\n }\n this.client.emit(\"debug\", \"Gateway disconnected intentionally.\");\n }\n}\n","import { Client } from \"../client/Client\";\n\n/**\n * The base class for all structures.\n */\nexport abstract class Base {\n public readonly id: string;\n public cachedAt: number = Date.now();\n protected readonly client: Client;\n\n constructor(client: Client, data: { _id: string }) {\n this.id = data._id;\n this.client = client;\n\n Object.defineProperty(this, \"client\", {\n value: client,\n enumerable: false,\n writable: false,\n });\n }\n\n /**\n * Compares this object with another to see if they represent the same entity.\n */\n public equals(other: Base | string): boolean {\n if (typeof other === \"string\") return this.id === other;\n return other instanceof Base && this.id === other.id;\n }\n\n /**\n * Returns the UUID string when the object is cast to a string.\n */\n public toString(): string {\n return this.id;\n }\n\n /**\n * Helper to quickly clone a structure\n */\n public _clone(): this {\n return Object.assign(Object.create(this), this);\n }\n}\n","import { Base } from \"./Base\";\nimport { Client } from \"../client/Client\";\nimport { Member } from \"./Member\";\nimport { User } from \"./User\";\nimport { BaseChannel } from \"./BaseChannel\";\nimport * as util from \"node:util\";\nimport { EmbedBuilder, TextEmbedData } from \"../builders/EmbedBuilder\";\nimport { Attachment } from \"./Attachment\";\nimport { Server } from \"./Server\";\nimport { decodeTime } from \"ulid\";\nimport { UserResolvable } from \"../managers/UserManager\";\nimport { ReactionCollector, ReactionCollectorOptions } from \"../utils/ReactionCollector\";\nimport { Collection } from \"../utils/Collection\";\nimport { MessageReaction } from \"./MessageReaction\";\n\nexport interface MessageOptions {\n content?: string;\n embeds?: (TextEmbedData | EmbedBuilder)[];\n attachments?: string[];\n interactions?: any[];\n flags?: number;\n masquerade?: Masquerade;\n replies?: ReplyIntent[];\n}\nexport interface Masquerade {\n avatar?: string;\n name?: string;\n colour?: string;\n}\nexport interface ReplyIntent {\n id: string;\n mention: boolean;\n fail_if_not_exists?: boolean;\n}\n\nexport interface Interaction {\n reactions: string[];\n restrictReactions: boolean;\n}\n\nexport class Message extends Base {\n public content: string | null = null;\n public authorId: string;\n public channelId: string;\n public embeds: any[] = [];\n public attachments: Attachment[] = [];\n public editedAt: Date | null = null;\n public createdAt: Date | null = null;\n public flags: number = 0;\n public interactions: Interaction | null = null;\n public masquerade: Masquerade | null = null;\n public mentions: string[] = [];\n public pinned: boolean = false;\n public reactions: Record<string, string[]> = {};\n public replies: string[] = [];\n public role_mentions: string[] = [];\n\n constructor(client: Client, data: any) {\n super(client, data);\n\n this.authorId = data.author;\n this.channelId = data.channel;\n\n const timestamp = decodeTime(this.id);\n if (timestamp) {\n this.createdAt = new Date(timestamp);\n }\n\n if (data.attachments) {\n this.attachments = data.attachments.map((fileData: any) => new Attachment(this.client, fileData));\n }\n\n if (data.masquerade !== undefined) this.masquerade = data.masquerade;\n if (data.mentions !== undefined) this.mentions = data.mentions;\n if (data.replies !== undefined) this.replies = data.replies;\n if (data.role_mentions !== undefined) this.role_mentions = data.role_mentions;\n\n this._patch(data);\n }\n\n public async reply(contentOrOptions: string | MessageOptions): Promise<Message> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n const options: MessageOptions =\n typeof contentOrOptions === \"string\" ? { content: contentOrOptions } : { ...contentOrOptions };\n\n const repliesArray: ReplyIntent[] = options.replies ? [...options.replies] : [];\n\n const alreadyReplying = repliesArray.some((reply) => reply.id === this.id);\n if (!alreadyReplying) {\n repliesArray.push({\n id: this.id,\n mention: true,\n });\n }\n\n options.replies = repliesArray;\n\n return channel.messages.send(options);\n }\n\n /**\n * Edits this message.\n * @param contentOrOptions The new content or options for the message.\n */\n public async edit(contentOrOptions: string | MessageOptions): Promise<this> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n return (await channel.messages.edit(this.id, contentOrOptions)) as this;\n }\n\n /**\n * Deletes this message.\n */\n public async delete(): Promise<void> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n await channel.messages.delete(this.id);\n }\n\n /**\n * Pins this message.\n */\n public async pin(): Promise<void> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n await channel.messages.pin(this.id);\n }\n\n /**\n * Unpins this message.\n */\n public async unpin(): Promise<void> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n await channel.messages.unpin(this.id);\n }\n\n /**\n * React to this message\n * @param reaction The emoji to react with. Can be a Unicode emoji or a custom emoji ID.\n * @throws {Error} If the API request fails.\n * @example\n * await message.react(\"👍\");\n * await message.react(\"customEmojiId\");\n */\n public async react(reaction: string): Promise<void> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n await channel.messages.react(this.id, reaction);\n }\n\n /**\n * Remove a reaction from this message\n * @param reaction The emoji to remove. Can be a Unicode emoji or a custom emoji ID.\n * @param userId The ID of the user whose reaction to remove. If not provided, removes the current user's reaction.\n * @param removeAll Remove all reactions of this type.\n * @throws {Error} If both userId and removeAll are provided, or if the API request fails.\n * @example\n * // Remove the current user's reaction\n * await message.removeReaction(\"👍\");\n * // Remove a specific user's reaction\n * await message.removeReaction(\"👍\", userId);\n * // Remove all reactions of this type\n * await message.removeReaction(\"👍\", undefined, true);\n */\n public async removeReaction(reaction: string, userId?: UserResolvable, removeAll?: boolean): Promise<void> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n await channel.messages.removeReaction(this.id, reaction, userId, removeAll);\n }\n\n /**\n * Remove all reactions from this message\n * @throws {Error} If the API request fails.\n * @example\n * await message.clearReactions();\n */\n public async clearReactions(): Promise<void> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n await channel.messages.clearReactions(this.id);\n }\n\n /**\n * Creates a ReactionCollector to collect reactions on this message.\n * @param options The options for the collector.\n * @returns A new ReactionCollector instance.\n * @example\n * const collector = message.createReactionCollector({ time: 15000 });\n * collector.on('collect', (reaction) => console.log(`Collected ${reaction.emojiId} from ${reaction.userId}`));\n * collector.on('end', (collected) => console.log(`Collected ${collected.size} items`));\n */\n public createReactionCollector(options?: ReactionCollectorOptions): ReactionCollector {\n return new ReactionCollector(this, options);\n }\n\n /**\n * Awaits reactions on this message.\n * @param options The options for the collector.\n * @returns A promise that resolves to a collection of reactions collected.\n * @example\n * // Await reactions\n * const filter = (reaction) => reaction.emoji.id === '123' && reaction.users.has(author.id);\n * message.awaitReactions({ filter, max: 1, time: 60000 })\n * .then(collected => console.log(collected.size))\n * .catch(console.error);\n */\n public awaitReactions(options?: ReactionCollectorOptions): Promise<Collection<string, MessageReaction>> {\n return new Promise((resolve) => {\n const collector = this.createReactionCollector(options);\n collector.once(\"end\", (collected) => resolve(collected));\n });\n }\n\n /** Gets the Channel object from cache */\n public get channel(): BaseChannel | undefined {\n return this.client.channels.cache.get(this.channelId);\n }\n\n /** Gets the Global User object from cache */\n public get author(): User | undefined {\n return this.client.users.cache.get(this.authorId);\n }\n\n /** Gets the Server Member object (if sent in a server) */\n public get member(): Member | undefined {\n const channel = this.channel;\n if (channel && \"serverId\" in channel) {\n const server = this.client.servers.cache.get((channel as any).serverId);\n return server?.members.cache.get(this.authorId);\n }\n return undefined;\n }\n\n /** Gets the Server ID if this message was sent in a server channel */\n public get serverId(): string | undefined {\n const channel = this.channel;\n if (channel && \"serverId\" in channel) {\n return (channel as any).serverId as string;\n }\n return undefined;\n }\n\n /** Gets the Server object from cache */\n public get server(): Server | undefined {\n const serverId = this.serverId;\n if (!serverId) return undefined;\n return this.client.servers.cache.get(serverId);\n }\n\n public _patch(data: any) {\n if (data.content !== undefined) this.content = data.content;\n if (data.edited !== undefined) this.editedAt = new Date(data.edited);\n if (data.pinned !== undefined) this.pinned = data.pinned;\n if (data.embeds !== undefined) this.embeds = data.embeds;\n if (data.flags !== undefined) this.flags = data.flags;\n if (data.reactions !== undefined) {\n this.reactions = Array.isArray(data.reactions) ? {} : data.reactions;\n }\n\n if (data.interactions !== undefined) {\n if (data.interactions) {\n this.interactions = {\n reactions: data.interactions.reactions ?? [],\n restrictReactions: data.interactions.restrict_reactions ?? false,\n };\n } else {\n this.interactions = null;\n }\n }\n }\n\n // This tells Node.js exactly how to print this object in console.log()\n [util.inspect.custom](depth: number, options: util.InspectOptions, inspect: typeof util.inspect) {\n const { client, authorId, channelId, ...props } = this;\n\n const data = {\n ...props,\n author: this.author,\n channel: this.channel,\n server: this.server,\n member: this.member,\n };\n\n return `${this.constructor.name} ${inspect(data, { ...options, depth: depth ?? options.depth })}`;\n }\n}\n","import { Base } from \"./Base\";\nimport type { Client } from \"../client/Client\";\n\nexport type AttachmentMetadata =\n | { type: \"File\" }\n | { type: \"Text\" }\n | { type: \"Audio\" }\n | { type: \"Image\"; width: number; height: number; thumbhash?: number[]; animated?: boolean }\n | { type: \"Video\"; width: number; height: number };\n\nexport class Attachment extends Base {\n public override id: string;\n public tag: string;\n public filename: string;\n public metadata: AttachmentMetadata;\n public contentType: string;\n public size: number;\n\n public deleted?: boolean;\n public reported?: boolean;\n public messageId?: string;\n public userId?: string;\n public serverId?: string;\n public objectId?: string;\n\n constructor(client: Client, data: any) {\n super(client, { ...data, id: data._id });\n\n this.id = data._id;\n this.tag = data.tag;\n this.filename = data.filename;\n this.metadata = data.metadata ?? { type: \"File\" };\n this.contentType = data.content_type;\n this.size = data.size;\n\n this.deleted = data.deleted ?? false;\n this.reported = data.reported ?? false;\n this.messageId = data.message_id;\n this.userId = data.user_id;\n this.serverId = data.server_id;\n this.objectId = data.object_id;\n }\n\n /**\n * Automatically constructs the direct CDN URL for this file\n */\n public get url(): string {\n // Standard Autumn CDN format: cdn.domain.com/tag/id/filename\n return `https://cdn.stoatusercontent.com/${this.tag}/${this.id}/${this.filename}`;\n }\n\n /**\n * Helper boolean to quickly check if it's an image\n */\n public get isImage(): boolean {\n return this.metadata.type === \"Image\";\n }\n}\n","import { EventEmitter } from \"events\";\nimport { Client } from \"../client/Client\";\nimport { Collection } from \"./Collection\";\n\n/**\n * Options to be passed to a Collector\n */\nexport interface CollectorOptions<V> {\n /** The filter applied to this collector */\n filter?: (item: V, ...args: any[]) => boolean;\n /** How long to run the collector for in milliseconds */\n time?: number;\n /** How long to stop the collector after inactivity in milliseconds */\n idle?: number;\n /** Whether to dispose data when it's deleted */\n dispose?: boolean;\n}\n\n/**\n * Abstract class for defining a new Collector\n */\nexport abstract class Collector<K, V> extends EventEmitter {\n public readonly client: Client;\n public filter: (item: V, ...args: any[]) => boolean;\n public options: CollectorOptions<V>;\n public collected: Collection<K, V>;\n public ended: boolean = false;\n\n private _timeout: NodeJS.Timeout | null = null;\n private _idletimeout: NodeJS.Timeout | null = null;\n\n protected constructor(client: Client, options: CollectorOptions<V> = {}) {\n super();\n this.client = client;\n this.options = options;\n this.filter = options.filter ?? (() => true);\n this.collected = new Collection();\n\n if (options.time) {\n this._timeout = setTimeout(() => this.stop(\"time\"), options.time);\n }\n if (options.idle) {\n this._idletimeout = setTimeout(() => this.stop(\"idle\"), options.idle);\n }\n }\n\n /**\n * Evaluates an item and possibly passes it to the collector\n */\n public handleCollect(item: V, ...args: any[]) {\n if (this.ended) return;\n if (!this.filter(item, ...args)) return;\n\n const key = this.collect(item, ...args);\n if (key !== null && key !== undefined) {\n this.collected.set(key, item);\n this.emit(\"collect\", item, ...args);\n\n if (this._idletimeout) {\n clearTimeout(this._idletimeout);\n this._idletimeout = setTimeout(() => this.stop(\"idle\"), this.options.idle);\n }\n\n this.checkEnd();\n }\n }\n\n /**\n * Evaluates an item and possibly removes it from the collector\n */\n public handleDispose(item: V, ...args: any[]) {\n if (this.ended) return;\n if (!this.options.dispose) return;\n\n const key = this.dispose(item, ...args);\n if (key !== null && key !== undefined) {\n this.collected.delete(key);\n this.emit(\"dispose\", item, ...args);\n this.checkEnd();\n }\n }\n\n /**\n * Stops the collector.\n */\n public stop(reason: string = \"user\") {\n if (this.ended) return;\n this.ended = true;\n\n if (this._timeout) clearTimeout(this._timeout);\n if (this._idletimeout) clearTimeout(this._idletimeout);\n\n this.removeAllListeners(\"collect\");\n this.removeAllListeners(\"dispose\");\n\n this.emit(\"end\", this.collected, reason);\n }\n\n /**\n * Check if we should end upon collecting/disposing\n */\n public checkEnd() {\n const reason = this.endReason();\n if (reason) this.stop(reason);\n }\n\n /**\n * Check if there's a reason to end\n */\n public endReason(): string | null {\n return null;\n }\n\n /**\n * Returns a key if the item should be collected, or null to skip\n */\n public abstract collect(item: V, ...args: any[]): K | null;\n\n /**\n * Returns a key if the item should be disposed, or null to skip\n */\n public abstract dispose(item: V, ...args: any[]): K | null;\n\n /**\n * Allows iterating over collected items asynchronously.\n * @example\n * for await (const [id, message] of collector) {\n * console.log(`Received message: ${message.content}`);\n * }\n */\n public async *[Symbol.asyncIterator](): AsyncIterableIterator<[K, V]> {\n const queue: [K, V][] = [];\n let resolve: (() => void) | null = null;\n\n const onCollect = (item: V, ...args: any[]) => {\n const key = this.collect(item, ...args);\n if (key !== null && key !== undefined) {\n queue.push([key, item]);\n }\n if (resolve) {\n resolve();\n resolve = null;\n }\n };\n\n const onEnd = () => {\n if (resolve) {\n resolve();\n resolve = null;\n }\n };\n\n this.on(\"collect\", onCollect as any);\n this.on(\"end\", onEnd as any);\n\n try {\n while (true) {\n if (queue.length > 0) {\n yield queue.shift() as [K, V];\n } else if (this.ended) {\n break;\n } else {\n await new Promise<void>((res) => {\n resolve = res;\n });\n }\n }\n } finally {\n this.removeListener(\"collect\", onCollect as any);\n this.removeListener(\"end\", onEnd as any);\n }\n }\n}\n","/**\n * A utility class that extends the native JavaScript Map with Array-like methods.\n */\nexport class Collection<K, V> extends Map<K, V> {\n public limit: number;\n\n constructor(limit: number = Infinity) {\n super();\n this.limit = limit;\n }\n\n /**\n * Overrides the default set method to enforce the maximum cache size.\n */\n public override set(key: K, value: V): this {\n if (this.limit === 0) return this;\n\n if (this.size >= this.limit && !this.has(key)) {\n const oldestKey = this.keys().next().value;\n if (oldestKey !== undefined) {\n this.delete(oldestKey);\n }\n }\n\n return super.set(key, value);\n }\n\n /**\n * Finds the first item where the given function returns true.\n */\n public find(fn: (value: V, key: K, collection: this) => boolean): V | undefined {\n for (const [key, val] of this) {\n if (fn(val, key, this)) return val;\n }\n return undefined;\n }\n\n /**\n * Returns a new Collection containing only the items where the function returns true.\n */\n public filter(fn: (value: V, key: K, collection: this) => boolean): Collection<K, V> {\n const results = new Collection<K, V>();\n for (const [key, val] of this) {\n if (fn(val, key, this)) results.set(key, val);\n }\n return results;\n }\n\n /**\n * Maps each item to a new array of values.\n */\n public map<T>(fn: (value: V, key: K, collection: this) => T): T[] {\n const results: T[] = [];\n for (const [key, val] of this) {\n results.push(fn(val, key, this));\n }\n return results;\n }\n\n /**\n * Gets the very first value in the Collection (based on insertion order).\n */\n public first(): V | undefined {\n return this.values().next().value;\n }\n\n /**\n * Gets the very last value in the Collection.\n */\n public last(): V | undefined {\n const arr = Array.from(this.values());\n return arr[arr.length - 1];\n }\n\n /**\n * Checks if at least one item matches the condition.\n */\n public some(fn: (value: V, key: K, collection: this) => boolean): boolean {\n for (const [key, val] of this) {\n if (fn(val, key, this)) return true;\n }\n return false;\n }\n}\n","import { Message } from \"./Message\";\nimport { Emoji } from \"./Emoji\";\nimport { Collection } from \"../utils/Collection\";\nimport { Client } from \"../client/Client\";\nimport { User } from \"./User\";\nimport * as util from \"node:util\";\n\nexport class MessageReaction {\n public message: Message | { id: string; channelId: string };\n public emoji: Emoji | string;\n public users: Collection<string, User | { id: string }>;\n\n constructor(\n public client: Client,\n data: { message: Message | { id: string; channelId: string }; emojiId: string; users?: string[] },\n ) {\n this.message = data.message;\n // Attempt to resolve custom emojis from the cache, otherwise fallback to the string (e.g. for unicode)\n this.emoji = this.client.emojis.cache.get(data.emojiId) || data.emojiId;\n this.users = new Collection();\n\n if (data.users) {\n for (const userId of data.users) {\n const user = this.client.users.cache.get(userId) || { id: userId };\n this.users.set(userId, user as User);\n }\n }\n }\n\n public get count(): number {\n return this.users.size;\n }\n\n public async remove(): Promise<void> {\n if (this.message instanceof Message) {\n const emojiId = typeof this.emoji === \"string\" ? this.emoji : this.emoji.id;\n await this.message.removeReaction(emojiId);\n }\n }\n\n [util.inspect.custom]() {\n const data = {\n messageId: this.message.id,\n emoji: this.emoji,\n count: this.count,\n users: Array.from(this.users.keys()),\n };\n return `MessageReaction ${util.inspect(data)}`;\n }\n}\n","import { Collector, CollectorOptions } from \"./Collector\";\nimport { Message } from \"../structures/Message\";\nimport { MessageReaction } from \"../structures/MessageReaction\";\n\nexport interface ReactionCollectorOptions extends CollectorOptions<MessageReaction> {\n /** The maximum number of reactions to collect */\n max?: number;\n /** The maximum number of users to collect reactions from */\n maxUsers?: number;\n}\n\nexport class ReactionCollector extends Collector<string, MessageReaction> {\n public messageId: string;\n public total = 0;\n public users = new Set<string>();\n\n constructor(\n public message: Message,\n options: ReactionCollectorOptions = {},\n ) {\n super((message as any).client, options);\n this.messageId = message.id;\n\n const boundHandleCollect = this.handleMessageReact.bind(this);\n const boundHandleDispose = this.handleMessageUnreact.bind(this);\n\n this.client.on(\"messageReact\", boundHandleCollect);\n this.client.on(\"messageUnreact\", boundHandleDispose);\n\n this.once(\"end\", () => {\n this.client.removeListener(\"messageReact\", boundHandleCollect);\n this.client.removeListener(\"messageUnreact\", boundHandleDispose);\n });\n }\n\n public collect(reaction: MessageReaction): string | null {\n if (reaction.message.id !== this.messageId) return null;\n return typeof reaction.emoji === \"string\" ? reaction.emoji : reaction.emoji.id;\n }\n\n public dispose(reaction: MessageReaction): string | null {\n if (reaction.message.id !== this.messageId) return null;\n return typeof reaction.emoji === \"string\" ? reaction.emoji : reaction.emoji.id;\n }\n\n private handleMessageReact(message: Message | { id: string; channelId: string }, emojiId: string, userId: string) {\n if (message.id !== this.messageId) return;\n\n // Check if we already have this reaction in the collector\n let reaction = this.collected.get(emojiId);\n\n if (!reaction) {\n reaction = new MessageReaction(this.client as any, { message, emojiId, users: [userId] });\n } else {\n const user = this.client.users.cache.get(userId) || { id: userId };\n reaction.users.set(userId, user as any);\n }\n\n super.handleCollect(reaction);\n\n if (!this.ended && this.collected.has(emojiId)) {\n this.total++;\n this.users.add(userId);\n this.checkEnd();\n }\n }\n\n private handleMessageUnreact(message: Message | { id: string; channelId: string }, emojiId: string, userId: string) {\n if (message.id !== this.messageId) return;\n\n const reaction = this.collected.get(emojiId);\n if (reaction) {\n reaction.users.delete(userId);\n if (reaction.users.size === 0) {\n super.handleDispose(reaction);\n }\n }\n }\n\n public override endReason(): string | null {\n const options = this.options as ReactionCollectorOptions;\n if (options.max && this.total >= options.max) return \"limit\";\n if (options.maxUsers && this.users.size >= options.maxUsers) return \"userLimit\";\n return null;\n }\n}\n","import { Base } from \"./Base\";\nimport type { Client } from \"../client/Client\";\nimport { Attachment } from \"./Attachment\";\n\nexport enum UserRelationship {\n None = \"None\",\n User = \"User\",\n Friend = \"Friend\",\n Outgoing = \"Outgoing\",\n Incoming = \"Incoming\",\n Blocked = \"Blocked\",\n BlockedOther = \"BlockedOther\",\n}\n\nexport enum UserPresence {\n Online = \"Online\",\n Idle = \"Idle\",\n Focus = \"Focus\",\n Busy = \"Busy\",\n Invisible = \"Invisible\",\n}\n\nexport interface BotInformation {\n owner: string;\n}\n\nexport interface UserStatus {\n presence: UserPresence;\n text?: string | null;\n}\n\nexport interface UserProfile {\n background?: string | null;\n content?: string | null;\n}\n\nexport class User extends Base {\n public discriminator!: string;\n public online!: boolean;\n public relationship!: UserRelationship;\n public username!: string;\n public avatar?: Attachment | null;\n public badges?: number;\n public bot!: false | BotInformation;\n public displayName?: string | null;\n public flags?: number;\n public privileged?: boolean;\n public status?: UserStatus | null;\n\n constructor(client: Client, data: any) {\n super(client, data);\n this.bot = false;\n this.privileged = false;\n this.flags = 0;\n this._patch(data);\n }\n\n public _patch(data: any, clear?: string[]) {\n if (data.username !== undefined) this.username = data.username;\n if (data.discriminator !== undefined) this.discriminator = data.discriminator;\n if (data.online !== undefined) this.online = data.online;\n if (data.relationship !== undefined) this.relationship = data.relationship;\n\n if (data.display_name !== undefined) this.displayName = data.display_name;\n\n if (data.badges !== undefined) this.badges = data.badges;\n if (data.flags !== undefined) this.flags = data.flags;\n if (data.privileged !== undefined) this.privileged = data.privileged ?? false;\n if (data.status !== undefined) this.status = data.status;\n\n if (data.bot !== undefined) {\n this.bot = data.bot ? { owner: data.bot.owner } : false;\n }\n\n if (data.avatar !== undefined) {\n this.avatar = new Attachment(this.client, data.avatar);\n }\n\n // Handle deletions gracefully\n if (clear && Array.isArray(clear)) {\n for (const field of clear) {\n if (field === \"Avatar\") this.avatar = null;\n if (field === \"StatusText\" && this.status) this.status.text = null;\n if (field === \"DisplayName\") this.displayName = null;\n }\n }\n }\n\n /**\n * Convenience getter to return the user's tag (username#discriminator)\n */\n public get tag(): string {\n return `${this.username}#${this.discriminator}`;\n }\n\n /**\n * Fetch a User to update their information\n * @param force Skip the cache check and force an API request\n * @returns The fetched User object\n * @throws Error if the user cannot be found or fetched\n * @example\n * // Fetch a user\n * await user.fetch();\n */\n public async fetch(force: boolean = false): Promise<this> {\n return (await this.client.users.fetch(this.id, force)) as this;\n }\n}\n","import { User } from \"./User\";\nimport type { Client } from \"../client/Client\";\n\n/**\n * Represents the authenticated bot's user object.\n */\nexport class ClientUser extends User {\n constructor(client: Client, data: any) {\n super(client, data);\n }\n}\n","import { request } from \"undici\";\nimport { Client } from \"../client/Client\";\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Represents an independent rate limit bucket queue\n */\nclass AsyncBucket {\n public remaining: number = 1;\n public resetAt: number = 0;\n public queue: Promise<void> = Promise.resolve();\n}\n\n/**\n * Custom Error class for Stoat API failures\n */\nexport class StoatAPIError extends Error {\n public statusCode: number;\n public apiType: string;\n public location: string;\n public rawData: any;\n public method?: string | undefined;\n public path?: string | undefined;\n\n constructor(statusCode: number, data: any, method?: string, path?: string) {\n let errorMessage = \"Unknown API Error\";\n let type = \"Unknown\";\n let location = \"Unknown\";\n\n if (typeof data === \"object\" && data !== null) {\n if (\"type\" in data || \"location\" in data) {\n type = String(data.type || type);\n location = String(data.location || location);\n errorMessage = `Type: ${type} (Location: ${location})`;\n } else if (\"message\" in data) {\n errorMessage = String(data.message);\n } else {\n try {\n errorMessage = JSON.stringify(data);\n } catch {\n errorMessage = \"Unparseable Error Object\";\n }\n }\n } else if (typeof data === \"string\" && data.trim() !== \"\") {\n errorMessage = data;\n }\n\n const routeInfo = method && path ? ` on ${method.toUpperCase()} ${path}` : \"\";\n\n super(`${errorMessage}${routeInfo}`);\n\n this.name = `StoatAPIError[${statusCode}]`;\n this.statusCode = statusCode;\n this.apiType = type;\n this.location = location;\n this.rawData = data;\n this.method = method;\n this.path = path;\n\n Object.setPrototypeOf(this, StoatAPIError.prototype);\n }\n}\n\nexport class RESTManager {\n private baseURL = \"https://stoat.chat/api\";\n\n private token: string | null = null;\n\n private buckets = new Map<string, AsyncBucket>();\n\n constructor(private client: Client) {}\n\n public setToken(token: string) {\n this.token = token;\n }\n\n /**\n * Generates a local identifier for the bucket based on method and path.\n */\n private getRouteKey(method: string, endpoint: string): string {\n return `${method}:${endpoint}`;\n }\n\n public makeRequest(method: string, endpoint: string, body?: any): Promise<any> {\n const routeKey = this.getRouteKey(method, endpoint);\n\n let bucket = this.buckets.get(routeKey);\n if (!bucket) {\n bucket = new AsyncBucket();\n this.buckets.set(routeKey, bucket);\n }\n\n return new Promise((resolve, reject) => {\n bucket!.queue = bucket!.queue.then(async () => {\n try {\n const result = await this.execute(method, endpoint, body, bucket!);\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n });\n }\n\n private async execute(method: string, endpoint: string, body: any, bucket: AsyncBucket): Promise<any> {\n if (!this.token) {\n throw new Error(\"REST_NOT_READY: You must call client.login() before making API requests.\");\n }\n const url = `${this.baseURL}${endpoint}`;\n\n if (bucket.remaining <= 0 && Date.now() < bucket.resetAt) {\n const waitTime = bucket.resetAt - Date.now();\n this.client.emit(\"debug\", `Bucket [${method}:${endpoint}] exhausted. Waiting ${waitTime}ms proactively...`);\n await sleep(waitTime);\n }\n\n const options = {\n method: method as any,\n headers: {\n \"X-Bot-Token\": this.token,\n \"Content-Type\": \"application/json\",\n },\n ...(body ? { body: JSON.stringify(body) } : {}),\n };\n const response = await request(url, options);\n\n const remainingHeader = response.headers[\"x-ratelimit-remaining\"];\n const resetAfterHeader = response.headers[\"x-ratelimit-reset-after\"];\n\n if (remainingHeader !== undefined && resetAfterHeader !== undefined) {\n bucket.remaining = Number(remainingHeader);\n bucket.resetAt = Date.now() + Number(resetAfterHeader);\n }\n\n // Safely parse the body (handles cases where Cloudflare returns HTML/Text on 502s)\n const textBody = await response.body.text();\n let data;\n try {\n data = JSON.parse(textBody);\n } catch {\n data = textBody;\n }\n\n if (response.statusCode === 429) {\n const retryMs =\n typeof data === \"object\" && data?.retry_after ? data.retry_after : Number(resetAfterHeader) || 5000;\n\n this.client.emit(\"debug\", `Hit 429 on [${method}:${endpoint}]. Retrying in ${retryMs}ms.`);\n\n bucket.remaining = 0;\n bucket.resetAt = Date.now() + retryMs;\n\n await sleep(retryMs);\n\n return this.execute(method, endpoint, body, bucket);\n }\n\n if (response.statusCode >= 400) {\n throw new StoatAPIError(response.statusCode, data, method, endpoint);\n }\n\n return data as any;\n }\n\n /**\n * Uploads a file to Stoat's CDN and returns the File ID\n */\n public async uploadFile(filename: string, fileBuffer: Buffer | Blob): Promise<string> {\n if (!this.token) throw new Error(\"REST_NOT_READY: No token available.\");\n\n const url = \"https://cdn.stoatusercontent.com/attachments\";\n\n const formData = new FormData();\n formData.append(\"file\", new Blob([fileBuffer as Uint8Array<ArrayBuffer>]), filename);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-Bot-Token\": this.token,\n },\n body: formData,\n });\n\n if (!response.ok) {\n let errData;\n const errText = await response.text();\n try {\n errData = JSON.parse(errText);\n } catch {\n errData = errText;\n }\n throw new StoatAPIError(response.status, errData, \"POST\", \"/attachments\");\n }\n\n const data = (await response.json()) as { id: string };\n\n return data.id;\n }\n\n public get(endpoint: string) {\n return this.makeRequest(\"GET\", endpoint);\n }\n public post(endpoint: string, body?: any) {\n return this.makeRequest(\"POST\", endpoint, body);\n }\n public patch(endpoint: string, body?: any) {\n return this.makeRequest(\"PATCH\", endpoint, body);\n }\n public delete(endpoint: string, body?: any) {\n return this.makeRequest(\"DELETE\", endpoint, body);\n }\n\n async put(endpoint: string, body?: any) {\n return this.makeRequest(\"PUT\", endpoint, body);\n }\n}\n","import { Collection } from \"../utils/Collection\";\nimport type { BaseChannel } from \"../structures/BaseChannel\";\nimport { Message, MessageOptions } from \"../structures/Message\";\nimport type { Client } from \"../client/Client\";\nimport * as util from \"node:util\";\nimport { BaseManager } from \"./BaseManager\";\nimport { UserResolvable } from \"./UserManager\";\n\nexport type MessageResolvable = Message | string;\n\nexport interface MessageFetchOptions {\n limit?: number;\n before?: string;\n after?: string;\n sort?: \"Relevance\" | \"Latest\" | \"Oldest\";\n nearby?: string;\n includeUsers?: boolean;\n}\n\nexport class MessageManager extends BaseManager<string, Message> {\n constructor(\n client: Client,\n public channel: BaseChannel,\n limit: number = Infinity,\n ) {\n super(client, limit);\n }\n\n /**\n * Tell BaseManager how to find the ID for Messages\n */\n protected extractId(data: any): string {\n return data._id ?? data.id;\n }\n\n /**\n * Tell BaseManager how to build a Message\n */\n protected construct(data: any): Message {\n return new Message(this.client, data);\n }\n\n public async fetch(id: string): Promise<Message> {\n const data = await this.client.rest.get(`/channels/${this.channel.id}/messages/${id}`);\n return this._add(data);\n }\n\n /**\n * Fetches multiple messages from the channel using specific filter parameters.\n * @param options The query parameters to filter the fetched messages.\n * @returns A promise that resolves to a Collection of fetched Messages.\n * @throws {Error} If the API request fails.\n * @example\n * // Fetch the last 50 messages in the channel\n * const messages = await channel.messages.fetchMany({ limit: 50, sort: \"Latest\" });\n *\n * // Fetch 20 messages before a specific message ID\n * const history = await channel.messages.fetchMany({ limit: 20, before: \"01H...\" });\n */\n public async fetchMany(options: MessageFetchOptions = {}): Promise<Collection<string, Message>> {\n const params = new URLSearchParams();\n\n if (options.limit !== undefined) params.append(\"limit\", options.limit.toString());\n if (options.before !== undefined) params.append(\"before\", options.before);\n if (options.after !== undefined) params.append(\"after\", options.after);\n if (options.sort !== undefined) params.append(\"sort\", options.sort);\n if (options.nearby !== undefined) params.append(\"nearby\", options.nearby);\n if (options.includeUsers !== undefined) params.append(\"include_users\", options.includeUsers.toString());\n\n const queryString = params.toString();\n const endpoint = `/channels/${this.channel.id}/messages${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await this.client.rest.get(endpoint);\n\n const rawMessages = Array.isArray(data) ? data : data.messages || [];\n\n if (!Array.isArray(data) && data.users) {\n for (const userData of data.users) {\n this.client.users._add(userData);\n }\n }\n\n const fetched = new Collection<string, Message>();\n\n for (const rawMsg of rawMessages) {\n const msg = this._add(rawMsg);\n fetched.set(msg.id, msg);\n }\n\n return fetched;\n }\n\n public resolveId(message: MessageResolvable): string {\n if (typeof message === \"string\") return message;\n if (message instanceof Message) return message.id;\n throw new Error(\"Invalid MessageResolvable: must be a Message object or a string ID.\");\n }\n\n /**\n * Sends a new message to this channel.\n * @param contentOrOptions The string content or message options payload.\n * @returns A promise that resolves to the sent Message.\n */\n public async send(contentOrOptions: MessageOptions | string): Promise<Message> {\n const payload: any = typeof contentOrOptions === \"string\" ? { content: contentOrOptions } : { ...contentOrOptions }; // Spread to avoid mutating the user's original object\n\n if (payload.embeds) {\n payload.embeds = payload.embeds.map((embed: any) =>\n typeof embed.toJSON === \"function\" ? embed.toJSON() : embed,\n );\n }\n\n const data = await this.client.rest.post(`/channels/${this.channel.id}/messages`, payload);\n\n return new Message(this.client, data);\n }\n\n /**\n * Edits an existing message.\n * @param message The MessageResolvable (object or ID) to edit.\n * @param contentOrOptions The new content or options.\n * @returns A promise that resolves to the updated Message.\n */\n public async edit(message: MessageResolvable, contentOrOptions: string | MessageOptions): Promise<Message> {\n const id = this.resolveId(message);\n const payload: MessageOptions =\n typeof contentOrOptions === \"string\" ? { content: contentOrOptions } : { ...contentOrOptions };\n\n if (payload.embeds) {\n payload.embeds = payload.embeds.map((embed: any) =>\n typeof embed.toJSON === \"function\" ? embed.toJSON() : embed,\n );\n }\n\n const data = await this.client.rest.patch(`/channels/${this.channel.id}/messages/${id}`, payload);\n const existing = this.cache.get(id);\n if (existing) {\n existing._patch(data);\n return existing;\n }\n\n return new Message(this.client, data);\n }\n\n /**\n * Deletes a message from the channel.\n * @param message The MessageResolvable to delete.\n */\n public async delete(message: MessageResolvable): Promise<void> {\n const id = this.resolveId(message);\n await this.client.rest.delete(`/channels/${this.channel.id}/messages/${id}`);\n this.cache.delete(id);\n }\n\n /**\n * Pins a message in the channel.\n * @param message The MessageResolvable to pin.\n */\n public async pin(message: MessageResolvable): Promise<void> {\n const id = this.resolveId(message);\n await this.client.rest.post(`/channels/${this.channel.id}/messages/${id}/pin`, {});\n\n const existing = this.cache.get(id);\n if (existing) existing.pinned = true;\n }\n\n /**\n * Unpins a message in the channel.\n * @param message The MessageResolvable to unpin.\n */\n public async unpin(message: MessageResolvable): Promise<void> {\n const id = this.resolveId(message);\n await this.client.rest.delete(`/channels/${this.channel.id}/messages/${id}/pin`);\n\n const existing = this.cache.get(id);\n if (existing) existing.pinned = false;\n }\n\n /**\n * React to a message\n * @param message The MessageResolvable to react to.\n * @param reaction The emoji to react with. Can be a Unicode emoji or a custom emoji ID.\n * @throws {Error} If the API request fails.\n * @example\n * await channel.messages.react(messageId, \"👍\");\n * await channel.messages.react(messageId, \"customEmojiId\");\n */\n public async react(message: MessageResolvable, reaction: string): Promise<void> {\n const id = this.resolveId(message);\n await this.client.rest.put(`/channels/${this.channel.id}/messages/${id}/reactions/${encodeURIComponent(reaction)}`);\n }\n\n /**\n * Remove a reaction(s) from a message\n * Requires ManageMessages if changing others' reactions.\n * @param reaction The emoji to remove. Can be a unicode emoji or a custom emoji ID.\n * @param message The MessageResolvable to remove the reaction from.\n * @param userId The ID of the user whose reaction to remove. If not provided, removes the current user's reaction.\n * @param removeAll Remove all reactions of this type.\n * @throws {Error} If both userId and removeAll are provided, or if the API request fails.\n * @example\n * // Remove the current user's reaction\n * await channel.messages.removeReaction(messageId, \"👍\");\n * // Remove a specific user's reaction\n * await channel.messages.removeReaction(messageId, \"👍\", userId);\n * // Remove all reactions of this type\n * await channel.messages.removeReaction(messageId, \"👍\", undefined, true);\n */\n public async removeReaction(\n message: MessageResolvable,\n reaction: string,\n userId?: UserResolvable,\n removeAll?: boolean,\n ): Promise<void> {\n const id = this.resolveId(message);\n const targetUser = userId ? this.client.users.resolveId(userId) : undefined;\n\n const params = new URLSearchParams();\n if (targetUser) params.append(\"user_id\", targetUser);\n if (removeAll) params.append(\"remove_all\", \"true\");\n\n const queryString = params.toString();\n const endpoint = `/channels/${this.channel.id}/messages/${id}/reactions/${encodeURIComponent(reaction)}${queryString ? `?${queryString}` : \"\"}`;\n\n await this.client.rest.delete(endpoint);\n }\n\n /**\n * Remove all reactions from a message\n * Requires ManageMessages permission.\n * @param message The MessageResolvable to clear reactions from.\n * @throws {Error} If the API request fails.\n * @example\n * await channel.messages.clearReactions(messageId);\n */\n public async clearReactions(message: MessageResolvable): Promise<void> {\n const id = this.resolveId(message);\n await this.client.rest.delete(`/channels/${this.channel.id}/messages/${id}/reactions`);\n }\n\n [util.inspect.custom]() {\n return this.cache;\n }\n}\n","import { Collection } from \"../utils/Collection\";\nimport type { Client } from \"../client/Client\";\n\n/**\n * @template K The type of the cache keys (usually string)\n * @template Holds The type of the Structure this manager holds\n */\nexport abstract class BaseManager<K, Holds> {\n public cache: Collection<K, Holds>;\n public client: Client;\n\n protected constructor(client: Client, limit: number = Infinity) {\n this.client = client;\n this.cache = new Collection<K, Holds>(limit);\n }\n\n /**\n * Defines how to extract the unique ID from a raw API payload.\n * @internal\n */\n protected abstract extractId(data: any): K;\n\n /**\n * Defines how to construct a new instance of the Structure.\n * @internal\n */\n protected abstract construct(data: any): Holds;\n\n /**\n * Transforms raw data into a Structure, patches if existing, and saves to cache.\n * @internal\n */\n _add(data: any): Holds {\n const id = this.extractId(data);\n const existing = this.cache.get(id);\n\n if (existing && typeof (existing as any)._patch === \"function\") {\n (existing as any)._patch(data);\n return existing;\n }\n\n const structure = this.construct(data);\n this.cache.set(id, structure);\n\n return structure;\n }\n}\n","import { Collector, CollectorOptions } from \"./Collector\";\nimport { Message } from \"../structures/Message\";\nimport { BaseChannel } from \"../structures/BaseChannel\";\n\n/**\n * Options to be passed to a MessageCollector\n */\nexport interface MessageCollectorOptions extends CollectorOptions<Message> {\n /** The maximum number of messages to collect */\n max?: number;\n /** The maximum number of messages to process (both matching and non-matching the filter) */\n maxProcessed?: number;\n}\n\n/**\n * Collects messages on a channel.\n */\nexport class MessageCollector extends Collector<string, Message> {\n public channelId: string;\n public total = 0;\n public processed = 0;\n\n constructor(\n public channel: BaseChannel,\n options: MessageCollectorOptions = {},\n ) {\n super((channel as any).client, options);\n this.channelId = channel.id;\n\n const boundHandleCollect = this.handleCollect.bind(this);\n const boundHandleDispose = this.handleDispose.bind(this) as any;\n\n this.client.on(\"messageCreate\", boundHandleCollect);\n this.client.on(\"messageDelete\", boundHandleDispose);\n\n this.once(\"end\", () => {\n this.client.removeListener(\"messageCreate\", boundHandleCollect);\n this.client.removeListener(\"messageDelete\", boundHandleDispose);\n });\n }\n\n public override collect(message: Message): string | null {\n if (message.channelId !== this.channelId) return null;\n return message.id;\n }\n\n public override dispose(message: Message | { id: string; channelId: string }): string | null {\n if (message.channelId !== this.channelId) return null;\n return message.id;\n }\n\n public override handleCollect(message: Message) {\n if (message.channelId !== this.channelId) return;\n this.processed++;\n super.handleCollect(message);\n if (!this.ended && this.collected.has(message.id)) {\n this.total++;\n this.checkEnd();\n }\n }\n\n public override endReason(): string | null {\n const options = this.options as MessageCollectorOptions;\n if (options.max && this.total >= options.max) return \"limit\";\n if (options.maxProcessed && this.processed >= options.maxProcessed) return \"processedLimit\";\n return null;\n }\n}\n","import { Base } from \"./Base\";\nimport type { Client } from \"../client/Client\";\nimport type { TextChannel } from \"./TextChannel\";\nimport { MessageFetchOptions, MessageManager, MessageResolvable } from \"../managers/MessageManager\";\nimport { Message, MessageOptions } from \"./Message\";\nimport { DMChannel } from \"./DMChannel\";\nimport { GroupChannel } from \"./GroupChannel\";\nimport { ChannelEditOptions } from \"../managers/ChannelManager\";\nimport { Collection } from \"../utils/Collection\";\nimport { MessageCollector, MessageCollectorOptions } from \"../utils/MessageCollector\";\n\nexport enum ChannelType {\n TEXT = \"TextChannel\",\n DM = \"DirectMessage\",\n GROUP = \"Group\",\n}\n\nexport interface ChannelCreateOptions {\n name: string;\n type: \"Text\" | \"Voice\";\n description?: string;\n nsfw?: boolean;\n voice?: {\n max_users?: number;\n };\n}\n\nexport abstract class BaseChannel extends Base {\n public type: ChannelType;\n public messages: MessageManager;\n\n protected constructor(client: Client, data: any) {\n super(client, data);\n this.type = data.channel_type;\n\n this.messages = new MessageManager(this.client, this);\n }\n\n /**\n * Sends a message to this channel.\n * @param contentOrOptions The string content or message options payload.\n * @returns A promise that resolves to the sent Message.\n * @example\n * await channel.send(\"Hello world!\");\n * await channel.send({ content: \"Here is an embed\", embeds: [myEmbed] });\n */\n public async send(contentOrOptions: string | MessageOptions): Promise<Message> {\n return this.messages.send(contentOrOptions);\n }\n\n /**\n * Fetch this channel\n * @param force Whether to skip the cache check and force a direct API request. Defaults to false\n * @throws {Error} If the API request fails\n * @returns {BaseChannel}\n * @example\n * // Force fetch channel to update its data\n * await channel.fetch(true);\n */\n public async fetch(force: boolean = false): Promise<BaseChannel> {\n return await this.client.channels.fetch(this.id, force);\n }\n\n /**\n * Fetches multiple messages from this channel.\n * @param options The query parameters to filter the messages.\n * @throws {Error} If the API request fails\n * @returns A Collection of Messages, keyed by their ID.\n * @example\n * // Fetch the last 50 messages in the channel\n * const messages = await channel.fetchMessages({ limit: 50 });\n * console.log(`Fetched ${messages.size} messages`);\n * // Fetch messages before a specific message ID\n * const messages = await channel.fetchMessages({ before: \"MESSAGE_ID\" });\n * console.log(`Fetched ${messages.size} messages sent before the specified message`);\n * // Fetch messages after a specific message ID\n * const messages = await channel.fetchMessages({ after: \"MESSAGE_ID\" });\n * console.log(`Fetched ${messages.size} messages sent after the specified message`);\n * // Fetch messages around a specific message ID\n * const messages = await channel.fetchMessages({ around: \"MESSAGE_ID\", limit: 10 });\n * console.log(`Fetched ${messages.size} messages sent around the specified message`);\n */\n public async fetchMessages(options?: MessageFetchOptions): Promise<Collection<string, Message>> {\n return this.messages.fetchMany(options);\n }\n\n /**\n * Edits this channel.\n * @param options The fields to update\n * @throws {Error} If the API request fails\n * @returns BaseChannel\n * @example\n * // Edit the channel's name\n * await channel.edit({name: \"New Cool Name\"});\n */\n public async edit(options: ChannelEditOptions): Promise<BaseChannel> {\n return await this.client.channels.edit(this.id, options);\n }\n\n /**\n * Deletes this channel.\n * @throws {Error} If the API request fails\n * @example\n * // Delete the channel\n * await channel.delete();\n */\n public async delete(): Promise<void> {\n await this.client.channels.delete(this.id);\n }\n\n /**\n * Bulk delete messages from this channel\n * @param messages MessageResolvable to delete\n * @throws {Error} If the API request fails\n * @example\n * // Delete messages by their ID's\n * await channel.bulkDelete([\"MESSAGE_ID_1\", \"MESSAGE_ID_2\", \"MESSAGE_ID_3\"]);\n * // Delete messages by their Message objects\n * await channel.bulkDelete([message1, message2, message3]);\n */\n public async bulkDelete(messages: MessageResolvable[]): Promise<void> {\n await this.client.channels.bulkDelete(this.id, messages);\n }\n\n /**\n * Creates a MessageCollector to collect messages in this channel.\n * @param options The options for the collector.\n * @returns The instantiated MessageCollector\n * @example\n * const collector = channel.createMessageCollector({ filter: m => m.authorId === '123', time: 15000 });\n * collector.on('collect', m => console.log(`Collected ${m.content}`));\n * collector.on('end', collected => console.log(`Collected ${collected.size} items`));\n */\n public createMessageCollector(options?: MessageCollectorOptions): MessageCollector {\n return new MessageCollector(this, options);\n }\n\n /**\n * Awaits messages in this channel that meet certain criteria.\n * @param options The options for the collector.\n * @returns A promise that resolves to a collection of messages.\n * @example\n * // Await !vote messages\n * const filter = m => m.content.startsWith('!vote');\n * channel.awaitMessages({ filter, max: 4, time: 60000 })\n * .then(collected => console.log(collected.size))\n * .catch(console.error);\n */\n public awaitMessages(options: MessageCollectorOptions = {}): Promise<Collection<string, Message>> {\n return new Promise((resolve, reject) => {\n const collector = this.createMessageCollector(options);\n\n collector.once(\"end\", (collected, reason) => {\n if (options.max && reason !== \"limit\" && reason !== \"time\") {\n return reject(new Error(`Collector ended with reason: ${reason}`));\n }\n\n resolve(collected);\n });\n });\n }\n\n public isText(): this is TextChannel {\n return this.type === ChannelType.TEXT;\n }\n\n public isDM(): this is DMChannel {\n return this.type === ChannelType.DM;\n }\n\n public isGroup(): this is GroupChannel {\n return this.type === ChannelType.GROUP;\n }\n}\n","import { BaseChannel } from \"./BaseChannel\";\nimport { Client } from \"../client/Client\";\nimport { Attachment } from \"./Attachment\";\nimport { PermissionResolvable } from \"../utils/permissions\";\nimport { ChannelRolePermissionOptions } from \"../managers/ChannelManager\";\n\nexport class TextChannel extends BaseChannel {\n public name!: string;\n public serverId!: string;\n public defaultPermissions?: { a: number; d: number };\n public description?: string | null;\n public icon?: Attachment | null;\n public lastMessageId?: string | null;\n public nsfw?: boolean;\n public slowmode?: number;\n public voice?: any;\n\n constructor(client: Client, data: any) {\n super(client, data);\n this.serverId = data.server;\n this.defaultPermissions = data.default_permissions;\n this.description = data.description;\n this.icon = data.icon;\n this.lastMessageId = data.last_message_id;\n this.nsfw = data.nsfw ?? false;\n this.slowmode = data.slowmode ?? 0;\n this.voice = data.voice;\n this._patch(data);\n }\n\n public _patch(data: any, clear?: string[]) {\n if (data.name !== undefined) this.name = data.name;\n if (data.description !== undefined) this.description = data.description;\n\n if (clear && Array.isArray(clear)) {\n for (const field of clear) {\n switch (field) {\n case \"Description\":\n this.description = null;\n break;\n case \"Icon\":\n this.icon = null;\n break;\n case \"DefaultPermissions\":\n this.defaultPermissions = data.default_permissions;\n break;\n case \"Voice\":\n this.voice = data.voice;\n break;\n }\n }\n }\n }\n\n /**\n * Updates the permission overrides for the channel.\n * @param roleId The raw string ID of the role to update.\n * @param options The allow and deny permissions to set.\n * @returns A promise that resolves to the updated BaseChannel.\n * @throws {TypeError} If the channel is not a Server Channel, or options are invalid.\n * @throws {Error} If the API request fails.\n * @example\n * // Deny a role the ability to send messages in this channel\n * await channel.setRolePermissions(\"ROLE_ID\", { deny: [\"SendMessage\"] });\n */\n public async setRolePermissions(roleId: string, options: ChannelRolePermissionOptions): Promise<this> {\n return (await this.client.channels.setRolePermissions(this.id, roleId, options)) as this;\n }\n\n /**\n * Updates the default (everyone) permissions for this channel.\n * @param permissions The default permissions to grant globally in this channel.\n * @returns A promise that resolves to the updated BaseChannel.\n * @throws {TypeError} If invalid permissions are provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Set the default permission to allow everyone to view the channel\n * await channel.setDefaultPermissions([\"ViewChannel\", \"ReadMessageHistory\"]);\n */\n public async setDefaultPermissions(permissions: PermissionResolvable): Promise<this> {\n return (await this.client.channels.setDefaultPermissions(this.id, permissions)) as this;\n }\n\n /**\n * Edits the category of this channel. Only applicable to server channels.\n * @param category The ID of the category to move this channel into, or \"default\" to remove from any category.\n * @returns The updated TextChannel with the new category.\n * @throws {Error} If the channel is not a server channel, if the category is not found in the server, or if the API request fails.\n * @example\n * // Move this channel into a category\n * await channel.setCategory(\"CATEGORY_ID\");\n * // Remove this channel from its category\n * await channel.setCategory(\"default\");\n */\n public async setCategory(category: string): Promise<TextChannel> {\n const serverId = this.serverId as string;\n const server = await this.client.servers.fetch(serverId);\n\n const categories = server.categories.map((c) => ({\n id: c.id,\n title: c.title,\n channels: [...c.channels],\n }));\n\n for (const cat of categories) {\n cat.channels = cat.channels.filter((id) => id !== this.id);\n }\n\n if (category !== \"default\") {\n const targetCategory = categories.find((c) => c.id === category);\n if (!targetCategory) {\n throw new Error(`Category ${category} not found in server.`);\n }\n targetCategory.channels.push(this.id);\n }\n\n await this.client.servers.edit(serverId, { categories });\n\n return this;\n }\n\n /**\n * Sets the position of this channel within its current category.\n * @param position The new index position for the channel within its category.\n * @returns The updated TextChannel.\n * @throws {Error} If the channel is not in a category, or if the API request fails.\n * @example\n * // Move channel to the top of its category\n * await channel.setPosition(0);\n */\n public async setPosition(position: number): Promise<TextChannel> {\n const serverId = this.serverId as string;\n const server = await this.client.servers.fetch(serverId);\n\n const categories = server.categories.map((c) => ({\n id: c.id,\n title: c.title,\n channels: [...c.channels],\n }));\n\n const currentCategory = categories.find((c) => c.channels.includes(this.id));\n\n if (!currentCategory) {\n throw new Error(\"This channel is not currently inside any category.\");\n }\n\n currentCategory.channels = currentCategory.channels.filter((id) => id !== this.id);\n\n const safePosition = Math.max(0, Math.min(position, currentCategory.channels.length));\n currentCategory.channels.splice(safePosition, 0, this.id);\n\n await this.client.servers.edit(serverId, { categories });\n\n return this;\n }\n\n /**\n * Edit the description of this channel\n * @param description\n * @throws {Error} If the API request fails\n * @returns The updated TextChannel\n * @example\n * // Set the channel description\n * await channel.setDescription(\"This is a channel about cats!\");\n * // Remove the channel description\n * await channel.setDescription(null);\n */\n public async setDescription(description: string | null): Promise<TextChannel> {\n await this.edit({ description });\n return this;\n }\n\n /**\n * Edit the name of this channel\n * @param name\n * @throws {Error} If the API request fails\n * @returns The updated TextChannel\n * @example\n * await channel.setName(\"New Name\");\n */\n public async setName(name: string): Promise<TextChannel> {\n await this.edit({ name });\n return this;\n }\n\n /**\n * Set whether this channel is NSFW\n * @param nsfw\n * @throws {Error} If the API request fails\n * @returns The updated TextChannel\n * @example\n * // Mark the channel as NSFW\n * await channel.setNSFW(true);\n * // Mark the channel as SFW\n * await channel.setNSFW(false);\n */\n public async setNSFW(nsfw: boolean): Promise<TextChannel> {\n await this.edit({ nsfw });\n return this;\n }\n\n /**\n * Set the channel slowmode in seconds\n * @param slowmode\n * @throws {Error} If the API request fails\n * @returns The updated TextChannel\n * @example\n * // Set the slowmode to 5 seconds\n * await channel.setSlowmode(5);\n * // Remove slowmode\n * await channel.setSlowmode(0);\n */\n public async setSlowmode(slowmode: number): Promise<TextChannel> {\n await this.edit({ slowmode });\n return this;\n }\n\n /**\n * Set the channel Icon\n * @param id Autumn ID to use\n * @throws {Error} If the API request fails\n * @returns The updated TextChannel\n * @example\n * await channel.setIcon(\"123\");\n * // Remove the channel icon\n * await channel.setIcon(null);\n */\n public async setIcon(id: string | null): Promise<TextChannel> {\n await this.edit({ icon: id });\n return this;\n }\n}\n","import { BaseChannel } from \"./BaseChannel\";\nimport type { Client } from \"../client/Client\";\n\n/**\n * A fallback class for channel types that are not yet officially supported by the library.\n */\nexport class UnknownChannel extends BaseChannel {\n constructor(client: Client, data: any) {\n super(client, data);\n }\n}\n","import { BaseChannel } from \"./BaseChannel\";\n\nexport class DMChannel extends BaseChannel {\n public active: boolean = false;\n public recipients: string[] = [];\n public lastMessageId: string | null = null;\n\n constructor(client: any, data: any) {\n super(client, data);\n }\n\n public _patch(data: any) {\n if (data.active !== undefined) this.active = data.active;\n if (data.recipients !== undefined) this.recipients = data.recipients;\n if (data.last_message_id !== undefined) this.lastMessageId = data.last_message_id;\n }\n}\n","import { Client } from \"../client/Client\";\nimport { Attachment } from \"./Attachment\";\nimport { BaseChannel } from \"./BaseChannel\";\nimport type { User } from \"./User\";\nimport * as util from \"node:util\";\nimport { PermissionResolvable } from \"../utils/permissions\";\n\nexport class GroupChannel extends BaseChannel {\n public name!: string;\n public ownerId!: string;\n public recipients: string[] = [];\n public description?: string | null = null;\n public icon: Attachment | null = null;\n public lastMessageId?: string | null = null;\n public nsfw: boolean = false;\n\n constructor(client: Client, data: any) {\n super(client, data);\n this._patch(data);\n }\n\n public _patch(data: any, clear?: string[]) {\n if (data.name !== undefined) this.name = data.name;\n if (data.owner !== undefined) this.ownerId = data.owner;\n if (data.recipients !== undefined) this.recipients = data.recipients;\n if (data.description !== undefined) this.description = data.description;\n if (data.last_message_id !== undefined) this.lastMessageId = data.last_message_id;\n if (data.nsfw !== undefined) this.nsfw = data.nsfw;\n\n if (data.icon !== undefined) {\n this.icon = data.icon ? new Attachment(this.client, data.icon) : null;\n }\n\n if (clear && Array.isArray(clear)) {\n for (const field of clear) {\n switch (field) {\n case \"Name\":\n this.name = \"\";\n break;\n case \"Description\":\n this.description = null;\n break;\n case \"Icon\":\n this.icon = null;\n break;\n }\n }\n }\n }\n\n /** Gets the User object of the person who owns this group */\n public get owner(): User | undefined {\n return this.client.users.cache.get(this.ownerId);\n }\n\n /** Resolves the recipient IDs into an array of cached User objects */\n public get recipientUsers(): User[] {\n return this.recipients\n .map((id) => this.client.users.cache.get(id))\n .filter((user): user is User => user !== undefined);\n }\n\n /**\n * Updates the default (everyone) permissions for this channel.\n * @param permissions The default permissions to grant globally in this channel.\n * @returns A promise that resolves to the updated BaseChannel.\n * @throws {TypeError} If invalid permissions are provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Set the default permission to allow everyone to view the channel\n * await channel.setDefaultPermissions([\"ViewChannel\", \"ReadMessageHistory\"]);\n */\n public async setDefaultPermissions(permissions: PermissionResolvable): Promise<this> {\n return (await this.client.channels.setDefaultPermissions(this.id, permissions)) as this;\n }\n\n [util.inspect.custom](_depth: number, options: util.InspectOptions, inspect: typeof util.inspect) {\n const { client, ...props } = this;\n return `${this.constructor.name} ${inspect(\n {\n ...props,\n owner: this.owner,\n recipientUsers: this.recipientUsers,\n },\n options,\n )}`;\n }\n}\n","import { TextChannel } from \"../structures/TextChannel\";\nimport { BaseChannel, ChannelType } from \"../structures/BaseChannel\";\nimport type { Client } from \"../client/Client\";\nimport { UnknownChannel } from \"../structures/UnknownChannel\";\nimport { DMChannel } from \"../structures/DMChannel\";\nimport { GroupChannel } from \"../structures/GroupChannel\";\n\nexport function createChannel(client: Client, data: any): BaseChannel {\n switch (data.channel_type) {\n case ChannelType.TEXT:\n return new TextChannel(client, data);\n case ChannelType.DM:\n return new DMChannel(client, data);\n case ChannelType.GROUP:\n return new GroupChannel(client, data);\n default:\n client.emit(\"debug\", `Received unknown channel type: ${data.type}`);\n return new UnknownChannel(client, data);\n }\n}\n","export const PermissionFlags = {\n // Server permissions\n ManageChannel: 1n << 0n,\n ManageServer: 1n << 1n,\n ManagePermissions: 1n << 2n,\n ManageRole: 1n << 3n,\n ManageCustomisation: 1n << 4n,\n\n // Member permissions\n KickMembers: 1n << 6n,\n BanMembers: 1n << 7n,\n TimeoutMembers: 1n << 8n,\n AssignRoles: 1n << 9n,\n ChangeNickname: 1n << 10n,\n ManageNicknames: 1n << 11n,\n ChangeAvatar: 1n << 12n,\n RemoveAvatars: 1n << 13n,\n\n // Channel permissions\n ViewChannel: 1n << 20n,\n ReadMessageHistory: 1n << 21n,\n SendMessage: 1n << 22n,\n ManageMessages: 1n << 23n,\n ManageWebhooks: 1n << 24n,\n InviteOthers: 1n << 25n,\n SendEmbeds: 1n << 26n,\n UploadFiles: 1n << 27n,\n Masquerade: 1n << 28n,\n React: 1n << 29n,\n BypassSlowmode: 1n << 39n,\n\n // Voice permissions\n Connect: 1n << 30n,\n Speak: 1n << 31n,\n Video: 1n << 32n,\n MuteMembers: 1n << 33n,\n DeafenMembers: 1n << 34n,\n MoveMembers: 1n << 35n,\n Listen: 1n << 36n,\n\n // Channel permissions (Part 2)\n MentionEveryone: 1n << 37n,\n MentionRoles: 1n << 38n,\n\n // Grant all\n GrantAllSafe: 0x000fffffffffffffn,\n} as const;\n\nexport type PermissionString = keyof typeof PermissionFlags;\nexport type PermissionResolvable = bigint | PermissionString | PermissionResolvable[];\n\nexport class Permissions {\n /**\n * Converts a string, BigInt, or array of strings into a single BigInt\n */\n public static resolve(permission: PermissionResolvable): bigint {\n if (typeof permission === \"bigint\") return permission;\n\n if (typeof permission === \"string\") {\n return PermissionFlags[permission] ?? 0n;\n }\n\n if (Array.isArray(permission)) {\n return permission.reduce<bigint>((acc, p) => acc | this.resolve(p), 0n);\n }\n\n return 0n;\n }\n\n /**\n * Checks if a specific permission bit exists\n */\n public static has(totalPermissions: bigint, permissionToCheck: PermissionResolvable): boolean {\n const resolvedCheck = this.resolve(permissionToCheck);\n return (totalPermissions & resolvedCheck) === resolvedCheck;\n }\n}\n","import { BaseChannel } from \"../structures/BaseChannel\";\nimport { createChannel } from \"../utils/ChannelFactory\";\nimport type { Client } from \"../client/Client\";\nimport { TextChannel } from \"../structures/TextChannel\";\nimport { DMChannel } from \"../structures/DMChannel\";\nimport { GroupChannel } from \"../structures/GroupChannel\";\nimport { Permissions, type PermissionResolvable } from \"../utils/permissions\";\nimport { BaseManager } from \"./BaseManager\";\nimport { MessageResolvable } from \"./MessageManager\";\n\nexport type ChannelResolvable = BaseChannel | string;\n\nexport interface ChannelEditOptions {\n name?: string;\n description?: string | null;\n owner?: string;\n icon?: string | null;\n nsfw?: boolean;\n archived?: boolean;\n voice?: { max_users: number };\n slowmode?: number;\n}\n\nexport interface ChannelRolePermissionOptions {\n allow?: PermissionResolvable;\n deny?: PermissionResolvable;\n}\n\nexport class ChannelManager extends BaseManager<string, BaseChannel> {\n /**\n * Manages API methods and caching for all channels globally.\n * @param client The active Client instance.\n * @param limit The maximum number of channels to hold in the cache.\n */\n constructor(client: Client, limit: number = Infinity) {\n super(client, limit);\n }\n\n protected extractId(data: any): string {\n return data._id ?? data.id;\n }\n\n protected construct(data: any): BaseChannel {\n return createChannel(this.client, data);\n }\n\n /**\n * Resolves a ChannelResolvable to a cached BaseChannel object.\n * @param channel The ChannelResolvable to resolve.\n * @returns The resolved BaseChannel, or undefined if not cached.\n */\n public resolve(channel: ChannelResolvable): BaseChannel | undefined {\n if (channel instanceof BaseChannel) return channel;\n\n if (typeof channel === \"string\") {\n const id = channel.replace(/[<#>]/g, \"\");\n return this.cache.get(id);\n }\n\n return undefined;\n }\n\n public resolveText(channel: ChannelResolvable): TextChannel | undefined {\n const resolved = this.resolve(channel);\n return resolved?.isText() ? resolved : undefined;\n }\n\n public resolveDM(channel: ChannelResolvable): DMChannel | undefined {\n const resolved = this.resolve(channel);\n return resolved?.isDM() ? resolved : undefined;\n }\n\n public resolveGroup(channel: ChannelResolvable): GroupChannel | undefined {\n const resolved = this.resolve(channel);\n return resolved?.isGroup() ? resolved : undefined;\n }\n\n /**\n * Extracts ID from a ChannelResolvable.\n * @param channel The ChannelResolvable to extract the ID from.\n * @returns The extracted channel ID.\n * @throws {TypeError} If an invalid type is provided.\n */\n public resolveId(channel: ChannelResolvable): string {\n if (channel instanceof BaseChannel) {\n return channel.id;\n }\n\n if (typeof channel === \"string\") {\n return channel.replace(/[<#>]/g, \"\");\n }\n\n throw new TypeError(\"Invalid ChannelResolvable provided. Expected a BaseChannel object or a string ID/Mention.\");\n }\n\n /**\n * Fetches a Channel from the API or resolves it from the local cache.\n * @param channel The ID, mention, or Channel object to fetch.\n * @param force Whether to skip the cache check and force a direct API request. Defaults to false.\n * @returns A promise that resolves to the fetched BaseChannel object.\n * @throws {TypeError} If an invalid ChannelResolvable is provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Fetch a channel, bypassing cache\n * const channel = await client.channels.fetch(\"01H...\");\n */\n public async fetch(channel: ChannelResolvable, force: boolean = false): Promise<BaseChannel> {\n if (!force) {\n const cached = this.resolve(channel);\n if (cached) return cached;\n }\n\n const id = this.resolveId(channel);\n const data = await this.client.rest.get(`/channels/${id}`);\n\n return this._add(data);\n }\n\n /**\n * Edits a channel in the server.\n * @param channel The ChannelResolvable to edit.\n * @param options The fields to update.\n * @returns A promise that resolves to the updated BaseChannel.\n * @throws {TypeError} If invalid options or ChannelResolvable are provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Update channel name and remove its description\n * await client.channels.edit(\"01H...\", { name: \"general\", description: null });\n */\n public async edit(channel: ChannelResolvable, options: ChannelEditOptions): Promise<BaseChannel> {\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"ChannelEditOptions must be a valid object.\");\n }\n\n const payload: any = {};\n const remove: string[] = [];\n\n if (options.name !== undefined) payload.name = options.name;\n if (options.owner !== undefined) payload.owner = options.owner;\n if (options.nsfw !== undefined) payload.nsfw = options.nsfw;\n if (options.archived !== undefined) payload.archived = options.archived;\n if (options.voice !== undefined) payload.voice = options.voice;\n if (options.slowmode !== undefined) payload.slowmode = options.slowmode;\n\n if (options.description !== undefined) {\n if (options.description === null) remove.push(\"Description\");\n else payload.description = options.description;\n }\n\n if (options.icon !== undefined) {\n if (options.icon === null) remove.push(\"Icon\");\n else payload.icon = options.icon;\n }\n\n if (remove.length > 0) payload.remove = remove;\n if (Object.keys(payload).length === 0) return this.fetch(channel);\n\n const data = await this.client.rest.patch(`/channels/${this.resolveId(channel)}`, payload);\n return this._add(data);\n }\n\n /**\n * Updates the permission overrides for a specific role in a channel.\n * @param channel The ChannelResolvable to update permissions for.\n * @param roleId The raw string ID of the role to update.\n * @param options The allow and deny permissions to set.\n * @returns A promise that resolves to the updated BaseChannel.\n * @throws {TypeError} If the channel is not a Server Channel, or options are invalid.\n * @throws {Error} If the API request fails.\n * @example\n * // Deny a role the ability to send messages in this channel\n * await client.channels.setRolePermissions(channel, \"ROLE_ID\", { deny: [\"SendMessage\"] });\n */\n public async setRolePermissions(\n channel: ChannelResolvable,\n roleId: string,\n options: ChannelRolePermissionOptions,\n ): Promise<BaseChannel> {\n const resolved = this.resolve(channel);\n if (resolved && !resolved.isText()) {\n throw new TypeError(\"Role permissions can only be set on Server Channels.\");\n }\n\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"ChannelRolePermissionOptions must be a valid object.\");\n }\n\n const id = this.resolveId(channel);\n const allowBigInt = options.allow !== undefined ? Permissions.resolve(options.allow) : 0n;\n const denyBigInt = options.deny !== undefined ? Permissions.resolve(options.deny) : 0n;\n\n const payload = {\n permissions: {\n allow: Number(allowBigInt),\n deny: Number(denyBigInt),\n },\n };\n\n const data = await this.client.rest.put(`/channels/${id}/permissions/${roleId}`, payload);\n return this._add(data);\n }\n\n /**\n * Updates the default (everyone) permissions for a channel.\n * @param channel The ChannelResolvable to update permissions for.\n * @param permissions The default permissions to grant globally in this channel.\n * @returns A promise that resolves to the updated BaseChannel.\n * @throws {TypeError} If invalid permissions are provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Set the default permission to allow everyone to view the channel\n * await client.channels.setDefaultPermissions(channel, [\"ViewChannel\", \"ReadMessageHistory\"]);\n */\n public async setDefaultPermissions(\n channel: ChannelResolvable,\n permissions: PermissionResolvable,\n ): Promise<BaseChannel> {\n const resolved = this.resolve(channel);\n if (resolved && resolved.isDM()) {\n throw new TypeError(\"Default permissions cannot be set on Direct Message channels.\");\n }\n\n const id = this.resolveId(channel);\n const permBigInt = Permissions.resolve(permissions);\n\n const payload = {\n permissions: Number(permBigInt),\n };\n\n const data = await this.client.rest.put(`/channels/${id}/permissions/default`, payload);\n return this._add(data);\n }\n\n /**\n * Deletes a server channel, leaves a group, or closes a DM.\n * @param channel The channel object, raw ID, or mention string to delete.\n * @returns A promise that resolves when the action is successful.\n * @throws {Error} If the API request fails.\n * @example\n * await client.channels.delete(\"01H...\");\n */\n public async delete(channel: ChannelResolvable): Promise<void> {\n const id = this.resolveId(channel);\n await this.client.rest.delete(`/channels/${id}`);\n this.cache.delete(id);\n }\n\n /**\n * Pin a message\n * @param id Channel ID\n * @param messageId Message ID\n * @throws {Error} If the API request fails.\n * @example\n * await client.channels.pin(\"CHANNEL_ID\", \"MESSAGE_ID\");\n */\n public async pin(id: string, messageId: string): Promise<void> {\n await this.client.rest.post(`/channels/${id}/pins/${messageId}`);\n }\n\n /**\n * Unpin a message\n * @param id Channel ID\n * @param messageId Message ID\n * @throws {Error} If the API request fails\n * @example\n * await client.channels.unpin(\"CHANNEL_ID\", \"MESSAGE_ID\");\n */\n public async unpin(id: string, messageId: string): Promise<void> {\n await this.client.rest.delete(`/channels/${id}/pins/${messageId}`);\n }\n\n /**\n * Bulk delete up to 100 messages\n * @param id Channel ID\n * @param messages An array of MessageResolvable\n * @throws {Error} If the API request fails\n * @example\n * await client.channels.bulkDelete(\"CHANNEL_ID\", [\"MESSAGE_ID_1\", \"MESSAGE_ID_2\", \"MESSAGE_ID_3\"]);\n */\n public async bulkDelete(id: string, messages: MessageResolvable[]): Promise<void> {\n if (!Array.isArray(messages) || messages.length === 0 || messages.length > 100) {\n throw new TypeError(\"Messages must be an array of 1-100 MessageResolvable items.\");\n }\n\n const messageIds = messages.map((msg) => {\n if (typeof msg === \"string\") return msg.replace(/[<#>]/g, \"\");\n if (\"id\" in msg) return msg.id;\n throw new TypeError(\"Invalid MessageResolvable provided. Expected a Message object or a string ID/Mention.\");\n });\n\n await this.client.rest.delete(`/channels/${id}/messages/bulk`, { messages: messageIds });\n }\n}\n","import { Base } from \"./Base\";\nimport type { Client } from \"../client/Client\";\nimport type { User } from \"./User\";\nimport type { Server } from \"./Server\";\nimport { Permissions, PermissionFlags, PermissionResolvable } from \"../utils/permissions\";\nimport * as util from \"node:util\";\nimport { MemberBanOptions, MemberEditOptions } from \"../managers/MemberManager\";\nimport { MemberRoleManager } from \"../managers/MemberRoleManager\";\nimport { StoatCDN } from \"../utils/Constants\";\nimport { Attachment } from \"./Attachment\";\nimport { Message, MessageOptions } from \"./Message\";\n\n/**\n * Represents a member of a server on Stoat\n *\n * @extends {Base}\n */\nexport class Member extends Base {\n // The server ID the member is in\n public serverId!: string;\n // The nickname the member has in the server, if any.\n public nickname: string | null = null;\n // The avatar the member has in the server, if any.\n public avatar: Attachment | null = null;\n /** @internal */\n private _roles: string[] = [];\n // The date the member joined the server\n public joinedAt!: Date;\n // The date the member's timeout expires, or null if not timed out\n public timeout: Date | null = null;\n // Whatever the user can talk in Voice Chat\n public canPublish: boolean = false;\n // Whatever the user can hear in Voice Chat\n public canRecieve: boolean = false;\n // Member roles manager\n public roles: MemberRoleManager;\n\n constructor(client: Client, data: any) {\n super(client, { _id: data.user._id });\n\n this.serverId = data.serverId || data.server_id;\n this.joinedAt = new Date(data.joinedAt || data.joined_at);\n this.roles = new MemberRoleManager(this);\n\n this._patch(data);\n }\n\n _patch(data: any) {\n if (data.nickname !== undefined) this.nickname = data.nickname;\n if (data.avatar !== undefined) this.avatar = data.avatar;\n if (data.roles !== undefined) this._roles = data.roles;\n if (data.timeout !== undefined) this.timeout = data.timeout ? new Date(data.timeout) : null;\n if (data.can_publish !== undefined) this.canPublish = data.canPublish;\n if (data.can_recieve !== undefined) this.canRecieve = data.canRecieve;\n }\n\n /**\n * Get member role IDs\n */\n public get roleIds(): string[] {\n return this._roles;\n }\n\n /** Gets the global User object for this member */\n public get user(): User | undefined {\n return this.client.users.cache.get(this.id);\n }\n\n /** Gets the Server object this member belongs to */\n public get server(): Server | undefined {\n return this.client.servers.cache.get(this.serverId);\n }\n\n /** Calculates the member's total permissions using BigInt */\n public get permissions(): bigint {\n const server = this.server;\n if (!server) return 0n;\n\n let totalPerms = server.defaultPermissions ?? 0n;\n\n for (const role of this.roles.cache.values()) {\n totalPerms |= BigInt(role.permissions);\n }\n\n if (server.ownerId === this.id) {\n return PermissionFlags.GrantAllSafe;\n }\n\n return totalPerms;\n }\n\n /** Get avatar URL for this member, or null if they don't have one.\n * @example\n * // Get a member's avatar URL\n * const avatarURL = member.avatarURL;\n * console.log(avatarURL); // https://cdn.stoat.chat/attachments/avatars/1234567890/avatar.png\n */\n public get avatarURL(): string | null {\n if (!this.avatar) return null;\n return `${StoatCDN}/attachments/avatars/${this.avatar.id}/${this.avatar.filename}`;\n }\n\n /**\n * Ban this member from the server.\n * @param options The options for this ban\n * @example\n * // Ban a member with a reason and delete their messages from the last hour\n * await member.ban({ reason: \"Spamming\", deleteMessageSeconds: 3600 });\n */\n public async ban(options?: MemberBanOptions): Promise<void> {\n let server = this.server;\n if (!server) server = await this.client.servers.fetch(this.serverId);\n\n await server.members.ban(this.id, options);\n }\n\n /**\n * Creates a DM channel between the client's user and this member.\n * @param force If true, forces the creation of a new DM channel even if one already exists.\n * @returns A promise that resolves to the created DMChannel object.\n * @throws {Error} If the API request fails.\n * @example\n * // Create a DM with this member\n * const dm = await member.createDM();\n * console.log(`DM channel ID: ${dm.id}`);\n */\n public async createDM(force: boolean = false): Promise<void> {\n await this.client.users.createDM(this.id, { force });\n }\n\n /**\n * Timeout this member for a specified duration.\n * @param duration The duration of the timeout in milliseconds.\n * @example\n * // Timeout a member for 10 minutes (600,000 milliseconds)\n * await member.setTimeout(600000);\n */\n public async setTimeout(duration: number): Promise<void> {\n await this.edit({ timeout: new Date(Date.now() + duration).toISOString() });\n }\n\n /**\n * Send a message to this member.\n * @param options The content or options for the message to send.\n * @returns A promise that resolves to the sent Message object.\n * @throws {Error} If the API request fails.\n * @example\n * // Send a message to this member\n * const message = await member.send(\"Hello!\");\n * console.log(`Sent message ID: ${message.id}`);\n */\n public async send(options: string | MessageOptions): Promise<Message> {\n let dmChannel = await this.client.users.createDM(this.id);\n return dmChannel.messages.send(options);\n }\n\n public async setNickname(nickname: string): Promise<Member> {\n return this.edit({ nickname });\n }\n\n /** Checks if the member has a specific permission */\n public hasPermission(permission: PermissionResolvable): boolean {\n return Permissions.has(this.permissions, permission);\n }\n\n /**\n * Edit this member.\n * @param options The options to edit the member with (nickname, roles, timeout, etc.)\n * @returns A promise that resolves to the updated Member.\n */\n public async edit(options: MemberEditOptions): Promise<Member> {\n let server = this.server;\n if (!server) server = await this.client.servers.fetch(this.serverId);\n\n return await server.members.edit(this.id, options);\n }\n\n /**\n * When concatenated with a string, this automatically returns the user's mention instead of the GuildMember object.\n * @returns {string}\n * @example\n * // Logs: Hello from <@01JE2MM759J5D7CHJF084R7MJ2>!\n * console.log(`Hello from ${member}!`);\n */\n public override toString(): string {\n return `<@${this.id}>`;\n }\n\n /**\n * Kick this member from the server.\n */\n public async kick(): Promise<void> {\n let server = this.server;\n if (!server) server = await this.client.servers.fetch(this.serverId);\n\n await server.members.kick(this.id);\n }\n\n /** @internal */\n [util.inspect.custom](depth: number, options: util.InspectOptions, inspect: typeof util.inspect) {\n const { client, serverId, ...props } = this;\n return `${this.constructor.name} ${inspect(\n {\n ...props,\n user: this.user,\n permissions: this.permissions,\n },\n { ...options, depth: depth ?? options.depth },\n )}`;\n }\n}\n","import type { Member } from \"../structures/Member\";\nimport type { Role } from \"../structures/Role\";\nimport { Collection } from \"../utils/Collection\";\nimport type { RoleResolvable } from \"./RoleManager\";\n\nexport class MemberRoleManager {\n public member: Member;\n constructor(member: Member) {\n this.member = member;\n }\n\n /**\n * Gets a Collection of the actual Role objects this member has.\n * This dynamically pulls from the Server's role cache so references are always up to date\n */\n public get cache(): Collection<string, Role> {\n const fetched = new Collection<string, Role>();\n const server = this.member.server;\n\n if (!server) return fetched;\n\n for (const roleId of this.member.roleIds) {\n const role = server.roles.cache.get(roleId);\n if (role) fetched.set(role.id, role);\n }\n\n return fetched;\n }\n\n /**\n * Checks if the member has a specific role.\n * @param role The RoleResolvable to check for.\n */\n public has(role: RoleResolvable): boolean {\n const server = this.member.server;\n if (!server) return false;\n\n const id = server.roles.resolveId(role);\n return this.member.roleIds.includes(id);\n }\n\n /**\n * Adds a role to the member.\n * @param role The RoleResolvable to add.\n * @returns A promise that resolves to the updated Member.\n */\n public async add(role: RoleResolvable): Promise<Member> {\n const server = this.member.server;\n if (!server) throw new Error(\"Server not cached, cannot add role.\");\n\n const id = server.roles.resolveId(role);\n\n if (this.member.roleIds.includes(id)) return this.member;\n\n const newRoles = [...this.member.roleIds, id];\n\n return this.member.edit({ roles: newRoles });\n }\n\n /**\n * Removes a role from the member.\n * @param role The RoleResolvable to remove.\n * @returns A promise that resolves to the updated Member.\n */\n public async remove(role: RoleResolvable): Promise<Member> {\n const server = this.member.server;\n if (!server) throw new Error(\"Server not cached, cannot remove role.\");\n\n const id = server.roles.resolveId(role);\n\n if (!this.member.roleIds.includes(id)) return this.member;\n\n const newRoles = this.member.roleIds.filter((rId) => rId !== id);\n\n return this.member.edit({ roles: newRoles });\n }\n\n /**\n * Overwrites all roles on the member with a completely new array.\n * @param roles An array of RoleResolvables.\n * @returns A promise that resolves to the updated Member.\n */\n public async set(roles: RoleResolvable[]): Promise<Member> {\n const server = this.member.server;\n if (!server) throw new Error(\"Server not cached, cannot set roles.\");\n\n const newRoles = roles.map((r) => server.roles.resolveId(r));\n\n return this.member.edit({ roles: newRoles });\n }\n}\n","export const StoatCDN = \"https://cdn.stoatusercontent.com\";\nexport const StoatAPI = \"https://stoat.chat/api\";\n","import { Member } from \"../structures/Member\";\nimport { Collection } from \"../utils/Collection\";\nimport type { Client } from \"../client/Client\";\nimport type { Server } from \"../structures/Server\";\nimport * as util from \"node:util\";\nimport { User } from \"../structures/User\";\nimport { BaseManager } from \"./BaseManager\";\n\nexport type MemberResolvable = Member | User | string;\n\nexport interface MemberEditOptions {\n nickname?: string | null;\n avatar?: string | null;\n roles?: string[];\n timeout?: string | null;\n}\n\nexport interface MemberBanOptions {\n reason?: string | null;\n deleteMessageSeconds?: number;\n}\n\nexport interface FetchMembersOptions {\n exclude_offline?: boolean;\n}\n\nexport class MemberManager extends BaseManager<string, Member> {\n constructor(\n client: Client,\n public server: Server,\n limit: number = Infinity,\n ) {\n super(client, limit);\n }\n\n /**\n * Tell BaseManager how to handle Revolt's Member IDs\n * @internal\n */\n protected extractId(data: any): string {\n return data.user_id ?? data.id ?? (typeof data._id === \"string\" ? data._id : data._id?.user);\n }\n\n /**\n * Tell BaseManager how to build a Member\n * @internal\n */\n protected construct(data: any): Member {\n if (!data.server_id && !data.serverId) {\n data.serverId = this.server.id;\n }\n return new Member(this.client, data);\n }\n\n /**\n * Resolve a string or mention to Member\n * @param member The MemberResolvable to resolve\n * @returns The resolved Member or undefined if not found\n */\n public resolve(member: MemberResolvable): Member | undefined {\n if (member instanceof Member) return member;\n if (member instanceof User) return this.cache.get(member.id);\n if (typeof member === \"string\") return this.cache.get(member.replace(/[<@>]/g, \"\"));\n return undefined;\n }\n\n /**\n * Resolve a Member to their ID string.\n * @param member The MemberResolvable to resolve\n * @returns The resolved ID string\n * @throws {TypeError} If the provided resolvable is invalid\n */\n public resolveId(member: MemberResolvable): string {\n if (typeof member === \"string\") return member.replace(/[<@>]/g, \"\");\n if (\"id\" in member) return member.id;\n throw new TypeError(\"Invalid MemberResolvable provided.\");\n }\n\n /**\n * Fetches a member from the server, or returns the cached version if available and not forced.\n * @param member The MemberResolvable to fetch\n * @param force Whether to bypass the cache and fetch fresh data from the API\n * @returns A promise that resolves to the fetched Member\n * @throws {Error} If the API request fails or the member is not found\n * @example\n * // Fetch a member by ID, using cache if available\n * const member = await server.members.fetch(\"1234567890\");\n *\n * // Fetch a member by mention, bypassing cache\n * const member = await server.members.fetch(\"<@1234567890>\", true);\n */\n public async fetch(member: MemberResolvable, force: boolean = false): Promise<Member> {\n if (!force) {\n const cached = this.resolve(member);\n if (cached) return cached;\n }\n\n const id = this.resolveId(member);\n const data = await this.client.rest.get(`/servers/${this.server.id}/members/${id}`);\n\n return this._add(data);\n }\n\n /**\n * Fetches multiple members from the server.\n * @param options Filter options for the fetch request.\n * @returns A promise that resolves to a Collection of fetched Members.\n * @throws {Error} If the API request fails.\n * @example\n * // Fetch all members in the server\n * const allMembers = await server.members.fetchMany();\n *\n * // Fetch only online members to save bandwidth\n * const onlineMembers = await server.members.fetchMany({ exclude_offline: true });\n */\n public async fetchMany(options: FetchMembersOptions = {}): Promise<Collection<string, Member>> {\n const params = new URLSearchParams();\n\n if (options.exclude_offline !== undefined) {\n params.append(\"exclude_offline\", options.exclude_offline.toString());\n }\n\n const queryString = params.toString();\n const endpoint = `/servers/${this.server.id}/members${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await this.client.rest.get(endpoint);\n\n if (data.users && Array.isArray(data.users)) {\n for (const userData of data.users) {\n this.client.users._add(userData);\n }\n }\n\n const fetched = new Collection<string, Member>();\n const rawMembers = data.members || (Array.isArray(data) ? data : []);\n\n for (const rawMember of rawMembers) {\n const member = this._add(rawMember);\n fetched.set(member.id, member);\n }\n\n return fetched;\n }\n\n /**\n * Edits a member in the server.\n * @param member The MemberResolvable to edit.\n * @param options The fields to update (nickname, roles, timeout, etc.).\n * @returns A promise that resolves to the updated Member.\n * @throws {Error} If the API request fails or the member is not found.\n * @example\n * // Change a member's nickname and add a role\n * const updatedMember = await server.members.edit(\"1234567890\", {\n * nickname: \"New Nickname\",\n * roles: [\"roleId1\", \"roleId2\"],\n * });\n */\n public async edit(member: MemberResolvable, options: MemberEditOptions): Promise<Member> {\n const id = this.resolveId(member);\n const payload: any = {};\n const remove: string[] = [];\n\n if (options.nickname !== undefined) {\n if (options.nickname === null) remove.push(\"Nickname\");\n else payload.nickname = options.nickname;\n }\n\n if (options.avatar !== undefined) {\n if (options.avatar === null) remove.push(\"Avatar\");\n else payload.avatar = options.avatar;\n }\n\n if (options.roles !== undefined) payload.roles = options.roles;\n if (options.timeout !== undefined) {\n if (options.timeout === null) remove.push(\"Timeout\");\n else payload.timeout = options.timeout;\n }\n\n if (remove.length > 0) payload.remove = remove;\n if (Object.keys(payload).length === 0) return this.fetch(id);\n\n const data = await this.client.rest.patch(`/servers/${this.server.id}/members/${id}`, payload);\n return this._add(data);\n }\n\n /**\n * Kicks a member from the server.\n * @param member The MemberResolvable to kick.\n * @example\n * // Kick a member by ID\n * await server.members.kick(\"1234567890\");\n */\n public async kick(member: MemberResolvable): Promise<void> {\n const id = this.resolveId(member);\n await this.client.rest.delete(`/servers/${this.server.id}/members/${id}`);\n this.cache.delete(id);\n }\n\n /**\n * Bans a member from the server.\n * @param member The MemberResolvable to ban.\n * @param options The ban options\n * @example\n * // Ban a member by ID\n * await server.members.ban(\"1234567890\", { reason: \"Spamming\", deleteMessageSeconds: 3600 });\n */\n public async ban(member: MemberResolvable, options?: MemberBanOptions): Promise<void> {\n const id = this.resolveId(member);\n const payload: any = {};\n\n if (options?.reason !== undefined) payload.reason = options.reason;\n if (options?.deleteMessageSeconds !== undefined) payload.delete_message_seconds = options.deleteMessageSeconds;\n\n await this.client.rest.put(`/servers/${this.server.id}/bans/${id}`, payload);\n this.cache.delete(id);\n }\n\n /**\n * Unbans a user from the server\n * @param member The MemberResolvable to unban\n * @example\n * // Unban a member by ID\n * await server.members.unban(\"1234567890\");\n */\n public async unban(member: MemberResolvable): Promise<void> {\n const id = this.resolveId(member);\n await this.client.rest.delete(`/servers/${this.server.id}/bans/${id}`);\n }\n\n [util.inspect.custom]() {\n return this.cache;\n }\n}\n","import { Collection } from \"../utils/Collection\";\nimport type { BaseChannel, ChannelCreateOptions } from \"../structures/BaseChannel\";\nimport type { Server } from \"../structures/Server\";\nimport type { Client } from \"../client/Client\";\nimport * as util from \"node:util\";\n\nexport class ServerChannelManager {\n public client: Client;\n public server: Server;\n\n constructor(client: Client, server: Server) {\n this.client = client;\n this.server = server;\n }\n\n public get cache(): Collection<string, BaseChannel> {\n return this.client.channels.cache.filter((channel) => (channel as any).serverId === this.server.id);\n }\n\n /**\n * Creates a new channel within this server.\n * @param options The configuration for the new channel.\n * @returns The newly created Channel object.\n */\n public async create(options: ChannelCreateOptions): Promise<BaseChannel> {\n if (!options.name) throw new Error(\"A channel name must be provided.\");\n\n const payload: any = {\n name: options.name,\n type: options.type ?? \"Text\",\n description: options.description,\n nsfw: options.nsfw ?? false,\n };\n\n if (options.type === \"Voice\" && options.voice?.max_users) {\n payload.voice = { max_users: options.voice.max_users };\n }\n\n const data = await this.client.rest.post(`/servers/${this.server.id}/channels`, payload);\n\n return this.client.channels._add(data);\n }\n\n [util.inspect.custom]() {\n return this.cache;\n }\n}\n","import { Base } from \"./Base\";\nimport type { Client } from \"../client/Client\";\nimport type { Server } from \"./Server\";\nimport * as util from \"node:util\";\nimport { Permissions, type PermissionResolvable } from \"../utils/permissions\";\nimport type { RoleEditOptions, RolePermissionOptions } from \"../managers/RoleManager\";\n\nexport class Role extends Base {\n public serverId: string;\n public name!: string;\n public color: string | null = null;\n public hoist: boolean = false;\n public rank: number = 0;\n public permissions: bigint = 0n;\n\n constructor(client: Client, data: any, serverId: string) {\n super(client, data);\n this.serverId = serverId;\n this._patch(data);\n }\n\n /**\n * Updates the role instance with new data without losing the object reference.\n * @internal\n */\n public _patch(data: any) {\n if (data.name !== undefined) this.name = data.name;\n if (data.color !== undefined) this.color = data.color;\n if (data.hoist !== undefined) this.hoist = data.hoist;\n if (data.rank !== undefined) this.rank = data.rank;\n if (data.permissions !== undefined) {\n try {\n if (typeof data.permissions === \"object\" && data.permissions !== null) {\n const allowPerms = data.permissions.a ?? data.permissions[0] ?? 0;\n this.permissions = BigInt(allowPerms);\n } else {\n this.permissions = BigInt(data.permissions);\n }\n } catch {\n this.permissions = 0n;\n }\n }\n }\n\n /**\n * The server this role belongs to.\n * Pulls dynamically from the cache to prevent massive memory duplication.\n */\n public get server(): Server | undefined {\n return this.client.servers.cache.get(this.serverId);\n }\n\n /**\n * Checks whether this role has a specific permission.\n * @param permission The permission to check for.\n * @returns True if the role has the permission.\n */\n public hasPermission(permission: PermissionResolvable): boolean {\n return Permissions.has(this.permissions, permission);\n }\n\n /**\n * Fetches this role directly from the API to ensure data is up to date.\n * @param force Whether to skip the cache check and force a direct API request. Defaults to false.\n * @returns A promise that resolves to the fetched Role object.\n * @throws {TypeError} If an invalid RoleResolvable is provided.\n * @throws {Error} If the API request fails (e.g., the role does not exist).\n * @example\n * // Refresh the role's data from the API\n * await role.fetch();\n * console.log(`Role updated, current name: ${role.name}`);\n */\n public async fetch(force: boolean = true): Promise<this> {\n let server = this.server;\n\n if (!server) {\n server = await this.client.servers.fetch(this.serverId);\n }\n\n return (await server.roles.fetch(this.id, force)) as this;\n }\n\n /**\n * Edits the role with the given options. Only the fields provided in the options will be updated; all other fields will remain unchanged.\n * @param options The fields to update.\n * @returns A promise that resolves to the updated Role.\n * @throws {TypeError} If invalid options or RoleResolvable are provided.\n * @throws {Error} If the API request fails (e.g., lack of permissions).\n * @example\n * // Change the role's name and color\n * await role.edit({ name: \"Senior Admin\", colour: \"#FFD700\" });\n *\n * // Remove the custom color from the role\n * await role.edit({ colour: null });\n */\n public async edit(options: RoleEditOptions): Promise<this> {\n let server = this.server;\n if (!server) server = await this.client.servers.fetch(this.serverId);\n\n return (await server.roles.edit(this.id, options)) as this;\n }\n\n /**\n * Deletes this Role from the server.\n * @throws {Error} If the role cannot be deleted (e.g., lack of permissions).\n * @example\n * // Delete a role by its ID\n * await role.delete();\n */\n public async delete(): Promise<void> {\n let server = this.server;\n\n if (!server) {\n server = await this.client.servers.fetch(this.serverId);\n }\n\n await server.roles.delete(this.id);\n }\n\n /**\n * Updates the permissions for this role.\n * @param options The allow and deny permissions to set.\n * @returns A promise that resolves to the updated Role object.\n * @throws {TypeError} If invalid options are provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Grant the role permission to manage channels and send messages\n * await role.setPermissions({\n * allow: [\"ManageChannel\", \"SendMessage\"]\n * });\n */\n public async setPermissions(options: RolePermissionOptions): Promise<this> {\n let server = this.server;\n if (!server) server = await this.client.servers.fetch(this.serverId);\n\n return (await server.roles.setPermissions(this.id, options)) as this;\n }\n\n /**\n * Updates the hierarchical position of this role.\n * Automatically reconstructs the role array and performs a bulk update.\n * @param newPosition The new rank/position for this role (0-indexed).\n * @returns A promise that resolves to this updated Role object.\n * @throws {Error} If API request fails.\n * @example\n * // Move this role to position 2 in the hierarchy\n * await role.setPosition(2);\n * console.log(`Role moved to rank: ${role.rank}`);\n */\n public async setPosition(newPosition: number): Promise<this> {\n let server = this.server;\n if (!server) server = await this.client.servers.fetch(this.serverId);\n\n const sortedRoles = Array.from(server.roles.cache.values()).sort((a, b) => a.rank - b.rank);\n\n const filteredRoles = sortedRoles.filter((r) => r.id !== this.id);\n\n const clampedPosition = Math.max(0, Math.min(newPosition, filteredRoles.length));\n\n filteredRoles.splice(clampedPosition, 0, this);\n\n await server.roles.setRanks(filteredRoles);\n\n return this;\n }\n\n /**\n * Customizer for Node.js `console.log` and `util.inspect`.\n * Hides the cyclic client reference and raw serverId for a cleaner output.\n * @internal\n */\n [util.inspect.custom]() {\n const { client, serverId, ...props } = this;\n return `${this.constructor.name} ${util.inspect(props)}`;\n }\n}\n","import { Role } from \"../structures/Role\";\nimport type { Server } from \"../structures/Server\";\nimport type { Client } from \"../client/Client\";\nimport * as util from \"node:util\";\nimport { PermissionResolvable, Permissions } from \"../utils/permissions\";\nimport { BaseManager } from \"./BaseManager\";\n\nexport interface RoleCreateOptions {\n name: string;\n}\n\nexport interface RoleEditOptions {\n name?: string;\n colour?: string | null;\n hoist?: boolean;\n}\n\nexport interface RolePermissionOptions {\n allow?: PermissionResolvable;\n deny?: PermissionResolvable;\n}\n\nexport type RoleResolvable = Role | string;\n\nexport class RoleManager extends BaseManager<string, Role> {\n /**\n * Manages API methods and caching for server roles.\n */\n constructor(\n client: Client,\n public server: Server,\n limit: number = Infinity,\n ) {\n super(client, limit);\n }\n\n /**\n * Tell BaseManager how to find the ID for Roles\n */\n protected extractId(data: any): string {\n return data._id ?? data.id;\n }\n\n /**\n * Tell BaseManager how to build a Role\n */\n protected construct(data: any): Role {\n return new Role(this.client, data, this.server.id);\n }\n\n /**\n * Adds or updates a role in the local cache.\n * @internal\n * @param data The raw role data from the API.\n * @param idParam An optional ID parameter if the payload wraps the role object.\n * @returns The newly created or updated Role object.\n */\n public override _add(data: any, idParam?: string): Role {\n const id = idParam ?? data._id ?? data.id;\n const existing = this.cache.get(id);\n\n if (existing) {\n existing._patch(data);\n return existing;\n }\n\n const role = new Role(this.client, data, this.server.id);\n this.cache.set(role.id, role);\n return role;\n }\n\n [util.inspect.custom]() {\n return this.cache;\n }\n\n /**\n * Resolves a RoleResolvable to a Role object from the cache.\n * @param role The RoleResolvable to resolve.\n * @returns The resolved Role object, or undefined if not found.\n */\n public resolve(role: RoleResolvable): Role | undefined {\n if (role instanceof Role) return role;\n\n if (typeof role === \"string\") {\n const id = role.replace(/[<%>]/g, \"\");\n return this.cache.get(id);\n }\n\n return undefined;\n }\n\n /**\n * Extracts ID from a RoleResolvable.\n * @param role The RoleResolvable to extract the ID from.\n * @returns The extracted role ID.\n * @throws TypeError if an invalid type is provided.\n */\n public resolveId(role: RoleResolvable): string {\n if (role instanceof Role) {\n return role.id;\n }\n\n if (typeof role === \"string\") {\n return role.replace(/[<%>]/g, \"\");\n }\n\n throw new TypeError(\"Invalid RoleResolvable provided. Expected a Role object or a string ID/Mention.\");\n }\n\n /**\n * Creates a new role in this server.\n * @param options The name and optional rank of the new role\n * @returns Role The role that was created\n * @throws {Error} If the role cannot be created (e.g., lack of permissions, invalid options).\n * @throws {TypeError} If invalid options are provided.\n * @example\n * // Create a new role named \"Moderator\" with rank 1\n * const moderatorRole = await server.roles.create({ name: \"Moderator\", rank: 1 });\n * console.log(`Created role: ${moderatorRole.name} with ID: ${moderatorRole.id}`);\n */\n public async create(options: RoleCreateOptions): Promise<Role> {\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"RoleCreateOptions must be a valid object.\");\n }\n\n if (typeof options.name !== \"string\" || options.name.trim().length === 0) {\n throw new TypeError(\"A valid role 'name' (string) must be provided.\");\n }\n\n const payload: any = {\n name: options.name,\n };\n\n const data = await this.client.rest.post(`/servers/${this.server.id}/roles`, payload);\n\n return this._add(data);\n }\n\n /**\n * Fetches a Role from the API or resolves it from the local cache.\n * @param role The ID, mention, or Role object to fetch.\n * @param force Whether to skip the cache check and force a direct API request. Defaults to false.\n * @returns A promise that resolves to the fetched Role object.\n * @throws {TypeError} If an invalid RoleResolvable is provided.\n * @throws {Error} If the API request fails (e.g., the role does not exist).\n * @example\n * // Fetch a role from the API\n * const role = await server.roles.fetch(\"01JE2MM759J5D7CHJF084R7MJ2\");\n * console.log(`Fetched role: ${role.name} with ID: ${role.id}`);\n *\n * // Fetch a role by mention\n * const role = await.server.roles.fetch(\"<%01JE2MM759J5D7CHJF084R7MJ2>\");\n * console.log(`Fetched role: ${role.name} with ID: ${role.id}`);\n *\n * // Force fetch a role, bypassing the cache\n * const role = await server.roles.fetch(\"01JE2MM759J5D7CHJF084R7MJ2\", true);\n * console.log(`Fetched role: ${role.name} with ID: ${role.id}`);\n */\n public async fetch(role: RoleResolvable, force: boolean = false): Promise<Role> {\n if (!force) {\n const cached = this.resolve(role);\n if (cached) return cached;\n }\n\n const id = this.resolveId(role);\n\n const data = await this.client.rest.get(`/servers/${this.server.id}/roles/${id}`);\n\n return this._add(data);\n }\n\n /**\n * Edits an existing role in the server.\n * @param role The RoleResolvable to edit.\n * @param options The fields to update.\n * @returns A promise that resolves to the updated Role.\n * @throws {TypeError} If invalid options or RoleResolvable are provided.\n * @throws {Error} If the API request fails (e.g., lack of permissions).\n * @example\n * // Rename a role and give it a red color\n * await server.roles.edit(\"01H...\", { name: \"Super Admin\", colour: \"#FF0000\" });\n *\n * // Remove the custom color from a role\n * await server.roles.edit(role, { colour: null });\n */\n public async edit(role: RoleResolvable, options: RoleEditOptions): Promise<Role> {\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"RoleEditOptions must be a valid object.\");\n }\n\n const id = this.resolveId(role);\n const payload: any = {};\n const remove: string[] = [];\n\n if (options.name !== undefined) payload.name = options.name;\n if (options.hoist !== undefined) payload.hoist = options.hoist;\n\n // 3. Handle the \"Remove\" magic for colors\n if (options.colour !== undefined) {\n if (options.colour === null) {\n remove.push(\"Colour\");\n } else {\n payload.colour = options.colour;\n }\n }\n\n if (remove.length > 0) {\n payload.remove = remove;\n }\n\n if (Object.keys(payload).length === 0) {\n return this.fetch(id);\n }\n\n const data = await this.client.rest.patch(`/servers/${this.server.id}/roles/${id}`, payload);\n\n return this._add(data, id);\n }\n\n /**\n * Deletes a Role from the server.\n * @param role The RoleResolvable to delete\n * @returns A promise that resolves when the role is successfully deleted.\n * @throws {TypeError} If an invalid RoleResolvable is provided.\n * @throws {Error} If the role cannot be deleted (e.g., lack of permissions).\n * @example\n * // Delete a role by its ID\n * await server.roles.delete(\"01JE2MM759J5D7CHJF084R7MJ2\");\n * console.log(\"Role deleted successfully.\");\n *\n * // Delete a role using a Role object\n * const role = await server.roles.fetch(\"01JE2MM759J5D7CHJF084R7\");\n * await server.roles.delete(role);\n * console.log(\"Role deleted successfully.\");\n *\n * // Delete a role by mention\n * await server.roles.delete(\"<%01JE2MM759J5D7CHJF084R7MJ2>\");\n * console.log(\"Role deleted successfully.\");\n */\n public async delete(role: RoleResolvable): Promise<void> {\n const id = this.resolveId(role);\n\n await this.client.rest.delete(`/servers/${this.server.id}/roles/${id}`);\n\n this.cache.delete(id);\n }\n\n /**\n * Updates the permissions for a role in the server.\n * @param role The RoleResolvable to update permissions for.\n * @param options The allow and deny permissions to set.\n * @returns A promise that resolves to the updated Role.\n * @throws {TypeError} If an invalid RoleResolvable or options are provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Set permissions using an array of strings.\n * await server.roles.setPermissions(role, {\n * allow: [\"ManageChannel\", \"ViewChannel\", \"SendMessage\"]\n * });\n */\n public async setPermissions(role: RoleResolvable, options: RolePermissionOptions): Promise<Role> {\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"RolePermissionOptions must be a valid object.\");\n }\n\n const id = this.resolveId(role);\n\n const allowBigInt = options.allow !== undefined ? Permissions.resolve(options.allow) : 0n;\n const denyBigInt = options.deny !== undefined ? Permissions.resolve(options.deny) : 0n;\n\n const payload = {\n permissions: {\n allow: Number(allowBigInt),\n deny: Number(denyBigInt),\n },\n };\n\n const data = await this.client.rest.put(`/servers/${this.server.id}/permissions/${id}`, payload);\n\n // The fucking API returns a Server object\n this.server._patch(data);\n\n // So we turn it into a role to improve DX\n return this.cache.get(id) as Role;\n }\n\n /**\n * Updates the hierarchical positions of roles in the server.\n * @param ranks An array of RoleResolvables representing the new order of roles.\n * @returns A promise that resolves when the ranks are successfully updated.\n * @throws {TypeError} If the ranks parameter is not an array or contains invalid resolvables.\n * @throws {Error} If the API request fails.\n * @example\n * // Reorder roles by passing an array of Role objects or IDs\n * await server.roles.setRanks([\"RoleID_1\", adminRoleObject, \"RoleID_3\"]);\n */\n public async setRanks(ranks: RoleResolvable[]): Promise<Server> {\n if (!Array.isArray(ranks)) {\n throw new TypeError(\"The 'ranks' parameter must be an array of RoleResolvables.\");\n }\n\n const mappedIds = ranks.map((role) => this.resolveId(role));\n\n const payload = {\n ranks: mappedIds,\n };\n\n const data = await this.client.rest.put(`/servers/${this.server.id}/roles`, payload);\n\n this.server._patch(data);\n\n return this.server;\n }\n}\n","export class ServerInvite {\n public code: string;\n public creatorId: string;\n public channelId: string;\n\n constructor(data: any) {\n this.code = data._id ?? data.code;\n this.creatorId = data.creator;\n this.channelId = data.channel;\n }\n\n public _patch(data: any) {\n this.creatorId = data.creator ?? this.creatorId;\n this.channelId = data.channel ?? this.channelId;\n }\n}\n","import type { Server } from \"../structures/Server\";\nimport type { Client } from \"../client/Client\";\nimport { Collection } from \"../utils/Collection\";\nimport { ServerInvite } from \"../structures/ServerInvite\";\nimport { BaseManager } from \"./BaseManager\";\n\nexport interface Invite {\n code: string;\n creatorId: string;\n channelId: string;\n}\n\nexport class ServerInviteManager extends BaseManager<string, ServerInvite> {\n constructor(\n client: Client,\n public server: Server,\n limit: number = Infinity,\n ) {\n super(client, limit);\n }\n\n protected extractId(data: any): string {\n return data._id ?? data.code;\n }\n\n protected construct(data: any): ServerInvite {\n return new ServerInvite(data);\n }\n\n /**\n * Fetches all active invites for this server.\n */\n public async fetch(): Promise<Collection<string, ServerInvite>> {\n const data = await this.client.rest.get(`/servers/${this.server.id}/invites`);\n\n const rawInvites = Array.isArray(data) ? data : [];\n const fetched = new Collection<string, ServerInvite>();\n\n for (const raw of rawInvites) {\n const invite = this._add(raw);\n fetched.set(invite.code, invite);\n }\n\n return fetched;\n }\n}\n","export class ServerBan {\n public userId: string;\n public reason: string | null;\n\n constructor(data: any) {\n this.userId = data._id?.user ?? data.id;\n this.reason = data.reason ?? null;\n }\n\n public _patch(data: any) {\n if (data.reason !== undefined) this.reason = data.reason;\n }\n}\n","import type { Server } from \"../structures/Server\";\nimport type { Client } from \"../client/Client\";\nimport { Collection } from \"../utils/Collection\";\nimport { BaseManager } from \"./BaseManager\";\nimport { ServerBan } from \"../structures/ServerBan\";\n\nexport interface Ban {\n userId: string;\n reason: string | null;\n}\n\nexport class ServerBanManager extends BaseManager<string, ServerBan> {\n constructor(\n client: Client,\n public server: Server,\n limit: number = Infinity,\n ) {\n super(client, limit);\n }\n\n protected extractId(data: any): string {\n return data._id?.user ?? data.id;\n }\n\n protected construct(data: any): ServerBan {\n return new ServerBan(data);\n }\n\n /**\n * Fetches all bans in this server.\n * Automatically caches the associated User objects globally!\n * @returns A promise that resolves to a Collection of Bans.\n */\n public async fetch(): Promise<Collection<string, ServerBan>> {\n const data = await this.client.rest.get(`/servers/${this.server.id}/bans`);\n\n // Cache associated users globally\n if (data.users && Array.isArray(data.users)) {\n for (const userData of data.users) {\n this.client.users._add(userData);\n }\n }\n\n const rawBans = data.bans || (Array.isArray(data) ? data : []);\n const fetched = new Collection<string, ServerBan>();\n\n for (const rawBan of rawBans) {\n const ban = this._add(rawBan);\n fetched.set(ban.userId, ban);\n }\n\n return fetched;\n }\n\n /**\n * Unbans a user from the server.\n * @param userId The ID of the user to unban.\n */\n public async remove(userId: string): Promise<void> {\n const id = userId.replace(/[<@!>]/g, \"\"); // Clean the ID just in case\n await this.client.rest.delete(`/servers/${this.server.id}/bans/${id}`);\n this.cache.delete(id);\n }\n}\n","import { Base } from \"./Base\";\nimport type { Client } from \"../client/Client\";\n\nexport interface EmojiParent {\n id: string;\n type: \"Server\";\n}\n\nexport class Emoji extends Base {\n public creatorId!: string;\n public name!: string;\n public parent!: EmojiParent;\n public animated: boolean = false;\n public nsfw: boolean = false;\n\n constructor(client: Client, data: any) {\n super(client, data);\n this._patch(data);\n }\n\n public _patch(data: any) {\n if (data.creator_id !== undefined) this.creatorId = data.creator_id;\n if (data.name !== undefined) this.name = data.name;\n if (data.parent !== undefined) this.parent = data.parent;\n if (data.animated !== undefined) this.animated = data.animated;\n if (data.nsfw !== undefined) this.nsfw = data.nsfw;\n }\n}\n","import { BaseManager } from \"./BaseManager\";\nimport type { Client } from \"../client/Client\";\nimport { Emoji } from \"../structures/Emoji\";\nimport type { Server } from \"../structures/Server\";\nimport * as util from \"node:util\";\n\nexport class EmojiManager extends BaseManager<string, Emoji> {\n constructor(\n client: Client,\n public server?: Server,\n limit: number = Infinity,\n ) {\n super(client, limit);\n }\n\n /**\n * Tell BaseManager how to find the ID for Emojis\n */\n protected extractId(data: any): string {\n return data._id ?? data.id;\n }\n\n /**\n * Tell BaseManager how to build an Emoji\n */\n protected construct(data: any): Emoji {\n return new Emoji(this.client, data);\n }\n\n public async fetch(id: string): Promise<Emoji> {\n const data = await this.client.rest.get(`/custom/emoji/${id}`);\n return this._add(data);\n }\n\n [util.inspect.custom]() {\n return this.cache;\n }\n}\n","import { Base } from \"./Base\";\nimport type { Client } from \"../client/Client\";\nimport { FetchMembersOptions, MemberManager } from \"../managers/MemberManager\";\nimport { ServerChannelManager } from \"../managers/ServerChannelManager\";\nimport { Attachment } from \"./Attachment\";\nimport { RoleManager } from \"../managers/RoleManager\";\nimport { ServerInviteManager } from \"../managers/ServerInviteManager\";\nimport { ServerBanManager } from \"../managers/ServerBanManager\";\nimport { ServerEditOptions } from \"../managers/ServerManager\";\nimport { EmojiManager } from \"../managers/EmojiManager\";\n\nexport interface Categories {\n channels: string[];\n id: string;\n title: string;\n}\n\nexport class Server extends Base {\n public channelIds: string[] = [];\n public defaultPermissions!: bigint;\n public name!: string;\n public ownerId!: string;\n public analytics: boolean = false;\n public banner: Attachment | null = null;\n public categories: Categories[] = [];\n public description: string | null = null;\n public discoverable: boolean = false;\n public flags: number = 0;\n public icon: Attachment | null = null;\n public nsfw: boolean = false;\n public members: MemberManager;\n public channels: ServerChannelManager;\n public roles: RoleManager;\n public bans: ServerBanManager;\n public invites: ServerInviteManager;\n public emojis: EmojiManager;\n\n constructor(client: Client, data: any) {\n super(client, data);\n this.channels = new ServerChannelManager(client, this);\n this.members = new MemberManager(client, this);\n this.roles = new RoleManager(client, this);\n this.bans = new ServerBanManager(this.client, this);\n this.invites = new ServerInviteManager(this.client, this);\n this.emojis = new EmojiManager(this.client, this);\n this._patch(data);\n }\n\n /**\n * Updates the server instance with new data without losing the object reference.\n */\n public _patch(data: any, clear?: string[]) {\n if (data.channels !== undefined) this.channelIds = data.channels;\n if (data.default_permissions !== undefined) {\n try {\n this.defaultPermissions = BigInt(data.default_permissions);\n } catch {\n this.defaultPermissions = 0n;\n }\n }\n if (data.name !== undefined) this.name = data.name;\n if (data.owner !== undefined) this.ownerId = data.owner;\n if (data.analytics !== undefined) this.analytics = data.analytics;\n if (data.categories !== undefined) this.categories = data.categories;\n if (data.description !== undefined) this.description = data.description;\n if (data.discoverable !== undefined) this.discoverable = data.discoverable;\n if (data.flags !== undefined) this.flags = data.flags;\n if (data.nsfw !== undefined) this.nsfw = data.nsfw;\n if (data.icon !== undefined) {\n this.icon = data.icon ? new Attachment(this.client, data.icon) : null;\n }\n if (data.banner !== undefined) {\n this.banner = data.banner ? new Attachment(this.client, data.banner) : null;\n }\n if (data.roles !== undefined) {\n for (const [id, roleData] of Object.entries(data.roles)) {\n this.roles._add({ id, ...(roleData as any) });\n }\n }\n if (data.emojis !== undefined) {\n if (Array.isArray(data.emojis)) {\n for (const emoji of data.emojis) {\n this.emojis._add(emoji);\n }\n }\n }\n\n if (clear && Array.isArray(clear)) {\n for (const field of clear) {\n switch (field) {\n case \"Description\":\n this.description = null;\n break;\n case \"Icon\":\n this.icon = null;\n break;\n }\n }\n }\n }\n\n /**\n * Edits this server.\n * @param options The fields to update.\n */\n public async edit(options: ServerEditOptions): Promise<this> {\n await this.client.servers.edit(this.id, options);\n return this;\n }\n\n /**\n * Leaves the server\n */\n public async leave() {\n return this.client.rest.delete(`/servers/${this.id}/leave`);\n }\n\n /**\n * Fetches multiple members from this server.\n * @param options Filter options for the fetch request.\n * @returns A Collection of the fetched members.\n */\n public async fetchMembers(options?: FetchMembersOptions) {\n return this.members.fetchMany(options);\n }\n}\n","import { BaseManager } from \"./BaseManager\";\nimport { Server } from \"../structures/Server\";\nimport type { Client } from \"../client/Client\";\nimport * as util from \"node:util\";\n\nexport interface ServerEditOptions {\n name?: string;\n description?: string | null;\n icon?: string | null;\n banner?: string | null;\n categories?: {\n id: string;\n title: string;\n channels: string[];\n }[];\n systemMessages?: {\n userJoined?: string | null;\n userLeft?: string | null;\n userKicked?: string | null;\n userBanned?: string | null;\n };\n analytics?: boolean;\n owner?: string;\n}\n\nexport class ServerManager extends BaseManager<string, Server> {\n constructor(client: Client, limit: number = Infinity) {\n super(client, limit);\n }\n\n /**\n * Tell BaseManager how to find the ID for Servers\n */\n protected extractId(data: any): string {\n return data._id ?? data.id;\n }\n\n /**\n * Tell BaseManager how to build a Server\n */\n protected construct(data: any): Server {\n return new Server(this.client, data);\n }\n\n /**\n * Fetches a server from the API.\n * @param id The server ID.\n * @param force Whether to skip the cache and fetch from the API.\n */\n public async fetch(id: string, force: boolean = false): Promise<Server> {\n if (!force) {\n const cached = this.cache.get(id);\n if (cached) return cached;\n }\n\n const data = await this.client.rest.get(`/servers/${id}`);\n return this._add(data);\n }\n\n public async edit(serverId: string, options: ServerEditOptions): Promise<Server> {\n const payload: any = {};\n const remove: string[] = [];\n\n if (options.name !== undefined) payload.name = options.name;\n if (options.description !== undefined) {\n if (options.description === null) remove.push(\"Description\");\n else payload.description = options.description;\n }\n\n if (options.icon !== undefined) {\n if (options.icon === null) remove.push(\"Icon\");\n else payload.icon = options.icon;\n }\n if (options.banner !== undefined) {\n if (options.banner === null) remove.push(\"Banner\");\n else payload.banner = options.banner;\n }\n\n // System Messages\n if (options.systemMessages) {\n payload.system_messages = {};\n const sm = options.systemMessages;\n if (sm.userJoined !== undefined) {\n if (sm.userJoined === null) remove.push(\"SystemMessageUserJoined\");\n else payload.system_messages.user_joined = sm.userJoined;\n }\n if (sm.userLeft !== undefined) {\n if (sm.userLeft === null) remove.push(\"SystemMessageUserLeft\");\n else payload.system_messages.user_left = sm.userLeft;\n }\n if (sm.userKicked !== undefined) {\n if (sm.userKicked === null) remove.push(\"SystemMessageUserKicked\");\n else payload.system_messages.user_kicked = sm.userKicked;\n }\n if (sm.userBanned !== undefined) {\n if (sm.userBanned === null) remove.push(\"SystemMessageUserBanned\");\n else payload.system_messages.user_banned = sm.userBanned;\n }\n }\n\n if (options.categories !== undefined) payload.categories = options.categories;\n if (options.analytics !== undefined) payload.analytics = options.analytics;\n if (options.owner !== undefined) payload.owner = options.owner;\n\n if (remove.length > 0) payload.remove = remove;\n\n const data = await this.client.rest.patch(`/servers/${serverId}`, payload);\n\n // Using _add ensures the existing Server object is patched!\n return this._add(data);\n }\n\n [util.inspect.custom]() {\n return this.cache;\n }\n}\n","import { User, UserProfile, UserStatus } from \"../structures/User\";\nimport type { Client } from \"../client/Client\";\nimport { BaseManager } from \"./BaseManager\";\nimport { DMChannel } from \"../structures/DMChannel\";\nexport type UserResolvable = User | string;\n\nexport interface UserEditOptions {\n avatar?: string | null;\n displayName?: string | null;\n profile?: UserProfile;\n status?: UserStatus;\n}\n\nexport class UserManager extends BaseManager<string, User> {\n constructor(client: Client, limit: number = Infinity) {\n super(client, limit);\n }\n\n /**\n * Tell BaseManager how to find the ID for Users\n */\n protected extractId(data: any): string {\n return data._id ?? data.id;\n }\n\n /**\n * Tell BaseManager how to build a User\n */\n protected construct(data: any): User {\n return new User(this.client, data);\n }\n\n /**\n * Resolves a UserResolvable to a User object from the cache.\n */\n public resolve(user: UserResolvable): User | undefined {\n if (user instanceof User) return user;\n\n if (typeof user === \"string\") {\n const id = user.replace(/[<@>]/g, \"\");\n return this.cache.get(id);\n }\n\n return undefined;\n }\n\n /**\n * Extracts ID from a UserResolvable.\n * @param user The UserResolvable to extract the ID from.\n * @returns The extracted user ID.\n * @throws TypeError if an invalid type is provided.\n */\n public resolveId(user: UserResolvable): string {\n if (user instanceof User) {\n return user.id;\n }\n\n if (typeof user === \"string\") {\n return user.replace(/[<@>]/g, \"\");\n }\n\n throw new TypeError(\"Invalid UserResolvable provided. Expected a User object or a string ID/Mention.\");\n }\n\n /**\n * Fetches a User.\n * @param user The ID or mention to fetch\n * @param force Skip the cache check and force an API request\n * @returns The fetched User object\n * @throws Error if the user cannot be found or fetched\n * @throws TypeError if invalid UserResolvable is provided\n * @example\n * // Fetch a user by ID\n * const user = await client.users.fetch(\"01JE2MM759J5D7CHJF084R7MJ2\");\n * console.log(user.username);\n *\n * // Fetch a user by mention\n * const user = await client.users.fetch(\"<@01JE2MM759J5D7CHJF084R7MJ2>\");\n * console.log(user.username);\n *\n * // Force fetch a user, bypassing the cache\n * const user = await client.users.fetch(\"01JE2MM759J5D7CHJF084R7MJ2\", true);\n * console.log(user.username);\n */\n public async fetch(user: UserResolvable, force: boolean = false): Promise<User> {\n if (!force) {\n const cached = this.resolve(user);\n if (cached) return cached;\n }\n\n const id = this.resolveId(user);\n\n const data = await this.client.rest.get(`/users/${id}`);\n\n return this._add(data);\n }\n\n /**\n * Fetch the current user (the bot itself).\n * @returns The fetched User object representing the current user.\n * @throws Error if the user cannot be fetched.\n * @example\n * // Fetch the current user (the bot itself)\n * const me = await client.users.fetchMe();\n * console.log(`Logged in as ${me.tag}`);\n */\n public async fetchMe() {\n const data = await this.client.rest.get(`/users/@me`);\n\n return this._add(data);\n }\n\n /**\n * Edits the currently authenticated user (the bot itself).\n * @param options The fields to update (avatar, status, profile, etc.).\n * @returns A promise that resolves to the updated User object.\n * @throws {TypeError} If invalid options are provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Update the bot's status and presence\n * await client.users.editMe({\n * status: { text: \"Watching the server\", presence: \"Online\" }\n * });\n *\n * // Clear the bot's avatar and display name\n * await client.users.editMe({ avatar: null, displayName: null });\n */\n public async editMe(options: UserEditOptions): Promise<User> {\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"UserEditOptions must be a valid object.\");\n }\n\n const payload: any = {};\n const remove: string[] = [];\n\n if (options.displayName !== undefined) {\n if (options.displayName === null) remove.push(\"DisplayName\");\n else payload.display_name = options.displayName;\n }\n\n if (options.avatar !== undefined) {\n if (options.avatar === null) remove.push(\"Avatar\");\n else payload.avatar = options.avatar;\n }\n\n if (options.profile !== undefined) {\n payload.profile = {};\n if (options.profile.content !== undefined) {\n if (options.profile.content === null) remove.push(\"ProfileContent\");\n else payload.profile.content = options.profile.content;\n }\n if (options.profile.background !== undefined) {\n if (options.profile.background === null) remove.push(\"ProfileBackground\");\n else payload.profile.background = options.profile.background;\n }\n if (Object.keys(payload.profile).length === 0) delete payload.profile;\n }\n\n if (options.status !== undefined) {\n payload.status = {};\n if (options.status.text !== undefined) {\n if (options.status.text === null) remove.push(\"StatusText\");\n else payload.status.text = options.status.text;\n }\n if (options.status.presence !== undefined) {\n if (options.status.presence === null) remove.push(\"StatusPresence\");\n else payload.status.presence = options.status.presence;\n }\n if (Object.keys(payload.status).length === 0) delete payload.status;\n }\n\n if (remove.length > 0) {\n payload.remove = remove;\n }\n\n if (Object.keys(payload).length === 0) {\n return this.fetch(\"@me\");\n }\n\n const data = await this.client.rest.patch(`/users/@me`, payload);\n\n return this._add(data);\n }\n\n /**\n * The DM between the client's user and a user\n *\n * @param {string} userId The user id\n * @returns {?DMChannel}\n * @private\n */\n dmChannel(userId: string): DMChannel | null {\n return (this.client.channels.cache.find((channel) => channel.isDM() && channel.recipients.includes(userId)) ??\n null) as DMChannel | null;\n }\n\n /**\n * Creates a DM channel between the client's user and another user.\n * @param user The UserResolvable to create a DM with.\n * @param options Additional options for DM creation.\n * @param options.force If true, forces the creation of a new DM channel even if one already exists.\n * @returns A promise that resolves to the created DMChannel object.\n * @throws {TypeError} If an invalid UserResolvable is provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Create a DM with a user by ID\n * const dm = await client.users.createDM(\"1234567890\");\n * console.log(`DM channel ID: ${dm.id}`);\n */\n public async createDM(user: UserResolvable, { force = false } = {}): Promise<DMChannel> {\n const id = this.resolveId(user);\n\n if (!force) {\n const dmChannel = this.dmChannel(id);\n if (dmChannel) return dmChannel;\n }\n\n const data = await this.client.rest.get(`/users/${id}/dm`);\n return this.client.channels._add(data) as DMChannel;\n }\n}\n","// src/managers/SweeperManager.ts\nimport type { Client } from \"../client/Client\";\nimport type { TextChannel } from \"../structures/TextChannel\";\n\nexport interface SweeperOptions {\n messages?: {\n lifetime: number;\n interval: number;\n };\n}\n\nexport class SweeperManager {\n private messageInterval: NodeJS.Timeout | null = null;\n public client: Client;\n public options: SweeperOptions;\n\n constructor(client: Client, options: SweeperOptions) {\n this.client = client;\n this.options = options;\n }\n\n public start() {\n if (this.options.messages) {\n this.client.emit(\"debug\", \"Starting Message Cache Sweeper...\");\n\n this.messageInterval = setInterval(() => {\n this.sweepMessages();\n }, this.options.messages.interval);\n }\n }\n\n private sweepMessages() {\n if (!this.options.messages) return;\n\n const now = Date.now();\n const lifetime = this.options.messages.lifetime;\n let sweptCount = 0;\n\n for (const channel of this.client.channels.cache.values()) {\n if (!(\"messages\" in channel)) continue;\n\n const textChannel = channel as TextChannel;\n\n for (const [id, message] of textChannel.messages.cache.entries()) {\n if (now - message.cachedAt > lifetime) {\n textChannel.messages.cache.delete(id);\n sweptCount++;\n }\n }\n }\n\n if (sweptCount > 0) {\n this.client.emit(\"debug\", `🧹 Sweeper cleared ${sweptCount} old messages from cache.`);\n }\n }\n\n public stop() {\n if (this.messageInterval) clearInterval(this.messageInterval);\n this.client.emit(\"debug\", \"Sweepers stopped.\");\n }\n}\n","export interface TextEmbedData {\n type: \"Text\";\n title?: string;\n description?: string;\n url?: string;\n icon_url?: string;\n colour?: string;\n media?: string;\n}\n\nexport class EmbedBuilder {\n private data: TextEmbedData;\n\n constructor(data: Partial<TextEmbedData> = {}) {\n this.data = { type: \"Text\", ...data };\n }\n\n public setTitle(title: string): this {\n this.data.title = title;\n return this;\n }\n\n public setDescription(description: string): this {\n this.data.description = description;\n return this;\n }\n\n public setUrl(url: string): this {\n this.data.url = url;\n return this;\n }\n\n public setIconUrl(iconUrl: string): this {\n this.data.icon_url = iconUrl;\n return this;\n }\n\n public setColor(color: string): this {\n this.data.colour = color;\n return this;\n }\n\n public setMedia(fileId: string): this {\n this.data.media = fileId;\n return this;\n }\n\n /**\n * Serializes the builder into the raw JSON required by the API\n */\n public toJSON(): TextEmbedData {\n return { ...this.data };\n }\n}\n"],"mappings":";AAAA,SAAS,gBAAAA,qBAAoB;;;ACA7B,OAAO,eAAe;;;ACKf,IAAe,OAAf,MAAe,MAAK;AAAA,EACT;AAAA,EACT,WAAmB,KAAK,IAAI;AAAA,EAChB;AAAA,EAEnB,YAAY,QAAgB,MAAuB;AACjD,SAAK,KAAK,KAAK;AACf,SAAK,SAAS;AAEd,WAAO,eAAe,MAAM,UAAU;AAAA,MACpC,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKO,OAAO,OAA+B;AAC3C,QAAI,OAAO,UAAU,SAAU,QAAO,KAAK,OAAO;AAClD,WAAO,iBAAiB,SAAQ,KAAK,OAAO,MAAM;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKO,WAAmB;AACxB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,SAAe;AACpB,WAAO,OAAO,OAAO,OAAO,OAAO,IAAI,GAAG,IAAI;AAAA,EAChD;AACF;;;ACrCA,YAAYC,WAAU;;;ACKf,IAAM,aAAN,cAAyB,KAAK;AAAA,EACnB;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEP,YAAY,QAAgB,MAAW;AACrC,UAAM,QAAQ,EAAE,GAAG,MAAM,IAAI,KAAK,IAAI,CAAC;AAEvC,SAAK,KAAK,KAAK;AACf,SAAK,MAAM,KAAK;AAChB,SAAK,WAAW,KAAK;AACrB,SAAK,WAAW,KAAK,YAAY,EAAE,MAAM,OAAO;AAChD,SAAK,cAAc,KAAK;AACxB,SAAK,OAAO,KAAK;AAEjB,SAAK,UAAU,KAAK,WAAW;AAC/B,SAAK,WAAW,KAAK,YAAY;AACjC,SAAK,YAAY,KAAK;AACtB,SAAK,SAAS,KAAK;AACnB,SAAK,WAAW,KAAK;AACrB,SAAK,WAAW,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,MAAc;AAEvB,WAAO,oCAAoC,KAAK,GAAG,IAAI,KAAK,EAAE,IAAI,KAAK,QAAQ;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,UAAmB;AAC5B,WAAO,KAAK,SAAS,SAAS;AAAA,EAChC;AACF;;;ADhDA,SAAS,kBAAkB;;;AET3B,SAAS,oBAAoB;;;ACGtB,IAAM,aAAN,MAAM,oBAAyB,IAAU;AAAA,EACvC;AAAA,EAEP,YAAY,QAAgB,UAAU;AACpC,UAAM;AACN,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKgB,IAAI,KAAQ,OAAgB;AAC1C,QAAI,KAAK,UAAU,EAAG,QAAO;AAE7B,QAAI,KAAK,QAAQ,KAAK,SAAS,CAAC,KAAK,IAAI,GAAG,GAAG;AAC7C,YAAM,YAAY,KAAK,KAAK,EAAE,KAAK,EAAE;AACrC,UAAI,cAAc,QAAW;AAC3B,aAAK,OAAO,SAAS;AAAA,MACvB;AAAA,IACF;AAEA,WAAO,MAAM,IAAI,KAAK,KAAK;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKO,KAAK,IAAoE;AAC9E,eAAW,CAAC,KAAK,GAAG,KAAK,MAAM;AAC7B,UAAI,GAAG,KAAK,KAAK,IAAI,EAAG,QAAO;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,OAAO,IAAuE;AACnF,UAAM,UAAU,IAAI,YAAiB;AACrC,eAAW,CAAC,KAAK,GAAG,KAAK,MAAM;AAC7B,UAAI,GAAG,KAAK,KAAK,IAAI,EAAG,SAAQ,IAAI,KAAK,GAAG;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,IAAO,IAAoD;AAChE,UAAM,UAAe,CAAC;AACtB,eAAW,CAAC,KAAK,GAAG,KAAK,MAAM;AAC7B,cAAQ,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,QAAuB;AAC5B,WAAO,KAAK,OAAO,EAAE,KAAK,EAAE;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKO,OAAsB;AAC3B,UAAM,MAAM,MAAM,KAAK,KAAK,OAAO,CAAC;AACpC,WAAO,IAAI,IAAI,SAAS,CAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKO,KAAK,IAA8D;AACxE,eAAW,CAAC,KAAK,GAAG,KAAK,MAAM;AAC7B,UAAI,GAAG,KAAK,KAAK,IAAI,EAAG,QAAO;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AACF;;;AD9DO,IAAe,YAAf,cAAuC,aAAa;AAAA,EACzC;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAiB;AAAA,EAEhB,WAAkC;AAAA,EAClC,eAAsC;AAAA,EAEpC,YAAY,QAAgB,UAA+B,CAAC,GAAG;AACvE,UAAM;AACN,SAAK,SAAS;AACd,SAAK,UAAU;AACf,SAAK,SAAS,QAAQ,WAAW,MAAM;AACvC,SAAK,YAAY,IAAI,WAAW;AAEhC,QAAI,QAAQ,MAAM;AAChB,WAAK,WAAW,WAAW,MAAM,KAAK,KAAK,MAAM,GAAG,QAAQ,IAAI;AAAA,IAClE;AACA,QAAI,QAAQ,MAAM;AAChB,WAAK,eAAe,WAAW,MAAM,KAAK,KAAK,MAAM,GAAG,QAAQ,IAAI;AAAA,IACtE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,cAAc,SAAY,MAAa;AAC5C,QAAI,KAAK,MAAO;AAChB,QAAI,CAAC,KAAK,OAAO,MAAM,GAAG,IAAI,EAAG;AAEjC,UAAM,MAAM,KAAK,QAAQ,MAAM,GAAG,IAAI;AACtC,QAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,WAAK,UAAU,IAAI,KAAK,IAAI;AAC5B,WAAK,KAAK,WAAW,MAAM,GAAG,IAAI;AAElC,UAAI,KAAK,cAAc;AACrB,qBAAa,KAAK,YAAY;AAC9B,aAAK,eAAe,WAAW,MAAM,KAAK,KAAK,MAAM,GAAG,KAAK,QAAQ,IAAI;AAAA,MAC3E;AAEA,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,cAAc,SAAY,MAAa;AAC5C,QAAI,KAAK,MAAO;AAChB,QAAI,CAAC,KAAK,QAAQ,QAAS;AAE3B,UAAM,MAAM,KAAK,QAAQ,MAAM,GAAG,IAAI;AACtC,QAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,WAAK,UAAU,OAAO,GAAG;AACzB,WAAK,KAAK,WAAW,MAAM,GAAG,IAAI;AAClC,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,KAAK,SAAiB,QAAQ;AACnC,QAAI,KAAK,MAAO;AAChB,SAAK,QAAQ;AAEb,QAAI,KAAK,SAAU,cAAa,KAAK,QAAQ;AAC7C,QAAI,KAAK,aAAc,cAAa,KAAK,YAAY;AAErD,SAAK,mBAAmB,SAAS;AACjC,SAAK,mBAAmB,SAAS;AAEjC,SAAK,KAAK,OAAO,KAAK,WAAW,MAAM;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKO,WAAW;AAChB,UAAM,SAAS,KAAK,UAAU;AAC9B,QAAI,OAAQ,MAAK,KAAK,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKO,YAA2B;AAChC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,QAAe,OAAO,aAAa,IAAmC;AACpE,UAAM,QAAkB,CAAC;AACzB,QAAI,UAA+B;AAEnC,UAAM,YAAY,CAAC,SAAY,SAAgB;AAC7C,YAAM,MAAM,KAAK,QAAQ,MAAM,GAAG,IAAI;AACtC,UAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,cAAM,KAAK,CAAC,KAAK,IAAI,CAAC;AAAA,MACxB;AACA,UAAI,SAAS;AACX,gBAAQ;AACR,kBAAU;AAAA,MACZ;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM;AAClB,UAAI,SAAS;AACX,gBAAQ;AACR,kBAAU;AAAA,MACZ;AAAA,IACF;AAEA,SAAK,GAAG,WAAW,SAAgB;AACnC,SAAK,GAAG,OAAO,KAAY;AAE3B,QAAI;AACF,aAAO,MAAM;AACX,YAAI,MAAM,SAAS,GAAG;AACpB,gBAAM,MAAM,MAAM;AAAA,QACpB,WAAW,KAAK,OAAO;AACrB;AAAA,QACF,OAAO;AACL,gBAAM,IAAI,QAAc,CAAC,QAAQ;AAC/B,sBAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,UAAE;AACA,WAAK,eAAe,WAAW,SAAgB;AAC/C,WAAK,eAAe,OAAO,KAAY;AAAA,IACzC;AAAA,EACF;AACF;;;AEvKA,YAAY,UAAU;AAEf,IAAM,kBAAN,MAAsB;AAAA,EAK3B,YACS,QACP,MACA;AAFO;AAGP,SAAK,UAAU,KAAK;AAEpB,SAAK,QAAQ,KAAK,OAAO,OAAO,MAAM,IAAI,KAAK,OAAO,KAAK,KAAK;AAChE,SAAK,QAAQ,IAAI,WAAW;AAE5B,QAAI,KAAK,OAAO;AACd,iBAAW,UAAU,KAAK,OAAO;AAC/B,cAAM,OAAO,KAAK,OAAO,MAAM,MAAM,IAAI,MAAM,KAAK,EAAE,IAAI,OAAO;AACjE,aAAK,MAAM,IAAI,QAAQ,IAAY;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAAA,EAnBO;AAAA,EACA;AAAA,EACA;AAAA,EAmBP,IAAW,QAAgB;AACzB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,MAAa,SAAwB;AACnC,QAAI,KAAK,mBAAmB,SAAS;AACnC,YAAM,UAAU,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,KAAK,MAAM;AACzE,YAAM,KAAK,QAAQ,eAAe,OAAO;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,CAAM,aAAQ,MAAM,IAAI;AACtB,UAAM,OAAO;AAAA,MACX,WAAW,KAAK,QAAQ;AAAA,MACxB,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,OAAO,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC;AAAA,IACrC;AACA,WAAO,mBAAwB,aAAQ,IAAI,CAAC;AAAA,EAC9C;AACF;;;ACtCO,IAAM,oBAAN,cAAgC,UAAmC;AAAA,EAKxE,YACS,SACP,UAAoC,CAAC,GACrC;AACA,UAAO,QAAgB,QAAQ,OAAO;AAH/B;AAIP,SAAK,YAAY,QAAQ;AAEzB,UAAM,qBAAqB,KAAK,mBAAmB,KAAK,IAAI;AAC5D,UAAM,qBAAqB,KAAK,qBAAqB,KAAK,IAAI;AAE9D,SAAK,OAAO,GAAG,gBAAgB,kBAAkB;AACjD,SAAK,OAAO,GAAG,kBAAkB,kBAAkB;AAEnD,SAAK,KAAK,OAAO,MAAM;AACrB,WAAK,OAAO,eAAe,gBAAgB,kBAAkB;AAC7D,WAAK,OAAO,eAAe,kBAAkB,kBAAkB;AAAA,IACjE,CAAC;AAAA,EACH;AAAA,EArBO;AAAA,EACA,QAAQ;AAAA,EACR,QAAQ,oBAAI,IAAY;AAAA,EAqBxB,QAAQ,UAA0C;AACvD,QAAI,SAAS,QAAQ,OAAO,KAAK,UAAW,QAAO;AACnD,WAAO,OAAO,SAAS,UAAU,WAAW,SAAS,QAAQ,SAAS,MAAM;AAAA,EAC9E;AAAA,EAEO,QAAQ,UAA0C;AACvD,QAAI,SAAS,QAAQ,OAAO,KAAK,UAAW,QAAO;AACnD,WAAO,OAAO,SAAS,UAAU,WAAW,SAAS,QAAQ,SAAS,MAAM;AAAA,EAC9E;AAAA,EAEQ,mBAAmB,SAAsD,SAAiB,QAAgB;AAChH,QAAI,QAAQ,OAAO,KAAK,UAAW;AAGnC,QAAI,WAAW,KAAK,UAAU,IAAI,OAAO;AAEzC,QAAI,CAAC,UAAU;AACb,iBAAW,IAAI,gBAAgB,KAAK,QAAe,EAAE,SAAS,SAAS,OAAO,CAAC,MAAM,EAAE,CAAC;AAAA,IAC1F,OAAO;AACL,YAAM,OAAO,KAAK,OAAO,MAAM,MAAM,IAAI,MAAM,KAAK,EAAE,IAAI,OAAO;AACjE,eAAS,MAAM,IAAI,QAAQ,IAAW;AAAA,IACxC;AAEA,UAAM,cAAc,QAAQ;AAE5B,QAAI,CAAC,KAAK,SAAS,KAAK,UAAU,IAAI,OAAO,GAAG;AAC9C,WAAK;AACL,WAAK,MAAM,IAAI,MAAM;AACrB,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,qBAAqB,SAAsD,SAAiB,QAAgB;AAClH,QAAI,QAAQ,OAAO,KAAK,UAAW;AAEnC,UAAM,WAAW,KAAK,UAAU,IAAI,OAAO;AAC3C,QAAI,UAAU;AACZ,eAAS,MAAM,OAAO,MAAM;AAC5B,UAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,cAAM,cAAc,QAAQ;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAAA,EAEgB,YAA2B;AACzC,UAAM,UAAU,KAAK;AACrB,QAAI,QAAQ,OAAO,KAAK,SAAS,QAAQ,IAAK,QAAO;AACrD,QAAI,QAAQ,YAAY,KAAK,MAAM,QAAQ,QAAQ,SAAU,QAAO;AACpE,WAAO;AAAA,EACT;AACF;;;AL7CO,IAAM,UAAN,cAAsB,KAAK;AAAA,EACzB,UAAyB;AAAA,EACzB;AAAA,EACA;AAAA,EACA,SAAgB,CAAC;AAAA,EACjB,cAA4B,CAAC;AAAA,EAC7B,WAAwB;AAAA,EACxB,YAAyB;AAAA,EACzB,QAAgB;AAAA,EAChB,eAAmC;AAAA,EACnC,aAAgC;AAAA,EAChC,WAAqB,CAAC;AAAA,EACtB,SAAkB;AAAA,EAClB,YAAsC,CAAC;AAAA,EACvC,UAAoB,CAAC;AAAA,EACrB,gBAA0B,CAAC;AAAA,EAElC,YAAY,QAAgB,MAAW;AACrC,UAAM,QAAQ,IAAI;AAElB,SAAK,WAAW,KAAK;AACrB,SAAK,YAAY,KAAK;AAEtB,UAAM,YAAY,WAAW,KAAK,EAAE;AACpC,QAAI,WAAW;AACb,WAAK,YAAY,IAAI,KAAK,SAAS;AAAA,IACrC;AAEA,QAAI,KAAK,aAAa;AACpB,WAAK,cAAc,KAAK,YAAY,IAAI,CAAC,aAAkB,IAAI,WAAW,KAAK,QAAQ,QAAQ,CAAC;AAAA,IAClG;AAEA,QAAI,KAAK,eAAe,OAAW,MAAK,aAAa,KAAK;AAC1D,QAAI,KAAK,aAAa,OAAW,MAAK,WAAW,KAAK;AACtD,QAAI,KAAK,YAAY,OAAW,MAAK,UAAU,KAAK;AACpD,QAAI,KAAK,kBAAkB,OAAW,MAAK,gBAAgB,KAAK;AAEhE,SAAK,OAAO,IAAI;AAAA,EAClB;AAAA,EAEA,MAAa,MAAM,kBAA6D;AAC9E,QAAI,UAAU,KAAK;AACnB,QAAI,CAAC,QAAS,WAAU,MAAM,KAAK,OAAO,SAAS,MAAM,KAAK,SAAS;AAEvE,UAAM,UACJ,OAAO,qBAAqB,WAAW,EAAE,SAAS,iBAAiB,IAAI,EAAE,GAAG,iBAAiB;AAE/F,UAAM,eAA8B,QAAQ,UAAU,CAAC,GAAG,QAAQ,OAAO,IAAI,CAAC;AAE9E,UAAM,kBAAkB,aAAa,KAAK,CAAC,UAAU,MAAM,OAAO,KAAK,EAAE;AACzE,QAAI,CAAC,iBAAiB;AACpB,mBAAa,KAAK;AAAA,QAChB,IAAI,KAAK;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,YAAQ,UAAU;AAElB,WAAO,QAAQ,SAAS,KAAK,OAAO;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,KAAK,kBAA0D;AAC1E,QAAI,UAAU,KAAK;AACnB,QAAI,CAAC,QAAS,WAAU,MAAM,KAAK,OAAO,SAAS,MAAM,KAAK,SAAS;AAEvE,WAAQ,MAAM,QAAQ,SAAS,KAAK,KAAK,IAAI,gBAAgB;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,SAAwB;AACnC,QAAI,UAAU,KAAK;AACnB,QAAI,CAAC,QAAS,WAAU,MAAM,KAAK,OAAO,SAAS,MAAM,KAAK,SAAS;AAEvE,UAAM,QAAQ,SAAS,OAAO,KAAK,EAAE;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,MAAqB;AAChC,QAAI,UAAU,KAAK;AACnB,QAAI,CAAC,QAAS,WAAU,MAAM,KAAK,OAAO,SAAS,MAAM,KAAK,SAAS;AAEvE,UAAM,QAAQ,SAAS,IAAI,KAAK,EAAE;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,QAAuB;AAClC,QAAI,UAAU,KAAK;AACnB,QAAI,CAAC,QAAS,WAAU,MAAM,KAAK,OAAO,SAAS,MAAM,KAAK,SAAS;AAEvE,UAAM,QAAQ,SAAS,MAAM,KAAK,EAAE;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,MAAM,UAAiC;AAClD,QAAI,UAAU,KAAK;AACnB,QAAI,CAAC,QAAS,WAAU,MAAM,KAAK,OAAO,SAAS,MAAM,KAAK,SAAS;AAEvE,UAAM,QAAQ,SAAS,MAAM,KAAK,IAAI,QAAQ;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAa,eAAe,UAAkB,QAAyB,WAAoC;AACzG,QAAI,UAAU,KAAK;AACnB,QAAI,CAAC,QAAS,WAAU,MAAM,KAAK,OAAO,SAAS,MAAM,KAAK,SAAS;AAEvE,UAAM,QAAQ,SAAS,eAAe,KAAK,IAAI,UAAU,QAAQ,SAAS;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,iBAAgC;AAC3C,QAAI,UAAU,KAAK;AACnB,QAAI,CAAC,QAAS,WAAU,MAAM,KAAK,OAAO,SAAS,MAAM,KAAK,SAAS;AAEvE,UAAM,QAAQ,SAAS,eAAe,KAAK,EAAE;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWO,wBAAwB,SAAuD;AACpF,WAAO,IAAI,kBAAkB,MAAM,OAAO;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaO,eAAe,SAAkF;AACtG,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,YAAM,YAAY,KAAK,wBAAwB,OAAO;AACtD,gBAAU,KAAK,OAAO,CAAC,cAAc,QAAQ,SAAS,CAAC;AAAA,IACzD,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,IAAW,UAAmC;AAC5C,WAAO,KAAK,OAAO,SAAS,MAAM,IAAI,KAAK,SAAS;AAAA,EACtD;AAAA;AAAA,EAGA,IAAW,SAA2B;AACpC,WAAO,KAAK,OAAO,MAAM,MAAM,IAAI,KAAK,QAAQ;AAAA,EAClD;AAAA;AAAA,EAGA,IAAW,SAA6B;AACtC,UAAM,UAAU,KAAK;AACrB,QAAI,WAAW,cAAc,SAAS;AACpC,YAAM,SAAS,KAAK,OAAO,QAAQ,MAAM,IAAK,QAAgB,QAAQ;AACtE,aAAO,QAAQ,QAAQ,MAAM,IAAI,KAAK,QAAQ;AAAA,IAChD;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAW,WAA+B;AACxC,UAAM,UAAU,KAAK;AACrB,QAAI,WAAW,cAAc,SAAS;AACpC,aAAQ,QAAgB;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAW,SAA6B;AACtC,UAAM,WAAW,KAAK;AACtB,QAAI,CAAC,SAAU,QAAO;AACtB,WAAO,KAAK,OAAO,QAAQ,MAAM,IAAI,QAAQ;AAAA,EAC/C;AAAA,EAEO,OAAO,MAAW;AACvB,QAAI,KAAK,YAAY,OAAW,MAAK,UAAU,KAAK;AACpD,QAAI,KAAK,WAAW,OAAW,MAAK,WAAW,IAAI,KAAK,KAAK,MAAM;AACnE,QAAI,KAAK,WAAW,OAAW,MAAK,SAAS,KAAK;AAClD,QAAI,KAAK,WAAW,OAAW,MAAK,SAAS,KAAK;AAClD,QAAI,KAAK,UAAU,OAAW,MAAK,QAAQ,KAAK;AAChD,QAAI,KAAK,cAAc,QAAW;AAChC,WAAK,YAAY,MAAM,QAAQ,KAAK,SAAS,IAAI,CAAC,IAAI,KAAK;AAAA,IAC7D;AAEA,QAAI,KAAK,iBAAiB,QAAW;AACnC,UAAI,KAAK,cAAc;AACrB,aAAK,eAAe;AAAA,UAClB,WAAW,KAAK,aAAa,aAAa,CAAC;AAAA,UAC3C,mBAAmB,KAAK,aAAa,sBAAsB;AAAA,QAC7D;AAAA,MACF,OAAO;AACL,aAAK,eAAe;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,CAAM,cAAQ,MAAM,EAAE,OAAe,SAA8BC,WAA8B;AAC/F,UAAM,EAAE,QAAQ,UAAU,WAAW,GAAG,MAAM,IAAI;AAElD,UAAM,OAAO;AAAA,MACX,GAAG;AAAA,MACH,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,IACf;AAEA,WAAO,GAAG,KAAK,YAAY,IAAI,IAAIA,UAAQ,MAAM,EAAE,GAAG,SAAS,OAAO,SAAS,QAAQ,MAAM,CAAC,CAAC;AAAA,EACjG;AACF;;;AMnSO,IAAK,mBAAL,kBAAKC,sBAAL;AACL,EAAAA,kBAAA,UAAO;AACP,EAAAA,kBAAA,UAAO;AACP,EAAAA,kBAAA,YAAS;AACT,EAAAA,kBAAA,cAAW;AACX,EAAAA,kBAAA,cAAW;AACX,EAAAA,kBAAA,aAAU;AACV,EAAAA,kBAAA,kBAAe;AAPL,SAAAA;AAAA,GAAA;AAUL,IAAK,eAAL,kBAAKC,kBAAL;AACL,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,UAAO;AACP,EAAAA,cAAA,WAAQ;AACR,EAAAA,cAAA,UAAO;AACP,EAAAA,cAAA,eAAY;AALF,SAAAA;AAAA,GAAA;AAsBL,IAAM,OAAN,cAAmB,KAAK;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEP,YAAY,QAAgB,MAAW;AACrC,UAAM,QAAQ,IAAI;AAClB,SAAK,MAAM;AACX,SAAK,aAAa;AAClB,SAAK,QAAQ;AACb,SAAK,OAAO,IAAI;AAAA,EAClB;AAAA,EAEO,OAAO,MAAW,OAAkB;AACzC,QAAI,KAAK,aAAa,OAAW,MAAK,WAAW,KAAK;AACtD,QAAI,KAAK,kBAAkB,OAAW,MAAK,gBAAgB,KAAK;AAChE,QAAI,KAAK,WAAW,OAAW,MAAK,SAAS,KAAK;AAClD,QAAI,KAAK,iBAAiB,OAAW,MAAK,eAAe,KAAK;AAE9D,QAAI,KAAK,iBAAiB,OAAW,MAAK,cAAc,KAAK;AAE7D,QAAI,KAAK,WAAW,OAAW,MAAK,SAAS,KAAK;AAClD,QAAI,KAAK,UAAU,OAAW,MAAK,QAAQ,KAAK;AAChD,QAAI,KAAK,eAAe,OAAW,MAAK,aAAa,KAAK,cAAc;AACxE,QAAI,KAAK,WAAW,OAAW,MAAK,SAAS,KAAK;AAElD,QAAI,KAAK,QAAQ,QAAW;AAC1B,WAAK,MAAM,KAAK,MAAM,EAAE,OAAO,KAAK,IAAI,MAAM,IAAI;AAAA,IACpD;AAEA,QAAI,KAAK,WAAW,QAAW;AAC7B,WAAK,SAAS,IAAI,WAAW,KAAK,QAAQ,KAAK,MAAM;AAAA,IACvD;AAGA,QAAI,SAAS,MAAM,QAAQ,KAAK,GAAG;AACjC,iBAAW,SAAS,OAAO;AACzB,YAAI,UAAU,SAAU,MAAK,SAAS;AACtC,YAAI,UAAU,gBAAgB,KAAK,OAAQ,MAAK,OAAO,OAAO;AAC9D,YAAI,UAAU,cAAe,MAAK,cAAc;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,MAAc;AACvB,WAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,aAAa;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAa,MAAM,QAAiB,OAAsB;AACxD,WAAQ,MAAM,KAAK,OAAO,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,EACtD;AACF;;;ACrGO,IAAM,aAAN,cAAyB,KAAK;AAAA,EACnC,YAAY,QAAgB,MAAW;AACrC,UAAM,QAAQ,IAAI;AAAA,EACpB;AACF;;;ATJO,IAAM,iBAAN,MAAqB;AAAA,EAS1B,YAAoB,QAAgB;AAAhB;AAAA,EAAiB;AAAA,EAR7B,KAAuB;AAAA,EACvB,eAAsC;AAAA,EACtC,QAAuB;AAAA,EAEvB,oBAA4B;AAAA,EACnB,mBAA2B;AAAA;AAAA,EACpC,qBAA8B;AAAA,EAItC,MAAa,QAAQ,OAA8B;AACjD,SAAK,QAAQ;AACb,SAAK,qBAAqB;AAC1B,SAAK,OAAO,KAAK,SAAS,gCAAgC;AAE1D,QAAI,KAAK,IAAI;AACX,WAAK,GAAG,mBAAmB;AAC3B,WAAK,KAAK;AAAA,IACZ;AAEA,UAAM,UAAU;AAChB,UAAM,MAAM,GAAG,OAAO,gCAAgC,KAAK,KAAK;AAEhE,SAAK,KAAK,IAAI,UAAU,GAAG;AAE3B,SAAK,GAAG,GAAG,QAAQ,MAAM;AACvB,WAAK,OAAO,KAAK,SAAS,yCAAyC;AACnE,WAAK,oBAAoB;AACzB,WAAK,cAAc;AAAA,IACrB,CAAC;AAED,SAAK,GAAG,GAAG,WAAW,CAAC,SAAS,KAAK,cAAc,IAAI,CAAC;AAExD,SAAK,GAAG,GAAG,SAAS,CAAC,MAAM,WAAW;AACpC,WAAK,OAAO,KAAK,SAAS,qBAAqB,IAAI,MAAM,OAAO,SAAS,CAAC,EAAE;AAC5E,UAAI,KAAK,aAAc,eAAc,KAAK,YAAY;AACtD,UAAI,CAAC,KAAK,oBAAoB;AAC5B,aAAK,UAAU;AAAA,MACjB;AAAA,IACF,CAAC;AAED,SAAK,GAAG,GAAG,SAAS,CAAC,UAAU;AAC7B,WAAK,OAAO,KAAK,SAAS,KAAK;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEQ,cAAc,SAA4B;AAChD,UAAM,UAAU,KAAK,MAAM,QAAQ,SAAS,CAAC;AAC7C,UAAM,YAAY,QAAQ;AAE1B,YAAQ,WAAW;AAAA,MACjB,KAAK;AACH,aAAK,OAAO,KAAK,SAAS,IAAI,MAAM,kBAAkB,QAAQ,SAAS,KAAK,UAAU,OAAO,CAAC,EAAE,CAAC;AACjG;AAAA,MAEF,KAAK;AACH,aAAK,OAAO,KAAK,SAAS,wCAAwC;AAClE;AAAA,MAEF,KAAK,SAAS;AACZ,YAAI,QAAQ,UAAU;AACpB,qBAAW,cAAc,QAAQ,UAAU;AACzC,iBAAK,OAAO,SAAS,KAAK,UAAU;AAAA,UACtC;AAAA,QACF;AAEA,YAAI,QAAQ,SAAS;AACnB,qBAAW,aAAa,QAAQ,SAAS;AACvC,iBAAK,OAAO,QAAQ,KAAK,SAAS;AAAA,UACpC;AAAA,QACF;AAEA,YAAI,QAAQ,OAAO;AACjB,qBAAW,WAAW,QAAQ,OAAO;AACnC,iBAAK,OAAO,MAAM,KAAK,OAAO;AAC9B,gBAAI,QAAQ,iBAAiB,UAAU,CAAC,KAAK,OAAO,MAAM;AACxD,mBAAK,OAAO,OAAO,IAAI,WAAW,KAAK,QAAQ,OAAO;AAAA,YACxD;AAAA,UACF;AAAA,QACF;AAEA,YAAI,QAAQ,QAAQ;AAClB,qBAAW,YAAY,QAAQ,QAAQ;AACrC,kBAAM,QAAQ,KAAK,OAAO,OAAO,KAAK,QAAQ;AAC9C,gBAAI,SAAS,UAAU,SAAS,OAAO,SAAS,UAAU;AACxD,oBAAM,SAAS,KAAK,OAAO,QAAQ,MAAM,IAAI,SAAS,OAAO,EAAE;AAC/D,kBAAI,QAAQ;AACV,uBAAO,OAAO,KAAK,KAAK;AAAA,cAC1B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,aAAK,OAAO,KAAK,SAAS,OAAO;AACjC;AAAA,MACF;AAAA,MAEA,KAAK,WAAW;AACd,YAAI,QAAQ,KAAM,MAAK,OAAO,MAAM,KAAK,QAAQ,IAAI;AAErD,cAAM,UAAU,KAAK,OAAO,SAAS,MAAM,IAAI,QAAQ,OAAO;AAC9D,YAAI;AAEJ,YAAI,SAAS;AACX,oBAAU,QAAQ,SAAS,KAAK,OAAO;AAEvC,cAAI,cAAc,SAAS;AACzB,kBAAM,WAAY,QAAwB;AAC1C,kBAAM,SAAS,KAAK,OAAO,QAAQ,MAAM,IAAI,QAAQ;AACrD,gBAAI,UAAU,QAAQ,UAAU,QAAQ,MAAM;AAC5C,qBAAO,QAAQ,KAAK,EAAE,GAAG,QAAQ,QAAQ,MAAM,QAAQ,KAAK,CAAC;AAAA,YAC/D;AAAA,UACF;AAAA,QACF,OAAO;AACL,oBAAU,IAAI,QAAQ,KAAK,QAAQ,OAAO;AAAA,QAC5C;AAEA,aAAK,OAAO,KAAK,iBAAiB,OAAO;AACzC;AAAA,MACF;AAAA,MAEA,KAAK,iBAAiB;AACpB,cAAM,UAAU,KAAK,OAAO,SAAS,MAAM,IAAI,QAAQ,OAAO;AAC9D,cAAM,WAAW,SAAS,SAAS,MAAM,IAAI,QAAQ,EAAE;AAEvD,YAAI,UAAU;AACZ,gBAAM,aAAa,SAAS,OAAO;AACnC,mBAAS,OAAO,QAAQ,IAAI;AAC5B,eAAK,OAAO,KAAK,iBAAiB,YAAY,QAAQ;AAAA,QACxD,OAAO;AACL,gBAAM,aAAa,IAAI,QAAQ,KAAK,QAAQ,EAAE,IAAI,QAAQ,IAAI,WAAW,QAAQ,SAAS,GAAG,QAAQ,KAAK,CAAC;AAC3G,eAAK,OAAO,KAAK,iBAAiB,MAAM,UAAU;AAAA,QACpD;AACA;AAAA,MACF;AAAA,MAEA,KAAK,iBAAiB;AACpB,cAAM,UAAU,KAAK,OAAO,SAAS,MAAM,IAAI,QAAQ,OAAO;AAC9D,cAAM,UAAU,SAAS,SAAS,MAAM,IAAI,QAAQ,EAAE;AAEtD,YAAI,WAAW,QAAQ,OAAO,QAAQ;AACpC,gBAAM,aAAa,QAAQ,OAAO;AAClC,kBAAQ,OAAO,KAAK,GAAG,QAAQ,OAAO,MAAM;AAC5C,eAAK,OAAO,KAAK,iBAAiB,YAAY,OAAO;AAAA,QACvD;AACA;AAAA,MACF;AAAA,MAEA,KAAK,iBAAiB;AACpB,cAAM,UAAU,KAAK,OAAO,SAAS,MAAM,IAAI,QAAQ,OAAO;AAE9D,YAAI;AAEJ,YAAI,SAAS;AACX,oBAAU,QAAQ,SAAS,MAAM,IAAI,QAAQ,EAAE;AAC/C,kBAAQ,SAAS,MAAM,OAAO,QAAQ,EAAE;AAAA,QAC1C;AAEA,YAAI,SAAS;AACX,eAAK,OAAO,KAAK,iBAAiB,OAAO;AAAA,QAC3C,OAAO;AACL,eAAK,OAAO,KAAK,iBAAiB,EAAE,IAAI,QAAQ,IAAI,WAAW,QAAQ,QAAQ,CAAC;AAAA,QAClF;AAEA;AAAA,MACF;AAAA,MAEA,KAAK,gBAAgB;AACnB,cAAM,UAAU,KAAK,OAAO,SAAS,MAAM,IAAI,QAAQ,UAAU;AACjE,cAAM,UAAU,SAAS,SAAS,MAAM,IAAI,QAAQ,EAAE;AAEtD,YAAI,SAAS;AACX,cAAI,CAAC,QAAQ,UAAW,SAAQ,YAAY,CAAC;AAC7C,cAAI,CAAC,QAAQ,UAAU,QAAQ,QAAQ,GAAG;AACxC,oBAAQ,UAAU,QAAQ,QAAQ,IAAI,CAAC;AAAA,UACzC;AACA,gBAAM,YAAY,QAAQ,UAAU,QAAQ,QAAQ;AACpD,cAAI,aAAa,CAAC,UAAU,SAAS,QAAQ,OAAO,GAAG;AACrD,sBAAU,KAAK,QAAQ,OAAO;AAAA,UAChC;AAAA,QACF;AAEA,aAAK,OAAO;AAAA,UACV;AAAA,UACA,WAAW,EAAE,IAAI,QAAQ,IAAI,WAAW,QAAQ,WAAW;AAAA,UAC3D,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AACA;AAAA,MACF;AAAA,MAEA,KAAK,kBAAkB;AACrB,cAAM,UAAU,KAAK,OAAO,SAAS,MAAM,IAAI,QAAQ,UAAU;AACjE,cAAM,UAAU,SAAS,SAAS,MAAM,IAAI,QAAQ,EAAE;AAEtD,YAAI,WAAW,QAAQ,aAAa,QAAQ,UAAU,QAAQ,QAAQ,GAAG;AACvE,gBAAM,YAAY,QAAQ,UAAU,QAAQ,QAAQ;AACpD,cAAI,WAAW;AACb,oBAAQ,UAAU,QAAQ,QAAQ,IAAI,UAAU,OAAO,CAAC,WAAW,WAAW,QAAQ,OAAO;AAE7F,gBAAI,QAAQ,UAAU,QAAQ,QAAQ,EAAG,WAAW,GAAG;AACrD,qBAAO,QAAQ,UAAU,QAAQ,QAAQ;AAAA,YAC3C;AAAA,UACF;AAAA,QACF;AAEA,aAAK,OAAO;AAAA,UACV;AAAA,UACA,WAAW,EAAE,IAAI,QAAQ,IAAI,WAAW,QAAQ,WAAW;AAAA,UAC3D,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AACA;AAAA,MACF;AAAA,MAEA,KAAK,yBAAyB;AAC5B,cAAM,UAAU,KAAK,OAAO,SAAS,MAAM,IAAI,QAAQ,UAAU;AACjE,cAAM,UAAU,SAAS,SAAS,MAAM,IAAI,QAAQ,EAAE;AAEtD,YAAI,WAAW,QAAQ,WAAW;AAChC,iBAAO,QAAQ,UAAU,QAAQ,QAAQ;AAAA,QAC3C;AAEA,aAAK,OAAO;AAAA,UACV;AAAA,UACA,WAAW,EAAE,IAAI,QAAQ,IAAI,WAAW,QAAQ,WAAW;AAAA,UAC3D,QAAQ;AAAA,QACV;AACA;AAAA,MACF;AAAA,MAEA,KAAK;AACH,aAAK,OAAO,KAAK,SAAS,4BAA4B;AACtD;AAAA,MAEF,KAAK,iBAAiB;AACpB,cAAM,UAAU,KAAK,OAAO,SAAS,KAAK,OAAO;AAEjD,aAAK,OAAO,KAAK,iBAAiB,OAAO;AACzC;AAAA,MACF;AAAA,MAEA,KAAK,iBAAiB;AACpB,cAAM,WAAW,KAAK,OAAO,SAAS,MAAM,IAAI,QAAQ,EAAE;AAE1D,YAAI,UAAU;AACZ,gBAAM,aAAa,SAAS,OAAO;AAEnC,cAAI,YAAY,UAAU;AACxB,YAAC,SAAiB,OAAO,QAAQ,MAAM,QAAQ,KAAK;AAAA,UACtD;AAEA,eAAK,OAAO,KAAK,iBAAiB,YAAY,QAAQ;AAAA,QACxD,OAAO;AACL,gBAAM,aAAa,KAAK,OAAO,SAAS,KAAK,EAAE,IAAI,QAAQ,IAAI,GAAG,QAAQ,KAAK,CAAC;AAChF,eAAK,OAAO,KAAK,iBAAiB,MAAM,UAAU;AAAA,QACpD;AACA;AAAA,MACF;AAAA,MAEA,KAAK,iBAAiB;AACpB,cAAM,UAAU,KAAK,OAAO,SAAS,MAAM,IAAI,QAAQ,EAAE;AACzD,YAAI,SAAS;AACX,eAAK,OAAO,SAAS,MAAM,OAAO,QAAQ,EAAE;AAC5C,eAAK,OAAO,KAAK,iBAAiB,OAAO;AAAA,QAC3C;AACA;AAAA,MACF;AAAA,MAEA,KAAK,gBAAgB;AACnB,cAAM,SAAS,KAAK,OAAO,QAAQ,KAAK,OAAO;AAC/C,aAAK,OAAO,KAAK,gBAAgB,MAAM;AACvC;AAAA,MACF;AAAA,MAEA,KAAK,gBAAgB;AACnB,cAAM,WAAW,KAAK,OAAO,QAAQ,MAAM,IAAI,QAAQ,EAAE;AAEzD,YAAI,UAAU;AACZ,gBAAM,YAAY,SAAS,OAAO;AAElC,mBAAS,OAAO,QAAQ,MAAM,QAAQ,KAAK;AAE3C,eAAK,OAAO,KAAK,gBAAgB,WAAW,QAAQ;AAAA,QACtD,OAAO;AACL,gBAAM,YAAY,KAAK,OAAO,QAAQ,KAAK,EAAE,IAAI,QAAQ,IAAI,GAAG,QAAQ,KAAK,CAAC;AAC9E,eAAK,OAAO,KAAK,gBAAgB,MAAM,SAAS;AAAA,QAClD;AACA;AAAA,MACF;AAAA,MAEA,KAAK,gBAAgB;AACnB,cAAM,SAAS,KAAK,OAAO,QAAQ,MAAM,IAAI,QAAQ,EAAE;AACvD,YAAI,QAAQ;AACV,eAAK,OAAO,QAAQ,MAAM,OAAO,QAAQ,EAAE;AAC3C,eAAK,OAAO,KAAK,gBAAgB,MAAM;AAAA,QACzC,OAAO;AACL,eAAK,OAAO,KAAK,gBAAgB,QAAQ,EAAE;AAAA,QAC7C;AACA;AAAA,MACF;AAAA,MAEA,KAAK,oBAAoB;AACvB,cAAM,SAAS,KAAK,OAAO,QAAQ,MAAM,IAAI,QAAQ,EAAE;AACvD,YAAI,QAAQ;AACV,gBAAM,SAAS,OAAO,QAAQ,KAAK,EAAE,MAAM,QAAQ,KAAK,CAAC;AACzD,eAAK,OAAO,KAAK,oBAAoB,MAAM;AAAA,QAC7C;AACA;AAAA,MACF;AAAA,MAEA,KAAK,qBAAqB;AACxB,cAAM,SAAS,KAAK,OAAO,QAAQ,MAAM,IAAI,QAAQ,EAAE;AACvD,YAAI,QAAQ;AACV,gBAAM,SAAS,OAAO,QAAQ,MAAM,IAAI,QAAQ,IAAI;AACpD,cAAI,QAAQ;AACV,mBAAO,QAAQ,MAAM,OAAO,QAAQ,IAAI;AACxC,iBAAK,OAAO,KAAK,qBAAqB,MAAM;AAAA,UAC9C;AAAA,QACF;AACA;AAAA,MACF;AAAA,MAEA,KAAK,eAAe;AAClB,cAAM,QAAQ,KAAK,OAAO,OAAO,KAAK,OAAO;AAC7C,YAAI,QAAQ,QAAQ,SAAS,UAAU;AACrC,gBAAM,SAAS,KAAK,OAAO,QAAQ,MAAM,IAAI,QAAQ,OAAO,EAAE;AAC9D,cAAI,QAAQ;AACV,mBAAO,OAAO,KAAK,KAAK;AAAA,UAC1B;AAAA,QACF;AACA;AAAA,MACF;AAAA,MAEA,KAAK,eAAe;AAClB,aAAK,OAAO,OAAO,MAAM,OAAO,QAAQ,EAAE;AAG1C,mBAAW,UAAU,KAAK,OAAO,QAAQ,MAAM,OAAO,GAAG;AACvD,gBAAM,QAAQ,OAAO,OAAO,MAAM,IAAI,QAAQ,EAAE;AAChD,cAAI,OAAO;AACT,mBAAO,OAAO,MAAM,OAAO,QAAQ,EAAE;AACrC;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAAA,MAEA,KAAK,cAAc;AACjB,cAAM,WAAW,KAAK,OAAO,MAAM,MAAM,IAAI,QAAQ,EAAE;AACvD,YAAI,UAAU;AACZ,gBAAM,UAAU,SAAS,OAAO;AAChC,mBAAS,OAAO,QAAQ,MAAM,QAAQ,KAAK;AAC3C,eAAK,OAAO,KAAK,cAAc,SAAS,QAAQ;AAAA,QAClD;AACA;AAAA,MACF;AAAA,MAEA;AACE,aAAK,OAAO,KAAK,OAAO,OAAO;AAAA,IACnC;AAAA,EACF;AAAA,EAEQ,gBAAgB;AACtB,QAAI,KAAK,aAAc,eAAc,KAAK,YAAY;AAEtD,SAAK,eAAe,YAAY,MAAM;AACpC,WAAK,OAAO,KAAK,SAAS,iBAAiB;AAC3C,WAAK,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,IAAI,EAAE,CAAC;AAAA,IAC9C,GAAG,GAAK;AAAA,EACV;AAAA,EAEQ,KAAK,SAAc;AACzB,QAAI,KAAK,IAAI,eAAe,UAAU,MAAM;AAC1C,WAAK,GAAG,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,YAAkB;AACxB,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,OAAO,KAAK,SAAS,IAAI,MAAM,uCAAuC,CAAC;AAC5E;AAAA,IACF;AAEA,QAAI,WAAW,KAAK,IAAI,GAAG,KAAK,iBAAiB,IAAI;AAErD,UAAM,SAAS,WAAW,MAAM,KAAK,OAAO;AAC5C,eAAW,KAAK,IAAI,WAAW,QAAQ,KAAK,gBAAgB;AAE5D,SAAK;AAEL,SAAK,OAAO;AAAA,MACV;AAAA,MACA,8BAA8B,KAAK,MAAM,WAAW,GAAI,CAAC,iBAAiB,KAAK,iBAAiB;AAAA,IAClG;AAEA,eAAW,MAAM;AACf,WAAK,KAAK,QAAQ,KAAK,KAAM;AAAA,IAC/B,GAAG,QAAQ;AAAA,EACb;AAAA,EAEO,aAAa;AAClB,SAAK,qBAAqB;AAC1B,QAAI,KAAK,aAAc,eAAc,KAAK,YAAY;AACtD,QAAI,KAAK,IAAI;AACX,WAAK,GAAG,MAAM,KAAM,gCAAgC;AACpD,WAAK,GAAG,mBAAmB;AAC3B,WAAK,KAAK;AAAA,IACZ;AACA,SAAK,OAAO,KAAK,SAAS,qCAAqC;AAAA,EACjE;AACF;;;AUlaA,SAAS,eAAe;AAGxB,IAAM,QAAQ,CAAC,OAAe,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAK9E,IAAM,cAAN,MAAkB;AAAA,EACT,YAAoB;AAAA,EACpB,UAAkB;AAAA,EAClB,QAAuB,QAAQ,QAAQ;AAChD;AAKO,IAAM,gBAAN,MAAM,uBAAsB,MAAM;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEP,YAAY,YAAoB,MAAW,QAAiB,MAAe;AACzE,QAAI,eAAe;AACnB,QAAI,OAAO;AACX,QAAI,WAAW;AAEf,QAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,UAAI,UAAU,QAAQ,cAAc,MAAM;AACxC,eAAO,OAAO,KAAK,QAAQ,IAAI;AAC/B,mBAAW,OAAO,KAAK,YAAY,QAAQ;AAC3C,uBAAe,SAAS,IAAI,eAAe,QAAQ;AAAA,MACrD,WAAW,aAAa,MAAM;AAC5B,uBAAe,OAAO,KAAK,OAAO;AAAA,MACpC,OAAO;AACL,YAAI;AACF,yBAAe,KAAK,UAAU,IAAI;AAAA,QACpC,QAAQ;AACN,yBAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF,WAAW,OAAO,SAAS,YAAY,KAAK,KAAK,MAAM,IAAI;AACzD,qBAAe;AAAA,IACjB;AAEA,UAAM,YAAY,UAAU,OAAO,OAAO,OAAO,YAAY,CAAC,IAAI,IAAI,KAAK;AAE3E,UAAM,GAAG,YAAY,GAAG,SAAS,EAAE;AAEnC,SAAK,OAAO,iBAAiB,UAAU;AACvC,SAAK,aAAa;AAClB,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,SAAS;AACd,SAAK,OAAO;AAEZ,WAAO,eAAe,MAAM,eAAc,SAAS;AAAA,EACrD;AACF;AAEO,IAAM,cAAN,MAAkB;AAAA,EAOvB,YAAoB,QAAgB;AAAhB;AAAA,EAAiB;AAAA,EAN7B,UAAU;AAAA,EAEV,QAAuB;AAAA,EAEvB,UAAU,oBAAI,IAAyB;AAAA,EAIxC,SAAS,OAAe;AAC7B,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,QAAgB,UAA0B;AAC5D,WAAO,GAAG,MAAM,IAAI,QAAQ;AAAA,EAC9B;AAAA,EAEO,YAAY,QAAgB,UAAkB,MAA0B;AAC7E,UAAM,WAAW,KAAK,YAAY,QAAQ,QAAQ;AAElD,QAAI,SAAS,KAAK,QAAQ,IAAI,QAAQ;AACtC,QAAI,CAAC,QAAQ;AACX,eAAS,IAAI,YAAY;AACzB,WAAK,QAAQ,IAAI,UAAU,MAAM;AAAA,IACnC;AAEA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,aAAQ,QAAQ,OAAQ,MAAM,KAAK,YAAY;AAC7C,YAAI;AACF,gBAAM,SAAS,MAAM,KAAK,QAAQ,QAAQ,UAAU,MAAM,MAAO;AACjE,kBAAQ,MAAM;AAAA,QAChB,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,QAAQ,QAAgB,UAAkB,MAAW,QAAmC;AACpG,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI,MAAM,0EAA0E;AAAA,IAC5F;AACA,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,QAAQ;AAEtC,QAAI,OAAO,aAAa,KAAK,KAAK,IAAI,IAAI,OAAO,SAAS;AACxD,YAAM,WAAW,OAAO,UAAU,KAAK,IAAI;AAC3C,WAAK,OAAO,KAAK,SAAS,WAAW,MAAM,IAAI,QAAQ,wBAAwB,QAAQ,mBAAmB;AAC1G,YAAM,MAAM,QAAQ;AAAA,IACtB;AAEA,UAAM,UAAU;AAAA,MACd;AAAA,MACA,SAAS;AAAA,QACP,eAAe,KAAK;AAAA,QACpB,gBAAgB;AAAA,MAClB;AAAA,MACA,GAAI,OAAO,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE,IAAI,CAAC;AAAA,IAC/C;AACA,UAAM,WAAW,MAAM,QAAQ,KAAK,OAAO;AAE3C,UAAM,kBAAkB,SAAS,QAAQ,uBAAuB;AAChE,UAAM,mBAAmB,SAAS,QAAQ,yBAAyB;AAEnE,QAAI,oBAAoB,UAAa,qBAAqB,QAAW;AACnE,aAAO,YAAY,OAAO,eAAe;AACzC,aAAO,UAAU,KAAK,IAAI,IAAI,OAAO,gBAAgB;AAAA,IACvD;AAGA,UAAM,WAAW,MAAM,SAAS,KAAK,KAAK;AAC1C,QAAI;AACJ,QAAI;AACF,aAAO,KAAK,MAAM,QAAQ;AAAA,IAC5B,QAAQ;AACN,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,eAAe,KAAK;AAC/B,YAAM,UACJ,OAAO,SAAS,YAAY,MAAM,cAAc,KAAK,cAAc,OAAO,gBAAgB,KAAK;AAEjG,WAAK,OAAO,KAAK,SAAS,eAAe,MAAM,IAAI,QAAQ,kBAAkB,OAAO,KAAK;AAEzF,aAAO,YAAY;AACnB,aAAO,UAAU,KAAK,IAAI,IAAI;AAE9B,YAAM,MAAM,OAAO;AAEnB,aAAO,KAAK,QAAQ,QAAQ,UAAU,MAAM,MAAM;AAAA,IACpD;AAEA,QAAI,SAAS,cAAc,KAAK;AAC9B,YAAM,IAAI,cAAc,SAAS,YAAY,MAAM,QAAQ,QAAQ;AAAA,IACrE;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,WAAW,UAAkB,YAA4C;AACpF,QAAI,CAAC,KAAK,MAAO,OAAM,IAAI,MAAM,qCAAqC;AAEtE,UAAM,MAAM;AAEZ,UAAM,WAAW,IAAI,SAAS;AAC9B,aAAS,OAAO,QAAQ,IAAI,KAAK,CAAC,UAAqC,CAAC,GAAG,QAAQ;AAEnF,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,KAAK;AAAA,MACtB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI;AACJ,YAAM,UAAU,MAAM,SAAS,KAAK;AACpC,UAAI;AACF,kBAAU,KAAK,MAAM,OAAO;AAAA,MAC9B,QAAQ;AACN,kBAAU;AAAA,MACZ;AACA,YAAM,IAAI,cAAc,SAAS,QAAQ,SAAS,QAAQ,cAAc;AAAA,IAC1E;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,IAAI,UAAkB;AAC3B,WAAO,KAAK,YAAY,OAAO,QAAQ;AAAA,EACzC;AAAA,EACO,KAAK,UAAkB,MAAY;AACxC,WAAO,KAAK,YAAY,QAAQ,UAAU,IAAI;AAAA,EAChD;AAAA,EACO,MAAM,UAAkB,MAAY;AACzC,WAAO,KAAK,YAAY,SAAS,UAAU,IAAI;AAAA,EACjD;AAAA,EACO,OAAO,UAAkB,MAAY;AAC1C,WAAO,KAAK,YAAY,UAAU,UAAU,IAAI;AAAA,EAClD;AAAA,EAEA,MAAM,IAAI,UAAkB,MAAY;AACtC,WAAO,KAAK,YAAY,OAAO,UAAU,IAAI;AAAA,EAC/C;AACF;;;ACpNA,YAAYC,WAAU;;;ACGf,IAAe,cAAf,MAAqC;AAAA,EACnC;AAAA,EACA;AAAA,EAEG,YAAY,QAAgB,QAAgB,UAAU;AAC9D,SAAK,SAAS;AACd,SAAK,QAAQ,IAAI,WAAqB,KAAK;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,KAAK,MAAkB;AACrB,UAAM,KAAK,KAAK,UAAU,IAAI;AAC9B,UAAM,WAAW,KAAK,MAAM,IAAI,EAAE;AAElC,QAAI,YAAY,OAAQ,SAAiB,WAAW,YAAY;AAC9D,MAAC,SAAiB,OAAO,IAAI;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,KAAK,UAAU,IAAI;AACrC,SAAK,MAAM,IAAI,IAAI,SAAS;AAE5B,WAAO;AAAA,EACT;AACF;;;AD3BO,IAAM,iBAAN,cAA6B,YAA6B;AAAA,EAC/D,YACE,QACO,SACP,QAAgB,UAChB;AACA,UAAM,QAAQ,KAAK;AAHZ;AAAA,EAIT;AAAA;AAAA;AAAA;AAAA,EAKU,UAAU,MAAmB;AACrC,WAAO,KAAK,OAAO,KAAK;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKU,UAAU,MAAoB;AACtC,WAAO,IAAI,QAAQ,KAAK,QAAQ,IAAI;AAAA,EACtC;AAAA,EAEA,MAAa,MAAM,IAA8B;AAC/C,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,aAAa,KAAK,QAAQ,EAAE,aAAa,EAAE,EAAE;AACrF,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAa,UAAU,UAA+B,CAAC,GAAyC;AAC9F,UAAM,SAAS,IAAI,gBAAgB;AAEnC,QAAI,QAAQ,UAAU,OAAW,QAAO,OAAO,SAAS,QAAQ,MAAM,SAAS,CAAC;AAChF,QAAI,QAAQ,WAAW,OAAW,QAAO,OAAO,UAAU,QAAQ,MAAM;AACxE,QAAI,QAAQ,UAAU,OAAW,QAAO,OAAO,SAAS,QAAQ,KAAK;AACrE,QAAI,QAAQ,SAAS,OAAW,QAAO,OAAO,QAAQ,QAAQ,IAAI;AAClE,QAAI,QAAQ,WAAW,OAAW,QAAO,OAAO,UAAU,QAAQ,MAAM;AACxE,QAAI,QAAQ,iBAAiB,OAAW,QAAO,OAAO,iBAAiB,QAAQ,aAAa,SAAS,CAAC;AAEtG,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,WAAW,aAAa,KAAK,QAAQ,EAAE,YAAY,cAAc,IAAI,WAAW,KAAK,EAAE;AAE7F,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,QAAQ;AAEhD,UAAM,cAAc,MAAM,QAAQ,IAAI,IAAI,OAAO,KAAK,YAAY,CAAC;AAEnE,QAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,OAAO;AACtC,iBAAW,YAAY,KAAK,OAAO;AACjC,aAAK,OAAO,MAAM,KAAK,QAAQ;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,UAAU,IAAI,WAA4B;AAEhD,eAAW,UAAU,aAAa;AAChC,YAAM,MAAM,KAAK,KAAK,MAAM;AAC5B,cAAQ,IAAI,IAAI,IAAI,GAAG;AAAA,IACzB;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,UAAU,SAAoC;AACnD,QAAI,OAAO,YAAY,SAAU,QAAO;AACxC,QAAI,mBAAmB,QAAS,QAAO,QAAQ;AAC/C,UAAM,IAAI,MAAM,qEAAqE;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,KAAK,kBAA6D;AAC7E,UAAM,UAAe,OAAO,qBAAqB,WAAW,EAAE,SAAS,iBAAiB,IAAI,EAAE,GAAG,iBAAiB;AAElH,QAAI,QAAQ,QAAQ;AAClB,cAAQ,SAAS,QAAQ,OAAO;AAAA,QAAI,CAAC,UACnC,OAAO,MAAM,WAAW,aAAa,MAAM,OAAO,IAAI;AAAA,MACxD;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,KAAK,aAAa,KAAK,QAAQ,EAAE,aAAa,OAAO;AAEzF,WAAO,IAAI,QAAQ,KAAK,QAAQ,IAAI;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,KAAK,SAA4B,kBAA6D;AACzG,UAAM,KAAK,KAAK,UAAU,OAAO;AACjC,UAAM,UACJ,OAAO,qBAAqB,WAAW,EAAE,SAAS,iBAAiB,IAAI,EAAE,GAAG,iBAAiB;AAE/F,QAAI,QAAQ,QAAQ;AAClB,cAAQ,SAAS,QAAQ,OAAO;AAAA,QAAI,CAAC,UACnC,OAAO,MAAM,WAAW,aAAa,MAAM,OAAO,IAAI;AAAA,MACxD;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,MAAM,aAAa,KAAK,QAAQ,EAAE,aAAa,EAAE,IAAI,OAAO;AAChG,UAAM,WAAW,KAAK,MAAM,IAAI,EAAE;AAClC,QAAI,UAAU;AACZ,eAAS,OAAO,IAAI;AACpB,aAAO;AAAA,IACT;AAEA,WAAO,IAAI,QAAQ,KAAK,QAAQ,IAAI;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,OAAO,SAA2C;AAC7D,UAAM,KAAK,KAAK,UAAU,OAAO;AACjC,UAAM,KAAK,OAAO,KAAK,OAAO,aAAa,KAAK,QAAQ,EAAE,aAAa,EAAE,EAAE;AAC3E,SAAK,MAAM,OAAO,EAAE;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,IAAI,SAA2C;AAC1D,UAAM,KAAK,KAAK,UAAU,OAAO;AACjC,UAAM,KAAK,OAAO,KAAK,KAAK,aAAa,KAAK,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;AAEjF,UAAM,WAAW,KAAK,MAAM,IAAI,EAAE;AAClC,QAAI,SAAU,UAAS,SAAS;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,MAAM,SAA2C;AAC5D,UAAM,KAAK,KAAK,UAAU,OAAO;AACjC,UAAM,KAAK,OAAO,KAAK,OAAO,aAAa,KAAK,QAAQ,EAAE,aAAa,EAAE,MAAM;AAE/E,UAAM,WAAW,KAAK,MAAM,IAAI,EAAE;AAClC,QAAI,SAAU,UAAS,SAAS;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAa,MAAM,SAA4B,UAAiC;AAC9E,UAAM,KAAK,KAAK,UAAU,OAAO;AACjC,UAAM,KAAK,OAAO,KAAK,IAAI,aAAa,KAAK,QAAQ,EAAE,aAAa,EAAE,cAAc,mBAAmB,QAAQ,CAAC,EAAE;AAAA,EACpH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAa,eACX,SACA,UACA,QACA,WACe;AACf,UAAM,KAAK,KAAK,UAAU,OAAO;AACjC,UAAM,aAAa,SAAS,KAAK,OAAO,MAAM,UAAU,MAAM,IAAI;AAElE,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,WAAY,QAAO,OAAO,WAAW,UAAU;AACnD,QAAI,UAAW,QAAO,OAAO,cAAc,MAAM;AAEjD,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,WAAW,aAAa,KAAK,QAAQ,EAAE,aAAa,EAAE,cAAc,mBAAmB,QAAQ,CAAC,GAAG,cAAc,IAAI,WAAW,KAAK,EAAE;AAE7I,UAAM,KAAK,OAAO,KAAK,OAAO,QAAQ;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,eAAe,SAA2C;AACrE,UAAM,KAAK,KAAK,UAAU,OAAO;AACjC,UAAM,KAAK,OAAO,KAAK,OAAO,aAAa,KAAK,QAAQ,EAAE,aAAa,EAAE,YAAY;AAAA,EACvF;AAAA,EAEA,CAAM,cAAQ,MAAM,IAAI;AACtB,WAAO,KAAK;AAAA,EACd;AACF;;;AElOO,IAAM,mBAAN,cAA+B,UAA2B;AAAA,EAK/D,YACS,SACP,UAAmC,CAAC,GACpC;AACA,UAAO,QAAgB,QAAQ,OAAO;AAH/B;AAIP,SAAK,YAAY,QAAQ;AAEzB,UAAM,qBAAqB,KAAK,cAAc,KAAK,IAAI;AACvD,UAAM,qBAAqB,KAAK,cAAc,KAAK,IAAI;AAEvD,SAAK,OAAO,GAAG,iBAAiB,kBAAkB;AAClD,SAAK,OAAO,GAAG,iBAAiB,kBAAkB;AAElD,SAAK,KAAK,OAAO,MAAM;AACrB,WAAK,OAAO,eAAe,iBAAiB,kBAAkB;AAC9D,WAAK,OAAO,eAAe,iBAAiB,kBAAkB;AAAA,IAChE,CAAC;AAAA,EACH;AAAA,EArBO;AAAA,EACA,QAAQ;AAAA,EACR,YAAY;AAAA,EAqBH,QAAQ,SAAiC;AACvD,QAAI,QAAQ,cAAc,KAAK,UAAW,QAAO;AACjD,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEgB,QAAQ,SAAqE;AAC3F,QAAI,QAAQ,cAAc,KAAK,UAAW,QAAO;AACjD,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEgB,cAAc,SAAkB;AAC9C,QAAI,QAAQ,cAAc,KAAK,UAAW;AAC1C,SAAK;AACL,UAAM,cAAc,OAAO;AAC3B,QAAI,CAAC,KAAK,SAAS,KAAK,UAAU,IAAI,QAAQ,EAAE,GAAG;AACjD,WAAK;AACL,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA,EAEgB,YAA2B;AACzC,UAAM,UAAU,KAAK;AACrB,QAAI,QAAQ,OAAO,KAAK,SAAS,QAAQ,IAAK,QAAO;AACrD,QAAI,QAAQ,gBAAgB,KAAK,aAAa,QAAQ,aAAc,QAAO;AAC3E,WAAO;AAAA,EACT;AACF;;;ACxDO,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,UAAO;AACP,EAAAA,aAAA,QAAK;AACL,EAAAA,aAAA,WAAQ;AAHE,SAAAA;AAAA,GAAA;AAgBL,IAAe,cAAf,cAAmC,KAAK;AAAA,EACtC;AAAA,EACA;AAAA,EAEG,YAAY,QAAgB,MAAW;AAC/C,UAAM,QAAQ,IAAI;AAClB,SAAK,OAAO,KAAK;AAEjB,SAAK,WAAW,IAAI,eAAe,KAAK,QAAQ,IAAI;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,KAAK,kBAA6D;AAC7E,WAAO,KAAK,SAAS,KAAK,gBAAgB;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAa,MAAM,QAAiB,OAA6B;AAC/D,WAAO,MAAM,KAAK,OAAO,SAAS,MAAM,KAAK,IAAI,KAAK;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,MAAa,cAAc,SAAqE;AAC9F,WAAO,KAAK,SAAS,UAAU,OAAO;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAa,KAAK,SAAmD;AACnE,WAAO,MAAM,KAAK,OAAO,SAAS,KAAK,KAAK,IAAI,OAAO;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,SAAwB;AACnC,UAAM,KAAK,OAAO,SAAS,OAAO,KAAK,EAAE;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAa,WAAW,UAA8C;AACpE,UAAM,KAAK,OAAO,SAAS,WAAW,KAAK,IAAI,QAAQ;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWO,uBAAuB,SAAqD;AACjF,WAAO,IAAI,iBAAiB,MAAM,OAAO;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaO,cAAc,UAAmC,CAAC,GAAyC;AAChG,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,YAAY,KAAK,uBAAuB,OAAO;AAErD,gBAAU,KAAK,OAAO,CAAC,WAAW,WAAW;AAC3C,YAAI,QAAQ,OAAO,WAAW,WAAW,WAAW,QAAQ;AAC1D,iBAAO,OAAO,IAAI,MAAM,gCAAgC,MAAM,EAAE,CAAC;AAAA,QACnE;AAEA,gBAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEO,SAA8B;AACnC,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEO,OAA0B;AAC/B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEO,UAAgC;AACrC,WAAO,KAAK,SAAS;AAAA,EACvB;AACF;;;ACvKO,IAAM,cAAN,cAA0B,YAAY;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEP,YAAY,QAAgB,MAAW;AACrC,UAAM,QAAQ,IAAI;AAClB,SAAK,WAAW,KAAK;AACrB,SAAK,qBAAqB,KAAK;AAC/B,SAAK,cAAc,KAAK;AACxB,SAAK,OAAO,KAAK;AACjB,SAAK,gBAAgB,KAAK;AAC1B,SAAK,OAAO,KAAK,QAAQ;AACzB,SAAK,WAAW,KAAK,YAAY;AACjC,SAAK,QAAQ,KAAK;AAClB,SAAK,OAAO,IAAI;AAAA,EAClB;AAAA,EAEO,OAAO,MAAW,OAAkB;AACzC,QAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAC9C,QAAI,KAAK,gBAAgB,OAAW,MAAK,cAAc,KAAK;AAE5D,QAAI,SAAS,MAAM,QAAQ,KAAK,GAAG;AACjC,iBAAW,SAAS,OAAO;AACzB,gBAAQ,OAAO;AAAA,UACb,KAAK;AACH,iBAAK,cAAc;AACnB;AAAA,UACF,KAAK;AACH,iBAAK,OAAO;AACZ;AAAA,UACF,KAAK;AACH,iBAAK,qBAAqB,KAAK;AAC/B;AAAA,UACF,KAAK;AACH,iBAAK,QAAQ,KAAK;AAClB;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAa,mBAAmB,QAAgB,SAAsD;AACpG,WAAQ,MAAM,KAAK,OAAO,SAAS,mBAAmB,KAAK,IAAI,QAAQ,OAAO;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAa,sBAAsB,aAAkD;AACnF,WAAQ,MAAM,KAAK,OAAO,SAAS,sBAAsB,KAAK,IAAI,WAAW;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAa,YAAY,UAAwC;AAC/D,UAAM,WAAW,KAAK;AACtB,UAAM,SAAS,MAAM,KAAK,OAAO,QAAQ,MAAM,QAAQ;AAEvD,UAAM,aAAa,OAAO,WAAW,IAAI,CAAC,OAAO;AAAA,MAC/C,IAAI,EAAE;AAAA,MACN,OAAO,EAAE;AAAA,MACT,UAAU,CAAC,GAAG,EAAE,QAAQ;AAAA,IAC1B,EAAE;AAEF,eAAW,OAAO,YAAY;AAC5B,UAAI,WAAW,IAAI,SAAS,OAAO,CAAC,OAAO,OAAO,KAAK,EAAE;AAAA,IAC3D;AAEA,QAAI,aAAa,WAAW;AAC1B,YAAM,iBAAiB,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AAC/D,UAAI,CAAC,gBAAgB;AACnB,cAAM,IAAI,MAAM,YAAY,QAAQ,uBAAuB;AAAA,MAC7D;AACA,qBAAe,SAAS,KAAK,KAAK,EAAE;AAAA,IACtC;AAEA,UAAM,KAAK,OAAO,QAAQ,KAAK,UAAU,EAAE,WAAW,CAAC;AAEvD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAa,YAAY,UAAwC;AAC/D,UAAM,WAAW,KAAK;AACtB,UAAM,SAAS,MAAM,KAAK,OAAO,QAAQ,MAAM,QAAQ;AAEvD,UAAM,aAAa,OAAO,WAAW,IAAI,CAAC,OAAO;AAAA,MAC/C,IAAI,EAAE;AAAA,MACN,OAAO,EAAE;AAAA,MACT,UAAU,CAAC,GAAG,EAAE,QAAQ;AAAA,IAC1B,EAAE;AAEF,UAAM,kBAAkB,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS,KAAK,EAAE,CAAC;AAE3E,QAAI,CAAC,iBAAiB;AACpB,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAEA,oBAAgB,WAAW,gBAAgB,SAAS,OAAO,CAAC,OAAO,OAAO,KAAK,EAAE;AAEjF,UAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,gBAAgB,SAAS,MAAM,CAAC;AACpF,oBAAgB,SAAS,OAAO,cAAc,GAAG,KAAK,EAAE;AAExD,UAAM,KAAK,OAAO,QAAQ,KAAK,UAAU,EAAE,WAAW,CAAC;AAEvD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAa,eAAe,aAAkD;AAC5E,UAAM,KAAK,KAAK,EAAE,YAAY,CAAC;AAC/B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,QAAQ,MAAoC;AACvD,UAAM,KAAK,KAAK,EAAE,KAAK,CAAC;AACxB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAa,QAAQ,MAAqC;AACxD,UAAM,KAAK,KAAK,EAAE,KAAK,CAAC;AACxB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAa,YAAY,UAAwC;AAC/D,UAAM,KAAK,KAAK,EAAE,SAAS,CAAC;AAC5B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAa,QAAQ,IAAyC;AAC5D,UAAM,KAAK,KAAK,EAAE,MAAM,GAAG,CAAC;AAC5B,WAAO;AAAA,EACT;AACF;;;ACjOO,IAAM,iBAAN,cAA6B,YAAY;AAAA,EAC9C,YAAY,QAAgB,MAAW;AACrC,UAAM,QAAQ,IAAI;AAAA,EACpB;AACF;;;ACRO,IAAM,YAAN,cAAwB,YAAY;AAAA,EAClC,SAAkB;AAAA,EAClB,aAAuB,CAAC;AAAA,EACxB,gBAA+B;AAAA,EAEtC,YAAY,QAAa,MAAW;AAClC,UAAM,QAAQ,IAAI;AAAA,EACpB;AAAA,EAEO,OAAO,MAAW;AACvB,QAAI,KAAK,WAAW,OAAW,MAAK,SAAS,KAAK;AAClD,QAAI,KAAK,eAAe,OAAW,MAAK,aAAa,KAAK;AAC1D,QAAI,KAAK,oBAAoB,OAAW,MAAK,gBAAgB,KAAK;AAAA,EACpE;AACF;;;ACZA,YAAYC,WAAU;AAGf,IAAM,eAAN,cAA2B,YAAY;AAAA,EACrC;AAAA,EACA;AAAA,EACA,aAAuB,CAAC;AAAA,EACxB,cAA8B;AAAA,EAC9B,OAA0B;AAAA,EAC1B,gBAAgC;AAAA,EAChC,OAAgB;AAAA,EAEvB,YAAY,QAAgB,MAAW;AACrC,UAAM,QAAQ,IAAI;AAClB,SAAK,OAAO,IAAI;AAAA,EAClB;AAAA,EAEO,OAAO,MAAW,OAAkB;AACzC,QAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAC9C,QAAI,KAAK,UAAU,OAAW,MAAK,UAAU,KAAK;AAClD,QAAI,KAAK,eAAe,OAAW,MAAK,aAAa,KAAK;AAC1D,QAAI,KAAK,gBAAgB,OAAW,MAAK,cAAc,KAAK;AAC5D,QAAI,KAAK,oBAAoB,OAAW,MAAK,gBAAgB,KAAK;AAClE,QAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAE9C,QAAI,KAAK,SAAS,QAAW;AAC3B,WAAK,OAAO,KAAK,OAAO,IAAI,WAAW,KAAK,QAAQ,KAAK,IAAI,IAAI;AAAA,IACnE;AAEA,QAAI,SAAS,MAAM,QAAQ,KAAK,GAAG;AACjC,iBAAW,SAAS,OAAO;AACzB,gBAAQ,OAAO;AAAA,UACb,KAAK;AACH,iBAAK,OAAO;AACZ;AAAA,UACF,KAAK;AACH,iBAAK,cAAc;AACnB;AAAA,UACF,KAAK;AACH,iBAAK,OAAO;AACZ;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,IAAW,QAA0B;AACnC,WAAO,KAAK,OAAO,MAAM,MAAM,IAAI,KAAK,OAAO;AAAA,EACjD;AAAA;AAAA,EAGA,IAAW,iBAAyB;AAClC,WAAO,KAAK,WACT,IAAI,CAAC,OAAO,KAAK,OAAO,MAAM,MAAM,IAAI,EAAE,CAAC,EAC3C,OAAO,CAAC,SAAuB,SAAS,MAAS;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAa,sBAAsB,aAAkD;AACnF,WAAQ,MAAM,KAAK,OAAO,SAAS,sBAAsB,KAAK,IAAI,WAAW;AAAA,EAC/E;AAAA,EAEA,CAAM,cAAQ,MAAM,EAAE,QAAgB,SAA8BC,WAA8B;AAChG,UAAM,EAAE,QAAQ,GAAG,MAAM,IAAI;AAC7B,WAAO,GAAG,KAAK,YAAY,IAAI,IAAIA;AAAA,MACjC;AAAA,QACE,GAAG;AAAA,QACH,OAAO,KAAK;AAAA,QACZ,gBAAgB,KAAK;AAAA,MACvB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AChFO,SAAS,cAAc,QAAgB,MAAwB;AACpE,UAAQ,KAAK,cAAc;AAAA,IACzB;AACE,aAAO,IAAI,YAAY,QAAQ,IAAI;AAAA,IACrC;AACE,aAAO,IAAI,UAAU,QAAQ,IAAI;AAAA,IACnC;AACE,aAAO,IAAI,aAAa,QAAQ,IAAI;AAAA,IACtC;AACE,aAAO,KAAK,SAAS,kCAAkC,KAAK,IAAI,EAAE;AAClE,aAAO,IAAI,eAAe,QAAQ,IAAI;AAAA,EAC1C;AACF;;;ACnBO,IAAM,kBAAkB;AAAA;AAAA,EAE7B,eAAe,MAAM;AAAA,EACrB,cAAc,MAAM;AAAA,EACpB,mBAAmB,MAAM;AAAA,EACzB,YAAY,MAAM;AAAA,EAClB,qBAAqB,MAAM;AAAA;AAAA,EAG3B,aAAa,MAAM;AAAA,EACnB,YAAY,MAAM;AAAA,EAClB,gBAAgB,MAAM;AAAA,EACtB,aAAa,MAAM;AAAA,EACnB,gBAAgB,MAAM;AAAA,EACtB,iBAAiB,MAAM;AAAA,EACvB,cAAc,MAAM;AAAA,EACpB,eAAe,MAAM;AAAA;AAAA,EAGrB,aAAa,MAAM;AAAA,EACnB,oBAAoB,MAAM;AAAA,EAC1B,aAAa,MAAM;AAAA,EACnB,gBAAgB,MAAM;AAAA,EACtB,gBAAgB,MAAM;AAAA,EACtB,cAAc,MAAM;AAAA,EACpB,YAAY,MAAM;AAAA,EAClB,aAAa,MAAM;AAAA,EACnB,YAAY,MAAM;AAAA,EAClB,OAAO,MAAM;AAAA,EACb,gBAAgB,MAAM;AAAA;AAAA,EAGtB,SAAS,MAAM;AAAA,EACf,OAAO,MAAM;AAAA,EACb,OAAO,MAAM;AAAA,EACb,aAAa,MAAM;AAAA,EACnB,eAAe,MAAM;AAAA,EACrB,aAAa,MAAM;AAAA,EACnB,QAAQ,MAAM;AAAA;AAAA,EAGd,iBAAiB,MAAM;AAAA,EACvB,cAAc,MAAM;AAAA;AAAA,EAGpB,cAAc;AAChB;AAKO,IAAM,cAAN,MAAkB;AAAA;AAAA;AAAA;AAAA,EAIvB,OAAc,QAAQ,YAA0C;AAC9D,QAAI,OAAO,eAAe,SAAU,QAAO;AAE3C,QAAI,OAAO,eAAe,UAAU;AAClC,aAAO,gBAAgB,UAAU,KAAK;AAAA,IACxC;AAEA,QAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,aAAO,WAAW,OAAe,CAAC,KAAK,MAAM,MAAM,KAAK,QAAQ,CAAC,GAAG,EAAE;AAAA,IACxE;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,IAAI,kBAA0B,mBAAkD;AAC5F,UAAM,gBAAgB,KAAK,QAAQ,iBAAiB;AACpD,YAAQ,mBAAmB,mBAAmB;AAAA,EAChD;AACF;;;AChDO,IAAM,iBAAN,cAA6B,YAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnE,YAAY,QAAgB,QAAgB,UAAU;AACpD,UAAM,QAAQ,KAAK;AAAA,EACrB;AAAA,EAEU,UAAU,MAAmB;AACrC,WAAO,KAAK,OAAO,KAAK;AAAA,EAC1B;AAAA,EAEU,UAAU,MAAwB;AAC1C,WAAO,cAAc,KAAK,QAAQ,IAAI;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,QAAQ,SAAqD;AAClE,QAAI,mBAAmB,YAAa,QAAO;AAE3C,QAAI,OAAO,YAAY,UAAU;AAC/B,YAAM,KAAK,QAAQ,QAAQ,UAAU,EAAE;AACvC,aAAO,KAAK,MAAM,IAAI,EAAE;AAAA,IAC1B;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,YAAY,SAAqD;AACtE,UAAM,WAAW,KAAK,QAAQ,OAAO;AACrC,WAAO,UAAU,OAAO,IAAI,WAAW;AAAA,EACzC;AAAA,EAEO,UAAU,SAAmD;AAClE,UAAM,WAAW,KAAK,QAAQ,OAAO;AACrC,WAAO,UAAU,KAAK,IAAI,WAAW;AAAA,EACvC;AAAA,EAEO,aAAa,SAAsD;AACxE,UAAM,WAAW,KAAK,QAAQ,OAAO;AACrC,WAAO,UAAU,QAAQ,IAAI,WAAW;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,UAAU,SAAoC;AACnD,QAAI,mBAAmB,aAAa;AAClC,aAAO,QAAQ;AAAA,IACjB;AAEA,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO,QAAQ,QAAQ,UAAU,EAAE;AAAA,IACrC;AAEA,UAAM,IAAI,UAAU,2FAA2F;AAAA,EACjH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAa,MAAM,SAA4B,QAAiB,OAA6B;AAC3F,QAAI,CAAC,OAAO;AACV,YAAM,SAAS,KAAK,QAAQ,OAAO;AACnC,UAAI,OAAQ,QAAO;AAAA,IACrB;AAEA,UAAM,KAAK,KAAK,UAAU,OAAO;AACjC,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,aAAa,EAAE,EAAE;AAEzD,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAa,KAAK,SAA4B,SAAmD;AAC/F,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAM,IAAI,UAAU,4CAA4C;AAAA,IAClE;AAEA,UAAM,UAAe,CAAC;AACtB,UAAM,SAAmB,CAAC;AAE1B,QAAI,QAAQ,SAAS,OAAW,SAAQ,OAAO,QAAQ;AACvD,QAAI,QAAQ,UAAU,OAAW,SAAQ,QAAQ,QAAQ;AACzD,QAAI,QAAQ,SAAS,OAAW,SAAQ,OAAO,QAAQ;AACvD,QAAI,QAAQ,aAAa,OAAW,SAAQ,WAAW,QAAQ;AAC/D,QAAI,QAAQ,UAAU,OAAW,SAAQ,QAAQ,QAAQ;AACzD,QAAI,QAAQ,aAAa,OAAW,SAAQ,WAAW,QAAQ;AAE/D,QAAI,QAAQ,gBAAgB,QAAW;AACrC,UAAI,QAAQ,gBAAgB,KAAM,QAAO,KAAK,aAAa;AAAA,UACtD,SAAQ,cAAc,QAAQ;AAAA,IACrC;AAEA,QAAI,QAAQ,SAAS,QAAW;AAC9B,UAAI,QAAQ,SAAS,KAAM,QAAO,KAAK,MAAM;AAAA,UACxC,SAAQ,OAAO,QAAQ;AAAA,IAC9B;AAEA,QAAI,OAAO,SAAS,EAAG,SAAQ,SAAS;AACxC,QAAI,OAAO,KAAK,OAAO,EAAE,WAAW,EAAG,QAAO,KAAK,MAAM,OAAO;AAEhE,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,MAAM,aAAa,KAAK,UAAU,OAAO,CAAC,IAAI,OAAO;AACzF,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAa,mBACX,SACA,QACA,SACsB;AACtB,UAAM,WAAW,KAAK,QAAQ,OAAO;AACrC,QAAI,YAAY,CAAC,SAAS,OAAO,GAAG;AAClC,YAAM,IAAI,UAAU,sDAAsD;AAAA,IAC5E;AAEA,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAM,IAAI,UAAU,sDAAsD;AAAA,IAC5E;AAEA,UAAM,KAAK,KAAK,UAAU,OAAO;AACjC,UAAM,cAAc,QAAQ,UAAU,SAAY,YAAY,QAAQ,QAAQ,KAAK,IAAI;AACvF,UAAM,aAAa,QAAQ,SAAS,SAAY,YAAY,QAAQ,QAAQ,IAAI,IAAI;AAEpF,UAAM,UAAU;AAAA,MACd,aAAa;AAAA,QACX,OAAO,OAAO,WAAW;AAAA,QACzB,MAAM,OAAO,UAAU;AAAA,MACzB;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,aAAa,EAAE,gBAAgB,MAAM,IAAI,OAAO;AACxF,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAa,sBACX,SACA,aACsB;AACtB,UAAM,WAAW,KAAK,QAAQ,OAAO;AACrC,QAAI,YAAY,SAAS,KAAK,GAAG;AAC/B,YAAM,IAAI,UAAU,+DAA+D;AAAA,IACrF;AAEA,UAAM,KAAK,KAAK,UAAU,OAAO;AACjC,UAAM,aAAa,YAAY,QAAQ,WAAW;AAElD,UAAM,UAAU;AAAA,MACd,aAAa,OAAO,UAAU;AAAA,IAChC;AAEA,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,aAAa,EAAE,wBAAwB,OAAO;AACtF,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,OAAO,SAA2C;AAC7D,UAAM,KAAK,KAAK,UAAU,OAAO;AACjC,UAAM,KAAK,OAAO,KAAK,OAAO,aAAa,EAAE,EAAE;AAC/C,SAAK,MAAM,OAAO,EAAE;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,IAAI,IAAY,WAAkC;AAC7D,UAAM,KAAK,OAAO,KAAK,KAAK,aAAa,EAAE,SAAS,SAAS,EAAE;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,MAAM,IAAY,WAAkC;AAC/D,UAAM,KAAK,OAAO,KAAK,OAAO,aAAa,EAAE,SAAS,SAAS,EAAE;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,WAAW,IAAY,UAA8C;AAChF,QAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW,KAAK,SAAS,SAAS,KAAK;AAC9E,YAAM,IAAI,UAAU,6DAA6D;AAAA,IACnF;AAEA,UAAM,aAAa,SAAS,IAAI,CAAC,QAAQ;AACvC,UAAI,OAAO,QAAQ,SAAU,QAAO,IAAI,QAAQ,UAAU,EAAE;AAC5D,UAAI,QAAQ,IAAK,QAAO,IAAI;AAC5B,YAAM,IAAI,UAAU,uFAAuF;AAAA,IAC7G,CAAC;AAED,UAAM,KAAK,OAAO,KAAK,OAAO,aAAa,EAAE,kBAAkB,EAAE,UAAU,WAAW,CAAC;AAAA,EACzF;AACF;;;AC/RA,YAAYC,WAAU;;;ACAf,IAAM,oBAAN,MAAwB;AAAA,EACtB;AAAA,EACP,YAAY,QAAgB;AAC1B,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,QAAkC;AAC3C,UAAM,UAAU,IAAI,WAAyB;AAC7C,UAAM,SAAS,KAAK,OAAO;AAE3B,QAAI,CAAC,OAAQ,QAAO;AAEpB,eAAW,UAAU,KAAK,OAAO,SAAS;AACxC,YAAM,OAAO,OAAO,MAAM,MAAM,IAAI,MAAM;AAC1C,UAAI,KAAM,SAAQ,IAAI,KAAK,IAAI,IAAI;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,IAAI,MAA+B;AACxC,UAAM,SAAS,KAAK,OAAO;AAC3B,QAAI,CAAC,OAAQ,QAAO;AAEpB,UAAM,KAAK,OAAO,MAAM,UAAU,IAAI;AACtC,WAAO,KAAK,OAAO,QAAQ,SAAS,EAAE;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,IAAI,MAAuC;AACtD,UAAM,SAAS,KAAK,OAAO;AAC3B,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,qCAAqC;AAElE,UAAM,KAAK,OAAO,MAAM,UAAU,IAAI;AAEtC,QAAI,KAAK,OAAO,QAAQ,SAAS,EAAE,EAAG,QAAO,KAAK;AAElD,UAAM,WAAW,CAAC,GAAG,KAAK,OAAO,SAAS,EAAE;AAE5C,WAAO,KAAK,OAAO,KAAK,EAAE,OAAO,SAAS,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,OAAO,MAAuC;AACzD,UAAM,SAAS,KAAK,OAAO;AAC3B,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,wCAAwC;AAErE,UAAM,KAAK,OAAO,MAAM,UAAU,IAAI;AAEtC,QAAI,CAAC,KAAK,OAAO,QAAQ,SAAS,EAAE,EAAG,QAAO,KAAK;AAEnD,UAAM,WAAW,KAAK,OAAO,QAAQ,OAAO,CAAC,QAAQ,QAAQ,EAAE;AAE/D,WAAO,KAAK,OAAO,KAAK,EAAE,OAAO,SAAS,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,IAAI,OAA0C;AACzD,UAAM,SAAS,KAAK,OAAO;AAC3B,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,sCAAsC;AAEnE,UAAM,WAAW,MAAM,IAAI,CAAC,MAAM,OAAO,MAAM,UAAU,CAAC,CAAC;AAE3D,WAAO,KAAK,OAAO,KAAK,EAAE,OAAO,SAAS,CAAC;AAAA,EAC7C;AACF;;;AC1FO,IAAM,WAAW;;;AFiBjB,IAAM,SAAN,cAAqB,KAAK;AAAA;AAAA,EAExB;AAAA;AAAA,EAEA,WAA0B;AAAA;AAAA,EAE1B,SAA4B;AAAA;AAAA,EAE3B,SAAmB,CAAC;AAAA;AAAA,EAErB;AAAA;AAAA,EAEA,UAAuB;AAAA;AAAA,EAEvB,aAAsB;AAAA;AAAA,EAEtB,aAAsB;AAAA;AAAA,EAEtB;AAAA,EAEP,YAAY,QAAgB,MAAW;AACrC,UAAM,QAAQ,EAAE,KAAK,KAAK,KAAK,IAAI,CAAC;AAEpC,SAAK,WAAW,KAAK,YAAY,KAAK;AACtC,SAAK,WAAW,IAAI,KAAK,KAAK,YAAY,KAAK,SAAS;AACxD,SAAK,QAAQ,IAAI,kBAAkB,IAAI;AAEvC,SAAK,OAAO,IAAI;AAAA,EAClB;AAAA,EAEA,OAAO,MAAW;AAChB,QAAI,KAAK,aAAa,OAAW,MAAK,WAAW,KAAK;AACtD,QAAI,KAAK,WAAW,OAAW,MAAK,SAAS,KAAK;AAClD,QAAI,KAAK,UAAU,OAAW,MAAK,SAAS,KAAK;AACjD,QAAI,KAAK,YAAY,OAAW,MAAK,UAAU,KAAK,UAAU,IAAI,KAAK,KAAK,OAAO,IAAI;AACvF,QAAI,KAAK,gBAAgB,OAAW,MAAK,aAAa,KAAK;AAC3D,QAAI,KAAK,gBAAgB,OAAW,MAAK,aAAa,KAAK;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,UAAoB;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAW,OAAyB;AAClC,WAAO,KAAK,OAAO,MAAM,MAAM,IAAI,KAAK,EAAE;AAAA,EAC5C;AAAA;AAAA,EAGA,IAAW,SAA6B;AACtC,WAAO,KAAK,OAAO,QAAQ,MAAM,IAAI,KAAK,QAAQ;AAAA,EACpD;AAAA;AAAA,EAGA,IAAW,cAAsB;AAC/B,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC,OAAQ,QAAO;AAEpB,QAAI,aAAa,OAAO,sBAAsB;AAE9C,eAAW,QAAQ,KAAK,MAAM,MAAM,OAAO,GAAG;AAC5C,oBAAc,OAAO,KAAK,WAAW;AAAA,IACvC;AAEA,QAAI,OAAO,YAAY,KAAK,IAAI;AAC9B,aAAO,gBAAgB;AAAA,IACzB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAW,YAA2B;AACpC,QAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,WAAO,GAAG,QAAQ,wBAAwB,KAAK,OAAO,EAAE,IAAI,KAAK,OAAO,QAAQ;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,IAAI,SAA2C;AAC1D,QAAI,SAAS,KAAK;AAClB,QAAI,CAAC,OAAQ,UAAS,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,QAAQ;AAEnE,UAAM,OAAO,QAAQ,IAAI,KAAK,IAAI,OAAO;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAa,SAAS,QAAiB,OAAsB;AAC3D,UAAM,KAAK,OAAO,MAAM,SAAS,KAAK,IAAI,EAAE,MAAM,CAAC;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,WAAW,UAAiC;AACvD,UAAM,KAAK,KAAK,EAAE,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,EAAE,YAAY,EAAE,CAAC;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAa,KAAK,SAAoD;AACpE,QAAI,YAAY,MAAM,KAAK,OAAO,MAAM,SAAS,KAAK,EAAE;AACxD,WAAO,UAAU,SAAS,KAAK,OAAO;AAAA,EACxC;AAAA,EAEA,MAAa,YAAY,UAAmC;AAC1D,WAAO,KAAK,KAAK,EAAE,SAAS,CAAC;AAAA,EAC/B;AAAA;AAAA,EAGO,cAAc,YAA2C;AAC9D,WAAO,YAAY,IAAI,KAAK,aAAa,UAAU;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,KAAK,SAA6C;AAC7D,QAAI,SAAS,KAAK;AAClB,QAAI,CAAC,OAAQ,UAAS,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,QAAQ;AAEnE,WAAO,MAAM,OAAO,QAAQ,KAAK,KAAK,IAAI,OAAO;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASgB,WAAmB;AACjC,WAAO,KAAK,KAAK,EAAE;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OAAsB;AACjC,QAAI,SAAS,KAAK;AAClB,QAAI,CAAC,OAAQ,UAAS,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,QAAQ;AAEnE,UAAM,OAAO,QAAQ,KAAK,KAAK,EAAE;AAAA,EACnC;AAAA;AAAA,EAGA,CAAM,cAAQ,MAAM,EAAE,OAAe,SAA8BC,WAA8B;AAC/F,UAAM,EAAE,QAAQ,UAAU,GAAG,MAAM,IAAI;AACvC,WAAO,GAAG,KAAK,YAAY,IAAI,IAAIA;AAAA,MACjC;AAAA,QACE,GAAG;AAAA,QACH,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,MACpB;AAAA,MACA,EAAE,GAAG,SAAS,OAAO,SAAS,QAAQ,MAAM;AAAA,IAC9C,CAAC;AAAA,EACH;AACF;;;AG9MA,YAAYC,WAAU;AAsBf,IAAM,gBAAN,cAA4B,YAA4B;AAAA,EAC7D,YACE,QACO,QACP,QAAgB,UAChB;AACA,UAAM,QAAQ,KAAK;AAHZ;AAAA,EAIT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,UAAU,MAAmB;AACrC,WAAO,KAAK,WAAW,KAAK,OAAO,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM,KAAK,KAAK;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,UAAU,MAAmB;AACrC,QAAI,CAAC,KAAK,aAAa,CAAC,KAAK,UAAU;AACrC,WAAK,WAAW,KAAK,OAAO;AAAA,IAC9B;AACA,WAAO,IAAI,OAAO,KAAK,QAAQ,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,QAAQ,QAA8C;AAC3D,QAAI,kBAAkB,OAAQ,QAAO;AACrC,QAAI,kBAAkB,KAAM,QAAO,KAAK,MAAM,IAAI,OAAO,EAAE;AAC3D,QAAI,OAAO,WAAW,SAAU,QAAO,KAAK,MAAM,IAAI,OAAO,QAAQ,UAAU,EAAE,CAAC;AAClF,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,UAAU,QAAkC;AACjD,QAAI,OAAO,WAAW,SAAU,QAAO,OAAO,QAAQ,UAAU,EAAE;AAClE,QAAI,QAAQ,OAAQ,QAAO,OAAO;AAClC,UAAM,IAAI,UAAU,oCAAoC;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAa,MAAM,QAA0B,QAAiB,OAAwB;AACpF,QAAI,CAAC,OAAO;AACV,YAAM,SAAS,KAAK,QAAQ,MAAM;AAClC,UAAI,OAAQ,QAAO;AAAA,IACrB;AAEA,UAAM,KAAK,KAAK,UAAU,MAAM;AAChC,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,YAAY,KAAK,OAAO,EAAE,YAAY,EAAE,EAAE;AAElF,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAa,UAAU,UAA+B,CAAC,GAAwC;AAC7F,UAAM,SAAS,IAAI,gBAAgB;AAEnC,QAAI,QAAQ,oBAAoB,QAAW;AACzC,aAAO,OAAO,mBAAmB,QAAQ,gBAAgB,SAAS,CAAC;AAAA,IACrE;AAEA,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,WAAW,YAAY,KAAK,OAAO,EAAE,WAAW,cAAc,IAAI,WAAW,KAAK,EAAE;AAE1F,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,QAAQ;AAEhD,QAAI,KAAK,SAAS,MAAM,QAAQ,KAAK,KAAK,GAAG;AAC3C,iBAAW,YAAY,KAAK,OAAO;AACjC,aAAK,OAAO,MAAM,KAAK,QAAQ;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,UAAU,IAAI,WAA2B;AAC/C,UAAM,aAAa,KAAK,YAAY,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC;AAElE,eAAW,aAAa,YAAY;AAClC,YAAM,SAAS,KAAK,KAAK,SAAS;AAClC,cAAQ,IAAI,OAAO,IAAI,MAAM;AAAA,IAC/B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAa,KAAK,QAA0B,SAA6C;AACvF,UAAM,KAAK,KAAK,UAAU,MAAM;AAChC,UAAM,UAAe,CAAC;AACtB,UAAM,SAAmB,CAAC;AAE1B,QAAI,QAAQ,aAAa,QAAW;AAClC,UAAI,QAAQ,aAAa,KAAM,QAAO,KAAK,UAAU;AAAA,UAChD,SAAQ,WAAW,QAAQ;AAAA,IAClC;AAEA,QAAI,QAAQ,WAAW,QAAW;AAChC,UAAI,QAAQ,WAAW,KAAM,QAAO,KAAK,QAAQ;AAAA,UAC5C,SAAQ,SAAS,QAAQ;AAAA,IAChC;AAEA,QAAI,QAAQ,UAAU,OAAW,SAAQ,QAAQ,QAAQ;AACzD,QAAI,QAAQ,YAAY,QAAW;AACjC,UAAI,QAAQ,YAAY,KAAM,QAAO,KAAK,SAAS;AAAA,UAC9C,SAAQ,UAAU,QAAQ;AAAA,IACjC;AAEA,QAAI,OAAO,SAAS,EAAG,SAAQ,SAAS;AACxC,QAAI,OAAO,KAAK,OAAO,EAAE,WAAW,EAAG,QAAO,KAAK,MAAM,EAAE;AAE3D,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,MAAM,YAAY,KAAK,OAAO,EAAE,YAAY,EAAE,IAAI,OAAO;AAC7F,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,KAAK,QAAyC;AACzD,UAAM,KAAK,KAAK,UAAU,MAAM;AAChC,UAAM,KAAK,OAAO,KAAK,OAAO,YAAY,KAAK,OAAO,EAAE,YAAY,EAAE,EAAE;AACxE,SAAK,MAAM,OAAO,EAAE;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,IAAI,QAA0B,SAA2C;AACpF,UAAM,KAAK,KAAK,UAAU,MAAM;AAChC,UAAM,UAAe,CAAC;AAEtB,QAAI,SAAS,WAAW,OAAW,SAAQ,SAAS,QAAQ;AAC5D,QAAI,SAAS,yBAAyB,OAAW,SAAQ,yBAAyB,QAAQ;AAE1F,UAAM,KAAK,OAAO,KAAK,IAAI,YAAY,KAAK,OAAO,EAAE,SAAS,EAAE,IAAI,OAAO;AAC3E,SAAK,MAAM,OAAO,EAAE;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,MAAM,QAAyC;AAC1D,UAAM,KAAK,KAAK,UAAU,MAAM;AAChC,UAAM,KAAK,OAAO,KAAK,OAAO,YAAY,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE;AAAA,EACvE;AAAA,EAEA,CAAM,cAAQ,MAAM,IAAI;AACtB,WAAO,KAAK;AAAA,EACd;AACF;;;ACpOA,YAAYC,WAAU;AAEf,IAAM,uBAAN,MAA2B;AAAA,EACzB;AAAA,EACA;AAAA,EAEP,YAAY,QAAgB,QAAgB;AAC1C,SAAK,SAAS;AACd,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,IAAW,QAAyC;AAClD,WAAO,KAAK,OAAO,SAAS,MAAM,OAAO,CAAC,YAAa,QAAgB,aAAa,KAAK,OAAO,EAAE;AAAA,EACpG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,OAAO,SAAqD;AACvE,QAAI,CAAC,QAAQ,KAAM,OAAM,IAAI,MAAM,kCAAkC;AAErE,UAAM,UAAe;AAAA,MACnB,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ,QAAQ;AAAA,MACtB,aAAa,QAAQ;AAAA,MACrB,MAAM,QAAQ,QAAQ;AAAA,IACxB;AAEA,QAAI,QAAQ,SAAS,WAAW,QAAQ,OAAO,WAAW;AACxD,cAAQ,QAAQ,EAAE,WAAW,QAAQ,MAAM,UAAU;AAAA,IACvD;AAEA,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,KAAK,YAAY,KAAK,OAAO,EAAE,aAAa,OAAO;AAEvF,WAAO,KAAK,OAAO,SAAS,KAAK,IAAI;AAAA,EACvC;AAAA,EAEA,CAAM,cAAQ,MAAM,IAAI;AACtB,WAAO,KAAK;AAAA,EACd;AACF;;;AC3CA,YAAYC,WAAU;AAIf,IAAM,OAAN,cAAmB,KAAK;AAAA,EACtB;AAAA,EACA;AAAA,EACA,QAAuB;AAAA,EACvB,QAAiB;AAAA,EACjB,OAAe;AAAA,EACf,cAAsB;AAAA,EAE7B,YAAY,QAAgB,MAAW,UAAkB;AACvD,UAAM,QAAQ,IAAI;AAClB,SAAK,WAAW;AAChB,SAAK,OAAO,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,OAAO,MAAW;AACvB,QAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAC9C,QAAI,KAAK,UAAU,OAAW,MAAK,QAAQ,KAAK;AAChD,QAAI,KAAK,UAAU,OAAW,MAAK,QAAQ,KAAK;AAChD,QAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAC9C,QAAI,KAAK,gBAAgB,QAAW;AAClC,UAAI;AACF,YAAI,OAAO,KAAK,gBAAgB,YAAY,KAAK,gBAAgB,MAAM;AACrE,gBAAM,aAAa,KAAK,YAAY,KAAK,KAAK,YAAY,CAAC,KAAK;AAChE,eAAK,cAAc,OAAO,UAAU;AAAA,QACtC,OAAO;AACL,eAAK,cAAc,OAAO,KAAK,WAAW;AAAA,QAC5C;AAAA,MACF,QAAQ;AACN,aAAK,cAAc;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,SAA6B;AACtC,WAAO,KAAK,OAAO,QAAQ,MAAM,IAAI,KAAK,QAAQ;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,cAAc,YAA2C;AAC9D,WAAO,YAAY,IAAI,KAAK,aAAa,UAAU;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAa,MAAM,QAAiB,MAAqB;AACvD,QAAI,SAAS,KAAK;AAElB,QAAI,CAAC,QAAQ;AACX,eAAS,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,QAAQ;AAAA,IACxD;AAEA,WAAQ,MAAM,OAAO,MAAM,MAAM,KAAK,IAAI,KAAK;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAa,KAAK,SAAyC;AACzD,QAAI,SAAS,KAAK;AAClB,QAAI,CAAC,OAAQ,UAAS,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,QAAQ;AAEnE,WAAQ,MAAM,OAAO,MAAM,KAAK,KAAK,IAAI,OAAO;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,SAAwB;AACnC,QAAI,SAAS,KAAK;AAElB,QAAI,CAAC,QAAQ;AACX,eAAS,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,QAAQ;AAAA,IACxD;AAEA,UAAM,OAAO,MAAM,OAAO,KAAK,EAAE;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAa,eAAe,SAA+C;AACzE,QAAI,SAAS,KAAK;AAClB,QAAI,CAAC,OAAQ,UAAS,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,QAAQ;AAEnE,WAAQ,MAAM,OAAO,MAAM,eAAe,KAAK,IAAI,OAAO;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAa,YAAY,aAAoC;AAC3D,QAAI,SAAS,KAAK;AAClB,QAAI,CAAC,OAAQ,UAAS,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,QAAQ;AAEnE,UAAM,cAAc,MAAM,KAAK,OAAO,MAAM,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAE1F,UAAM,gBAAgB,YAAY,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE;AAEhE,UAAM,kBAAkB,KAAK,IAAI,GAAG,KAAK,IAAI,aAAa,cAAc,MAAM,CAAC;AAE/E,kBAAc,OAAO,iBAAiB,GAAG,IAAI;AAE7C,UAAM,OAAO,MAAM,SAAS,aAAa;AAEzC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,CAAM,cAAQ,MAAM,IAAI;AACtB,UAAM,EAAE,QAAQ,UAAU,GAAG,MAAM,IAAI;AACvC,WAAO,GAAG,KAAK,YAAY,IAAI,IAAS,cAAQ,KAAK,CAAC;AAAA,EACxD;AACF;;;AC5KA,YAAYC,WAAU;AAqBf,IAAM,cAAN,cAA0B,YAA0B;AAAA;AAAA;AAAA;AAAA,EAIzD,YACE,QACO,QACP,QAAgB,UAChB;AACA,UAAM,QAAQ,KAAK;AAHZ;AAAA,EAIT;AAAA;AAAA;AAAA;AAAA,EAKU,UAAU,MAAmB;AACrC,WAAO,KAAK,OAAO,KAAK;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKU,UAAU,MAAiB;AACnC,WAAO,IAAI,KAAK,KAAK,QAAQ,MAAM,KAAK,OAAO,EAAE;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASgB,KAAK,MAAW,SAAwB;AACtD,UAAM,KAAK,WAAW,KAAK,OAAO,KAAK;AACvC,UAAM,WAAW,KAAK,MAAM,IAAI,EAAE;AAElC,QAAI,UAAU;AACZ,eAAS,OAAO,IAAI;AACpB,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,IAAI,KAAK,KAAK,QAAQ,MAAM,KAAK,OAAO,EAAE;AACvD,SAAK,MAAM,IAAI,KAAK,IAAI,IAAI;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,CAAM,cAAQ,MAAM,IAAI;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,QAAQ,MAAwC;AACrD,QAAI,gBAAgB,KAAM,QAAO;AAEjC,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,KAAK,KAAK,QAAQ,UAAU,EAAE;AACpC,aAAO,KAAK,MAAM,IAAI,EAAE;AAAA,IAC1B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,UAAU,MAA8B;AAC7C,QAAI,gBAAgB,MAAM;AACxB,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO,KAAK,QAAQ,UAAU,EAAE;AAAA,IAClC;AAEA,UAAM,IAAI,UAAU,iFAAiF;AAAA,EACvG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAa,OAAO,SAA2C;AAC7D,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAM,IAAI,UAAU,2CAA2C;AAAA,IACjE;AAEA,QAAI,OAAO,QAAQ,SAAS,YAAY,QAAQ,KAAK,KAAK,EAAE,WAAW,GAAG;AACxE,YAAM,IAAI,UAAU,gDAAgD;AAAA,IACtE;AAEA,UAAM,UAAe;AAAA,MACnB,MAAM,QAAQ;AAAA,IAChB;AAEA,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,KAAK,YAAY,KAAK,OAAO,EAAE,UAAU,OAAO;AAEpF,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAa,MAAM,MAAsB,QAAiB,OAAsB;AAC9E,QAAI,CAAC,OAAO;AACV,YAAM,SAAS,KAAK,QAAQ,IAAI;AAChC,UAAI,OAAQ,QAAO;AAAA,IACrB;AAEA,UAAM,KAAK,KAAK,UAAU,IAAI;AAE9B,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,YAAY,KAAK,OAAO,EAAE,UAAU,EAAE,EAAE;AAEhF,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAa,KAAK,MAAsB,SAAyC;AAC/E,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAM,IAAI,UAAU,yCAAyC;AAAA,IAC/D;AAEA,UAAM,KAAK,KAAK,UAAU,IAAI;AAC9B,UAAM,UAAe,CAAC;AACtB,UAAM,SAAmB,CAAC;AAE1B,QAAI,QAAQ,SAAS,OAAW,SAAQ,OAAO,QAAQ;AACvD,QAAI,QAAQ,UAAU,OAAW,SAAQ,QAAQ,QAAQ;AAGzD,QAAI,QAAQ,WAAW,QAAW;AAChC,UAAI,QAAQ,WAAW,MAAM;AAC3B,eAAO,KAAK,QAAQ;AAAA,MACtB,OAAO;AACL,gBAAQ,SAAS,QAAQ;AAAA,MAC3B;AAAA,IACF;AAEA,QAAI,OAAO,SAAS,GAAG;AACrB,cAAQ,SAAS;AAAA,IACnB;AAEA,QAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACrC,aAAO,KAAK,MAAM,EAAE;AAAA,IACtB;AAEA,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,MAAM,YAAY,KAAK,OAAO,EAAE,UAAU,EAAE,IAAI,OAAO;AAE3F,WAAO,KAAK,KAAK,MAAM,EAAE;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAa,OAAO,MAAqC;AACvD,UAAM,KAAK,KAAK,UAAU,IAAI;AAE9B,UAAM,KAAK,OAAO,KAAK,OAAO,YAAY,KAAK,OAAO,EAAE,UAAU,EAAE,EAAE;AAEtE,SAAK,MAAM,OAAO,EAAE;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAa,eAAe,MAAsB,SAA+C;AAC/F,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAM,IAAI,UAAU,+CAA+C;AAAA,IACrE;AAEA,UAAM,KAAK,KAAK,UAAU,IAAI;AAE9B,UAAM,cAAc,QAAQ,UAAU,SAAY,YAAY,QAAQ,QAAQ,KAAK,IAAI;AACvF,UAAM,aAAa,QAAQ,SAAS,SAAY,YAAY,QAAQ,QAAQ,IAAI,IAAI;AAEpF,UAAM,UAAU;AAAA,MACd,aAAa;AAAA,QACX,OAAO,OAAO,WAAW;AAAA,QACzB,MAAM,OAAO,UAAU;AAAA,MACzB;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,YAAY,KAAK,OAAO,EAAE,gBAAgB,EAAE,IAAI,OAAO;AAG/F,SAAK,OAAO,OAAO,IAAI;AAGvB,WAAO,KAAK,MAAM,IAAI,EAAE;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAa,SAAS,OAA0C;AAC9D,QAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,YAAM,IAAI,UAAU,4DAA4D;AAAA,IAClF;AAEA,UAAM,YAAY,MAAM,IAAI,CAAC,SAAS,KAAK,UAAU,IAAI,CAAC;AAE1D,UAAM,UAAU;AAAA,MACd,OAAO;AAAA,IACT;AAEA,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,YAAY,KAAK,OAAO,EAAE,UAAU,OAAO;AAEnF,SAAK,OAAO,OAAO,IAAI;AAEvB,WAAO,KAAK;AAAA,EACd;AACF;;;ACzTO,IAAM,eAAN,MAAmB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EAEP,YAAY,MAAW;AACrB,SAAK,OAAO,KAAK,OAAO,KAAK;AAC7B,SAAK,YAAY,KAAK;AACtB,SAAK,YAAY,KAAK;AAAA,EACxB;AAAA,EAEO,OAAO,MAAW;AACvB,SAAK,YAAY,KAAK,WAAW,KAAK;AACtC,SAAK,YAAY,KAAK,WAAW,KAAK;AAAA,EACxC;AACF;;;ACHO,IAAM,sBAAN,cAAkC,YAAkC;AAAA,EACzE,YACE,QACO,QACP,QAAgB,UAChB;AACA,UAAM,QAAQ,KAAK;AAHZ;AAAA,EAIT;AAAA,EAEU,UAAU,MAAmB;AACrC,WAAO,KAAK,OAAO,KAAK;AAAA,EAC1B;AAAA,EAEU,UAAU,MAAyB;AAC3C,WAAO,IAAI,aAAa,IAAI;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,QAAmD;AAC9D,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,YAAY,KAAK,OAAO,EAAE,UAAU;AAE5E,UAAM,aAAa,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC;AACjD,UAAM,UAAU,IAAI,WAAiC;AAErD,eAAW,OAAO,YAAY;AAC5B,YAAM,SAAS,KAAK,KAAK,GAAG;AAC5B,cAAQ,IAAI,OAAO,MAAM,MAAM;AAAA,IACjC;AAEA,WAAO;AAAA,EACT;AACF;;;AC7CO,IAAM,YAAN,MAAgB;AAAA,EACd;AAAA,EACA;AAAA,EAEP,YAAY,MAAW;AACrB,SAAK,SAAS,KAAK,KAAK,QAAQ,KAAK;AACrC,SAAK,SAAS,KAAK,UAAU;AAAA,EAC/B;AAAA,EAEO,OAAO,MAAW;AACvB,QAAI,KAAK,WAAW,OAAW,MAAK,SAAS,KAAK;AAAA,EACpD;AACF;;;ACDO,IAAM,mBAAN,cAA+B,YAA+B;AAAA,EACnE,YACE,QACO,QACP,QAAgB,UAChB;AACA,UAAM,QAAQ,KAAK;AAHZ;AAAA,EAIT;AAAA,EAEU,UAAU,MAAmB;AACrC,WAAO,KAAK,KAAK,QAAQ,KAAK;AAAA,EAChC;AAAA,EAEU,UAAU,MAAsB;AACxC,WAAO,IAAI,UAAU,IAAI;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,QAAgD;AAC3D,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,YAAY,KAAK,OAAO,EAAE,OAAO;AAGzE,QAAI,KAAK,SAAS,MAAM,QAAQ,KAAK,KAAK,GAAG;AAC3C,iBAAW,YAAY,KAAK,OAAO;AACjC,aAAK,OAAO,MAAM,KAAK,QAAQ;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,SAAS,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC;AAC5D,UAAM,UAAU,IAAI,WAA8B;AAElD,eAAW,UAAU,SAAS;AAC5B,YAAM,MAAM,KAAK,KAAK,MAAM;AAC5B,cAAQ,IAAI,IAAI,QAAQ,GAAG;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,OAAO,QAA+B;AACjD,UAAM,KAAK,OAAO,QAAQ,WAAW,EAAE;AACvC,UAAM,KAAK,OAAO,KAAK,OAAO,YAAY,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE;AACrE,SAAK,MAAM,OAAO,EAAE;AAAA,EACtB;AACF;;;ACvDO,IAAM,QAAN,cAAoB,KAAK;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAoB;AAAA,EACpB,OAAgB;AAAA,EAEvB,YAAY,QAAgB,MAAW;AACrC,UAAM,QAAQ,IAAI;AAClB,SAAK,OAAO,IAAI;AAAA,EAClB;AAAA,EAEO,OAAO,MAAW;AACvB,QAAI,KAAK,eAAe,OAAW,MAAK,YAAY,KAAK;AACzD,QAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAC9C,QAAI,KAAK,WAAW,OAAW,MAAK,SAAS,KAAK;AAClD,QAAI,KAAK,aAAa,OAAW,MAAK,WAAW,KAAK;AACtD,QAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAAA,EAChD;AACF;;;ACvBA,YAAYC,YAAU;AAEf,IAAM,eAAN,cAA2B,YAA2B;AAAA,EAC3D,YACE,QACO,QACP,QAAgB,UAChB;AACA,UAAM,QAAQ,KAAK;AAHZ;AAAA,EAIT;AAAA;AAAA;AAAA;AAAA,EAKU,UAAU,MAAmB;AACrC,WAAO,KAAK,OAAO,KAAK;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKU,UAAU,MAAkB;AACpC,WAAO,IAAI,MAAM,KAAK,QAAQ,IAAI;AAAA,EACpC;AAAA,EAEA,MAAa,MAAM,IAA4B;AAC7C,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,iBAAiB,EAAE,EAAE;AAC7D,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA,EAEA,CAAM,eAAQ,MAAM,IAAI;AACtB,WAAO,KAAK;AAAA,EACd;AACF;;;ACpBO,IAAM,SAAN,cAAqB,KAAK;AAAA,EACxB,aAAuB,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAqB;AAAA,EACrB,SAA4B;AAAA,EAC5B,aAA2B,CAAC;AAAA,EAC5B,cAA6B;AAAA,EAC7B,eAAwB;AAAA,EACxB,QAAgB;AAAA,EAChB,OAA0B;AAAA,EAC1B,OAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEP,YAAY,QAAgB,MAAW;AACrC,UAAM,QAAQ,IAAI;AAClB,SAAK,WAAW,IAAI,qBAAqB,QAAQ,IAAI;AACrD,SAAK,UAAU,IAAI,cAAc,QAAQ,IAAI;AAC7C,SAAK,QAAQ,IAAI,YAAY,QAAQ,IAAI;AACzC,SAAK,OAAO,IAAI,iBAAiB,KAAK,QAAQ,IAAI;AAClD,SAAK,UAAU,IAAI,oBAAoB,KAAK,QAAQ,IAAI;AACxD,SAAK,SAAS,IAAI,aAAa,KAAK,QAAQ,IAAI;AAChD,SAAK,OAAO,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKO,OAAO,MAAW,OAAkB;AACzC,QAAI,KAAK,aAAa,OAAW,MAAK,aAAa,KAAK;AACxD,QAAI,KAAK,wBAAwB,QAAW;AAC1C,UAAI;AACF,aAAK,qBAAqB,OAAO,KAAK,mBAAmB;AAAA,MAC3D,QAAQ;AACN,aAAK,qBAAqB;AAAA,MAC5B;AAAA,IACF;AACA,QAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAC9C,QAAI,KAAK,UAAU,OAAW,MAAK,UAAU,KAAK;AAClD,QAAI,KAAK,cAAc,OAAW,MAAK,YAAY,KAAK;AACxD,QAAI,KAAK,eAAe,OAAW,MAAK,aAAa,KAAK;AAC1D,QAAI,KAAK,gBAAgB,OAAW,MAAK,cAAc,KAAK;AAC5D,QAAI,KAAK,iBAAiB,OAAW,MAAK,eAAe,KAAK;AAC9D,QAAI,KAAK,UAAU,OAAW,MAAK,QAAQ,KAAK;AAChD,QAAI,KAAK,SAAS,OAAW,MAAK,OAAO,KAAK;AAC9C,QAAI,KAAK,SAAS,QAAW;AAC3B,WAAK,OAAO,KAAK,OAAO,IAAI,WAAW,KAAK,QAAQ,KAAK,IAAI,IAAI;AAAA,IACnE;AACA,QAAI,KAAK,WAAW,QAAW;AAC7B,WAAK,SAAS,KAAK,SAAS,IAAI,WAAW,KAAK,QAAQ,KAAK,MAAM,IAAI;AAAA,IACzE;AACA,QAAI,KAAK,UAAU,QAAW;AAC5B,iBAAW,CAAC,IAAI,QAAQ,KAAK,OAAO,QAAQ,KAAK,KAAK,GAAG;AACvD,aAAK,MAAM,KAAK,EAAE,IAAI,GAAI,SAAiB,CAAC;AAAA,MAC9C;AAAA,IACF;AACA,QAAI,KAAK,WAAW,QAAW;AAC7B,UAAI,MAAM,QAAQ,KAAK,MAAM,GAAG;AAC9B,mBAAW,SAAS,KAAK,QAAQ;AAC/B,eAAK,OAAO,KAAK,KAAK;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,MAAM,QAAQ,KAAK,GAAG;AACjC,iBAAW,SAAS,OAAO;AACzB,gBAAQ,OAAO;AAAA,UACb,KAAK;AACH,iBAAK,cAAc;AACnB;AAAA,UACF,KAAK;AACH,iBAAK,OAAO;AACZ;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,KAAK,SAA2C;AAC3D,UAAM,KAAK,OAAO,QAAQ,KAAK,KAAK,IAAI,OAAO;AAC/C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,QAAQ;AACnB,WAAO,KAAK,OAAO,KAAK,OAAO,YAAY,KAAK,EAAE,QAAQ;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,aAAa,SAA+B;AACvD,WAAO,KAAK,QAAQ,UAAU,OAAO;AAAA,EACvC;AACF;;;AC1HA,YAAYC,YAAU;AAsBf,IAAM,gBAAN,cAA4B,YAA4B;AAAA,EAC7D,YAAY,QAAgB,QAAgB,UAAU;AACpD,UAAM,QAAQ,KAAK;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKU,UAAU,MAAmB;AACrC,WAAO,KAAK,OAAO,KAAK;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKU,UAAU,MAAmB;AACrC,WAAO,IAAI,OAAO,KAAK,QAAQ,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,MAAM,IAAY,QAAiB,OAAwB;AACtE,QAAI,CAAC,OAAO;AACV,YAAM,SAAS,KAAK,MAAM,IAAI,EAAE;AAChC,UAAI,OAAQ,QAAO;AAAA,IACrB;AAEA,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,YAAY,EAAE,EAAE;AACxD,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA,EAEA,MAAa,KAAK,UAAkB,SAA6C;AAC/E,UAAM,UAAe,CAAC;AACtB,UAAM,SAAmB,CAAC;AAE1B,QAAI,QAAQ,SAAS,OAAW,SAAQ,OAAO,QAAQ;AACvD,QAAI,QAAQ,gBAAgB,QAAW;AACrC,UAAI,QAAQ,gBAAgB,KAAM,QAAO,KAAK,aAAa;AAAA,UACtD,SAAQ,cAAc,QAAQ;AAAA,IACrC;AAEA,QAAI,QAAQ,SAAS,QAAW;AAC9B,UAAI,QAAQ,SAAS,KAAM,QAAO,KAAK,MAAM;AAAA,UACxC,SAAQ,OAAO,QAAQ;AAAA,IAC9B;AACA,QAAI,QAAQ,WAAW,QAAW;AAChC,UAAI,QAAQ,WAAW,KAAM,QAAO,KAAK,QAAQ;AAAA,UAC5C,SAAQ,SAAS,QAAQ;AAAA,IAChC;AAGA,QAAI,QAAQ,gBAAgB;AAC1B,cAAQ,kBAAkB,CAAC;AAC3B,YAAM,KAAK,QAAQ;AACnB,UAAI,GAAG,eAAe,QAAW;AAC/B,YAAI,GAAG,eAAe,KAAM,QAAO,KAAK,yBAAyB;AAAA,YAC5D,SAAQ,gBAAgB,cAAc,GAAG;AAAA,MAChD;AACA,UAAI,GAAG,aAAa,QAAW;AAC7B,YAAI,GAAG,aAAa,KAAM,QAAO,KAAK,uBAAuB;AAAA,YACxD,SAAQ,gBAAgB,YAAY,GAAG;AAAA,MAC9C;AACA,UAAI,GAAG,eAAe,QAAW;AAC/B,YAAI,GAAG,eAAe,KAAM,QAAO,KAAK,yBAAyB;AAAA,YAC5D,SAAQ,gBAAgB,cAAc,GAAG;AAAA,MAChD;AACA,UAAI,GAAG,eAAe,QAAW;AAC/B,YAAI,GAAG,eAAe,KAAM,QAAO,KAAK,yBAAyB;AAAA,YAC5D,SAAQ,gBAAgB,cAAc,GAAG;AAAA,MAChD;AAAA,IACF;AAEA,QAAI,QAAQ,eAAe,OAAW,SAAQ,aAAa,QAAQ;AACnE,QAAI,QAAQ,cAAc,OAAW,SAAQ,YAAY,QAAQ;AACjE,QAAI,QAAQ,UAAU,OAAW,SAAQ,QAAQ,QAAQ;AAEzD,QAAI,OAAO,SAAS,EAAG,SAAQ,SAAS;AAExC,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,MAAM,YAAY,QAAQ,IAAI,OAAO;AAGzE,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA,EAEA,CAAM,eAAQ,MAAM,IAAI;AACtB,WAAO,KAAK;AAAA,EACd;AACF;;;ACtGO,IAAM,cAAN,cAA0B,YAA0B;AAAA,EACzD,YAAY,QAAgB,QAAgB,UAAU;AACpD,UAAM,QAAQ,KAAK;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKU,UAAU,MAAmB;AACrC,WAAO,KAAK,OAAO,KAAK;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKU,UAAU,MAAiB;AACnC,WAAO,IAAI,KAAK,KAAK,QAAQ,IAAI;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKO,QAAQ,MAAwC;AACrD,QAAI,gBAAgB,KAAM,QAAO;AAEjC,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,KAAK,KAAK,QAAQ,UAAU,EAAE;AACpC,aAAO,KAAK,MAAM,IAAI,EAAE;AAAA,IAC1B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,UAAU,MAA8B;AAC7C,QAAI,gBAAgB,MAAM;AACxB,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO,KAAK,QAAQ,UAAU,EAAE;AAAA,IAClC;AAEA,UAAM,IAAI,UAAU,iFAAiF;AAAA,EACvG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAa,MAAM,MAAsB,QAAiB,OAAsB;AAC9E,QAAI,CAAC,OAAO;AACV,YAAM,SAAS,KAAK,QAAQ,IAAI;AAChC,UAAI,OAAQ,QAAO;AAAA,IACrB;AAEA,UAAM,KAAK,KAAK,UAAU,IAAI;AAE9B,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,UAAU,EAAE,EAAE;AAEtD,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAa,UAAU;AACrB,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,YAAY;AAEpD,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAa,OAAO,SAAyC;AAC3D,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAM,IAAI,UAAU,yCAAyC;AAAA,IAC/D;AAEA,UAAM,UAAe,CAAC;AACtB,UAAM,SAAmB,CAAC;AAE1B,QAAI,QAAQ,gBAAgB,QAAW;AACrC,UAAI,QAAQ,gBAAgB,KAAM,QAAO,KAAK,aAAa;AAAA,UACtD,SAAQ,eAAe,QAAQ;AAAA,IACtC;AAEA,QAAI,QAAQ,WAAW,QAAW;AAChC,UAAI,QAAQ,WAAW,KAAM,QAAO,KAAK,QAAQ;AAAA,UAC5C,SAAQ,SAAS,QAAQ;AAAA,IAChC;AAEA,QAAI,QAAQ,YAAY,QAAW;AACjC,cAAQ,UAAU,CAAC;AACnB,UAAI,QAAQ,QAAQ,YAAY,QAAW;AACzC,YAAI,QAAQ,QAAQ,YAAY,KAAM,QAAO,KAAK,gBAAgB;AAAA,YAC7D,SAAQ,QAAQ,UAAU,QAAQ,QAAQ;AAAA,MACjD;AACA,UAAI,QAAQ,QAAQ,eAAe,QAAW;AAC5C,YAAI,QAAQ,QAAQ,eAAe,KAAM,QAAO,KAAK,mBAAmB;AAAA,YACnE,SAAQ,QAAQ,aAAa,QAAQ,QAAQ;AAAA,MACpD;AACA,UAAI,OAAO,KAAK,QAAQ,OAAO,EAAE,WAAW,EAAG,QAAO,QAAQ;AAAA,IAChE;AAEA,QAAI,QAAQ,WAAW,QAAW;AAChC,cAAQ,SAAS,CAAC;AAClB,UAAI,QAAQ,OAAO,SAAS,QAAW;AACrC,YAAI,QAAQ,OAAO,SAAS,KAAM,QAAO,KAAK,YAAY;AAAA,YACrD,SAAQ,OAAO,OAAO,QAAQ,OAAO;AAAA,MAC5C;AACA,UAAI,QAAQ,OAAO,aAAa,QAAW;AACzC,YAAI,QAAQ,OAAO,aAAa,KAAM,QAAO,KAAK,gBAAgB;AAAA,YAC7D,SAAQ,OAAO,WAAW,QAAQ,OAAO;AAAA,MAChD;AACA,UAAI,OAAO,KAAK,QAAQ,MAAM,EAAE,WAAW,EAAG,QAAO,QAAQ;AAAA,IAC/D;AAEA,QAAI,OAAO,SAAS,GAAG;AACrB,cAAQ,SAAS;AAAA,IACnB;AAEA,QAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACrC,aAAO,KAAK,MAAM,KAAK;AAAA,IACzB;AAEA,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,MAAM,cAAc,OAAO;AAE/D,WAAO,KAAK,KAAK,IAAI;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU,QAAkC;AAC1C,WAAQ,KAAK,OAAO,SAAS,MAAM,KAAK,CAAC,YAAY,QAAQ,KAAK,KAAK,QAAQ,WAAW,SAAS,MAAM,CAAC,KACxG;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAa,SAAS,MAAsB,EAAE,QAAQ,MAAM,IAAI,CAAC,GAAuB;AACtF,UAAM,KAAK,KAAK,UAAU,IAAI;AAE9B,QAAI,CAAC,OAAO;AACV,YAAM,YAAY,KAAK,UAAU,EAAE;AACnC,UAAI,UAAW,QAAO;AAAA,IACxB;AAEA,UAAM,OAAO,MAAM,KAAK,OAAO,KAAK,IAAI,UAAU,EAAE,KAAK;AACzD,WAAO,KAAK,OAAO,SAAS,KAAK,IAAI;AAAA,EACvC;AACF;;;ACjNO,IAAM,iBAAN,MAAqB;AAAA,EAClB,kBAAyC;AAAA,EAC1C;AAAA,EACA;AAAA,EAEP,YAAY,QAAgB,SAAyB;AACnD,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACjB;AAAA,EAEO,QAAQ;AACb,QAAI,KAAK,QAAQ,UAAU;AACzB,WAAK,OAAO,KAAK,SAAS,mCAAmC;AAE7D,WAAK,kBAAkB,YAAY,MAAM;AACvC,aAAK,cAAc;AAAA,MACrB,GAAG,KAAK,QAAQ,SAAS,QAAQ;AAAA,IACnC;AAAA,EACF;AAAA,EAEQ,gBAAgB;AACtB,QAAI,CAAC,KAAK,QAAQ,SAAU;AAE5B,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,WAAW,KAAK,QAAQ,SAAS;AACvC,QAAI,aAAa;AAEjB,eAAW,WAAW,KAAK,OAAO,SAAS,MAAM,OAAO,GAAG;AACzD,UAAI,EAAE,cAAc,SAAU;AAE9B,YAAM,cAAc;AAEpB,iBAAW,CAAC,IAAI,OAAO,KAAK,YAAY,SAAS,MAAM,QAAQ,GAAG;AAChE,YAAI,MAAM,QAAQ,WAAW,UAAU;AACrC,sBAAY,SAAS,MAAM,OAAO,EAAE;AACpC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa,GAAG;AAClB,WAAK,OAAO,KAAK,SAAS,6BAAsB,UAAU,2BAA2B;AAAA,IACvF;AAAA,EACF;AAAA,EAEO,OAAO;AACZ,QAAI,KAAK,gBAAiB,eAAc,KAAK,eAAe;AAC5D,SAAK,OAAO,KAAK,SAAS,mBAAmB;AAAA,EAC/C;AACF;;;AvCbO,IAAM,SAAN,cAAqBC,cAAa;AAAA,EAUvC,YAAmB,UAAyB,CAAC,GAAG;AAC9C,UAAM,EAAE,mBAAmB,KAAK,CAAC;AADhB;AAEjB,SAAK,OAAO,IAAI,YAAY,IAAI;AAChC,SAAK,UAAU,IAAI,eAAe,IAAI;AACtC,SAAK,WAAW,IAAI,eAAe,MAAM,QAAQ,aAAa,QAAQ;AACtE,SAAK,UAAU,IAAI,cAAc,MAAM,QAAQ,aAAa,OAAO;AACnE,SAAK,QAAQ,IAAI,YAAY,MAAM,QAAQ,aAAa,KAAK;AAC7D,SAAK,SAAS,IAAI,aAAa,MAAM,QAAW,QAAQ,aAAa,MAAM;AAE3E,SAAK,WAAW,IAAI,eAAe,MAAM,QAAQ,YAAY,CAAC,CAAC;AAAA,EACjE;AAAA,EAnBO;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAA0B;AAAA;AAAA;AAAA;AAAA,EAiBjC,MAAa,MAAM,OAA6B;AAC9C,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,iCAAiC;AAC7D,SAAK,SAAS,MAAM;AACpB,SAAK,KAAK,SAAS,KAAK;AACxB,WAAO,KAAK,QAAQ,QAAQ,KAAK;AAAA,EACnC;AAAA,EAEA,CAAC,uBAAO,IAAI,kBAAkB,CAAC,EAAE,OAAc;AAC7C,SAAK,KAAK,SAAS,KAAK;AAAA,EAC1B;AAAA,EAEgB,GAAiC,OAAU,UAAoD;AAC7G,WAAO,MAAM,GAAG,OAAO,QAAe;AAAA,EACxC;AAAA,EAEgB,KAAmC,OAAU,UAAoD;AAC/G,WAAO,MAAM,KAAK,OAAO,QAAe;AAAA,EAC1C;AAAA,EAEgB,KAAmC,UAAa,MAAgC;AAC9F,WAAO,MAAM,KAAK,OAAO,GAAG,IAAI;AAAA,EAClC;AACF;;;AwCpFO,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EAER,YAAY,OAA+B,CAAC,GAAG;AAC7C,SAAK,OAAO,EAAE,MAAM,QAAQ,GAAG,KAAK;AAAA,EACtC;AAAA,EAEO,SAAS,OAAqB;AACnC,SAAK,KAAK,QAAQ;AAClB,WAAO;AAAA,EACT;AAAA,EAEO,eAAe,aAA2B;AAC/C,SAAK,KAAK,cAAc;AACxB,WAAO;AAAA,EACT;AAAA,EAEO,OAAO,KAAmB;AAC/B,SAAK,KAAK,MAAM;AAChB,WAAO;AAAA,EACT;AAAA,EAEO,WAAW,SAAuB;AACvC,SAAK,KAAK,WAAW;AACrB,WAAO;AAAA,EACT;AAAA,EAEO,SAAS,OAAqB;AACnC,SAAK,KAAK,SAAS;AACnB,WAAO;AAAA,EACT;AAAA,EAEO,SAAS,QAAsB;AACpC,SAAK,KAAK,QAAQ;AAClB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,SAAwB;AAC7B,WAAO,EAAE,GAAG,KAAK,KAAK;AAAA,EACxB;AACF;","names":["EventEmitter","util","inspect","UserRelationship","UserPresence","util","ChannelType","util","inspect","util","inspect","util","util","util","util","util","util","EventEmitter"]}
1
+ {"version":3,"sources":["../src/client/Client.ts","../src/gateway/GatewayManager.ts","../src/structures/Base.ts","../src/structures/Message.ts","../src/structures/Attachment.ts","../src/utils/Collector.ts","../src/utils/Collection.ts","../src/structures/MessageReaction.ts","../src/utils/ReactionCollector.ts","../src/structures/User.ts","../src/structures/ClientUser.ts","../src/rest/RESTManager.ts","../src/utils/schema.ts","../src/managers/MessageManager.ts","../src/managers/BaseManager.ts","../src/builders/AttachmentBuilder.ts","../src/utils/resolveAttachment.ts","../src/utils/MessageCollector.ts","../src/structures/BaseChannel.ts","../src/structures/TextChannel.ts","../src/structures/UnknownChannel.ts","../src/structures/DMChannel.ts","../src/structures/GroupChannel.ts","../src/utils/ChannelFactory.ts","../src/utils/BitField.ts","../src/utils/permissions.ts","../src/managers/ChannelManager.ts","../src/structures/Member.ts","../src/managers/MemberRoleManager.ts","../src/utils/Constants.ts","../src/managers/MemberManager.ts","../src/managers/ServerChannelManager.ts","../src/structures/Role.ts","../src/managers/RoleManager.ts","../src/structures/ServerInvite.ts","../src/managers/ServerInviteManager.ts","../src/structures/ServerBan.ts","../src/managers/ServerBanManager.ts","../src/structures/Emoji.ts","../src/managers/EmojiManager.ts","../src/structures/Server.ts","../src/managers/ServerManager.ts","../src/managers/UserManager.ts","../src/managers/SweepManager.ts","../src/builders/EmbedBuilder.ts","../src/index.ts"],"sourcesContent":["import { EventEmitter } from \"events\";\nimport { GatewayManager } from \"../gateway/GatewayManager\";\nimport { RESTManager } from \"../rest/RESTManager\";\nimport { Message } from \"../structures/Message\";\nimport { ChannelManager } from \"../managers/ChannelManager\";\nimport { BaseChannel } from \"../structures/BaseChannel\";\nimport { ServerManager } from \"../managers/ServerManager\";\nimport { Server } from \"../structures/Server\";\nimport { UserManager } from \"../managers/UserManager\";\nimport { User } from \"../structures/User\";\nimport { ClientUser } from \"../structures/ClientUser\";\nimport { Member } from \"../structures/Member\";\nimport { SweeperManager, SweeperOptions } from \"../managers/SweepManager\";\nimport { EmojiManager } from \"../managers/EmojiManager\";\n\nexport interface ClientEvents {\n ready: [data: any];\n messageCreate: [message: Message];\n messageUpdate: [oldMessage: null | Message, newMessage: Message];\n messageDelete: [message: Message | { id: string; channelId: string }];\n messageReact: [message: Message | { id: string; channelId: string }, emojiId: string, userId: string];\n messageUnreact: [message: Message | { id: string; channelId: string }, emojiId: string, userId: string];\n messageRemoveReaction: [message: Message | { id: string; channelId: string }, emojiId: string];\n error: [error: Error];\n debug: [message: string];\n raw: [data: any];\n channelCreate: [channel: BaseChannel];\n channelUpdate: [oldChannel: BaseChannel | null, newChannel: BaseChannel];\n channelDelete: [channel: BaseChannel | string];\n serverCreate: [server: Server];\n serverUpdate: [oldServer: Server | null, newServer: Server];\n serverDelete: [server: Server | string];\n userUpdate: [oldUser: User, newUser: User];\n serverMemberJoin: [member: Member];\n serverMemberLeave: [member: Member | { serverId: string; userId: string }];\n serverBanAdd: [member: Member | { serverId: string; userId: string }];\n serverMemberKick: [member: Member | { serverId: string; userId: string }];\n}\n\nexport interface ClientOptions {\n sweepers?: SweeperOptions;\n cacheLimits?: {\n users?: number;\n servers?: number;\n channels?: number;\n emojis?: number;\n };\n}\n\nexport class Client extends EventEmitter {\n public rest: RESTManager;\n public gateway: GatewayManager;\n public channels: ChannelManager;\n public servers: ServerManager;\n public users: UserManager;\n public sweepers: SweeperManager;\n public emojis: EmojiManager;\n public user: ClientUser | null = null;\n\n constructor(public options: ClientOptions = {}) {\n super({ captureRejections: true });\n this.rest = new RESTManager(this);\n this.gateway = new GatewayManager(this);\n this.channels = new ChannelManager(this, options.cacheLimits?.channels);\n this.servers = new ServerManager(this, options.cacheLimits?.servers);\n this.users = new UserManager(this, options.cacheLimits?.users);\n this.emojis = new EmojiManager(this, undefined, options.cacheLimits?.emojis);\n\n this.sweepers = new SweeperManager(this, options.sweepers ?? {});\n }\n\n /**\n * Connects the bot to the Stoat Gateway\n */\n public async login(token: string): Promise<any> {\n if (!token) throw new Error(\"A valid token must be provided.\");\n this.sweepers.start();\n this.rest.setToken(token);\n return this.gateway.connect(token);\n }\n\n [Symbol.for(\"nodejs.rejection\")](error: Error) {\n this.emit(\"error\", error);\n }\n\n public override on<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void): this {\n return super.on(event, listener as any);\n }\n\n public override once<K extends keyof ClientEvents>(event: K, listener: (...args: ClientEvents[K]) => void): this {\n return super.once(event, listener as any);\n }\n\n public override emit<K extends keyof ClientEvents>(event: K, ...args: ClientEvents[K]): boolean {\n return super.emit(event, ...args);\n }\n}\n","import WebSocket from \"ws\";\nimport { Client } from \"../client/Client\";\nimport { Message } from \"../structures/Message\";\nimport { TextChannel } from \"../structures/TextChannel\";\nimport { ClientUser } from \"../structures/ClientUser\";\n\nexport class GatewayManager {\n private ws: WebSocket | null = null;\n private pingInterval: NodeJS.Timeout | null = null;\n private token: string | null = null;\n\n private reconnectAttempts: number = 0;\n private readonly maxReconnectWait: number = 60000; // Cap at 60s\n private isIntentionalClose: boolean = false;\n\n constructor(private client: Client) {}\n\n public async connect(token: string): Promise<void> {\n this.token = token;\n this.isIntentionalClose = false;\n this.client.emit(\"debug\", \"Connecting to Stoat Gateway...\");\n\n if (this.ws) {\n this.ws.removeAllListeners();\n this.ws = null;\n }\n\n const baseUrl = \"wss://stoat.chat/events\";\n const url = `${baseUrl}?version=1&format=json&token=${this.token}`;\n\n this.ws = new WebSocket(url);\n\n this.ws.on(\"open\", () => {\n this.client.emit(\"debug\", \"WebSocket Opened. Starting ping loop...\");\n this.reconnectAttempts = 0;\n this.startPingLoop();\n });\n\n this.ws.on(\"message\", (data) => this.handleMessage(data));\n\n this.ws.on(\"close\", (code, reason) => {\n this.client.emit(\"debug\", `WebSocket closed: ${code} - ${reason.toString()}`);\n if (this.pingInterval) clearInterval(this.pingInterval);\n if (!this.isIntentionalClose) {\n this.reconnect();\n }\n });\n\n this.ws.on(\"error\", (error) => {\n this.client.emit(\"error\", error);\n });\n }\n\n private handleMessage(rawData: WebSocket.RawData) {\n const payload = JSON.parse(rawData.toString());\n const eventType = payload.type;\n\n this.client.emit(\"raw\", payload);\n\n switch (eventType) {\n case \"Error\":\n this.client.emit(\"error\", new Error(`Gateway Error: ${payload.error || JSON.stringify(payload)}`));\n break;\n\n case \"Authenticated\":\n this.client.emit(\"debug\", \"Successfully authenticated with Stoat.\");\n break;\n\n case \"Ready\": {\n if (payload.channels) {\n for (const rawChannel of payload.channels) {\n this.client.channels._add(rawChannel);\n }\n }\n\n if (payload.servers) {\n for (const rawServer of payload.servers) {\n this.client.servers._add(rawServer);\n }\n }\n\n if (payload.users) {\n for (const rawUser of payload.users) {\n this.client.users._add(rawUser);\n if (rawUser.relationship === \"User\" && !this.client.user) {\n this.client.user = new ClientUser(this.client, rawUser);\n }\n }\n }\n\n if (payload.emojis) {\n for (const rawEmoji of payload.emojis) {\n const emoji = this.client.emojis._add(rawEmoji);\n if (rawEmoji.parent && rawEmoji.parent.type === \"Server\") {\n const server = this.client.servers.cache.get(rawEmoji.parent.id);\n if (server) {\n server.emojis._add(emoji);\n }\n }\n }\n }\n\n this.client.emit(\"ready\", payload);\n break;\n }\n\n case \"Message\": {\n if (payload.user) this.client.users._add(payload.user);\n\n const channel = this.client.channels.cache.get(payload.channel);\n let message;\n\n if (channel) {\n message = channel.messages._add(payload);\n\n if (\"serverId\" in channel) {\n const serverId = (channel as TextChannel).serverId;\n const server = this.client.servers.cache.get(serverId);\n if (server && payload.member && payload.user) {\n server.members._add({ ...payload.member, user: payload.user });\n }\n }\n } else {\n message = new Message(this.client, payload);\n }\n\n this.client.emit(\"messageCreate\", message);\n break;\n }\n\n case \"MessageUpdate\": {\n const channel = this.client.channels.cache.get(payload.channel);\n const existing = channel?.messages.cache.get(payload.id);\n\n if (existing) {\n const oldMessage = existing._clone();\n existing._patch(payload.data);\n this.client.emit(\"messageUpdate\", oldMessage, existing);\n } else {\n const newMessage = new Message(this.client, { id: payload.id, channelId: payload.channel, ...payload.data });\n this.client.emit(\"messageUpdate\", null, newMessage);\n }\n break;\n }\n\n case \"MessageAppend\": {\n const channel = this.client.channels.cache.get(payload.channel);\n const message = channel?.messages.cache.get(payload.id);\n\n if (message && payload.append.embeds) {\n const oldMessage = message._clone();\n message.embeds = [...(message.embeds || []), ...payload.append.embeds];\n this.client.emit(\"messageUpdate\", oldMessage, message);\n }\n break;\n }\n\n case \"MessageDelete\": {\n const channel = this.client.channels.cache.get(payload.channel);\n\n let message;\n\n if (channel) {\n message = channel.messages.cache.get(payload.id);\n channel.messages.cache.delete(payload.id);\n }\n\n if (message) {\n this.client.emit(\"messageDelete\", message);\n } else {\n this.client.emit(\"messageDelete\", { id: payload.id, channelId: payload.channel });\n }\n\n break;\n }\n\n case \"MessageReact\": {\n const channel = this.client.channels.cache.get(payload.channel_id);\n const message = channel?.messages.cache.get(payload.id);\n\n if (message) {\n if (!message.reactions) message.reactions = {};\n if (!message.reactions[payload.emoji_id]) {\n message.reactions[payload.emoji_id] = [];\n }\n const reactions = message.reactions[payload.emoji_id];\n if (reactions && !reactions.includes(payload.user_id)) {\n reactions.push(payload.user_id);\n }\n }\n\n this.client.emit(\n \"messageReact\",\n message || { id: payload.id, channelId: payload.channel_id },\n payload.emoji_id,\n payload.user_id,\n );\n break;\n }\n\n case \"MessageUnreact\": {\n const channel = this.client.channels.cache.get(payload.channel_id);\n const message = channel?.messages.cache.get(payload.id);\n\n if (message && message.reactions && message.reactions[payload.emoji_id]) {\n const reactions = message.reactions[payload.emoji_id];\n if (reactions) {\n message.reactions[payload.emoji_id] = reactions.filter((userId) => userId !== payload.user_id);\n\n if (message.reactions[payload.emoji_id]!.length === 0) {\n delete message.reactions[payload.emoji_id];\n }\n }\n }\n\n this.client.emit(\n \"messageUnreact\",\n message || { id: payload.id, channelId: payload.channel_id },\n payload.emoji_id,\n payload.user_id,\n );\n break;\n }\n\n case \"MessageRemoveReaction\": {\n const channel = this.client.channels.cache.get(payload.channel_id);\n const message = channel?.messages.cache.get(payload.id);\n\n if (message && message.reactions) {\n delete message.reactions[payload.emoji_id];\n }\n\n this.client.emit(\n \"messageRemoveReaction\",\n message || { id: payload.id, channelId: payload.channel_id },\n payload.emoji_id,\n );\n break;\n }\n\n case \"Pong\":\n this.client.emit(\"debug\", \"Received Pong from server.\");\n break;\n\n case \"ChannelCreate\": {\n const channel = this.client.channels._add(payload);\n\n this.client.emit(\"channelCreate\", channel);\n break;\n }\n\n case \"ChannelUpdate\": {\n const existing = this.client.channels.cache.get(payload.id);\n\n if (existing) {\n const oldChannel = existing._clone();\n\n if (\"_patch\" in existing) {\n (existing as any)._patch(payload.data, payload.clear);\n }\n\n this.client.emit(\"channelUpdate\", oldChannel, existing);\n } else {\n const newChannel = this.client.channels._add({ id: payload.id, ...payload.data });\n this.client.emit(\"channelUpdate\", null, newChannel);\n }\n break;\n }\n\n case \"ChannelDelete\": {\n const channel = this.client.channels.cache.get(payload.id);\n if (channel) {\n this.client.channels.cache.delete(channel.id);\n this.client.emit(\"channelDelete\", channel);\n }\n break;\n }\n\n case \"ServerCreate\": {\n const server = this.client.servers._add(payload);\n this.client.emit(\"serverCreate\", server);\n break;\n }\n\n case \"ServerUpdate\": {\n const existing = this.client.servers.cache.get(payload.id);\n\n if (existing) {\n const oldServer = existing._clone();\n\n existing._patch(payload.data, payload.clear);\n\n this.client.emit(\"serverUpdate\", oldServer, existing);\n } else {\n const newServer = this.client.servers._add({ id: payload.id, ...payload.data });\n this.client.emit(\"serverUpdate\", null, newServer);\n }\n break;\n }\n\n case \"ServerDelete\": {\n const server = this.client.servers.cache.get(payload.id);\n if (server) {\n this.client.servers.cache.delete(payload.id);\n this.client.emit(\"serverDelete\", server);\n } else {\n this.client.emit(\"serverDelete\", payload.id);\n }\n break;\n }\n\n case \"ServerMemberJoin\": {\n const server = this.client.servers.cache.get(payload.id);\n if (server) {\n const member = server.members._add({ user: payload.user });\n this.client.emit(\"serverMemberJoin\", member);\n }\n break;\n }\n\n case \"ServerMemberLeave\": {\n const server = this.client.servers.cache.get(payload.id);\n let member = null;\n\n if (server) {\n member = server.members.cache.get(payload.user);\n if (member) {\n server.members.cache.delete(payload.user);\n }\n }\n const emitData = member || { serverId: payload.id, userId: payload.user };\n if (payload.reason === \"Ban\") {\n if (server) {\n const dummyBanPayload = {\n id: payload.user,\n reason: null,\n };\n\n server.bans._add(dummyBanPayload);\n }\n this.client.emit(\"serverBanAdd\", emitData);\n } else if (payload.reason === \"Kick\") {\n this.client.emit(\"serverMemberKick\", emitData);\n } else {\n this.client.emit(\"serverMemberLeave\", emitData);\n }\n break;\n }\n\n case \"EmojiCreate\": {\n const emoji = this.client.emojis._add(payload);\n if (payload.parent?.type === \"Server\") {\n const server = this.client.servers.cache.get(payload.parent.id);\n if (server) {\n server.emojis._add(emoji);\n }\n }\n break;\n }\n\n case \"EmojiDelete\": {\n this.client.emojis.cache.delete(payload.id);\n\n // Find which server has this emoji\n for (const server of this.client.servers.cache.values()) {\n const emoji = server.emojis.cache.get(payload.id);\n if (emoji) {\n server.emojis.cache.delete(payload.id);\n break;\n }\n }\n break;\n }\n\n case \"UserUpdate\": {\n const existing = this.client.users.cache.get(payload.id);\n if (existing) {\n const oldUser = existing._clone();\n existing._patch(payload.data, payload.clear);\n this.client.emit(\"userUpdate\", oldUser, existing);\n }\n break;\n }\n\n default:\n this.client.emit(\"debug\", `Unhandled Gateway Event Type: ${eventType}`);\n break;\n }\n }\n\n private startPingLoop() {\n if (this.pingInterval) clearInterval(this.pingInterval);\n\n this.pingInterval = setInterval(() => {\n this.client.emit(\"debug\", \"Sending Ping...\");\n this.send({ type: \"Ping\", data: Date.now() });\n }, 20000);\n }\n\n private send(payload: any) {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(payload));\n }\n }\n\n private reconnect(): void {\n if (!this.token) {\n this.client.emit(\"error\", new Error(\"RECONNECT_FAILED: No token available.\"));\n return;\n }\n\n let waitTime = Math.pow(2, this.reconnectAttempts) * 1000;\n\n const jitter = waitTime * 0.2 * Math.random();\n waitTime = Math.min(waitTime + jitter, this.maxReconnectWait);\n\n this.reconnectAttempts++;\n\n this.client.emit(\n \"debug\",\n `Attempting to reconnect in ${Math.round(waitTime / 1000)}s... (Attempt ${this.reconnectAttempts})`,\n );\n\n setTimeout(() => {\n void this.connect(this.token!);\n }, waitTime);\n }\n\n public disconnect() {\n this.isIntentionalClose = true;\n if (this.pingInterval) clearInterval(this.pingInterval);\n if (this.ws) {\n this.ws.close(1000, \"Client disconnected gracefully\");\n this.ws.removeAllListeners();\n this.ws = null;\n }\n this.client.emit(\"debug\", \"Gateway disconnected intentionally.\");\n }\n}\n","import { Client } from \"../client/Client\";\n\n/**\n * The base class for all structures.\n */\nexport abstract class Base {\n public readonly id: string;\n public cachedAt: number = Date.now();\n protected readonly client: Client;\n\n protected constructor(client: Client, data: { _id: string }) {\n this.id = data._id;\n this.client = client;\n\n Object.defineProperty(this, \"client\", {\n value: client,\n enumerable: false,\n writable: false,\n });\n }\n\n /**\n * Compares this object with another to see if they represent the same entity.\n */\n public equals(other: Base | string): boolean {\n if (typeof other === \"string\") return this.id === other;\n return other instanceof Base && this.id === other.id;\n }\n\n /**\n * Returns the UUID string when the object is cast to a string.\n */\n public toString(): string {\n return this.id;\n }\n\n /**\n * Helper to quickly clone a structure\n */\n public _clone(): this {\n return Object.assign(Object.create(this), this);\n }\n}\n","import { Base } from \"./Base\";\nimport { Client } from \"../client/Client\";\nimport { Member } from \"./Member\";\nimport { User } from \"./User\";\nimport { BaseChannel } from \"./BaseChannel\";\nimport * as util from \"node:util\";\nimport { EmbedBuilder, TextEmbedData } from \"../builders/EmbedBuilder\";\nimport { Attachment } from \"./Attachment\";\nimport { Server } from \"./Server\";\nimport { decodeTime } from \"ulid\";\nimport { UserResolvable } from \"../managers/UserManager\";\nimport { ReactionCollector, ReactionCollectorOptions } from \"../utils/ReactionCollector\";\nimport { Collection } from \"../utils/Collection\";\nimport { MessageReaction } from \"./MessageReaction\";\nimport { AttachmentBuilder } from \"../builders/AttachmentBuilder\";\nimport { Message as RawMessage, Embed as RawEmbed } from \"stoat-api\";\n\nexport interface MessageOptions {\n content?: string;\n embeds?: (TextEmbedData | EmbedBuilder)[];\n attachments?: string[] | AttachmentBuilder[];\n interactions?: any[];\n flags?: number;\n masquerade?: Masquerade;\n replies?: ReplyIntent[];\n}\nexport interface Masquerade {\n avatar?: string | null;\n name?: string | null;\n colour?: string | null;\n}\nexport interface ReplyIntent {\n id: string;\n mention: boolean;\n fail_if_not_exists?: boolean;\n}\n\nexport interface Interaction {\n reactions: string[];\n restrictReactions: boolean;\n}\n\nexport class Message extends Base {\n public content: string | null = null;\n public authorId: string;\n public channelId: string;\n public embeds: RawEmbed[] | null = [];\n public attachments: Attachment[] = [];\n public editedAt: Date | null = null;\n public createdAt: Date | null = null;\n public flags: number = 0;\n public interactions: Interaction | null = null;\n public masquerade: Masquerade | null = null;\n public mentions: string[] | null = null;\n public pinned: null | boolean = false;\n public reactions: Record<string, string[]> = {};\n public replies: string[] | null = [];\n public role_mentions: string[] | null = [];\n\n constructor(client: Client, data: RawMessage) {\n super(client, data);\n\n this.authorId = data.author;\n this.channelId = data.channel;\n\n const timestamp = decodeTime(this.id);\n if (timestamp) {\n this.createdAt = new Date(timestamp);\n }\n\n if (data.attachments) {\n this.attachments = data.attachments.map((fileData: any) => new Attachment(this.client, fileData));\n }\n\n if (data.masquerade !== undefined) this.masquerade = data.masquerade;\n if (data.mentions !== undefined) this.mentions = data.mentions;\n if (data.replies !== undefined) this.replies = data.replies;\n if (data.role_mentions !== undefined) this.role_mentions = data.role_mentions;\n\n this._patch(data);\n }\n\n public async reply(contentOrOptions: string | MessageOptions): Promise<Message> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n const options: MessageOptions =\n typeof contentOrOptions === \"string\" ? { content: contentOrOptions } : { ...contentOrOptions };\n\n const repliesArray: ReplyIntent[] = options.replies ? [...options.replies] : [];\n\n const alreadyReplying = repliesArray.some((reply) => reply.id === this.id);\n if (!alreadyReplying) {\n repliesArray.push({\n id: this.id,\n mention: true,\n });\n }\n\n options.replies = repliesArray;\n\n return channel.messages.send(options);\n }\n\n /**\n * Edits this message.\n * @param contentOrOptions The new content or options for the message.\n */\n public async edit(contentOrOptions: string | MessageOptions): Promise<this> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n return (await channel.messages.edit(this.id, contentOrOptions)) as this;\n }\n\n /**\n * Deletes this message.\n */\n public async delete(): Promise<void> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n await channel.messages.delete(this.id);\n }\n\n /**\n * Pins this message.\n */\n public async pin(): Promise<void> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n await channel.messages.pin(this.id);\n }\n\n /**\n * Unpins this message.\n */\n public async unpin(): Promise<void> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n await channel.messages.unpin(this.id);\n }\n\n /**\n * React to this message\n * @param reaction The emoji to react with. Can be a Unicode emoji or a custom emoji ID.\n * @throws {Error} If the API request fails.\n * @example\n * await message.react(\"👍\");\n * await message.react(\"customEmojiId\");\n */\n public async react(reaction: string): Promise<void> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n await channel.messages.react(this.id, reaction);\n }\n\n /**\n * Remove a reaction from this message\n * @param reaction The emoji to remove. Can be a Unicode emoji or a custom emoji ID.\n * @param userId The ID of the user whose reaction to remove. If not provided, removes the current user's reaction.\n * @param removeAll Remove all reactions of this type.\n * @throws {Error} If both userId and removeAll are provided, or if the API request fails.\n * @example\n * // Remove the current user's reaction\n * await message.removeReaction(\"👍\");\n * // Remove a specific user's reaction\n * await message.removeReaction(\"👍\", userId);\n * // Remove all reactions of this type\n * await message.removeReaction(\"👍\", undefined, true);\n */\n public async removeReaction(reaction: string, userId?: UserResolvable, removeAll?: boolean): Promise<void> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n await channel.messages.removeReaction(this.id, reaction, userId, removeAll);\n }\n\n /**\n * Remove all reactions from this message\n * @throws {Error} If the API request fails.\n * @example\n * await message.clearReactions();\n */\n public async clearReactions(): Promise<void> {\n let channel = this.channel;\n if (!channel) channel = await this.client.channels.fetch(this.channelId);\n\n await channel.messages.clearReactions(this.id);\n }\n\n /**\n * Creates a ReactionCollector to collect reactions on this message.\n * @param options The options for the collector.\n * @returns A new ReactionCollector instance.\n * @example\n * const collector = message.createReactionCollector({ time: 15000 });\n * collector.on('collect', (reaction) => console.log(`Collected ${reaction.emojiId} from ${reaction.userId}`));\n * collector.on('end', (collected) => console.log(`Collected ${collected.size} items`));\n */\n public createReactionCollector(options?: ReactionCollectorOptions): ReactionCollector {\n return new ReactionCollector(this, options);\n }\n\n /**\n * Awaits reactions on this message.\n * @param options The options for the collector.\n * @returns A promise that resolves to a collection of reactions collected.\n * @example\n * // Await reactions\n * const filter = (reaction) => reaction.emoji.id === '123' && reaction.users.has(author.id);\n * message.awaitReactions({ filter, max: 1, time: 60000 })\n * .then(collected => console.log(collected.size))\n * .catch(console.error);\n */\n public awaitReactions(options?: ReactionCollectorOptions): Promise<Collection<string, MessageReaction>> {\n return new Promise((resolve) => {\n const collector = this.createReactionCollector(options);\n collector.once(\"end\", (collected) => resolve(collected));\n });\n }\n\n /** Gets the Channel object from cache */\n public get channel(): BaseChannel | undefined {\n return this.client.channels.cache.get(this.channelId);\n }\n\n /** Gets the Global User object from cache */\n public get author(): User | undefined {\n return this.client.users.cache.get(this.authorId);\n }\n\n /** Gets the Server Member object (if sent in a server) */\n public get member(): Member | undefined {\n const channel = this.channel;\n if (channel && \"serverId\" in channel) {\n const server = this.client.servers.cache.get((channel as any).serverId);\n return server?.members.cache.get(this.authorId);\n }\n return undefined;\n }\n\n /** Gets the Server ID if this message was sent in a server channel */\n public get serverId(): string | undefined {\n const channel = this.channel;\n if (channel && \"serverId\" in channel) {\n return (channel as any).serverId as string;\n }\n return undefined;\n }\n\n /** Gets the Server object from cache */\n public get server(): Server | undefined {\n const serverId = this.serverId;\n if (!serverId) return undefined;\n return this.client.servers.cache.get(serverId);\n }\n\n public _patch(data: RawMessage) {\n if (data.content !== undefined) this.content = data.content;\n if (data.edited !== undefined) this.editedAt = new Date(data.edited ?? 0);\n if (data.pinned !== undefined) this.pinned = data.pinned;\n if (data.embeds !== undefined) this.embeds = data.embeds;\n if (data.flags !== undefined) this.flags = data.flags;\n if (data.reactions !== undefined) {\n this.reactions = Array.isArray(data.reactions) ? {} : data.reactions;\n }\n\n if (data.interactions !== undefined) {\n if (data.interactions) {\n this.interactions = {\n reactions: data.interactions.reactions ?? [],\n restrictReactions: data.interactions.restrict_reactions ?? false,\n };\n } else {\n this.interactions = null;\n }\n }\n }\n\n // This tells Node.js exactly how to print this object in console.log()\n [util.inspect.custom](depth: number, options: util.InspectOptions, inspect: typeof util.inspect) {\n const { client, authorId, channelId, ...props } = this;\n\n const data = {\n ...props,\n author: this.author,\n channel: this.channel,\n server: this.server,\n member: this.member,\n };\n\n return `${this.constructor.name} ${inspect(data, { ...options, depth: depth ?? options.depth })}`;\n }\n}\n","import { Base } from \"./Base\";\nimport type { Client } from \"../client/Client\";\nimport { File } from \"stoat-api\";\n\nexport type AttachmentMetadata =\n | { type: \"File\" }\n | { type: \"Text\" }\n | { type: \"Audio\" }\n | { type: \"Image\"; width: number; height: number; thumbhash?: number[] | null; animated?: boolean | null }\n | { type: \"Video\"; width: number; height: number };\n\nexport class Attachment extends Base {\n public override id: string;\n public tag: string;\n public filename: string;\n public metadata: AttachmentMetadata;\n public contentType: string;\n public size: number;\n\n public deleted?: boolean;\n public reported?: boolean;\n public messageId?: string | null | undefined;\n public userId?: string | null | undefined;\n public serverId?: string | null | undefined;\n public objectId?: string | null | undefined;\n\n constructor(client: Client, data: File) {\n super(client, { ...data, _id: data._id });\n\n this.id = data._id;\n this.tag = data.tag;\n this.filename = data.filename;\n this.metadata = data.metadata ?? { type: \"File\" };\n this.contentType = data.content_type;\n this.size = data.size;\n\n this.deleted = data.deleted ?? false;\n this.reported = data.reported ?? false;\n this.messageId = data.message_id;\n this.userId = data.user_id;\n this.serverId = data.server_id;\n this.objectId = data.object_id;\n }\n\n /**\n * Automatically constructs the direct CDN URL for this file\n */\n public get url(): string {\n // Standard Autumn CDN format: cdn.domain.com/tag/id/filename\n return `https://cdn.stoatusercontent.com/${this.tag}/${this.id}/${this.filename}`;\n }\n\n /**\n * Helper boolean to quickly check if it's an image\n */\n public get isImage(): boolean {\n return this.metadata.type === \"Image\";\n }\n}\n","import { EventEmitter } from \"events\";\nimport { Client } from \"../client/Client\";\nimport { Collection } from \"./Collection\";\n\n/**\n * Options to be passed to a Collector\n */\nexport interface CollectorOptions<V> {\n /** The filter applied to this collector */\n filter?: (item: V, ...args: any[]) => boolean;\n /** How long to run the collector for in milliseconds */\n time?: number;\n /** How long to stop the collector after inactivity in milliseconds */\n idle?: number;\n /** Whether to dispose data when it's deleted */\n dispose?: boolean;\n}\n\n/**\n * Abstract class for defining a new Collector\n */\nexport abstract class Collector<K, V> extends EventEmitter {\n public readonly client: Client;\n public filter: (item: V, ...args: any[]) => boolean;\n public options: CollectorOptions<V>;\n public collected: Collection<K, V>;\n public ended: boolean = false;\n\n private _timeout: NodeJS.Timeout | null = null;\n private _idletimeout: NodeJS.Timeout | null = null;\n\n protected constructor(client: Client, options: CollectorOptions<V> = {}) {\n super();\n this.client = client;\n this.options = options;\n this.filter = options.filter ?? (() => true);\n this.collected = new Collection();\n\n if (options.time) {\n this._timeout = setTimeout(() => this.stop(\"time\"), options.time);\n }\n if (options.idle) {\n this._idletimeout = setTimeout(() => this.stop(\"idle\"), options.idle);\n }\n }\n\n /**\n * Evaluates an item and possibly passes it to the collector\n */\n public handleCollect(item: V, ...args: any[]) {\n if (this.ended) return;\n if (!this.filter(item, ...args)) return;\n\n const key = this.collect(item, ...args);\n if (key !== null && key !== undefined) {\n this.collected.set(key, item);\n this.emit(\"collect\", item, ...args);\n\n if (this._idletimeout) {\n clearTimeout(this._idletimeout);\n this._idletimeout = setTimeout(() => this.stop(\"idle\"), this.options.idle);\n }\n\n this.checkEnd();\n }\n }\n\n /**\n * Evaluates an item and possibly removes it from the collector\n */\n public handleDispose(item: V, ...args: any[]) {\n if (this.ended) return;\n if (!this.options.dispose) return;\n\n const key = this.dispose(item, ...args);\n if (key !== null && key !== undefined) {\n this.collected.delete(key);\n this.emit(\"dispose\", item, ...args);\n this.checkEnd();\n }\n }\n\n /**\n * Stops the collector.\n */\n public stop(reason: string = \"user\") {\n if (this.ended) return;\n this.ended = true;\n\n if (this._timeout) clearTimeout(this._timeout);\n if (this._idletimeout) clearTimeout(this._idletimeout);\n\n this.removeAllListeners(\"collect\");\n this.removeAllListeners(\"dispose\");\n\n this.emit(\"end\", this.collected, reason);\n }\n\n /**\n * Check if we should end upon collecting/disposing\n */\n public checkEnd() {\n const reason = this.endReason();\n if (reason) this.stop(reason);\n }\n\n /**\n * Check if there's a reason to end\n */\n public endReason(): string | null {\n return null;\n }\n\n /**\n * Returns a key if the item should be collected, or null to skip\n */\n public abstract collect(item: V, ...args: any[]): K | null;\n\n /**\n * Returns a key if the item should be disposed, or null to skip\n */\n public abstract dispose(item: V, ...args: any[]): K | null;\n\n /**\n * Allows iterating over collected items asynchronously.\n * @example\n * for await (const [id, message] of collector) {\n * console.log(`Received message: ${message.content}`);\n * }\n */\n public async *[Symbol.asyncIterator](): AsyncIterableIterator<[K, V]> {\n const queue: [K, V][] = [];\n let resolve: (() => void) | null = null;\n\n const onCollect = (item: V, ...args: any[]) => {\n const key = this.collect(item, ...args);\n if (key !== null && key !== undefined) {\n queue.push([key, item]);\n }\n if (resolve) {\n resolve();\n resolve = null;\n }\n };\n\n const onEnd = () => {\n if (resolve) {\n resolve();\n resolve = null;\n }\n };\n\n this.on(\"collect\", onCollect as any);\n this.on(\"end\", onEnd as any);\n\n try {\n while (true) {\n if (queue.length > 0) {\n yield queue.shift() as [K, V];\n } else if (this.ended) {\n break;\n } else {\n await new Promise<void>((res) => {\n resolve = res;\n });\n }\n }\n } finally {\n this.removeListener(\"collect\", onCollect as any);\n this.removeListener(\"end\", onEnd as any);\n }\n }\n}\n","/**\n * A utility class that extends the native JavaScript Map with Array-like methods.\n */\nexport class Collection<K, V> extends Map<K, V> {\n public limit: number;\n\n constructor(limit: number = Infinity) {\n super();\n this.limit = limit;\n }\n\n /**\n * Overrides the default set method to enforce the maximum cache size.\n */\n public override set(key: K, value: V): this {\n if (this.limit === 0) return this;\n\n if (this.size >= this.limit && !this.has(key)) {\n const oldestKey = this.keys().next().value;\n if (oldestKey !== undefined) {\n this.delete(oldestKey);\n }\n }\n\n return super.set(key, value);\n }\n\n /**\n * Finds the first item where the given function returns true.\n */\n public find(fn: (value: V, key: K, collection: this) => boolean): V | undefined {\n for (const [key, val] of this) {\n if (fn(val, key, this)) return val;\n }\n return undefined;\n }\n\n /**\n * Returns a new Collection containing only the items where the function returns true.\n */\n public filter(fn: (value: V, key: K, collection: this) => boolean): Collection<K, V> {\n const results = new Collection<K, V>();\n for (const [key, val] of this) {\n if (fn(val, key, this)) results.set(key, val);\n }\n return results;\n }\n\n /**\n * Maps each item to a new array of values.\n */\n public map<T>(fn: (value: V, key: K, collection: this) => T): T[] {\n const results: T[] = [];\n for (const [key, val] of this) {\n results.push(fn(val, key, this));\n }\n return results;\n }\n\n /**\n * Gets the very first value in the Collection (based on insertion order).\n */\n public first(): V | undefined {\n return this.values().next().value;\n }\n\n /**\n * Gets the very last value in the Collection.\n */\n public last(): V | undefined {\n const arr = Array.from(this.values());\n return arr[arr.length - 1];\n }\n\n /**\n * Checks if at least one item matches the condition.\n */\n public some(fn: (value: V, key: K, collection: this) => boolean): boolean {\n for (const [key, val] of this) {\n if (fn(val, key, this)) return true;\n }\n return false;\n }\n}\n","import { Message } from \"./Message\";\nimport { Emoji } from \"./Emoji\";\nimport { Collection } from \"../utils/Collection\";\nimport { Client } from \"../client/Client\";\nimport { User } from \"./User\";\nimport * as util from \"node:util\";\n\nexport class MessageReaction {\n public message: Message | { id: string; channelId: string };\n public emoji: Emoji | string;\n public users: Collection<string, User | { id: string }>;\n\n constructor(\n public client: Client,\n data: { message: Message | { id: string; channelId: string }; emojiId: string; users?: string[] },\n ) {\n this.message = data.message;\n // Attempt to resolve custom emojis from the cache, otherwise fallback to the string (e.g. for unicode)\n this.emoji = this.client.emojis.cache.get(data.emojiId) || data.emojiId;\n this.users = new Collection();\n\n if (data.users) {\n for (const userId of data.users) {\n const user = this.client.users.cache.get(userId) || { id: userId };\n this.users.set(userId, user as User);\n }\n }\n }\n\n public get count(): number {\n return this.users.size;\n }\n\n public async remove(): Promise<void> {\n if (this.message instanceof Message) {\n const emojiId = typeof this.emoji === \"string\" ? this.emoji : this.emoji.id;\n await this.message.removeReaction(emojiId);\n }\n }\n\n [util.inspect.custom]() {\n const data = {\n messageId: this.message.id,\n emoji: this.emoji,\n count: this.count,\n users: Array.from(this.users.keys()),\n };\n return `MessageReaction ${util.inspect(data)}`;\n }\n}\n","import { Collector, CollectorOptions } from \"./Collector\";\nimport { Message } from \"../structures/Message\";\nimport { MessageReaction } from \"../structures/MessageReaction\";\n\nexport interface ReactionCollectorOptions extends CollectorOptions<MessageReaction> {\n /** The maximum number of reactions to collect */\n max?: number;\n /** The maximum number of users to collect reactions from */\n maxUsers?: number;\n}\n\nexport class ReactionCollector extends Collector<string, MessageReaction> {\n public messageId: string;\n public total = 0;\n public users = new Set<string>();\n\n constructor(\n public message: Message,\n options: ReactionCollectorOptions = {},\n ) {\n super((message as any).client, options);\n this.messageId = message.id;\n\n const boundHandleCollect = this.handleMessageReact.bind(this);\n const boundHandleDispose = this.handleMessageUnreact.bind(this);\n\n this.client.on(\"messageReact\", boundHandleCollect);\n this.client.on(\"messageUnreact\", boundHandleDispose);\n\n this.once(\"end\", () => {\n this.client.removeListener(\"messageReact\", boundHandleCollect);\n this.client.removeListener(\"messageUnreact\", boundHandleDispose);\n });\n }\n\n public collect(reaction: MessageReaction): string | null {\n if (reaction.message.id !== this.messageId) return null;\n return typeof reaction.emoji === \"string\" ? reaction.emoji : reaction.emoji.id;\n }\n\n public dispose(reaction: MessageReaction): string | null {\n if (reaction.message.id !== this.messageId) return null;\n return typeof reaction.emoji === \"string\" ? reaction.emoji : reaction.emoji.id;\n }\n\n private handleMessageReact(message: Message | { id: string; channelId: string }, emojiId: string, userId: string) {\n if (message.id !== this.messageId) return;\n\n // Check if we already have this reaction in the collector\n let reaction = this.collected.get(emojiId);\n\n if (!reaction) {\n reaction = new MessageReaction(this.client as any, { message, emojiId, users: [userId] });\n } else {\n const user = this.client.users.cache.get(userId) || { id: userId };\n reaction.users.set(userId, user as any);\n }\n\n super.handleCollect(reaction);\n\n if (!this.ended && this.collected.has(emojiId)) {\n this.total++;\n this.users.add(userId);\n this.checkEnd();\n }\n }\n\n private handleMessageUnreact(message: Message | { id: string; channelId: string }, emojiId: string, userId: string) {\n if (message.id !== this.messageId) return;\n\n const reaction = this.collected.get(emojiId);\n if (reaction) {\n reaction.users.delete(userId);\n if (reaction.users.size === 0) {\n super.handleDispose(reaction);\n }\n }\n }\n\n public override endReason(): string | null {\n const options = this.options as ReactionCollectorOptions;\n if (options.max && this.total >= options.max) return \"limit\";\n if (options.maxUsers && this.users.size >= options.maxUsers) return \"userLimit\";\n return null;\n }\n}\n","import { Base } from \"./Base\";\nimport type { Client } from \"../client/Client\";\nimport { Attachment } from \"./Attachment\";\nimport type { User as RawUser } from \"stoat-api\";\n\nexport type UserRelationShip = \"None\" | \"User\" | \"Friend\" | \"Outgoing\" | \"Incoming\" | \"Blocked\" | \"BlockedOther\";\n\nexport interface BotInformation {\n owner: string;\n}\n\nexport type UserStatus = NonNullable<RawUser[\"status\"]>;\nexport type UserPresence = NonNullable<UserStatus[\"presence\"]>;\n\nexport interface UserProfile {\n background?: string | null;\n content?: string | null;\n}\n\nexport class User extends Base {\n public discriminator!: string;\n public online!: boolean;\n public relationship!: UserRelationShip;\n public username!: string;\n public avatar?: Attachment | null;\n public badges?: number;\n public bot!: false | BotInformation;\n public displayName?: string | null;\n public flags?: number;\n public privileged?: boolean;\n public status?: UserStatus | null;\n\n constructor(client: Client, data: RawUser) {\n super(client, data);\n this.bot = false;\n this.privileged = false;\n this.flags = 0;\n this._patch(data);\n }\n\n public _patch(data: RawUser, clear?: string[]) {\n if (data.username !== undefined) this.username = data.username;\n if (data.discriminator !== undefined) this.discriminator = data.discriminator;\n if (data.online !== undefined) this.online = data.online;\n if (data.relationship !== undefined) this.relationship = data.relationship;\n\n if (data.display_name !== undefined) this.displayName = data.display_name;\n\n if (data.badges !== undefined) this.badges = data.badges;\n if (data.flags !== undefined) this.flags = data.flags;\n if (data.privileged !== undefined) this.privileged = data.privileged ?? false;\n if (data.status !== undefined) this.status = data.status;\n\n if (data.bot !== undefined) {\n this.bot = data.bot ? { owner: data.bot.owner } : false;\n }\n\n if (data.avatar !== undefined) {\n this.avatar = data.avatar ? new Attachment(this.client, data.avatar) : null;\n }\n\n // Handle deletions gracefully\n if (clear && Array.isArray(clear)) {\n for (const field of clear) {\n if (field === \"Avatar\") this.avatar = null;\n if (field === \"StatusText\" && this.status) this.status.text = null;\n if (field === \"DisplayName\") this.displayName = null;\n }\n }\n }\n\n /**\n * Convenience getter to return the user's tag (username#discriminator)\n */\n public get tag(): string {\n return `${this.username}#${this.discriminator}`;\n }\n\n /**\n * Fetch a User to update their information\n * @param force Skip the cache check and force an API request\n * @returns The fetched User object\n * @throws Error if the user cannot be found or fetched\n * @example\n * // Fetch a user\n * await user.fetch();\n */\n public async fetch(force: boolean = false): Promise<this> {\n return (await this.client.users.fetch(this.id, force)) as this;\n }\n}\n","import { User } from \"./User\";\nimport type { Client } from \"../client/Client\";\nimport { User as RawUser } from \"stoat-api\";\n/**\n * Represents the authenticated bot's user object.\n */\nexport class ClientUser extends User {\n constructor(client: Client, data: RawUser) {\n super(client, data);\n }\n}\n","import { request } from \"undici\";\nimport { Client } from \"../client/Client\";\nimport { CDNTag } from \"../builders/AttachmentBuilder\";\nimport type { APIRoutes } from \"stoat-api\";\nimport { queryParams, RouteParams, RouteResponse, ValidPath } from \"../utils/schema\";\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Represents an independent rate limit bucket queue\n */\nclass AsyncBucket {\n public remaining: number = 1;\n public resetAt: number = 0;\n public queue: Promise<void> = Promise.resolve();\n}\n\n/**\n * Custom Error class for Stoat API failures\n */\nexport class StoatAPIError extends Error {\n public statusCode: number;\n public apiType: string;\n public location: string;\n public rawData: any;\n public method?: string | undefined;\n public path?: string | undefined;\n\n constructor(statusCode: number, data: any, method?: string, path?: string) {\n let errorMessage = \"Unknown API Error\";\n let type = \"Unknown\";\n let location = \"Unknown\";\n\n if (typeof data === \"object\" && data !== null) {\n if (\"type\" in data || \"location\" in data) {\n type = String(data.type || type);\n location = String(data.location || location);\n errorMessage = `Type: ${type} (Location: ${location})`;\n } else if (\"message\" in data) {\n errorMessage = String(data.message);\n } else {\n try {\n errorMessage = JSON.stringify(data);\n } catch {\n errorMessage = \"Unparseable Error Object\";\n }\n }\n } else if (typeof data === \"string\" && data.trim() !== \"\") {\n errorMessage = data;\n }\n\n const routeInfo = method && path ? ` on ${method.toUpperCase()} ${path}` : \"\";\n\n super(`${errorMessage}${routeInfo}`);\n\n this.name = `StoatAPIError[${statusCode}]`;\n this.statusCode = statusCode;\n this.apiType = type;\n this.location = location;\n this.rawData = data;\n this.method = method;\n this.path = path;\n\n Object.setPrototypeOf(this, StoatAPIError.prototype);\n }\n}\nconst ALL_QUERY_KEYS = new Set<string>();\nfor (const routes of Object.values(queryParams)) {\n for (const keys of Object.values(routes)) {\n for (const key of keys) {\n ALL_QUERY_KEYS.add(key);\n }\n }\n}\n\nexport class RESTManager {\n private baseURL = \"https://stoat.chat/api\";\n\n private token: string | null = null;\n\n private buckets = new Map<string, AsyncBucket>();\n\n constructor(private client: Client) {\n // Sweep dead buckets every 5 minutes to prevent memory leaks\n setInterval(() => {\n const now = Date.now();\n for (const [key, bucket] of this.buckets.entries()) {\n // If the bucket has its full limits back, drop it from memory\n if (now > bucket.resetAt && bucket.remaining > 0) {\n this.buckets.delete(key);\n }\n }\n }, 300000).unref();\n }\n\n public setToken(token: string) {\n this.token = token;\n }\n\n /**\n * Generates a local identifier for the bucket based on method and path.\n */\n private getRouteKey(method: string, endpoint: string): string {\n return `${method}:${endpoint}`;\n }\n\n public makeRequest<M extends APIRoutes[\"method\"], P extends ValidPath<M>>(\n method: M,\n endpoint: P,\n params?: RouteParams<M, P>,\n ): Promise<RouteResponse<M, P>> {\n let finalEndpoint = endpoint as string;\n let finalBody: Record<string, any> | undefined = undefined;\n\n if (params && typeof params === \"object\") {\n const query = new URLSearchParams();\n finalBody = {};\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n if (ALL_QUERY_KEYS.has(key)) {\n query.append(key, String(value));\n } else {\n finalBody[key] = value;\n }\n }\n }\n\n const qs = query.toString();\n if (qs) finalEndpoint += `?${qs}`;\n\n if (Object.keys(finalBody).length === 0) finalBody = undefined;\n }\n const routeKey = this.getRouteKey(method, finalEndpoint);\n\n return new Promise((resolve, reject) => {\n let bucket = this.buckets.get(routeKey);\n if (!bucket) {\n bucket = new AsyncBucket();\n this.buckets.set(routeKey, bucket);\n }\n\n bucket.queue = bucket.queue.then(async () => {\n try {\n // Pass the split finalEndpoint and finalBody down to your request executor\n const result = await this.execute(method, finalEndpoint, finalBody, bucket!);\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n });\n }\n\n private async execute(method: string, endpoint: string, body: any, bucket: AsyncBucket): Promise<any> {\n if (!this.token) {\n throw new Error(\"REST_NOT_READY: You must call client.login() before making API requests.\");\n }\n const url = `${this.baseURL}${endpoint}`;\n\n if (bucket.remaining <= 0 && Date.now() < bucket.resetAt) {\n const waitTime = bucket.resetAt - Date.now();\n this.client.emit(\"debug\", `Bucket [${method}:${endpoint}] exhausted. Waiting ${waitTime}ms proactively...`);\n await sleep(waitTime);\n }\n\n const options = {\n method: method as any,\n headers: {\n \"X-Bot-Token\": this.token,\n \"Content-Type\": \"application/json\",\n },\n ...(body ? { body: JSON.stringify(body) } : {}),\n };\n const response = await request(url, options);\n\n const remainingHeader = response.headers[\"x-ratelimit-remaining\"];\n const resetAfterHeader = response.headers[\"x-ratelimit-reset-after\"];\n\n if (remainingHeader !== undefined && resetAfterHeader !== undefined) {\n bucket.remaining = Number(remainingHeader);\n bucket.resetAt = Date.now() + Number(resetAfterHeader);\n }\n\n // Safely parse the body (handles cases where Cloudflare returns HTML/Text on 502s)\n const textBody = await response.body.text();\n let data;\n try {\n data = JSON.parse(textBody);\n } catch {\n data = textBody;\n }\n\n if (response.statusCode === 429) {\n const retryMs =\n typeof data === \"object\" && data?.retry_after ? data.retry_after : Number(resetAfterHeader) || 5000;\n\n this.client.emit(\"debug\", `Hit 429 on [${method}:${endpoint}]. Retrying in ${retryMs}ms.`);\n\n bucket.remaining = 0;\n bucket.resetAt = Date.now() + retryMs;\n\n await sleep(retryMs);\n\n return this.execute(method, endpoint, body, bucket);\n }\n\n if (response.statusCode >= 400) {\n throw new StoatAPIError(response.statusCode, data, method, endpoint);\n }\n\n return data as any;\n }\n\n /**\n * Uploads a file to Stoat's CDN and returns the File ID\n */\n public async uploadFile(tag: CDNTag, fileBuffer: Buffer | Blob, filename?: string): Promise<string> {\n if (!this.token) throw new Error(\"REST_NOT_READY: No token available.\");\n\n const url = `https://cdn.stoatusercontent.com/${tag}`;\n\n const formData = new FormData();\n formData.append(\"file\", new Blob([fileBuffer as Uint8Array<ArrayBuffer>]), filename);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"X-Bot-Token\": this.token,\n },\n body: formData,\n });\n\n if (!response.ok) {\n let errData;\n const errText = await response.text();\n try {\n errData = JSON.parse(errText);\n } catch {\n errData = errText;\n }\n throw new StoatAPIError(response.status, errData, \"POST\", \"/attachments\");\n }\n\n const data = (await response.json()) as { id: string };\n\n return data.id;\n }\n\n public get<P extends ValidPath<\"get\">>(\n endpoint: P,\n params?: RouteParams<\"get\", P>,\n ): Promise<RouteResponse<\"get\", P>> {\n return this.makeRequest(\"get\", endpoint, params);\n }\n\n public post<P extends ValidPath<\"post\">>(\n endpoint: P,\n params?: RouteParams<\"post\", P>,\n ): Promise<RouteResponse<\"post\", P>> {\n return this.makeRequest(\"post\", endpoint, params);\n }\n\n public patch<P extends ValidPath<\"patch\">>(\n endpoint: P,\n params?: RouteParams<\"patch\", P>,\n ): Promise<RouteResponse<\"patch\", P>> {\n return this.makeRequest(\"patch\", endpoint, params);\n }\n\n public delete<P extends ValidPath<\"delete\">>(\n endpoint: P,\n params?: RouteParams<\"delete\", P>,\n ): Promise<RouteResponse<\"delete\", P>> {\n return this.makeRequest(\"delete\", endpoint, params);\n }\n\n public put<P extends ValidPath<\"put\">>(\n endpoint: P,\n params?: RouteParams<\"put\", P>,\n ): Promise<RouteResponse<\"put\", P>> {\n return this.makeRequest(\"put\", endpoint, params);\n }\n}\n","import { APIRoutes } from \"stoat-api\";\n\n/**\n * This file was copied from https://github.com/stoatchat/javascript-client-api/blob/main/src/params.ts\n * If any new endpoints are added, they should be added here to ensure the type safety of query parameters.\n */\nexport const queryParams = {\n \"/\": { get: [] },\n \"/users/@me\": { get: [] },\n \"/users/{target}\": { get: [], patch: [] },\n \"/users/{target}/flags\": { get: [] },\n \"/users/@me/username\": { patch: [] },\n \"/users/{target}/default_avatar\": { get: [] },\n \"/users/{target}/profile\": { get: [] },\n \"/users/dms\": { get: [] },\n \"/users/{target}/dm\": { get: [] },\n \"/users/{target}/mutual\": { get: [] },\n \"/users/{target}/friend\": { put: [], delete: [] },\n \"/users/{target}/block\": { put: [], delete: [] },\n \"/users/friend\": { post: [] },\n \"/bots/create\": { post: [] },\n \"/bots/{target}/invite\": { get: [], post: [] },\n \"/bots/{bot_id}\": { get: [], delete: [], patch: [] },\n \"/bots/@me\": { get: [] },\n \"/channels/{target}/ack/{message}\": { put: [] },\n \"/channels/{target}\": { get: [], delete: [\"leave_silently\"], patch: [] },\n \"/channels/{target}/members\": { get: [] },\n \"/channels/{target}/invites\": { post: [] },\n \"/channels/{target}/messages\": { get: [\"limit\", \"before\", \"after\", \"sort\", \"nearby\", \"include_users\"], post: [] },\n \"/channels/{target}/search\": { post: [] },\n \"/channels/{target}/messages/{msg}/pin\": { post: [], delete: [] },\n \"/channels/{target}/messages/{msg}\": { get: [], delete: [], patch: [] },\n \"/channels/{target}/messages/bulk\": { delete: [] },\n \"/channels/create\": { post: [] },\n \"/channels/{group_id}/recipients/{member_id}\": { put: [], delete: [] },\n \"/channels/{target}/join_call\": { post: [] },\n \"/channels/{target}/end_ring/{target_user}\": { put: [] },\n \"/channels/{target}/permissions/{role_id}\": { put: [] },\n \"/channels/{target}/permissions/default\": { put: [] },\n \"/channels/{target}/messages/{msg}/reactions/{emoji}\": { put: [], delete: [\"user_id\", \"remove_all\"] },\n \"/channels/{target}/messages/{msg}/reactions\": { delete: [] },\n \"/channels/{channel_id}/webhooks\": { get: [], post: [] },\n \"/servers/create\": { post: [] },\n \"/servers/{target}\": { get: [\"include_channels\"], delete: [\"leave_silently\"], patch: [] },\n \"/servers/{target}/ack\": { put: [] },\n \"/servers/{server}/channels\": { post: [] },\n \"/servers/{target}/members\": { get: [\"exclude_offline\"] },\n \"/servers/{server_id}/members/{member_id}\": { get: [\"roles\"], delete: [], patch: [] },\n \"/servers/{target}/members_experimental_query\": { get: [\"query\", \"experimental_api\"] },\n \"/servers/{server}/bans/{target}\": { put: [], delete: [] },\n \"/servers/{target}/bans\": { get: [] },\n \"/servers/{target}/invites\": { get: [] },\n \"/servers/{target}/roles\": { post: [] },\n \"/servers/{target}/roles/{role_id}\": { get: [], delete: [], patch: [] },\n \"/servers/{target}/permissions/{role_id}\": { put: [] },\n \"/servers/{target}/permissions/default\": { put: [] },\n \"/servers/{target}/emojis\": { get: [] },\n \"/servers/{target}/roles/ranks\": { patch: [] },\n \"/invites/{target}\": { get: [], post: [], delete: [] },\n \"/custom/emoji/{emoji_id}\": { get: [], put: [], delete: [], patch: [] },\n \"/safety/report\": { post: [] },\n \"/auth/account/create\": { post: [] },\n \"/auth/account/reverify\": { post: [] },\n \"/auth/account/delete\": { put: [], post: [] },\n \"/auth/account/\": { get: [] },\n \"/auth/account/disable\": { post: [] },\n \"/auth/account/change/password\": { patch: [] },\n \"/auth/account/change/email\": { patch: [] },\n \"/auth/account/verify/{code}\": { post: [] },\n \"/auth/account/reset_password\": { post: [], patch: [] },\n \"/auth/session/login\": { post: [] },\n \"/auth/session/logout\": { post: [] },\n \"/auth/session/all\": { get: [], delete: [\"revoke_self\"] },\n \"/auth/session/{id}\": { delete: [], patch: [] },\n \"/auth/mfa/ticket\": { put: [] },\n \"/auth/mfa/\": { get: [] },\n \"/auth/mfa/recovery\": { post: [], patch: [] },\n \"/auth/mfa/methods\": { get: [] },\n \"/auth/mfa/totp\": { put: [], post: [], delete: [] },\n \"/onboard/hello\": { get: [] },\n \"/onboard/complete\": { post: [] },\n \"/policy/acknowledge\": { post: [] },\n \"/push/subscribe\": { post: [] },\n \"/push/unsubscribe\": { post: [] },\n \"/sync/settings/fetch\": { post: [] },\n \"/sync/settings/set\": { post: [\"timestamp\"] },\n \"/sync/unreads\": { get: [] },\n \"/webhooks/{webhook_id}/{token}/{message_id}\": { delete: [], patch: [] },\n \"/webhooks/{webhook_id}/{token}\": { get: [], post: [], delete: [], patch: [] },\n \"/webhooks/{webhook_id}\": { get: [], delete: [], patch: [] },\n \"/webhooks/{webhook_id}/{token}/github\": { post: [] },\n};\n\nexport type ValidPath<M extends APIRoutes[\"method\"]> = Extract<APIRoutes, { method: M }>[\"path\"];\n\nexport type RouteResponse<M extends APIRoutes[\"method\"], P extends string> = Extract<\n APIRoutes,\n { method: M; path: P }\n>[\"response\"];\n\nexport type RouteParams<M extends APIRoutes[\"method\"], P extends string> = Extract<\n APIRoutes,\n { method: M; path: P }\n>[\"params\"];\n","import { Collection } from \"../utils/Collection\";\nimport type { BaseChannel } from \"../structures/BaseChannel\";\nimport { Message, MessageOptions } from \"../structures/Message\";\nimport type { Client } from \"../client/Client\";\nimport * as util from \"node:util\";\nimport { BaseManager } from \"./BaseManager\";\nimport { UserResolvable } from \"./UserManager\";\nimport { resolveAttachment } from \"../utils/resolveAttachment\";\nimport { Message as RawMessage, DataMessageSend, DataEditMessage } from \"stoat-api\";\nimport { RouteParams } from \"../utils/schema\";\n\nexport type MessageResolvable = Message | string;\n\nexport interface MessageFetchOptions {\n limit?: number;\n before?: string;\n after?: string;\n sort?: \"Relevance\" | \"Latest\" | \"Oldest\";\n nearby?: string;\n includeUsers?: boolean;\n}\n\nexport class MessageManager extends BaseManager<string, Message> {\n constructor(\n client: Client,\n public channel: BaseChannel,\n limit: number = Infinity,\n ) {\n super(client, limit);\n }\n\n /**\n * Tell BaseManager how to find the ID for Messages\n */\n protected extractId(data: RawMessage): string {\n return data._id;\n }\n\n /**\n * Tell BaseManager how to build a Message\n */\n protected construct(data: RawMessage): Message {\n return new Message(this.client, data);\n }\n\n public async fetch(id: string): Promise<Message> {\n const data = await this.client.rest.get(`/channels/${this.channel.id}/messages/${id}`);\n return this._add(data);\n }\n\n /**\n * Fetches multiple messages from the channel using specific filter parameters.\n * @param options The query parameters to filter the fetched messages.\n * @returns A promise that resolves to a Collection of fetched Messages.\n * @throws {Error} If the API request fails.\n * @example\n * // Fetch the last 50 messages in the channel\n * const messages = await channel.messages.fetchMany({ limit: 50, sort: \"Latest\" });\n *\n * // Fetch 20 messages before a specific message ID\n * const history = await channel.messages.fetchMany({ limit: 20, before: \"01H...\" });\n */\n public async fetchMany(options: MessageFetchOptions = {}): Promise<Collection<string, Message>> {\n const endpoint = `/channels/${this.channel.id}/messages` as const;\n\n const query: RouteParams<\"get\", typeof endpoint> = {};\n\n if (options.limit !== undefined) query.limit = options.limit;\n if (options.before !== undefined) query.before = options.before;\n if (options.after !== undefined) query.after = options.after;\n if (options.sort !== undefined) query.sort = options.sort;\n if (options.nearby !== undefined) query.nearby = options.nearby;\n if (options.includeUsers !== undefined) query.include_users = options.includeUsers;\n\n const data = await this.client.rest.get(endpoint, query);\n\n let rawMessages: RawMessage[];\n\n if (Array.isArray(data)) {\n rawMessages = data;\n } else {\n rawMessages = data.messages;\n\n if (data.users) {\n for (const userData of data.users) {\n this.client.users._add(userData);\n }\n }\n if (data.members && this.channel.isText()) {\n const serverId = this.channel.serverId;\n const server = await this.client.servers.fetch(serverId);\n for (const memberData of data.members) {\n server.members._add(memberData);\n }\n }\n }\n\n const fetched = new Collection<string, Message>();\n\n for (const rawMsg of rawMessages) {\n const msg = this._add(rawMsg);\n fetched.set(msg.id, msg);\n }\n\n return fetched;\n }\n\n public resolveId(message: MessageResolvable): string {\n if (typeof message === \"string\") return message;\n if (message instanceof Message) return message.id;\n throw new Error(\"Invalid MessageResolvable: must be a Message object or a string ID.\");\n }\n\n /**\n * Sends a new message to this channel.\n * @param contentOrOptions The string content or message options payload.\n * @returns A promise that resolves to the sent Message.\n */\n public async send(contentOrOptions: MessageOptions | string): Promise<Message> {\n const opts = typeof contentOrOptions === \"string\" ? { content: contentOrOptions } : contentOrOptions;\n\n const payload: DataMessageSend = {};\n\n if (opts.embeds && opts.embeds.length) {\n payload.embeds = opts.embeds.map((embed: any) => (typeof embed.toJSON === \"function\" ? embed.toJSON() : embed));\n }\n if (opts.attachments && opts.attachments.length > 0) {\n const resolved = await Promise.all(\n opts.attachments.map((attachment) => resolveAttachment(this.client.rest, attachment, \"attachments\")),\n );\n\n const validAttachments = resolved.filter((id): id is string => id !== undefined);\n\n if (validAttachments.length > 0) {\n payload.attachments = validAttachments;\n }\n }\n\n const data = await this.client.rest.post(`/channels/${this.channel.id}/messages`, payload);\n\n return new Message(this.client, data);\n }\n\n /**\n * Edits an existing message.\n * @param message The MessageResolvable (object or ID) to edit.\n * @param contentOrOptions The new content or options.\n * @returns A promise that resolves to the updated Message.\n */\n public async edit(message: MessageResolvable, contentOrOptions: string | MessageOptions): Promise<Message> {\n const id = this.resolveId(message);\n\n const opts = typeof contentOrOptions === \"string\" ? { content: contentOrOptions } : contentOrOptions;\n\n const payload: DataEditMessage = {};\n\n if (opts.content !== undefined) {\n payload.content = opts.content;\n }\n\n if (opts.embeds !== undefined) {\n if (opts.embeds === null) {\n payload.embeds = [];\n } else {\n payload.embeds = opts.embeds.map((embed) => (\"toJSON\" in embed ? embed.toJSON() : embed));\n }\n }\n\n const data = await this.client.rest.patch(`/channels/${this.channel.id}/messages/${id}`, payload);\n\n return this._add(data);\n }\n\n /**\n * Deletes a message from the channel.\n * @param message The MessageResolvable to delete.\n */\n public async delete(message: MessageResolvable): Promise<void> {\n const id = this.resolveId(message);\n await this.client.rest.delete(`/channels/${this.channel.id}/messages/${id}`);\n this.cache.delete(id);\n }\n\n /**\n * Pins a message in the channel.\n * @param message The MessageResolvable to pin.\n */\n public async pin(message: MessageResolvable): Promise<void> {\n const id = this.resolveId(message);\n await this.client.rest.post(`/channels/${this.channel.id}/messages/${id}/pin`);\n\n const existing = this.cache.get(id);\n if (existing) existing.pinned = true;\n }\n\n /**\n * Unpins a message in the channel.\n * @param message The MessageResolvable to unpin.\n */\n public async unpin(message: MessageResolvable): Promise<void> {\n const id = this.resolveId(message);\n await this.client.rest.delete(`/channels/${this.channel.id}/messages/${id}/pin`);\n\n const existing = this.cache.get(id);\n if (existing) existing.pinned = false;\n }\n\n /**\n * React to a message\n * @param message The MessageResolvable to react to.\n * @param reaction The emoji to react with. Can be a Unicode emoji or a custom emoji ID.\n * @throws {Error} If the API request fails.\n * @example\n * await channel.messages.react(messageId, \"👍\");\n * await channel.messages.react(messageId, \"customEmojiId\");\n */\n public async react(message: MessageResolvable, reaction: string): Promise<void> {\n const id = this.resolveId(message);\n await this.client.rest.put(`/channels/${this.channel.id}/messages/${id}/reactions/${encodeURIComponent(reaction)}`);\n }\n\n /**\n * Remove a reaction(s) from a message\n * Requires ManageMessages if changing others' reactions.\n * @param reaction The emoji to remove. Can be a unicode emoji or a custom emoji ID.\n * @param message The MessageResolvable to remove the reaction from.\n * @param userId The ID of the user whose reaction to remove. If not provided, removes the current user's reaction.\n * @param removeAll Remove all reactions of this type.\n * @throws {Error} If both userId and removeAll are provided, or if the API request fails.\n * @example\n * // Remove the current user's reaction\n * await channel.messages.removeReaction(messageId, \"👍\");\n * // Remove a specific user's reaction\n * await channel.messages.removeReaction(messageId, \"👍\", userId);\n * // Remove all reactions of this type\n * await channel.messages.removeReaction(messageId, \"👍\", undefined, true);\n */\n public async removeReaction(\n message: MessageResolvable,\n reaction: string,\n userId?: UserResolvable,\n removeAll?: boolean,\n ): Promise<void> {\n const id = this.resolveId(message);\n const targetUser = userId ? this.client.users.resolveId(userId) : undefined;\n\n const endpoint = `/channels/${this.channel.id}/messages/${id}/reactions/${reaction}` as const;\n\n const query: RouteParams<\"delete\", typeof endpoint> = {};\n\n if (targetUser) {\n query.user_id = targetUser;\n } else if (removeAll) {\n query.remove_all = true;\n }\n\n await this.client.rest.delete(endpoint, query);\n }\n\n /**\n * Remove all reactions from a message\n * Requires ManageMessages permission.\n * @param message The MessageResolvable to clear reactions from.\n * @throws {Error} If the API request fails.\n * @example\n * await channel.messages.clearReactions(messageId);\n */\n public async clearReactions(message: MessageResolvable): Promise<void> {\n const id = this.resolveId(message);\n await this.client.rest.delete(`/channels/${this.channel.id}/messages/${id}/reactions`);\n }\n\n [util.inspect.custom]() {\n return this.cache;\n }\n}\n","import { Collection } from \"../utils/Collection\";\nimport type { Client } from \"../client/Client\";\n\n/**\n * @template K The type of the cache keys (usually string)\n * @template Holds The type of the Structure this manager holds\n */\nexport abstract class BaseManager<K, Holds> {\n public cache: Collection<K, Holds>;\n public client: Client;\n\n protected constructor(client: Client, limit: number = Infinity) {\n this.client = client;\n this.cache = new Collection<K, Holds>(limit);\n }\n\n /**\n * Defines how to extract the unique ID from a raw API payload.\n * @internal\n */\n protected abstract extractId(data: any): K;\n\n /**\n * Defines how to construct a new instance of the Structure.\n * @internal\n */\n protected abstract construct(data: any): Holds;\n\n /**\n * Transforms raw data into a Structure, patches if existing, and saves to cache.\n * @internal\n */\n _add(data: any): Holds {\n const id = this.extractId(data);\n const existing = this.cache.get(id);\n\n if (existing && typeof (existing as any)._patch === \"function\") {\n (existing as any)._patch(data);\n return existing;\n }\n\n const structure = this.construct(data);\n this.cache.set(id, structure);\n\n return structure;\n }\n}\n","import type { RESTManager } from \"../rest/RESTManager\";\n\nexport type CDNTag = \"attachments\" | \"avatars\" | \"backgrounds\" | \"icons\" | \"banners\" | \"emojis\";\n\nexport class AttachmentBuilder {\n // Filename for CDN to use, optional but recommended\n public readonly filename: string | undefined = undefined;\n public readonly file: Buffer | Blob;\n\n /**\n * Creates a new AttachmentBuilder with the given file and optional filename.\n * @param file The file data as a Buffer or Blob.\n * @param filename An optional filename to use for the uploaded file. If not provided, the CDN will assign a default name.\n * Providing a filename can help with organization and debugging, but is not strictly required.\n * @example\n * // Create an attachment from a Buffer with a custom filename\n * const buffer = Buffer.from(\"Hello, world!\");\n * const attachment = new AttachmentBuilder(buffer, \"greeting.txt\");\n */\n constructor(file: Buffer | Blob, filename?: string) {\n this.filename = filename;\n this.file = file;\n }\n\n /**\n * Uploads this attachment to the Stoat CDN and returns the resulting file ID.\n * @internal — use `resolveAttachment()` instead of calling this directly.\n */\n public async upload(rest: RESTManager, tag: CDNTag): Promise<string> {\n return rest.uploadFile(tag, this.file, this.filename);\n }\n}\n","import type { RESTManager } from \"../rest/RESTManager\";\nimport { AttachmentBuilder, CDNTag } from \"../builders/AttachmentBuilder\";\n\n/**\n * Accepts a raw CDN file ID string or an AttachmentBuilder.\n * If given a builder, uploads the file and returns the resulting ID.\n * If given null/undefined, passes through unchanged.\n */\nexport async function resolveAttachment(\n rest: RESTManager,\n value: string | AttachmentBuilder | null | undefined,\n tag: CDNTag,\n): Promise<string | null | undefined> {\n if (value instanceof AttachmentBuilder) {\n return value.upload(rest, tag);\n }\n return value;\n}\n","import { Collector, CollectorOptions } from \"./Collector\";\nimport { Message } from \"../structures/Message\";\nimport { BaseChannel } from \"../structures/BaseChannel\";\n\n/**\n * Options to be passed to a MessageCollector\n */\nexport interface MessageCollectorOptions extends CollectorOptions<Message> {\n /** The maximum number of messages to collect */\n max?: number;\n /** The maximum number of messages to process (both matching and non-matching the filter) */\n maxProcessed?: number;\n}\n\n/**\n * Collects messages on a channel.\n */\nexport class MessageCollector extends Collector<string, Message> {\n public channelId: string;\n public total = 0;\n public processed = 0;\n\n constructor(\n public channel: BaseChannel,\n options: MessageCollectorOptions = {},\n ) {\n super((channel as any).client, options);\n this.channelId = channel.id;\n\n const boundHandleCollect = this.handleCollect.bind(this);\n const boundHandleDispose = this.handleDispose.bind(this) as any;\n\n this.client.on(\"messageCreate\", boundHandleCollect);\n this.client.on(\"messageDelete\", boundHandleDispose);\n\n this.once(\"end\", () => {\n this.client.removeListener(\"messageCreate\", boundHandleCollect);\n this.client.removeListener(\"messageDelete\", boundHandleDispose);\n });\n }\n\n public override collect(message: Message): string | null {\n if (message.channelId !== this.channelId) return null;\n return message.id;\n }\n\n public override dispose(message: Message | { id: string; channelId: string }): string | null {\n if (message.channelId !== this.channelId) return null;\n return message.id;\n }\n\n public override handleCollect(message: Message) {\n if (message.channelId !== this.channelId) return;\n this.processed++;\n super.handleCollect(message);\n if (!this.ended && this.collected.has(message.id)) {\n this.total++;\n this.checkEnd();\n }\n }\n\n public override endReason(): string | null {\n const options = this.options as MessageCollectorOptions;\n if (options.max && this.total >= options.max) return \"limit\";\n if (options.maxProcessed && this.processed >= options.maxProcessed) return \"processedLimit\";\n return null;\n }\n}\n","import { Base } from \"./Base\";\nimport type { Client } from \"../client/Client\";\nimport type { TextChannel } from \"./TextChannel\";\nimport { MessageFetchOptions, MessageManager, MessageResolvable } from \"../managers/MessageManager\";\nimport { Message, MessageOptions } from \"./Message\";\nimport { DMChannel } from \"./DMChannel\";\nimport { GroupChannel } from \"./GroupChannel\";\nimport { ChannelEditOptions } from \"../managers/ChannelManager\";\nimport { Collection } from \"../utils/Collection\";\nimport { MessageCollector, MessageCollectorOptions } from \"../utils/MessageCollector\";\nimport { Channel as RawChannel } from \"stoat-api\";\n\nexport type ChannelType = \"SavedMessages\" | \"DirectMessage\" | \"Group\" | \"TextChannel\";\n\nexport interface ChannelCreateOptions {\n name: string;\n type: \"Text\" | \"Voice\";\n description?: string;\n nsfw?: boolean;\n voice?: {\n max_users?: number;\n };\n}\n\nexport abstract class BaseChannel extends Base {\n public type: ChannelType;\n public messages: MessageManager;\n\n protected constructor(client: Client, data: RawChannel) {\n super(client, data);\n this.type = data.channel_type;\n\n this.messages = new MessageManager(this.client, this);\n }\n\n /**\n * Sends a message to this channel.\n * @param contentOrOptions The string content or message options payload.\n * @returns A promise that resolves to the sent Message.\n * @example\n * await channel.send(\"Hello world!\");\n * await channel.send({ content: \"Here is an embed\", embeds: [myEmbed] });\n */\n public async send(contentOrOptions: string | MessageOptions): Promise<Message> {\n return this.messages.send(contentOrOptions);\n }\n\n /**\n * Fetch this channel\n * @param force Whether to skip the cache check and force a direct API request. Defaults to false\n * @throws {Error} If the API request fails\n * @returns {BaseChannel}\n * @example\n * // Force fetch channel to update its data\n * await channel.fetch(true);\n */\n public async fetch(force: boolean = false): Promise<BaseChannel> {\n return await this.client.channels.fetch(this.id, force);\n }\n\n /**\n * Fetches multiple messages from this channel.\n * @param options The query parameters to filter the messages.\n * @throws {Error} If the API request fails\n * @returns A Collection of Messages, keyed by their ID.\n * @example\n * // Fetch the last 50 messages in the channel\n * const messages = await channel.fetchMessages({ limit: 50 });\n * console.log(`Fetched ${messages.size} messages`);\n * // Fetch messages before a specific message ID\n * const messages = await channel.fetchMessages({ before: \"MESSAGE_ID\" });\n * console.log(`Fetched ${messages.size} messages sent before the specified message`);\n * // Fetch messages after a specific message ID\n * const messages = await channel.fetchMessages({ after: \"MESSAGE_ID\" });\n * console.log(`Fetched ${messages.size} messages sent after the specified message`);\n * // Fetch messages around a specific message ID\n * const messages = await channel.fetchMessages({ around: \"MESSAGE_ID\", limit: 10 });\n * console.log(`Fetched ${messages.size} messages sent around the specified message`);\n */\n public async fetchMessages(options?: MessageFetchOptions): Promise<Collection<string, Message>> {\n return this.messages.fetchMany(options);\n }\n\n /**\n * Edits this channel.\n * @param options The fields to update\n * @throws {Error} If the API request fails\n * @returns BaseChannel\n * @example\n * // Edit the channel's name\n * await channel.edit({name: \"New Cool Name\"});\n */\n public async edit(options: ChannelEditOptions): Promise<BaseChannel> {\n return await this.client.channels.edit(this.id, options);\n }\n\n /**\n * Deletes this channel.\n * @throws {Error} If the API request fails\n * @example\n * // Delete the channel\n * await channel.delete();\n */\n public async delete(): Promise<void> {\n await this.client.channels.delete(this.id);\n }\n\n /**\n * Bulk delete messages from this channel\n * @param messages MessageResolvable to delete\n * @throws {Error} If the API request fails\n * @example\n * // Delete messages by their ID's\n * await channel.bulkDelete([\"MESSAGE_ID_1\", \"MESSAGE_ID_2\", \"MESSAGE_ID_3\"]);\n * // Delete messages by their Message objects\n * await channel.bulkDelete([message1, message2, message3]);\n */\n public async bulkDelete(messages: MessageResolvable[]): Promise<void> {\n await this.client.channels.bulkDelete(this.id, messages);\n }\n\n /**\n * Creates a MessageCollector to collect messages in this channel.\n * @param options The options for the collector.\n * @returns The instantiated MessageCollector\n * @example\n * const collector = channel.createMessageCollector({ filter: m => m.authorId === '123', time: 15000 });\n * collector.on('collect', m => console.log(`Collected ${m.content}`));\n * collector.on('end', collected => console.log(`Collected ${collected.size} items`));\n */\n public createMessageCollector(options?: MessageCollectorOptions): MessageCollector {\n return new MessageCollector(this, options);\n }\n\n /**\n * Awaits messages in this channel that meet certain criteria.\n * @param options The options for the collector.\n * @returns A promise that resolves to a collection of messages.\n * @example\n * // Await !vote messages\n * const filter = m => m.content.startsWith('!vote');\n * channel.awaitMessages({ filter, max: 4, time: 60000 })\n * .then(collected => console.log(collected.size))\n * .catch(console.error);\n */\n public awaitMessages(options: MessageCollectorOptions = {}): Promise<Collection<string, Message>> {\n return new Promise((resolve, reject) => {\n const collector = this.createMessageCollector(options);\n\n collector.once(\"end\", (collected, reason) => {\n if (options.max && reason !== \"limit\" && reason !== \"time\") {\n return reject(new Error(`Collector ended with reason: ${reason}`));\n }\n\n resolve(collected);\n });\n });\n }\n\n public isText(): this is TextChannel {\n return this.type === \"TextChannel\";\n }\n\n public isDM(): this is DMChannel {\n return this.type === \"DirectMessage\";\n }\n\n public isGroup(): this is GroupChannel {\n return this.type === \"Group\";\n }\n}\n","import { BaseChannel } from \"./BaseChannel\";\nimport { Client } from \"../client/Client\";\nimport { Attachment } from \"./Attachment\";\nimport { PermissionResolvable } from \"../utils/permissions\";\nimport { ChannelRolePermissionOptions } from \"../managers/ChannelManager\";\nimport type { Channel as RawChannel } from \"stoat-api\";\n\nexport type RawTextChannel = Extract<RawChannel, { channel_type: \"TextChannel\" }>;\n\nexport class TextChannel extends BaseChannel {\n public name!: string;\n public serverId!: string;\n public defaultPermissions?: { a: number; d: number } | null | undefined;\n public description?: string | null | undefined;\n public icon?: Attachment | null;\n public lastMessageId?: string | null | undefined;\n public nsfw?: boolean;\n public slowmode?: number;\n public voice?: any;\n\n constructor(client: Client, data: RawTextChannel) {\n super(client, data);\n this.serverId = data.server;\n this.defaultPermissions = data.default_permissions;\n this.description = data.description;\n if (data.icon !== undefined) {\n this.icon = data.icon ? new Attachment(this.client, data.icon) : null;\n }\n this.lastMessageId = data.last_message_id;\n this.nsfw = data.nsfw ?? false;\n this.slowmode = data.slowmode ?? 0;\n this.voice = data.voice;\n this._patch(data);\n }\n\n public _patch(data: RawTextChannel, clear?: string[]) {\n if (data.name !== undefined) this.name = data.name;\n if (data.description !== undefined) this.description = data.description;\n\n if (clear && Array.isArray(clear)) {\n for (const field of clear) {\n switch (field) {\n case \"Description\":\n this.description = null;\n break;\n case \"Icon\":\n this.icon = null;\n break;\n case \"DefaultPermissions\":\n this.defaultPermissions = data.default_permissions;\n break;\n case \"Voice\":\n this.voice = data.voice;\n break;\n }\n }\n }\n }\n\n /**\n * Updates the permission overrides for the channel.\n * @param roleId The raw string ID of the role to update.\n * @param options The allow and deny permissions to set.\n * @returns A promise that resolves to the updated BaseChannel.\n * @throws {TypeError} If the channel is not a Server Channel, or options are invalid.\n * @throws {Error} If the API request fails.\n * @example\n * // Deny a role the ability to send messages in this channel\n * await channel.setRolePermissions(\"ROLE_ID\", { deny: [\"SendMessage\"] });\n */\n public async setRolePermissions(roleId: string, options: ChannelRolePermissionOptions): Promise<this> {\n return (await this.client.channels.setRolePermissions(this.id, roleId, options)) as this;\n }\n\n /**\n * Updates the default (everyone) permissions for this channel.\n * @param permissions The default permissions to grant globally in this channel.\n * @returns A promise that resolves to the updated BaseChannel.\n * @throws {TypeError} If invalid permissions are provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Set the default permission to allow everyone to view the channel\n * await channel.setDefaultPermissions([\"ViewChannel\", \"ReadMessageHistory\"]);\n */\n public async setDefaultPermissions(permissions: PermissionResolvable): Promise<this> {\n return (await this.client.channels.setDefaultPermissions(this.id, permissions)) as this;\n }\n\n /**\n * Edits the category of this channel. Only applicable to server channels.\n * @param category The ID of the category to move this channel into, or \"default\" to remove from any category.\n * @returns The updated TextChannel with the new category.\n * @throws {Error} If the channel is not a server channel, if the category is not found in the server, or if the API request fails.\n * @example\n * // Move this channel into a category\n * await channel.setCategory(\"CATEGORY_ID\");\n * // Remove this channel from its category\n * await channel.setCategory(\"default\");\n */\n public async setCategory(category: string): Promise<TextChannel> {\n const serverId = this.serverId as string;\n const server = await this.client.servers.fetch(serverId);\n\n if (!server.categories || server.categories.length === 0) {\n throw new Error(\"This server has no categories to move the channel into.\");\n }\n\n const categories = server.categories.map((c) => ({\n id: c.id,\n title: c.title,\n channels: [...c.channels],\n }));\n\n for (const cat of categories) {\n cat.channels = cat.channels.filter((id) => id !== this.id);\n }\n\n if (category !== \"default\") {\n const targetCategory = categories.find((c) => c.id === category);\n if (!targetCategory) {\n throw new Error(`Category ${category} not found in server.`);\n }\n targetCategory.channels.push(this.id);\n }\n\n await this.client.servers.edit(serverId, { categories });\n\n return this;\n }\n\n /**\n * Sets the position of this channel within its current category.\n * @param position The new index position for the channel within its category.\n * @returns The updated TextChannel.\n * @throws {Error} If the channel is not in a category, or if the API request fails.\n * @example\n * // Move channel to the top of its category\n * await channel.setPosition(0);\n */\n public async setPosition(position: number): Promise<TextChannel> {\n const serverId = this.serverId as string;\n const server = await this.client.servers.fetch(serverId);\n\n if (!server.categories || server.categories.length === 0) {\n throw new Error(\"This server has no categories to move the channel into.\");\n }\n\n const categories = server.categories.map((c) => ({\n id: c.id,\n title: c.title,\n channels: [...c.channels],\n }));\n\n const currentCategory = categories.find((c) => c.channels.includes(this.id));\n\n if (!currentCategory) {\n throw new Error(\"This channel is not currently inside any category.\");\n }\n\n currentCategory.channels = currentCategory.channels.filter((id) => id !== this.id);\n\n const safePosition = Math.max(0, Math.min(position, currentCategory.channels.length));\n currentCategory.channels.splice(safePosition, 0, this.id);\n\n await this.client.servers.edit(serverId, { categories });\n\n return this;\n }\n\n /**\n * Edit the description of this channel\n * @param description\n * @throws {Error} If the API request fails\n * @returns The updated TextChannel\n * @example\n * // Set the channel description\n * await channel.setDescription(\"This is a channel about cats!\");\n * // Remove the channel description\n * await channel.setDescription(null);\n */\n public async setDescription(description: string | null): Promise<TextChannel> {\n await this.edit({ description });\n return this;\n }\n\n /**\n * Edit the name of this channel\n * @param name\n * @throws {Error} If the API request fails\n * @returns The updated TextChannel\n * @example\n * await channel.setName(\"New Name\");\n */\n public async setName(name: string): Promise<TextChannel> {\n await this.edit({ name });\n return this;\n }\n\n /**\n * Set whether this channel is NSFW\n * @param nsfw\n * @throws {Error} If the API request fails\n * @returns The updated TextChannel\n * @example\n * // Mark the channel as NSFW\n * await channel.setNSFW(true);\n * // Mark the channel as SFW\n * await channel.setNSFW(false);\n */\n public async setNSFW(nsfw: boolean): Promise<TextChannel> {\n await this.edit({ nsfw });\n return this;\n }\n\n /**\n * Set the channel slowmode in seconds\n * @param slowmode\n * @throws {Error} If the API request fails\n * @returns The updated TextChannel\n * @example\n * // Set the slowmode to 5 seconds\n * await channel.setSlowmode(5);\n * // Remove slowmode\n * await channel.setSlowmode(0);\n */\n public async setSlowmode(slowmode: number): Promise<TextChannel> {\n await this.edit({ slowmode });\n return this;\n }\n\n /**\n * Set the channel Icon\n * @param id Autumn ID to use\n * @throws {Error} If the API request fails\n * @returns The updated TextChannel\n * @example\n * await channel.setIcon(\"123\");\n * // Remove the channel icon\n * await channel.setIcon(null);\n */\n public async setIcon(id: string | null): Promise<TextChannel> {\n await this.edit({ icon: id });\n return this;\n }\n}\n","import { BaseChannel } from \"./BaseChannel\";\nimport type { Client } from \"../client/Client\";\nimport type { Channel as RawChannel } from \"stoat-api\";\n/**\n * A fallback class for channel types that are not yet officially supported by the library.\n */\nexport class UnknownChannel extends BaseChannel {\n constructor(client: Client, data: RawChannel) {\n super(client, data);\n }\n}\n","import { BaseChannel } from \"./BaseChannel\";\nimport { Client } from \"../client/Client\";\nimport { Channel as RawChannel } from \"stoat-api\";\n\nexport type RawDMChannel = Extract<RawChannel, { channel_type: \"DirectMessage\" }>;\n\nexport class DMChannel extends BaseChannel {\n public active: boolean = false;\n public recipients: string[] = [];\n public lastMessageId: string | null = null;\n\n constructor(client: Client, data: RawDMChannel) {\n super(client, data);\n }\n\n public _patch(data: RawDMChannel): void {\n if (data.active !== undefined) this.active = data.active;\n if (data.recipients !== undefined) this.recipients = data.recipients;\n if (data.last_message_id !== undefined) this.lastMessageId = data.last_message_id;\n }\n}\n","import { Client } from \"../client/Client\";\nimport { Attachment } from \"./Attachment\";\nimport { BaseChannel } from \"./BaseChannel\";\nimport type { User } from \"./User\";\nimport * as util from \"node:util\";\nimport { PermissionResolvable } from \"../utils/permissions\";\nimport type { Channel as RawChannel } from \"stoat-api\";\n\nexport type RawGroupChannel = Extract<RawChannel, { channel_type: \"Group\" }>;\n\nexport class GroupChannel extends BaseChannel {\n public name!: string;\n public ownerId!: string;\n public recipients: string[] = [];\n public description?: string | null = null;\n public icon: Attachment | null = null;\n public lastMessageId?: string | null = null;\n public nsfw: boolean = false;\n\n constructor(client: Client, data: RawGroupChannel) {\n super(client, data);\n this._patch(data);\n }\n\n public _patch(data: RawGroupChannel, clear?: string[]) {\n if (data.name !== undefined) this.name = data.name;\n if (data.owner !== undefined) this.ownerId = data.owner;\n if (data.recipients !== undefined) this.recipients = data.recipients;\n if (data.description !== undefined) this.description = data.description;\n if (data.last_message_id !== undefined) this.lastMessageId = data.last_message_id;\n if (data.nsfw !== undefined) this.nsfw = data.nsfw;\n\n if (data.icon !== undefined) {\n this.icon = data.icon ? new Attachment(this.client, data.icon) : null;\n }\n\n if (clear && Array.isArray(clear)) {\n for (const field of clear) {\n switch (field) {\n case \"Name\":\n this.name = \"\";\n break;\n case \"Description\":\n this.description = null;\n break;\n case \"Icon\":\n this.icon = null;\n break;\n }\n }\n }\n }\n\n /** Gets the User object of the person who owns this group */\n public get owner(): User | undefined {\n return this.client.users.cache.get(this.ownerId);\n }\n\n /** Resolves the recipient IDs into an array of cached User objects */\n public get recipientUsers(): User[] {\n return this.recipients\n .map((id) => this.client.users.cache.get(id))\n .filter((user): user is User => user !== undefined);\n }\n\n /**\n * Updates the default (everyone) permissions for this channel.\n * @param permissions The default permissions to grant globally in this channel.\n * @returns A promise that resolves to the updated BaseChannel.\n * @throws {TypeError} If invalid permissions are provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Set the default permission to allow everyone to view the channel\n * await channel.setDefaultPermissions([\"ViewChannel\", \"ReadMessageHistory\"]);\n */\n public async setDefaultPermissions(permissions: PermissionResolvable): Promise<this> {\n return (await this.client.channels.setDefaultPermissions(this.id, permissions)) as this;\n }\n\n [util.inspect.custom](_depth: number, options: util.InspectOptions, inspect: typeof util.inspect) {\n const { client, ...props } = this;\n return `${this.constructor.name} ${inspect(\n {\n ...props,\n owner: this.owner,\n recipientUsers: this.recipientUsers,\n },\n options,\n )}`;\n }\n}\n","import { TextChannel } from \"../structures/TextChannel\";\nimport { BaseChannel } from \"../structures/BaseChannel\";\nimport type { Client } from \"../client/Client\";\nimport { UnknownChannel } from \"../structures/UnknownChannel\";\nimport { DMChannel } from \"../structures/DMChannel\";\nimport { GroupChannel } from \"../structures/GroupChannel\";\nimport { Channel as RawChannel } from \"stoat-api\";\n\nexport function createChannel(client: Client, data: RawChannel): BaseChannel {\n switch (data.channel_type) {\n case \"TextChannel\":\n return new TextChannel(client, data);\n case \"DirectMessage\":\n return new DMChannel(client, data);\n case \"Group\":\n return new GroupChannel(client, data);\n default:\n client.emit(\"debug\", `Received unknown channel type: ${data.channel_type}`);\n return new UnknownChannel(client, data);\n }\n}\n","export type BitFieldResolvable = number | string | bigint | BitField | BitFieldResolvable[];\n\nexport class BitField {\n public static Flags: Record<string, number | bigint> = {};\n public static DefaultBit: number | bigint = 0;\n\n public bitfield: number | bigint;\n\n constructor(bits?: BitFieldResolvable) {\n this.bitfield = (this.constructor as typeof BitField).resolve(\n bits ?? (this.constructor as typeof BitField).DefaultBit,\n );\n }\n\n /**\n * Checks whether this bitfield has any of the given bits set.\n *\n * @param bit The bit(s) to test against.\n * @returns `true` if at least one of the provided bits is set.\n *\n * @example\n * perms.any(['SendMessage', 'ManageChannel']); // true if either is set\n */\n public any(bit: BitFieldResolvable): boolean {\n const resolved = (this.constructor as typeof BitField).resolve(bit);\n if (typeof this.bitfield === \"bigint\" && typeof resolved === \"bigint\") {\n return (this.bitfield & resolved) !== BigInt(0);\n }\n return (Number(this.bitfield) & Number(resolved)) !== 0;\n }\n\n /**\n * Checks whether this bitfield is exactly equal to the given bit value.\n *\n * @param bit The bit(s) to compare against.\n * @returns `true` if the resolved bit value is identical to this bitfield.\n *\n * @example\n * new Permissions(0n).equals(0n); // true\n */\n public equals(bit: BitFieldResolvable): boolean {\n return this.bitfield === (this.constructor as typeof BitField).resolve(bit);\n }\n\n /**\n * Checks whether this bitfield has *all* of the given bits set.\n *\n * @param bit The bit(s) to check for.\n * @returns `true` if every provided bit is set in this bitfield.\n *\n * @example\n * perms.has('SendMessage');\n * perms.has(['SendMessage', 'ViewChannel']); // true only if both are set\n */\n public has(bit: BitFieldResolvable, ..._hasParams: any[]): boolean {\n const resolvedBit = (this.constructor as typeof BitField).resolve(bit);\n if (typeof this.bitfield === \"bigint\" && typeof resolvedBit === \"bigint\") {\n return (this.bitfield & resolvedBit) === resolvedBit;\n }\n return (Number(this.bitfield) & Number(resolvedBit)) === Number(resolvedBit);\n }\n\n /**\n * Returns the flag names present in `bits` that are *missing* from this bitfield.\n *\n * @param bits The bits to check against.\n * @returns An array of flag name strings that are in `bits` but not in this bitfield.\n *\n * @example\n * // If perms only has SendMessage:\n * perms.missing(['SendMessage', 'ManageChannel']); // ['ManageChannel']\n */\n public missing(bits: BitFieldResolvable, ...hasParams: any[]): string[] {\n return new (this.constructor as typeof BitField)(bits).remove(this).toArray(...hasParams);\n }\n\n /**\n * Freezes this BitField instance, making it immutable.\n * Subsequent calls to `add()` or `remove()` will return a new instance instead of mutating this one.\n *\n * @returns This instance, frozen.\n */\n public freeze(): Readonly<this> {\n return Object.freeze(this);\n }\n\n /**\n * Adds one or more bits to this bitfield.\n * If the instance is frozen, returns a new BitField with the bits added.\n *\n * @param bits The bit(s) to add.\n * @returns This instance (or a new one if frozen), with the bits added.\n *\n * @example\n * perms.add('SendMessage', 'ViewChannel');\n */\n public add(...bits: BitFieldResolvable[]): this {\n let total = (this.constructor as typeof BitField).DefaultBit;\n for (const bit of bits) {\n const resolved = (this.constructor as typeof BitField).resolve(bit);\n if (typeof total === \"bigint\" && typeof resolved === \"bigint\") {\n total |= resolved;\n } else {\n total = Number(total) | Number(resolved);\n }\n }\n if (typeof this.bitfield === \"bigint\" && typeof total === \"bigint\") {\n if (Object.isFrozen(this)) return new (this.constructor as typeof BitField)(this.bitfield | total) as this;\n this.bitfield |= total;\n } else {\n if (Object.isFrozen(this))\n return new (this.constructor as typeof BitField)(Number(this.bitfield) | Number(total)) as this;\n this.bitfield = Number(this.bitfield) | Number(total);\n }\n return this;\n }\n\n /**\n * Removes one or more bits from this bitfield.\n * If the instance is frozen, returns a new BitField with the bits removed.\n *\n * @param bits The bit(s) to remove.\n * @returns This instance (or a new one if frozen), with the bits cleared.\n *\n * @example\n * perms.remove('ManageChannel');\n */\n public remove(...bits: BitFieldResolvable[]): this {\n let total = (this.constructor as typeof BitField).DefaultBit;\n for (const bit of bits) {\n const resolved = (this.constructor as typeof BitField).resolve(bit);\n if (typeof total === \"bigint\" && typeof resolved === \"bigint\") {\n total |= resolved;\n } else {\n total = Number(total) | Number(resolved);\n }\n }\n if (typeof this.bitfield === \"bigint\" && typeof total === \"bigint\") {\n if (Object.isFrozen(this)) return new (this.constructor as typeof BitField)(this.bitfield & ~total) as this;\n this.bitfield &= ~total;\n } else {\n if (Object.isFrozen(this))\n return new (this.constructor as typeof BitField)(Number(this.bitfield) & ~Number(total)) as this;\n this.bitfield = Number(this.bitfield) & ~Number(total);\n }\n return this;\n }\n\n /**\n * Serializes this bitfield to a plain object mapping each flag name to a boolean\n * indicating whether that flag is set.\n *\n * @returns A record of `{ [flagName]: boolean }` for all defined flags.\n *\n * @example\n * perms.serialize();\n * // { SendMessage: true, ManageChannel: false, ... }\n */\n public serialize(...hasParams: any[]): Record<string, boolean> {\n const serialized: Record<string, boolean> = {};\n for (const [flag, bit] of Object.entries((this.constructor as typeof BitField).Flags)) {\n if (isNaN(Number(flag))) serialized[flag] = this.has(bit, ...hasParams);\n }\n return serialized;\n }\n\n /**\n * Returns an array of flag names that are set in this bitfield.\n *\n * @returns An array of string flag names.\n *\n * @example\n * perms.toArray(); // ['SendMessage', 'ViewChannel']\n */\n public toArray(...hasParams: any[]): string[] {\n return [...this[Symbol.iterator](...hasParams)];\n }\n\n /**\n * Returns the bitfield value as a JSON-safe primitive.\n * Numbers are returned as-is; bigints are converted to their string representation\n * to avoid JSON serialization errors.\n */\n public toJSON(): number | string {\n return typeof this.bitfield === \"number\" ? this.bitfield : this.bitfield.toString();\n }\n\n /**\n * Returns the underlying numeric value of this bitfield.\n * Allows BitField instances to be used directly in arithmetic expressions.\n */\n public valueOf(): number | bigint {\n return this.bitfield;\n }\n\n /**\n * Iterates over the names of all flags that are set in this bitfield.\n *\n * @example\n * for (const flag of perms) {\n * console.log(flag); // 'SendMessage', 'ViewChannel', etc.\n * }\n */\n public *[Symbol.iterator](...hasParams: any[]): IterableIterator<string> {\n for (const bitName of Object.keys((this.constructor as typeof BitField).Flags)) {\n if (isNaN(Number(bitName)) && this.has(bitName, ...hasParams)) yield bitName;\n }\n }\n\n /**\n * Resolves a {@link BitFieldResolvable} into a raw `number | bigint`.\n *\n * Resolution rules (in order):\n * - `undefined` → `DefaultBit`\n * - A number or bigint matching `DefaultBit`'s type and >= 0 → returned as-is\n * - A `BitField` instance → its `.bitfield` value\n * - An array → each element resolved and OR'd together\n * - A numeric string → parsed as `BigInt` or `Number` depending on `DefaultBit`'s type\n * - A named string flag → looked up in `Flags`\n * - Anything else → throws `RangeError`\n *\n * @param bit The value to resolve.\n * @throws {RangeError} If the value cannot be resolved to a valid bit.\n */\n public static resolve(bit?: BitFieldResolvable): number | bigint {\n const { DefaultBit } = this;\n if (bit === undefined) return DefaultBit;\n if (typeof DefaultBit === typeof bit && (bit as any) >= DefaultBit) return bit as number | bigint;\n if (bit instanceof BitField) return bit.bitfield;\n if (Array.isArray(bit)) {\n return bit\n .map((b: BitFieldResolvable) => this.resolve(b))\n .reduce((prev: number | bigint, b: number | bigint) => {\n if (typeof prev === \"bigint\" && typeof b === \"bigint\") return prev | b;\n return Number(prev) | Number(b);\n }, DefaultBit);\n }\n\n if (typeof bit === \"string\") {\n if (!isNaN(Number(bit))) return typeof DefaultBit === \"bigint\" ? BigInt(bit) : Number(bit);\n if (this.Flags[bit] !== undefined) return this.Flags[bit];\n }\n\n throw new RangeError(`Invalid bitfield flag or number: ${String(bit)}`);\n }\n}\n","import { BitField } from \"./BitField\";\n\nexport const PermissionFlags = {\n // Server permissions\n ManageChannel: 1n << 0n,\n ManageServer: 1n << 1n,\n ManagePermissions: 1n << 2n,\n ManageRole: 1n << 3n,\n ManageCustomisation: 1n << 4n,\n\n // Member permissions\n KickMembers: 1n << 6n,\n BanMembers: 1n << 7n,\n TimeoutMembers: 1n << 8n,\n AssignRoles: 1n << 9n,\n ChangeNickname: 1n << 10n,\n ManageNicknames: 1n << 11n,\n ChangeAvatar: 1n << 12n,\n RemoveAvatars: 1n << 13n,\n\n // Channel permissions\n ViewChannel: 1n << 20n,\n ReadMessageHistory: 1n << 21n,\n SendMessage: 1n << 22n,\n ManageMessages: 1n << 23n,\n ManageWebhooks: 1n << 24n,\n InviteOthers: 1n << 25n,\n SendEmbeds: 1n << 26n,\n UploadFiles: 1n << 27n,\n Masquerade: 1n << 28n,\n React: 1n << 29n,\n BypassSlowmode: 1n << 39n,\n\n // Voice permissions\n Connect: 1n << 30n,\n Speak: 1n << 31n,\n Video: 1n << 32n,\n MuteMembers: 1n << 33n,\n DeafenMembers: 1n << 34n,\n MoveMembers: 1n << 35n,\n Listen: 1n << 36n,\n\n // Channel permissions (Part 2)\n MentionEveryone: 1n << 37n,\n MentionRoles: 1n << 38n,\n\n // Grant all\n GrantAllSafe: 0x000fffffffffffffn,\n} as const;\n\nexport type PermissionString = keyof typeof PermissionFlags;\nexport type PermissionResolvable = PermissionString | bigint | number | Permissions | PermissionResolvable[];\n\nexport class Permissions extends BitField {\n public static override Flags = PermissionFlags as unknown as Record<string, number | bigint>;\n public static override DefaultBit = 0n;\n\n public static override resolve(bit?: PermissionResolvable): bigint {\n return super.resolve(bit) as bigint;\n }\n\n public override has(bit: PermissionResolvable): boolean {\n return super.has(bit);\n }\n\n public override any(bit: PermissionResolvable): boolean {\n return super.any(bit);\n }\n\n public override missing(bits: PermissionResolvable): PermissionString[] {\n return super.missing(bits) as PermissionString[];\n }\n\n public override add(...bits: PermissionResolvable[]): this {\n return super.add(...bits);\n }\n\n public override remove(...bits: PermissionResolvable[]): this {\n return super.remove(...bits);\n }\n}\n","import { BaseChannel } from \"../structures/BaseChannel\";\nimport { createChannel } from \"../utils/ChannelFactory\";\nimport type { Client } from \"../client/Client\";\nimport { TextChannel } from \"../structures/TextChannel\";\nimport { DMChannel } from \"../structures/DMChannel\";\nimport { GroupChannel } from \"../structures/GroupChannel\";\nimport { Permissions, type PermissionResolvable } from \"../utils/permissions\";\nimport { BaseManager } from \"./BaseManager\";\nimport { MessageResolvable } from \"./MessageManager\";\nimport { AttachmentBuilder } from \"../builders/AttachmentBuilder\";\nimport { resolveAttachment } from \"../utils/resolveAttachment\";\nimport {\n Channel as RawChannel,\n DataEditChannel,\n FieldsChannel,\n DataSetRolePermissions,\n DataDefaultChannelPermissions,\n} from \"stoat-api\";\n\nexport type ChannelResolvable = BaseChannel | string;\n\nexport interface ChannelEditOptions {\n name?: string;\n description?: string | null;\n owner?: string;\n icon?: string | AttachmentBuilder | null;\n nsfw?: boolean;\n archived?: boolean;\n voice?: { max_users: number };\n slowmode?: number;\n}\n\nexport interface ChannelRolePermissionOptions {\n allow?: PermissionResolvable;\n deny?: PermissionResolvable;\n}\n\nexport class ChannelManager extends BaseManager<string, BaseChannel> {\n /**\n * Manages API methods and caching for all channels globally.\n * @param client The active Client instance.\n * @param limit The maximum number of channels to hold in the cache.\n */\n constructor(client: Client, limit: number = Infinity) {\n super(client, limit);\n }\n\n protected extractId(data: RawChannel): string {\n return data._id;\n }\n\n protected construct(data: RawChannel): BaseChannel {\n return createChannel(this.client, data);\n }\n\n /**\n * Resolves a ChannelResolvable to a cached BaseChannel object.\n * @param channel The ChannelResolvable to resolve.\n * @returns The resolved BaseChannel, or undefined if not cached.\n */\n public resolve(channel: ChannelResolvable): BaseChannel | undefined {\n if (channel instanceof BaseChannel) return channel;\n\n if (typeof channel === \"string\") {\n const id = channel.replace(/[<#>]/g, \"\");\n return this.cache.get(id);\n }\n\n return undefined;\n }\n\n public resolveText(channel: ChannelResolvable): TextChannel | undefined {\n const resolved = this.resolve(channel);\n return resolved?.isText() ? resolved : undefined;\n }\n\n public resolveDM(channel: ChannelResolvable): DMChannel | undefined {\n const resolved = this.resolve(channel);\n return resolved?.isDM() ? resolved : undefined;\n }\n\n public resolveGroup(channel: ChannelResolvable): GroupChannel | undefined {\n const resolved = this.resolve(channel);\n return resolved?.isGroup() ? resolved : undefined;\n }\n\n /**\n * Extracts ID from a ChannelResolvable.\n * @param channel The ChannelResolvable to extract the ID from.\n * @returns The extracted channel ID.\n * @throws {TypeError} If an invalid type is provided.\n */\n public resolveId(channel: ChannelResolvable): string {\n if (channel instanceof BaseChannel) {\n return channel.id;\n }\n\n if (typeof channel === \"string\") {\n return channel.replace(/[<#>]/g, \"\");\n }\n\n throw new TypeError(\"Invalid ChannelResolvable provided. Expected a BaseChannel object or a string ID/Mention.\");\n }\n\n /**\n * Fetches a Channel from the API or resolves it from the local cache.\n * @param channel The ID, mention, or Channel object to fetch.\n * @param force Whether to skip the cache check and force a direct API request. Defaults to false.\n * @returns A promise that resolves to the fetched BaseChannel object.\n * @throws {TypeError} If an invalid ChannelResolvable is provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Fetch a channel, bypassing cache\n * const channel = await client.channels.fetch(\"01H...\");\n */\n public async fetch(channel: ChannelResolvable, force: boolean = false): Promise<BaseChannel> {\n if (!force) {\n const cached = this.resolve(channel);\n if (cached) return cached;\n }\n\n const id = this.resolveId(channel);\n const data = await this.client.rest.get(`/channels/${id}`);\n\n return this._add(data);\n }\n\n /**\n * Edits a channel in the server.\n * @param channel The ChannelResolvable to edit.\n * @param options The fields to update.\n * @returns A promise that resolves to the updated BaseChannel.\n * @throws {TypeError} If invalid options or ChannelResolvable are provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Update channel name and remove its description\n * await client.channels.edit(\"01H...\", { name: \"general\", description: null });\n */\n public async edit(channel: ChannelResolvable, options: ChannelEditOptions): Promise<BaseChannel> {\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"ChannelEditOptions must be a valid object.\");\n }\n\n const payload: DataEditChannel = {};\n const remove: FieldsChannel[] = [];\n\n if (options.name !== undefined) payload.name = options.name;\n if (options.owner !== undefined) payload.owner = options.owner;\n if (options.nsfw !== undefined) payload.nsfw = options.nsfw;\n if (options.archived !== undefined) payload.archived = options.archived;\n if (options.voice !== undefined) payload.voice = options.voice;\n if (options.slowmode !== undefined) payload.slowmode = options.slowmode;\n\n if (options.description !== undefined) {\n if (options.description === null) remove.push(\"Description\");\n else payload.description = options.description;\n }\n\n if (options.icon !== undefined) {\n if (options.icon === null) {\n remove.push(\"Icon\");\n } else {\n const resolvedIcon = await resolveAttachment(this.client.rest, options.icon, \"icons\");\n\n if (resolvedIcon !== undefined) {\n payload.icon = resolvedIcon;\n }\n }\n }\n\n if (remove.length > 0) payload.remove = remove;\n if (Object.keys(payload).length === 0) return this.fetch(channel);\n\n const data = await this.client.rest.patch(`/channels/${this.resolveId(channel)}`, payload);\n return this._add(data);\n }\n\n /**\n * Updates the permission overrides for a specific role in a channel.\n * @param channel The ChannelResolvable to update permissions for.\n * @param roleId The raw string ID of the role to update.\n * @param options The allow and deny permissions to set.\n * @returns A promise that resolves to the updated BaseChannel.\n * @throws {TypeError} If the channel is not a Server Channel, or options are invalid.\n * @throws {Error} If the API request fails.\n * @example\n * // Deny a role the ability to send messages in this channel\n * await client.channels.setRolePermissions(channel, \"ROLE_ID\", { deny: [\"SendMessage\"] });\n */\n public async setRolePermissions(\n channel: ChannelResolvable,\n roleId: string,\n options: ChannelRolePermissionOptions,\n ): Promise<BaseChannel> {\n const resolved = this.resolve(channel);\n if (resolved && !resolved.isText()) {\n throw new TypeError(\"Role permissions can only be set on Server Channels.\");\n }\n\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"ChannelRolePermissionOptions must be a valid object.\");\n }\n\n const id = this.resolveId(channel);\n const allowBigInt = options.allow !== undefined ? Permissions.resolve(options.allow) : 0n;\n const denyBigInt = options.deny !== undefined ? Permissions.resolve(options.deny) : 0n;\n\n const payload: DataSetRolePermissions = {\n permissions: {\n allow: Number(allowBigInt),\n deny: Number(denyBigInt),\n },\n };\n\n const data = await this.client.rest.put(`/channels/${id}/permissions/${roleId}`, payload);\n return this._add(data);\n }\n\n /**\n * Updates the default (everyone) permissions for a channel.\n * @param channel The ChannelResolvable to update permissions for.\n * @param permissions The default permissions to grant globally in this channel.\n * @returns A promise that resolves to the updated BaseChannel.\n * @throws {TypeError} If invalid permissions are provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Set the default permission to allow everyone to view the channel\n * await client.channels.setDefaultPermissions(channel, [\"ViewChannel\", \"ReadMessageHistory\"]);\n */\n public async setDefaultPermissions(\n channel: ChannelResolvable,\n permissions: PermissionResolvable,\n ): Promise<BaseChannel> {\n const resolved = this.resolve(channel);\n if (resolved && resolved.isDM()) {\n throw new TypeError(\"Default permissions cannot be set on Direct Message channels.\");\n }\n\n const id = this.resolveId(channel);\n const permBigInt = Permissions.resolve(permissions);\n\n const payload: DataDefaultChannelPermissions = {\n permissions: Number(permBigInt),\n };\n\n const data = await this.client.rest.put(`/channels/${id}/permissions/default`, payload);\n return this._add(data);\n }\n\n /**\n * Deletes a server channel, leaves a group, or closes a DM.\n * @param channel The channel object, raw ID, or mention string to delete.\n * @returns A promise that resolves when the action is successful.\n * @throws {Error} If the API request fails.\n * @example\n * await client.channels.delete(\"01H...\");\n */\n public async delete(channel: ChannelResolvable): Promise<void> {\n const id = this.resolveId(channel);\n await this.client.rest.delete(`/channels/${id}`);\n this.cache.delete(id);\n }\n\n /**\n * Pin a message\n * @param id Channel ID\n * @param messageId Message ID\n * @throws {Error} If the API request fails.\n * @example\n * await client.channels.pin(\"CHANNEL_ID\", \"MESSAGE_ID\");\n */\n public async pin(id: string, messageId: string): Promise<void> {\n await this.client.rest.post(`/channels/${id}/messages/${messageId}/pin`);\n }\n\n /**\n * Unpin a message\n * @param id Channel ID\n * @param messageId Message ID\n * @throws {Error} If the API request fails\n * @example\n * await client.channels.unpin(\"CHANNEL_ID\", \"MESSAGE_ID\");\n */\n public async unpin(id: string, messageId: string): Promise<void> {\n await this.client.rest.delete(`/channels/${id}/pins/${messageId}`);\n }\n\n /**\n * Bulk delete up to 100 messages\n * @param id Channel ID\n * @param messages An array of MessageResolvable\n * @throws {Error} If the API request fails\n * @example\n * await client.channels.bulkDelete(\"CHANNEL_ID\", [\"MESSAGE_ID_1\", \"MESSAGE_ID_2\", \"MESSAGE_ID_3\"]);\n */\n public async bulkDelete(id: string, messages: MessageResolvable[]): Promise<void> {\n if (!Array.isArray(messages) || messages.length === 0 || messages.length > 100) {\n throw new TypeError(\"Messages must be an array of 1-100 MessageResolvable items.\");\n }\n\n const messageIds = messages.map((msg) => {\n if (typeof msg === \"string\") return msg.replace(/[<#>]/g, \"\");\n if (\"id\" in msg) return msg.id;\n throw new TypeError(\"Invalid MessageResolvable provided. Expected a Message object or a string ID/Mention.\");\n });\n\n await this.client.rest.delete(`/channels/${id}/messages/bulk`, { ids: messageIds });\n }\n}\n","import { Base } from \"./Base\";\nimport type { Client } from \"../client/Client\";\nimport type { User } from \"./User\";\nimport type { Server } from \"./Server\";\nimport { Permissions, PermissionFlags } from \"../utils/permissions\";\nimport * as util from \"node:util\";\nimport { MemberBanOptions, MemberEditOptions } from \"../managers/MemberManager\";\nimport { MemberRoleManager } from \"../managers/MemberRoleManager\";\nimport { StoatCDN } from \"../utils/Constants\";\nimport { Attachment } from \"./Attachment\";\nimport { Message, MessageOptions } from \"./Message\";\nimport { Member as RawMember } from \"stoat-api\";\n\n/**\n * Represents a member of a server on Stoat\n *\n * @extends {Base}\n */\nexport class Member extends Base {\n // The server ID the member is in\n public serverId!: string;\n // The nickname the member has in the server, if any.\n public nickname: string | null = null;\n // The avatar the member has in the server, if any.\n public avatar: Attachment | null = null;\n /** @internal */\n private _roles: string[] = [];\n // The date the member joined the server\n public joinedAt!: Date;\n // The date the member's timeout expires, or null if not timed out\n public timeout: Date | null = null;\n // Whatever the user can talk in Voice Chat\n public canPublish: boolean = false;\n // Whatever the user can hear in Voice Chat\n public canRecieve: boolean = false;\n // Member roles manager\n public roles: MemberRoleManager;\n\n constructor(client: Client, data: RawMember, serverId?: string) {\n super(client, { _id: data._id?.user });\n\n // 1. Try to get it from the API payload's _id object\n // 2. Fallback to the ID passed from the Manager\n this.serverId = data._id?.server ?? serverId;\n\n this.joinedAt = new Date(data.joined_at);\n this.roles = new MemberRoleManager(this);\n\n this._patch(data);\n }\n\n _patch(data: RawMember) {\n if (data.nickname !== undefined) this.nickname = data.nickname;\n if (data.avatar !== undefined) this.avatar = data.avatar ? new Attachment(this.client, data.avatar) : null;\n if (data.roles !== undefined) this._roles = data.roles;\n if (data.timeout !== undefined) this.timeout = data.timeout ? new Date(data.timeout) : null;\n if (data.can_publish !== undefined) this.canPublish = data.can_publish;\n if (data.can_receive !== undefined) this.canRecieve = data.can_receive;\n }\n\n /**\n * Get member role IDs\n */\n public get roleIds(): string[] {\n return this._roles;\n }\n\n /** Gets the global User object for this member */\n public get user(): User | undefined {\n return this.client.users.cache.get(this.id);\n }\n\n /** Gets the Server object this member belongs to */\n public get server(): Server | undefined {\n return this.client.servers.cache.get(this.serverId);\n }\n\n /** Calculates the member's total permissions using BigInt */\n public get permissions(): Permissions {\n const server = this.server;\n if (!server) return new Permissions(0n);\n\n if (server.ownerId === this.id) {\n return new Permissions(PermissionFlags.GrantAllSafe);\n }\n\n let totalPerms = server.defaultPermissions ?? 0n;\n\n for (const role of this.roles.cache.values()) {\n totalPerms |= BigInt(role.permissions.bitfield);\n }\n\n return new Permissions(totalPerms);\n }\n\n /** Get avatar URL for this member, or null if they don't have one.\n * @example\n * // Get a member's avatar URL\n * const avatarURL = member.avatarURL;\n * console.log(avatarURL); // https://cdn.stoat.chat/attachments/avatars/1234567890/avatar.png\n */\n public get avatarURL(): string | null {\n if (!this.avatar) return null;\n return `${StoatCDN}/attachments/avatars/${this.avatar.id}/${this.avatar.filename}`;\n }\n\n /**\n * Ban this member from the server.\n * @param options The options for this ban\n * @example\n * // Ban a member with a reason and delete their messages from the last hour\n * await member.ban({ reason: \"Spamming\", deleteMessageSeconds: 3600 });\n */\n public async ban(options?: MemberBanOptions): Promise<void> {\n let server = this.server;\n if (!server) server = await this.client.servers.fetch(this.serverId);\n\n await server.members.ban(this.id, options);\n }\n\n /**\n * Creates a DM channel between the client's user and this member.\n * @param force If true, forces the creation of a new DM channel even if one already exists.\n * @returns A promise that resolves to the created DMChannel object.\n * @throws {Error} If the API request fails.\n * @example\n * // Create a DM with this member\n * const dm = await member.createDM();\n * console.log(`DM channel ID: ${dm.id}`);\n */\n public async createDM(force: boolean = false): Promise<void> {\n await this.client.users.createDM(this.id, { force });\n }\n\n /**\n * Timeout this member for a specified duration.\n * @param duration The duration of the timeout in milliseconds.\n * @example\n * // Timeout a member for 10 minutes (600,000 milliseconds)\n * await member.setTimeout(600000);\n */\n public async setTimeout(duration: number): Promise<void> {\n await this.edit({ timeout: new Date(Date.now() + duration).toISOString() });\n }\n\n /**\n * Send a message to this member.\n * @param options The content or options for the message to send.\n * @returns A promise that resolves to the sent Message object.\n * @throws {Error} If the API request fails.\n * @example\n * // Send a message to this member\n * const message = await member.send(\"Hello!\");\n * console.log(`Sent message ID: ${message.id}`);\n */\n public async send(options: string | MessageOptions): Promise<Message> {\n let dmChannel = await this.client.users.createDM(this.id);\n return dmChannel.messages.send(options);\n }\n\n public async setNickname(nickname: string): Promise<Member> {\n return this.edit({ nickname });\n }\n\n /**\n * Edit this member.\n * @param options The options to edit the member with (nickname, roles, timeout, etc.)\n * @returns A promise that resolves to the updated Member.\n */\n public async edit(options: MemberEditOptions): Promise<Member> {\n let server = this.server;\n if (!server) server = await this.client.servers.fetch(this.serverId);\n\n return await server.members.edit(this.id, options);\n }\n\n /**\n * When concatenated with a string, this automatically returns the user's mention instead of the GuildMember object.\n * @returns {string}\n * @example\n * // Logs: Hello from <@01JE2MM759J5D7CHJF084R7MJ2>!\n * console.log(`Hello from ${member}!`);\n */\n public override toString(): string {\n return `<@${this.id}>`;\n }\n\n /**\n * Kick this member from the server.\n */\n public async kick(): Promise<void> {\n let server = this.server;\n if (!server) server = await this.client.servers.fetch(this.serverId);\n\n await server.members.kick(this.id);\n }\n\n /** @internal */\n [util.inspect.custom](depth: number, options: util.InspectOptions, inspect: typeof util.inspect) {\n const { client, serverId, ...props } = this;\n return `${this.constructor.name} ${inspect(\n {\n ...props,\n user: this.user,\n permissions: this.permissions,\n },\n { ...options, depth: depth ?? options.depth },\n )}`;\n }\n}\n","import type { Member } from \"../structures/Member\";\nimport type { Role } from \"../structures/Role\";\nimport { Collection } from \"../utils/Collection\";\nimport type { RoleResolvable } from \"./RoleManager\";\n\nexport class MemberRoleManager {\n public member: Member;\n constructor(member: Member) {\n this.member = member;\n }\n\n /**\n * Gets a Collection of the actual Role objects this member has.\n * This dynamically pulls from the Server's role cache so references are always up to date\n */\n public get cache(): Collection<string, Role> {\n const fetched = new Collection<string, Role>();\n const server = this.member.server;\n\n if (!server) return fetched;\n\n for (const roleId of this.member.roleIds) {\n const role = server.roles.cache.get(roleId);\n if (role) fetched.set(role.id, role);\n }\n\n return fetched;\n }\n\n /**\n * Checks if the member has a specific role.\n * @param role The RoleResolvable to check for.\n */\n public has(role: RoleResolvable): boolean {\n const server = this.member.server;\n if (!server) return false;\n\n const id = server.roles.resolveId(role);\n return this.member.roleIds.includes(id);\n }\n\n /**\n * Adds a role to the member.\n * @param role The RoleResolvable to add.\n * @returns A promise that resolves to the updated Member.\n */\n public async add(role: RoleResolvable): Promise<Member> {\n const server = this.member.server;\n if (!server) throw new Error(\"Server not cached, cannot add role.\");\n\n const id = server.roles.resolveId(role);\n\n if (this.member.roleIds.includes(id)) return this.member;\n\n const newRoles = [...this.member.roleIds, id];\n\n return this.member.edit({ roles: newRoles });\n }\n\n /**\n * Removes a role from the member.\n * @param role The RoleResolvable to remove.\n * @returns A promise that resolves to the updated Member.\n */\n public async remove(role: RoleResolvable): Promise<Member> {\n const server = this.member.server;\n if (!server) throw new Error(\"Server not cached, cannot remove role.\");\n\n const id = server.roles.resolveId(role);\n\n if (!this.member.roleIds.includes(id)) return this.member;\n\n const newRoles = this.member.roleIds.filter((rId) => rId !== id);\n\n return this.member.edit({ roles: newRoles });\n }\n\n /**\n * Overwrites all roles on the member with a completely new array.\n * @param roles An array of RoleResolvables.\n * @returns A promise that resolves to the updated Member.\n */\n public async set(roles: RoleResolvable[]): Promise<Member> {\n const server = this.member.server;\n if (!server) throw new Error(\"Server not cached, cannot set roles.\");\n\n const newRoles = roles.map((r) => server.roles.resolveId(r));\n\n return this.member.edit({ roles: newRoles });\n }\n}\n","export const StoatCDN = \"https://cdn.stoatusercontent.com\";\nexport const StoatAPI = \"https://stoat.chat/api\";\n","import { Member } from \"../structures/Member\";\nimport { Collection } from \"../utils/Collection\";\nimport type { Client } from \"../client/Client\";\nimport type { Server } from \"../structures/Server\";\nimport * as util from \"node:util\";\nimport { User } from \"../structures/User\";\nimport { BaseManager } from \"./BaseManager\";\nimport { DataMemberEdit, FieldsMember, Member as RawMember, DataBanCreate } from \"stoat-api\";\nimport { RouteParams } from \"../utils/schema\";\n\nexport type MemberResolvable = Member | User | string;\n\nexport interface MemberEditOptions {\n nickname?: string | null;\n avatar?: string | null;\n roles?: string[];\n timeout?: string | null;\n}\n\nexport interface MemberBanOptions {\n reason?: string | null;\n deleteMessageSeconds?: number;\n}\n\nexport interface FetchMembersOptions {\n /** Whether to exclude offline users from the fetch */\n excludeOffline?: boolean;\n}\n\nexport class MemberManager extends BaseManager<string, Member> {\n constructor(\n client: Client,\n public server: Server,\n limit: number = Infinity,\n ) {\n super(client, limit);\n }\n\n /**\n * Tell BaseManager how to handle Revolt's Member IDs\n * @internal\n */\n protected extractId(data: RawMember): string {\n return data._id?.user;\n }\n\n /**\n * Tell BaseManager how to build a Member\n * @internal\n */\n protected construct(data: RawMember): Member {\n return new Member(this.client, data, this.server.id);\n }\n\n /**\n * Resolve a string or mention to Member\n * @param member The MemberResolvable to resolve\n * @returns The resolved Member or undefined if not found\n */\n public resolve(member: MemberResolvable): Member | undefined {\n if (member instanceof Member) return member;\n if (member instanceof User) return this.cache.get(member.id);\n if (typeof member === \"string\") return this.cache.get(member.replace(/[<@>]/g, \"\"));\n return undefined;\n }\n\n /**\n * Resolve a Member to their ID string.\n * @param member The MemberResolvable to resolve\n * @returns The resolved ID string\n * @throws {TypeError} If the provided resolvable is invalid\n */\n public resolveId(member: MemberResolvable): string {\n if (typeof member === \"string\") return member.replace(/[<@>]/g, \"\");\n if (\"id\" in member) return member.id;\n throw new TypeError(\"Invalid MemberResolvable provided.\");\n }\n\n /**\n * Fetches a member from the server, or returns the cached version if available and not forced.\n * @param member The MemberResolvable to fetch\n * @param force Whether to bypass the cache and fetch fresh data from the API\n * @returns A promise that resolves to the fetched Member\n * @throws {Error} If the API request fails or the member is not found\n * @example\n * // Fetch a member by ID, using cache if available\n * const member = await server.members.fetch(\"1234567890\");\n *\n * // Fetch a member by mention, bypassing cache\n * const member = await server.members.fetch(\"<@1234567890>\", true);\n */\n public async fetch(member: MemberResolvable, force: boolean = false): Promise<Member> {\n if (!force) {\n const cached = this.resolve(member);\n if (cached) return cached;\n }\n\n const id = this.resolveId(member);\n const data = await this.client.rest.get(`/servers/${this.server.id}/members/${id}`);\n\n return this._add(data);\n }\n\n /**\n * Fetches multiple members from the server.\n * @param options Filter options for the fetch request.\n * @returns A promise that resolves to a Collection of fetched Members.\n * @throws {Error} If the API request fails.\n * @example\n * // Fetch all members in the server\n * const allMembers = await server.members.fetchMany();\n *\n * // Fetch only online members to save bandwidth\n * const onlineMembers = await server.members.fetchMany({ exclude_offline: true });\n */\n public async fetchMany(options: FetchMembersOptions = {}): Promise<Collection<string, Member>> {\n const query: RouteParams<\"get\", `/servers/${string}/members`> = {};\n\n if (options.excludeOffline !== undefined) {\n query.exclude_offline = options.excludeOffline;\n }\n\n const data = await this.client.rest.get(`/servers/${this.server.id}/members`, query);\n\n if (data.users) {\n for (const userData of data.users) {\n this.client.users._add(userData);\n }\n }\n\n const fetched = new Collection<string, Member>();\n\n if (data.members) {\n for (const rawMember of data.members) {\n const member = this._add(rawMember);\n fetched.set(member.id, member);\n }\n }\n\n return fetched;\n }\n\n /**\n * Edits a member in the server.\n * @param member The MemberResolvable to edit.\n * @param options The fields to update (nickname, roles, timeout, etc.).\n * @returns A promise that resolves to the updated Member.\n * @throws {Error} If the API request fails or the member is not found.\n * @example\n * // Change a member's nickname and add a role\n * const updatedMember = await server.members.edit(\"1234567890\", {\n * nickname: \"New Nickname\",\n * roles: [\"roleId1\", \"roleId2\"],\n * });\n */\n public async edit(member: MemberResolvable, options: MemberEditOptions): Promise<Member> {\n const id = this.resolveId(member);\n const payload: DataMemberEdit = {};\n const remove: FieldsMember[] = [];\n\n if (options.nickname !== undefined) {\n if (options.nickname === null) remove.push(\"Nickname\");\n else payload.nickname = options.nickname;\n }\n\n if (options.avatar !== undefined) {\n if (options.avatar === null) remove.push(\"Avatar\");\n else payload.avatar = options.avatar;\n }\n\n if (options.roles !== undefined) payload.roles = options.roles;\n if (options.timeout !== undefined) {\n if (options.timeout === null) remove.push(\"Timeout\");\n else payload.timeout = options.timeout;\n }\n\n if (remove.length > 0) payload.remove = remove;\n if (Object.keys(payload).length === 0) return this.fetch(id);\n\n const data = await this.client.rest.patch(`/servers/${this.server.id}/members/${id}`, payload);\n return this._add(data);\n }\n\n /**\n * Kicks a member from the server.\n * @param member The MemberResolvable to kick.\n * @example\n * // Kick a member by ID\n * await server.members.kick(\"1234567890\");\n */\n public async kick(member: MemberResolvable): Promise<void> {\n const id = this.resolveId(member);\n await this.client.rest.delete(`/servers/${this.server.id}/members/${id}`);\n this.cache.delete(id);\n }\n\n /**\n * Bans a member from the server.\n * @param member The MemberResolvable to ban.\n * @param options The ban options\n * @example\n * // Ban a member by ID\n * await server.members.ban(\"1234567890\", { reason: \"Spamming\", deleteMessageSeconds: 3600 });\n */\n public async ban(member: MemberResolvable, options?: MemberBanOptions): Promise<void> {\n const id = this.resolveId(member);\n const payload: DataBanCreate = {};\n\n if (options?.reason !== undefined) payload.reason = options.reason;\n if (options?.deleteMessageSeconds !== undefined) payload.delete_message_seconds = options.deleteMessageSeconds;\n\n await this.client.rest.put(`/servers/${this.server.id}/bans/${id}`, payload);\n this.cache.delete(id);\n }\n\n /**\n * Unbans a user from the server\n * @param member The MemberResolvable to unban\n * @example\n * // Unban a member by ID\n * await server.members.unban(\"1234567890\");\n */\n public async unban(member: MemberResolvable): Promise<void> {\n const id = this.resolveId(member);\n await this.client.rest.delete(`/servers/${this.server.id}/bans/${id}`);\n }\n\n [util.inspect.custom]() {\n return this.cache;\n }\n}\n","import { Collection } from \"../utils/Collection\";\nimport type { BaseChannel, ChannelCreateOptions } from \"../structures/BaseChannel\";\nimport type { Server } from \"../structures/Server\";\nimport type { Client } from \"../client/Client\";\nimport * as util from \"node:util\";\nimport { DataCreateServerChannel } from \"stoat-api\";\n\nexport class ServerChannelManager {\n public client: Client;\n public server: Server;\n\n constructor(client: Client, server: Server) {\n this.client = client;\n this.server = server;\n }\n\n public get cache(): Collection<string, BaseChannel> {\n return this.client.channels.cache.filter((channel) => (channel as any).serverId === this.server.id);\n }\n\n /**\n * Creates a new channel within this server.\n * @param options The configuration for the new channel.\n * @returns The newly created Channel object.\n */\n public async create(options: ChannelCreateOptions): Promise<BaseChannel> {\n if (!options.name) throw new Error(\"A channel name must be provided.\");\n\n const payload: DataCreateServerChannel = {\n name: options.name,\n };\n\n if (options.nsfw !== undefined) {\n payload.nsfw = options.nsfw;\n }\n\n if (options.type !== undefined) {\n payload.type = options.type;\n }\n\n if (options.description !== undefined) {\n payload.description = options.description;\n }\n\n if (options.type === \"Voice\" && options.voice?.max_users) {\n payload.voice = { max_users: options.voice.max_users };\n }\n\n const data = await this.client.rest.post(`/servers/${this.server.id}/channels`, payload);\n\n return this.client.channels._add(data);\n }\n\n [util.inspect.custom]() {\n return this.cache;\n }\n}\n","import { Base } from \"./Base\";\nimport type { Client } from \"../client/Client\";\nimport type { Server } from \"./Server\";\nimport * as util from \"node:util\";\nimport { Permissions } from \"../utils/permissions\";\nimport type { RoleEditOptions, RolePermissionOptions } from \"../managers/RoleManager\";\nimport { Attachment } from \"./Attachment\";\nimport { AttachmentBuilder } from \"../builders/AttachmentBuilder\";\nimport { Role as RawRole } from \"stoat-api\";\n\nexport class Role extends Base {\n public serverId: string;\n public name!: string;\n public color: string | null | undefined = null;\n public hoist: boolean = false;\n public rank: number = 0;\n public icon: Attachment | null = null;\n private _permissions: bigint = 0n;\n\n constructor(client: Client, data: RawRole, serverId: string) {\n super(client, data);\n this.serverId = serverId;\n this._patch(data);\n }\n\n /**\n * Updates the role instance with new data without losing the object reference.\n * @internal\n */\n public _patch(data: RawRole) {\n if (data.name !== undefined) this.name = data.name;\n if (data.colour !== undefined) this.color = data.colour;\n if (data.hoist !== undefined) this.hoist = data.hoist;\n if (data.rank !== undefined) this.rank = data.rank;\n if (data.icon !== undefined) this.icon = data.icon !== null ? new Attachment(this.client, data.icon) : null;\n if (data.permissions !== undefined) {\n try {\n if (typeof data.permissions === \"object\" && data.permissions !== null) {\n const allowPerms = data.permissions.a ?? 0;\n this._permissions = BigInt(allowPerms);\n } else {\n this._permissions = BigInt(data.permissions);\n }\n } catch {\n this._permissions = 0n;\n }\n }\n }\n\n /**\n * The server this role belongs to.\n * Pulls dynamically from the cache to prevent massive memory duplication.\n */\n public get server(): Server | undefined {\n return this.client.servers.cache.get(this.serverId);\n }\n\n /**\n * Permissions for this role\n */\n public get permissions(): Permissions {\n return new Permissions(this._permissions);\n }\n\n /**\n * Fetches this role directly from the API to ensure data is up to date.\n * @param force Whether to skip the cache check and force a direct API request. Defaults to false.\n * @returns A promise that resolves to the fetched Role object.\n * @throws {TypeError} If an invalid RoleResolvable is provided.\n * @throws {Error} If the API request fails (e.g., the role does not exist).\n * @example\n * // Refresh the role's data from the API\n * await role.fetch();\n * console.log(`Role updated, current name: ${role.name}`);\n */\n public async fetch(force: boolean = true): Promise<Role> {\n let server = this.server;\n\n if (!server) {\n server = await this.client.servers.fetch(this.serverId);\n }\n\n return (await server.roles.fetch(this.id, force)) as this;\n }\n\n /**\n * Edits the role with the given options. Only the fields provided in the options will be updated; all other fields will remain unchanged.\n * @param options The fields to update.\n * @returns A promise that resolves to the updated Role.\n * @throws {TypeError} If invalid options or RoleResolvable are provided.\n * @throws {Error} If the API request fails (e.g., lack of permissions).\n * @example\n * // Change the role's name and color\n * await role.edit({ name: \"Senior Admin\", color: \"#FFD700\" });\n *\n * // Remove the custom color from the role\n * await role.edit({ color: null });\n */\n public async edit(options: RoleEditOptions): Promise<Role> {\n let server = this.server;\n if (!server) server = await this.client.servers.fetch(this.serverId);\n\n return (await server.roles.edit(this.id, options)) as this;\n }\n\n /**\n * Deletes this Role from the server.\n * @throws {Error} If the role cannot be deleted (e.g., lack of permissions).\n * @example\n * // Delete a role by its ID\n * await role.delete();\n */\n public async delete(): Promise<void> {\n let server = this.server;\n\n if (!server) {\n server = await this.client.servers.fetch(this.serverId);\n }\n\n await server.roles.delete(this.id);\n }\n\n /**\n * Updates the permissions for this role.\n * @param options The allow and deny permissions to set.\n * @returns A promise that resolves to the updated Role object.\n * @throws {TypeError} If invalid options are provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Grant the role permission to manage channels and send messages\n * await role.setPermissions({\n * allow: [\"ManageChannel\", \"SendMessage\"]\n * });\n */\n public async setPermissions(options: RolePermissionOptions): Promise<Role> {\n let server = this.server;\n if (!server) server = await this.client.servers.fetch(this.serverId);\n\n return (await server.roles.setPermissions(this.id, options)) as this;\n }\n\n /**\n * Updates the hierarchical position of this role.\n * Automatically reconstructs the role array and performs a bulk update.\n * @param newPosition The new rank/position for this role (0-indexed).\n * @returns A promise that resolves to this updated Role object.\n * @throws {Error} If API request fails.\n * @example\n * // Move this role to position 2 in the hierarchy\n * await role.setPosition(2);\n * console.log(`Role moved to rank: ${role.rank}`);\n */\n public async setPosition(newPosition: number): Promise<Role> {\n let server = this.server;\n if (!server) server = await this.client.servers.fetch(this.serverId);\n\n const sortedRoles = Array.from(server.roles.cache.values()).sort((a, b) => a.rank - b.rank);\n\n const filteredRoles = sortedRoles.filter((r) => r.id !== this.id);\n\n const clampedPosition = Math.max(0, Math.min(newPosition, filteredRoles.length));\n\n filteredRoles.splice(clampedPosition, 0, this);\n\n await server.roles.setRanks(filteredRoles);\n\n return this;\n }\n\n /**\n * Change the name for this role\n * @param name The new name for the role\n * @returns A promise that resolves to this updated Role object.\n * @throws {Error} If API request fails.\n * @example\n * // Change the role's name\n * await role.setName(\"New Role Name\");\n * console.log(`Role's new name: ${role.name}`);\n */\n public async setName(name: string): Promise<Role> {\n return await this.edit({ name });\n }\n\n /**\n * Change the color for this role, it can be a HEX or CSS colours\n * @param {[string]} color The new color for the role\n * @returns A promise that resolves to this updated Role object.\n * @throws {Error} If API request fails\n * @example\n * // Change the role's color\n * await role.setColour(\"#FF0000\");\n * console.log(`Role's new color: ${role.color}`);\n *\n * // Use CSS color linear-graident\n * await role.setColour(\"linear-gradient(90deg, #FF0000, #0000FF)\");\n * console.log(`Role's new color: ${role.color}`);\n *\n * // Remove the custom color from the role\n * await role.setColour(null);\n * console.log(`Role's color removed, current color: ${role.color}`);\n */\n public async setColor(color: string | null): Promise<Role> {\n return await this.edit({ color });\n }\n\n /**\n * Edit the icon of this role\n * @param icon Autumn ID for the new icon, or null to remove the custom icon\n * @returns A promise that resolves to this updated Role object.\n * @throws {Error} If API request fails\n * @example\n * // Set a new icon for the role\n * await role.setIcon(\"AUTUMN_ID_FOR_ICON\");\n * console.log(`Role's new icon: ${role.icon}`);\n *\n * // Use AttachmentBuilder to upload a new icon file\n * import { readFile } from \"node:fs/promises\";\n * const iconFile = await readFile(\"./a.jpg\");\n * const attachment = new AttachmentBuilder(iconFile, \"a.jpg\");\n * await role.setIcon(attachment);\n * console.log(`Role's new icon: ${role.icon}`);\n */\n public async setIcon(icon: string | AttachmentBuilder | null): Promise<Role> {\n return await this.edit({ icon });\n }\n\n /**\n * Change the hoist status for this role\n * @param hoist The new hoist status for the role\n * @returns A promise that resolves to this updated Role object.\n * @throws {Error} If API request fails\n * @example\n * // Enable hoisting for the role\n * await role.setHoist(true);\n * console.log(`Role is now hoisted: ${role.hoist}`);\n */\n public async setHoist(hoist: boolean): Promise<Role> {\n return await this.edit({ hoist });\n }\n\n /**\n * Customizer for Node.js `console.log` and `util.inspect`.\n * Hides the cyclic client reference and raw serverId for a cleaner output.\n * @internal\n */\n [util.inspect.custom]() {\n const { client, serverId, ...props } = this;\n return `${this.constructor.name} ${util.inspect(props)}`;\n }\n}\n","import { Role } from \"../structures/Role\";\nimport type { Server } from \"../structures/Server\";\nimport type { Client } from \"../client/Client\";\nimport * as util from \"node:util\";\nimport { PermissionResolvable, Permissions } from \"../utils/permissions\";\nimport { BaseManager } from \"./BaseManager\";\nimport { AttachmentBuilder } from \"../builders/AttachmentBuilder\";\nimport { resolveAttachment } from \"../utils/resolveAttachment\";\nimport {\n Role as RawRole,\n DataCreateRole,\n DataEditRole,\n FieldsRole,\n DataSetServerRolePermission,\n DataEditRoleRanks,\n} from \"stoat-api\";\n\nexport interface RoleCreateOptions {\n name: string;\n}\n\nexport interface RoleEditOptions {\n // Role name\n name?: string;\n // Role color\n color?: string | null;\n // Whether this role should be displayed separately\n hoist?: boolean;\n // Provide an Autumn attachment ID\n icon?: string | AttachmentBuilder | null;\n}\n\nexport interface RolePermissionOptions {\n allow?: PermissionResolvable;\n deny?: PermissionResolvable;\n}\n\nexport type RoleResolvable = Role | string;\n\nexport class RoleManager extends BaseManager<string, Role> {\n /**\n * Manages API methods and caching for server roles.\n */\n constructor(\n client: Client,\n public server: Server,\n limit: number = Infinity,\n ) {\n super(client, limit);\n }\n\n /**\n * Tell BaseManager how to find the ID for Roles\n */\n protected extractId(data: RawRole): string {\n return data._id;\n }\n\n /**\n * Tell BaseManager how to build a Role\n */\n protected construct(data: RawRole): Role {\n return new Role(this.client, data, this.server.id);\n }\n\n /**\n * Adds or updates a role in the local cache.\n * @internal\n * @param data The raw role data from the API.\n * @param idParam An optional ID parameter if the payload wraps the role object.\n * @returns The newly created or updated Role object.\n */\n public override _add(data: RawRole, idParam?: string): Role {\n const id = idParam ?? data._id;\n const existing = this.cache.get(id);\n\n if (existing) {\n existing._patch(data);\n return existing;\n }\n\n const role = new Role(this.client, data, this.server.id);\n this.cache.set(role.id, role);\n return role;\n }\n\n [util.inspect.custom]() {\n return this.cache;\n }\n\n /**\n * Resolves a RoleResolvable to a Role object from the cache.\n * @param role The RoleResolvable to resolve.\n * @returns The resolved Role object, or undefined if not found.\n */\n public resolve(role: RoleResolvable): Role | undefined {\n if (role instanceof Role) return role;\n\n if (typeof role === \"string\") {\n const id = role.replace(/[<%>]/g, \"\");\n return this.cache.get(id);\n }\n\n return undefined;\n }\n\n /**\n * Extracts ID from a RoleResolvable.\n * @param role The RoleResolvable to extract the ID from.\n * @returns The extracted role ID.\n * @throws TypeError if an invalid type is provided.\n */\n public resolveId(role: RoleResolvable): string {\n if (role instanceof Role) {\n return role.id;\n }\n\n if (typeof role === \"string\") {\n return role.replace(/[<%>]/g, \"\");\n }\n\n throw new TypeError(\"Invalid RoleResolvable provided. Expected a Role object or a string ID/Mention.\");\n }\n\n /**\n * Creates a new role in this server.\n * @param options The name and optional rank of the new role\n * @returns Role The role that was created\n * @throws {Error} If the role cannot be created (e.g., lack of permissions, invalid options).\n * @throws {TypeError} If invalid options are provided.\n * @example\n * // Create a new role named \"Moderator\" with rank 1\n * const moderatorRole = await server.roles.create({ name: \"Moderator\", rank: 1 });\n * console.log(`Created role: ${moderatorRole.name} with ID: ${moderatorRole.id}`);\n */\n public async create(options: RoleCreateOptions): Promise<Role> {\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"RoleCreateOptions must be a valid object.\");\n }\n\n if (typeof options.name !== \"string\" || options.name.trim().length === 0) {\n throw new TypeError(\"A valid role 'name' (string) must be provided.\");\n }\n\n const payload: DataCreateRole = {\n name: options.name,\n };\n\n const data = await this.client.rest.post(`/servers/${this.server.id}/roles`, payload);\n\n return this._add(data.role);\n }\n\n /**\n * Fetches a Role from the API or resolves it from the local cache.\n * @param role The ID, mention, or Role object to fetch.\n * @param force Whether to skip the cache check and force a direct API request. Defaults to false.\n * @returns A promise that resolves to the fetched Role object.\n * @throws {TypeError} If an invalid RoleResolvable is provided.\n * @throws {Error} If the API request fails (e.g., the role does not exist).\n * @example\n * // Fetch a role from the API\n * const role = await server.roles.fetch(\"01JE2MM759J5D7CHJF084R7MJ2\");\n * console.log(`Fetched role: ${role.name} with ID: ${role.id}`);\n *\n * // Fetch a role by mention\n * const role = await.server.roles.fetch(\"<%01JE2MM759J5D7CHJF084R7MJ2>\");\n * console.log(`Fetched role: ${role.name} with ID: ${role.id}`);\n *\n * // Force fetch a role, bypassing the cache\n * const role = await server.roles.fetch(\"01JE2MM759J5D7CHJF084R7MJ2\", true);\n * console.log(`Fetched role: ${role.name} with ID: ${role.id}`);\n */\n public async fetch(role: RoleResolvable, force: boolean = false): Promise<Role> {\n if (!force) {\n const cached = this.resolve(role);\n if (cached) return cached;\n }\n\n const id = this.resolveId(role);\n\n const data = await this.client.rest.get(`/servers/${this.server.id}/roles/${id}`);\n\n return this._add(data);\n }\n\n /**\n * Edits an existing role in the server.\n * @param role The {@link RoleResolvable} to edit.\n * @param options The fields to update.\n * @returns A promise that resolves to the updated Role.\n * @throws {TypeError} If invalid options or RoleResolvable are provided.\n * @throws {Error} If the API request fails (e.g., lack of permissions).\n * @example\n * // Rename a role and give it a red color\n * await server.roles.edit(\"01H...\", { name: \"Super Admin\", colour: \"#FF0000\" });\n *\n * // Remove the custom color from a role\n * await server.roles.edit(role, { colour: null });\n */\n public async edit(role: RoleResolvable, options: RoleEditOptions): Promise<Role> {\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"RoleEditOptions must be a valid object.\");\n }\n\n const id = this.resolveId(role);\n const payload: DataEditRole = {};\n const remove: FieldsRole[] = [];\n\n if (options.name !== undefined) payload.name = options.name;\n if (options.hoist !== undefined) payload.hoist = options.hoist;\n\n if (options.color !== undefined) {\n if (options.color === null) {\n remove.push(\"Colour\");\n } else {\n payload.colour = options.color;\n }\n }\n if (options.icon !== undefined) {\n if (options.icon === null) {\n remove.push(\"Icon\");\n } else {\n const resolvedIcon = await resolveAttachment(this.client.rest, options.icon, \"icons\");\n if (resolvedIcon !== undefined) {\n payload.icon = resolvedIcon;\n }\n }\n }\n\n if (remove.length > 0) {\n payload.remove = remove;\n }\n\n if (Object.keys(payload).length === 0) {\n return this.fetch(id);\n }\n const endpoint = `/servers/${this.server.id}/roles/${id}` as const;\n\n const data = await this.client.rest.patch(endpoint, payload);\n\n // TypeScript can't differ /roles/ranks and /roles/:id so we have to cast it\n return this._add(data as RawRole, id);\n }\n\n /**\n * Deletes a Role from the server.\n * @param role The RoleResolvable to delete\n * @returns A promise that resolves when the role is successfully deleted.\n * @throws {TypeError} If an invalid RoleResolvable is provided.\n * @throws {Error} If the role cannot be deleted (e.g., lack of permissions).\n * @example\n * // Delete a role by its ID\n * await server.roles.delete(\"01JE2MM759J5D7CHJF084R7MJ2\");\n * console.log(\"Role deleted successfully.\");\n *\n * // Delete a role using a Role object\n * const role = await server.roles.fetch(\"01JE2MM759J5D7CHJF084R7\");\n * await server.roles.delete(role);\n * console.log(\"Role deleted successfully.\");\n *\n * // Delete a role by mention\n * await server.roles.delete(\"<%01JE2MM759J5D7CHJF084R7MJ2>\");\n * console.log(\"Role deleted successfully.\");\n */\n public async delete(role: RoleResolvable): Promise<void> {\n const id = this.resolveId(role);\n\n await this.client.rest.delete(`/servers/${this.server.id}/roles/${id}`);\n\n this.cache.delete(id);\n }\n\n /**\n * Updates the permissions for a role in the server.\n * @param role The RoleResolvable to update permissions for.\n * @param options The allow and deny permissions to set.\n * @returns A promise that resolves to the updated Role.\n * @throws {TypeError} If an invalid RoleResolvable or options are provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Set permissions using an array of strings.\n * await server.roles.setPermissions(role, {\n * allow: [\"ManageChannel\", \"ViewChannel\", \"SendMessage\"]\n * });\n */\n public async setPermissions(role: RoleResolvable, options: RolePermissionOptions): Promise<Role> {\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"RolePermissionOptions must be a valid object.\");\n }\n\n const id = this.resolveId(role);\n\n const allowBigInt = options.allow !== undefined ? Permissions.resolve(options.allow) : 0n;\n const denyBigInt = options.deny !== undefined ? Permissions.resolve(options.deny) : 0n;\n\n const payload: DataSetServerRolePermission = {\n permissions: {\n allow: Number(allowBigInt),\n deny: Number(denyBigInt),\n },\n };\n\n const data = await this.client.rest.put(`/servers/${this.server.id}/permissions/${id}`, payload);\n\n // The fucking API returns a Server object\n this.server._patch(data);\n\n // So we turn it into a role to improve DX\n return this.cache.get(id) as Role;\n }\n\n /**\n * Updates the hierarchical positions of roles in the server.\n * @param ranks An array of RoleResolvables representing the new order of roles.\n * @returns A promise that resolves when the ranks are successfully updated.\n * @throws {TypeError} If the ranks parameter is not an array or contains invalid resolvables.\n * @throws {Error} If the API request fails.\n * @example\n * // Reorder roles by passing an array of Role objects or IDs\n * await server.roles.setRanks([\"RoleID_1\", adminRoleObject, \"RoleID_3\"]);\n */\n public async setRanks(ranks: RoleResolvable[]): Promise<Server> {\n if (!Array.isArray(ranks)) {\n throw new TypeError(\"The 'ranks' parameter must be an array of RoleResolvables.\");\n }\n\n const mappedIds = ranks.map((role) => this.resolveId(role));\n\n const payload: DataEditRoleRanks = {\n ranks: mappedIds,\n };\n\n const data = await this.client.rest.patch(`/servers/${this.server.id}/roles/ranks`, payload);\n\n this.server._patch(data);\n\n return this.server;\n }\n}\n","import type { Invite as RawInvite } from \"stoat-api\";\n\nexport class ServerInvite {\n public code: string;\n public creatorId: string;\n public channelId: string;\n\n constructor(data: RawInvite) {\n this.code = data._id;\n this.creatorId = data.creator;\n this.channelId = data.channel;\n }\n\n public _patch(data: RawInvite) {\n this.creatorId = data.creator ?? this.creatorId;\n this.channelId = data.channel ?? this.channelId;\n }\n}\n","import type { Server } from \"../structures/Server\";\nimport type { Client } from \"../client/Client\";\nimport { Collection } from \"../utils/Collection\";\nimport { ServerInvite } from \"../structures/ServerInvite\";\nimport { BaseManager } from \"./BaseManager\";\nimport { Invite as RawInvite } from \"stoat-api\";\n\nexport interface Invite {\n code: string;\n creatorId: string;\n channelId: string;\n}\n\nexport class ServerInviteManager extends BaseManager<string, ServerInvite> {\n constructor(\n client: Client,\n public server: Server,\n limit: number = Infinity,\n ) {\n super(client, limit);\n }\n\n protected extractId(data: RawInvite): string {\n return data._id;\n }\n\n protected construct(data: RawInvite): ServerInvite {\n return new ServerInvite(data);\n }\n\n /**\n * Fetches all active invites for this server.\n */\n public async fetch(): Promise<Collection<string, ServerInvite>> {\n const data = await this.client.rest.get(`/servers/${this.server.id}/invites`);\n\n const fetched = new Collection<string, ServerInvite>();\n\n for (const raw of data) {\n const invite = this._add(raw);\n fetched.set(invite.code, invite);\n }\n\n return fetched;\n }\n}\n","import type { ServerBan as RawServerBan } from \"stoat-api\";\n\nexport class ServerBan {\n public userId: string;\n public reason: string | null;\n\n constructor(data: RawServerBan) {\n this.userId = data._id?.user;\n this.reason = data.reason ?? null;\n }\n\n public _patch(data: RawServerBan) {\n if (data.reason !== undefined) this.reason = data.reason;\n }\n}\n","import type { Server } from \"../structures/Server\";\nimport type { Client } from \"../client/Client\";\nimport { Collection } from \"../utils/Collection\";\nimport { BaseManager } from \"./BaseManager\";\nimport { ServerBan } from \"../structures/ServerBan\";\n\nexport interface Ban {\n userId: string;\n reason: string | null;\n}\n\nexport class ServerBanManager extends BaseManager<string, ServerBan> {\n constructor(\n client: Client,\n public server: Server,\n limit: number = Infinity,\n ) {\n super(client, limit);\n }\n\n protected extractId(data: any): string {\n return data._id?.user ?? data.id;\n }\n\n protected construct(data: any): ServerBan {\n return new ServerBan(data);\n }\n\n /**\n * Fetches all bans in this server.\n * Automatically caches the associated User objects globally!\n * @returns A promise that resolves to a Collection of Bans.\n */\n public async fetch(): Promise<Collection<string, ServerBan>> {\n const data = await this.client.rest.get(`/servers/${this.server.id}/bans`);\n\n // Cache associated users globally\n if (data.users && Array.isArray(data.users)) {\n for (const userData of data.users) {\n this.client.users._add(userData);\n }\n }\n\n const rawBans = data.bans || (Array.isArray(data) ? data : []);\n const fetched = new Collection<string, ServerBan>();\n\n for (const rawBan of rawBans) {\n const ban = this._add(rawBan);\n fetched.set(ban.userId, ban);\n }\n\n return fetched;\n }\n\n /**\n * Unbans a user from the server.\n * @param userId The ID of the user to unban.\n */\n public async remove(userId: string): Promise<void> {\n const id = userId.replace(/[<@!>]/g, \"\"); // Clean the ID just in case\n await this.client.rest.delete(`/servers/${this.server.id}/bans/${id}`);\n this.cache.delete(id);\n }\n}\n","import { Base } from \"./Base\";\nimport type { Client } from \"../client/Client\";\nimport type { Emoji as RawEmoji } from \"stoat-api\";\n\nexport type EmojiParent = { type: \"Server\"; id: string } | { type: \"Detached\" };\n\nexport class Emoji extends Base {\n public creatorId!: string;\n public name!: string;\n public parent!: EmojiParent;\n public animated: boolean = false;\n public nsfw: boolean = false;\n\n constructor(client: Client, data: RawEmoji) {\n super(client, data);\n this._patch(data);\n }\n\n public _patch(data: RawEmoji) {\n if (data.creator_id !== undefined) this.creatorId = data.creator_id;\n if (data.name !== undefined) this.name = data.name;\n if (data.parent !== undefined) this.parent = data.parent;\n if (data.animated !== undefined) this.animated = data.animated;\n if (data.nsfw !== undefined) this.nsfw = data.nsfw;\n }\n}\n","import { BaseManager } from \"./BaseManager\";\nimport type { Client } from \"../client/Client\";\nimport { Emoji } from \"../structures/Emoji\";\nimport type { Server } from \"../structures/Server\";\nimport * as util from \"node:util\";\n\nexport class EmojiManager extends BaseManager<string, Emoji> {\n constructor(\n client: Client,\n public server?: Server,\n limit: number = Infinity,\n ) {\n super(client, limit);\n }\n\n /**\n * Tell BaseManager how to find the ID for Emojis\n */\n protected extractId(data: any): string {\n return data._id ?? data.id;\n }\n\n /**\n * Tell BaseManager how to build an Emoji\n */\n protected construct(data: any): Emoji {\n return new Emoji(this.client, data);\n }\n\n public async fetch(id: string): Promise<Emoji> {\n const data = await this.client.rest.get(`/custom/emoji/${id}`);\n return this._add(data);\n }\n\n [util.inspect.custom]() {\n return this.cache;\n }\n}\n","import { Base } from \"./Base\";\nimport type { Client } from \"../client/Client\";\nimport { FetchMembersOptions, MemberManager } from \"../managers/MemberManager\";\nimport { ServerChannelManager } from \"../managers/ServerChannelManager\";\nimport { Attachment } from \"./Attachment\";\nimport { RoleManager } from \"../managers/RoleManager\";\nimport { ServerInviteManager } from \"../managers/ServerInviteManager\";\nimport { ServerBanManager } from \"../managers/ServerBanManager\";\nimport { ServerEditOptions } from \"../managers/ServerManager\";\nimport { EmojiManager } from \"../managers/EmojiManager\";\nimport type { Server as RawServer, Category as RawCategory } from \"stoat-api\";\n\nexport class Server extends Base {\n public channelIds: string[] = [];\n public defaultPermissions!: bigint;\n public name!: string;\n public ownerId!: string;\n public analytics: boolean = false;\n public banner: Attachment | null = null;\n public categories: RawCategory[] | null = null;\n public description: string | null = null;\n public discoverable: boolean = false;\n public flags: number = 0;\n public icon: Attachment | null = null;\n public nsfw: boolean = false;\n public members: MemberManager;\n public channels: ServerChannelManager;\n public roles: RoleManager;\n public bans: ServerBanManager;\n public invites: ServerInviteManager;\n public emojis: EmojiManager;\n\n constructor(client: Client, data: RawServer) {\n super(client, data);\n this.channels = new ServerChannelManager(client, this);\n this.members = new MemberManager(client, this);\n this.roles = new RoleManager(client, this);\n this.bans = new ServerBanManager(this.client, this);\n this.invites = new ServerInviteManager(this.client, this);\n this.emojis = new EmojiManager(this.client, this);\n this._patch(data);\n }\n\n /**\n * Updates the server instance with new data without losing the object reference.\n */\n public _patch(data: RawServer, clear?: string[]) {\n if (data.channels !== undefined) this.channelIds = data.channels;\n if (data.default_permissions !== undefined) {\n try {\n this.defaultPermissions = BigInt(data.default_permissions);\n } catch {\n this.defaultPermissions = 0n;\n }\n }\n if (data.name !== undefined) this.name = data.name;\n if (data.owner !== undefined) this.ownerId = data.owner;\n if (data.analytics !== undefined) this.analytics = data.analytics;\n if (data.categories !== undefined) this.categories = data.categories;\n if (data.description !== undefined) this.description = data.description;\n if (data.discoverable !== undefined) this.discoverable = data.discoverable;\n if (data.flags !== undefined) this.flags = data.flags;\n if (data.nsfw !== undefined) this.nsfw = data.nsfw;\n if (data.icon !== undefined) {\n this.icon = data.icon ? new Attachment(this.client, data.icon) : null;\n }\n if (data.banner !== undefined) {\n this.banner = data.banner ? new Attachment(this.client, data.banner) : null;\n }\n if (data.roles !== undefined) {\n for (const [id, roleData] of Object.entries(data.roles)) {\n this.roles._add({ id, ...(roleData as any) });\n }\n }\n\n if (clear && Array.isArray(clear)) {\n for (const field of clear) {\n switch (field) {\n case \"Description\":\n this.description = null;\n break;\n case \"Icon\":\n this.icon = null;\n break;\n }\n }\n }\n }\n\n /**\n * Edits this server.\n * @param options The fields to update.\n */\n public async edit(options: ServerEditOptions): Promise<this> {\n await this.client.servers.edit(this.id, options);\n return this;\n }\n\n /**\n * Leaves the server\n */\n public async leave() {\n return this.client.rest.delete(`/servers/${this.id}/leave`);\n }\n\n /**\n * Fetches multiple members from this server.\n * @param options Filter options for the fetch request.\n * @returns A Collection of the fetched members.\n */\n public async fetchMembers(options?: FetchMembersOptions) {\n return this.members.fetchMany(options);\n }\n}\n","import { BaseManager } from \"./BaseManager\";\nimport { Server } from \"../structures/Server\";\nimport type { Client } from \"../client/Client\";\nimport * as util from \"node:util\";\nimport { Server as RawServer, DataEditServer, FieldsServer } from \"stoat-api\";\n\nexport interface ServerEditOptions {\n name?: string;\n description?: string | null;\n icon?: string | null;\n banner?: string | null;\n categories?: {\n id: string;\n title: string;\n channels: string[];\n }[];\n systemMessages?: {\n userJoined?: string | null;\n userLeft?: string | null;\n userKicked?: string | null;\n userBanned?: string | null;\n };\n analytics?: boolean;\n owner?: string;\n}\n\nexport class ServerManager extends BaseManager<string, Server> {\n constructor(client: Client, limit: number = Infinity) {\n super(client, limit);\n }\n\n /**\n * Tell BaseManager how to find the ID for Servers\n */\n protected extractId(data: RawServer): string {\n return data._id;\n }\n\n /**\n * Tell BaseManager how to build a Server\n */\n protected construct(data: RawServer): Server {\n return new Server(this.client, data);\n }\n\n /**\n * Fetches a server from the API.\n * @param id The server ID.\n * @param force Whether to skip the cache and fetch from the API.\n */\n public async fetch(id: string, force: boolean = false): Promise<Server> {\n if (!force) {\n const cached = this.cache.get(id);\n if (cached) return cached;\n }\n\n const data = await this.client.rest.get(`/servers/${id}`);\n return this._add(data);\n }\n\n public async edit(serverId: string, options: ServerEditOptions): Promise<Server> {\n const payload: DataEditServer = {};\n const remove: FieldsServer[] = [];\n\n if (options.name !== undefined) payload.name = options.name;\n if (options.description !== undefined) {\n if (options.description === null) remove.push(\"Description\");\n else payload.description = options.description;\n }\n\n if (options.icon !== undefined) {\n if (options.icon === null) remove.push(\"Icon\");\n else payload.icon = options.icon;\n }\n if (options.banner !== undefined) {\n if (options.banner === null) remove.push(\"Banner\");\n else payload.banner = options.banner;\n }\n\n // System Messages\n if (options.systemMessages) {\n payload.system_messages = {};\n const sm = options.systemMessages;\n\n if (sm.userJoined !== undefined) {\n payload.system_messages.user_joined = sm.userJoined;\n }\n\n if (sm.userLeft !== undefined) {\n payload.system_messages.user_left = sm.userLeft;\n }\n\n if (sm.userKicked !== undefined) {\n payload.system_messages.user_kicked = sm.userKicked;\n }\n\n if (sm.userBanned !== undefined) {\n payload.system_messages.user_banned = sm.userBanned;\n }\n } else if (options.systemMessages === null) {\n remove.push(\"SystemMessages\");\n }\n\n if (options.categories !== undefined) payload.categories = options.categories;\n if (options.analytics !== undefined) payload.analytics = options.analytics;\n if (options.owner !== undefined) payload.owner = options.owner;\n\n if (remove.length > 0) payload.remove = remove;\n\n const data = await this.client.rest.patch(`/servers/${serverId}`, payload);\n\n return this._add(data);\n }\n\n [util.inspect.custom]() {\n return this.cache;\n }\n}\n","import { User, UserProfile, UserStatus } from \"../structures/User\";\nimport type { Client } from \"../client/Client\";\nimport { BaseManager } from \"./BaseManager\";\nimport { DMChannel } from \"../structures/DMChannel\";\nimport { User as RawUser, DataEditUser, FieldsUser } from \"stoat-api\";\n\nexport type UserResolvable = User | string;\n\nexport interface UserEditOptions {\n avatar?: string | null;\n displayName?: string | null;\n profile?: UserProfile;\n status?: UserStatus;\n}\n\nexport class UserManager extends BaseManager<string, User> {\n constructor(client: Client, limit: number = Infinity) {\n super(client, limit);\n }\n\n /**\n * Tell BaseManager how to find the ID for Users\n */\n protected extractId(data: RawUser): string {\n return data._id;\n }\n\n /**\n * Tell BaseManager how to build a User\n */\n protected construct(data: RawUser): User {\n return new User(this.client, data);\n }\n\n /**\n * Resolves a UserResolvable to a User object from the cache.\n */\n public resolve(user: UserResolvable): User | undefined {\n if (user instanceof User) return user;\n\n if (typeof user === \"string\") {\n const id = user.replace(/[<@>]/g, \"\");\n return this.cache.get(id);\n }\n\n return undefined;\n }\n\n /**\n * Extracts ID from a UserResolvable.\n * @param user The UserResolvable to extract the ID from.\n * @returns The extracted user ID.\n * @throws TypeError if an invalid type is provided.\n */\n public resolveId(user: UserResolvable): string {\n if (user instanceof User) {\n return user.id;\n }\n\n if (typeof user === \"string\") {\n return user.replace(/[<@>]/g, \"\");\n }\n\n throw new TypeError(\"Invalid UserResolvable provided. Expected a User object or a string ID/Mention.\");\n }\n\n /**\n * Fetches a User.\n * @param user The ID or mention to fetch\n * @param force Skip the cache check and force an API request\n * @returns The fetched User object\n * @throws Error if the user cannot be found or fetched\n * @throws TypeError if invalid UserResolvable is provided\n * @example\n * // Fetch a user by ID\n * const user = await client.users.fetch(\"01JE2MM759J5D7CHJF084R7MJ2\");\n * console.log(user.username);\n *\n * // Fetch a user by mention\n * const user = await client.users.fetch(\"<@01JE2MM759J5D7CHJF084R7MJ2>\");\n * console.log(user.username);\n *\n * // Force fetch a user, bypassing the cache\n * const user = await client.users.fetch(\"01JE2MM759J5D7CHJF084R7MJ2\", true);\n * console.log(user.username);\n */\n public async fetch(user: UserResolvable, force: boolean = false): Promise<User> {\n if (!force) {\n const cached = this.resolve(user);\n if (cached) return cached;\n }\n\n const id = this.resolveId(user);\n\n const data = await this.client.rest.get(`/users/${id}`);\n\n return this._add(data);\n }\n\n /**\n * Fetch the current user (the bot itself).\n * @returns The fetched User object representing the current user.\n * @throws Error if the user cannot be fetched.\n * @example\n * // Fetch the current user (the bot itself)\n * const me = await client.users.fetchMe();\n * console.log(`Logged in as ${me.tag}`);\n */\n public async fetchMe() {\n const data = await this.client.rest.get(`/users/@me`);\n\n return this._add(data);\n }\n\n /**\n * Edits the currently authenticated user (the bot itself).\n * @param options The fields to update (avatar, status, profile, etc.).\n * @returns A promise that resolves to the updated User object.\n * @throws {TypeError} If invalid options are provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Update the bot's status and presence\n * await client.users.editMe({\n * status: { text: \"Watching the server\", presence: \"Online\" }\n * });\n *\n * // Clear the bot's avatar and display name\n * await client.users.editMe({ avatar: null, displayName: null });\n */\n public async editMe(options: UserEditOptions): Promise<User> {\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"UserEditOptions must be a valid object.\");\n }\n\n const payload: DataEditUser = {};\n const remove: FieldsUser[] = [];\n\n if (options.displayName !== undefined) {\n if (options.displayName === null) remove.push(\"DisplayName\");\n else payload.display_name = options.displayName;\n }\n\n if (options.avatar !== undefined) {\n if (options.avatar === null) remove.push(\"Avatar\");\n else payload.avatar = options.avatar;\n }\n\n if (options.profile !== undefined) {\n payload.profile = {};\n if (options.profile.content !== undefined) {\n if (options.profile.content === null) remove.push(\"ProfileContent\");\n else payload.profile.content = options.profile.content;\n }\n if (options.profile.background !== undefined) {\n if (options.profile.background === null) remove.push(\"ProfileBackground\");\n else payload.profile.background = options.profile.background;\n }\n if (Object.keys(payload.profile).length === 0) delete payload.profile;\n }\n\n if (options.status !== undefined) {\n payload.status = {};\n if (options.status.text !== undefined) {\n if (options.status.text === null) remove.push(\"StatusText\");\n else payload.status.text = options.status.text;\n }\n if (options.status.presence !== undefined) {\n if (options.status.presence === null) remove.push(\"StatusPresence\");\n else payload.status.presence = options.status.presence;\n }\n if (Object.keys(payload.status).length === 0) delete payload.status;\n }\n\n if (remove.length > 0) {\n payload.remove = remove;\n }\n\n if (Object.keys(payload).length === 0) {\n return this.fetch(\"@me\");\n }\n\n const data = await this.client.rest.patch(`/users/${this.client.user?.id}`, payload);\n\n return this._add(data);\n }\n\n /**\n * The DM between the client's user and a user\n *\n * @param {string} userId The user id\n * @returns {?DMChannel}\n * @private\n */\n dmChannel(userId: string): DMChannel | null {\n return (this.client.channels.cache.find((channel) => channel.isDM() && channel.recipients.includes(userId)) ??\n null) as DMChannel | null;\n }\n\n /**\n * Creates a DM channel between the client's user and another user.\n * @param user The UserResolvable to create a DM with.\n * @param options Additional options for DM creation.\n * @param options.force If true, forces the creation of a new DM channel even if one already exists.\n * @returns A promise that resolves to the created DMChannel object.\n * @throws {TypeError} If an invalid UserResolvable is provided.\n * @throws {Error} If the API request fails.\n * @example\n * // Create a DM with a user by ID\n * const dm = await client.users.createDM(\"1234567890\");\n * console.log(`DM channel ID: ${dm.id}`);\n */\n public async createDM(user: UserResolvable, { force = false } = {}): Promise<DMChannel> {\n const id = this.resolveId(user);\n\n if (!force) {\n const dmChannel = this.dmChannel(id);\n if (dmChannel) return dmChannel;\n }\n\n const data = await this.client.rest.get(`/users/${id}/dm`);\n return this.client.channels._add(data) as DMChannel;\n }\n}\n","// src/managers/SweeperManager.ts\nimport type { Client } from \"../client/Client\";\nimport type { TextChannel } from \"../structures/TextChannel\";\n\nexport interface SweeperOptions {\n messages?: {\n lifetime: number;\n interval: number;\n };\n}\n\nexport class SweeperManager {\n private messageInterval: NodeJS.Timeout | null = null;\n public client: Client;\n public options: SweeperOptions;\n\n constructor(client: Client, options: SweeperOptions) {\n this.client = client;\n this.options = options;\n }\n\n public start() {\n if (this.options.messages) {\n this.client.emit(\"debug\", \"Starting Message Cache Sweeper...\");\n\n this.messageInterval = setInterval(() => {\n this.sweepMessages();\n }, this.options.messages.interval);\n }\n }\n\n private sweepMessages() {\n if (!this.options.messages) return;\n\n const now = Date.now();\n const lifetime = this.options.messages.lifetime;\n let sweptCount = 0;\n\n for (const channel of this.client.channels.cache.values()) {\n if (!(\"messages\" in channel)) continue;\n\n const textChannel = channel as TextChannel;\n\n for (const [id, message] of textChannel.messages.cache.entries()) {\n if (now - message.cachedAt > lifetime) {\n textChannel.messages.cache.delete(id);\n sweptCount++;\n }\n }\n }\n\n if (sweptCount > 0) {\n this.client.emit(\"debug\", `🧹 Sweeper cleared ${sweptCount} old messages from cache.`);\n }\n }\n\n public stop() {\n if (this.messageInterval) clearInterval(this.messageInterval);\n this.client.emit(\"debug\", \"Sweepers stopped.\");\n }\n}\n","export interface TextEmbedData {\n type: \"Text\";\n title?: string;\n description?: string;\n url?: string;\n icon_url?: string;\n colour?: string;\n media?: string;\n}\n\nexport class EmbedBuilder {\n private data: TextEmbedData;\n\n constructor(data: Partial<TextEmbedData> = {}) {\n this.data = { type: \"Text\", ...data };\n }\n\n public setTitle(title: string): this {\n this.data.title = title;\n return this;\n }\n\n public setDescription(description: string): this {\n this.data.description = description;\n return this;\n }\n\n public setUrl(url: string): this {\n this.data.url = url;\n return this;\n }\n\n public setIconUrl(iconUrl: string): this {\n this.data.icon_url = iconUrl;\n return this;\n }\n\n public setColor(color: string): this {\n this.data.colour = color;\n return this;\n }\n\n public setMedia(fileId: string): this {\n this.data.media = fileId;\n return this;\n }\n\n /**\n * Serializes the builder into the raw JSON required by the API\n */\n public toJSON(): TextEmbedData {\n return { ...this.data };\n }\n}\n","export * from \"./client/Client\";\nexport * from \"./rest/RESTManager\";\nexport * from \"./gateway/GatewayManager\";\n\n// Managers\nexport * from \"./managers/ChannelManager\";\nexport * from \"./managers/MemberManager\";\nexport * from \"./managers/MessageManager\";\nexport * from \"./managers/RoleManager\";\nexport * from \"./managers/ServerChannelManager\";\nexport * from \"./managers/ServerManager\";\nexport * from \"./managers/SweepManager\";\nexport * from \"./managers/UserManager\";\nexport * from \"./managers/EmojiManager\";\n\n// Structures\nexport * from \"./structures/Attachment\";\nexport * from \"./structures/Base\";\nexport * from \"./structures/BaseChannel\";\nexport * from \"./structures/DMChannel\";\nexport * from \"./structures/Member\";\nexport * from \"./structures/Message\";\nexport * from \"./structures/Role\";\nexport * from \"./structures/Server\";\nexport * from \"./structures/TextChannel\";\nexport * from \"./structures/UnknownChannel\";\nexport * from \"./structures/User\";\nexport * from \"./structures/ClientUser\";\nexport * from \"./structures/Emoji\";\nexport * from \"./structures/MessageReaction\";\n\n// Builders\nexport * from \"./builders/EmbedBuilder\";\nexport * from \"./builders/AttachmentBuilder\";\n\n// Utils\nexport * from \"./utils/Collection\";\nexport * from \"./utils/permissions\";\nexport * from \"./utils/Collector\";\nexport * from \"./utils/MessageCollector\";\nexport * from \"./utils/ReactionCollector\";\nexport * from \"./utils/BitField\";\n\nexport * as API from \"stoat-api\";\n"],"mappings":"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","names":["EventEmitter","util","inspect","util","util","inspect","util","inspect","util","util","util","util","util","util","EventEmitter"]}