simple-support-chat 0.1.1 → 0.3.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.
@@ -1,8 +1,45 @@
1
1
  import { WebClient } from '@slack/web-api';
2
+ import crypto from 'crypto';
3
+
4
+ // src/server/handler.ts
5
+
6
+ // src/server/store.ts
7
+ var InMemoryStore = class {
8
+ /** sessionId -> ThreadRecord */
9
+ threads = /* @__PURE__ */ new Map();
10
+ /** threadTs -> sessionId (reverse lookup) */
11
+ threadTsIndex = /* @__PURE__ */ new Map();
12
+ /** sessionId -> Reply[] */
13
+ replies = /* @__PURE__ */ new Map();
14
+ async saveThread(sessionId, threadTs, metadata) {
15
+ const record = { sessionId, threadTs, metadata };
16
+ this.threads.set(sessionId, record);
17
+ this.threadTsIndex.set(threadTs, sessionId);
18
+ }
19
+ async getThreadBySession(sessionId) {
20
+ return this.threads.get(sessionId) ?? null;
21
+ }
22
+ async getThreadByTs(threadTs) {
23
+ const sessionId = this.threadTsIndex.get(threadTs);
24
+ if (!sessionId) return null;
25
+ return this.threads.get(sessionId) ?? null;
26
+ }
27
+ async saveReply(sessionId, reply) {
28
+ const existing = this.replies.get(sessionId) ?? [];
29
+ existing.push(reply);
30
+ this.replies.set(sessionId, existing);
31
+ }
32
+ async getReplies(sessionId, since) {
33
+ const all = this.replies.get(sessionId) ?? [];
34
+ if (!since) return [...all];
35
+ const sinceTime = new Date(since).getTime();
36
+ return all.filter((r) => new Date(r.timestamp).getTime() > sinceTime);
37
+ }
38
+ };
2
39
 
3
40
  // src/server/handler.ts
