Repository: VictoriaMetrics/VictoriaMetrics
Pull request #6292 (2024-05-16 16:06:25)

vmui/logs: add markdown support
### Describe Your Changes

Add support for markdown format and emoji for the `_msg` field in the "Group" view.
Add markdown rendering toggle. Disabled by default. Value is stored in `localStorage`.

<table>
  <tr>
    <td>before</td>
    <td>
      <img src="https://github.com/VictoriaMetrics/VictoriaMetrics/assets/29711459/c65570cb-8a10-4c5f-ac08-1e0c19e6d703">
    </td>
  </tr>
  <tr>
    <td>after</td>
    <td>
      <img src="https://github.com/VictoriaMetrics/VictoriaMetrics/assets/29711459/668b1236-554f-4e9d-be33-713c14c9aec7">
    </td>
  </tr>
</table>



### Checklist

The following checks are **mandatory**:

- [ ] My change adheres [VictoriaMetrics contributing guidelines](https://docs.victoriametrics.com/contributing/).


zekker6: Do I understand it correctly that current implementation enables markdown rendering by default and there is no way to disable it?
I'm afraid that there will definetly be use-cases when this will render markdown at places where it was just using `*`, `_` or other special characters in markdown, so it would be great to have a toggle to disable this.
Loori-R: @zekker6, good idea, I'll add a switch.
Should we disable it by default?
zekker6: > @zekker6, good idea, I'll add a switch. Should we disable it by default?

From my experience, it's better to disable this by default as most logs do not contain markdown at all.

It would be great if we could enable this by default for the play environment thought (or have some kind of automatic detection logic in place).
hagen1778: @Loori-R could you please resolve conflicts in this PR?

Patch:
diff --git a/app/vmauth/main.go b/app/vmauth/main.go
index 87659350d..9611b19a5 100644
--- a/app/vmauth/main.go
+++ b/app/vmauth/main.go
@@ -37,6 +37,8 @@ var (
 		"With enabled proxy protocol http server cannot serve regular /metrics endpoint. Use -pushmetrics.url for metrics pushing")
 	maxIdleConnsPerBackend = flag.Int("maxIdleConnsPerBackend", 100, "The maximum number of idle connections vmauth can open per each backend host. "+
 		"See also -maxConcurrentRequests")
+	idleConnTimeout = flag.Duration("idleConnTimeout", 50*time.Second, `Defines a duration for idle (keep-alive connections) to exist.
+    Consider setting this value less than "-http.idleConnTimeout". It must prevent possible "write: broken pipe" and "read: connection reset by peer" errors.`)
 	responseTimeout       = flag.Duration("responseTimeout", 5*time.Minute, "The timeout for receiving a response from backend")
 	maxConcurrentRequests = flag.Int("maxConcurrentRequests", 1000, "The maximum number of concurrent requests vmauth can process. Other requests are rejected with "+
 		"'429 Too Many Requests' http status code. See also -maxConcurrentPerUserRequests and -maxIdleConnsPerBackend command-line options")
@@ -199,10 +201,8 @@ func processRequest(w http.ResponseWriter, r *http.Request, ui *UserInfo) {
 		isDefault = true
 	}
 	maxAttempts := up.getBackendsCount()
-	if maxAttempts > 1 {
-		r.Body = &readTrackingBody{
-			r: r.Body,
-		}
+	r.Body = &readTrackingBody{
+		r: r.Body,
 	}
 	for i := 0; i < maxAttempts; i++ {
 		bu := up.getBackendURL()
@@ -243,8 +243,10 @@ func tryProcessingRequest(w http.ResponseWriter, r *http.Request, targetURL *url
 		req.Host = targetURL.Host
 	}
 	updateHeadersByConfig(req.Header, hc.RequestHeaders)
-	res, err := ui.rt.RoundTrip(req)
+	var trivialRetries int
 	rtb, rtbOK := req.Body.(*readTrackingBody)
+again:
+	res, err := ui.rt.RoundTrip(req)
 	if err != nil {
 		if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) {
 			// Do not retry canceled or timed out requests
@@ -267,6 +269,12 @@ func tryProcessingRequest(w http.ResponseWriter, r *http.Request, targetURL *url
 			ui.backendErrors.Inc()
 			return true
 		}
+		// one time retry trivial network errors, such as proxy idle timeout misconfiguration
+		// or socket close by OS
+		if (netutil.IsTrivialNetworkError(err) || errors.Is(err, io.EOF)) && trivialRetries < 1 {
+			trivialRetries++
+			goto again
+		}
 		// Retry the request if its body wasn't read yet. This usually means that the backend isn't reachable.
 		remoteAddr := httpserver.GetQuotedRemoteAddr(r)
 		// NOTE: do not use httpserver.GetRequestURI
@@ -434,6 +442,7 @@ func newRoundTripper(caFileOpt, certFileOpt, keyFileOpt, serverNameOpt string, i
 	tr.ResponseHeaderTimeout = *responseTimeout
 	// Automatic compression must be disabled in order to fix https://github.com/VictoriaMetrics/VictoriaMetrics/issues/535
 	tr.DisableCompression = true
+	tr.IdleConnTimeout = *idleConnTimeout
 	tr.MaxIdleConnsPerHost = *maxIdleConnsPerBackend
 	if tr.MaxIdleConns != 0 && tr.MaxIdleConns < tr.MaxIdleConnsPerHost {
 		tr.MaxIdleConns = tr.MaxIdleConnsPerHost
diff --git a/app/vmctl/flags.go b/app/vmctl/flags.go
index a9987fcb1..e5ae52e54 100644
--- a/app/vmctl/flags.go
+++ b/app/vmctl/flags.go
@@ -45,7 +45,6 @@ const (
 	vmBatchSize          = "vm-batch-size"
 	vmSignificantFigures = "vm-significant-figures"
 	vmRoundDigits        = "vm-round-digits"
-	vmDisableProgressBar = "vm-disable-progress-bar"
 	vmCertFile           = "vm-cert-file"
 	vmKeyFile            = "vm-key-file"
 	vmCAFile             = "vm-CA-file"
@@ -126,10 +125,6 @@ var (
 			Usage: "Optional data transfer rate limit in bytes per second.\n" +
 				"By default, the rate limit is disabled. It can be useful for limiting load on configured via '--vmAddr' destination.",
 		},
-		&cli.BoolFlag{
-			Name:  vmDisableProgressBar,
-			Usage: "Whether to disable progress bar per each worker during the import. This flag is deprecated. Use global flag instead.",
-		},
 		&cli.StringFlag{
 			Name:  vmCertFile,
 			Usage: "Optional path to client-side TLS certificate file to use when connecting to '--vmAddr'",
diff --git a/app/vmui/packages/vmui/package-lock.json b/app/vmui/packages/vmui/package-lock.json
index 7499f667d..d895e367a 100644
--- a/app/vmui/packages/vmui/package-lock.json
+++ b/app/vmui/packages/vmui/package-lock.json
@@ -11,7 +11,6 @@
         "@types/lodash.debounce": "^4.0.6",
         "@types/lodash.get": "^4.4.6",
         "@types/lodash.throttle": "^4.1.6",
-        "@types/marked": "^5.0.0",
         "@types/node": "^20.4.0",
         "@types/qs": "^6.9.7",
         "@types/react-input-mask": "^3.0.2",
@@ -22,7 +21,8 @@
         "lodash.debounce": "^4.0.8",
         "lodash.get": "^4.4.2",
         "lodash.throttle": "^4.1.1",
-        "marked": "^5.1.0",
+        "marked": "^12.0.2",
+        "marked-emoji": "^1.4.0",
         "preact": "^10.7.1",
         "qs": "^6.10.3",
         "react-input-mask": "^2.0.4",
@@ -4272,11 +4272,6 @@
         "@types/lodash": "*"
       }
     },
-    "node_modules/@types/marked": {
-      "version": "5.0.2",
-      "resolved": "https://registry.npmjs.org/@types/marked/-/marked-5.0.2.tgz",
-      "integrity": "sha512-OucS4KMHhFzhz27KxmWg7J+kIYqyqoW5kdIEI319hqARQQUTqhao3M/F+uFnDXD0Rg72iDDZxZNxq5gvctmLlg=="
-    },
     "node_modules/@types/mime": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
@@ -13598,14 +13593,22 @@
       }
     },
     "node_modules/marked": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.2.tgz",
-      "integrity": "sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==",
+      "version": "12.0.2",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz",
+      "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==",
       "bin": {
         "marked": "bin/marked.js"
       },
       "engines": {
-        "node": ">= 16"
+        "node": ">= 18"
+      }
+    },
+    "node_modules/marked-emoji": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/marked-emoji/-/marked-emoji-1.4.0.tgz",
+      "integrity": "sha512-/2TJfGzXpiBBq+X3akHHbTrAjZPJDwR+7FV6SyQLECnQEfaoVkrpKZJzHhPTAq3Sl/A1l2frMT0u6b38VBBlNg==",
+      "peerDependencies": {
+        "marked": ">=4 <13"
       }
     },
     "node_modules/mdn-data": {
diff --git a/app/vmui/packages/vmui/package.json b/app/vmui/packages/vmui/package.json
index 6682b1052..5af4c67b6 100644
--- a/app/vmui/packages/vmui/package.json
+++ b/app/vmui/packages/vmui/package.json
@@ -7,7 +7,6 @@
     "@types/lodash.debounce": "^4.0.6",
     "@types/lodash.get": "^4.4.6",
     "@types/lodash.throttle": "^4.1.6",
-    "@types/marked": "^5.0.0",
     "@types/node": "^20.4.0",
     "@types/qs": "^6.9.7",
     "@types/react-input-mask": "^3.0.2",
@@ -18,7 +17,8 @@
     "lodash.debounce": "^4.0.8",
     "lodash.get": "^4.4.2",
     "lodash.throttle": "^4.1.1",
-    "marked": "^5.1.0",
+    "marked": "^12.0.2",
+    "marked-emoji": "^1.4.0",
     "preact": "^10.7.1",
     "qs": "^6.10.3",
     "react-input-mask": "^2.0.4",
diff --git a/app/vmui/packages/vmui/src/AppLogs.tsx b/app/vmui/packages/vmui/src/AppLogs.tsx
index 698abf94e..d041679e0 100644
--- a/app/vmui/packages/vmui/src/AppLogs.tsx
+++ b/app/vmui/packages/vmui/src/AppLogs.tsx
@@ -4,6 +4,7 @@ import AppContextProvider from "./contexts/AppContextProvider";
 import ThemeProvider from "./components/Main/ThemeProvider/ThemeProvider";
 import ExploreLogs from "./pages/ExploreLogs/ExploreLogs";
 import LogsLayout from "./layouts/LogsLayout/LogsLayout";
+import "./constants/markedPlugins";
 
 const AppLogs: FC = () => {
   const [loadedTheme, setLoadedTheme] = useState(false);
diff --git a/app/vmui/packages/vmui/src/constants/emojis.ts b/app/vmui/packages/vmui/src/constants/emojis.ts
new file mode 100644
index 000000000..9f189d734
--- /dev/null
+++ b/app/vmui/packages/vmui/src/constants/emojis.ts
@@ -0,0 +1,1915 @@
+export default {
+  "100": "💯",
+  "1234": "🔢",
+  "grinning": "😀",
+  "smiley": "😃",
+  "smile": "😄",
+  "grin": "😁",
+  "laughing": "😆",
+  "satisfied": "😆",
+  "sweat_smile": "😅",
+  "rofl": "🤣",
+  "joy": "😂",
+  "slightly_smiling_face": "🙂",
+  "upside_down_face": "🙃",
+  "melting_face": "🫠",
+  "wink": "😉",
+  "blush": "😊",
+  "innocent": "😇",
+  "smiling_face_with_three_hearts": "🥰",
+  "heart_eyes": "😍",
+  "star_struck": "🤩",
+  "kissing_heart": "😘",
+  "kissing": "😗",
+  "relaxed": "☺️",
+  "kissing_closed_eyes": "😚",
+  "kissing_smiling_eyes": "😙",
+  "smiling_face_with_tear": "🥲",
+  "yum": "😋",
+  "stuck_out_tongue": "😛",
+  "stuck_out_tongue_winking_eye": "😜",
+  "zany_face": "🤪",
+  "stuck_out_tongue_closed_eyes": "😝",
+  "money_mouth_face": "🤑",
+  "hugs": "🤗",
+  "hand_over_mouth": "🤭",
+  "face_with_open_eyes_and_hand_over_mouth": "🫢",
+  "face_with_peeking_eye": "🫣",
+  "shushing_face": "🤫",
+  "thinking": "🤔",
+  "saluting_face": "🫡",
+  "zipper_mouth_face": "🤐",
+  "raised_eyebrow": "🤨",
+  "neutral_face": "😐",
+  "expressionless": "😑",
+  "no_mouth": "😶",
+  "dotted_line_face": "🫥",
+  "face_in_clouds": "😶‍🌫️",
+  "smirk": "😏",
+  "unamused": "😒",
+  "roll_eyes": "🙄",
+  "grimacing": "😬",
+  "face_exhaling": "😮‍💨",
+  "lying_face": "🤥",
+  "shaking_face": "🫨",
+  "relieved": "😌",
+  "pensive": "😔",
+  "sleepy": "😪",
+  "drooling_face": "🤤",
+  "sleeping": "😴",
+  "mask": "😷",
+  "face_with_thermometer": "🤒",
+  "face_with_head_bandage": "🤕",
+  "nauseated_face": "🤢",
+  "vomiting_face": "🤮",
+  "sneezing_face": "🤧",
+  "hot_face": "🥵",
+  "cold_face": "🥶",
+  "woozy_face": "🥴",
+  "dizzy_face": "😵",
+  "face_with_spiral_eyes": "😵‍💫",
+  "exploding_head": "🤯",
+  "cowboy_hat_face": "🤠",
+  "partying_face": "🥳",
+  "disguised_face": "🥸",
+  "sunglasses": "😎",
+  "nerd_face": "🤓",
+  "monocle_face": "🧐",
+  "confused": "😕",
+  "face_with_diagonal_mouth": "🫤",
+  "worried": "😟",
+  "slightly_frowning_face": "🙁",
+  "frowning_face": "☹️",
+  "open_mouth": "😮",
+  "hushed": "😯",
+  "astonished": "😲",
+  "flushed": "😳",
+  "pleading_face": "🥺",
+  "face_holding_back_tears": "🥹",
+  "frowning": "😦",
+  "anguished": "😧",
+  "fearful": "😨",
+  "cold_sweat": "😰",
+  "disappointed_relieved": "😥",
+  "cry": "😢",
+  "sob": "😭",
+  "scream": "😱",
+  "confounded": "😖",
+  "persevere": "😣",
+  "disappointed": "😞",
+  "sweat": "😓",
+  "weary": "😩",
+  "tired_face": "😫",
+  "yawning_face": "🥱",
+  "triumph": "😤",
+  "rage": "😡",
+  "pout": "😡",
+  "angry": "😠",
+  "cursing_face": "🤬",
+  "smiling_imp": "😈",
+  "imp": "👿",
+  "skull": "💀",
+  "skull_and_crossbones": "☠️",
+  "hankey": "💩",
+  "poop": "💩",
+  "shit": "💩",
+  "clown_face": "🤡",
+  "japanese_ogre": "👹",
+  "japanese_goblin": "👺",
+  "ghost": "👻",
+  "alien": "👽",
+  "space_invader": "👾",
+  "robot": "🤖",
+  "smiley_cat": "😺",
+  "smile_cat": "😸",
+  "joy_cat": "😹",
+  "heart_eyes_cat": "😻",
+  "smirk_cat": "😼",
+  "kissing_cat": "😽",
+  "scream_cat": "🙀",
+  "crying_cat_face": "😿",
+  "pouting_cat": "😾",
+  "see_no_evil": "🙈",
+  "hear_no_evil": "🙉",
+  "speak_no_evil": "🙊",
+  "love_letter": "💌",
+  "cupid": "💘",
+  "gift_heart": "💝",
+  "sparkling_heart": "💖",
+  "heartpulse": "💗",
+  "heartbeat": "💓",
+  "revolving_hearts": "💞",
+  "two_hearts": "💕",
+  "heart_decoration": "💟",
+  "heavy_heart_exclamation": "❣️",
+  "broken_heart": "💔",
+  "heart_on_fire": "❤️‍🔥",
+  "mending_heart": "❤️‍🩹",
+  "heart": "❤️",
+  "pink_heart": "🩷",
+  "orange_heart": "🧡",
+  "yellow_heart": "💛",
+  "green_heart": "💚",
+  "blue_heart": "💙",
+  "light_blue_heart": "🩵",
+  "purple_heart": "💜",
+  "brown_heart": "🤎",
+  "black_heart": "🖤",
+  "grey_heart": "🩶",
+  "white_heart": "🤍",
+  "kiss": "💋",
+  "anger": "💢",
+  "boom": "💥",
+  "collision": "💥",
+  "dizzy": "💫",
+  "sweat_drops": "💦",
+  "dash": "💨",
+  "hole": "🕳️",
+  "speech_balloon": "💬",
+  "eye_speech_bubble": "👁️‍🗨️",
+  "left_speech_bubble": "🗨️",
+  "right_anger_bubble": "🗯️",
+  "thought_balloon": "💭",
+  "zzz": "💤",
+  "wave": "👋",
+  "raised_back_of_hand": "🤚",
+  "raised_hand_with_fingers_splayed": "🖐️",
+  "hand": "✋",
+  "raised_hand": "✋",
+  "vulcan_salute": "🖖",
+  "rightwards_hand": "🫱",
+  "leftwards_hand": "🫲",
+  "palm_down_hand": "🫳",
+  "palm_up_hand": "🫴",
+  "leftwards_pushing_hand": "🫷",
+  "rightwards_pushing_hand": "🫸",
+  "ok_hand": "👌",
+  "pinched_fingers": "🤌",
+  "pinching_hand": "🤏",
+  "v": "✌️",
+  "crossed_fingers": "🤞",
+  "hand_with_index_finger_and_thumb_crossed": "🫰",
+  "love_you_gesture": "🤟",
+  "metal": "🤘",
+  "call_me_hand": "🤙",
+  "point_left": "👈",
+  "point_right": "👉",
+  "point_up_2": "👆",
+  "middle_finger": "🖕",
+  "fu": "🖕",
+  "point_down": "👇",
+  "point_up": "☝️",
+  "index_pointing_at_the_viewer": "🫵",
+  "+1": "👍",
+  "thumbsup": "👍",
+  "-1": "👎",
+  "thumbsdown": "👎",
+  "fist_raised": "✊",
+  "fist": "✊",
+  "fist_oncoming": "👊",
+  "facepunch": "👊",
+  "punch": "👊",
+  "fist_left": "🤛",
+  "fist_right": "🤜",
+  "clap": "👏",
+  "raised_hands": "🙌",
+  "heart_hands": "🫶",
+  "open_hands": "👐",
+  "palms_up_together": "🤲",
+  "handshake": "🤝",
+  "pray": "🙏",
+  "writing_hand": "✍️",
+  "nail_care": "💅",
+  "selfie": "🤳",
+  "muscle": "💪",
+  "mechanical_arm": "🦾",
+  "mechanical_leg": "🦿",
+  "leg": "🦵",
+  "foot": "🦶",
+  "ear": "👂",
+  "ear_with_hearing_aid": "🦻",
+  "nose": "👃",
+  "brain": "🧠",
+  "anatomical_heart": "🫀",
+  "lungs": "🫁",
+  "tooth": "🦷",
+  "bone": "🦴",
+  "eyes": "👀",
+  "eye": "👁️",
+  "tongue": "👅",
+  "lips": "👄",
+  "biting_lip": "🫦",
+  "baby": "👶",
+  "child": "🧒",
+  "boy": "👦",
+  "girl": "👧",
+  "adult": "🧑",
+  "blond_haired_person": "👱",
+  "man": "👨",
+  "bearded_person": "🧔",
+  "man_beard": "🧔‍♂️",
+  "woman_beard": "🧔‍♀️",
+  "red_haired_man": "👨‍🦰",
+  "curly_haired_man": "👨‍🦱",
+  "white_haired_man": "👨‍🦳",
+  "bald_man": "👨‍🦲",
+  "woman": "👩",
+  "red_haired_woman": "👩‍🦰",
+  "person_red_hair": "🧑‍🦰",
+  "curly_haired_woman": "👩‍🦱",
+  "person_curly_hair": "🧑‍🦱",
+  "white_haired_woman": "👩‍🦳",
+  "person_white_hair": "🧑‍🦳",
+  "bald_woman": "👩‍🦲",
+  "person_bald": "🧑‍🦲",
+  "blond_haired_woman": "👱‍♀️",
+  "blonde_woman": "👱‍♀️",
+  "blond_haired_man": "👱‍♂️",
+  "older_adult": "🧓",
+  "older_man": "👴",
+  "older_woman": "👵",
+  "frowning_person": "🙍",
+  "frowning_man": "🙍‍♂️",
+  "frowning_woman": "🙍‍♀️",
+  "pouting_face": "🙎",
+  "pouting_man": "🙎‍♂️",
+  "pouting_woman": "🙎‍♀️",
+  "no_good": "🙅",
+  "no_good_man": "🙅‍♂️",
+  "ng_man": "🙅‍♂️",
+  "no_good_woman": "🙅‍♀️",
+  "ng_woman": "🙅‍♀️",
+  "ok_person": "🙆",
+  "ok_man": "🙆‍♂️",
+  "ok_woman": "🙆‍♀️",
+  "tipping_hand_person": "💁",
+  "information_desk_person": "💁",
+  "tipping_hand_man": "💁‍♂️",
+  "sassy_man": "💁‍♂️",
+  "tipping_hand_woman": "💁‍♀️",
+  "sassy_woman": "💁‍♀️",
+  "raising_hand": "🙋",
+  "raising_hand_man": "🙋‍♂️",
+  "raising_hand_woman": "🙋‍♀️",
+  "deaf_person": "🧏",
+  "deaf_man": "🧏‍♂️",
+  "deaf_woman": "🧏‍♀️",
+  "bow": "🙇",
+  "bowing_man": "🙇‍♂️",
+  "bowing_woman": "🙇‍♀️",
+  "facepalm": "🤦",
+  "man_facepalming": "🤦‍♂️",
+  "woman_facepalming": "🤦‍♀️",
+  "shrug": "🤷",
+  "man_shrugging": "🤷‍♂️",
+  "woman_shrugging": "🤷‍♀️",
+  "health_worker": "🧑‍⚕️",
+  "man_health_worker": "👨‍⚕️",
+  "woman_health_worker": "👩‍⚕️",
+  "student": "🧑‍🎓",
+  "man_student": "👨‍🎓",
+  "woman_student": "👩‍🎓",
+  "teacher": "🧑‍🏫",
+  "man_teacher": "👨‍🏫",
+  "woman_teacher": "👩‍🏫",
+  "judge": "🧑‍⚖️",
+  "man_judge": "👨‍⚖️",
+  "woman_judge": "👩‍⚖️",
+  "farmer": "🧑‍🌾",
+  "man_farmer": "👨‍🌾",
+  "woman_farmer": "👩‍🌾",
+  "cook": "🧑‍🍳",
+  "man_cook": "👨‍🍳",
+  "woman_cook": "👩‍🍳",
+  "mechanic": "🧑‍🔧",
+  "man_mechanic": "👨‍🔧",
+  "woman_mechanic": "👩‍🔧",
+  "factory_worker": "🧑‍🏭",
+  "man_factory_worker": "👨‍🏭",
+  "woman_factory_worker": "👩‍🏭",
+  "office_worker": "🧑‍💼",
+  "man_office_worker": "👨‍💼",
+  "woman_office_worker": "👩‍💼",
+  "scientist": "🧑‍🔬",
+  "man_scientist": "👨‍🔬",
+  "woman_scientist": "👩‍🔬",
+  "technologist": "🧑‍💻",
+  "man_technologist": "👨‍💻",
+  "woman_technologist": "👩‍💻",
+  "singer": "🧑‍🎤",
+  "man_singer": "👨‍🎤",
+  "woman_singer": "👩‍🎤",
+  "artist": "🧑‍🎨",
+  "man_artist": "👨‍🎨",
+  "woman_artist": "👩‍🎨",
+  "pilot": "🧑‍✈️",
+  "man_pilot": "👨‍✈️",
+  "woman_pilot": "👩‍✈️",
+  "astronaut": "🧑‍🚀",
+  "man_astronaut": "👨‍🚀",
+  "woman_astronaut": "👩‍🚀",
+  "firefighter": "🧑‍🚒",
+  "man_firefighter": "👨‍🚒",
+  "woman_firefighter": "👩‍🚒",
+  "police_officer": "👮",
+  "cop": "👮",
+  "policeman": "👮‍♂️",
+  "policewoman": "👮‍♀️",
+  "detective": "🕵️",
+  "male_detective": "🕵️‍♂️",
+  "female_detective": "🕵️‍♀️",
+  "guard": "💂",
+  "guardsman": "💂‍♂️",
+  "guardswoman": "💂‍♀️",
+  "ninja": "🥷",
+  "construction_worker": "👷",
+  "construction_worker_man": "👷‍♂️",
+  "construction_worker_woman": "👷‍♀️",
+  "person_with_crown": "🫅",
+  "prince": "🤴",
+  "princess": "👸",
+  "person_with_turban": "👳",
+  "man_with_turban": "👳‍♂️",
+  "woman_with_turban": "👳‍♀️",
+  "man_with_gua_pi_mao": "👲",
+  "woman_with_headscarf": "🧕",
+  "person_in_tuxedo": "🤵",
+  "man_in_tuxedo": "🤵‍♂️",
+  "woman_in_tuxedo": "🤵‍♀️",
+  "person_with_veil": "👰",
+  "man_with_veil": "👰‍♂️",
+  "woman_with_veil": "👰‍♀️",
+  "bride_with_veil": "👰‍♀️",
+  "pregnant_woman": "🤰",
+  "pregnant_man": "🫃",
+  "pregnant_person": "🫄",
+  "breast_feeding": "🤱",
+  "woman_feeding_baby": "👩‍🍼",
+  "man_feeding_baby": "👨‍🍼",
+  "person_feeding_baby": "🧑‍🍼",
+  "angel": "👼",
+  "santa": "🎅",
+  "mrs_claus": "🤶",
+  "mx_claus": "🧑‍🎄",
+  "superhero": "🦸",
+  "superhero_man": "🦸‍♂️",
+  "superhero_woman": "🦸‍♀️",
+  "supervillain": "🦹",
+  "supervillain_man": "🦹‍♂️",
+  "supervillain_woman": "🦹‍♀️",
+  "mage": "🧙",
+  "mage_man": "🧙‍♂️",
+  "mage_woman": "🧙‍♀️",
+  "fairy": "🧚",
+  "fairy_man": "🧚‍♂️",
+  "fairy_woman": "🧚‍♀️",
+  "vampire": "🧛",
+  "vampire_man": "🧛‍♂️",
+  "vampire_woman": "🧛‍♀️",
+  "merperson": "🧜",
+  "merman": "🧜‍♂️",
+  "mermaid": "🧜‍♀️",
+  "elf": "🧝",
+  "elf_man": "🧝‍♂️",
+  "elf_woman": "🧝‍♀️",
+  "genie": "🧞",
+  "genie_man": "🧞‍♂️",
+  "genie_woman": "🧞‍♀️",
+  "zombie": "🧟",
+  "zombie_man": "🧟‍♂️",
+  "zombie_woman": "🧟‍♀️",
+  "troll": "🧌",
+  "massage": "💆",
+  "massage_man": "💆‍♂️",
+  "massage_woman": "💆‍♀️",
+  "haircut": "💇",
+  "haircut_man": "💇‍♂️",
+  "haircut_woman": "💇‍♀️",
+  "walking": "🚶",
+  "walking_man": "🚶‍♂️",
+  "walking_woman": "🚶‍♀️",
+  "standing_person": "🧍",
+  "standing_man": "🧍‍♂️",
+  "standing_woman": "🧍‍♀️",
+  "kneeling_person": "🧎",
+  "kneeling_man": "🧎‍♂️",
+  "kneeling_woman": "🧎‍♀️",
+  "person_with_probing_cane": "🧑‍🦯",
+  "man_with_probing_cane": "👨‍🦯",
+  "woman_with_probing_cane": "👩‍🦯",
+  "person_in_motorized_wheelchair": "🧑‍🦼",
+  "man_in_motorized_wheelchair": "👨‍🦼",
+  "woman_in_motorized_wheelchair": "👩‍🦼",
+  "person_in_manual_wheelchair": "🧑‍🦽",
+  "man_in_manual_wheelchair": "👨‍🦽",
+  "woman_in_manual_wheelchair": "👩‍🦽",
+  "runner": "🏃",
+  "running": "🏃",
+  "running_man": "🏃‍♂️",
+  "running_woman": "🏃‍♀️",
+  "woman_dancing": "💃",
+  "dancer": "💃",
+  "man_dancing": "🕺",
+  "business_suit_levitating": "🕴️",
+  "dancers": "👯",
+  "dancing_men": "👯‍♂️",
+  "dancing_women": "👯‍♀️",
+  "sauna_person": "🧖",
+  "sauna_man": "🧖‍♂️",
+  "sauna_woman": "🧖‍♀️",
+  "climbing": "🧗",
+  "climbing_man": "🧗‍♂️",
+  "climbing_woman": "🧗‍♀️",
+  "person_fencing": "🤺",
+  "horse_racing": "🏇",
+  "skier": "⛷️",
+  "snowboarder": "🏂",
+  "golfing": "🏌️",
+  "golfing_man": "🏌️‍♂️",
+  "golfing_woman": "🏌️‍♀️",
+  "surfer": "🏄",
+  "surfing_man": "🏄‍♂️",
+  "surfing_woman": "🏄‍♀️",
+  "rowboat": "🚣",
+  "rowing_man": "🚣‍♂️",
+  "rowing_woman": "🚣‍♀️",
+  "swimmer": "🏊",
+  "swimming_man": "🏊‍♂️",
+  "swimming_woman": "🏊‍♀️",
+  "bouncing_ball_person": "⛹️",
+  "bouncing_ball_man": "⛹️‍♂️",
+  "basketball_man": "⛹️‍♂️",
+  "bouncing_ball_woman": "⛹️‍♀️",
+  "basketball_woman": "⛹️‍♀️",
+  "weight_lifting": "🏋️",
+  "weight_lifting_man": "🏋️‍♂️",
+  "weight_lifting_woman": "🏋️‍♀️",
+  "bicyclist": "🚴",
+  "biking_man": "🚴‍♂️",
+  "biking_woman": "🚴‍♀️",
+  "mountain_bicyclist": "🚵",
+  "mountain_biking_man": "🚵‍♂️",
+  "mountain_biking_woman": "🚵‍♀️",
+  "cartwheeling": "🤸",
+  "man_cartwheeling": "🤸‍♂️",
+  "woman_cartwheeling": "🤸‍♀️",
+  "wrestling": "🤼",
+  "men_wrestling": "🤼‍♂️",
+  "women_wrestling": "🤼‍♀️",
+  "water_polo": "🤽",
+  "man_playing_water_polo": "🤽‍♂️",
+  "woman_playing_water_polo": "🤽‍♀️",
+  "handball_person": "🤾",
+  "man_playing_handball": "🤾‍♂️",
+  "woman_playing_handball": "🤾‍♀️",
+  "juggling_person": "🤹",
+  "man_juggling": "🤹‍♂️",
+  "woman_juggling": "🤹‍♀️",
+  "lotus_position": "🧘",
+  "lotus_position_man": "🧘‍♂️",
+  "lotus_position_woman": "🧘‍♀️",
+  "bath": "🛀",
+  "sleeping_bed": "🛌",
+  "people_holding_hands": "🧑‍🤝‍🧑",
+  "two_women_holding_hands": "👭",
+  "couple": "👫",
+  "two_men_holding_hands": "👬",
+  "couplekiss": "💏",
+  "couplekiss_man_woman": "👩‍❤️‍💋‍👨",
+  "couplekiss_man_man": "👨‍❤️‍💋‍👨",
+  "couplekiss_woman_woman": "👩‍❤️‍💋‍👩",
+  "couple_with_heart": "💑",
+  "couple_with_heart_woman_man": "👩‍❤️‍👨",
+  "couple_with_heart_man_man": "👨‍❤️‍👨",
+  "couple_with_heart_woman_woman": "👩‍❤️‍👩",
+  "family": "👪",
+  "family_man_woman_boy": "👨‍👩‍👦",
+  "family_man_woman_girl": "👨‍👩‍👧",
+  "family_man_woman_girl_boy": "👨‍👩‍👧‍👦",
+  "family_man_woman_boy_boy": "👨‍👩‍👦‍👦",
+  "family_man_woman_girl_girl": "👨‍👩‍👧‍👧",
+  "family_man_man_boy": "👨‍👨‍👦",
+  "family_man_man_girl": "👨‍👨‍👧",
+  "family_man_man_girl_boy": "👨‍👨‍👧‍👦",
+  "family_man_man_boy_boy": "👨‍👨‍👦‍👦",
+  "family_man_man_girl_girl": "👨‍👨‍👧‍👧",
+  "family_woman_woman_boy": "👩‍👩‍👦",
+  "family_woman_woman_girl": "👩‍👩‍👧",
+  "family_woman_woman_girl_boy": "👩‍👩‍👧‍👦",
+  "family_woman_woman_boy_boy": "👩‍👩‍👦‍👦",
+  "family_woman_woman_girl_girl": "👩‍👩‍👧‍👧",
+  "family_man_boy": "👨‍👦",
+  "family_man_boy_boy": "👨‍👦‍👦",
+  "family_man_girl": "👨‍👧",
+  "family_man_girl_boy": "👨‍👧‍👦",
+  "family_man_girl_girl": "👨‍👧‍👧",
+  "family_woman_boy": "👩‍👦",
+  "family_woman_boy_boy": "👩‍👦‍👦",
+  "family_woman_girl": "👩‍👧",
+  "family_woman_girl_boy": "👩‍👧‍👦",
+  "family_woman_girl_girl": "👩‍👧‍👧",
+  "speaking_head": "🗣️",
+  "bust_in_silhouette": "👤",
+  "busts_in_silhouette": "👥",
+  "people_hugging": "🫂",
+  "footprints": "👣",
+  "monkey_face": "🐵",
+  "monkey": "🐒",
+  "gorilla": "🦍",
+  "orangutan": "🦧",
+  "dog": "🐶",
+  "dog2": "🐕",
+  "guide_dog": "🦮",
+  "service_dog": "🐕‍🦺",
+  "poodle": "🐩",
+  "wolf": "🐺",
+  "fox_face": "🦊",
+  "raccoon": "🦝",
+  "cat": "🐱",
+  "cat2": "🐈",
+  "black_cat": "🐈‍⬛",
+  "lion": "🦁",
+  "tiger": "🐯",
+  "tiger2": "🐅",
+  "leopard": "🐆",
+  "horse": "🐴",
+  "moose": "🫎",
+  "donkey": "🫏",
+  "racehorse": "🐎",
+  "unicorn": "🦄",
+  "zebra": "🦓",
+  "deer": "🦌",
+  "bison": "🦬",
+  "cow": "🐮",
+  "ox": "🐂",
+  "water_buffalo": "🐃",
+  "cow2": "🐄",
+  "pig": "🐷",
+  "pig2": "🐖",
+  "boar": "🐗",
+  "pig_nose": "🐽",
+  "ram": "🐏",
+  "sheep": "🐑",
+  "goat": "🐐",
+  "dromedary_camel": "🐪",
+  "camel": "🐫",
+  "llama": "🦙",
+  "giraffe": "🦒",
+  "elephant": "🐘",
+  "mammoth": "🦣",
+  "rhinoceros": "🦏",
+  "hippopotamus": "🦛",
+  "mouse": "🐭",
+  "mouse2": "🐁",
+  "rat": "🐀",
+  "hamster": "🐹",
+  "rabbit": "🐰",
+  "rabbit2": "🐇",
+  "chipmunk": "🐿️",
+  "beaver": "🦫",
+  "hedgehog": "🦔",
+  "bat": "🦇",
+  "bear": "🐻",
+  "polar_bear": "🐻‍❄️",
+  "koala": "🐨",
+  "panda_face": "🐼",
+  "sloth": "🦥",
+  "otter": "🦦",
+  "skunk": "🦨",
+  "kangaroo": "🦘",
+  "badger": "🦡",
+  "feet": "🐾",
+  "paw_prints": "🐾",
+  "turkey": "🦃",
+  "chicken": "🐔",
+  "rooster": "🐓",
+  "hatching_chick": "🐣",
+  "baby_chick": "🐤",
+  "hatched_chick": "🐥",
+  "bird": "🐦",
+  "penguin": "🐧",
+  "dove": "🕊️",
+  "eagle": "🦅",
+  "duck": "🦆",
+  "swan": "🦢",
+  "owl": "🦉",
+  "dodo": "🦤",
+  "feather": "🪶",
+  "flamingo": "🦩",
+  "peacock": "🦚",
+  "parrot": "🦜",
+  "wing": "🪽",
+  "black_bird": "🐦‍⬛",
+  "goose": "🪿",
+  "frog": "🐸",
+  "crocodile": "🐊",
+  "turtle": "🐢",
+  "lizard": "🦎",
+  "snake": "🐍",
+  "dragon_face": "🐲",
+  "dragon": "🐉",
+  "sauropod": "🦕",
+  "t-rex": "🦖",
+  "whale": "🐳",
+  "whale2": "🐋",
+  "dolphin": "🐬",
+  "flipper": "🐬",
+  "seal": "🦭",
+  "fish": "🐟",
+  "tropical_fish": "🐠",
+  "blowfish": "🐡",
+  "shark": "🦈",
+  "octopus": "🐙",
+  "shell": "🐚",
+  "coral": "🪸",
+  "jellyfish": "🪼",
+  "snail": "🐌",
+  "butterfly": "🦋",
+  "bug": "🐛",
+  "ant": "🐜",
+  "bee": "🐝",
+  "honeybee": "🐝",
+  "beetle": "🪲",
+  "lady_beetle": "🐞",
+  "cricket": "🦗",
+  "cockroach": "🪳",
+  "spider": "🕷️",
+  "spider_web": "🕸️",
+  "scorpion": "🦂",
+  "mosquito": "🦟",
+  "fly": "🪰",
+  "worm": "🪱",
+  "microbe": "🦠",
+  "bouquet": "💐",
+  "cherry_blossom": "🌸",
+  "white_flower": "💮",
+  "lotus": "🪷",
+  "rosette": "🏵️",
+  "rose": "🌹",
+  "wilted_flower": "🥀",
+  "hibiscus": "🌺",
+  "sunflower": "🌻",
+  "blossom": "🌼",
+  "tulip": "🌷",
+  "hyacinth": "🪻",
+  "seedling": "🌱",
+  "potted_plant": "🪴",
+  "evergreen_tree": "🌲",
+  "deciduous_tree": "🌳",
+  "palm_tree": "🌴",
+  "cactus": "🌵",
+  "ear_of_rice": "🌾",
+  "herb": "🌿",
+  "shamrock": "☘️",
+  "four_leaf_clover": "🍀",
+  "maple_leaf": "🍁",
+  "fallen_leaf": "🍂",
+  "leaves": "🍃",
+  "empty_nest": "🪹",
+  "nest_with_eggs": "🪺",
+  "mushroom": "🍄",
+  "grapes": "🍇",
+  "melon": "🍈",
+  "watermelon": "🍉",
+  "tangerine": "🍊",
+  "orange": "🍊",
+  "mandarin": "🍊",
+  "lemon": "🍋",
+  "banana": "🍌",
+  "pineapple": "🍍",
+  "mango": "🥭",
+  "apple": "🍎",
+  "green_apple": "🍏",
+  "pear": "🍐",
+  "peach": "🍑",
+  "cherries": "🍒",
+  "strawberry": "🍓",
+  "blueberries": "🫐",
+  "kiwi_fruit": "🥝",
+  "tomato": "🍅",
+  "olive": "🫒",
+  "coconut": "🥥",
+  "avocado": "🥑",
+  "eggplant": "🍆",
+  "potato": "🥔",
+  "carrot": "🥕",
+  "corn": "🌽",
+  "hot_pepper": "🌶️",
+  "bell_pepper": "🫑",
+  "cucumber": "🥒",
+  "leafy_green": "🥬",
+  "broccoli": "🥦",
+  "garlic": "🧄",
+  "onion": "🧅",
+  "peanuts": "🥜",
+  "beans": "🫘",
+  "chestnut": "🌰",
+  "ginger_root": "🫚",
+  "pea_pod": "🫛",
+  "bread": "🍞",
+  "croissant": "🥐",
+  "baguette_bread": "🥖",
+  "flatbread": "🫓",
+  "pretzel": "🥨",
+  "bagel": "🥯",
+  "pancakes": "🥞",
+  "waffle": "🧇",
+  "cheese": "🧀",
+  "meat_on_bone": "🍖",
+  "poultry_leg": "🍗",
+  "cut_of_meat": "🥩",
+  "bacon": "🥓",
+  "hamburger": "🍔",
+  "fries": "🍟",
+  "pizza": "🍕",
+  "hotdog": "🌭",
+  "sandwich": "🥪",
+  "taco": "🌮",
+  "burrito": "🌯",
+  "tamale": "🫔",
+  "stuffed_flatbread": "🥙",
+  "falafel": "🧆",
+  "egg": "🥚",
+  "fried_egg": "🍳",
+  "shallow_pan_of_food": "🥘",
+  "stew": "🍲",
+  "fondue": "🫕",
+  "bowl_with_spoon": "🥣",
+  "green_salad": "🥗",
+  "popcorn": "🍿",
+  "butter": "🧈",
+  "salt": "🧂",
+  "canned_food": "🥫",
+  "bento": "🍱",
+  "rice_cracker": "🍘",
+  "rice_ball": "🍙",
+  "rice": "🍚",
+  "curry": "🍛",
+  "ramen": "🍜",
+  "spaghetti": "🍝",
+  "sweet_potato": "🍠",
+  "oden": "🍢",
+  "sushi": "🍣",
+  "fried_shrimp": "🍤",
+  "fish_cake": "🍥",
+  "moon_cake": "🥮",
+  "dango": "🍡",
+  "dumpling": "🥟",
+  "fortune_cookie": "🥠",
+  "takeout_box": "🥡",
+  "crab": "🦀",
+  "lobster": "🦞",
+  "shrimp": "🦐",
+  "squid": "🦑",
+  "oyster": "🦪",
+  "icecream": "🍦",
+  "shaved_ice": "🍧",
+  "ice_cream": "🍨",
+  "doughnut": "🍩",
+  "cookie": "🍪",
+  "birthday": "🎂",
+  "cake": "🍰",
+  "cupcake": "🧁",
+  "pie": "🥧",
+  "chocolate_bar": "🍫",
+  "candy": "🍬",
+  "lollipop": "🍭",
+  "custard": "🍮",
+  "honey_pot": "🍯",
+  "baby_bottle": "🍼",
+  "milk_glass": "🥛",
+  "coffee": "☕",
+  "teapot": "🫖",
+  "tea": "🍵",
+  "sake": "🍶",
+  "champagne": "🍾",
+  "wine_glass": "🍷",
+  "cocktail": "🍸",
+  "tropical_drink": "🍹",
+  "beer": "🍺",
+  "beers": "🍻",
+  "clinking_glasses": "🥂",
+  "tumbler_glass": "🥃",
+  "pouring_liquid": "🫗",
+  "cup_with_straw": "🥤",
+  "bubble_tea": "🧋",
+  "beverage_box": "🧃",
+  "mate": "🧉",
+  "ice_cube": "🧊",
+  "chopsticks": "🥢",
+  "plate_with_cutlery": "🍽️",
+  "fork_and_knife": "🍴",
+  "spoon": "🥄",
+  "hocho": "🔪",
+  "knife": "🔪",
+  "jar": "🫙",
+  "amphora": "🏺",
+  "earth_africa": "🌍",
+  "earth_americas": "🌎",
+  "earth_asia": "🌏",
+  "globe_with_meridians": "🌐",
+  "world_map": "🗺️",
+  "japan": "🗾",
+  "compass": "🧭",
+  "mountain_snow": "🏔️",
+  "mountain": "⛰️",
+  "volcano": "🌋",
+  "mount_fuji": "🗻",
+  "camping": "🏕️",
+  "beach_umbrella": "🏖️",
+  "desert": "🏜️",
+  "desert_island": "🏝️",
+  "national_park": "🏞️",
+  "stadium": "🏟️",
+  "classical_building": "🏛️",
+  "building_construction": "🏗️",
+  "bricks": "🧱",
+  "rock": "🪨",
+  "wood": "🪵",
+  "hut": "🛖",
+  "houses": "🏘️",
+  "derelict_house": "🏚️",
+  "house": "🏠",
+  "house_with_garden": "🏡",
+  "office": "🏢",
+  "post_office": "🏣",
+  "european_post_office": "🏤",
+  "hospital": "🏥",
+  "bank": "🏦",
+  "hotel": "🏨",
+  "love_hotel": "🏩",
+  "convenience_store": "🏪",
+  "school": "🏫",
+  "department_store": "🏬",
+  "factory": "🏭",
+  "japanese_castle": "🏯",
+  "european_castle": "🏰",
+  "wedding": "💒",
+  "tokyo_tower": "🗼",
+  "statue_of_liberty": "🗽",
+  "church": "⛪",
+  "mosque": "🕌",
+  "hindu_temple": "🛕",
+  "synagogue": "🕍",
+  "shinto_shrine": "⛩️",
+  "kaaba": "🕋",
+  "fountain": "⛲",
+  "tent": "⛺",
+  "foggy": "🌁",
+  "night_with_stars": "🌃",
+  "cityscape": "🏙️",
+  "sunrise_over_mountains": "🌄",
+  "sunrise": "🌅",
+  "city_sunset": "🌆",
+  "city_sunrise": "🌇",
+  "bridge_at_night": "🌉",
+  "hotsprings": "♨️",
+  "carousel_horse": "🎠",
+  "playground_slide": "🛝",
+  "ferris_wheel": "🎡",
+  "roller_coaster": "🎢",
+  "barber": "💈",
+  "circus_tent": "🎪",
+  "steam_locomotive": "🚂",
+  "railway_car": "🚃",
+  "bullettrain_side": "🚄",
+  "bullettrain_front": "🚅",
+  "train2": "🚆",
+  "metro": "🚇",
+  "light_rail": "🚈",
+  "station": "🚉",
+  "tram": "🚊",
+  "monorail": "🚝",
+  "mountain_railway": "🚞",
+  "train": "🚋",
+  "bus": "🚌",
+  "oncoming_bus": "🚍",
+  "trolleybus": "🚎",
+  "minibus": "🚐",
+  "ambulance": "🚑",
+  "fire_engine": "🚒",
+  "police_car": "🚓",
+  "oncoming_police_car": "🚔",
+  "taxi": "🚕",
+  "oncoming_taxi": "🚖",
+  "car": "🚗",
+  "red_car": "🚗",
+  "oncoming_automobile": "🚘",
+  "blue_car": "🚙",
+  "pickup_truck": "🛻",
+  "truck": "🚚",
+  "articulated_lorry": "🚛",
+  "tractor": "🚜",
+  "racing_car": "🏎️",
+  "motorcycle": "🏍️",
+  "motor_scooter": "🛵",
+  "manual_wheelchair": "🦽",
+  "motorized_wheelchair": "🦼",
+  "auto_rickshaw": "🛺",
+  "bike": "🚲",
+  "kick_scooter": "🛴",
+  "skateboard": "🛹",
+  "roller_skate": "🛼",
+  "busstop": "🚏",
+  "motorway": "🛣️",
+  "railway_track": "🛤️",
+  "oil_drum": "🛢️",
+  "fuelpump": "⛽",
+  "wheel": "🛞",
+  "rotating_light": "🚨",
+  "traffic_light": "🚥",
+  "vertical_traffic_light": "🚦",
+  "stop_sign": "🛑",
+  "construction": "🚧",
+  "anchor": "⚓",
+  "ring_buoy": "🛟",
+  "boat": "⛵",
+  "sailboat": "⛵",
+  "canoe": "🛶",
+  "speedboat": "🚤",
+  "passenger_ship": "🛳️",
+  "ferry": "⛴️",
+  "motor_boat": "🛥️",
+  "ship": "🚢",
+  "airplane": "✈️",
+  "small_airplane": "🛩️",
+  "flight_departure": "🛫",
+  "flight_arrival": "🛬",
+  "parachute": "🪂",
+  "seat": "💺",
+  "helicopter": "🚁",
+  "suspension_railway": "🚟",
+  "mountain_cableway": "🚠",
+  "aerial_tramway": "🚡",
+  "artificial_satellite": "🛰️",
+  "rocket": "🚀",
+  "flying_saucer": "🛸",
+  "bellhop_bell": "🛎️",
+  "luggage": "🧳",
+  "hourglass": "⌛",
+  "hourglass_flowing_sand": "⏳",
+  "watch": "⌚",
+  "alarm_clock": "⏰",
+  "stopwatch": "⏱️",
+  "timer_clock": "⏲️",
+  "mantelpiece_clock": "🕰️",
+  "clock12": "🕛",
+  "clock1230": "🕧",
+  "clock1": "🕐",
+  "clock130": "🕜",
+  "clock2": "🕑",
+  "clock230": "🕝",
+  "clock3": "🕒",
+  "clock330": "🕞",
+  "clock4": "🕓",
+  "clock430": "🕟",
+  "clock5": "🕔",
+  "clock530": "🕠",
+  "clock6": "🕕",
+  "clock630": "🕡",
+  "clock7": "🕖",
+  "clock730": "🕢",
+  "clock8": "🕗",
+  "clock830": "🕣",
+  "clock9": "🕘",
+  "clock930": "🕤",
+  "clock10": "🕙",
+  "clock1030": "🕥",
+  "clock11": "🕚",
+  "clock1130": "🕦",
+  "new_moon": "🌑",
+  "waxing_crescent_moon": "🌒",
+  "first_quarter_moon": "🌓",
+  "moon": "🌔",
+  "waxing_gibbous_moon": "🌔",
+  "full_moon": "🌕",
+  "waning_gibbous_moon": "🌖",
+  "last_quarter_moon": "🌗",
+  "waning_crescent_moon": "🌘",
+  "crescent_moon": "🌙",
+  "new_moon_with_face": "🌚",
+  "first_quarter_moon_with_face": "🌛",
+  "last_quarter_moon_with_face": "🌜",
+  "thermometer": "🌡️",
+  "sunny": "☀️",
+  "full_moon_with_face": "🌝",
+  "sun_with_face": "🌞",
+  "ringed_planet": "🪐",
+  "star": "⭐",
+  "star2": "🌟",
+  "stars": "🌠",
+  "milky_way": "🌌",
+  "cloud": "☁️",
+  "partly_sunny": "⛅",
+  "cloud_with_lightning_and_rain": "⛈️",
+  "sun_behind_small_cloud": "🌤️",
+  "sun_behind_large_cloud": "🌥️",
+  "sun_behind_rain_cloud": "🌦️",
+  "cloud_with_rain": "🌧️",
+  "cloud_with_snow": "🌨️",
+  "cloud_with_lightning": "🌩️",
+  "tornado": "🌪️",
+  "fog": "🌫️",
+  "wind_face": "🌬️",
+  "cyclone": "🌀",
+  "rainbow": "🌈",
+  "closed_umbrella": "🌂",
+  "open_umbrella": "☂️",
+  "umbrella": "☔",
+  "parasol_on_ground": "⛱️",
+  "zap": "⚡",
+  "snowflake": "❄️",
+  "snowman_with_snow": "☃️",
+  "snowman": "⛄",
+  "comet": "☄️",
+  "fire": "🔥",
+  "droplet": "💧",
+  "ocean": "🌊",
+  "jack_o_lantern": "🎃",
+  "christmas_tree": "🎄",
+  "fireworks": "🎆",
+  "sparkler": "🎇",
+  "firecracker": "🧨",
+  "sparkles": "✨",
+  "balloon": "🎈",
+  "tada": "🎉",
+  "confetti_ball": "🎊",
+  "tanabata_tree": "🎋",
+  "bamboo": "🎍",
+  "dolls": "🎎",
+  "flags": "🎏",
+  "wind_chime": "🎐",
+  "rice_scene": "🎑",
+  "red_envelope": "🧧",
+  "ribbon": "🎀",
+  "gift": "🎁",
+  "reminder_ribbon": "🎗️",
+  "tickets": "🎟️",
+  "ticket": "🎫",
+  "medal_military": "🎖️",
+  "trophy": "🏆",
+  "medal_sports": "🏅",
+  "1st_place_medal": "🥇",
+  "2nd_place_medal": "🥈",
+  "3rd_place_medal": "🥉",
+  "soccer": "⚽",
+  "baseball": "⚾",
+  "softball": "🥎",
+  "basketball": "🏀",
+  "volleyball": "🏐",
+  "football": "🏈",
+  "rugby_football": "🏉",
+  "tennis": "🎾",
+  "flying_disc": "🥏",
+  "bowling": "🎳",
+  "cricket_game": "🏏",
+  "field_hockey": "🏑",
+  "ice_hockey": "🏒",
+  "lacrosse": "🥍",
+  "ping_pong": "🏓",
+  "badminton": "🏸",
+  "boxing_glove": "🥊",
+  "martial_arts_uniform": "🥋",
+  "goal_net": "🥅",
+  "golf": "⛳",
+  "ice_skate": "⛸️",
+  "fishing_pole_and_fish": "🎣",
+  "diving_mask": "🤿",
+  "running_shirt_with_sash": "🎽",
+  "ski": "🎿",
+  "sled": "🛷",
+  "curling_stone": "🥌",
+  "dart": "🎯",
+  "yo_yo": "🪀",
+  "kite": "🪁",
+  "gun": "🔫",
+  "8ball": "🎱",
+  "crystal_ball": "🔮",
+  "magic_wand": "🪄",
+  "video_game": "🎮",
+  "joystick": "🕹️",
+  "slot_machine": "🎰",
+  "game_die": "🎲",
+  "jigsaw": "🧩",
+  "teddy_bear": "🧸",
+  "pinata": "🪅",
+  "mirror_ball": "🪩",
+  "nesting_dolls": "🪆",
+  "spades": "♠️",
+  "hearts": "♥️",
+  "diamonds": "♦️",
+  "clubs": "♣️",
+  "chess_pawn": "♟️",
+  "black_joker": "🃏",
+  "mahjong": "🀄",
+  "flower_playing_cards": "🎴",
+  "performing_arts": "🎭",
+  "framed_picture": "🖼️",
+  "art": "🎨",
+  "thread": "🧵",
+  "sewing_needle": "🪡",
+  "yarn": "🧶",
+  "knot": "🪢",
+  "eyeglasses": "👓",
+  "dark_sunglasses": "🕶️",
+  "goggles": "🥽",
+  "lab_coat": "🥼",
+  "safety_vest": "🦺",
+  "necktie": "👔",
+  "shirt": "👕",
+  "tshirt": "👕",
+  "jeans": "👖",
+  "scarf": "🧣",
+  "gloves": "🧤",
+  "coat": "🧥",
+  "socks": "🧦",
+  "dress": "👗",
+  "kimono": "👘",
+  "sari": "🥻",
+  "one_piece_swimsuit": "🩱",
+  "swim_brief": "🩲",
+  "shorts": "🩳",
+  "bikini": "👙",
+  "womans_clothes": "👚",
+  "folding_hand_fan": "🪭",
+  "purse": "👛",
+  "handbag": "👜",
+  "pouch": "👝",
+  "shopping": "🛍️",
+  "school_satchel": "🎒",
+  "thong_sandal": "🩴",
+  "mans_shoe": "👞",
+  "shoe": "👞",
+  "athletic_shoe": "👟",
+  "hiking_boot": "🥾",
+  "flat_shoe": "🥿",
+  "high_heel": "👠",
+  "sandal": "👡",
+  "ballet_shoes": "🩰",
+  "boot": "👢",
+  "hair_pick": "🪮",
+  "crown": "👑",
+  "womans_hat": "👒",
+  "tophat": "🎩",
+  "mortar_board": "🎓",
+  "billed_cap": "🧢",
+  "military_helmet": "🪖",
+  "rescue_worker_helmet": "⛑️",
+  "prayer_beads": "📿",
+  "lipstick": "💄",
+  "ring": "💍",
+  "gem": "💎",
+  "mute": "🔇",
+  "speaker": "🔈",
+  "sound": "🔉",
+  "loud_sound": "🔊",
+  "loudspeaker": "📢",
+  "mega": "📣",
+  "postal_horn": "📯",
+  "bell": "🔔",
+  "no_bell": "🔕",
+  "musical_score": "🎼",
+  "musical_note": "🎵",
+  "notes": "🎶",
+  "studio_microphone": "🎙️",
+  "level_slider": "🎚️",
+  "control_knobs": "🎛️",
+  "microphone": "🎤",
+  "headphones": "🎧",
+  "radio": "📻",
+  "saxophone": "🎷",
+  "accordion": "🪗",
+  "guitar": "🎸",
+  "musical_keyboard": "🎹",
+  "trumpet": "🎺",
+  "violin": "🎻",
+  "banjo": "🪕",
+  "drum": "🥁",
+  "long_drum": "🪘",
+  "maracas": "🪇",
+  "flute": "🪈",
+  "iphone": "📱",
+  "calling": "📲",
+  "phone": "☎️",
+  "telephone": "☎️",
+  "telephone_receiver": "📞",
+  "pager": "📟",
+  "fax": "📠",
+  "battery": "🔋",
+  "low_battery": "🪫",
+  "electric_plug": "🔌",
+  "computer": "💻",
+  "desktop_computer": "🖥️",
+  "printer": "🖨️",
+  "keyboard": "⌨️",
+  "computer_mouse": "🖱️",
+  "trackball": "🖲️",
+  "minidisc": "💽",
+  "floppy_disk": "💾",
+  "cd": "💿",
+  "dvd": "📀",
+  "abacus": "🧮",
+  "movie_camera": "🎥",
+  "film_strip": "🎞️",
+  "film_projector": "📽️",
+  "clapper": "🎬",
+  "tv": "📺",
+  "camera": "📷",
+  "camera_flash": "📸",
+  "video_camera": "📹",
+  "vhs": "📼",
+  "mag": "🔍",
+  "mag_right": "🔎",
+  "candle": "🕯️",
+  "bulb": "💡",
+  "flashlight": "🔦",
+  "izakaya_lantern": "🏮",
+  "lantern": "🏮",
+  "diya_lamp": "🪔",
+  "notebook_with_decorative_cover": "📔",
+  "closed_book": "📕",
+  "book": "📖",
+  "open_book": "📖",
+  "green_book": "📗",
+  "blue_book": "📘",
+  "orange_book": "📙",
+  "books": "📚",
+  "notebook": "📓",
+  "ledger": "📒",
+  "page_with_curl": "📃",
+  "scroll": "📜",
+  "page_facing_up": "📄",
+  "newspaper": "📰",
+  "newspaper_roll": "🗞️",
+  "bookmark_tabs": "📑",
+  "bookmark": "🔖",
+  "label": "🏷️",
+  "moneybag": "💰",
+  "coin": "🪙",
+  "yen": "💴",
+  "dollar": "💵",
+  "euro": "💶",
+  "pound": "💷",
+  "money_with_wings": "💸",
+  "credit_card": "💳",
+  "receipt": "🧾",
+  "chart": "💹",
+  "envelope": "✉️",
+  "email": "📧",
+  "e-mail": "📧",
+  "incoming_envelope": "📨",
+  "envelope_with_arrow": "📩",
+  "outbox_tray": "📤",
+  "inbox_tray": "📥",
+  "package": "📦",
+  "mailbox": "📫",
+  "mailbox_closed": "📪",
+  "mailbox_with_mail": "📬",
+  "mailbox_with_no_mail": "📭",
+  "postbox": "📮",
+  "ballot_box": "🗳️",
+  "pencil2": "✏️",
+  "black_nib": "✒️",
+  "fountain_pen": "🖋️",
+  "pen": "🖊️",
+  "paintbrush": "🖌️",
+  "crayon": "🖍️",
+  "memo": "📝",
+  "pencil": "📝",
+  "briefcase": "💼",
+  "file_folder": "📁",
+  "open_file_folder": "📂",
+  "card_index_dividers": "🗂️",
+  "date": "📅",
+  "calendar": "📆",
+  "spiral_notepad": "🗒️",
+  "spiral_calendar": "🗓️",
+  "card_index": "📇",
+  "chart_with_upwards_trend": "📈",
+  "chart_with_downwards_trend": "📉",
+  "bar_chart": "📊",
+  "clipboard": "📋",
+  "pushpin": "📌",
+  "round_pushpin": "📍",
+  "paperclip": "📎",
+  "paperclips": "🖇️",
+  "straight_ruler": "📏",
+  "triangular_ruler": "📐",
+  "scissors": "✂️",
+  "card_file_box": "🗃️",
+  "file_cabinet": "🗄️",
+  "wastebasket": "🗑️",
+  "lock": "🔒",
+  "unlock": "🔓",
+  "lock_with_ink_pen": "🔏",
+  "closed_lock_with_key": "🔐",
+  "key": "🔑",
+  "old_key": "🗝️",
+  "hammer": "🔨",
+  "axe": "🪓",
+  "pick": "⛏️",
+  "hammer_and_pick": "⚒️",
+  "hammer_and_wrench": "🛠️",
+  "dagger": "🗡️",
+  "crossed_swords": "⚔️",
+  "bomb": "💣",
+  "boomerang": "🪃",
+  "bow_and_arrow": "🏹",
+  "shield": "🛡️",
+  "carpentry_saw": "🪚",
+  "wrench": "🔧",
+  "screwdriver": "🪛",
+  "nut_and_bolt": "🔩",
+  "gear": "⚙️",
+  "clamp": "🗜️",
+  "balance_scale": "⚖️",
+  "probing_cane": "🦯",
+  "link": "🔗",
+  "chains": "⛓️",
+  "hook": "🪝",
+  "toolbox": "🧰",
+  "magnet": "🧲",
+  "ladder": "🪜",
+  "alembic": "⚗️",
+  "test_tube": "🧪",
+  "petri_dish": "🧫",
+  "dna": "🧬",
+  "microscope": "🔬",
+  "telescope": "🔭",
+  "satellite": "📡",
+  "syringe": "💉",
+  "drop_of_blood": "🩸",
+  "pill": "💊",
+  "adhesive_bandage": "🩹",
+  "crutch": "🩼",
+  "stethoscope": "🩺",
+  "x_ray": "🩻",
+  "door": "🚪",
+  "elevator": "🛗",
+  "mirror": "🪞",
+  "window": "🪟",
+  "bed": "🛏️",
+  "couch_and_lamp": "🛋️",
+  "chair": "🪑",
+  "toilet": "🚽",
+  "plunger": "🪠",
+  "shower": "🚿",
+  "bathtub": "🛁",
+  "mouse_trap": "🪤",
+  "razor": "🪒",
+  "lotion_bottle": "🧴",
+  "safety_pin": "🧷",
+  "broom": "🧹",
+  "basket": "🧺",
+  "roll_of_paper": "🧻",
+  "bucket": "🪣",
+  "soap": "🧼",
+  "bubbles": "🫧",
+  "toothbrush": "🪥",
+  "sponge": "🧽",
+  "fire_extinguisher": "🧯",
+  "shopping_cart": "🛒",
+  "smoking": "🚬",
+  "coffin": "⚰️",
+  "headstone": "🪦",
+  "funeral_urn": "⚱️",
+  "nazar_amulet": "🧿",
+  "hamsa": "🪬",
+  "moyai": "🗿",
+  "placard": "🪧",
+  "identification_card": "🪪",
+  "atm": "🏧",
+  "put_litter_in_its_place": "🚮",
+  "potable_water": "🚰",
+  "wheelchair": "♿",
+  "mens": "🚹",
+  "womens": "🚺",
+  "restroom": "🚻",
+  "baby_symbol": "🚼",
+  "wc": "🚾",
+  "passport_control": "🛂",
+  "customs": "🛃",
+  "baggage_claim": "🛄",
+  "left_luggage": "🛅",
+  "warning": "⚠️",
+  "children_crossing": "🚸",
+  "no_entry": "⛔",
+  "no_entry_sign": "🚫",
+  "no_bicycles": "🚳",
+  "no_smoking": "🚭",
+  "do_not_litter": "🚯",
+  "non-potable_water": "🚱",
+  "no_pedestrians": "🚷",
+  "no_mobile_phones": "📵",
+  "underage": "🔞",
+  "radioactive": "☢️",
+  "biohazard": "☣️",
+  "arrow_up": "⬆️",
+  "arrow_upper_right": "↗️",
+  "arrow_right": "➡️",
+  "arrow_lower_right": "↘️",
+  "arrow_down": "⬇️",
+  "arrow_lower_left": "↙️",
+  "arrow_left": "⬅️",
+  "arrow_upper_left": "↖️",
+  "arrow_up_down": "↕️",
+  "left_right_arrow": "↔️",
+  "leftwards_arrow_with_hook": "↩️",
+  "arrow_right_hook": "↪️",
+  "arrow_heading_up": "⤴️",
+  "arrow_heading_down": "⤵️",
+  "arrows_clockwise": "🔃",
+  "arrows_counterclockwise": "🔄",
+  "back": "🔙",
+  "end": "🔚",
+  "on": "🔛",
+  "soon": "🔜",
+  "top": "🔝",
+  "place_of_worship": "🛐",
+  "atom_symbol": "⚛️",
+  "om": "🕉️",
+  "star_of_david": "✡️",
+  "wheel_of_dharma": "☸️",
+  "yin_yang": "☯️",
+  "latin_cross": "✝️",
+  "orthodox_cross": "☦️",
+  "star_and_crescent": "☪️",
+  "peace_symbol": "☮️",
+  "menorah": "🕎",
+  "six_pointed_star": "🔯",
+  "khanda": "🪯",
+  "aries": "♈",
+  "taurus": "♉",
+  "gemini": "♊",
+  "cancer": "♋",
+  "leo": "♌",
+  "virgo": "♍",
+  "libra": "♎",
+  "scorpius": "♏",
+  "sagittarius": "♐",
+  "capricorn": "♑",
+  "aquarius": "♒",
+  "pisces": "♓",
+  "ophiuchus": "⛎",
+  "twisted_rightwards_arrows": "🔀",
+  "repeat": "🔁",
+  "repeat_one": "🔂",
+  "arrow_forward": "▶️",
+  "fast_forward": "⏩",
+  "next_track_button": "⏭️",
+  "play_or_pause_button": "⏯️",
+  "arrow_backward": "◀️",
+  "rewind": "⏪",
+  "previous_track_button": "⏮️",
+  "arrow_up_small": "🔼",
+  "arrow_double_up": "⏫",
+  "arrow_down_small": "🔽",
+  "arrow_double_down": "⏬",
+  "pause_button": "⏸️",
+  "stop_button": "⏹️",
+  "record_button": "⏺️",
+  "eject_button": "⏏️",
+  "cinema": "🎦",
+  "low_brightness": "🔅",
+  "high_brightness": "🔆",
+  "signal_strength": "📶",
+  "wireless": "🛜",
+  "vibration_mode": "📳",
+  "mobile_phone_off": "📴",
+  "female_sign": "♀️",
+  "male_sign": "♂️",
+  "transgender_symbol": "⚧️",
+  "heavy_multiplication_x": "✖️",
+  "heavy_plus_sign": "➕",
+  "heavy_minus_sign": "➖",
+  "heavy_division_sign": "➗",
+  "heavy_equals_sign": "🟰",
+  "infinity": "♾️",
+  "bangbang": "‼️",
+  "interrobang": "⁉️",
+  "question": "❓",
+  "grey_question": "❔",
+  "grey_exclamation": "❕",
+  "exclamation": "❗",
+  "heavy_exclamation_mark": "❗",
+  "wavy_dash": "〰️",
+  "currency_exchange": "💱",
+  "heavy_dollar_sign": "💲",
+  "medical_symbol": "⚕️",
+  "recycle": "♻️",
+  "fleur_de_lis": "⚜️",
+  "trident": "🔱",
+  "name_badge": "📛",
+  "beginner": "🔰",
+  "o": "⭕",
+  "white_check_mark": "✅",
+  "ballot_box_with_check": "☑️",
+  "heavy_check_mark": "✔️",
+  "x": "❌",
+  "negative_squared_cross_mark": "❎",
+  "curly_loop": "➰",
+  "loop": "➿",
+  "part_alternation_mark": "〽️",
+  "eight_spoked_asterisk": "✳️",
+  "eight_pointed_black_star": "✴️",
+  "sparkle": "❇️",
+  "copyright": "©️",
+  "registered": "®️",
+  "tm": "™️",
+  "hash": "#️⃣",
+  "asterisk": "*️⃣",
+  "zero": "0️⃣",
+  "one": "1️⃣",
+  "two": "2️⃣",
+  "three": "3️⃣",
+  "four": "4️⃣",
+  "five": "5️⃣",
+  "six": "6️⃣",
+  "seven": "7️⃣",
+  "eight": "8️⃣",
+  "nine": "9️⃣",
+  "keycap_ten": "🔟",
+  "capital_abcd": "🔠",
+  "abcd": "🔡",
+  "symbols": "🔣",
+  "abc": "🔤",
+  "a": "🅰️",
+  "ab": "🆎",
+  "b": "🅱️",
+  "cl": "🆑",
+  "cool": "🆒",
+  "free": "🆓",
+  "information_source": "ℹ️",
+  "id": "🆔",
+  "m": "Ⓜ️",
+  "new": "🆕",
+  "ng": "🆖",
+  "o2": "🅾️",
+  "ok": "🆗",
+  "parking": "🅿️",
+  "sos": "🆘",
+  "up": "🆙",
+  "vs": "🆚",
+  "koko": "🈁",
+  "sa": "🈂️",
+  "u6708": "🈷️",
+  "u6709": "🈶",
+  "u6307": "🈯",
+  "ideograph_advantage": "🉐",
+  "u5272": "🈹",
+  "u7121": "🈚",
+  "u7981": "🈲",
+  "accept": "🉑",
+  "u7533": "🈸",
+  "u5408": "🈴",
+  "u7a7a": "🈳",
+  "congratulations": "㊗️",
+  "secret": "㊙️",
+  "u55b6": "🈺",
+  "u6e80": "🈵",
+  "red_circle": "🔴",
+  "orange_circle": "🟠",
+  "yellow_circle": "🟡",
+  "green_circle": "🟢",
+  "large_blue_circle": "🔵",
+  "purple_circle": "🟣",
+  "brown_circle": "🟤",
+  "black_circle": "⚫",
+  "white_circle": "⚪",
+  "red_square": "🟥",
+  "orange_square": "🟧",
+  "yellow_square": "🟨",
+  "green_square": "🟩",
+  "blue_square": "🟦",
+  "purple_square": "🟪",
+  "brown_square": "🟫",
+  "black_large_square": "⬛",
+  "white_large_square": "⬜",
+  "black_medium_square": "◼️",
+  "white_medium_square": "◻️",
+  "black_medium_small_square": "◾",
+  "white_medium_small_square": "◽",
+  "black_small_square": "▪️",
+  "white_small_square": "▫️",
+  "large_orange_diamond": "🔶",
+  "large_blue_diamond": "🔷",
+  "small_orange_diamond": "🔸",
+  "small_blue_diamond": "🔹",
+  "small_red_triangle": "🔺",
+  "small_red_triangle_down": "🔻",
+  "diamond_shape_with_a_dot_inside": "💠",
+  "radio_button": "🔘",
+  "white_square_button": "🔳",
+  "black_square_button": "🔲",
+  "checkered_flag": "🏁",
+  "triangular_flag_on_post": "🚩",
+  "crossed_flags": "🎌",
+  "black_flag": "🏴",
+  "white_flag": "🏳️",
+  "rainbow_flag": "🏳️‍🌈",
+  "transgender_flag": "🏳️‍⚧️",
+  "pirate_flag": "🏴‍☠️",
+  "ascension_island": "🇦🇨",
+  "andorra": "🇦🇩",
+  "united_arab_emirates": "🇦🇪",
+  "afghanistan": "🇦🇫",
+  "antigua_barbuda": "🇦🇬",
+  "anguilla": "🇦🇮",
+  "albania": "🇦🇱",
+  "armenia": "🇦🇲",
+  "angola": "🇦🇴",
+  "antarctica": "🇦🇶",
+  "argentina": "🇦🇷",
+  "american_samoa": "🇦🇸",
+  "austria": "🇦🇹",
+  "australia": "🇦🇺",
+  "aruba": "🇦🇼",
+  "aland_islands": "🇦🇽",
+  "azerbaijan": "🇦🇿",
+  "bosnia_herzegovina": "🇧🇦",
+  "barbados": "🇧🇧",
+  "bangladesh": "🇧🇩",
+  "belgium": "🇧🇪",
+  "burkina_faso": "🇧🇫",
+  "bulgaria": "🇧🇬",
+  "bahrain": "🇧🇭",
+  "burundi": "🇧🇮",
+  "benin": "🇧🇯",
+  "st_barthelemy": "🇧🇱",
+  "bermuda": "🇧🇲",
+  "brunei": "🇧🇳",
+  "bolivia": "🇧🇴",
+  "caribbean_netherlands": "🇧🇶",
+  "brazil": "🇧🇷",
+  "bahamas": "🇧🇸",
+  "bhutan": "🇧🇹",
+  "bouvet_island": "🇧🇻",
+  "botswana": "🇧🇼",
+  "belarus": "⬜️🟥⬜",
+  "belize": "🇧🇿",
+  "canada": "🇨🇦",
+  "cocos_islands": "🇨🇨",
+  "congo_kinshasa": "🇨🇩",
+  "central_african_republic": "🇨🇫",
+  "congo_brazzaville": "🇨🇬",
+  "switzerland": "🇨🇭",
+  "cote_divoire": "🇨🇮",
+  "cook_islands": "🇨🇰",
+  "chile": "🇨🇱",
+  "cameroon": "🇨🇲",
+  "cn": "🇨🇳",
+  "colombia": "🇨🇴",
+  "clipperton_island": "🇨🇵",
+  "costa_rica": "🇨🇷",
+  "cuba": "🇨🇺",
+  "cape_verde": "🇨🇻",
+  "curacao": "🇨🇼",
+  "christmas_island": "🇨🇽",
+  "cyprus": "🇨🇾",
+  "czech_republic": "🇨🇿",
+  "de": "🇩🇪",
+  "diego_garcia": "🇩🇬",
+  "djibouti": "🇩🇯",
+  "denmark": "🇩🇰",
+  "dominica": "🇩🇲",
+  "dominican_republic": "🇩🇴",
+  "algeria": "🇩🇿",
+  "ceuta_melilla": "🇪🇦",
+  "ecuador": "🇪🇨",
+  "estonia": "🇪🇪",
+  "egypt": "🇪🇬",
+  "western_sahara": "🇪🇭",
+  "eritrea": "🇪🇷",
+  "es": "🇪🇸",
+  "ethiopia": "🇪🇹",
+  "eu": "🇪🇺",
+  "european_union": "🇪🇺",
+  "finland": "🇫🇮",
+  "fiji": "🇫🇯",
+  "falkland_islands": "🇫🇰",
+  "micronesia": "🇫🇲",
+  "faroe_islands": "🇫🇴",
+  "fr": "🇫🇷",
+  "gabon": "🇬🇦",
+  "gb": "🇬🇧",
+  "uk": "🇬🇧",
+  "grenada": "🇬🇩",
+  "georgia": "🇬🇪",
+  "french_guiana": "🇬🇫",
+  "guernsey": "🇬🇬",
+  "ghana": "🇬🇭",
+  "gibraltar": "🇬🇮",
+  "greenland": "🇬🇱",
+  "gambia": "🇬🇲",
+  "guinea": "🇬🇳",
+  "guadeloupe": "🇬🇵",
+  "equatorial_guinea": "🇬🇶",
+  "greece": "🇬🇷",
+  "south_georgia_south_sandwich_islands": "🇬🇸",
+  "guatemala": "🇬🇹",
+  "guam": "🇬🇺",
+  "guinea_bissau": "🇬🇼",
+  "guyana": "🇬🇾",
+  "hong_kong": "🇭🇰",
+  "heard_mcdonald_islands": "🇭🇲",
+  "honduras": "🇭🇳",
+  "croatia": "🇭🇷",
+  "haiti": "🇭🇹",
+  "hungary": "🇭🇺",
+  "canary_islands": "🇮🇨",
+  "indonesia": "🇮🇩",
+  "ireland": "🇮🇪",
+  "israel": "🇮🇱",
+  "isle_of_man": "🇮🇲",
+  "india": "🇮🇳",
+  "british_indian_ocean_territory": "🇮🇴",
+  "iraq": "🇮🇶",
+  "iran": "🇮🇷",
+  "iceland": "🇮🇸",
+  "it": "🇮🇹",
+  "jersey": "🇯🇪",
+  "jamaica": "🇯🇲",
+  "jordan": "🇯🇴",
+  "jp": "🇯🇵",
+  "kenya": "🇰🇪",
+  "kyrgyzstan": "🇰🇬",
+  "cambodia": "🇰🇭",
+  "kiribati": "🇰🇮",
+  "comoros": "🇰🇲",
+  "st_kitts_nevis": "🇰🇳",
+  "north_korea": "🇰🇵",
+  "kr": "🇰🇷",
+  "kuwait": "🇰🇼",
+  "cayman_islands": "🇰🇾",
+  "kazakhstan": "🇰🇿",
+  "laos": "🇱🇦",
+  "lebanon": "🇱🇧",
+  "st_lucia": "🇱🇨",
+  "liechtenstein": "🇱🇮",
+  "sri_lanka": "🇱🇰",
+  "liberia": "🇱🇷",
+  "lesotho": "🇱🇸",
+  "lithuania": "🇱🇹",
+  "luxembourg": "🇱🇺",
+  "latvia": "🇱🇻",
+  "libya": "🇱🇾",
+  "morocco": "🇲🇦",
+  "monaco": "🇲🇨",
+  "moldova": "🇲🇩",
+  "montenegro": "🇲🇪",
+  "st_martin": "🇲🇫",
+  "madagascar": "🇲🇬",
+  "marshall_islands": "🇲🇭",
+  "macedonia": "🇲🇰",
+  "mali": "🇲🇱",
+  "myanmar": "🇲🇲",
+  "mongolia": "🇲🇳",
+  "macau": "🇲🇴",
+  "northern_mariana_islands": "🇲🇵",
+  "martinique": "🇲🇶",
+  "mauritania": "🇲🇷",
+  "montserrat": "🇲🇸",
+  "malta": "🇲🇹",
+  "mauritius": "🇲🇺",
+  "maldives": "🇲🇻",
+  "malawi": "🇲🇼",
+  "mexico": "🇲🇽",
+  "malaysia": "🇲🇾",
+  "mozambique": "🇲🇿",
+  "namibia": "🇳🇦",
+  "new_caledonia": "🇳🇨",
+  "niger": "🇳🇪",
+  "norfolk_island": "🇳🇫",
+  "nigeria": "🇳🇬",
+  "nicaragua": "🇳🇮",
+  "netherlands": "🇳🇱",
+  "norway": "🇳🇴",
+  "nepal": "🇳🇵",
+  "nauru": "🇳🇷",
+  "niue": "🇳🇺",
+  "new_zealand": "🇳🇿",
+  "oman": "🇴🇲",
+  "panama": "🇵🇦",
+  "peru": "🇵🇪",
+  "french_polynesia": "🇵🇫",
+  "papua_new_guinea": "🇵🇬",
+  "philippines": "🇵🇭",
+  "pakistan": "🇵🇰",
+  "poland": "🇵🇱",
+  "st_pierre_miquelon": "🇵🇲",
+  "pitcairn_islands": "🇵🇳",
+  "puerto_rico": "🇵🇷",
+  "palestinian_territories": "🇵🇸",
+  "portugal": "🇵🇹",
+  "palau": "🇵🇼",
+  "paraguay": "🇵🇾",
+  "qatar": "🇶🇦",
+  "reunion": "🇷🇪",
+  "romania": "🇷🇴",
+  "serbia": "🇷🇸",
+  "ru": "🇷🇺",
+  "rwanda": "🇷🇼",
+  "saudi_arabia": "🇸🇦",
+  "solomon_islands": "🇸🇧",
+  "seychelles": "🇸🇨",
+  "sudan": "🇸🇩",
+  "sweden": "🇸🇪",
+  "singapore": "🇸🇬",
+  "st_helena": "🇸🇭",
+  "slovenia": "🇸🇮",
+  "svalbard_jan_mayen": "🇸🇯",
+  "slovakia": "🇸🇰",
+  "sierra_leone": "🇸🇱",
+  "san_marino": "🇸🇲",
+  "senegal": "🇸🇳",
+  "somalia": "🇸🇴",
+  "suriname": "🇸🇷",
+  "south_sudan": "🇸🇸",
+  "sao_tome_principe": "🇸🇹",
+  "el_salvador": "🇸🇻",
+  "sint_maarten": "🇸🇽",
+  "syria": "🇸🇾",
+  "swaziland": "🇸🇿",
+  "tristan_da_cunha": "🇹🇦",
+  "turks_caicos_islands": "🇹🇨",
+  "chad": "🇹🇩",
+  "french_southern_territories": "🇹🇫",
+  "togo": "🇹🇬",
+  "thailand": "🇹🇭",
+  "tajikistan": "🇹🇯",
+  "tokelau": "🇹🇰",
+  "timor_leste": "🇹🇱",
+  "turkmenistan": "🇹🇲",
+  "tunisia": "🇹🇳",
+  "tonga": "🇹🇴",
+  "tr": "🇹🇷",
+  "trinidad_tobago": "🇹🇹",
+  "tuvalu": "🇹🇻",
+  "taiwan": "🇹🇼",
+  "tanzania": "🇹🇿",
+  "ukraine": "🇺🇦",
+  "uganda": "🇺🇬",
+  "us_outlying_islands": "🇺🇲",
+  "united_nations": "🇺🇳",
+  "us": "🇺🇸",
+  "uruguay": "🇺🇾",
+  "uzbekistan": "🇺🇿",
+  "vatican_city": "🇻🇦",
+  "st_vincent_grenadines": "🇻🇨",
+  "venezuela": "🇻🇪",
+  "british_virgin_islands": "🇻🇬",
+  "us_virgin_islands": "🇻🇮",
+  "vietnam": "🇻🇳",
+  "vanuatu": "🇻🇺",
+  "wallis_futuna": "🇼🇫",
+  "samoa": "🇼🇸",
+  "kosovo": "🇽🇰",
+  "yemen": "🇾🇪",
+  "mayotte": "🇾🇹",
+  "south_africa": "🇿🇦",
+  "zambia": "🇿🇲",
+  "zimbabwe": "🇿🇼",
+  "england": "🏴󠁧󠁢󠁥󠁮󠁧󠁿",
+  "scotland": "🏴󠁧󠁢󠁳󠁣󠁴󠁿",
+  "wales": "🏴󠁧󠁢󠁷󠁬󠁳󠁿"
+};
diff --git a/app/vmui/packages/vmui/src/constants/markedPlugins.ts b/app/vmui/packages/vmui/src/constants/markedPlugins.ts
new file mode 100644
index 000000000..2a7d046c7
--- /dev/null
+++ b/app/vmui/packages/vmui/src/constants/markedPlugins.ts
@@ -0,0 +1,5 @@
+import { markedEmoji } from "marked-emoji";
+import { marked } from "marked";
+import emojis from "./emojis";
+
+marked.use(markedEmoji({ emojis, renderer: (token) => token.emoji }));
diff --git a/app/vmui/packages/vmui/src/hooks/useGetMetricsQL.tsx b/app/vmui/packages/vmui/src/hooks/useGetMetricsQL.tsx
index fb930c4ba..c41e4be92 100644
--- a/app/vmui/packages/vmui/src/hooks/useGetMetricsQL.tsx
+++ b/app/vmui/packages/vmui/src/hooks/useGetMetricsQL.tsx
@@ -54,7 +54,7 @@ const useGetMetricsQL = () => {
 
   const processMarkdown = (text: string) => {
     const div = document.createElement("div");
-    div.innerHTML = marked(text);
+    div.innerHTML = marked(text) as string;
     const groups = div.querySelectorAll(`${CATEGORY_TAG}, ${FUNCTION_TAG}`);
     return processGroups(groups);
   };
diff --git a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogs.tsx b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogs.tsx
index 8696531e4..9dbebedb6 100644
--- a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogs.tsx
+++ b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogs.tsx
@@ -26,6 +26,7 @@ const ExploreLogs: FC = () => {
   const { logs, isLoading, error, fetchLogs } = useFetchLogs(serverUrl, query, limit);
   const [queryError, setQueryError] = useState<ErrorTypes | string>("");
   const [loaded, isLoaded] = useState(false);
+  const [markdownParsing, setMarkdownParsing] = useState(getFromStorage("LOGS_MARKDOWN") === "true");
 
   const handleRunQuery = () => {
     if (!query) {
@@ -51,6 +52,11 @@ const ExploreLogs: FC = () => {
     saveToStorage("LOGS_LIMIT", `${limit}`);
   };
 
+  const handleChangeMarkdownParsing = (val: boolean) => {
+    saveToStorage("LOGS_MARKDOWN", `${val}`);
+    setMarkdownParsing(val);
+  };
+
   useEffect(() => {
     if (query) handleRunQuery();
   }, [period]);
@@ -65,15 +71,18 @@ const ExploreLogs: FC = () => {
         query={query}
         error={queryError}
         limit={limit}
+        markdownParsing={markdownParsing}
         onChange={setQuery}
         onChangeLimit={handleChangeLimit}
         onRun={handleRunQuery}
+        onChangeMarkdownParsing={handleChangeMarkdownParsing}
       />
       {isLoading && <Spinner />}
       {error && <Alert variant="error">{error}</Alert>}
       <ExploreLogsBody
         data={logs}
         loaded={loaded}
+        markdownParsing={markdownParsing}
       />
     </div>
   );
diff --git a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBody/ExploreLogsBody.tsx b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBody/ExploreLogsBody.tsx
index 7538a0e14..3a66a3503 100644
--- a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBody/ExploreLogsBody.tsx
+++ b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsBody/ExploreLogsBody.tsx
@@ -15,10 +15,12 @@ import useBoolean from "../../../hooks/useBoolean";
 import TableLogs from "./TableLogs";
 import GroupLogs from "../GroupLogs/GroupLogs";
 import { DATE_TIME_FORMAT } from "../../../constants/date";
+import { marked } from "marked";
 
 export interface ExploreLogBodyProps {
   data: Logs[];
   loaded?: boolean;
+  markdownParsing: boolean;
 }
 
 enum DisplayType {
@@ -33,7 +35,7 @@ const tabs = [
   { label: "JSON", value: DisplayType.json, icon: <CodeIcon/> },
 ];
 
-const ExploreLogsBody: FC<ExploreLogBodyProps> = ({ data, loaded }) => {
+const ExploreLogsBody: FC<ExploreLogBodyProps> = ({ data, loaded, markdownParsing }) => {
   const { isMobile } = useDeviceDetect();
   const { timezone } = useTimeState();
   const { setSearchParamsFromKeys } = useSearchParamsFromObject();
@@ -46,11 +48,12 @@ const ExploreLogsBody: FC<ExploreLogBodyProps> = ({ data, loaded }) => {
     ...item,
     _vmui_time: item._time ? dayjs(item._time).tz().format(`${DATE_TIME_FORMAT}.SSS`) : "",
     _vmui_data: JSON.stringify(item, null, 2),
+    _vmui_markdown: marked(item._msg.replace(/```/g, "\n```\n")) as string,
   })) as Logs[], [data, timezone]);
 
   const columns = useMemo(() => {
     if (!logs?.length) return [];
-    const hideColumns = ["_vmui_data", "_vmui_time"];
+    const hideColumns = ["_vmui_data", "_vmui_time", "_vmui_markdown"];
     const keys = new Set<string>();
     for (const item of logs) {
       for (const key in item) {
@@ -125,6 +128,7 @@ const ExploreLogsBody: FC<ExploreLogBodyProps> = ({ data, loaded }) => {
               <GroupLogs
                 logs={logs}
                 columns={columns}
+                markdownParsing={markdownParsing}
               />
             )}
             {activeTab === DisplayType.json && (
diff --git a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsHeader/ExploreLogsHeader.tsx b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsHeader/ExploreLogsHeader.tsx
index 5a7c54973..aed3af35b 100644
--- a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsHeader/ExploreLogsHeader.tsx
+++ b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsHeader/ExploreLogsHeader.tsx
@@ -6,17 +6,29 @@ import useDeviceDetect from "../../../hooks/useDeviceDetect";
 import Button from "../../../components/Main/Button/Button";
 import QueryEditor from "../../../components/Configurators/QueryEditor/QueryEditor";
 import TextField from "../../../components/Main/TextField/TextField";
+import Switch from "../../../components/Main/Switch/Switch";
 
 export interface ExploreLogHeaderProps {
   query: string;
   limit: number;
   error?: string;
+  markdownParsing: boolean;
   onChange: (val: string) => void;
   onChangeLimit: (val: number) => void;
   onRun: () => void;
+  onChangeMarkdownParsing: (val: boolean) => void;
 }
 
-const ExploreLogsHeader: FC<ExploreLogHeaderProps> = ({ query, limit, error, onChange, onChangeLimit, onRun }) => {
+const ExploreLogsHeader: FC<ExploreLogHeaderProps> = ({
+  query,
+  limit,
+  error,
+  markdownParsing,
+  onChange,
+  onChangeLimit,
+  onRun,
+  onChangeMarkdownParsing,
+}) => {
   const { isMobile } = useDeviceDetect();
 
   const [errorLimit, setErrorLimit] = useState("");
@@ -66,6 +78,14 @@ const ExploreLogsHeader: FC<ExploreLogHeaderProps> = ({ query, limit, error, onC
         />
       </div>
       <div className="vm-explore-logs-header-bottom">
+        <div className="vm-explore-logs-header-bottom-contols">
+          <Switch
+            label={"Markdown parsing"}
+            value={markdownParsing}
+            onChange={onChangeMarkdownParsing}
+            fullWidth={isMobile}
+          />
+        </div>
         <div className="vm-explore-logs-header-bottom-helpful">
           <a
             className="vm-link vm-link_with-icon"
diff --git a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsHeader/style.scss b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsHeader/style.scss
index 49a439863..1bc7ab0b6 100644
--- a/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsHeader/style.scss
+++ b/app/vmui/packages/vmui/src/pages/ExploreLogs/ExploreLogsHeader/style.scss
@@ -25,6 +25,10 @@
       justify-content: normal;
     }
 
+    &-contols {
+      flex-grow: 1;
+    }
+
     &__execute {
       display: grid;
     }
diff --git a/app/vmui/packages/vmui/src/pages/ExploreLogs/GroupLogs/GroupLogs.tsx b/app/vmui/packages/vmui/src/pages/ExploreLogs/GroupLogs/GroupLogs.tsx
index 739d0c033..82983a14f 100644
--- a/app/vmui/packages/vmui/src/pages/ExploreLogs/GroupLogs/GroupLogs.tsx
+++ b/app/vmui/packages/vmui/src/pages/ExploreLogs/GroupLogs/GroupLogs.tsx
@@ -11,9 +11,10 @@ import GroupLogsItem from "./GroupLogsItem";
 interface TableLogsProps {
   logs: Logs[];
   columns: string[];
+  markdownParsing: boolean;
 }
 
-const GroupLogs: FC<TableLogsProps> = ({ logs }) => {
+const GroupLogs: FC<TableLogsProps> = ({ logs, markdownParsing }) => {
   const copyToClipboard = useCopyToClipboard();
 
   const [copied, setCopied] = useState<string | null>(null);
@@ -77,6 +78,7 @@ const GroupLogs: FC<TableLogsProps> = ({ logs }) => {
                 <GroupLogsItem
                   key={`${value._msg}${value._time}`}
                   log={value}
+                  markdownParsing={markdownParsing}
                 />
               ))}
             </div>
diff --git a/app/vmui/packages/vmui/src/pages/ExploreLogs/GroupLogs/GroupLogsItem.tsx b/app/vmui/packages/vmui/src/pages/ExploreLogs/GroupLogs/GroupLogsItem.tsx
index 7208de932..64539db0e 100644
--- a/app/vmui/packages/vmui/src/pages/ExploreLogs/GroupLogs/GroupLogsItem.tsx
+++ b/app/vmui/packages/vmui/src/pages/ExploreLogs/GroupLogs/GroupLogsItem.tsx
@@ -10,15 +10,16 @@ import classNames from "classnames";
 
 interface Props {
   log: Logs;
+  markdownParsing: boolean;
 }
 
-const GroupLogsItem: FC<Props> = ({ log }) => {
+const GroupLogsItem: FC<Props> = ({ log, markdownParsing }) => {
   const {
     value: isOpenFields,
     toggle: toggleOpenFields,
   } = useBoolean(false);
 
-  const excludeKeys = ["_stream", "_msg", "_time", "_vmui_time", "_vmui_data"];
+  const excludeKeys = ["_stream", "_msg", "_time", "_vmui_time", "_vmui_data", "_vmui_markdown"];
   const fields = Object.entries(log).filter(([key]) => !excludeKeys.includes(key));
   const hasFields = fields.length > 0;
 
@@ -71,6 +72,7 @@ const GroupLogsItem: FC<Props> = ({ log }) => {
             "vm-group-logs-row-content__msg": true,
             "vm-group-logs-row-content__msg_missing": !log._msg
           })}
+          dangerouslySetInnerHTML={markdownParsing && log._vmui_markdown ? { __html: log._vmui_markdown } : undefined}
         >
           {log._msg || "message missing"}
         </div>
diff --git a/app/vmui/packages/vmui/src/pages/ExploreLogs/GroupLogs/style.scss b/app/vmui/packages/vmui/src/pages/ExploreLogs/GroupLogs/style.scss
index 0710a3f8e..71ee06179 100644
--- a/app/vmui/packages/vmui/src/pages/ExploreLogs/GroupLogs/style.scss
+++ b/app/vmui/packages/vmui/src/pages/ExploreLogs/GroupLogs/style.scss
@@ -96,6 +96,65 @@
           font-style: italic;
           text-align: center;
         }
+
+        /* styles for markdown */
+        p, pre, code {
+          white-space: pre-wrap;
+          word-wrap: break-word;
+          word-break: normal;
+        }
+
+        code:not(pre code), pre {
+          display: inline-block;
+          background: $color-hover-black;
+          border: 1px solid $color-hover-black;
+          border-radius: $border-radius-small;
+          tab-size: 4;
+          font-variant-ligatures: none;
+          margin: calc($padding-small/4) 0;
+        }
+
+        p {
+          font-family: $font-family-global;
+          line-height: 1.4;
+        }
+
+        pre {
+          padding: $padding-small;
+        }
+
+        code {
+          font-size: $font-size-small;
+          padding: calc($padding-small / 4) calc($padding-small / 2);
+        }
+
+        a {
+          color: $color-primary;
+          cursor: pointer;
+
+          &:hover {
+            text-decoration: underline;
+          }
+        }
+
+        strong {
+          font-weight: bold;
+        }
+
+        em {
+          font-style: italic;
+        }
+
+        blockquote {
+          border-left: 4px solid $color-hover-black;
+          margin: calc($padding-small/2) $padding-small;
+          padding: calc($padding-small/2) $padding-small;
+        }
+
+        ul, ol {
+          list-style-position: inside;
+        }
+        /* end styles for markdown */
       }
     }
 
diff --git a/app/vmui/packages/vmui/src/pages/PredefinedPanels/PredefinedPanel/PredefinedPanel.tsx b/app/vmui/packages/vmui/src/pages/PredefinedPanels/PredefinedPanel/PredefinedPanel.tsx
index 268d51a93..3c2dce8e1 100644
--- a/app/vmui/packages/vmui/src/pages/PredefinedPanels/PredefinedPanel/PredefinedPanel.tsx
+++ b/app/vmui/packages/vmui/src/pages/PredefinedPanels/PredefinedPanel/PredefinedPanel.tsx
@@ -89,7 +89,7 @@ const PredefinedPanel: FC<PredefinedPanelsProps> = ({
         <>
           <div>
             <span>Description:</span>
-            <div dangerouslySetInnerHTML={{ __html: marked.parse(description) }}/>
+            <div dangerouslySetInnerHTML={{ __html: marked(description) as string }}/>
           </div>
           <hr/>
         </>
diff --git a/app/vmui/packages/vmui/src/utils/storage.ts b/app/vmui/packages/vmui/src/utils/storage.ts
index 995cf7772..7c5ee7109 100644
--- a/app/vmui/packages/vmui/src/utils/storage.ts
+++ b/app/vmui/packages/vmui/src/utils/storage.ts
@@ -7,6 +7,7 @@ export type StorageKeys = "AUTOCOMPLETE"
     | "DISABLED_DEFAULT_TIMEZONE"
     | "THEME"
     | "LOGS_LIMIT"
+    | "LOGS_MARKDOWN"
     | "EXPLORE_METRICS_TIPS"
     | "QUERY_HISTORY"
     | "QUERY_FAVORITES"
diff --git a/deployment/docker/alerts-vmalert.yml b/deployment/docker/alerts-vmalert.yml
index bae602201..af7895da3 100644
--- a/deployment/docker/alerts-vmalert.yml
+++ b/deployment/docker/alerts-vmalert.yml
@@ -40,7 +40,7 @@ groups:
             Check vmalert's logs for detailed error message."
 
       - alert: RecordingRulesNoData
-        expr: sum(vmalert_recording_rules_last_evaluation_samples) without(recording, id) < 1
+        expr: sum(vmalert_recording_rules_last_evaluation_samples) without(id) < 1
         for: 30m
         labels:
           severity: info
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 87d26420d..0f617fc91 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -30,10 +30,12 @@ See also [LTS releases](https://docs.victoriametrics.com/lts-releases/).
 
 ## tip
 
-**Update note 1: the `--vm-disable-progress-bar` command-line flag at `vmctl` is deprecated and will be removed in the future releases. Use `--disable-progress-bar` instead.**
+**Update note 1: the `--vm-disable-progress-bar` command-line flag at `vmctl` was deprecated. Use `--disable-progress-bar` instead.**
 
 * FEATURE: [alerts-vmagent](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/deployment/docker/alerts-vmagent.yml): add new alerting rules `StreamAggrFlushTimeout` and `StreamAggrDedupFlushTimeout` to notify about issues during stream aggregation.
 * FEATURE: [dashboards/vmagent](https://grafana.com/grafana/dashboards/12683): add row `Streaming aggregation` with panels related to [streaming aggregation](https://docs.victoriametrics.com/stream-aggregation/) process.
+* FEATURE: [vmauth](https://docs.victoriametrics.com/vmauth/): add `idleConnTimeout` flag set to 50s by default. It should reduce the probability of `broken pipe` or `connection reset by peer` errors in vmauth logs.
+* FEATURE: [vmauth](https://docs.victoriametrics.com/vmauth/): add auto request retry for trivial network errors, such as `broken pipe` and `connection reset` for requests to the configured backends.
 
 * BUGFIX: all VictoriaMetrics components: prioritize `-configAuthKey` and `-reloadAuthKey` over `-httpAuth.*` settings. This change aligns behavior of mentioned flags with other auth flags like `-metricsAuthKey`, `-flagsAuthKey`, `-pprofAuthKey`. Check [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6329).
 * BUGFIX: [vmctl](https://docs.victoriametrics.com/vmctl/): add `--disable-progress-bar` global command-line flag. It can be used for disabling dynamic progress bar for all migration modes. `--vm-disable-progress-bar`  command-line flag is deprecated and will be removed in the future releases. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6367).
diff --git a/docs/VictoriaLogs/CHANGELOG.md b/docs/VictoriaLogs/CHANGELOG.md
index 89fa29625..acc752f8e 100644
--- a/docs/VictoriaLogs/CHANGELOG.md
+++ b/docs/VictoriaLogs/CHANGELOG.md
@@ -19,6 +19,8 @@ according to [these docs](https://docs.victoriametrics.com/victorialogs/quicksta
 
 ## tip
 
+* FEATURE: [web UI](https://docs.victoriametrics.com/VictoriaLogs/querying/#web-ui): add markdown support to the `Group` view. See [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/6292).
+
 ## [v0.18.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v0.18.0-victorialogs)
 
 Released at 2024-06-06
diff --git a/docs/vmauth.md b/docs/vmauth.md
index 798fc0ff5..7956b694a 100644
--- a/docs/vmauth.md
+++ b/docs/vmauth.md
@@ -1206,6 +1206,8 @@ See the docs at https://docs.victoriametrics.com/vmauth/ .
      Whether to use proxy protocol for connections accepted at the corresponding -httpListenAddr . See https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt . With enabled proxy protocol http server cannot serve regular /metrics endpoint. Use -pushmetrics.url for metrics pushing
      Supports array of values separated by comma or specified via multiple flags.
      Empty values are set to false.
+  -idleConnTimeout duration
+    Defines a duration for idle (keep-alive connections) to exist. Consider setting this value less than "-http.idleConnTimeout". It must prevent possible "write: broken pipe" and "read: connection reset by peer" errors. (default 50s)
   -internStringCacheExpireDuration duration
      The expiry duration for caches for interned strings. See https://en.wikipedia.org/wiki/String_interning . See also -internStringMaxLen and -internStringDisableCache (default 6m0s)
   -internStringDisableCache
diff --git a/lib/streamaggr/dedup.go b/lib/streamaggr/dedup.go
index 399e9a3dc..f419311d0 100644
--- a/lib/streamaggr/dedup.go
+++ b/lib/streamaggr/dedup.go
@@ -1,11 +1,14 @@
 package streamaggr
 
 import (
+	"strings"
 	"sync"
+	"sync/atomic"
 	"unsafe"
 
-	"github.com/VictoriaMetrics/VictoriaMetrics/lib/bytesutil"
 	"github.com/cespare/xxhash/v2"
+
+	"github.com/VictoriaMetrics/VictoriaMetrics/lib/bytesutil"
 )
 
 const dedupAggrShardsCount = 128
@@ -24,7 +27,10 @@ type dedupAggrShard struct {
 
 type dedupAggrShardNopad struct {
 	mu sync.Mutex
-	m  map[string]dedupAggrSample
+	m  map[string]*dedupAggrSample
+
+	sizeBytes  atomic.Uint64
+	itemsCount atomic.Uint64
 }
 
 type dedupAggrSample struct {
@@ -42,7 +48,7 @@ func newDedupAggr() *dedupAggr {
 func (da *dedupAggr) sizeBytes() uint64 {
 	n := uint64(unsafe.Sizeof(*da))
 	for i := range da.shards {
-		n += da.shards[i].sizeBytes()
+		n += da.shards[i].sizeBytes.Load()
 	}
 	return n
 }
@@ -50,25 +56,8 @@ func (da *dedupAggr) sizeBytes() uint64 {
 func (da *dedupAggr) itemsCount() uint64 {
 	n := uint64(0)
 	for i := range da.shards {
-		n += da.shards[i].itemsCount()
-	}
-	return n
-}
-
-func (das *dedupAggrShard) sizeBytes() uint64 {
-	das.mu.Lock()
-	n := uint64(unsafe.Sizeof(*das))
-	for k, s := range das.m {
-		n += uint64(len(k)) + uint64(unsafe.Sizeof(k)+unsafe.Sizeof(s))
+		n += da.shards[i].itemsCount.Load()
 	}
-	das.mu.Unlock()
-	return n
-}
-
-func (das *dedupAggrShard) itemsCount() uint64 {
-	das.mu.Lock()
-	n := uint64(len(das.m))
-	das.mu.Unlock()
 	return n
 }
 
@@ -113,7 +102,7 @@ func (ctx *dedupFlushCtx) reset() {
 	ctx.samples = ctx.samples[:0]
 }
 
-func (da *dedupAggr) flush(f func(samples []pushSample), resetState bool) {
+func (da *dedupAggr) flush(f func(samples []pushSample)) {
 	var wg sync.WaitGroup
 	for i := range da.shards {
 		flushConcurrencyCh <- struct{}{}
@@ -125,7 +114,7 @@ func (da *dedupAggr) flush(f func(samples []pushSample), resetState bool) {
 			}()
 
 			ctx := getDedupFlushCtx()
-			shard.flush(ctx, f, resetState)
+			shard.flush(ctx, f)
 			putDedupFlushCtx(ctx)
 		}(&da.shards[i])
 	}
@@ -169,36 +158,37 @@ func (das *dedupAggrShard) pushSamples(samples []pushSample) {
 
 	m := das.m
 	if m == nil {
-		m = make(map[string]dedupAggrSample, len(samples))
+		m = make(map[string]*dedupAggrSample, len(samples))
 		das.m = m
 	}
 	for _, sample := range samples {
 		s, ok := m[sample.key]
 		if !ok {
-			key := bytesutil.InternString(sample.key)
-			m[key] = dedupAggrSample{
+			key := strings.Clone(sample.key)
+			m[key] = &dedupAggrSample{
 				value:     sample.value,
 				timestamp: sample.timestamp,
 			}
+			das.itemsCount.Add(1)
+			das.sizeBytes.Add(uint64(len(key)) + uint64(unsafe.Sizeof(key)+unsafe.Sizeof(s)))
 			continue
 		}
 		// Update the existing value according to logic described at https://docs.victoriametrics.com/#deduplication
 		if sample.timestamp > s.timestamp || (sample.timestamp == s.timestamp && sample.value > s.value) {
-			key := bytesutil.InternString(sample.key)
-			m[key] = dedupAggrSample{
-				value:     sample.value,
-				timestamp: sample.timestamp,
-			}
+			s.value = sample.value
+			s.timestamp = sample.timestamp
 		}
 	}
 }
 
-func (das *dedupAggrShard) flush(ctx *dedupFlushCtx, f func(samples []pushSample), resetState bool) {
+func (das *dedupAggrShard) flush(ctx *dedupFlushCtx, f func(samples []pushSample)) {
 	das.mu.Lock()
 
 	m := das.m
-	if resetState && len(m) > 0 {
-		das.m = make(map[string]dedupAggrSample, len(m))
+	if len(m) > 0 {
+		das.m = make(map[string]*dedupAggrSample, len(m))
+		das.sizeBytes.Store(0)
+		das.itemsCount.Store(0)
 	}
 
 	das.mu.Unlock()
@@ -216,7 +206,7 @@ func (das *dedupAggrShard) flush(ctx *dedupFlushCtx, f func(samples []pushSample
 		})
 
 		// Limit the number of samples per each flush in order to limit memory usage.
-		if len(dstSamples) >= 100_000 {
+		if len(dstSamples) >= 10_000 {
 			f(dstSamples)
 			clear(dstSamples)
 			dstSamples = dstSamples[:0]
diff --git a/lib/streamaggr/deduplicator.go b/lib/streamaggr/deduplicator.go
index 3ec25f5fa..0212bfd9e 100644
--- a/lib/streamaggr/deduplicator.go
+++ b/lib/streamaggr/deduplicator.go
@@ -166,7 +166,7 @@ func (d *Deduplicator) flush(pushFunc PushFunc, dedupInterval time.Duration) {
 		ctx.labels = labels
 		ctx.samples = samples
 		putDeduplicatorFlushCtx(ctx)
-	}, true)
+	})
 
 	duration := time.Since(startTime)
 	d.dedupFlushDuration.Update(duration.Seconds())
diff --git a/lib/streamaggr/streamaggr.go b/lib/streamaggr/streamaggr.go
index 92fdba57a..34ad118cf 100644
--- a/lib/streamaggr/streamaggr.go
+++ b/lib/streamaggr/streamaggr.go
@@ -747,7 +747,7 @@ func (a *aggregator) dedupFlush(dedupInterval time.Duration) {
 
 	startTime := time.Now()
 
-	a.da.flush(a.pushSamples, true)
+	a.da.flush(a.pushSamples)
 
 	d := time.Since(startTime)
 	a.dedupFlushDuration.Update(d.Seconds())


Test patch:
diff --git a/lib/streamaggr/dedup_test.go b/lib/streamaggr/dedup_test.go
index f0b4cc951..38e03678b 100644
--- a/lib/streamaggr/dedup_test.go
+++ b/lib/streamaggr/dedup_test.go
@@ -39,7 +39,7 @@ func TestDedupAggrSerial(t *testing.T) {
 		}
 		mu.Unlock()
 	}
-	da.flush(flushSamples, true)
+	da.flush(flushSamples)
 
 	if !reflect.DeepEqual(expectedSamplesMap, flushedSamplesMap) {
 		t.Fatalf("unexpected samples;\ngot\n%v\nwant\n%v", flushedSamplesMap, expectedSamplesMap)
diff --git a/lib/streamaggr/dedup_timing_test.go b/lib/streamaggr/dedup_timing_test.go
index abb1d0451..d7a05aa64 100644
--- a/lib/streamaggr/dedup_timing_test.go
+++ b/lib/streamaggr/dedup_timing_test.go
@@ -4,7 +4,6 @@ import (
 	"fmt"
 	"sync/atomic"
 	"testing"
-	"time"
 
 	"github.com/VictoriaMetrics/VictoriaMetrics/lib/prompbmarshal"
 )
@@ -17,20 +16,6 @@ func BenchmarkDedupAggr(b *testing.B) {
 	}
 }
 
-func BenchmarkDedupAggrFlushSerial(b *testing.B) {
-	as := newTotalAggrState(time.Hour, true, true)
-	benchSamples := newBenchSamples(100_000)
-	da := newDedupAggr()
-	da.pushSamples(benchSamples)
-
-	b.ResetTimer()
-	b.ReportAllocs()
-	b.SetBytes(int64(len(benchSamples)))
-	for i := 0; i < b.N; i++ {
-		da.flush(as.pushSamples, false)
-	}
-}
-
 func benchmarkDedupAggr(b *testing.B, samplesPerPush int) {
 	const loops = 100
 	benchSamples := newBenchSamples(samplesPerPush)