@chatsift/discord-utils 0.5.1 → 0.6.1

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/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # `@chatsift/discord-utils`
2
2
 
3
- [![GitHub](https://img.shields.io/badge/License-GNU%20AGPLv3-yellow.svg)](https://github.com/chatsift/automoderator/blob/main/LICENSE)
3
+ [![GitHub](https://img.shields.io/badge/License-GNU%20AGPLv3-yellow.svg)](https://github.com/chatsift/chatsift/blob/main/LICENSE)
4
4
  [![npm](https://img.shields.io/npm/v/@chatsift/discord-utils?color=crimson&logo=npm)](https://www.npmjs.com/package/@chatsift/discord-utils)
5
- [![TypeScript](https://github.com/chatsift/automoderator/actions/workflows/test.yml/badge.svg)](https://github.com/chatsift/automoderator/actions/workflows/test.yml)
5
+ [![TypeScript](https://github.com/chatsift/chatsift/actions/workflows/test.yml/badge.svg)](https://github.com/chatsift/chatsift/actions/workflows/test.yml)
6
6
 
7
7
  Niche utilities for working with Discord's API
8
8
 
@@ -14,7 +14,7 @@ Niche utilities for working with Discord's API
14
14
 
15
15
  ## Contributing
16
16
 
17
- Please see the main [README.md](https://github.com/chatsift/automoderator) for info on how to contribute to this package or the other `@chatsift` packages.
17
+ Please see the main [README.md](https://github.com/chatsift/chatsift) for info on how to contribute to this package or the other `@chatsift` packages.
18
18
 
19
19
  ## LICENSE
20
20
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=embed.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/embed.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sortChannels.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sortChannels.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sortChannels.test.ts"],"names":[],"mappings":""}
package/dist/embed.d.ts CHANGED
@@ -1,20 +1,73 @@
1
1
  import type { APIEmbed, APIEmbedField } from 'discord-api-types/v10';
2
+ /**
3
+ * Limits commonly encountered with Discord's API
4
+ */
2
5
  export declare const MESSAGE_LIMITS: {
6
+ /**
7
+ * How long a message can be in characters
8
+ */
3
9
  readonly CONTENT: 4000;
10
+ /**
11
+ * How many embeds can be in a message
12
+ */
4
13
  readonly EMBED_COUNT: 10;
14
+ /**
15
+ * Embed specific limits
16
+ */
5
17
  readonly EMBEDS: {
18
+ /**
19
+ * How long an embed title can be in characters
20
+ */
6
21
  readonly TITLE: 256;
22
+ /**
23
+ * How long an embed description can be in characters
24
+ */
7
25
  readonly DESCRIPTION: 4096;
26
+ /**
27
+ * How long an embed footer can be in characters
28
+ */
8
29
  readonly FOOTER: 2048;
30
+ /**
31
+ * How long an embed author can be in characters
32
+ */
9
33
  readonly AUTHOR: 256;
34
+ /**
35
+ * How many fields an embed can have
36
+ */
10
37
  readonly FIELD_COUNT: 25;
38
+ /**
39
+ * Field specific limits
40
+ */
11
41
  readonly FIELDS: {
42
+ /**
43
+ * How long a field name can be in characters
44
+ */
12
45
  readonly NAME: 256;
46
+ /**
47
+ * How long a field value can be in characters
48
+ */
13
49
  readonly VALUE: 1024;
14
50
  };
15
51
  };
16
52
  };
53
+ /**
54
+ * Adds the given fields to an embed - mutating it
55
+ *
56
+ * @param embed - The embed to add fields to
57
+ * @param fields - The fields to add
58
+ */
17
59
  export declare function addFields(embed: APIEmbed, ...fields: APIEmbedField[]): APIEmbed;
60
+ /**
61
+ * Cuts off text after the given length - appending "..." at the end
62
+ *
63
+ * @param text - The text to cut off
64
+ * @param total - The maximum length of the text
65
+ */
18
66
  export declare function ellipsis(text: string, total: number): string;
67
+ /**
68
+ * Returns a fully truncated embed - safe to use with Discord's API - does not mutate the given embed
69
+ *
70
+ * @param embed - The embed to truncate
71
+ */
19
72
  export declare function truncateEmbed(embed: APIEmbed): APIEmbed;
20
73
  //# sourceMappingURL=embed.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../src/embed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAKrE,eAAO,MAAM,cAAc;;;;;;;;;;;;;;CA+CjB,CAAC;AAQX,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,GAAG,QAAQ,CAG/E;AAQD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAW5D;AAOD,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,CA0BvD"}
1
+ {"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../src/embed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAErE;;GAEG;AACH,eAAO,MAAM,cAAc;IAC1B;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;QAEF;;WAEG;;QAEH;;WAEG;;QAEH;;WAEG;;QAEH;;WAEG;;QAEH;;WAEG;;QAEH;;WAEG;;YAEF;;eAEG;;YAEH;;eAEG;;;;CAII,CAAC;AAEX;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,aAAa,EAAE,GAAG,QAAQ,CAG/E;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAW5D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,CA2BvD"}
package/dist/index.js CHANGED
@@ -19,15 +19,15 @@ var __copyProps = (to, from, except, desc) => {
19
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
20
 
21
21
  // src/index.ts
22
- var src_exports = {};
23
- __export(src_exports, {
22
+ var index_exports = {};
23
+ __export(index_exports, {
24
24
  MESSAGE_LIMITS: () => MESSAGE_LIMITS,
25
25
  addFields: () => addFields,
26
26
  ellipsis: () => ellipsis,
27
27
  sortChannels: () => sortChannels,
28
28
  truncateEmbed: () => truncateEmbed
29
29
  });
30
- module.exports = __toCommonJS(src_exports);
30
+ module.exports = __toCommonJS(index_exports);
31
31
 
32
32
  // src/embed.ts
33
33
  var MESSAGE_LIMITS = {
@@ -118,28 +118,39 @@ __name(truncateEmbed, "truncateEmbed");
118
118
  // src/sortChannels.ts
119
119
  var import_v10 = require("discord-api-types/v10");
120
120
  var GUILD_TEXT_TYPES = [import_v10.ChannelType.GuildText, import_v10.ChannelType.GuildNews, import_v10.ChannelType.GuildForum];
121
+ var THREAD_TYPES = [import_v10.ChannelType.PublicThread, import_v10.ChannelType.PrivateThread, import_v10.ChannelType.AnnouncementThread];
121
122
  function sortChannels(unsorted) {
122
123
  const filtered = unsorted.filter(
123
- (channel) => GUILD_TEXT_TYPES.includes(channel.type) || channel.type === import_v10.ChannelType.GuildCategory
124
+ (channel) => GUILD_TEXT_TYPES.includes(channel.type) || channel.type === import_v10.ChannelType.GuildCategory || THREAD_TYPES.includes(channel.type)
124
125
  );
125
- const grouped = Object.groupBy(filtered, (channel) => channel.parent_id ?? "top");
126
- const sortedTopLevel = grouped.top?.filter((channel) => !channel.parent_id).sort((a, b) => {
126
+ const threads = filtered.filter((channel) => THREAD_TYPES.includes(channel.type));
127
+ const nonThreads = filtered.filter((channel) => !THREAD_TYPES.includes(channel.type));
128
+ const grouped = Object.groupBy(nonThreads, (channel) => channel.parent_id ?? "top");
129
+ const sortedTopLevel = grouped["top"]?.filter((channel) => !channel.parent_id).sort((a, b) => {
127
130
  if (a.type === import_v10.ChannelType.GuildText && b.type === import_v10.ChannelType.GuildCategory) {
128
131
  return -1;
129
132
  }
130
133
  if (a.type === import_v10.ChannelType.GuildCategory && b.type === import_v10.ChannelType.GuildText) {
131
134
  return 1;
132
135
  }
133
- return a.position - b.position;
136
+ return (a.position ?? 0) - (b.position ?? 0);
134
137
  });
135
138
  const channels = [];
136
139
  for (const top of sortedTopLevel ?? []) {
137
140
  channels.push(top);
138
141
  if (top.type === import_v10.ChannelType.GuildCategory) {
139
- channels.push(...(grouped[top.id] ?? []).sort((a, b) => a.position - b.position));
142
+ const categoryChannels = (grouped[top.id] ?? []).sort((a, b) => (a.position ?? 0) - (b.position ?? 0));
143
+ channels.push(...categoryChannels);
144
+ for (const channel of categoryChannels) {
145
+ const channelThreads = threads.filter((thread) => thread.parent_id === channel.id).sort((a, b) => Number(BigInt(b.id) - BigInt(a.id)));
146
+ channels.push(...channelThreads);
147
+ }
148
+ } else {
149
+ const channelThreads = threads.filter((thread) => thread.parent_id === top.id).sort((a, b) => Number(BigInt(b.id) - BigInt(a.id)));
150
+ channels.push(...channelThreads);
140
151
  }
141
152
  }
142
- return channels.length ? channels : filtered.sort((a, b) => a.position - b.position);
153
+ return channels.length ? channels : filtered.sort((a, b) => (a.position ?? 0) - (b.position ?? 0));
143
154
  }
144
155
  __name(sortChannels, "sortChannels");
145
156
  // Annotate the CommonJS export names for ESM import in node:
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/embed.ts","../src/sortChannels.ts"],"sourcesContent":["export * from './embed.js';\nexport * from './sortChannels.js';\n","import type { APIEmbed, APIEmbedField } from 'discord-api-types/v10';\n\n/**\n * Limits commonly encountered with Discord's API\n */\nexport const MESSAGE_LIMITS = {\n\t/**\n\t * How long a message can be in characters\n\t */\n\tCONTENT: 4_000,\n\t/**\n\t * How many embeds can be in a message\n\t */\n\tEMBED_COUNT: 10,\n\t/**\n\t * Embed specific limits\n\t */\n\tEMBEDS: {\n\t\t/**\n\t\t * How long an embed title can be in characters\n\t\t */\n\t\tTITLE: 256,\n\t\t/**\n\t\t * How long an embed description can be in characters\n\t\t */\n\t\tDESCRIPTION: 4_096,\n\t\t/**\n\t\t * How long an embed footer can be in characters\n\t\t */\n\t\tFOOTER: 2_048,\n\t\t/**\n\t\t * How long an embed author can be in characters\n\t\t */\n\t\tAUTHOR: 256,\n\t\t/**\n\t\t * How many fields an embed can have\n\t\t */\n\t\tFIELD_COUNT: 25,\n\t\t/**\n\t\t * Field specific limits\n\t\t */\n\t\tFIELDS: {\n\t\t\t/**\n\t\t\t * How long a field name can be in characters\n\t\t\t */\n\t\t\tNAME: 256,\n\t\t\t/**\n\t\t\t * How long a field value can be in characters\n\t\t\t */\n\t\t\tVALUE: 1_024,\n\t\t},\n\t},\n} as const;\n\n/**\n * Adds the given fields to an embed - mutating it\n *\n * @param embed - The embed to add fields to\n * @param fields - The fields to add\n */\nexport function addFields(embed: APIEmbed, ...fields: APIEmbedField[]): APIEmbed {\n\t(embed.fields ??= []).push(...fields);\n\treturn embed;\n}\n\n/**\n * Cuts off text after the given length - appending \"...\" at the end\n *\n * @param text - The text to cut off\n * @param total - The maximum length of the text\n */\nexport function ellipsis(text: string, total: number): string {\n\tif (text.length <= total) {\n\t\treturn text;\n\t}\n\n\tconst keep = total - 3;\n\tif (keep < 1) {\n\t\treturn text.slice(0, total);\n\t}\n\n\treturn `${text.slice(0, keep)}...`;\n}\n\n/**\n * Returns a fully truncated embed - safe to use with Discord's API - does not mutate the given embed\n *\n * @param embed - The embed to truncate\n */\nexport function truncateEmbed(embed: APIEmbed): APIEmbed {\n\treturn {\n\t\t...embed,\n\t\tdescription: embed.description ? ellipsis(embed.description, MESSAGE_LIMITS.EMBEDS.DESCRIPTION) : undefined,\n\t\ttitle: embed.title ? ellipsis(embed.title, MESSAGE_LIMITS.EMBEDS.TITLE) : undefined,\n\t\tauthor: embed.author\n\t\t\t? {\n\t\t\t\t\t...embed.author,\n\t\t\t\t\tname: ellipsis(embed.author.name, MESSAGE_LIMITS.EMBEDS.AUTHOR),\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tfooter: embed.footer\n\t\t\t? {\n\t\t\t\t\t...embed.footer,\n\t\t\t\t\ttext: ellipsis(embed.footer.text, MESSAGE_LIMITS.EMBEDS.FOOTER),\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tfields: embed.fields\n\t\t\t? embed.fields\n\t\t\t\t\t.map((field) => ({\n\t\t\t\t\t\tname: ellipsis(field.name, MESSAGE_LIMITS.EMBEDS.FIELDS.NAME),\n\t\t\t\t\t\tvalue: ellipsis(field.value, MESSAGE_LIMITS.EMBEDS.FIELDS.VALUE),\n\t\t\t\t\t}))\n\t\t\t\t\t.slice(0, MESSAGE_LIMITS.EMBEDS.FIELD_COUNT)\n\t\t\t: [],\n\t};\n}\n","import type { APIChannel, APIGuildCategoryChannel, APITextChannel } from 'discord-api-types/v10';\nimport { ChannelType } from 'discord-api-types/v10';\n\nconst GUILD_TEXT_TYPES = [ChannelType.GuildText, ChannelType.GuildNews, ChannelType.GuildForum];\n\n/**\n * Sorts an array of text and category channels - **does not support other channel types**\n */\nexport function sortChannels(unsorted: APIChannel[]): (APIGuildCategoryChannel | APITextChannel)[] {\n\tconst filtered = unsorted.filter(\n\t\t(channel): channel is APIGuildCategoryChannel | APITextChannel =>\n\t\t\tGUILD_TEXT_TYPES.includes(channel.type) || channel.type === ChannelType.GuildCategory,\n\t);\n\n\t// Group the channels by their category - or \"top\" if they aren't in one\n\tconst grouped = Object.groupBy(filtered, (channel) => channel.parent_id ?? 'top');\n\n\t// Sort the top level channels - text channels are above category channels, otherwise use their position\n\tconst sortedTopLevel = grouped.top\n\t\t?.filter((channel) => !channel.parent_id)\n\t\t.sort((a, b) => {\n\t\t\tif (a.type === ChannelType.GuildText && b.type === ChannelType.GuildCategory) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tif (a.type === ChannelType.GuildCategory && b.type === ChannelType.GuildText) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\treturn a.position! - b.position!;\n\t\t});\n\n\tconst channels: (APIGuildCategoryChannel | APITextChannel)[] = [];\n\tfor (const top of sortedTopLevel ?? []) {\n\t\tchannels.push(top);\n\n\t\tif (top.type === ChannelType.GuildCategory) {\n\t\t\tchannels.push(...(grouped[top.id] ?? []).sort((a, b) => a.position! - b.position!));\n\t\t}\n\t}\n\n\treturn channels.length ? channels : filtered.sort((a, b) => a.position! - b.position!);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/embed.ts","../src/sortChannels.ts"],"sourcesContent":["export * from './embed.js';\nexport * from './sortChannels.js';\n","import type { APIEmbed, APIEmbedField } from 'discord-api-types/v10';\n\n/**\n * Limits commonly encountered with Discord's API\n */\nexport const MESSAGE_LIMITS = {\n\t/**\n\t * How long a message can be in characters\n\t */\n\tCONTENT: 4_000,\n\t/**\n\t * How many embeds can be in a message\n\t */\n\tEMBED_COUNT: 10,\n\t/**\n\t * Embed specific limits\n\t */\n\tEMBEDS: {\n\t\t/**\n\t\t * How long an embed title can be in characters\n\t\t */\n\t\tTITLE: 256,\n\t\t/**\n\t\t * How long an embed description can be in characters\n\t\t */\n\t\tDESCRIPTION: 4_096,\n\t\t/**\n\t\t * How long an embed footer can be in characters\n\t\t */\n\t\tFOOTER: 2_048,\n\t\t/**\n\t\t * How long an embed author can be in characters\n\t\t */\n\t\tAUTHOR: 256,\n\t\t/**\n\t\t * How many fields an embed can have\n\t\t */\n\t\tFIELD_COUNT: 25,\n\t\t/**\n\t\t * Field specific limits\n\t\t */\n\t\tFIELDS: {\n\t\t\t/**\n\t\t\t * How long a field name can be in characters\n\t\t\t */\n\t\t\tNAME: 256,\n\t\t\t/**\n\t\t\t * How long a field value can be in characters\n\t\t\t */\n\t\t\tVALUE: 1_024,\n\t\t},\n\t},\n} as const;\n\n/**\n * Adds the given fields to an embed - mutating it\n *\n * @param embed - The embed to add fields to\n * @param fields - The fields to add\n */\nexport function addFields(embed: APIEmbed, ...fields: APIEmbedField[]): APIEmbed {\n\t(embed.fields ??= []).push(...fields);\n\treturn embed;\n}\n\n/**\n * Cuts off text after the given length - appending \"...\" at the end\n *\n * @param text - The text to cut off\n * @param total - The maximum length of the text\n */\nexport function ellipsis(text: string, total: number): string {\n\tif (text.length <= total) {\n\t\treturn text;\n\t}\n\n\tconst keep = total - 3;\n\tif (keep < 1) {\n\t\treturn text.slice(0, total);\n\t}\n\n\treturn `${text.slice(0, keep)}...`;\n}\n\n/**\n * Returns a fully truncated embed - safe to use with Discord's API - does not mutate the given embed\n *\n * @param embed - The embed to truncate\n */\nexport function truncateEmbed(embed: APIEmbed): APIEmbed {\n\t// @ts-expect-error - Because of the explicit undefined\n\treturn {\n\t\t...embed,\n\t\tdescription: embed.description ? ellipsis(embed.description, MESSAGE_LIMITS.EMBEDS.DESCRIPTION) : undefined,\n\t\ttitle: embed.title ? ellipsis(embed.title, MESSAGE_LIMITS.EMBEDS.TITLE) : undefined,\n\t\tauthor: embed.author\n\t\t\t? {\n\t\t\t\t\t...embed.author,\n\t\t\t\t\tname: ellipsis(embed.author.name, MESSAGE_LIMITS.EMBEDS.AUTHOR),\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tfooter: embed.footer\n\t\t\t? {\n\t\t\t\t\t...embed.footer,\n\t\t\t\t\ttext: ellipsis(embed.footer.text, MESSAGE_LIMITS.EMBEDS.FOOTER),\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tfields: embed.fields\n\t\t\t? embed.fields\n\t\t\t\t\t.map((field) => ({\n\t\t\t\t\t\tname: ellipsis(field.name, MESSAGE_LIMITS.EMBEDS.FIELDS.NAME),\n\t\t\t\t\t\tvalue: ellipsis(field.value, MESSAGE_LIMITS.EMBEDS.FIELDS.VALUE),\n\t\t\t\t\t}))\n\t\t\t\t\t.slice(0, MESSAGE_LIMITS.EMBEDS.FIELD_COUNT)\n\t\t\t: [],\n\t};\n}\n","import { ChannelType } from 'discord-api-types/v10';\n\nconst GUILD_TEXT_TYPES = [ChannelType.GuildText, ChannelType.GuildNews, ChannelType.GuildForum];\nconst THREAD_TYPES = [ChannelType.PublicThread, ChannelType.PrivateThread, ChannelType.AnnouncementThread];\n\n/**\n * The minimal channel shape `sortChannels` actually reads from -- callers aren't required to hand it a full\n * over-the-wire `APIChannel`, just anything with these fields (e.g. a dashboard's slimmer cached projection).\n */\nexport interface SortableChannelLike {\n\tid: string;\n\tparent_id?: string | null;\n\tposition?: number;\n\ttype: ChannelType;\n}\n\n/**\n * Sorts an array of text, category channels, and threads. Generic over `TChannel` so the input shape is\n * preserved on the way out instead of being widened/narrowed to a specific Discord API union.\n */\nexport function sortChannels<TChannel extends SortableChannelLike>(unsorted: TChannel[]): TChannel[] {\n\tconst filtered = unsorted.filter(\n\t\t(channel) =>\n\t\t\tGUILD_TEXT_TYPES.includes(channel.type) ||\n\t\t\tchannel.type === ChannelType.GuildCategory ||\n\t\t\tTHREAD_TYPES.includes(channel.type),\n\t);\n\n\t// Separate threads from other channels\n\tconst threads = filtered.filter((channel) => THREAD_TYPES.includes(channel.type));\n\tconst nonThreads = filtered.filter((channel) => !THREAD_TYPES.includes(channel.type));\n\n\t// Group the non-thread channels by their category - or \"top\" if they aren't in one\n\tconst grouped = Object.groupBy(nonThreads, (channel) => channel.parent_id ?? 'top');\n\n\t// Sort the top level channels - text channels are above category channels, otherwise use their position\n\tconst sortedTopLevel = grouped['top']\n\t\t?.filter((channel) => !channel.parent_id)\n\t\t.sort((a, b) => {\n\t\t\tif (a.type === ChannelType.GuildText && b.type === ChannelType.GuildCategory) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tif (a.type === ChannelType.GuildCategory && b.type === ChannelType.GuildText) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\treturn (a.position ?? 0) - (b.position ?? 0);\n\t\t});\n\n\tconst channels: TChannel[] = [];\n\tfor (const top of sortedTopLevel ?? []) {\n\t\tchannels.push(top);\n\n\t\tif (top.type === ChannelType.GuildCategory) {\n\t\t\t// Add channels in this category\n\t\t\tconst categoryChannels = (grouped[top.id] ?? []).sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n\t\t\tchannels.push(...categoryChannels);\n\n\t\t\t// Add threads for each channel in the category\n\t\t\tfor (const channel of categoryChannels) {\n\t\t\t\tconst channelThreads = threads\n\t\t\t\t\t.filter((thread) => thread.parent_id === channel.id)\n\t\t\t\t\t.sort((a, b) => Number(BigInt(b.id) - BigInt(a.id)));\n\t\t\t\tchannels.push(...channelThreads);\n\t\t\t}\n\t\t} else {\n\t\t\t// Add threads for top-level channels\n\t\t\tconst channelThreads = threads\n\t\t\t\t.filter((thread) => thread.parent_id === top.id)\n\t\t\t\t.sort((a, b) => Number(BigInt(b.id) - BigInt(a.id)));\n\t\t\tchannels.push(...channelThreads);\n\t\t}\n\t}\n\n\treturn channels.length ? channels : filtered.sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -90,28 +90,39 @@ __name(truncateEmbed, "truncateEmbed");
90
90
  // src/sortChannels.ts
91
91
  import { ChannelType } from "discord-api-types/v10";
92
92
  var GUILD_TEXT_TYPES = [ChannelType.GuildText, ChannelType.GuildNews, ChannelType.GuildForum];
93
+ var THREAD_TYPES = [ChannelType.PublicThread, ChannelType.PrivateThread, ChannelType.AnnouncementThread];
93
94
  function sortChannels(unsorted) {
94
95
  const filtered = unsorted.filter(
95
- (channel) => GUILD_TEXT_TYPES.includes(channel.type) || channel.type === ChannelType.GuildCategory
96
+ (channel) => GUILD_TEXT_TYPES.includes(channel.type) || channel.type === ChannelType.GuildCategory || THREAD_TYPES.includes(channel.type)
96
97
  );
97
- const grouped = Object.groupBy(filtered, (channel) => channel.parent_id ?? "top");
98
- const sortedTopLevel = grouped.top?.filter((channel) => !channel.parent_id).sort((a, b) => {
98
+ const threads = filtered.filter((channel) => THREAD_TYPES.includes(channel.type));
99
+ const nonThreads = filtered.filter((channel) => !THREAD_TYPES.includes(channel.type));
100
+ const grouped = Object.groupBy(nonThreads, (channel) => channel.parent_id ?? "top");
101
+ const sortedTopLevel = grouped["top"]?.filter((channel) => !channel.parent_id).sort((a, b) => {
99
102
  if (a.type === ChannelType.GuildText && b.type === ChannelType.GuildCategory) {
100
103
  return -1;
101
104
  }
102
105
  if (a.type === ChannelType.GuildCategory && b.type === ChannelType.GuildText) {
103
106
  return 1;
104
107
  }
105
- return a.position - b.position;
108
+ return (a.position ?? 0) - (b.position ?? 0);
106
109
  });
107
110
  const channels = [];
108
111
  for (const top of sortedTopLevel ?? []) {
109
112
  channels.push(top);
110
113
  if (top.type === ChannelType.GuildCategory) {
111
- channels.push(...(grouped[top.id] ?? []).sort((a, b) => a.position - b.position));
114
+ const categoryChannels = (grouped[top.id] ?? []).sort((a, b) => (a.position ?? 0) - (b.position ?? 0));
115
+ channels.push(...categoryChannels);
116
+ for (const channel of categoryChannels) {
117
+ const channelThreads = threads.filter((thread) => thread.parent_id === channel.id).sort((a, b) => Number(BigInt(b.id) - BigInt(a.id)));
118
+ channels.push(...channelThreads);
119
+ }
120
+ } else {
121
+ const channelThreads = threads.filter((thread) => thread.parent_id === top.id).sort((a, b) => Number(BigInt(b.id) - BigInt(a.id)));
122
+ channels.push(...channelThreads);
112
123
  }
113
124
  }
114
- return channels.length ? channels : filtered.sort((a, b) => a.position - b.position);
125
+ return channels.length ? channels : filtered.sort((a, b) => (a.position ?? 0) - (b.position ?? 0));
115
126
  }
116
127
  __name(sortChannels, "sortChannels");
117
128
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/embed.ts","../src/sortChannels.ts"],"sourcesContent":["import type { APIEmbed, APIEmbedField } from 'discord-api-types/v10';\n\n/**\n * Limits commonly encountered with Discord's API\n */\nexport const MESSAGE_LIMITS = {\n\t/**\n\t * How long a message can be in characters\n\t */\n\tCONTENT: 4_000,\n\t/**\n\t * How many embeds can be in a message\n\t */\n\tEMBED_COUNT: 10,\n\t/**\n\t * Embed specific limits\n\t */\n\tEMBEDS: {\n\t\t/**\n\t\t * How long an embed title can be in characters\n\t\t */\n\t\tTITLE: 256,\n\t\t/**\n\t\t * How long an embed description can be in characters\n\t\t */\n\t\tDESCRIPTION: 4_096,\n\t\t/**\n\t\t * How long an embed footer can be in characters\n\t\t */\n\t\tFOOTER: 2_048,\n\t\t/**\n\t\t * How long an embed author can be in characters\n\t\t */\n\t\tAUTHOR: 256,\n\t\t/**\n\t\t * How many fields an embed can have\n\t\t */\n\t\tFIELD_COUNT: 25,\n\t\t/**\n\t\t * Field specific limits\n\t\t */\n\t\tFIELDS: {\n\t\t\t/**\n\t\t\t * How long a field name can be in characters\n\t\t\t */\n\t\t\tNAME: 256,\n\t\t\t/**\n\t\t\t * How long a field value can be in characters\n\t\t\t */\n\t\t\tVALUE: 1_024,\n\t\t},\n\t},\n} as const;\n\n/**\n * Adds the given fields to an embed - mutating it\n *\n * @param embed - The embed to add fields to\n * @param fields - The fields to add\n */\nexport function addFields(embed: APIEmbed, ...fields: APIEmbedField[]): APIEmbed {\n\t(embed.fields ??= []).push(...fields);\n\treturn embed;\n}\n\n/**\n * Cuts off text after the given length - appending \"...\" at the end\n *\n * @param text - The text to cut off\n * @param total - The maximum length of the text\n */\nexport function ellipsis(text: string, total: number): string {\n\tif (text.length <= total) {\n\t\treturn text;\n\t}\n\n\tconst keep = total - 3;\n\tif (keep < 1) {\n\t\treturn text.slice(0, total);\n\t}\n\n\treturn `${text.slice(0, keep)}...`;\n}\n\n/**\n * Returns a fully truncated embed - safe to use with Discord's API - does not mutate the given embed\n *\n * @param embed - The embed to truncate\n */\nexport function truncateEmbed(embed: APIEmbed): APIEmbed {\n\treturn {\n\t\t...embed,\n\t\tdescription: embed.description ? ellipsis(embed.description, MESSAGE_LIMITS.EMBEDS.DESCRIPTION) : undefined,\n\t\ttitle: embed.title ? ellipsis(embed.title, MESSAGE_LIMITS.EMBEDS.TITLE) : undefined,\n\t\tauthor: embed.author\n\t\t\t? {\n\t\t\t\t\t...embed.author,\n\t\t\t\t\tname: ellipsis(embed.author.name, MESSAGE_LIMITS.EMBEDS.AUTHOR),\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tfooter: embed.footer\n\t\t\t? {\n\t\t\t\t\t...embed.footer,\n\t\t\t\t\ttext: ellipsis(embed.footer.text, MESSAGE_LIMITS.EMBEDS.FOOTER),\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tfields: embed.fields\n\t\t\t? embed.fields\n\t\t\t\t\t.map((field) => ({\n\t\t\t\t\t\tname: ellipsis(field.name, MESSAGE_LIMITS.EMBEDS.FIELDS.NAME),\n\t\t\t\t\t\tvalue: ellipsis(field.value, MESSAGE_LIMITS.EMBEDS.FIELDS.VALUE),\n\t\t\t\t\t}))\n\t\t\t\t\t.slice(0, MESSAGE_LIMITS.EMBEDS.FIELD_COUNT)\n\t\t\t: [],\n\t};\n}\n","import type { APIChannel, APIGuildCategoryChannel, APITextChannel } from 'discord-api-types/v10';\nimport { ChannelType } from 'discord-api-types/v10';\n\nconst GUILD_TEXT_TYPES = [ChannelType.GuildText, ChannelType.GuildNews, ChannelType.GuildForum];\n\n/**\n * Sorts an array of text and category channels - **does not support other channel types**\n */\nexport function sortChannels(unsorted: APIChannel[]): (APIGuildCategoryChannel | APITextChannel)[] {\n\tconst filtered = unsorted.filter(\n\t\t(channel): channel is APIGuildCategoryChannel | APITextChannel =>\n\t\t\tGUILD_TEXT_TYPES.includes(channel.type) || channel.type === ChannelType.GuildCategory,\n\t);\n\n\t// Group the channels by their category - or \"top\" if they aren't in one\n\tconst grouped = Object.groupBy(filtered, (channel) => channel.parent_id ?? 'top');\n\n\t// Sort the top level channels - text channels are above category channels, otherwise use their position\n\tconst sortedTopLevel = grouped.top\n\t\t?.filter((channel) => !channel.parent_id)\n\t\t.sort((a, b) => {\n\t\t\tif (a.type === ChannelType.GuildText && b.type === ChannelType.GuildCategory) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tif (a.type === ChannelType.GuildCategory && b.type === ChannelType.GuildText) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\treturn a.position! - b.position!;\n\t\t});\n\n\tconst channels: (APIGuildCategoryChannel | APITextChannel)[] = [];\n\tfor (const top of sortedTopLevel ?? []) {\n\t\tchannels.push(top);\n\n\t\tif (top.type === ChannelType.GuildCategory) {\n\t\t\tchannels.push(...(grouped[top.id] ?? []).sort((a, b) => a.position! - b.position!));\n\t\t}\n\t}\n\n\treturn channels.length ? channels : filtered.sort((a, b) => a.position! - b.position!);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/embed.ts","../src/sortChannels.ts"],"sourcesContent":["import type { APIEmbed, APIEmbedField } from 'discord-api-types/v10';\n\n/**\n * Limits commonly encountered with Discord's API\n */\nexport const MESSAGE_LIMITS = {\n\t/**\n\t * How long a message can be in characters\n\t */\n\tCONTENT: 4_000,\n\t/**\n\t * How many embeds can be in a message\n\t */\n\tEMBED_COUNT: 10,\n\t/**\n\t * Embed specific limits\n\t */\n\tEMBEDS: {\n\t\t/**\n\t\t * How long an embed title can be in characters\n\t\t */\n\t\tTITLE: 256,\n\t\t/**\n\t\t * How long an embed description can be in characters\n\t\t */\n\t\tDESCRIPTION: 4_096,\n\t\t/**\n\t\t * How long an embed footer can be in characters\n\t\t */\n\t\tFOOTER: 2_048,\n\t\t/**\n\t\t * How long an embed author can be in characters\n\t\t */\n\t\tAUTHOR: 256,\n\t\t/**\n\t\t * How many fields an embed can have\n\t\t */\n\t\tFIELD_COUNT: 25,\n\t\t/**\n\t\t * Field specific limits\n\t\t */\n\t\tFIELDS: {\n\t\t\t/**\n\t\t\t * How long a field name can be in characters\n\t\t\t */\n\t\t\tNAME: 256,\n\t\t\t/**\n\t\t\t * How long a field value can be in characters\n\t\t\t */\n\t\t\tVALUE: 1_024,\n\t\t},\n\t},\n} as const;\n\n/**\n * Adds the given fields to an embed - mutating it\n *\n * @param embed - The embed to add fields to\n * @param fields - The fields to add\n */\nexport function addFields(embed: APIEmbed, ...fields: APIEmbedField[]): APIEmbed {\n\t(embed.fields ??= []).push(...fields);\n\treturn embed;\n}\n\n/**\n * Cuts off text after the given length - appending \"...\" at the end\n *\n * @param text - The text to cut off\n * @param total - The maximum length of the text\n */\nexport function ellipsis(text: string, total: number): string {\n\tif (text.length <= total) {\n\t\treturn text;\n\t}\n\n\tconst keep = total - 3;\n\tif (keep < 1) {\n\t\treturn text.slice(0, total);\n\t}\n\n\treturn `${text.slice(0, keep)}...`;\n}\n\n/**\n * Returns a fully truncated embed - safe to use with Discord's API - does not mutate the given embed\n *\n * @param embed - The embed to truncate\n */\nexport function truncateEmbed(embed: APIEmbed): APIEmbed {\n\t// @ts-expect-error - Because of the explicit undefined\n\treturn {\n\t\t...embed,\n\t\tdescription: embed.description ? ellipsis(embed.description, MESSAGE_LIMITS.EMBEDS.DESCRIPTION) : undefined,\n\t\ttitle: embed.title ? ellipsis(embed.title, MESSAGE_LIMITS.EMBEDS.TITLE) : undefined,\n\t\tauthor: embed.author\n\t\t\t? {\n\t\t\t\t\t...embed.author,\n\t\t\t\t\tname: ellipsis(embed.author.name, MESSAGE_LIMITS.EMBEDS.AUTHOR),\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tfooter: embed.footer\n\t\t\t? {\n\t\t\t\t\t...embed.footer,\n\t\t\t\t\ttext: ellipsis(embed.footer.text, MESSAGE_LIMITS.EMBEDS.FOOTER),\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tfields: embed.fields\n\t\t\t? embed.fields\n\t\t\t\t\t.map((field) => ({\n\t\t\t\t\t\tname: ellipsis(field.name, MESSAGE_LIMITS.EMBEDS.FIELDS.NAME),\n\t\t\t\t\t\tvalue: ellipsis(field.value, MESSAGE_LIMITS.EMBEDS.FIELDS.VALUE),\n\t\t\t\t\t}))\n\t\t\t\t\t.slice(0, MESSAGE_LIMITS.EMBEDS.FIELD_COUNT)\n\t\t\t: [],\n\t};\n}\n","import { ChannelType } from 'discord-api-types/v10';\n\nconst GUILD_TEXT_TYPES = [ChannelType.GuildText, ChannelType.GuildNews, ChannelType.GuildForum];\nconst THREAD_TYPES = [ChannelType.PublicThread, ChannelType.PrivateThread, ChannelType.AnnouncementThread];\n\n/**\n * The minimal channel shape `sortChannels` actually reads from -- callers aren't required to hand it a full\n * over-the-wire `APIChannel`, just anything with these fields (e.g. a dashboard's slimmer cached projection).\n */\nexport interface SortableChannelLike {\n\tid: string;\n\tparent_id?: string | null;\n\tposition?: number;\n\ttype: ChannelType;\n}\n\n/**\n * Sorts an array of text, category channels, and threads. Generic over `TChannel` so the input shape is\n * preserved on the way out instead of being widened/narrowed to a specific Discord API union.\n */\nexport function sortChannels<TChannel extends SortableChannelLike>(unsorted: TChannel[]): TChannel[] {\n\tconst filtered = unsorted.filter(\n\t\t(channel) =>\n\t\t\tGUILD_TEXT_TYPES.includes(channel.type) ||\n\t\t\tchannel.type === ChannelType.GuildCategory ||\n\t\t\tTHREAD_TYPES.includes(channel.type),\n\t);\n\n\t// Separate threads from other channels\n\tconst threads = filtered.filter((channel) => THREAD_TYPES.includes(channel.type));\n\tconst nonThreads = filtered.filter((channel) => !THREAD_TYPES.includes(channel.type));\n\n\t// Group the non-thread channels by their category - or \"top\" if they aren't in one\n\tconst grouped = Object.groupBy(nonThreads, (channel) => channel.parent_id ?? 'top');\n\n\t// Sort the top level channels - text channels are above category channels, otherwise use their position\n\tconst sortedTopLevel = grouped['top']\n\t\t?.filter((channel) => !channel.parent_id)\n\t\t.sort((a, b) => {\n\t\t\tif (a.type === ChannelType.GuildText && b.type === ChannelType.GuildCategory) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tif (a.type === ChannelType.GuildCategory && b.type === ChannelType.GuildText) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\treturn (a.position ?? 0) - (b.position ?? 0);\n\t\t});\n\n\tconst channels: TChannel[] = [];\n\tfor (const top of sortedTopLevel ?? []) {\n\t\tchannels.push(top);\n\n\t\tif (top.type === ChannelType.GuildCategory) {\n\t\t\t// Add channels in this category\n\t\t\tconst categoryChannels = (grouped[top.id] ?? []).sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n\t\t\tchannels.push(...categoryChannels);\n\n\t\t\t// Add threads for each channel in the category\n\t\t\tfor (const channel of categoryChannels) {\n\t\t\t\tconst channelThreads = threads\n\t\t\t\t\t.filter((thread) => thread.parent_id === channel.id)\n\t\t\t\t\t.sort((a, b) => Number(BigInt(b.id) - BigInt(a.id)));\n\t\t\t\tchannels.push(...channelThreads);\n\t\t\t}\n\t\t} else {\n\t\t\t// Add threads for top-level channels\n\t\t\tconst channelThreads = threads\n\t\t\t\t.filter((thread) => thread.parent_id === top.id)\n\t\t\t\t.sort((a, b) => Number(BigInt(b.id) - BigInt(a.id)));\n\t\t\tchannels.push(...channelThreads);\n\t\t}\n\t}\n\n\treturn channels.length ? channels : filtered.sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n}\n"],"mappings":"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","names":[]}
@@ -1,3 +1,17 @@
1
- import type { APIChannel, APIGuildCategoryChannel, APITextChannel } from 'discord-api-types/v10';
2
- export declare function sortChannels(unsorted: APIChannel[]): (APIGuildCategoryChannel | APITextChannel)[];
1
+ import { ChannelType } from 'discord-api-types/v10';
2
+ /**
3
+ * The minimal channel shape `sortChannels` actually reads from -- callers aren't required to hand it a full
4
+ * over-the-wire `APIChannel`, just anything with these fields (e.g. a dashboard's slimmer cached projection).
5
+ */
6
+ export interface SortableChannelLike {
7
+ id: string;
8
+ parent_id?: string | null;
9
+ position?: number;
10
+ type: ChannelType;
11
+ }
12
+ /**
13
+ * Sorts an array of text, category channels, and threads. Generic over `TChannel` so the input shape is
14
+ * preserved on the way out instead of being widened/narrowed to a specific Discord API union.
15
+ */
16
+ export declare function sortChannels<TChannel extends SortableChannelLike>(unsorted: TChannel[]): TChannel[];
3
17
  //# sourceMappingURL=sortChannels.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sortChannels.d.ts","sourceRoot":"","sources":["../src/sortChannels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAQjG,wBAAgB,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,uBAAuB,GAAG,cAAc,CAAC,EAAE,CAkCjG"}
1
+ {"version":3,"file":"sortChannels.d.ts","sourceRoot":"","sources":["../src/sortChannels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKpD;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,SAAS,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAwDnG"}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@chatsift/discord-utils",
3
3
  "description": "Niche utilities for working with Discord's raw API",
4
- "version": "0.5.1",
4
+ "version": "0.6.1",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "exports": {
8
+ "types": "./dist/index.d.ts",
8
9
  "import": "./dist/index.mjs",
9
- "require": "./dist/index.js",
10
- "types": "./dist/index.d.ts"
10
+ "require": "./dist/index.js"
11
11
  },
12
12
  "directories": {
13
13
  "lib": "src"
@@ -18,25 +18,28 @@
18
18
  "scripts": {
19
19
  "build": "tsup && tsc",
20
20
  "test": "vitest run",
21
+ "test:watch": "vitest",
21
22
  "lint": "eslint src",
22
- "prepack": "yarn build"
23
+ "lint:fix": "eslint src --fix",
24
+ "clean": "rimraf dist"
23
25
  },
24
26
  "repository": {
25
27
  "type": "git",
26
- "url": "https://github.com/chatsift/chatsift.git"
28
+ "url": "https://github.com/chatsift/chatsift.git",
29
+ "directory": "packages/npm/discord-utils"
27
30
  },
28
31
  "bugs": {
29
32
  "url": "https://github.com/chatsift/chatsift/issues"
30
33
  },
31
34
  "homepage": "https://github.com/chatsift/chatsift",
32
35
  "devDependencies": {
33
- "@types/node": "^20.14.12",
34
- "tsup": "^8.2.3",
35
- "typescript": "^5.5.4",
36
- "vitest": "^2.0.4"
36
+ "@types/node": "^24.9.1",
37
+ "tsup": "^8.5.1",
38
+ "typescript": "~6.0.3",
39
+ "vitest": "^4.1.10"
37
40
  },
38
41
  "dependencies": {
39
- "discord-api-types": "^0.37.93",
40
- "tslib": "^2.6.3"
42
+ "discord-api-types": "^0.38.50",
43
+ "tslib": "^2.8.1"
41
44
  }
42
45
  }
@@ -1 +0,0 @@
1
- {"program":{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.es2023.d.ts","../../../node_modules/typescript/lib/lib.esnext.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../../node_modules/typescript/lib/lib.esnext.array.d.ts","../../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../node_modules/typescript/lib/lib.esnext.string.d.ts","../../../node_modules/typescript/lib/lib.esnext.promise.d.ts","../../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../../node_modules/typescript/lib/lib.esnext.object.d.ts","../../../node_modules/typescript/lib/lib.esnext.regexp.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/tslib/tslib.d.ts","../../../node_modules/discord-api-types/globals.d.ts","../../../node_modules/discord-api-types/rest/common.d.ts","../../../node_modules/discord-api-types/payloads/common.d.ts","../../../node_modules/discord-api-types/payloads/v10/permissions.d.ts","../../../node_modules/discord-api-types/payloads/v10/user.d.ts","../../../node_modules/discord-api-types/payloads/v10/emoji.d.ts","../../../node_modules/discord-api-types/payloads/v10/oauth2.d.ts","../../../node_modules/discord-api-types/payloads/v10/sticker.d.ts","../../../node_modules/discord-api-types/payloads/v10/guild.d.ts","../../../node_modules/discord-api-types/payloads/v10/automoderation.d.ts","../../../node_modules/discord-api-types/payloads/v10/guildscheduledevent.d.ts","../../../node_modules/discord-api-types/payloads/v10/stageinstance.d.ts","../../../node_modules/discord-api-types/payloads/v10/webhook.d.ts","../../../node_modules/discord-api-types/payloads/v10/auditlog.d.ts","../../../node_modules/discord-api-types/payloads/v10/invite.d.ts","../../../node_modules/discord-api-types/payloads/v10/poll.d.ts","../../../node_modules/discord-api-types/payloads/v10/teams.d.ts","../../../node_modules/discord-api-types/utils/internals.d.ts","../../../node_modules/discord-api-types/rest/v10/application.d.ts","../../../node_modules/discord-api-types/rest/v10/auditlog.d.ts","../../../node_modules/discord-api-types/rest/v10/automoderation.d.ts","../../../node_modules/discord-api-types/rest/v10/poll.d.ts","../../../node_modules/discord-api-types/rest/v10/channel.d.ts","../../../node_modules/discord-api-types/rest/v10/emoji.d.ts","../../../node_modules/discord-api-types/rest/v10/gateway.d.ts","../../../node_modules/discord-api-types/rest/v10/guild.d.ts","../../../node_modules/discord-api-types/rest/v10/guildscheduledevent.d.ts","../../../node_modules/discord-api-types/rest/v10/webhook.d.ts","../../../node_modules/discord-api-types/rest/v10/interactions.d.ts","../../../node_modules/discord-api-types/rest/v10/invite.d.ts","../../../node_modules/discord-api-types/rest/v10/oauth2.d.ts","../../../node_modules/discord-api-types/rest/v10/stageinstance.d.ts","../../../node_modules/discord-api-types/rest/v10/sticker.d.ts","../../../node_modules/discord-api-types/rest/v10/template.d.ts","../../../node_modules/discord-api-types/rest/v10/user.d.ts","../../../node_modules/discord-api-types/rest/v10/voice.d.ts","../../../node_modules/discord-api-types/rest/v10/monetization.d.ts","../../../node_modules/discord-api-types/rest/v10/index.d.ts","../../../node_modules/discord-api-types/payloads/v10/template.d.ts","../../../node_modules/discord-api-types/payloads/v10/voice.d.ts","../../../node_modules/discord-api-types/payloads/v10/monetization.d.ts","../../../node_modules/discord-api-types/payloads/v10/index.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/responses.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/base.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/shared.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/base.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/attachment.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/boolean.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/channel.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/integer.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/mentionable.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/number.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/role.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/string.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/subcommand.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/subcommandgroup.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/_chatinput/user.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/internals.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/chatinput.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/contextmenu.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/_applicationcommands/permissions.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/applicationcommands.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/autocomplete.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/messagecomponents.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/modalsubmit.d.ts","../../../node_modules/discord-api-types/payloads/v10/_interactions/ping.d.ts","../../../node_modules/discord-api-types/payloads/v10/interactions.d.ts","../../../node_modules/discord-api-types/payloads/v10/application.d.ts","../../../node_modules/discord-api-types/payloads/v10/channel.d.ts","../../../node_modules/discord-api-types/payloads/v10/gateway.d.ts","../../../node_modules/discord-api-types/gateway/common.d.ts","../../../node_modules/discord-api-types/gateway/v10.d.ts","../../../node_modules/discord-api-types/rpc/common.d.ts","../../../node_modules/discord-api-types/rpc/v10.d.ts","../../../node_modules/discord-api-types/utils/v10.d.ts","../../../node_modules/discord-api-types/v10.d.ts","../src/embed.ts","../src/sortchannels.ts","../src/index.ts","../../../node_modules/@types/acorn/node_modules/@types/estree/index.d.ts","../../../node_modules/@types/acorn/index.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/buffer/index.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/file.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/filereader.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/dom-events.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/globals.global.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@types/concat-stream/index.d.ts","../../../node_modules/@types/conventional-commits-parser/index.d.ts","../../../node_modules/@types/cross-spawn/index.d.ts","../../../node_modules/@types/ms/index.d.ts","../../../node_modules/@types/debug/index.d.ts","../../../node_modules/@types/eslint/helpers.d.ts","../../../node_modules/@types/eslint/node_modules/@types/estree/index.d.ts","../../../node_modules/@types/json-schema/index.d.ts","../../../node_modules/@types/eslint/index.d.ts","../../../node_modules/@types/estree/index.d.ts","../../../node_modules/@types/estree-jsx/node_modules/@types/estree/index.d.ts","../../../node_modules/@types/estree-jsx/index.d.ts","../../../node_modules/@types/unist/index.d.ts","../../../node_modules/@types/hast/index.d.ts","../../../node_modules/@types/is-empty/index.d.ts","../../../node_modules/@types/mdast/index.d.ts","../../../node_modules/@types/normalize-package-data/index.d.ts","../../../node_modules/pg-types/index.d.ts","../../../node_modules/pg-protocol/dist/messages.d.ts","../../../node_modules/pg-protocol/dist/serializer.d.ts","../../../node_modules/pg-protocol/dist/parser.d.ts","../../../node_modules/pg-protocol/dist/index.d.ts","../../../node_modules/@types/pg/index.d.ts","../../../node_modules/@types/retry/index.d.ts","../../../node_modules/@types/semver/classes/semver.d.ts","../../../node_modules/@types/semver/functions/parse.d.ts","../../../node_modules/@types/semver/functions/valid.d.ts","../../../node_modules/@types/semver/functions/clean.d.ts","../../../node_modules/@types/semver/functions/inc.d.ts","../../../node_modules/@types/semver/functions/diff.d.ts","../../../node_modules/@types/semver/functions/major.d.ts","../../../node_modules/@types/semver/functions/minor.d.ts","../../../node_modules/@types/semver/functions/patch.d.ts","../../../node_modules/@types/semver/functions/prerelease.d.ts","../../../node_modules/@types/semver/functions/compare.d.ts","../../../node_modules/@types/semver/functions/rcompare.d.ts","../../../node_modules/@types/semver/functions/compare-loose.d.ts","../../../node_modules/@types/semver/functions/compare-build.d.ts","../../../node_modules/@types/semver/functions/sort.d.ts","../../../node_modules/@types/semver/functions/rsort.d.ts","../../../node_modules/@types/semver/functions/gt.d.ts","../../../node_modules/@types/semver/functions/lt.d.ts","../../../node_modules/@types/semver/functions/eq.d.ts","../../../node_modules/@types/semver/functions/neq.d.ts","../../../node_modules/@types/semver/functions/gte.d.ts","../../../node_modules/@types/semver/functions/lte.d.ts","../../../node_modules/@types/semver/functions/cmp.d.ts","../../../node_modules/@types/semver/functions/coerce.d.ts","../../../node_modules/@types/semver/classes/comparator.d.ts","../../../node_modules/@types/semver/classes/range.d.ts","../../../node_modules/@types/semver/functions/satisfies.d.ts","../../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../../node_modules/@types/semver/ranges/min-version.d.ts","../../../node_modules/@types/semver/ranges/valid.d.ts","../../../node_modules/@types/semver/ranges/outside.d.ts","../../../node_modules/@types/semver/ranges/gtr.d.ts","../../../node_modules/@types/semver/ranges/ltr.d.ts","../../../node_modules/@types/semver/ranges/intersects.d.ts","../../../node_modules/@types/semver/ranges/simplify.d.ts","../../../node_modules/@types/semver/ranges/subset.d.ts","../../../node_modules/@types/semver/internals/identifiers.d.ts","../../../node_modules/@types/semver/index.d.ts","../../../node_modules/@types/supports-color/index.d.ts","../../../node_modules/@types/ws/index.d.ts","../../../node_modules/@types/yargs-parser/index.d.ts","../../../node_modules/@types/yargs/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","17edc026abf73c5c2dd508652d63f68ec4efd9d4856e3469890d27598209feb5",{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true},{"version":"d8670852241d4c6e03f2b89d67497a4bbefe29ecaa5a444e2c11a9b05e6fccc6","affectsGlobalScope":true},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true},{"version":"9d540251809289a05349b70ab5f4b7b99f922af66ab3c39ba56a475dcf95d5ff","affectsGlobalScope":true},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true},{"version":"0b11f3ca66aa33124202c80b70cd203219c3d4460cfc165e0707aa9ec710fc53","affectsGlobalScope":true},{"version":"6a3f5a0129cc80cf439ab71164334d649b47059a4f5afca90282362407d0c87f","affectsGlobalScope":true},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true},{"version":"15b98a533864d324e5f57cd3cfc0579b231df58c1c0f6063ea0fcb13c3c74ff9","affectsGlobalScope":true},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"4a882ffbb4ed09d9b7734f784aebb1dfe488d63725c40759165c5d9c657ca029","b5557e20f64bcf823a12d8fc205dbc948f79300dcd5c58e9c2c41477cfb47046","6a2b4ef4f1ab46c5310acc3d8f05b6f5554c8ca7404a59f40e4249c8e1043080","2adcf899bb7cba5fed9beb746784ac0e4be318784d8508c45061719c0df7cff4","005e759b6411813747f284a6dbd949ebdafafaf1e1ce0de0d65079980d4e4ac6","edf2fd0aad3f855d0242c25c74c81a3d0acab39c826cb1ab4633ac92aa31475d","d0863f81c9f2c13fca21445a0ae679e6f51b57283719f30c64d85a5d08a02a0c","7dcfa67ddc7767293a28ffad01f6af160b0f63c16637310bed5ab4989c5871cd","a2bcc4ce3027fff027f577650165392e58b6b8910a6d4f6481abb3ba2032ae83","d051053481c54e5027b14fc9d8ac2ebe653d1bb4ee71ee2a95c110b29d17e1ee","75700defb2dd3a05768e05d996b520a7e061725dbbc48972f0445d594884856b","c7e70a30601919dd952a453fd156a90917402e6a759163a78b1c50dca4c34e1d","d05a4958e2c16c7d23cd2d6ce798a47f22ebce0261edaa170e95e9e3f2750359","5d310ff3cc8e4a88bc14327b847af9f2fe5cfea07a0d97c6569aba7e6b8bc85f","23241b2e3d9a2fe07d2495ab1183e0d0faf207c4661b0ecf1fb7a4d386f907bd","1e587d16581358b223c464ca38b48eb3aa88e5a3f7c482f899f897b266265b71","b42d4692d0cd7e058f88532ad4007f916fbca2aa8cf7a130f2931e4ece44e198","36dd9c9d9bf84b27500bfc23fed15dbd0b229b8a3a3a8008dd826f77cf2b8d8c","63bb04d80bf30daab935e4c801f4d5fa63c0148b31c944af141eb5c65fc74408","184bee67f9ad85bd099054be5bd0c0fff9cce40dd3588e0f8c62d3634a796463","d53bacf6bea149fd81f4c4812f7b3d28cf104697eb3e370aa6d7c1fd0b254535","4ef86f6b4715067fb89f82f5e2c04b7c6629adb80286fe9149b5a4cde1e69bba","e2bba3d460f3f694b792535c93bb22b87acb9fabd2f71aff89e34e728d1ac9b2","b226268a11b24af6337c7d81e4dd6873d01c7948aaafbd4f63686fda4f87b521","6627b63f41c59d7186d5bfa8eea261e530d2d14a663284850dc51a7a6301f471","4236ff71b9fdc1b6441be8b98a8426f8bf5dabf775a72fdf53b459122d128b1c","e5b7d21bc5f3e300fb11f45d45d7324040a70bdca9f8ba691210ce8355818f25","cd798d80c4496e7ee3c328935869d5fca63f4bc38cf71889524c627c3e5e519d","07b3b44d04859b9635b25f3b5e03eae0da09c2109f613563a869fdab411653a3","e3e2aeadd5ae7a06f807fe7809c047c960326cccd4954dd306d0102565baa666","115e358a8ea88f92998a862985bbc766e4145ebd460cda1f3dc28f33567256b7","e722b184263636c187705534c864042b0c9da89361f821f6ae130f9aca69aa5a","016d436b025cb2fb275ce4aee80af5f1c33d5183e38a8251a5f6ff5cde6e22f9","a893b6c1167c4bada6e1b8a8a015e0fdb2ce5e66479942a6149fb9fc202424f5","fe13392d4d214ceba1aea269cc2799f2d14ba553945738a3db25c2608f663a40","13c713af0e10d90a9b2babf21659922423f78c1a4a76d8ec32347de496be276d","7254777d3c5c0b3678ee73417c361a90e68317beb4dd16cf5d02d88203cd1691","548610f6faf652c5b24305d72c7c4016dc6365f49bea168e1658092c18c54881","9e4c9c98fddaa8b6f1c579246eccbb436bd545580dbda967b6466ef07dcfae00","98d5d5c53e7ee6b9a1e26d438869e40a35c4b29077e3517733152482ab290ac7","fec471dab196078c0805e766caee6f4f1d811e87d87afaed3f71550f2272e2f6","4d0f87ed1cd40e612d64d7f4270b8b8648540a008e60f0efa310d7f2ad40e319","756d455c644abecdc5a8b400e9dd00d3561bcb1d0a0d7ec8a62821ba43662a63","a3506205e611b2afce34f39b17be7a059bfd67eff28c8ad558096a530c0de2a0","acb24795949690693d494f6d15cc82b354cec87e9e14e032aa649f1ef70169d0","814db46e524d863ceea59dba38b93e60e0c5555fce08afcfe6b3a86f90ca1dce","265a4739974854eb43539419a6c86faab7e161b1133496c62f8bf2725542244d","a1accfaac01020c1b866634f7a698fdd48612caccf305e16844665cb7ecac399","ec00441ae4838b8d595acfe3b2750750e4335802b06ba1f41fb03453c2c776b5","ac1689d264991e5f58deb5a82ee44940f091a709b8ca815b38d5a7cb1305ce9f","a6965d48ee610b134de51099ead16d6392545911b1be22a80333cc4ff3be912f","c548226db013facd262a4bc1c32c44a13eda7e1181aa6f569f9bdd531c95b0d5","208c6a8bd5529257694b07dc1f8ed085c89bd5e18134de61da4e95a1ec896461","543f461070fbd4b33bd05a5ba3e472e1297bb1db3c3101092bd69bfdddd3b1a1","8aa0740691fc5b898cc04641c3ecc589c297ac27337c3b8ec053f4f4cb11c253","32e0cd3a65bd475e955272ba0cc0fbaceac58de169baec25b3bb3f81234f6d4a","a73ba7d094b61e88566e3577166f63389a945f209a3ec20c6a151545f0d7544d","3745762b83e5d49983a4183821125e3417473f992c4bf1d6dd6cea91efb4166f","ade458e350eda79fa74ecb678d9c51cc17f592d56df3e47286ef28e71401a989","9a2de03d56206eb28256c21e7c92a33a9a1d6010591cba2c768f25ea27895abd","48fc0e6891264b697feea9ac9d6932b980f1b4a4fc1ea5731e5979a00f811d0d","e69548fdcfdcda206290a7ace25206167ef66cac83e877e8f1e3bd8a4ed3e649","4abe19a40937aca63a6e66204e9bc711da0762e1fd6f412ea720ad60905cc8f7","444b53f5769d9b2c284316f1b1fbaed64a75b0ccb6c3953861a9eaa3e38c5ed9","49bddd70b375e6ba2b0f6e8dca81608dff0e9496dc28a87b79a622b8d1d4b41f","3dd3a106a9b038c53f8e16bdf8ea1b04f2236d576f982e91b59c9d0b22877eb0","4359e8ba73374bb7d25c0d4181c4e9f9fd6174569897788596feac600ec69639","ba673eb458990de2d6d446c138113053bfa1013319835eb54f0060627a83dab6","ecb6ee9b10f9418873d68531c396d1731a98131274631a452cdb0ac2982d7806","57add3bda78c269dab64114114ecd2adc9df136e37e4a40c50bbdaaa099941d5","e291f1af6e280e00d93a5eacd864badf8d0b2d3123766585355dbb35b4d9eaa7","90a10667ea89295bf4d0e696cd9d472773dfa1a09abc826de69bd656f659430b","7080eced720f697f5eb20787acab50899f454c26d7d0cab57129d741f06c56c1","39a1119b0bc182c5ddbc82f945e18e944c898c95628d3294662c207d28b018ca","ea6af8604356c23c42ac3ac436f6b0d8300142e0f64573f8c3f67f259b8786cb","4d520fef6ce674f1cc21c5cd524e02d9ad45cd59051090b5d9a4986a36d41d2c","c2b976310a797531e7b098d4c615d36e68cf849f904bce95a40e1fc1f1e2fdb1",{"version":"edc423bb7358571338f7b74df3c4121a358dfbca47747e51c439de3399883c0c","signature":"2c6e7d7165e9eff1d49043f80f426b7f1af17a5057b4a4ee63f029ba2db4c588"},{"version":"4ad91d71117b7e8ecb35873787442bf10755b44becb76a20a56a0a3f0dbf1213","signature":"f69296c63b0b7642ddc4e3b6830a84fe579157db05662a839464798750f97ae6"},"2edd785d1e1b9ad49e8febb04d799b0db089bd0cb1d1fbb94c320dcf38781625","ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","3777eb752cef9aa8dd35bb997145413310008aa54ec44766de81a7ad891526cd","2db0dd3aaa2ed285950273ce96ae8a450b45423aa9da2d10e194570f1233fa6b","7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","7180c03fd3cb6e22f911ce9ba0f8a7008b1a6ddbe88ccf16a9c8140ef9ac1686","25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","54cb85a47d760da1c13c00add10d26b5118280d44d58e6908d8e89abbd9d7725","3e4825171442666d31c845aeb47fcd34b62e14041bb353ae2b874285d78482aa","c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","a967bfe3ad4e62243eb604bf956101e4c740f5921277c60debaf325c1320bf88","e9775e97ac4877aebf963a0289c81abe76d1ec9a2a7778dbe637e5151f25c5f3","471e1da5a78350bc55ef8cef24eb3aca6174143c281b8b214ca2beda51f5e04a","cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","db3435f3525cd785bf21ec6769bf8da7e8a776be1a99e2e7efb5f244a2ef5fee","c3b170c45fc031db31f782e612adf7314b167e60439d304b49e704010e7bafe5","40383ebef22b943d503c6ce2cb2e060282936b952a01bea5f9f493d5fb487cc7","4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","3a84b7cb891141824bd00ef8a50b6a44596aded4075da937f180c90e362fe5f6","13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","33203609eba548914dc83ddf6cadbc0bcb6e8ef89f6d648ca0908ae887f9fcc5","0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","9f0a92164925aa37d4a5d9dd3e0134cff8177208dba55fd2310cd74beea40ee2","8bfdb79bf1a9d435ec48d9372dc93291161f152c0865b81fc0b2694aedb4578d","2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","d32275be3546f252e3ad33976caf8c5e842c09cb87d468cb40d5f4cf092d1acc","4a0c3504813a3289f7fb1115db13967c8e004aa8e4f8a9021b95285502221bd1",{"version":"e7be367719c613d580d4b27fdf8fe64c9736f48217f4b322c0d63b2971460918","affectsGlobalScope":true},"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36",{"version":"dd78bfe9dfcadb2c4cd3a3a36df38fb3ef8ed2c601b57f6ad9a29e38a17ff39c","affectsGlobalScope":true},"62f1c00d3d246e0e3cf0224f91e122d560428ec1ccc36bb51d4574a84f1dbad0","53f0960fdcc53d097918adfd8861ffbe0db989c56ffc16c052197bf115da5ed6",{"version":"662163e5327f260b23ca0a1a1ad8a74078aabb587c904fcb5ef518986987eaff","affectsGlobalScope":true},"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb",{"version":"f85c06e750743acf31f0cfd3be284a364d469761649e29547d0dd6be48875150","affectsGlobalScope":true},"b0c0d1d13be149f790a75b381b413490f98558649428bb916fd2d71a3f47a134","3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","0364f8bb461d6e84252412d4e5590feda4eb582f77d47f7a024a7a9ff105dfdc","5433f7f77cd1fd53f45bd82445a4e437b2f6a72a32070e907530a4fea56c30c8","d0ca5d7df114035258a9d01165be309371fcccf0cccd9d57b1453204686d1ed0",{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true},{"version":"9a30b7fefd7f8abbca4828d481c61c18e40fe5ff107e113b1c1fcd2c8dcf2743","affectsGlobalScope":true},"173b6275a81ebdb283b180654890f46516c21199734fed01a773b1c168b8c45c","304f66274aa8119e8d65a49b1cff84cbf803def6afe1b2cc987386e9a9890e22","1b9adafe8a7fefaeaf9099a0e06f602903f6268438147b843a33a5233ac71745","98273274f2dbb79b0b2009b20f74eca4a7146a3447c912d580cd5d2d94a7ae30","c933f7ba4b201c98b14275fd11a14abb950178afd2074703250fe3654fc10cd2","2eaa31492906bc8525aff3c3ec2236e22d90b0dfeee77089f196cd0adf0b3e3b",{"version":"ea455cc68871b049bcecd9f56d4cf27b852d6dafd5e3b54468ca87cc11604e4d","affectsGlobalScope":true},"8f5814f29dbaf8bacd1764aebdf1c8a6eb86381f6a188ddbac0fcbaab855ce52","a63d03de72adfb91777784015bd3b4125abd2f5ef867fc5a13920b5649e8f52b","d20e003f3d518a7c1f749dbe27c6ab5e3be7b3c905a48361b04a9557de4a6900",{"version":"1d4d78c8b23c9ddaaaa49485e6adc2ec01086dfe5d8d4d36ca4cdc98d2f7e74a","affectsGlobalScope":true},{"version":"44fc16356b81c0463cc7d7b2b35dcf324d8144136f5bc5ce73ced86f2b3475b5","affectsGlobalScope":true},"575fb200043b11b464db8e42cc64379c5fd322b6d787638e005b5ee98a64486d","6de2f225d942562733e231a695534b30039bdf1875b377bb7255881f0df8ede8","56249fd3ef1f6b90888e606f4ea648c43978ef43a7263aafad64f8d83cd3b8aa","139ad1dc93a503da85b7a0d5f615bddbae61ad796bc68fedd049150db67a1e26","7b166975fdbd3b37afb64707b98bca88e46577bbc6c59871f9383a7df2daacd1","9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","81505c54d7cad0009352eaa21bd923ab7cdee7ec3405357a54d9a5da033a2084","269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","3c1f19c7abcda6b3a4cf9438a15c7307a080bd3b51dfd56b198d9f86baf19447","2ee1645e0df9d84467cfe1d67b0ad3003c2f387de55874d565094464ee6f2927",{"version":"7da97d603bf3dd0000f56467c56cb6efaf5f94692980474925fae6c33412b12a","affectsGlobalScope":true},{"version":"9cf780e96b687e4bdfd1907ed26a688c18b89797490a00598fa8b8ab683335dd","affectsGlobalScope":true},"98e00f3613402504bc2a2c9a621800ab48e0a463d1eed062208a4ae98ad8f84c","9ae88ce9f73446c24b2d2452e993b676da1b31fca5ceb7276e7f36279f693ed1","e49d7625faff2a7842e4e7b9b197f972633fca685afcf6b4403400c97d087c36","b82c38abc53922b1b3670c3af6f333c21b735722a8f156e7d357a2da7c53a0a0",{"version":"b423f53647708043299ded4daa68d95c967a2ac30aa1437adc4442129d7d0a6c","affectsGlobalScope":true},{"version":"7245af181218216bacb01fbdf51095617a51661f20d77178c69a377e16fb69ed","affectsGlobalScope":true},"4f0fc7b7f54422bd97cfaf558ddb4bca86893839367b746a8f86b60ac7619673","4cdd8b6b51599180a387cc7c1c50f49eca5ce06595d781638fd0216520d98246","d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c",{"version":"8704423bf338bff381ebc951ed819935d0252d90cd6de7dffe5b0a5debb65d07","affectsGlobalScope":true},"7c6929fd7cbf38499b6a600b91c3b603d1d78395046dc3499b2b92d01418b94b",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"a42be67ed1ddaec743582f41fc219db96a1b69719fccac6d1464321178d610fc","d009e415638e5ec78f1073f698f2f2aa6a66883989dced9a46b3ac3967cb56f8","f96f3c445afc7d65d4790386e37c5b57f095f285cc89b8315b209fe0c81837c1","5e3a55837aa1f42af2d2334c9b750f59f5f50a2205471875f5dd6aadc3e49ddb","68cc8d6fcc2f270d7108f02f3ebc59480a54615be3e09a47e14527f349e9d53e","3eb11dbf3489064a47a2e1cf9d261b1f100ef0b3b50ffca6c44dd99d6dd81ac1",{"version":"64d4b35c5456adf258d2cf56c341e203a073253f229ef3208fc0d5020253b241","affectsGlobalScope":true},"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","7852500a7dc3f9cb6b73d619f6e0249119211ea662fd5e16c59ee5aba3deeb80","bee89e1eb6425eb49894f3f25e4562dc2564e84e5aa7610b7e13d8ecddf8f5db","ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","5d08a179b846f5ee674624b349ebebe2121c455e3a265dc93da4e8d9e89722b4","89121c1bf2990f5219bfd802a3e7fc557de447c62058d6af68d6b6348d64499a","79b4369233a12c6fa4a07301ecb7085802c98f3a77cf9ab97eee27e1656f82e6","b3bcbf3f1afe9bd5ad07f57ef717a9178e099416a939f01427c5972e8dab7122","d4a22007b481fe2a2e6bfd3a42c00cd62d41edb36d30fc4697df2692e9891fc8","22293bd6fa12747929f8dfca3ec1684a3fe08638aa18023dd286ab337e88a592","a589f9f052276a3fc00b75e62f73b93ea568fce3e935b86ed7052945f99d9dc2","17230b34bb564a3a2e36f9d3985372ccab4ad1722df2c43f7c5c2b553f68e5db","6e5c9272f6b3783be7bdddaf207cccdb8e033be3d14c5beacc03ae9d27d50929","9b4f7ff9681448c72abe38ea8eefd7ffe0c3aefe495137f02012a08801373f71","0dfe35191a04e8f9dc7caeb9f52f2ee07402736563d12cbccd15fb5f31ac877f","5e3ded3624072ab70ba827b9279789f5c761456eb4e859281a5dd60537dedb25","199f9ead0daf25ae4c5632e3d1f42570af59685294a38123eef457407e13f365","cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","7d8ddf0f021c53099e34ee831a06c394d50371816caa98684812f089b4c6b3d4","1e60b6a5f644623f61e7ddb2f7f81cc56a0142329ca253e5fb237e7a719026c7","a9bf72dc672eed91bf61d8086559e11d84c8faa3bd42d11859feee3ff33fc8af","bae8d023ef6b23df7da26f51cea44321f95817c190342a36882e93b80d07a960","5d30d04a14ed8527ac5d654dc345a4db11b593334c11a65efb6e4facc5484a0e"],"root":[[149,151]],"options":{"alwaysStrict":true,"declaration":true,"declarationMap":true,"emitDeclarationOnly":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"experimentalDecorators":true,"importHelpers":true,"module":99,"noEmitHelpers":true,"noImplicitOverride":true,"noUncheckedIndexedAccess":true,"outDir":"./","removeComments":true,"skipLibCheck":true,"sourceMap":true,"strict":true,"target":7,"verbatimModuleSyntax":true},"fileIdsList":[[152,253],[222,241],[192,241],[245],[152,247,249,253],[254],[154],[190],[191,196,225],[192,197,203,204,211,222,233],[192,193,203,211],[194,234],[195,196,204,212],[196,222,230],[197,199,203,211],[190,198],[199,200],[203],[201,203],[190,203],[203,204,205,222,233],[203,204,205,218,222,225],[188,191,238],[199,203,206,211,222,233],[203,204,206,207,211,222,230,233],[206,208,222,230,233],[154,155,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240],[203,209],[210,233,238],[199,203,211,222],[212],[213],[190,214],[211,212,215,232,238],[216],[217],[203,218,219],[218,220,234,236],[191,203,222,223,224,225],[191,222,224],[222,223],[225],[226],[190,222],[203,228,229],[228,229],[196,211,222,230],[231],[211,232],[191,206,217,233],[196,234],[222,235],[210,236],[237],[191,196,203,205,214,222,233,236,238],[222,239],[203,222,230,241,259,260,263,264],[266,305],[266,290,305],[305],[266],[266,291,305],[266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304],[291,305],[203,206,208,222,230,233,239,241],[308],[73,90,114,142,143],[74],[73,117,118],[117,148],[117,118],[73,117,118,141],[148],[117,118,131],[117,118,127],[114,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,134],[73,116,130,134,141],[73,134],[73],[73,115,116,131,132,133,148],[114],[73,77,81,113,115,141,148],[73,116,139,141],[114,141],[115,116],[114,134,141,148],[73,75,77,79,81,89,139],[73,76,77,80,81,82,83,84,85,139,141],[73,76,77,78,80,81,88,139,140],[73,76,77],[73,77,78,141],[73,76,77,78,79,80,142],[73,77,81],[75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,111,112,113,139,140,141,142],[115,116,134,135,136,137,138],[77,81,83,84,140,141],[78],[73,81],[73,77],[73,77,110],[73,114],[90,140],[73,86],[73,90,94,114],[73,90,95,114],[73,90,148],[73,74,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109],[90,100,114],[73,148],[90,114],[73,90,94,95,114],[145],[73,110,114,144,146,147],[241,260,261,262],[241],[222,241,260],[165,169,233],[165,222,233],[160],[162,165,230,233],[211,230],[160,241],[162,165,211,233],[157,158,161,164,191,203,222,233],[157,163],[161,165,191,225,233,241],[191,241],[181,191,241],[159,160,241],[165],[159,160,161,162,163,164,165,166,167,169,170,171,172,173,174,175,176,177,178,179,180,182,183,184,185,186,187],[165,172,173],[163,165,173,174],[164],[157,160,165],[165,169,173,174],[169],[163,165,168,233],[157,162,163,165,169,172],[191,222],[160,165,181,191,238,241],[72,148],[72,149,150]],"referencedMap":[[153,1],[242,2],[243,2],[244,3],[246,4],[250,5],[253,1],[255,6],[257,6],[154,7],[155,7],[190,8],[191,9],[192,10],[193,11],[194,12],[195,13],[196,14],[197,15],[198,16],[199,17],[200,17],[202,18],[201,19],[203,20],[204,21],[205,22],[189,23],[206,24],[207,25],[208,26],[241,27],[209,28],[210,29],[211,30],[212,31],[213,32],[214,33],[215,34],[216,35],[217,36],[218,37],[219,37],[220,38],[222,39],[224,40],[223,41],[225,42],[226,43],[227,44],[228,45],[229,46],[230,47],[231,48],[232,49],[233,50],[234,51],[235,52],[236,53],[237,54],[238,55],[239,56],[264,57],[290,58],[291,59],[266,60],[269,60],[288,58],[289,58],[279,58],[278,61],[276,58],[271,58],[284,58],[282,58],[286,58],[270,58],[283,58],[287,58],[272,58],[273,58],[285,58],[267,58],[274,58],[275,58],[277,58],[281,58],[292,62],[280,58],[268,58],[305,63],[299,62],[301,64],[300,62],[293,62],[294,62],[296,62],[298,62],[302,64],[303,64],[295,64],[297,64],[307,65],[309,66],[144,67],[75,68],[119,69],[118,70],[120,71],[121,72],[122,71],[123,69],[124,71],[125,69],[117,73],[126,71],[127,74],[128,75],[129,69],[131,76],[132,77],[130,78],[133,79],[134,80],[135,81],[116,82],[136,83],[137,84],[138,85],[115,86],[140,87],[86,88],[82,79],[141,89],[78,90],[142,91],[81,92],[83,93],[114,94],[139,95],[87,96],[113,79],[76,79],[88,97],[84,98],[80,99],[89,99],[111,100],[77,98],[112,98],[85,101],[91,102],[92,103],[93,101],[95,104],[96,101],[97,81],[98,105],[99,106],[110,107],[101,108],[102,101],[109,109],[103,101],[94,109],[104,101],[105,81],[106,110],[107,101],[108,81],[100,111],[146,112],[147,81],[148,113],[263,114],[260,115],[262,116],[172,117],[179,118],[171,117],[186,119],[163,120],[162,121],[185,115],[180,122],[183,123],[165,124],[164,125],[160,126],[159,127],[182,128],[161,129],[166,130],[170,130],[188,131],[187,130],[174,132],[175,133],[177,134],[173,135],[176,136],[181,115],[168,137],[169,138],[178,139],[158,140],[184,141],[149,142],[151,143],[150,142]]},"version":"5.5.4"}