4
41
  async function handleMessage(body, options) {
5
- const { slack, slackChannel, botName, botIcon, onMessage, threadMap } = options;
42
+ const { slack, slackChannel, botName, botIcon, onMessage, store } = options;
6
43
  if (!body.message || typeof body.message !== "string") {
7
44
  return {
8
45
  data: { success: false, error: "Missing required field: message" },
@@ -22,7 +59,8 @@ async function handleMessage(body, options) {
22
59
  }
23
60
  }
24
61
  const lookupKey = body.user?.id ?? body.sessionId;
25
- const existingThread = threadMap.get(lookupKey);
62
+ const existingRecord = await store.getThreadBySession(lookupKey);
63
+ const existingThread = existingRecord?.threadTs;
26
64
  try {
27
65
  const userLabel = body.user ? `${body.user.name ?? "User"} (${body.user.email ?? body.user.id})` : `Anonymous (session ${body.sessionId.substring(0, 8)})`;
28
66
  const contextLines = [];
@@ -59,7 +97,11 @@ ${body.message}`,
59
97
  status: 500
60
98
  };
61
99
  }
62
- threadMap.set(lookupKey, threadTs);
100
+ await store.saveThread(lookupKey, threadTs, {
101
+ sessionId: body.sessionId,
102
+ user: body.user,
103
+ context: body.context
104
+ });
63
105
  return {
64
106
  data: { success: true, threadId: threadTs },
65
107
  status: 200
@@ -74,9 +116,9 @@ ${body.message}`,
74
116
  }
75
117
  }
76
118
  function createSupportHandler(options) {
77
- const { slackBotToken, slackChannel, botName, botIcon, onMessage } = options;
119
+ const { slackBotToken, slackChannel, botName, botIcon, onMessage, store } = options;
78
120
  const slack = new WebClient(slackBotToken);
79
- const threadMap = /* @__PURE__ */ new Map();
121
+ const resolvedStore = store ?? new InMemoryStore();
80
122
  return async (request) => {
81
123
  if (request.method !== "POST") {
82
124
  return jsonResponse(
@@ -99,15 +141,15 @@ function createSupportHandler(options) {
99
141
  botName,
100
142
  botIcon,
101
143
  onMessage,
102
- threadMap
144
+ store: resolvedStore
103
145
  });
104
146
  return jsonResponse(result.data, result.status);
105
147
  };
106
148
  }
107
149
  function createExpressHandler(options) {
108
- const { slackBotToken, slackChannel, botName, botIcon, onMessage } = options;
150
+ const { slackBotToken, slackChannel, botName, botIcon, onMessage, store } = options;
109
151
  const slack = new WebClient(slackBotToken);
110
- const threadMap = /* @__PURE__ */ new Map();
152
+ const resolvedStore = store ?? new InMemoryStore();
111
153
  return async (req, res) => {
112
154
  const body = req.body;
113
155
  const result = await handleMessage(body, {
@@ -116,7 +158,7 @@ function createExpressHandler(options) {
116
158
  botName,
117
159
  botIcon,
118
160
  onMessage,
119
- threadMap
161
+ store: resolvedStore
120
162
  });
121
163
  res.status(result.status).json(result.data);
122
164
  };
@@ -144,6 +186,2120 @@ function jsonResponse(data, status = 200) {
144
186
  });
145
187
  }
146
188
 
147
- export { createExpressHandler, createSupportHandler, validateSlackToken };
189
+ // node_modules/.pnpm/gemoji@8.1.0/node_modules/gemoji/index.js
190
+ var nameToEmoji = {
191
+ 100: "\u{1F4AF}",
192
+ 1234: "\u{1F522}",
193
+ grinning: "\u{1F600}",
194
+ smiley: "\u{1F603}",
195
+ smile: "\u{1F604}",
196
+ grin: "\u{1F601}",
197
+ laughing: "\u{1F606}",
198
+ satisfied: "\u{1F606}",
199
+ sweat_smile: "\u{1F605}",
200
+ rofl: "\u{1F923}",
201
+ joy: "\u{1F602}",
202
+ slightly_smiling_face: "\u{1F642}",
203
+ upside_down_face: "\u{1F643}",
204
+ melting_face: "\u{1FAE0}",
205
+ wink: "\u{1F609}",
206
+ blush: "\u{1F60A}",
207
+ innocent: "\u{1F607}",
208
+ smiling_face_with_three_hearts: "\u{1F970}",
209
+ heart_eyes: "\u{1F60D}",
210
+ star_struck: "\u{1F929}",
211
+ kissing_heart: "\u{1F618}",
212
+ kissing: "\u{1F617}",
213
+ relaxed: "\u263A\uFE0F",
214
+ kissing_closed_eyes: "\u{1F61A}",
215
+ kissing_smiling_eyes: "\u{1F619}",
216
+ smiling_face_with_tear: "\u{1F972}",
217
+ yum: "\u{1F60B}",
218
+ stuck_out_tongue: "\u{1F61B}",
219
+ stuck_out_tongue_winking_eye: "\u{1F61C}",
220
+ zany_face: "\u{1F92A}",
221
+ stuck_out_tongue_closed_eyes: "\u{1F61D}",
222
+ money_mouth_face: "\u{1F911}",
223
+ hugs: "\u{1F917}",
224
+ hand_over_mouth: "\u{1F92D}",
225
+ face_with_open_eyes_and_hand_over_mouth: "\u{1FAE2}",
226
+ face_with_peeking_eye: "\u{1FAE3}",
227
+ shushing_face: "\u{1F92B}",
228
+ thinking: "\u{1F914}",
229
+ saluting_face: "\u{1FAE1}",
230
+ zipper_mouth_face: "\u{1F910}",
231
+ raised_eyebrow: "\u{1F928}",
232
+ neutral_face: "\u{1F610}",
233
+ expressionless: "\u{1F611}",
234
+ no_mouth: "\u{1F636}",
235
+ dotted_line_face: "\u{1FAE5}",
236
+ face_in_clouds: "\u{1F636}\u200D\u{1F32B}\uFE0F",
237
+ smirk: "\u{1F60F}",
238
+ unamused: "\u{1F612}",
239
+ roll_eyes: "\u{1F644}",
240
+ grimacing: "\u{1F62C}",
241
+ face_exhaling: "\u{1F62E}\u200D\u{1F4A8}",
242
+ lying_face: "\u{1F925}",
243
+ shaking_face: "\u{1FAE8}",
244
+ relieved: "\u{1F60C}",
245
+ pensive: "\u{1F614}",
246
+ sleepy: "\u{1F62A}",
247
+ drooling_face: "\u{1F924}",
248
+ sleeping: "\u{1F634}",
249
+ mask: "\u{1F637}",
250
+ face_with_thermometer: "\u{1F912}",
251
+ face_with_head_bandage: "\u{1F915}",
252
+ nauseated_face: "\u{1F922}",
253
+ vomiting_face: "\u{1F92E}",
254
+ sneezing_face: "\u{1F927}",
255
+ hot_face: "\u{1F975}",
256
+ cold_face: "\u{1F976}",
257
+ woozy_face: "\u{1F974}",
258
+ dizzy_face: "\u{1F635}",
259
+ face_with_spiral_eyes: "\u{1F635}\u200D\u{1F4AB}",
260
+ exploding_head: "\u{1F92F}",
261
+ cowboy_hat_face: "\u{1F920}",
262
+ partying_face: "\u{1F973}",
263
+ disguised_face: "\u{1F978}",
264
+ sunglasses: "\u{1F60E}",
265
+ nerd_face: "\u{1F913}",
266
+ monocle_face: "\u{1F9D0}",
267
+ confused: "\u{1F615}",
268
+ face_with_diagonal_mouth: "\u{1FAE4}",
269
+ worried: "\u{1F61F}",
270
+ slightly_frowning_face: "\u{1F641}",
271
+ frowning_face: "\u2639\uFE0F",
272
+ open_mouth: "\u{1F62E}",
273
+ hushed: "\u{1F62F}",
274
+ astonished: "\u{1F632}",
275
+ flushed: "\u{1F633}",
276
+ pleading_face: "\u{1F97A}",
277
+ face_holding_back_tears: "\u{1F979}",
278
+ frowning: "\u{1F626}",
279
+ anguished: "\u{1F627}",
280
+ fearful: "\u{1F628}",
281
+ cold_sweat: "\u{1F630}",
282
+ disappointed_relieved: "\u{1F625}",
283
+ cry: "\u{1F622}",
284
+ sob: "\u{1F62D}",
285
+ scream: "\u{1F631}",
286
+ confounded: "\u{1F616}",
287
+ persevere: "\u{1F623}",
288
+ disappointed: "\u{1F61E}",
289
+ sweat: "\u{1F613}",
290
+ weary: "\u{1F629}",
291
+ tired_face: "\u{1F62B}",
292
+ yawning_face: "\u{1F971}",
293
+ triumph: "\u{1F624}",
294
+ rage: "\u{1F621}",
295
+ pout: "\u{1F621}",
296
+ angry: "\u{1F620}",
297
+ cursing_face: "\u{1F92C}",
298
+ smiling_imp: "\u{1F608}",
299
+ imp: "\u{1F47F}",
300
+ skull: "\u{1F480}",
301
+ skull_and_crossbones: "\u2620\uFE0F",
302
+ hankey: "\u{1F4A9}",
303
+ poop: "\u{1F4A9}",
304
+ shit: "\u{1F4A9}",
305
+ clown_face: "\u{1F921}",
306
+ japanese_ogre: "\u{1F479}",
307
+ japanese_goblin: "\u{1F47A}",
308
+ ghost: "\u{1F47B}",
309
+ alien: "\u{1F47D}",
310
+ space_invader: "\u{1F47E}",
311
+ robot: "\u{1F916}",
312
+ smiley_cat: "\u{1F63A}",
313
+ smile_cat: "\u{1F638}",
314
+ joy_cat: "\u{1F639}",
315
+ heart_eyes_cat: "\u{1F63B}",
316
+ smirk_cat: "\u{1F63C}",
317
+ kissing_cat: "\u{1F63D}",
318
+ scream_cat: "\u{1F640}",
319
+ crying_cat_face: "\u{1F63F}",
320
+ pouting_cat: "\u{1F63E}",
321
+ see_no_evil: "\u{1F648}",
322
+ hear_no_evil: "\u{1F649}",
323
+ speak_no_evil: "\u{1F64A}",
324
+ love_letter: "\u{1F48C}",
325
+ cupid: "\u{1F498}",
326
+ gift_heart: "\u{1F49D}",
327
+ sparkling_heart: "\u{1F496}",
328
+ heartpulse: "\u{1F497}",
329
+ heartbeat: "\u{1F493}",
330
+ revolving_hearts: "\u{1F49E}",
331
+ two_hearts: "\u{1F495}",
332
+ heart_decoration: "\u{1F49F}",
333
+ heavy_heart_exclamation: "\u2763\uFE0F",
334
+ broken_heart: "\u{1F494}",
335
+ heart_on_fire: "\u2764\uFE0F\u200D\u{1F525}",
336
+ mending_heart: "\u2764\uFE0F\u200D\u{1FA79}",
337
+ heart: "\u2764\uFE0F",
338
+ pink_heart: "\u{1FA77}",
339
+ orange_heart: "\u{1F9E1}",
340
+ yellow_heart: "\u{1F49B}",
341
+ green_heart: "\u{1F49A}",
342
+ blue_heart: "\u{1F499}",
343
+ light_blue_heart: "\u{1FA75}",
344
+ purple_heart: "\u{1F49C}",
345
+ brown_heart: "\u{1F90E}",
346
+ black_heart: "\u{1F5A4}",
347
+ grey_heart: "\u{1FA76}",
348
+ white_heart: "\u{1F90D}",
349
+ kiss: "\u{1F48B}",
350
+ anger: "\u{1F4A2}",
351
+ boom: "\u{1F4A5}",
352
+ collision: "\u{1F4A5}",
353
+ dizzy: "\u{1F4AB}",
354
+ sweat_drops: "\u{1F4A6}",
355
+ dash: "\u{1F4A8}",
356
+ hole: "\u{1F573}\uFE0F",
357
+ speech_balloon: "\u{1F4AC}",
358
+ eye_speech_bubble: "\u{1F441}\uFE0F\u200D\u{1F5E8}\uFE0F",
359
+ left_speech_bubble: "\u{1F5E8}\uFE0F",
360
+ right_anger_bubble: "\u{1F5EF}\uFE0F",
361
+ thought_balloon: "\u{1F4AD}",
362
+ zzz: "\u{1F4A4}",
363
+ wave: "\u{1F44B}",
364
+ raised_back_of_hand: "\u{1F91A}",
365
+ raised_hand_with_fingers_splayed: "\u{1F590}\uFE0F",
366
+ hand: "\u270B",
367
+ raised_hand: "\u270B",
368
+ vulcan_salute: "\u{1F596}",
369
+ rightwards_hand: "\u{1FAF1}",
370
+ leftwards_hand: "\u{1FAF2}",
371
+ palm_down_hand: "\u{1FAF3}",
372
+ palm_up_hand: "\u{1FAF4}",
373
+ leftwards_pushing_hand: "\u{1FAF7}",
374
+ rightwards_pushing_hand: "\u{1FAF8}",
375
+ ok_hand: "\u{1F44C}",
376
+ pinched_fingers: "\u{1F90C}",
377
+ pinching_hand: "\u{1F90F}",
378
+ v: "\u270C\uFE0F",
379
+ crossed_fingers: "\u{1F91E}",
380
+ hand_with_index_finger_and_thumb_crossed: "\u{1FAF0}",
381
+ love_you_gesture: "\u{1F91F}",
382
+ metal: "\u{1F918}",
383
+ call_me_hand: "\u{1F919}",
384
+ point_left: "\u{1F448}",
385
+ point_right: "\u{1F449}",
386
+ point_up_2: "\u{1F446}",
387
+ middle_finger: "\u{1F595}",
388
+ fu: "\u{1F595}",
389
+ point_down: "\u{1F447}",
390
+ point_up: "\u261D\uFE0F",
391
+ index_pointing_at_the_viewer: "\u{1FAF5}",
392
+ "+1": "\u{1F44D}",
393
+ thumbsup: "\u{1F44D}",
394
+ "-1": "\u{1F44E}",
395
+ thumbsdown: "\u{1F44E}",
396
+ fist_raised: "\u270A",
397
+ fist: "\u270A",
398
+ fist_oncoming: "\u{1F44A}",
399
+ facepunch: "\u{1F44A}",
400
+ punch: "\u{1F44A}",
401
+ fist_left: "\u{1F91B}",
402
+ fist_right: "\u{1F91C}",
403
+ clap: "\u{1F44F}",
404
+ raised_hands: "\u{1F64C}",
405
+ heart_hands: "\u{1FAF6}",
406
+ open_hands: "\u{1F450}",
407
+ palms_up_together: "\u{1F932}",
408
+ handshake: "\u{1F91D}",
409
+ pray: "\u{1F64F}",
410
+ writing_hand: "\u270D\uFE0F",
411
+ nail_care: "\u{1F485}",
412
+ selfie: "\u{1F933}",
413
+ muscle: "\u{1F4AA}",
414
+ mechanical_arm: "\u{1F9BE}",
415
+ mechanical_leg: "\u{1F9BF}",
416
+ leg: "\u{1F9B5}",
417
+ foot: "\u{1F9B6}",
418
+ ear: "\u{1F442}",
419
+ ear_with_hearing_aid: "\u{1F9BB}",
420
+ nose: "\u{1F443}",
421
+ brain: "\u{1F9E0}",
422
+ anatomical_heart: "\u{1FAC0}",
423
+ lungs: "\u{1FAC1}",
424
+ tooth: "\u{1F9B7}",
425
+ bone: "\u{1F9B4}",
426
+ eyes: "\u{1F440}",
427
+ eye: "\u{1F441}\uFE0F",
428
+ tongue: "\u{1F445}",
429
+ lips: "\u{1F444}",
430
+ biting_lip: "\u{1FAE6}",
431
+ baby: "\u{1F476}",
432
+ child: "\u{1F9D2}",
433
+ boy: "\u{1F466}",
434
+ girl: "\u{1F467}",
435
+ adult: "\u{1F9D1}",
436
+ blond_haired_person: "\u{1F471}",
437
+ man: "\u{1F468}",
438
+ bearded_person: "\u{1F9D4}",
439
+ man_beard: "\u{1F9D4}\u200D\u2642\uFE0F",
440
+ woman_beard: "\u{1F9D4}\u200D\u2640\uFE0F",
441
+ red_haired_man: "\u{1F468}\u200D\u{1F9B0}",
442
+ curly_haired_man: "\u{1F468}\u200D\u{1F9B1}",
443
+ white_haired_man: "\u{1F468}\u200D\u{1F9B3}",
444
+ bald_man: "\u{1F468}\u200D\u{1F9B2}",
445
+ woman: "\u{1F469}",
446
+ red_haired_woman: "\u{1F469}\u200D\u{1F9B0}",
447
+ person_red_hair: "\u{1F9D1}\u200D\u{1F9B0}",
448
+ curly_haired_woman: "\u{1F469}\u200D\u{1F9B1}",
449
+ person_curly_hair: "\u{1F9D1}\u200D\u{1F9B1}",
450
+ white_haired_woman: "\u{1F469}\u200D\u{1F9B3}",
451
+ person_white_hair: "\u{1F9D1}\u200D\u{1F9B3}",
452
+ bald_woman: "\u{1F469}\u200D\u{1F9B2}",
453
+ person_bald: "\u{1F9D1}\u200D\u{1F9B2}",
454
+ blond_haired_woman: "\u{1F471}\u200D\u2640\uFE0F",
455
+ blonde_woman: "\u{1F471}\u200D\u2640\uFE0F",
456
+ blond_haired_man: "\u{1F471}\u200D\u2642\uFE0F",
457
+ older_adult: "\u{1F9D3}",
458
+ older_man: "\u{1F474}",
459
+ older_woman: "\u{1F475}",
460
+ frowning_person: "\u{1F64D}",
461
+ frowning_man: "\u{1F64D}\u200D\u2642\uFE0F",
462
+ frowning_woman: "\u{1F64D}\u200D\u2640\uFE0F",
463
+ pouting_face: "\u{1F64E}",
464
+ pouting_man: "\u{1F64E}\u200D\u2642\uFE0F",
465
+ pouting_woman: "\u{1F64E}\u200D\u2640\uFE0F",
466
+ no_good: "\u{1F645}",
467
+ no_good_man: "\u{1F645}\u200D\u2642\uFE0F",
468
+ ng_man: "\u{1F645}\u200D\u2642\uFE0F",
469
+ no_good_woman: "\u{1F645}\u200D\u2640\uFE0F",
470
+ ng_woman: "\u{1F645}\u200D\u2640\uFE0F",
471
+ ok_person: "\u{1F646}",
472
+ ok_man: "\u{1F646}\u200D\u2642\uFE0F",
473
+ ok_woman: "\u{1F646}\u200D\u2640\uFE0F",
474
+ tipping_hand_person: "\u{1F481}",
475
+ information_desk_person: "\u{1F481}",
476
+ tipping_hand_man: "\u{1F481}\u200D\u2642\uFE0F",
477
+ sassy_man: "\u{1F481}\u200D\u2642\uFE0F",
478
+ tipping_hand_woman: "\u{1F481}\u200D\u2640\uFE0F",
479
+ sassy_woman: "\u{1F481}\u200D\u2640\uFE0F",
480
+ raising_hand: "\u{1F64B}",
481
+ raising_hand_man: "\u{1F64B}\u200D\u2642\uFE0F",
482
+ raising_hand_woman: "\u{1F64B}\u200D\u2640\uFE0F",
483
+ deaf_person: "\u{1F9CF}",
484
+ deaf_man: "\u{1F9CF}\u200D\u2642\uFE0F",
485
+ deaf_woman: "\u{1F9CF}\u200D\u2640\uFE0F",
486
+ bow: "\u{1F647}",
487
+ bowing_man: "\u{1F647}\u200D\u2642\uFE0F",
488
+ bowing_woman: "\u{1F647}\u200D\u2640\uFE0F",
489
+ facepalm: "\u{1F926}",
490
+ man_facepalming: "\u{1F926}\u200D\u2642\uFE0F",
491
+ woman_facepalming: "\u{1F926}\u200D\u2640\uFE0F",
492
+ shrug: "\u{1F937}",
493
+ man_shrugging: "\u{1F937}\u200D\u2642\uFE0F",
494
+ woman_shrugging: "\u{1F937}\u200D\u2640\uFE0F",
495
+ health_worker: "\u{1F9D1}\u200D\u2695\uFE0F",
496
+ man_health_worker: "\u{1F468}\u200D\u2695\uFE0F",
497
+ woman_health_worker: "\u{1F469}\u200D\u2695\uFE0F",
498
+ student: "\u{1F9D1}\u200D\u{1F393}",
499
+ man_student: "\u{1F468}\u200D\u{1F393}",
500
+ woman_student: "\u{1F469}\u200D\u{1F393}",
501
+ teacher: "\u{1F9D1}\u200D\u{1F3EB}",
502
+ man_teacher: "\u{1F468}\u200D\u{1F3EB}",
503
+ woman_teacher: "\u{1F469}\u200D\u{1F3EB}",
504
+ judge: "\u{1F9D1}\u200D\u2696\uFE0F",
505
+ man_judge: "\u{1F468}\u200D\u2696\uFE0F",
506
+ woman_judge: "\u{1F469}\u200D\u2696\uFE0F",
507
+ farmer: "\u{1F9D1}\u200D\u{1F33E}",
508
+ man_farmer: "\u{1F468}\u200D\u{1F33E}",
509
+ woman_farmer: "\u{1F469}\u200D\u{1F33E}",
510
+ cook: "\u{1F9D1}\u200D\u{1F373}",
511
+ man_cook: "\u{1F468}\u200D\u{1F373}",
512
+ woman_cook: "\u{1F469}\u200D\u{1F373}",
513
+ mechanic: "\u{1F9D1}\u200D\u{1F527}",
514
+ man_mechanic: "\u{1F468}\u200D\u{1F527}",
515
+ woman_mechanic: "\u{1F469}\u200D\u{1F527}",
516
+ factory_worker: "\u{1F9D1}\u200D\u{1F3ED}",
517
+ man_factory_worker: "\u{1F468}\u200D\u{1F3ED}",
518
+ woman_factory_worker: "\u{1F469}\u200D\u{1F3ED}",
519
+ office_worker: "\u{1F9D1}\u200D\u{1F4BC}",
520
+ man_office_worker: "\u{1F468}\u200D\u{1F4BC}",
521
+ woman_office_worker: "\u{1F469}\u200D\u{1F4BC}",
522
+ scientist: "\u{1F9D1}\u200D\u{1F52C}",
523
+ man_scientist: "\u{1F468}\u200D\u{1F52C}",
524
+ woman_scientist: "\u{1F469}\u200D\u{1F52C}",
525
+ technologist: "\u{1F9D1}\u200D\u{1F4BB}",
526
+ man_technologist: "\u{1F468}\u200D\u{1F4BB}",
527
+ woman_technologist: "\u{1F469}\u200D\u{1F4BB}",
528
+ singer: "\u{1F9D1}\u200D\u{1F3A4}",
529
+ man_singer: "\u{1F468}\u200D\u{1F3A4}",
530
+ woman_singer: "\u{1F469}\u200D\u{1F3A4}",
531
+ artist: "\u{1F9D1}\u200D\u{1F3A8}",
532
+ man_artist: "\u{1F468}\u200D\u{1F3A8}",
533
+ woman_artist: "\u{1F469}\u200D\u{1F3A8}",
534
+ pilot: "\u{1F9D1}\u200D\u2708\uFE0F",
535
+ man_pilot: "\u{1F468}\u200D\u2708\uFE0F",
536
+ woman_pilot: "\u{1F469}\u200D\u2708\uFE0F",
537
+ astronaut: "\u{1F9D1}\u200D\u{1F680}",
538
+ man_astronaut: "\u{1F468}\u200D\u{1F680}",
539
+ woman_astronaut: "\u{1F469}\u200D\u{1F680}",
540
+ firefighter: "\u{1F9D1}\u200D\u{1F692}",
541
+ man_firefighter: "\u{1F468}\u200D\u{1F692}",
542
+ woman_firefighter: "\u{1F469}\u200D\u{1F692}",
543
+ police_officer: "\u{1F46E}",
544
+ cop: "\u{1F46E}",
545
+ policeman: "\u{1F46E}\u200D\u2642\uFE0F",
546
+ policewoman: "\u{1F46E}\u200D\u2640\uFE0F",
547
+ detective: "\u{1F575}\uFE0F",
548
+ male_detective: "\u{1F575}\uFE0F\u200D\u2642\uFE0F",
549
+ female_detective: "\u{1F575}\uFE0F\u200D\u2640\uFE0F",
550
+ guard: "\u{1F482}",
551
+ guardsman: "\u{1F482}\u200D\u2642\uFE0F",
552
+ guardswoman: "\u{1F482}\u200D\u2640\uFE0F",
553
+ ninja: "\u{1F977}",
554
+ construction_worker: "\u{1F477}",
555
+ construction_worker_man: "\u{1F477}\u200D\u2642\uFE0F",
556
+ construction_worker_woman: "\u{1F477}\u200D\u2640\uFE0F",
557
+ person_with_crown: "\u{1FAC5}",
558
+ prince: "\u{1F934}",
559
+ princess: "\u{1F478}",
560
+ person_with_turban: "\u{1F473}",
561
+ man_with_turban: "\u{1F473}\u200D\u2642\uFE0F",
562
+ woman_with_turban: "\u{1F473}\u200D\u2640\uFE0F",
563
+ man_with_gua_pi_mao: "\u{1F472}",
564
+ woman_with_headscarf: "\u{1F9D5}",
565
+ person_in_tuxedo: "\u{1F935}",
566
+ man_in_tuxedo: "\u{1F935}\u200D\u2642\uFE0F",
567
+ woman_in_tuxedo: "\u{1F935}\u200D\u2640\uFE0F",
568
+ person_with_veil: "\u{1F470}",
569
+ man_with_veil: "\u{1F470}\u200D\u2642\uFE0F",
570
+ woman_with_veil: "\u{1F470}\u200D\u2640\uFE0F",
571
+ bride_with_veil: "\u{1F470}\u200D\u2640\uFE0F",
572
+ pregnant_woman: "\u{1F930}",
573
+ pregnant_man: "\u{1FAC3}",
574
+ pregnant_person: "\u{1FAC4}",
575
+ breast_feeding: "\u{1F931}",
576
+ woman_feeding_baby: "\u{1F469}\u200D\u{1F37C}",
577
+ man_feeding_baby: "\u{1F468}\u200D\u{1F37C}",
578
+ person_feeding_baby: "\u{1F9D1}\u200D\u{1F37C}",
579
+ angel: "\u{1F47C}",
580
+ santa: "\u{1F385}",
581
+ mrs_claus: "\u{1F936}",
582
+ mx_claus: "\u{1F9D1}\u200D\u{1F384}",
583
+ superhero: "\u{1F9B8}",
584
+ superhero_man: "\u{1F9B8}\u200D\u2642\uFE0F",
585
+ superhero_woman: "\u{1F9B8}\u200D\u2640\uFE0F",
586
+ supervillain: "\u{1F9B9}",
587
+ supervillain_man: "\u{1F9B9}\u200D\u2642\uFE0F",
588
+ supervillain_woman: "\u{1F9B9}\u200D\u2640\uFE0F",
589
+ mage: "\u{1F9D9}",
590
+ mage_man: "\u{1F9D9}\u200D\u2642\uFE0F",
591
+ mage_woman: "\u{1F9D9}\u200D\u2640\uFE0F",
592
+ fairy: "\u{1F9DA}",
593
+ fairy_man: "\u{1F9DA}\u200D\u2642\uFE0F",
594
+ fairy_woman: "\u{1F9DA}\u200D\u2640\uFE0F",
595
+ vampire: "\u{1F9DB}",
596
+ vampire_man: "\u{1F9DB}\u200D\u2642\uFE0F",
597
+ vampire_woman: "\u{1F9DB}\u200D\u2640\uFE0F",
598
+ merperson: "\u{1F9DC}",
599
+ merman: "\u{1F9DC}\u200D\u2642\uFE0F",
600
+ mermaid: "\u{1F9DC}\u200D\u2640\uFE0F",
601
+ elf: "\u{1F9DD}",
602
+ elf_man: "\u{1F9DD}\u200D\u2642\uFE0F",
603
+ elf_woman: "\u{1F9DD}\u200D\u2640\uFE0F",
604
+ genie: "\u{1F9DE}",
605
+ genie_man: "\u{1F9DE}\u200D\u2642\uFE0F",
606
+ genie_woman: "\u{1F9DE}\u200D\u2640\uFE0F",
607
+ zombie: "\u{1F9DF}",
608
+ zombie_man: "\u{1F9DF}\u200D\u2642\uFE0F",
609
+ zombie_woman: "\u{1F9DF}\u200D\u2640\uFE0F",
610
+ troll: "\u{1F9CC}",
611
+ massage: "\u{1F486}",
612
+ massage_man: "\u{1F486}\u200D\u2642\uFE0F",
613
+ massage_woman: "\u{1F486}\u200D\u2640\uFE0F",
614
+ haircut: "\u{1F487}",
615
+ haircut_man: "\u{1F487}\u200D\u2642\uFE0F",
616
+ haircut_woman: "\u{1F487}\u200D\u2640\uFE0F",
617
+ walking: "\u{1F6B6}",
618
+ walking_man: "\u{1F6B6}\u200D\u2642\uFE0F",
619
+ walking_woman: "\u{1F6B6}\u200D\u2640\uFE0F",
620
+ standing_person: "\u{1F9CD}",
621
+ standing_man: "\u{1F9CD}\u200D\u2642\uFE0F",
622
+ standing_woman: "\u{1F9CD}\u200D\u2640\uFE0F",
623
+ kneeling_person: "\u{1F9CE}",
624
+ kneeling_man: "\u{1F9CE}\u200D\u2642\uFE0F",
625
+ kneeling_woman: "\u{1F9CE}\u200D\u2640\uFE0F",
626
+ person_with_probing_cane: "\u{1F9D1}\u200D\u{1F9AF}",
627
+ man_with_probing_cane: "\u{1F468}\u200D\u{1F9AF}",
628
+ woman_with_probing_cane: "\u{1F469}\u200D\u{1F9AF}",
629
+ person_in_motorized_wheelchair: "\u{1F9D1}\u200D\u{1F9BC}",
630
+ man_in_motorized_wheelchair: "\u{1F468}\u200D\u{1F9BC}",
631
+ woman_in_motorized_wheelchair: "\u{1F469}\u200D\u{1F9BC}",
632
+ person_in_manual_wheelchair: "\u{1F9D1}\u200D\u{1F9BD}",
633
+ man_in_manual_wheelchair: "\u{1F468}\u200D\u{1F9BD}",
634
+ woman_in_manual_wheelchair: "\u{1F469}\u200D\u{1F9BD}",
635
+ runner: "\u{1F3C3}",
636
+ running: "\u{1F3C3}",
637
+ running_man: "\u{1F3C3}\u200D\u2642\uFE0F",
638
+ running_woman: "\u{1F3C3}\u200D\u2640\uFE0F",
639
+ woman_dancing: "\u{1F483}",
640
+ dancer: "\u{1F483}",
641
+ man_dancing: "\u{1F57A}",
642
+ business_suit_levitating: "\u{1F574}\uFE0F",
643
+ dancers: "\u{1F46F}",
644
+ dancing_men: "\u{1F46F}\u200D\u2642\uFE0F",
645
+ dancing_women: "\u{1F46F}\u200D\u2640\uFE0F",
646
+ sauna_person: "\u{1F9D6}",
647
+ sauna_man: "\u{1F9D6}\u200D\u2642\uFE0F",
648
+ sauna_woman: "\u{1F9D6}\u200D\u2640\uFE0F",
649
+ climbing: "\u{1F9D7}",
650
+ climbing_man: "\u{1F9D7}\u200D\u2642\uFE0F",
651
+ climbing_woman: "\u{1F9D7}\u200D\u2640\uFE0F",
652
+ person_fencing: "\u{1F93A}",
653
+ horse_racing: "\u{1F3C7}",
654
+ skier: "\u26F7\uFE0F",
655
+ snowboarder: "\u{1F3C2}",
656
+ golfing: "\u{1F3CC}\uFE0F",
657
+ golfing_man: "\u{1F3CC}\uFE0F\u200D\u2642\uFE0F",
658
+ golfing_woman: "\u{1F3CC}\uFE0F\u200D\u2640\uFE0F",
659
+ surfer: "\u{1F3C4}",
660
+ surfing_man: "\u{1F3C4}\u200D\u2642\uFE0F",
661
+ surfing_woman: "\u{1F3C4}\u200D\u2640\uFE0F",
662
+ rowboat: "\u{1F6A3}",
663
+ rowing_man: "\u{1F6A3}\u200D\u2642\uFE0F",
664
+ rowing_woman: "\u{1F6A3}\u200D\u2640\uFE0F",
665
+ swimmer: "\u{1F3CA}",
666
+ swimming_man: "\u{1F3CA}\u200D\u2642\uFE0F",
667
+ swimming_woman: "\u{1F3CA}\u200D\u2640\uFE0F",
668
+ bouncing_ball_person: "\u26F9\uFE0F",
669
+ bouncing_ball_man: "\u26F9\uFE0F\u200D\u2642\uFE0F",
670
+ basketball_man: "\u26F9\uFE0F\u200D\u2642\uFE0F",
671
+ bouncing_ball_woman: "\u26F9\uFE0F\u200D\u2640\uFE0F",
672
+ basketball_woman: "\u26F9\uFE0F\u200D\u2640\uFE0F",
673
+ weight_lifting: "\u{1F3CB}\uFE0F",
674
+ weight_lifting_man: "\u{1F3CB}\uFE0F\u200D\u2642\uFE0F",
675
+ weight_lifting_woman: "\u{1F3CB}\uFE0F\u200D\u2640\uFE0F",
676
+ bicyclist: "\u{1F6B4}",
677
+ biking_man: "\u{1F6B4}\u200D\u2642\uFE0F",
678
+ biking_woman: "\u{1F6B4}\u200D\u2640\uFE0F",
679
+ mountain_bicyclist: "\u{1F6B5}",
680
+ mountain_biking_man: "\u{1F6B5}\u200D\u2642\uFE0F",
681
+ mountain_biking_woman: "\u{1F6B5}\u200D\u2640\uFE0F",
682
+ cartwheeling: "\u{1F938}",
683
+ man_cartwheeling: "\u{1F938}\u200D\u2642\uFE0F",
684
+ woman_cartwheeling: "\u{1F938}\u200D\u2640\uFE0F",
685
+ wrestling: "\u{1F93C}",
686
+ men_wrestling: "\u{1F93C}\u200D\u2642\uFE0F",
687
+ women_wrestling: "\u{1F93C}\u200D\u2640\uFE0F",
688
+ water_polo: "\u{1F93D}",
689
+ man_playing_water_polo: "\u{1F93D}\u200D\u2642\uFE0F",
690
+ woman_playing_water_polo: "\u{1F93D}\u200D\u2640\uFE0F",
691
+ handball_person: "\u{1F93E}",
692
+ man_playing_handball: "\u{1F93E}\u200D\u2642\uFE0F",
693
+ woman_playing_handball: "\u{1F93E}\u200D\u2640\uFE0F",
694
+ juggling_person: "\u{1F939}",
695
+ man_juggling: "\u{1F939}\u200D\u2642\uFE0F",
696
+ woman_juggling: "\u{1F939}\u200D\u2640\uFE0F",
697
+ lotus_position: "\u{1F9D8}",
698
+ lotus_position_man: "\u{1F9D8}\u200D\u2642\uFE0F",
699
+ lotus_position_woman: "\u{1F9D8}\u200D\u2640\uFE0F",
700
+ bath: "\u{1F6C0}",
701
+ sleeping_bed: "\u{1F6CC}",
702
+ people_holding_hands: "\u{1F9D1}\u200D\u{1F91D}\u200D\u{1F9D1}",
703
+ two_women_holding_hands: "\u{1F46D}",
704
+ couple: "\u{1F46B}",
705
+ two_men_holding_hands: "\u{1F46C}",
706
+ couplekiss: "\u{1F48F}",
707
+ couplekiss_man_woman: "\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F48B}\u200D\u{1F468}",
708
+ couplekiss_man_man: "\u{1F468}\u200D\u2764\uFE0F\u200D\u{1F48B}\u200D\u{1F468}",
709
+ couplekiss_woman_woman: "\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F48B}\u200D\u{1F469}",
710
+ couple_with_heart: "\u{1F491}",
711
+ couple_with_heart_woman_man: "\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F468}",
712
+ couple_with_heart_man_man: "\u{1F468}\u200D\u2764\uFE0F\u200D\u{1F468}",
713
+ couple_with_heart_woman_woman: "\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F469}",
714
+ family: "\u{1F46A}",
715
+ family_man_woman_boy: "\u{1F468}\u200D\u{1F469}\u200D\u{1F466}",
716
+ family_man_woman_girl: "\u{1F468}\u200D\u{1F469}\u200D\u{1F467}",
717
+ family_man_woman_girl_boy: "\u{1F468}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F466}",
718
+ family_man_woman_boy_boy: "\u{1F468}\u200D\u{1F469}\u200D\u{1F466}\u200D\u{1F466}",
719
+ family_man_woman_girl_girl: "\u{1F468}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F467}",
720
+ family_man_man_boy: "\u{1F468}\u200D\u{1F468}\u200D\u{1F466}",
721
+ family_man_man_girl: "\u{1F468}\u200D\u{1F468}\u200D\u{1F467}",
722
+ family_man_man_girl_boy: "\u{1F468}\u200D\u{1F468}\u200D\u{1F467}\u200D\u{1F466}",
723
+ family_man_man_boy_boy: "\u{1F468}\u200D\u{1F468}\u200D\u{1F466}\u200D\u{1F466}",
724
+ family_man_man_girl_girl: "\u{1F468}\u200D\u{1F468}\u200D\u{1F467}\u200D\u{1F467}",
725
+ family_woman_woman_boy: "\u{1F469}\u200D\u{1F469}\u200D\u{1F466}",
726
+ family_woman_woman_girl: "\u{1F469}\u200D\u{1F469}\u200D\u{1F467}",
727
+ family_woman_woman_girl_boy: "\u{1F469}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F466}",
728
+ family_woman_woman_boy_boy: "\u{1F469}\u200D\u{1F469}\u200D\u{1F466}\u200D\u{1F466}",
729
+ family_woman_woman_girl_girl: "\u{1F469}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F467}",
730
+ family_man_boy: "\u{1F468}\u200D\u{1F466}",
731
+ family_man_boy_boy: "\u{1F468}\u200D\u{1F466}\u200D\u{1F466}",
732
+ family_man_girl: "\u{1F468}\u200D\u{1F467}",
733
+ family_man_girl_boy: "\u{1F468}\u200D\u{1F467}\u200D\u{1F466}",
734
+ family_man_girl_girl: "\u{1F468}\u200D\u{1F467}\u200D\u{1F467}",
735
+ family_woman_boy: "\u{1F469}\u200D\u{1F466}",
736
+ family_woman_boy_boy: "\u{1F469}\u200D\u{1F466}\u200D\u{1F466}",
737
+ family_woman_girl: "\u{1F469}\u200D\u{1F467}",
738
+ family_woman_girl_boy: "\u{1F469}\u200D\u{1F467}\u200D\u{1F466}",
739
+ family_woman_girl_girl: "\u{1F469}\u200D\u{1F467}\u200D\u{1F467}",
740
+ speaking_head: "\u{1F5E3}\uFE0F",
741
+ bust_in_silhouette: "\u{1F464}",
742
+ busts_in_silhouette: "\u{1F465}",
743
+ people_hugging: "\u{1FAC2}",
744
+ footprints: "\u{1F463}",
745
+ monkey_face: "\u{1F435}",
746
+ monkey: "\u{1F412}",
747
+ gorilla: "\u{1F98D}",
748
+ orangutan: "\u{1F9A7}",
749
+ dog: "\u{1F436}",
750
+ dog2: "\u{1F415}",
751
+ guide_dog: "\u{1F9AE}",
752
+ service_dog: "\u{1F415}\u200D\u{1F9BA}",
753
+ poodle: "\u{1F429}",
754
+ wolf: "\u{1F43A}",
755
+ fox_face: "\u{1F98A}",
756
+ raccoon: "\u{1F99D}",
757
+ cat: "\u{1F431}",
758
+ cat2: "\u{1F408}",
759
+ black_cat: "\u{1F408}\u200D\u2B1B",
760
+ lion: "\u{1F981}",
761
+ tiger: "\u{1F42F}",
762
+ tiger2: "\u{1F405}",
763
+ leopard: "\u{1F406}",
764
+ horse: "\u{1F434}",
765
+ moose: "\u{1FACE}",
766
+ donkey: "\u{1FACF}",
767
+ racehorse: "\u{1F40E}",
768
+ unicorn: "\u{1F984}",
769
+ zebra: "\u{1F993}",
770
+ deer: "\u{1F98C}",
771
+ bison: "\u{1F9AC}",
772
+ cow: "\u{1F42E}",
773
+ ox: "\u{1F402}",
774
+ water_buffalo: "\u{1F403}",
775
+ cow2: "\u{1F404}",
776
+ pig: "\u{1F437}",
777
+ pig2: "\u{1F416}",
778
+ boar: "\u{1F417}",
779
+ pig_nose: "\u{1F43D}",
780
+ ram: "\u{1F40F}",
781
+ sheep: "\u{1F411}",
782
+ goat: "\u{1F410}",
783
+ dromedary_camel: "\u{1F42A}",
784
+ camel: "\u{1F42B}",
785
+ llama: "\u{1F999}",
786
+ giraffe: "\u{1F992}",
787
+ elephant: "\u{1F418}",
788
+ mammoth: "\u{1F9A3}",
789
+ rhinoceros: "\u{1F98F}",
790
+ hippopotamus: "\u{1F99B}",
791
+ mouse: "\u{1F42D}",
792
+ mouse2: "\u{1F401}",
793
+ rat: "\u{1F400}",
794
+ hamster: "\u{1F439}",
795
+ rabbit: "\u{1F430}",
796
+ rabbit2: "\u{1F407}",
797
+ chipmunk: "\u{1F43F}\uFE0F",
798
+ beaver: "\u{1F9AB}",
799
+ hedgehog: "\u{1F994}",
800
+ bat: "\u{1F987}",
801
+ bear: "\u{1F43B}",
802
+ polar_bear: "\u{1F43B}\u200D\u2744\uFE0F",
803
+ koala: "\u{1F428}",
804
+ panda_face: "\u{1F43C}",
805
+ sloth: "\u{1F9A5}",
806
+ otter: "\u{1F9A6}",
807
+ skunk: "\u{1F9A8}",
808
+ kangaroo: "\u{1F998}",
809
+ badger: "\u{1F9A1}",
810
+ feet: "\u{1F43E}",
811
+ paw_prints: "\u{1F43E}",
812
+ turkey: "\u{1F983}",
813
+ chicken: "\u{1F414}",
814
+ rooster: "\u{1F413}",
815
+ hatching_chick: "\u{1F423}",
816
+ baby_chick: "\u{1F424}",
817
+ hatched_chick: "\u{1F425}",
818
+ bird: "\u{1F426}",
819
+ penguin: "\u{1F427}",
820
+ dove: "\u{1F54A}\uFE0F",
821
+ eagle: "\u{1F985}",
822
+ duck: "\u{1F986}",
823
+ swan: "\u{1F9A2}",
824
+ owl: "\u{1F989}",
825
+ dodo: "\u{1F9A4}",
826
+ feather: "\u{1FAB6}",
827
+ flamingo: "\u{1F9A9}",
828
+ peacock: "\u{1F99A}",
829
+ parrot: "\u{1F99C}",
830
+ wing: "\u{1FABD}",
831
+ black_bird: "\u{1F426}\u200D\u2B1B",
832
+ goose: "\u{1FABF}",
833
+ frog: "\u{1F438}",
834
+ crocodile: "\u{1F40A}",
835
+ turtle: "\u{1F422}",
836
+ lizard: "\u{1F98E}",
837
+ snake: "\u{1F40D}",
838
+ dragon_face: "\u{1F432}",
839
+ dragon: "\u{1F409}",
840
+ sauropod: "\u{1F995}",
841
+ "t-rex": "\u{1F996}",
842
+ whale: "\u{1F433}",
843
+ whale2: "\u{1F40B}",
844
+ dolphin: "\u{1F42C}",
845
+ flipper: "\u{1F42C}",
846
+ seal: "\u{1F9AD}",
847
+ fish: "\u{1F41F}",
848
+ tropical_fish: "\u{1F420}",
849
+ blowfish: "\u{1F421}",
850
+ shark: "\u{1F988}",
851
+ octopus: "\u{1F419}",
852
+ shell: "\u{1F41A}",
853
+ coral: "\u{1FAB8}",
854
+ jellyfish: "\u{1FABC}",
855
+ snail: "\u{1F40C}",
856
+ butterfly: "\u{1F98B}",
857
+ bug: "\u{1F41B}",
858
+ ant: "\u{1F41C}",
859
+ bee: "\u{1F41D}",
860
+ honeybee: "\u{1F41D}",
861
+ beetle: "\u{1FAB2}",
862
+ lady_beetle: "\u{1F41E}",
863
+ cricket: "\u{1F997}",
864
+ cockroach: "\u{1FAB3}",
865
+ spider: "\u{1F577}\uFE0F",
866
+ spider_web: "\u{1F578}\uFE0F",
867
+ scorpion: "\u{1F982}",
868
+ mosquito: "\u{1F99F}",
869
+ fly: "\u{1FAB0}",
870
+ worm: "\u{1FAB1}",
871
+ microbe: "\u{1F9A0}",
872
+ bouquet: "\u{1F490}",
873
+ cherry_blossom: "\u{1F338}",
874
+ white_flower: "\u{1F4AE}",
875
+ lotus: "\u{1FAB7}",
876
+ rosette: "\u{1F3F5}\uFE0F",
877
+ rose: "\u{1F339}",
878
+ wilted_flower: "\u{1F940}",
879
+ hibiscus: "\u{1F33A}",
880
+ sunflower: "\u{1F33B}",
881
+ blossom: "\u{1F33C}",
882
+ tulip: "\u{1F337}",
883
+ hyacinth: "\u{1FABB}",
884
+ seedling: "\u{1F331}",
885
+ potted_plant: "\u{1FAB4}",
886
+ evergreen_tree: "\u{1F332}",
887
+ deciduous_tree: "\u{1F333}",
888
+ palm_tree: "\u{1F334}",
889
+ cactus: "\u{1F335}",
890
+ ear_of_rice: "\u{1F33E}",
891
+ herb: "\u{1F33F}",
892
+ shamrock: "\u2618\uFE0F",
893
+ four_leaf_clover: "\u{1F340}",
894
+ maple_leaf: "\u{1F341}",
895
+ fallen_leaf: "\u{1F342}",
896
+ leaves: "\u{1F343}",
897
+ empty_nest: "\u{1FAB9}",
898
+ nest_with_eggs: "\u{1FABA}",
899
+ mushroom: "\u{1F344}",
900
+ grapes: "\u{1F347}",
901
+ melon: "\u{1F348}",
902
+ watermelon: "\u{1F349}",
903
+ tangerine: "\u{1F34A}",
904
+ orange: "\u{1F34A}",
905
+ mandarin: "\u{1F34A}",
906
+ lemon: "\u{1F34B}",
907
+ banana: "\u{1F34C}",
908
+ pineapple: "\u{1F34D}",
909
+ mango: "\u{1F96D}",
910
+ apple: "\u{1F34E}",
911
+ green_apple: "\u{1F34F}",
912
+ pear: "\u{1F350}",
913
+ peach: "\u{1F351}",
914
+ cherries: "\u{1F352}",
915
+ strawberry: "\u{1F353}",
916
+ blueberries: "\u{1FAD0}",
917
+ kiwi_fruit: "\u{1F95D}",
918
+ tomato: "\u{1F345}",
919
+ olive: "\u{1FAD2}",
920
+ coconut: "\u{1F965}",
921
+ avocado: "\u{1F951}",
922
+ eggplant: "\u{1F346}",
923
+ potato: "\u{1F954}",
924
+ carrot: "\u{1F955}",
925
+ corn: "\u{1F33D}",
926
+ hot_pepper: "\u{1F336}\uFE0F",
927
+ bell_pepper: "\u{1FAD1}",
928
+ cucumber: "\u{1F952}",
929
+ leafy_green: "\u{1F96C}",
930
+ broccoli: "\u{1F966}",
931
+ garlic: "\u{1F9C4}",
932
+ onion: "\u{1F9C5}",
933
+ peanuts: "\u{1F95C}",
934
+ beans: "\u{1FAD8}",
935
+ chestnut: "\u{1F330}",
936
+ ginger_root: "\u{1FADA}",
937
+ pea_pod: "\u{1FADB}",
938
+ bread: "\u{1F35E}",
939
+ croissant: "\u{1F950}",
940
+ baguette_bread: "\u{1F956}",
941
+ flatbread: "\u{1FAD3}",
942
+ pretzel: "\u{1F968}",
943
+ bagel: "\u{1F96F}",
944
+ pancakes: "\u{1F95E}",
945
+ waffle: "\u{1F9C7}",
946
+ cheese: "\u{1F9C0}",
947
+ meat_on_bone: "\u{1F356}",
948
+ poultry_leg: "\u{1F357}",
949
+ cut_of_meat: "\u{1F969}",
950
+ bacon: "\u{1F953}",
951
+ hamburger: "\u{1F354}",
952
+ fries: "\u{1F35F}",
953
+ pizza: "\u{1F355}",
954
+ hotdog: "\u{1F32D}",
955
+ sandwich: "\u{1F96A}",
956
+ taco: "\u{1F32E}",
957
+ burrito: "\u{1F32F}",
958
+ tamale: "\u{1FAD4}",
959
+ stuffed_flatbread: "\u{1F959}",
960
+ falafel: "\u{1F9C6}",
961
+ egg: "\u{1F95A}",
962
+ fried_egg: "\u{1F373}",
963
+ shallow_pan_of_food: "\u{1F958}",
964
+ stew: "\u{1F372}",
965
+ fondue: "\u{1FAD5}",
966
+ bowl_with_spoon: "\u{1F963}",
967
+ green_salad: "\u{1F957}",
968
+ popcorn: "\u{1F37F}",
969
+ butter: "\u{1F9C8}",
970
+ salt: "\u{1F9C2}",
971
+ canned_food: "\u{1F96B}",
972
+ bento: "\u{1F371}",
973
+ rice_cracker: "\u{1F358}",
974
+ rice_ball: "\u{1F359}",
975
+ rice: "\u{1F35A}",
976
+ curry: "\u{1F35B}",
977
+ ramen: "\u{1F35C}",
978
+ spaghetti: "\u{1F35D}",
979
+ sweet_potato: "\u{1F360}",
980
+ oden: "\u{1F362}",
981
+ sushi: "\u{1F363}",
982
+ fried_shrimp: "\u{1F364}",
983
+ fish_cake: "\u{1F365}",
984
+ moon_cake: "\u{1F96E}",
985
+ dango: "\u{1F361}",
986
+ dumpling: "\u{1F95F}",
987
+ fortune_cookie: "\u{1F960}",
988
+ takeout_box: "\u{1F961}",
989
+ crab: "\u{1F980}",
990
+ lobster: "\u{1F99E}",
991
+ shrimp: "\u{1F990}",
992
+ squid: "\u{1F991}",
993
+ oyster: "\u{1F9AA}",
994
+ icecream: "\u{1F366}",
995
+ shaved_ice: "\u{1F367}",
996
+ ice_cream: "\u{1F368}",
997
+ doughnut: "\u{1F369}",
998
+ cookie: "\u{1F36A}",
999
+ birthday: "\u{1F382}",
1000
+ cake: "\u{1F370}",
1001
+ cupcake: "\u{1F9C1}",
1002
+ pie: "\u{1F967}",
1003
+ chocolate_bar: "\u{1F36B}",
1004
+ candy: "\u{1F36C}",
1005
+ lollipop: "\u{1F36D}",
1006
+ custard: "\u{1F36E}",
1007
+ honey_pot: "\u{1F36F}",
1008
+ baby_bottle: "\u{1F37C}",
1009
+ milk_glass: "\u{1F95B}",
1010
+ coffee: "\u2615",
1011
+ teapot: "\u{1FAD6}",
1012
+ tea: "\u{1F375}",
1013
+ sake: "\u{1F376}",
1014
+ champagne: "\u{1F37E}",
1015
+ wine_glass: "\u{1F377}",
1016
+ cocktail: "\u{1F378}",
1017
+ tropical_drink: "\u{1F379}",
1018
+ beer: "\u{1F37A}",
1019
+ beers: "\u{1F37B}",
1020
+ clinking_glasses: "\u{1F942}",
1021
+ tumbler_glass: "\u{1F943}",
1022
+ pouring_liquid: "\u{1FAD7}",
1023
+ cup_with_straw: "\u{1F964}",
1024
+ bubble_tea: "\u{1F9CB}",
1025
+ beverage_box: "\u{1F9C3}",
1026
+ mate: "\u{1F9C9}",
1027
+ ice_cube: "\u{1F9CA}",
1028
+ chopsticks: "\u{1F962}",
1029
+ plate_with_cutlery: "\u{1F37D}\uFE0F",
1030
+ fork_and_knife: "\u{1F374}",
1031
+ spoon: "\u{1F944}",
1032
+ hocho: "\u{1F52A}",
1033
+ knife: "\u{1F52A}",
1034
+ jar: "\u{1FAD9}",
1035
+ amphora: "\u{1F3FA}",
1036
+ earth_africa: "\u{1F30D}",
1037
+ earth_americas: "\u{1F30E}",
1038
+ earth_asia: "\u{1F30F}",
1039
+ globe_with_meridians: "\u{1F310}",
1040
+ world_map: "\u{1F5FA}\uFE0F",
1041
+ japan: "\u{1F5FE}",
1042
+ compass: "\u{1F9ED}",
1043
+ mountain_snow: "\u{1F3D4}\uFE0F",
1044
+ mountain: "\u26F0\uFE0F",
1045
+ volcano: "\u{1F30B}",
1046
+ mount_fuji: "\u{1F5FB}",
1047
+ camping: "\u{1F3D5}\uFE0F",
1048
+ beach_umbrella: "\u{1F3D6}\uFE0F",
1049
+ desert: "\u{1F3DC}\uFE0F",
1050
+ desert_island: "\u{1F3DD}\uFE0F",
1051
+ national_park: "\u{1F3DE}\uFE0F",
1052
+ stadium: "\u{1F3DF}\uFE0F",
1053
+ classical_building: "\u{1F3DB}\uFE0F",
1054
+ building_construction: "\u{1F3D7}\uFE0F",
1055
+ bricks: "\u{1F9F1}",
1056
+ rock: "\u{1FAA8}",
1057
+ wood: "\u{1FAB5}",
1058
+ hut: "\u{1F6D6}",
1059
+ houses: "\u{1F3D8}\uFE0F",
1060
+ derelict_house: "\u{1F3DA}\uFE0F",
1061
+ house: "\u{1F3E0}",
1062
+ house_with_garden: "\u{1F3E1}",
1063
+ office: "\u{1F3E2}",
1064
+ post_office: "\u{1F3E3}",
1065
+ european_post_office: "\u{1F3E4}",
1066
+ hospital: "\u{1F3E5}",
1067
+ bank: "\u{1F3E6}",
1068
+ hotel: "\u{1F3E8}",
1069
+ love_hotel: "\u{1F3E9}",
1070
+ convenience_store: "\u{1F3EA}",
1071
+ school: "\u{1F3EB}",
1072
+ department_store: "\u{1F3EC}",
1073
+ factory: "\u{1F3ED}",
1074
+ japanese_castle: "\u{1F3EF}",
1075
+ european_castle: "\u{1F3F0}",
1076
+ wedding: "\u{1F492}",
1077
+ tokyo_tower: "\u{1F5FC}",
1078
+ statue_of_liberty: "\u{1F5FD}",
1079
+ church: "\u26EA",
1080
+ mosque: "\u{1F54C}",
1081
+ hindu_temple: "\u{1F6D5}",
1082
+ synagogue: "\u{1F54D}",
1083
+ shinto_shrine: "\u26E9\uFE0F",
1084
+ kaaba: "\u{1F54B}",
1085
+ fountain: "\u26F2",
1086
+ tent: "\u26FA",
1087
+ foggy: "\u{1F301}",
1088
+ night_with_stars: "\u{1F303}",
1089
+ cityscape: "\u{1F3D9}\uFE0F",
1090
+ sunrise_over_mountains: "\u{1F304}",
1091
+ sunrise: "\u{1F305}",
1092
+ city_sunset: "\u{1F306}",
1093
+ city_sunrise: "\u{1F307}",
1094
+ bridge_at_night: "\u{1F309}",
1095
+ hotsprings: "\u2668\uFE0F",
1096
+ carousel_horse: "\u{1F3A0}",
1097
+ playground_slide: "\u{1F6DD}",
1098
+ ferris_wheel: "\u{1F3A1}",
1099
+ roller_coaster: "\u{1F3A2}",
1100
+ barber: "\u{1F488}",
1101
+ circus_tent: "\u{1F3AA}",
1102
+ steam_locomotive: "\u{1F682}",
1103
+ railway_car: "\u{1F683}",
1104
+ bullettrain_side: "\u{1F684}",
1105
+ bullettrain_front: "\u{1F685}",
1106
+ train2: "\u{1F686}",
1107
+ metro: "\u{1F687}",
1108
+ light_rail: "\u{1F688}",
1109
+ station: "\u{1F689}",
1110
+ tram: "\u{1F68A}",
1111
+ monorail: "\u{1F69D}",
1112
+ mountain_railway: "\u{1F69E}",
1113
+ train: "\u{1F68B}",
1114
+ bus: "\u{1F68C}",
1115
+ oncoming_bus: "\u{1F68D}",
1116
+ trolleybus: "\u{1F68E}",
1117
+ minibus: "\u{1F690}",
1118
+ ambulance: "\u{1F691}",
1119
+ fire_engine: "\u{1F692}",
1120
+ police_car: "\u{1F693}",
1121
+ oncoming_police_car: "\u{1F694}",
1122
+ taxi: "\u{1F695}",
1123
+ oncoming_taxi: "\u{1F696}",
1124
+ car: "\u{1F697}",
1125
+ red_car: "\u{1F697}",
1126
+ oncoming_automobile: "\u{1F698}",
1127
+ blue_car: "\u{1F699}",
1128
+ pickup_truck: "\u{1F6FB}",
1129
+ truck: "\u{1F69A}",
1130
+ articulated_lorry: "\u{1F69B}",
1131
+ tractor: "\u{1F69C}",
1132
+ racing_car: "\u{1F3CE}\uFE0F",
1133
+ motorcycle: "\u{1F3CD}\uFE0F",
1134
+ motor_scooter: "\u{1F6F5}",
1135
+ manual_wheelchair: "\u{1F9BD}",
1136
+ motorized_wheelchair: "\u{1F9BC}",
1137
+ auto_rickshaw: "\u{1F6FA}",
1138
+ bike: "\u{1F6B2}",
1139
+ kick_scooter: "\u{1F6F4}",
1140
+ skateboard: "\u{1F6F9}",
1141
+ roller_skate: "\u{1F6FC}",
1142
+ busstop: "\u{1F68F}",
1143
+ motorway: "\u{1F6E3}\uFE0F",
1144
+ railway_track: "\u{1F6E4}\uFE0F",
1145
+ oil_drum: "\u{1F6E2}\uFE0F",
1146
+ fuelpump: "\u26FD",
1147
+ wheel: "\u{1F6DE}",
1148
+ rotating_light: "\u{1F6A8}",
1149
+ traffic_light: "\u{1F6A5}",
1150
+ vertical_traffic_light: "\u{1F6A6}",
1151
+ stop_sign: "\u{1F6D1}",
1152
+ construction: "\u{1F6A7}",
1153
+ anchor: "\u2693",
1154
+ ring_buoy: "\u{1F6DF}",
1155
+ boat: "\u26F5",
1156
+ sailboat: "\u26F5",
1157
+ canoe: "\u{1F6F6}",
1158
+ speedboat: "\u{1F6A4}",
1159
+ passenger_ship: "\u{1F6F3}\uFE0F",
1160
+ ferry: "\u26F4\uFE0F",
1161
+ motor_boat: "\u{1F6E5}\uFE0F",
1162
+ ship: "\u{1F6A2}",
1163
+ airplane: "\u2708\uFE0F",
1164
+ small_airplane: "\u{1F6E9}\uFE0F",
1165
+ flight_departure: "\u{1F6EB}",
1166
+ flight_arrival: "\u{1F6EC}",
1167
+ parachute: "\u{1FA82}",
1168
+ seat: "\u{1F4BA}",
1169
+ helicopter: "\u{1F681}",
1170
+ suspension_railway: "\u{1F69F}",
1171
+ mountain_cableway: "\u{1F6A0}",
1172
+ aerial_tramway: "\u{1F6A1}",
1173
+ artificial_satellite: "\u{1F6F0}\uFE0F",
1174
+ rocket: "\u{1F680}",
1175
+ flying_saucer: "\u{1F6F8}",
1176
+ bellhop_bell: "\u{1F6CE}\uFE0F",
1177
+ luggage: "\u{1F9F3}",
1178
+ hourglass: "\u231B",
1179
+ hourglass_flowing_sand: "\u23F3",
1180
+ watch: "\u231A",
1181
+ alarm_clock: "\u23F0",
1182
+ stopwatch: "\u23F1\uFE0F",
1183
+ timer_clock: "\u23F2\uFE0F",
1184
+ mantelpiece_clock: "\u{1F570}\uFE0F",
1185
+ clock12: "\u{1F55B}",
1186
+ clock1230: "\u{1F567}",
1187
+ clock1: "\u{1F550}",
1188
+ clock130: "\u{1F55C}",
1189
+ clock2: "\u{1F551}",
1190
+ clock230: "\u{1F55D}",
1191
+ clock3: "\u{1F552}",
1192
+ clock330: "\u{1F55E}",
1193
+ clock4: "\u{1F553}",
1194
+ clock430: "\u{1F55F}",
1195
+ clock5: "\u{1F554}",
1196
+ clock530: "\u{1F560}",
1197
+ clock6: "\u{1F555}",
1198
+ clock630: "\u{1F561}",
1199
+ clock7: "\u{1F556}",
1200
+ clock730: "\u{1F562}",
1201
+ clock8: "\u{1F557}",
1202
+ clock830: "\u{1F563}",
1203
+ clock9: "\u{1F558}",
1204
+ clock930: "\u{1F564}",
1205
+ clock10: "\u{1F559}",
1206
+ clock1030: "\u{1F565}",
1207
+ clock11: "\u{1F55A}",
1208
+ clock1130: "\u{1F566}",
1209
+ new_moon: "\u{1F311}",
1210
+ waxing_crescent_moon: "\u{1F312}",
1211
+ first_quarter_moon: "\u{1F313}",
1212
+ moon: "\u{1F314}",
1213
+ waxing_gibbous_moon: "\u{1F314}",
1214
+ full_moon: "\u{1F315}",
1215
+ waning_gibbous_moon: "\u{1F316}",
1216
+ last_quarter_moon: "\u{1F317}",
1217
+ waning_crescent_moon: "\u{1F318}",
1218
+ crescent_moon: "\u{1F319}",
1219
+ new_moon_with_face: "\u{1F31A}",
1220
+ first_quarter_moon_with_face: "\u{1F31B}",
1221
+ last_quarter_moon_with_face: "\u{1F31C}",
1222
+ thermometer: "\u{1F321}\uFE0F",
1223
+ sunny: "\u2600\uFE0F",
1224
+ full_moon_with_face: "\u{1F31D}",
1225
+ sun_with_face: "\u{1F31E}",
1226
+ ringed_planet: "\u{1FA90}",
1227
+ star: "\u2B50",
1228
+ star2: "\u{1F31F}",
1229
+ stars: "\u{1F320}",
1230
+ milky_way: "\u{1F30C}",
1231
+ cloud: "\u2601\uFE0F",
1232
+ partly_sunny: "\u26C5",
1233
+ cloud_with_lightning_and_rain: "\u26C8\uFE0F",
1234
+ sun_behind_small_cloud: "\u{1F324}\uFE0F",
1235
+ sun_behind_large_cloud: "\u{1F325}\uFE0F",
1236
+ sun_behind_rain_cloud: "\u{1F326}\uFE0F",
1237
+ cloud_with_rain: "\u{1F327}\uFE0F",
1238
+ cloud_with_snow: "\u{1F328}\uFE0F",
1239
+ cloud_with_lightning: "\u{1F329}\uFE0F",
1240
+ tornado: "\u{1F32A}\uFE0F",
1241
+ fog: "\u{1F32B}\uFE0F",
1242
+ wind_face: "\u{1F32C}\uFE0F",
1243
+ cyclone: "\u{1F300}",
1244
+ rainbow: "\u{1F308}",
1245
+ closed_umbrella: "\u{1F302}",
1246
+ open_umbrella: "\u2602\uFE0F",
1247
+ umbrella: "\u2614",
1248
+ parasol_on_ground: "\u26F1\uFE0F",
1249
+ zap: "\u26A1",
1250
+ snowflake: "\u2744\uFE0F",
1251
+ snowman_with_snow: "\u2603\uFE0F",
1252
+ snowman: "\u26C4",
1253
+ comet: "\u2604\uFE0F",
1254
+ fire: "\u{1F525}",
1255
+ droplet: "\u{1F4A7}",
1256
+ ocean: "\u{1F30A}",
1257
+ jack_o_lantern: "\u{1F383}",
1258
+ christmas_tree: "\u{1F384}",
1259
+ fireworks: "\u{1F386}",
1260
+ sparkler: "\u{1F387}",
1261
+ firecracker: "\u{1F9E8}",
1262
+ sparkles: "\u2728",
1263
+ balloon: "\u{1F388}",
1264
+ tada: "\u{1F389}",
1265
+ confetti_ball: "\u{1F38A}",
1266
+ tanabata_tree: "\u{1F38B}",
1267
+ bamboo: "\u{1F38D}",
1268
+ dolls: "\u{1F38E}",
1269
+ flags: "\u{1F38F}",
1270
+ wind_chime: "\u{1F390}",
1271
+ rice_scene: "\u{1F391}",
1272
+ red_envelope: "\u{1F9E7}",
1273
+ ribbon: "\u{1F380}",
1274
+ gift: "\u{1F381}",
1275
+ reminder_ribbon: "\u{1F397}\uFE0F",
1276
+ tickets: "\u{1F39F}\uFE0F",
1277
+ ticket: "\u{1F3AB}",
1278
+ medal_military: "\u{1F396}\uFE0F",
1279
+ trophy: "\u{1F3C6}",
1280
+ medal_sports: "\u{1F3C5}",
1281
+ "1st_place_medal": "\u{1F947}",
1282
+ "2nd_place_medal": "\u{1F948}",
1283
+ "3rd_place_medal": "\u{1F949}",
1284
+ soccer: "\u26BD",
1285
+ baseball: "\u26BE",
1286
+ softball: "\u{1F94E}",
1287
+ basketball: "\u{1F3C0}",
1288
+ volleyball: "\u{1F3D0}",
1289
+ football: "\u{1F3C8}",
1290
+ rugby_football: "\u{1F3C9}",
1291
+ tennis: "\u{1F3BE}",
1292
+ flying_disc: "\u{1F94F}",
1293
+ bowling: "\u{1F3B3}",
1294
+ cricket_game: "\u{1F3CF}",
1295
+ field_hockey: "\u{1F3D1}",
1296
+ ice_hockey: "\u{1F3D2}",
1297
+ lacrosse: "\u{1F94D}",
1298
+ ping_pong: "\u{1F3D3}",
1299
+ badminton: "\u{1F3F8}",
1300
+ boxing_glove: "\u{1F94A}",
1301
+ martial_arts_uniform: "\u{1F94B}",
1302
+ goal_net: "\u{1F945}",
1303
+ golf: "\u26F3",
1304
+ ice_skate: "\u26F8\uFE0F",
1305
+ fishing_pole_and_fish: "\u{1F3A3}",
1306
+ diving_mask: "\u{1F93F}",
1307
+ running_shirt_with_sash: "\u{1F3BD}",
1308
+ ski: "\u{1F3BF}",
1309
+ sled: "\u{1F6F7}",
1310
+ curling_stone: "\u{1F94C}",
1311
+ dart: "\u{1F3AF}",
1312
+ yo_yo: "\u{1FA80}",
1313
+ kite: "\u{1FA81}",
1314
+ gun: "\u{1F52B}",
1315
+ "8ball": "\u{1F3B1}",
1316
+ crystal_ball: "\u{1F52E}",
1317
+ magic_wand: "\u{1FA84}",
1318
+ video_game: "\u{1F3AE}",
1319
+ joystick: "\u{1F579}\uFE0F",
1320
+ slot_machine: "\u{1F3B0}",
1321
+ game_die: "\u{1F3B2}",
1322
+ jigsaw: "\u{1F9E9}",
1323
+ teddy_bear: "\u{1F9F8}",
1324
+ pinata: "\u{1FA85}",
1325
+ mirror_ball: "\u{1FAA9}",
1326
+ nesting_dolls: "\u{1FA86}",
1327
+ spades: "\u2660\uFE0F",
1328
+ hearts: "\u2665\uFE0F",
1329
+ diamonds: "\u2666\uFE0F",
1330
+ clubs: "\u2663\uFE0F",
1331
+ chess_pawn: "\u265F\uFE0F",
1332
+ black_joker: "\u{1F0CF}",
1333
+ mahjong: "\u{1F004}",
1334
+ flower_playing_cards: "\u{1F3B4}",
1335
+ performing_arts: "\u{1F3AD}",
1336
+ framed_picture: "\u{1F5BC}\uFE0F",
1337
+ art: "\u{1F3A8}",
1338
+ thread: "\u{1F9F5}",
1339
+ sewing_needle: "\u{1FAA1}",
1340
+ yarn: "\u{1F9F6}",
1341
+ knot: "\u{1FAA2}",
1342
+ eyeglasses: "\u{1F453}",
1343
+ dark_sunglasses: "\u{1F576}\uFE0F",
1344
+ goggles: "\u{1F97D}",
1345
+ lab_coat: "\u{1F97C}",
1346
+ safety_vest: "\u{1F9BA}",
1347
+ necktie: "\u{1F454}",
1348
+ shirt: "\u{1F455}",
1349
+ tshirt: "\u{1F455}",
1350
+ jeans: "\u{1F456}",
1351
+ scarf: "\u{1F9E3}",
1352
+ gloves: "\u{1F9E4}",
1353
+ coat: "\u{1F9E5}",
1354
+ socks: "\u{1F9E6}",
1355
+ dress: "\u{1F457}",
1356
+ kimono: "\u{1F458}",
1357
+ sari: "\u{1F97B}",
1358
+ one_piece_swimsuit: "\u{1FA71}",
1359
+ swim_brief: "\u{1FA72}",
1360
+ shorts: "\u{1FA73}",
1361
+ bikini: "\u{1F459}",
1362
+ womans_clothes: "\u{1F45A}",
1363
+ folding_hand_fan: "\u{1FAAD}",
1364
+ purse: "\u{1F45B}",
1365
+ handbag: "\u{1F45C}",
1366
+ pouch: "\u{1F45D}",
1367
+ shopping: "\u{1F6CD}\uFE0F",
1368
+ school_satchel: "\u{1F392}",
1369
+ thong_sandal: "\u{1FA74}",
1370
+ mans_shoe: "\u{1F45E}",
1371
+ shoe: "\u{1F45E}",
1372
+ athletic_shoe: "\u{1F45F}",
1373
+ hiking_boot: "\u{1F97E}",
1374
+ flat_shoe: "\u{1F97F}",
1375
+ high_heel: "\u{1F460}",
1376
+ sandal: "\u{1F461}",
1377
+ ballet_shoes: "\u{1FA70}",
1378
+ boot: "\u{1F462}",
1379
+ hair_pick: "\u{1FAAE}",
1380
+ crown: "\u{1F451}",
1381
+ womans_hat: "\u{1F452}",
1382
+ tophat: "\u{1F3A9}",
1383
+ mortar_board: "\u{1F393}",
1384
+ billed_cap: "\u{1F9E2}",
1385
+ military_helmet: "\u{1FA96}",
1386
+ rescue_worker_helmet: "\u26D1\uFE0F",
1387
+ prayer_beads: "\u{1F4FF}",
1388
+ lipstick: "\u{1F484}",
1389
+ ring: "\u{1F48D}",
1390
+ gem: "\u{1F48E}",
1391
+ mute: "\u{1F507}",
1392
+ speaker: "\u{1F508}",
1393
+ sound: "\u{1F509}",
1394
+ loud_sound: "\u{1F50A}",
1395
+ loudspeaker: "\u{1F4E2}",
1396
+ mega: "\u{1F4E3}",
1397
+ postal_horn: "\u{1F4EF}",
1398
+ bell: "\u{1F514}",
1399
+ no_bell: "\u{1F515}",
1400
+ musical_score: "\u{1F3BC}",
1401
+ musical_note: "\u{1F3B5}",
1402
+ notes: "\u{1F3B6}",
1403
+ studio_microphone: "\u{1F399}\uFE0F",
1404
+ level_slider: "\u{1F39A}\uFE0F",
1405
+ control_knobs: "\u{1F39B}\uFE0F",
1406
+ microphone: "\u{1F3A4}",
1407
+ headphones: "\u{1F3A7}",
1408
+ radio: "\u{1F4FB}",
1409
+ saxophone: "\u{1F3B7}",
1410
+ accordion: "\u{1FA97}",
1411
+ guitar: "\u{1F3B8}",
1412
+ musical_keyboard: "\u{1F3B9}",
1413
+ trumpet: "\u{1F3BA}",
1414
+ violin: "\u{1F3BB}",
1415
+ banjo: "\u{1FA95}",
1416
+ drum: "\u{1F941}",
1417
+ long_drum: "\u{1FA98}",
1418
+ maracas: "\u{1FA87}",
1419
+ flute: "\u{1FA88}",
1420
+ iphone: "\u{1F4F1}",
1421
+ calling: "\u{1F4F2}",
1422
+ phone: "\u260E\uFE0F",
1423
+ telephone: "\u260E\uFE0F",
1424
+ telephone_receiver: "\u{1F4DE}",
1425
+ pager: "\u{1F4DF}",
1426
+ fax: "\u{1F4E0}",
1427
+ battery: "\u{1F50B}",
1428
+ low_battery: "\u{1FAAB}",
1429
+ electric_plug: "\u{1F50C}",
1430
+ computer: "\u{1F4BB}",
1431
+ desktop_computer: "\u{1F5A5}\uFE0F",
1432
+ printer: "\u{1F5A8}\uFE0F",
1433
+ keyboard: "\u2328\uFE0F",
1434
+ computer_mouse: "\u{1F5B1}\uFE0F",
1435
+ trackball: "\u{1F5B2}\uFE0F",
1436
+ minidisc: "\u{1F4BD}",
1437
+ floppy_disk: "\u{1F4BE}",
1438
+ cd: "\u{1F4BF}",
1439
+ dvd: "\u{1F4C0}",
1440
+ abacus: "\u{1F9EE}",
1441
+ movie_camera: "\u{1F3A5}",
1442
+ film_strip: "\u{1F39E}\uFE0F",
1443
+ film_projector: "\u{1F4FD}\uFE0F",
1444
+ clapper: "\u{1F3AC}",
1445
+ tv: "\u{1F4FA}",
1446
+ camera: "\u{1F4F7}",
1447
+ camera_flash: "\u{1F4F8}",
1448
+ video_camera: "\u{1F4F9}",
1449
+ vhs: "\u{1F4FC}",
1450
+ mag: "\u{1F50D}",
1451
+ mag_right: "\u{1F50E}",
1452
+ candle: "\u{1F56F}\uFE0F",
1453
+ bulb: "\u{1F4A1}",
1454
+ flashlight: "\u{1F526}",
1455
+ izakaya_lantern: "\u{1F3EE}",
1456
+ lantern: "\u{1F3EE}",
1457
+ diya_lamp: "\u{1FA94}",
1458
+ notebook_with_decorative_cover: "\u{1F4D4}",
1459
+ closed_book: "\u{1F4D5}",
1460
+ book: "\u{1F4D6}",
1461
+ open_book: "\u{1F4D6}",
1462
+ green_book: "\u{1F4D7}",
1463
+ blue_book: "\u{1F4D8}",
1464
+ orange_book: "\u{1F4D9}",
1465
+ books: "\u{1F4DA}",
1466
+ notebook: "\u{1F4D3}",
1467
+ ledger: "\u{1F4D2}",
1468
+ page_with_curl: "\u{1F4C3}",
1469
+ scroll: "\u{1F4DC}",
1470
+ page_facing_up: "\u{1F4C4}",
1471
+ newspaper: "\u{1F4F0}",
1472
+ newspaper_roll: "\u{1F5DE}\uFE0F",
1473
+ bookmark_tabs: "\u{1F4D1}",
1474
+ bookmark: "\u{1F516}",
1475
+ label: "\u{1F3F7}\uFE0F",
1476
+ moneybag: "\u{1F4B0}",
1477
+ coin: "\u{1FA99}",
1478
+ yen: "\u{1F4B4}",
1479
+ dollar: "\u{1F4B5}",
1480
+ euro: "\u{1F4B6}",
1481
+ pound: "\u{1F4B7}",
1482
+ money_with_wings: "\u{1F4B8}",
1483
+ credit_card: "\u{1F4B3}",
1484
+ receipt: "\u{1F9FE}",
1485
+ chart: "\u{1F4B9}",
1486
+ envelope: "\u2709\uFE0F",
1487
+ email: "\u{1F4E7}",
1488
+ "e-mail": "\u{1F4E7}",
1489
+ incoming_envelope: "\u{1F4E8}",
1490
+ envelope_with_arrow: "\u{1F4E9}",
1491
+ outbox_tray: "\u{1F4E4}",
1492
+ inbox_tray: "\u{1F4E5}",
1493
+ package: "\u{1F4E6}",
1494
+ mailbox: "\u{1F4EB}",
1495
+ mailbox_closed: "\u{1F4EA}",
1496
+ mailbox_with_mail: "\u{1F4EC}",
1497
+ mailbox_with_no_mail: "\u{1F4ED}",
1498
+ postbox: "\u{1F4EE}",
1499
+ ballot_box: "\u{1F5F3}\uFE0F",
1500
+ pencil2: "\u270F\uFE0F",
1501
+ black_nib: "\u2712\uFE0F",
1502
+ fountain_pen: "\u{1F58B}\uFE0F",
1503
+ pen: "\u{1F58A}\uFE0F",
1504
+ paintbrush: "\u{1F58C}\uFE0F",
1505
+ crayon: "\u{1F58D}\uFE0F",
1506
+ memo: "\u{1F4DD}",
1507
+ pencil: "\u{1F4DD}",
1508
+ briefcase: "\u{1F4BC}",
1509
+ file_folder: "\u{1F4C1}",
1510
+ open_file_folder: "\u{1F4C2}",
1511
+ card_index_dividers: "\u{1F5C2}\uFE0F",
1512
+ date: "\u{1F4C5}",
1513
+ calendar: "\u{1F4C6}",
1514
+ spiral_notepad: "\u{1F5D2}\uFE0F",
1515
+ spiral_calendar: "\u{1F5D3}\uFE0F",
1516
+ card_index: "\u{1F4C7}",
1517
+ chart_with_upwards_trend: "\u{1F4C8}",
1518
+ chart_with_downwards_trend: "\u{1F4C9}",
1519
+ bar_chart: "\u{1F4CA}",
1520
+ clipboard: "\u{1F4CB}",
1521
+ pushpin: "\u{1F4CC}",
1522
+ round_pushpin: "\u{1F4CD}",
1523
+ paperclip: "\u{1F4CE}",
1524
+ paperclips: "\u{1F587}\uFE0F",
1525
+ straight_ruler: "\u{1F4CF}",
1526
+ triangular_ruler: "\u{1F4D0}",
1527
+ scissors: "\u2702\uFE0F",
1528
+ card_file_box: "\u{1F5C3}\uFE0F",
1529
+ file_cabinet: "\u{1F5C4}\uFE0F",
1530
+ wastebasket: "\u{1F5D1}\uFE0F",
1531
+ lock: "\u{1F512}",
1532
+ unlock: "\u{1F513}",
1533
+ lock_with_ink_pen: "\u{1F50F}",
1534
+ closed_lock_with_key: "\u{1F510}",
1535
+ key: "\u{1F511}",
1536
+ old_key: "\u{1F5DD}\uFE0F",
1537
+ hammer: "\u{1F528}",
1538
+ axe: "\u{1FA93}",
1539
+ pick: "\u26CF\uFE0F",
1540
+ hammer_and_pick: "\u2692\uFE0F",
1541
+ hammer_and_wrench: "\u{1F6E0}\uFE0F",
1542
+ dagger: "\u{1F5E1}\uFE0F",
1543
+ crossed_swords: "\u2694\uFE0F",
1544
+ bomb: "\u{1F4A3}",
1545
+ boomerang: "\u{1FA83}",
1546
+ bow_and_arrow: "\u{1F3F9}",
1547
+ shield: "\u{1F6E1}\uFE0F",
1548
+ carpentry_saw: "\u{1FA9A}",
1549
+ wrench: "\u{1F527}",
1550
+ screwdriver: "\u{1FA9B}",
1551
+ nut_and_bolt: "\u{1F529}",
1552
+ gear: "\u2699\uFE0F",
1553
+ clamp: "\u{1F5DC}\uFE0F",
1554
+ balance_scale: "\u2696\uFE0F",
1555
+ probing_cane: "\u{1F9AF}",
1556
+ link: "\u{1F517}",
1557
+ chains: "\u26D3\uFE0F",
1558
+ hook: "\u{1FA9D}",
1559
+ toolbox: "\u{1F9F0}",
1560
+ magnet: "\u{1F9F2}",
1561
+ ladder: "\u{1FA9C}",
1562
+ alembic: "\u2697\uFE0F",
1563
+ test_tube: "\u{1F9EA}",
1564
+ petri_dish: "\u{1F9EB}",
1565
+ dna: "\u{1F9EC}",
1566
+ microscope: "\u{1F52C}",
1567
+ telescope: "\u{1F52D}",
1568
+ satellite: "\u{1F4E1}",
1569
+ syringe: "\u{1F489}",
1570
+ drop_of_blood: "\u{1FA78}",
1571
+ pill: "\u{1F48A}",
1572
+ adhesive_bandage: "\u{1FA79}",
1573
+ crutch: "\u{1FA7C}",
1574
+ stethoscope: "\u{1FA7A}",
1575
+ x_ray: "\u{1FA7B}",
1576
+ door: "\u{1F6AA}",
1577
+ elevator: "\u{1F6D7}",
1578
+ mirror: "\u{1FA9E}",
1579
+ window: "\u{1FA9F}",
1580
+ bed: "\u{1F6CF}\uFE0F",
1581
+ couch_and_lamp: "\u{1F6CB}\uFE0F",
1582
+ chair: "\u{1FA91}",
1583
+ toilet: "\u{1F6BD}",
1584
+ plunger: "\u{1FAA0}",
1585
+ shower: "\u{1F6BF}",
1586
+ bathtub: "\u{1F6C1}",
1587
+ mouse_trap: "\u{1FAA4}",
1588
+ razor: "\u{1FA92}",
1589
+ lotion_bottle: "\u{1F9F4}",
1590
+ safety_pin: "\u{1F9F7}",
1591
+ broom: "\u{1F9F9}",
1592
+ basket: "\u{1F9FA}",
1593
+ roll_of_paper: "\u{1F9FB}",
1594
+ bucket: "\u{1FAA3}",
1595
+ soap: "\u{1F9FC}",
1596
+ bubbles: "\u{1FAE7}",
1597
+ toothbrush: "\u{1FAA5}",
1598
+ sponge: "\u{1F9FD}",
1599
+ fire_extinguisher: "\u{1F9EF}",
1600
+ shopping_cart: "\u{1F6D2}",
1601
+ smoking: "\u{1F6AC}",
1602
+ coffin: "\u26B0\uFE0F",
1603
+ headstone: "\u{1FAA6}",
1604
+ funeral_urn: "\u26B1\uFE0F",
1605
+ nazar_amulet: "\u{1F9FF}",
1606
+ hamsa: "\u{1FAAC}",
1607
+ moyai: "\u{1F5FF}",
1608
+ placard: "\u{1FAA7}",
1609
+ identification_card: "\u{1FAAA}",
1610
+ atm: "\u{1F3E7}",
1611
+ put_litter_in_its_place: "\u{1F6AE}",
1612
+ potable_water: "\u{1F6B0}",
1613
+ wheelchair: "\u267F",
1614
+ mens: "\u{1F6B9}",
1615
+ womens: "\u{1F6BA}",
1616
+ restroom: "\u{1F6BB}",
1617
+ baby_symbol: "\u{1F6BC}",
1618
+ wc: "\u{1F6BE}",
1619
+ passport_control: "\u{1F6C2}",
1620
+ customs: "\u{1F6C3}",
1621
+ baggage_claim: "\u{1F6C4}",
1622
+ left_luggage: "\u{1F6C5}",
1623
+ warning: "\u26A0\uFE0F",
1624
+ children_crossing: "\u{1F6B8}",
1625
+ no_entry: "\u26D4",
1626
+ no_entry_sign: "\u{1F6AB}",
1627
+ no_bicycles: "\u{1F6B3}",
1628
+ no_smoking: "\u{1F6AD}",
1629
+ do_not_litter: "\u{1F6AF}",
1630
+ "non-potable_water": "\u{1F6B1}",
1631
+ no_pedestrians: "\u{1F6B7}",
1632
+ no_mobile_phones: "\u{1F4F5}",
1633
+ underage: "\u{1F51E}",
1634
+ radioactive: "\u2622\uFE0F",
1635
+ biohazard: "\u2623\uFE0F",
1636
+ arrow_up: "\u2B06\uFE0F",
1637
+ arrow_upper_right: "\u2197\uFE0F",
1638
+ arrow_right: "\u27A1\uFE0F",
1639
+ arrow_lower_right: "\u2198\uFE0F",
1640
+ arrow_down: "\u2B07\uFE0F",
1641
+ arrow_lower_left: "\u2199\uFE0F",
1642
+ arrow_left: "\u2B05\uFE0F",
1643
+ arrow_upper_left: "\u2196\uFE0F",
1644
+ arrow_up_down: "\u2195\uFE0F",
1645
+ left_right_arrow: "\u2194\uFE0F",
1646
+ leftwards_arrow_with_hook: "\u21A9\uFE0F",
1647
+ arrow_right_hook: "\u21AA\uFE0F",
1648
+ arrow_heading_up: "\u2934\uFE0F",
1649
+ arrow_heading_down: "\u2935\uFE0F",
1650
+ arrows_clockwise: "\u{1F503}",
1651
+ arrows_counterclockwise: "\u{1F504}",
1652
+ back: "\u{1F519}",
1653
+ end: "\u{1F51A}",
1654
+ on: "\u{1F51B}",
1655
+ soon: "\u{1F51C}",
1656
+ top: "\u{1F51D}",
1657
+ place_of_worship: "\u{1F6D0}",
1658
+ atom_symbol: "\u269B\uFE0F",
1659
+ om: "\u{1F549}\uFE0F",
1660
+ star_of_david: "\u2721\uFE0F",
1661
+ wheel_of_dharma: "\u2638\uFE0F",
1662
+ yin_yang: "\u262F\uFE0F",
1663
+ latin_cross: "\u271D\uFE0F",
1664
+ orthodox_cross: "\u2626\uFE0F",
1665
+ star_and_crescent: "\u262A\uFE0F",
1666
+ peace_symbol: "\u262E\uFE0F",
1667
+ menorah: "\u{1F54E}",
1668
+ six_pointed_star: "\u{1F52F}",
1669
+ khanda: "\u{1FAAF}",
1670
+ aries: "\u2648",
1671
+ taurus: "\u2649",
1672
+ gemini: "\u264A",
1673
+ cancer: "\u264B",
1674
+ leo: "\u264C",
1675
+ virgo: "\u264D",
1676
+ libra: "\u264E",
1677
+ scorpius: "\u264F",
1678
+ sagittarius: "\u2650",
1679
+ capricorn: "\u2651",
1680
+ aquarius: "\u2652",
1681
+ pisces: "\u2653",
1682
+ ophiuchus: "\u26CE",
1683
+ twisted_rightwards_arrows: "\u{1F500}",
1684
+ repeat: "\u{1F501}",
1685
+ repeat_one: "\u{1F502}",
1686
+ arrow_forward: "\u25B6\uFE0F",
1687
+ fast_forward: "\u23E9",
1688
+ next_track_button: "\u23ED\uFE0F",
1689
+ play_or_pause_button: "\u23EF\uFE0F",
1690
+ arrow_backward: "\u25C0\uFE0F",
1691
+ rewind: "\u23EA",
1692
+ previous_track_button: "\u23EE\uFE0F",
1693
+ arrow_up_small: "\u{1F53C}",
1694
+ arrow_double_up: "\u23EB",
1695
+ arrow_down_small: "\u{1F53D}",
1696
+ arrow_double_down: "\u23EC",
1697
+ pause_button: "\u23F8\uFE0F",
1698
+ stop_button: "\u23F9\uFE0F",
1699
+ record_button: "\u23FA\uFE0F",
1700
+ eject_button: "\u23CF\uFE0F",
1701
+ cinema: "\u{1F3A6}",
1702
+ low_brightness: "\u{1F505}",
1703
+ high_brightness: "\u{1F506}",
1704
+ signal_strength: "\u{1F4F6}",
1705
+ wireless: "\u{1F6DC}",
1706
+ vibration_mode: "\u{1F4F3}",
1707
+ mobile_phone_off: "\u{1F4F4}",
1708
+ female_sign: "\u2640\uFE0F",
1709
+ male_sign: "\u2642\uFE0F",
1710
+ transgender_symbol: "\u26A7\uFE0F",
1711
+ heavy_multiplication_x: "\u2716\uFE0F",
1712
+ heavy_plus_sign: "\u2795",
1713
+ heavy_minus_sign: "\u2796",
1714
+ heavy_division_sign: "\u2797",
1715
+ heavy_equals_sign: "\u{1F7F0}",
1716
+ infinity: "\u267E\uFE0F",
1717
+ bangbang: "\u203C\uFE0F",
1718
+ interrobang: "\u2049\uFE0F",
1719
+ question: "\u2753",
1720
+ grey_question: "\u2754",
1721
+ grey_exclamation: "\u2755",
1722
+ exclamation: "\u2757",
1723
+ heavy_exclamation_mark: "\u2757",
1724
+ wavy_dash: "\u3030\uFE0F",
1725
+ currency_exchange: "\u{1F4B1}",
1726
+ heavy_dollar_sign: "\u{1F4B2}",
1727
+ medical_symbol: "\u2695\uFE0F",
1728
+ recycle: "\u267B\uFE0F",
1729
+ fleur_de_lis: "\u269C\uFE0F",
1730
+ trident: "\u{1F531}",
1731
+ name_badge: "\u{1F4DB}",
1732
+ beginner: "\u{1F530}",
1733
+ o: "\u2B55",
1734
+ white_check_mark: "\u2705",
1735
+ ballot_box_with_check: "\u2611\uFE0F",
1736
+ heavy_check_mark: "\u2714\uFE0F",
1737
+ x: "\u274C",
1738
+ negative_squared_cross_mark: "\u274E",
1739
+ curly_loop: "\u27B0",
1740
+ loop: "\u27BF",
1741
+ part_alternation_mark: "\u303D\uFE0F",
1742
+ eight_spoked_asterisk: "\u2733\uFE0F",
1743
+ eight_pointed_black_star: "\u2734\uFE0F",
1744
+ sparkle: "\u2747\uFE0F",
1745
+ copyright: "\xA9\uFE0F",
1746
+ registered: "\xAE\uFE0F",
1747
+ tm: "\u2122\uFE0F",
1748
+ hash: "#\uFE0F\u20E3",
1749
+ asterisk: "*\uFE0F\u20E3",
1750
+ zero: "0\uFE0F\u20E3",
1751
+ one: "1\uFE0F\u20E3",
1752
+ two: "2\uFE0F\u20E3",
1753
+ three: "3\uFE0F\u20E3",
1754
+ four: "4\uFE0F\u20E3",
1755
+ five: "5\uFE0F\u20E3",
1756
+ six: "6\uFE0F\u20E3",
1757
+ seven: "7\uFE0F\u20E3",
1758
+ eight: "8\uFE0F\u20E3",
1759
+ nine: "9\uFE0F\u20E3",
1760
+ keycap_ten: "\u{1F51F}",
1761
+ capital_abcd: "\u{1F520}",
1762
+ abcd: "\u{1F521}",
1763
+ symbols: "\u{1F523}",
1764
+ abc: "\u{1F524}",
1765
+ a: "\u{1F170}\uFE0F",
1766
+ ab: "\u{1F18E}",
1767
+ b: "\u{1F171}\uFE0F",
1768
+ cl: "\u{1F191}",
1769
+ cool: "\u{1F192}",
1770
+ free: "\u{1F193}",
1771
+ information_source: "\u2139\uFE0F",
1772
+ id: "\u{1F194}",
1773
+ m: "\u24C2\uFE0F",
1774
+ new: "\u{1F195}",
1775
+ ng: "\u{1F196}",
1776
+ o2: "\u{1F17E}\uFE0F",
1777
+ ok: "\u{1F197}",
1778
+ parking: "\u{1F17F}\uFE0F",
1779
+ sos: "\u{1F198}",
1780
+ up: "\u{1F199}",
1781
+ vs: "\u{1F19A}",
1782
+ koko: "\u{1F201}",
1783
+ sa: "\u{1F202}\uFE0F",
1784
+ u6708: "\u{1F237}\uFE0F",
1785
+ u6709: "\u{1F236}",
1786
+ u6307: "\u{1F22F}",
1787
+ ideograph_advantage: "\u{1F250}",
1788
+ u5272: "\u{1F239}",
1789
+ u7121: "\u{1F21A}",
1790
+ u7981: "\u{1F232}",
1791
+ accept: "\u{1F251}",
1792
+ u7533: "\u{1F238}",
1793
+ u5408: "\u{1F234}",
1794
+ u7a7a: "\u{1F233}",
1795
+ congratulations: "\u3297\uFE0F",
1796
+ secret: "\u3299\uFE0F",
1797
+ u55b6: "\u{1F23A}",
1798
+ u6e80: "\u{1F235}",
1799
+ red_circle: "\u{1F534}",
1800
+ orange_circle: "\u{1F7E0}",
1801
+ yellow_circle: "\u{1F7E1}",
1802
+ green_circle: "\u{1F7E2}",
1803
+ large_blue_circle: "\u{1F535}",
1804
+ purple_circle: "\u{1F7E3}",
1805
+ brown_circle: "\u{1F7E4}",
1806
+ black_circle: "\u26AB",
1807
+ white_circle: "\u26AA",
1808
+ red_square: "\u{1F7E5}",
1809
+ orange_square: "\u{1F7E7}",
1810
+ yellow_square: "\u{1F7E8}",
1811
+ green_square: "\u{1F7E9}",
1812
+ blue_square: "\u{1F7E6}",
1813
+ purple_square: "\u{1F7EA}",
1814
+ brown_square: "\u{1F7EB}",
1815
+ black_large_square: "\u2B1B",
1816
+ white_large_square: "\u2B1C",
1817
+ black_medium_square: "\u25FC\uFE0F",
1818
+ white_medium_square: "\u25FB\uFE0F",
1819
+ black_medium_small_square: "\u25FE",
1820
+ white_medium_small_square: "\u25FD",
1821
+ black_small_square: "\u25AA\uFE0F",
1822
+ white_small_square: "\u25AB\uFE0F",
1823
+ large_orange_diamond: "\u{1F536}",
1824
+ large_blue_diamond: "\u{1F537}",
1825
+ small_orange_diamond: "\u{1F538}",
1826
+ small_blue_diamond: "\u{1F539}",
1827
+ small_red_triangle: "\u{1F53A}",
1828
+ small_red_triangle_down: "\u{1F53B}",
1829
+ diamond_shape_with_a_dot_inside: "\u{1F4A0}",
1830
+ radio_button: "\u{1F518}",
1831
+ white_square_button: "\u{1F533}",
1832
+ black_square_button: "\u{1F532}",
1833
+ checkered_flag: "\u{1F3C1}",
1834
+ triangular_flag_on_post: "\u{1F6A9}",
1835
+ crossed_flags: "\u{1F38C}",
1836
+ black_flag: "\u{1F3F4}",
1837
+ white_flag: "\u{1F3F3}\uFE0F",
1838
+ rainbow_flag: "\u{1F3F3}\uFE0F\u200D\u{1F308}",
1839
+ transgender_flag: "\u{1F3F3}\uFE0F\u200D\u26A7\uFE0F",
1840
+ pirate_flag: "\u{1F3F4}\u200D\u2620\uFE0F",
1841
+ ascension_island: "\u{1F1E6}\u{1F1E8}",
1842
+ andorra: "\u{1F1E6}\u{1F1E9}",
1843
+ united_arab_emirates: "\u{1F1E6}\u{1F1EA}",
1844
+ afghanistan: "\u{1F1E6}\u{1F1EB}",
1845
+ antigua_barbuda: "\u{1F1E6}\u{1F1EC}",
1846
+ anguilla: "\u{1F1E6}\u{1F1EE}",
1847
+ albania: "\u{1F1E6}\u{1F1F1}",
1848
+ armenia: "\u{1F1E6}\u{1F1F2}",
1849
+ angola: "\u{1F1E6}\u{1F1F4}",
1850
+ antarctica: "\u{1F1E6}\u{1F1F6}",
1851
+ argentina: "\u{1F1E6}\u{1F1F7}",
1852
+ american_samoa: "\u{1F1E6}\u{1F1F8}",
1853
+ austria: "\u{1F1E6}\u{1F1F9}",
1854
+ australia: "\u{1F1E6}\u{1F1FA}",
1855
+ aruba: "\u{1F1E6}\u{1F1FC}",
1856
+ aland_islands: "\u{1F1E6}\u{1F1FD}",
1857
+ azerbaijan: "\u{1F1E6}\u{1F1FF}",
1858
+ bosnia_herzegovina: "\u{1F1E7}\u{1F1E6}",
1859
+ barbados: "\u{1F1E7}\u{1F1E7}",
1860
+ bangladesh: "\u{1F1E7}\u{1F1E9}",
1861
+ belgium: "\u{1F1E7}\u{1F1EA}",
1862
+ burkina_faso: "\u{1F1E7}\u{1F1EB}",
1863
+ bulgaria: "\u{1F1E7}\u{1F1EC}",
1864
+ bahrain: "\u{1F1E7}\u{1F1ED}",
1865
+ burundi: "\u{1F1E7}\u{1F1EE}",
1866
+ benin: "\u{1F1E7}\u{1F1EF}",
1867
+ st_barthelemy: "\u{1F1E7}\u{1F1F1}",
1868
+ bermuda: "\u{1F1E7}\u{1F1F2}",
1869
+ brunei: "\u{1F1E7}\u{1F1F3}",
1870
+ bolivia: "\u{1F1E7}\u{1F1F4}",
1871
+ caribbean_netherlands: "\u{1F1E7}\u{1F1F6}",
1872
+ brazil: "\u{1F1E7}\u{1F1F7}",
1873
+ bahamas: "\u{1F1E7}\u{1F1F8}",
1874
+ bhutan: "\u{1F1E7}\u{1F1F9}",
1875
+ bouvet_island: "\u{1F1E7}\u{1F1FB}",
1876
+ botswana: "\u{1F1E7}\u{1F1FC}",
1877
+ belarus: "\u{1F1E7}\u{1F1FE}",
1878
+ belize: "\u{1F1E7}\u{1F1FF}",
1879
+ canada: "\u{1F1E8}\u{1F1E6}",
1880
+ cocos_islands: "\u{1F1E8}\u{1F1E8}",
1881
+ congo_kinshasa: "\u{1F1E8}\u{1F1E9}",
1882
+ central_african_republic: "\u{1F1E8}\u{1F1EB}",
1883
+ congo_brazzaville: "\u{1F1E8}\u{1F1EC}",
1884
+ switzerland: "\u{1F1E8}\u{1F1ED}",
1885
+ cote_divoire: "\u{1F1E8}\u{1F1EE}",
1886
+ cook_islands: "\u{1F1E8}\u{1F1F0}",
1887
+ chile: "\u{1F1E8}\u{1F1F1}",
1888
+ cameroon: "\u{1F1E8}\u{1F1F2}",
1889
+ cn: "\u{1F1E8}\u{1F1F3}",
1890
+ colombia: "\u{1F1E8}\u{1F1F4}",
1891
+ clipperton_island: "\u{1F1E8}\u{1F1F5}",
1892
+ costa_rica: "\u{1F1E8}\u{1F1F7}",
1893
+ cuba: "\u{1F1E8}\u{1F1FA}",
1894
+ cape_verde: "\u{1F1E8}\u{1F1FB}",
1895
+ curacao: "\u{1F1E8}\u{1F1FC}",
1896
+ christmas_island: "\u{1F1E8}\u{1F1FD}",
1897
+ cyprus: "\u{1F1E8}\u{1F1FE}",
1898
+ czech_republic: "\u{1F1E8}\u{1F1FF}",
1899
+ de: "\u{1F1E9}\u{1F1EA}",
1900
+ diego_garcia: "\u{1F1E9}\u{1F1EC}",
1901
+ djibouti: "\u{1F1E9}\u{1F1EF}",
1902
+ denmark: "\u{1F1E9}\u{1F1F0}",
1903
+ dominica: "\u{1F1E9}\u{1F1F2}",
1904
+ dominican_republic: "\u{1F1E9}\u{1F1F4}",
1905
+ algeria: "\u{1F1E9}\u{1F1FF}",
1906
+ ceuta_melilla: "\u{1F1EA}\u{1F1E6}",
1907
+ ecuador: "\u{1F1EA}\u{1F1E8}",
1908
+ estonia: "\u{1F1EA}\u{1F1EA}",
1909
+ egypt: "\u{1F1EA}\u{1F1EC}",
1910
+ western_sahara: "\u{1F1EA}\u{1F1ED}",
1911
+ eritrea: "\u{1F1EA}\u{1F1F7}",
1912
+ es: "\u{1F1EA}\u{1F1F8}",
1913
+ ethiopia: "\u{1F1EA}\u{1F1F9}",
1914
+ eu: "\u{1F1EA}\u{1F1FA}",
1915
+ european_union: "\u{1F1EA}\u{1F1FA}",
1916
+ finland: "\u{1F1EB}\u{1F1EE}",
1917
+ fiji: "\u{1F1EB}\u{1F1EF}",
1918
+ falkland_islands: "\u{1F1EB}\u{1F1F0}",
1919
+ micronesia: "\u{1F1EB}\u{1F1F2}",
1920
+ faroe_islands: "\u{1F1EB}\u{1F1F4}",
1921
+ fr: "\u{1F1EB}\u{1F1F7}",
1922
+ gabon: "\u{1F1EC}\u{1F1E6}",
1923
+ gb: "\u{1F1EC}\u{1F1E7}",
1924
+ uk: "\u{1F1EC}\u{1F1E7}",
1925
+ grenada: "\u{1F1EC}\u{1F1E9}",
1926
+ georgia: "\u{1F1EC}\u{1F1EA}",
1927
+ french_guiana: "\u{1F1EC}\u{1F1EB}",
1928
+ guernsey: "\u{1F1EC}\u{1F1EC}",
1929
+ ghana: "\u{1F1EC}\u{1F1ED}",
1930
+ gibraltar: "\u{1F1EC}\u{1F1EE}",
1931
+ greenland: "\u{1F1EC}\u{1F1F1}",
1932
+ gambia: "\u{1F1EC}\u{1F1F2}",
1933
+ guinea: "\u{1F1EC}\u{1F1F3}",
1934
+ guadeloupe: "\u{1F1EC}\u{1F1F5}",
1935
+ equatorial_guinea: "\u{1F1EC}\u{1F1F6}",
1936
+ greece: "\u{1F1EC}\u{1F1F7}",
1937
+ south_georgia_south_sandwich_islands: "\u{1F1EC}\u{1F1F8}",
1938
+ guatemala: "\u{1F1EC}\u{1F1F9}",
1939
+ guam: "\u{1F1EC}\u{1F1FA}",
1940
+ guinea_bissau: "\u{1F1EC}\u{1F1FC}",
1941
+ guyana: "\u{1F1EC}\u{1F1FE}",
1942
+ hong_kong: "\u{1F1ED}\u{1F1F0}",
1943
+ heard_mcdonald_islands: "\u{1F1ED}\u{1F1F2}",
1944
+ honduras: "\u{1F1ED}\u{1F1F3}",
1945
+ croatia: "\u{1F1ED}\u{1F1F7}",
1946
+ haiti: "\u{1F1ED}\u{1F1F9}",
1947
+ hungary: "\u{1F1ED}\u{1F1FA}",
1948
+ canary_islands: "\u{1F1EE}\u{1F1E8}",
1949
+ indonesia: "\u{1F1EE}\u{1F1E9}",
1950
+ ireland: "\u{1F1EE}\u{1F1EA}",
1951
+ israel: "\u{1F1EE}\u{1F1F1}",
1952
+ isle_of_man: "\u{1F1EE}\u{1F1F2}",
1953
+ india: "\u{1F1EE}\u{1F1F3}",
1954
+ british_indian_ocean_territory: "\u{1F1EE}\u{1F1F4}",
1955
+ iraq: "\u{1F1EE}\u{1F1F6}",
1956
+ iran: "\u{1F1EE}\u{1F1F7}",
1957
+ iceland: "\u{1F1EE}\u{1F1F8}",
1958
+ it: "\u{1F1EE}\u{1F1F9}",
1959
+ jersey: "\u{1F1EF}\u{1F1EA}",
1960
+ jamaica: "\u{1F1EF}\u{1F1F2}",
1961
+ jordan: "\u{1F1EF}\u{1F1F4}",
1962
+ jp: "\u{1F1EF}\u{1F1F5}",
1963
+ kenya: "\u{1F1F0}\u{1F1EA}",
1964
+ kyrgyzstan: "\u{1F1F0}\u{1F1EC}",
1965
+ cambodia: "\u{1F1F0}\u{1F1ED}",
1966
+ kiribati: "\u{1F1F0}\u{1F1EE}",
1967
+ comoros: "\u{1F1F0}\u{1F1F2}",
1968
+ st_kitts_nevis: "\u{1F1F0}\u{1F1F3}",
1969
+ north_korea: "\u{1F1F0}\u{1F1F5}",
1970
+ kr: "\u{1F1F0}\u{1F1F7}",
1971
+ kuwait: "\u{1F1F0}\u{1F1FC}",
1972
+ cayman_islands: "\u{1F1F0}\u{1F1FE}",
1973
+ kazakhstan: "\u{1F1F0}\u{1F1FF}",
1974
+ laos: "\u{1F1F1}\u{1F1E6}",
1975
+ lebanon: "\u{1F1F1}\u{1F1E7}",
1976
+ st_lucia: "\u{1F1F1}\u{1F1E8}",
1977
+ liechtenstein: "\u{1F1F1}\u{1F1EE}",
1978
+ sri_lanka: "\u{1F1F1}\u{1F1F0}",
1979
+ liberia: "\u{1F1F1}\u{1F1F7}",
1980
+ lesotho: "\u{1F1F1}\u{1F1F8}",
1981
+ lithuania: "\u{1F1F1}\u{1F1F9}",
1982
+ luxembourg: "\u{1F1F1}\u{1F1FA}",
1983
+ latvia: "\u{1F1F1}\u{1F1FB}",
1984
+ libya: "\u{1F1F1}\u{1F1FE}",
1985
+ morocco: "\u{1F1F2}\u{1F1E6}",
1986
+ monaco: "\u{1F1F2}\u{1F1E8}",
1987
+ moldova: "\u{1F1F2}\u{1F1E9}",
1988
+ montenegro: "\u{1F1F2}\u{1F1EA}",
1989
+ st_martin: "\u{1F1F2}\u{1F1EB}",
1990
+ madagascar: "\u{1F1F2}\u{1F1EC}",
1991
+ marshall_islands: "\u{1F1F2}\u{1F1ED}",
1992
+ macedonia: "\u{1F1F2}\u{1F1F0}",
1993
+ mali: "\u{1F1F2}\u{1F1F1}",
1994
+ myanmar: "\u{1F1F2}\u{1F1F2}",
1995
+ mongolia: "\u{1F1F2}\u{1F1F3}",
1996
+ macau: "\u{1F1F2}\u{1F1F4}",
1997
+ northern_mariana_islands: "\u{1F1F2}\u{1F1F5}",
1998
+ martinique: "\u{1F1F2}\u{1F1F6}",
1999
+ mauritania: "\u{1F1F2}\u{1F1F7}",
2000
+ montserrat: "\u{1F1F2}\u{1F1F8}",
2001
+ malta: "\u{1F1F2}\u{1F1F9}",
2002
+ mauritius: "\u{1F1F2}\u{1F1FA}",
2003
+ maldives: "\u{1F1F2}\u{1F1FB}",
2004
+ malawi: "\u{1F1F2}\u{1F1FC}",
2005
+ mexico: "\u{1F1F2}\u{1F1FD}",
2006
+ malaysia: "\u{1F1F2}\u{1F1FE}",
2007
+ mozambique: "\u{1F1F2}\u{1F1FF}",
2008
+ namibia: "\u{1F1F3}\u{1F1E6}",
2009
+ new_caledonia: "\u{1F1F3}\u{1F1E8}",
2010
+ niger: "\u{1F1F3}\u{1F1EA}",
2011
+ norfolk_island: "\u{1F1F3}\u{1F1EB}",
2012
+ nigeria: "\u{1F1F3}\u{1F1EC}",
2013
+ nicaragua: "\u{1F1F3}\u{1F1EE}",
2014
+ netherlands: "\u{1F1F3}\u{1F1F1}",
2015
+ norway: "\u{1F1F3}\u{1F1F4}",
2016
+ nepal: "\u{1F1F3}\u{1F1F5}",
2017
+ nauru: "\u{1F1F3}\u{1F1F7}",
2018
+ niue: "\u{1F1F3}\u{1F1FA}",
2019
+ new_zealand: "\u{1F1F3}\u{1F1FF}",
2020
+ oman: "\u{1F1F4}\u{1F1F2}",
2021
+ panama: "\u{1F1F5}\u{1F1E6}",
2022
+ peru: "\u{1F1F5}\u{1F1EA}",
2023
+ french_polynesia: "\u{1F1F5}\u{1F1EB}",
2024
+ papua_new_guinea: "\u{1F1F5}\u{1F1EC}",
2025
+ philippines: "\u{1F1F5}\u{1F1ED}",
2026
+ pakistan: "\u{1F1F5}\u{1F1F0}",
2027
+ poland: "\u{1F1F5}\u{1F1F1}",
2028
+ st_pierre_miquelon: "\u{1F1F5}\u{1F1F2}",
2029
+ pitcairn_islands: "\u{1F1F5}\u{1F1F3}",
2030
+ puerto_rico: "\u{1F1F5}\u{1F1F7}",
2031
+ palestinian_territories: "\u{1F1F5}\u{1F1F8}",
2032
+ portugal: "\u{1F1F5}\u{1F1F9}",
2033
+ palau: "\u{1F1F5}\u{1F1FC}",
2034
+ paraguay: "\u{1F1F5}\u{1F1FE}",
2035
+ qatar: "\u{1F1F6}\u{1F1E6}",
2036
+ reunion: "\u{1F1F7}\u{1F1EA}",
2037
+ romania: "\u{1F1F7}\u{1F1F4}",
2038
+ serbia: "\u{1F1F7}\u{1F1F8}",
2039
+ ru: "\u{1F1F7}\u{1F1FA}",
2040
+ rwanda: "\u{1F1F7}\u{1F1FC}",
2041
+ saudi_arabia: "\u{1F1F8}\u{1F1E6}",
2042
+ solomon_islands: "\u{1F1F8}\u{1F1E7}",
2043
+ seychelles: "\u{1F1F8}\u{1F1E8}",
2044
+ sudan: "\u{1F1F8}\u{1F1E9}",
2045
+ sweden: "\u{1F1F8}\u{1F1EA}",
2046
+ singapore: "\u{1F1F8}\u{1F1EC}",
2047
+ st_helena: "\u{1F1F8}\u{1F1ED}",
2048
+ slovenia: "\u{1F1F8}\u{1F1EE}",
2049
+ svalbard_jan_mayen: "\u{1F1F8}\u{1F1EF}",
2050
+ slovakia: "\u{1F1F8}\u{1F1F0}",
2051
+ sierra_leone: "\u{1F1F8}\u{1F1F1}",
2052
+ san_marino: "\u{1F1F8}\u{1F1F2}",
2053
+ senegal: "\u{1F1F8}\u{1F1F3}",
2054
+ somalia: "\u{1F1F8}\u{1F1F4}",
2055
+ suriname: "\u{1F1F8}\u{1F1F7}",
2056
+ south_sudan: "\u{1F1F8}\u{1F1F8}",
2057
+ sao_tome_principe: "\u{1F1F8}\u{1F1F9}",
2058
+ el_salvador: "\u{1F1F8}\u{1F1FB}",
2059
+ sint_maarten: "\u{1F1F8}\u{1F1FD}",
2060
+ syria: "\u{1F1F8}\u{1F1FE}",
2061
+ swaziland: "\u{1F1F8}\u{1F1FF}",
2062
+ tristan_da_cunha: "\u{1F1F9}\u{1F1E6}",
2063
+ turks_caicos_islands: "\u{1F1F9}\u{1F1E8}",
2064
+ chad: "\u{1F1F9}\u{1F1E9}",
2065
+ french_southern_territories: "\u{1F1F9}\u{1F1EB}",
2066
+ togo: "\u{1F1F9}\u{1F1EC}",
2067
+ thailand: "\u{1F1F9}\u{1F1ED}",
2068
+ tajikistan: "\u{1F1F9}\u{1F1EF}",
2069
+ tokelau: "\u{1F1F9}\u{1F1F0}",
2070
+ timor_leste: "\u{1F1F9}\u{1F1F1}",
2071
+ turkmenistan: "\u{1F1F9}\u{1F1F2}",
2072
+ tunisia: "\u{1F1F9}\u{1F1F3}",
2073
+ tonga: "\u{1F1F9}\u{1F1F4}",
2074
+ tr: "\u{1F1F9}\u{1F1F7}",
2075
+ trinidad_tobago: "\u{1F1F9}\u{1F1F9}",
2076
+ tuvalu: "\u{1F1F9}\u{1F1FB}",
2077
+ taiwan: "\u{1F1F9}\u{1F1FC}",
2078
+ tanzania: "\u{1F1F9}\u{1F1FF}",
2079
+ ukraine: "\u{1F1FA}\u{1F1E6}",
2080
+ uganda: "\u{1F1FA}\u{1F1EC}",
2081
+ us_outlying_islands: "\u{1F1FA}\u{1F1F2}",
2082
+ united_nations: "\u{1F1FA}\u{1F1F3}",
2083
+ us: "\u{1F1FA}\u{1F1F8}",
2084
+ uruguay: "\u{1F1FA}\u{1F1FE}",
2085
+ uzbekistan: "\u{1F1FA}\u{1F1FF}",
2086
+ vatican_city: "\u{1F1FB}\u{1F1E6}",
2087
+ st_vincent_grenadines: "\u{1F1FB}\u{1F1E8}",
2088
+ venezuela: "\u{1F1FB}\u{1F1EA}",
2089
+ british_virgin_islands: "\u{1F1FB}\u{1F1EC}",
2090
+ us_virgin_islands: "\u{1F1FB}\u{1F1EE}",
2091
+ vietnam: "\u{1F1FB}\u{1F1F3}",
2092
+ vanuatu: "\u{1F1FB}\u{1F1FA}",
2093
+ wallis_futuna: "\u{1F1FC}\u{1F1EB}",
2094
+ samoa: "\u{1F1FC}\u{1F1F8}",
2095
+ kosovo: "\u{1F1FD}\u{1F1F0}",
2096
+ yemen: "\u{1F1FE}\u{1F1EA}",
2097
+ mayotte: "\u{1F1FE}\u{1F1F9}",
2098
+ south_africa: "\u{1F1FF}\u{1F1E6}",
2099
+ zambia: "\u{1F1FF}\u{1F1F2}",
2100
+ zimbabwe: "\u{1F1FF}\u{1F1FC}",
2101
+ england: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}\u{E007F}",
2102
+ scotland: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0073}\u{E0063}\u{E0074}\u{E007F}",
2103
+ wales: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0077}\u{E006C}\u{E0073}\u{E007F}"
2104
+ };
2105
+
2106
+ // src/server/emojify.ts
2107
+ function emojify(text) {
2108
+ return text.replace(/:([a-zA-Z0-9_+-]+):/g, (match, name) => {
2109
+ return nameToEmoji[name] ?? match;
2110
+ });
2111
+ }
2112
+
2113
+ // src/server/webhook.ts
2114
+ function verifySlackSignature(signingSecret, signature, timestamp, rawBody) {
2115
+ const fiveMinutesAgo = Math.floor(Date.now() / 1e3) - 300;
2116
+ if (parseInt(timestamp, 10) < fiveMinutesAgo) {
2117
+ return false;
2118
+ }
2119
+ const sigBasestring = `v0:${timestamp}:${rawBody}`;
2120
+ const hmac = crypto.createHmac("sha256", signingSecret);
2121
+ hmac.update(sigBasestring);
2122
+ const expectedSignature = `v0=${hmac.digest("hex")}`;
2123
+ try {
2124
+ return crypto.timingSafeEqual(
2125
+ Buffer.from(signature),
2126
+ Buffer.from(expectedSignature)
2127
+ );
2128
+ } catch {
2129
+ return false;
2130
+ }
2131
+ }
2132
+ function createWebhookHandler(options) {
2133
+ const { store, signingSecret } = options;
2134
+ return async (request) => {
2135
+ let rawBody;
2136
+ try {
2137
+ rawBody = await request.text();
2138
+ } catch {
2139
+ return jsonResponse2({ error: "Failed to read request body" }, 400);
2140
+ }
2141
+ const signature = request.headers.get("x-slack-signature") ?? "";
2142
+ const timestamp = request.headers.get("x-slack-request-timestamp") ?? "";
2143
+ if (!signature || !timestamp) {
2144
+ return jsonResponse2({ error: "Missing Slack signature headers" }, 401);
2145
+ }
2146
+ if (!verifySlackSignature(signingSecret, signature, timestamp, rawBody)) {
2147
+ return jsonResponse2({ error: "Invalid signature" }, 401);
2148
+ }
2149
+ let payload;
2150
+ try {
2151
+ payload = JSON.parse(rawBody);
2152
+ } catch {
2153
+ return jsonResponse2({ error: "Invalid JSON body" }, 400);
2154
+ }
2155
+ if (payload.type === "url_verification" && payload.challenge) {
2156
+ return new Response(JSON.stringify({ challenge: payload.challenge }), {
2157
+ status: 200,
2158
+ headers: { "Content-Type": "application/json" }
2159
+ });
2160
+ }
2161
+ if (payload.type === "event_callback" && payload.event) {
2162
+ const event = payload.event;
2163
+ if (event.type !== "message") {
2164
+ return jsonResponse2({ ok: true }, 200);
2165
+ }
2166
+ if (event.bot_id || event.subtype === "bot_message") {
2167
+ return jsonResponse2({ ok: true }, 200);
2168
+ }
2169
+ if (!event.thread_ts || event.ts === event.thread_ts) {
2170
+ return jsonResponse2({ ok: true }, 200);
2171
+ }
2172
+ const threadRecord = await store.getThreadByTs(event.thread_ts);
2173
+ if (!threadRecord) {
2174
+ return jsonResponse2({ ok: true }, 200);
2175
+ }
2176
+ const reply = {
2177
+ id: event.ts ?? crypto.randomUUID(),
2178
+ text: emojify(event.text ?? ""),
2179
+ sender: event.user_profile?.display_name ?? event.user_profile?.real_name ?? event.user ?? "Team",
2180
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
2181
+ threadTs: event.thread_ts
2182
+ };
2183
+ await store.saveReply(threadRecord.sessionId, reply);
2184
+ return jsonResponse2({ ok: true }, 200);
2185
+ }
2186
+ return jsonResponse2({ ok: true }, 200);
2187
+ };
2188
+ }
2189
+ function createExpressWebhookHandler(options) {
2190
+ const { store, signingSecret } = options;
2191
+ return async (req, res) => {
2192
+ const rawBody = typeof req.body === "string" ? req.body : Buffer.isBuffer(req.body) ? req.body.toString("utf-8") : JSON.stringify(req.body);
2193
+ const signature = req.headers?.["x-slack-signature"] ?? "";
2194
+ const timestamp = req.headers?.["x-slack-request-timestamp"] ?? "";
2195
+ if (!signature || !timestamp) {
2196
+ res.status(401).json({ error: "Missing Slack signature headers" });
2197
+ return;
2198
+ }
2199
+ if (!verifySlackSignature(signingSecret, signature, timestamp, rawBody)) {
2200
+ res.status(401).json({ error: "Invalid signature" });
2201
+ return;
2202
+ }
2203
+ let payload;
2204
+ try {
2205
+ payload = typeof req.body === "string" ? JSON.parse(req.body) : Buffer.isBuffer(req.body) ? JSON.parse(req.body.toString("utf-8")) : req.body;
2206
+ } catch {
2207
+ res.status(400).json({ error: "Invalid JSON body" });
2208
+ return;
2209
+ }
2210
+ if (payload.type === "url_verification" && payload.challenge) {
2211
+ res.status(200).json({ challenge: payload.challenge });
2212
+ return;
2213
+ }
2214
+ if (payload.type === "event_callback" && payload.event) {
2215
+ const event = payload.event;
2216
+ if (event.type !== "message") {
2217
+ res.status(200).json({ ok: true });
2218
+ return;
2219
+ }
2220
+ if (event.bot_id || event.subtype === "bot_message") {
2221
+ res.status(200).json({ ok: true });
2222
+ return;
2223
+ }
2224
+ if (!event.thread_ts || event.ts === event.thread_ts) {
2225
+ res.status(200).json({ ok: true });
2226
+ return;
2227
+ }
2228
+ const threadRecord = await store.getThreadByTs(event.thread_ts);
2229
+ if (!threadRecord) {
2230
+ res.status(200).json({ ok: true });
2231
+ return;
2232
+ }
2233
+ const reply = {
2234
+ id: event.ts ?? crypto.randomUUID(),
2235
+ text: emojify(event.text ?? ""),
2236
+ sender: event.user_profile?.display_name ?? event.user_profile?.real_name ?? event.user ?? "Team",
2237
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
2238
+ threadTs: event.thread_ts
2239
+ };
2240
+ await store.saveReply(threadRecord.sessionId, reply);
2241
+ res.status(200).json({ ok: true });
2242
+ return;
2243
+ }
2244
+ res.status(200).json({ ok: true });
2245
+ };
2246
+ }
2247
+ function jsonResponse2(data, status = 200) {
2248
+ return new Response(JSON.stringify(data), {
2249
+ status,
2250
+ headers: { "Content-Type": "application/json" }
2251
+ });
2252
+ }
2253
+
2254
+ // src/server/replies.ts
2255
+ function createRepliesHandler(options) {
2256
+ const { store } = options;
2257
+ return async (request) => {
2258
+ const url = new URL(request.url);
2259
+ const sessionId = url.searchParams.get("sessionId");
2260
+ const since = url.searchParams.get("since");
2261
+ if (!sessionId) {
2262
+ return jsonResponse3(
2263
+ { error: "Missing required query parameter: sessionId" },
2264
+ 400
2265
+ );
2266
+ }
2267
+ const replies = await store.getReplies(
2268
+ sessionId,
2269
+ since ?? void 0
2270
+ );
2271
+ const response = {
2272
+ replies,
2273
+ lastChecked: (/* @__PURE__ */ new Date()).toISOString()
2274
+ };
2275
+ return jsonResponse3(response, 200);
2276
+ };
2277
+ }
2278
+ function createExpressRepliesHandler(options) {
2279
+ const { store } = options;
2280
+ return async (req, res) => {
2281
+ const sessionId = req.query?.sessionId;
2282
+ const since = req.query?.since;
2283
+ if (!sessionId || typeof sessionId !== "string") {
2284
+ res.status(400).json({ error: "Missing required query parameter: sessionId" });
2285
+ return;
2286
+ }
2287
+ const sinceStr = typeof since === "string" ? since : void 0;
2288
+ const replies = await store.getReplies(sessionId, sinceStr);
2289
+ const response = {
2290
+ replies,
2291
+ lastChecked: (/* @__PURE__ */ new Date()).toISOString()
2292
+ };
2293
+ res.status(200).json(response);
2294
+ };
2295
+ }
2296
+ function jsonResponse3(data, status = 200) {
2297
+ return new Response(JSON.stringify(data), {
2298
+ status,
2299
+ headers: { "Content-Type": "application/json" }
2300
+ });
2301
+ }
2302
+
2303
+ export { InMemoryStore, createExpressHandler, createExpressRepliesHandler, createExpressWebhookHandler, createRepliesHandler, createSupportHandler, createWebhookHandler, emojify, validateSlackToken, verifySlackSignature };
148
2304
  //# sourceMappingURL=index.js.map
149
2305
  //# sourceMappingURL=index.js.map