diff --git a/.gitignore b/.gitignore index 5f6725db..e91866ed 100644 --- a/.gitignore +++ b/.gitignore @@ -57,6 +57,7 @@ ui_*.h # Vim *.swp *.swo +*.swn #####=== CMake ===##### diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b5bffd7..e8570c77 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -241,17 +241,13 @@ set(SRC_FILES src/dialogs/RoomSettings.cpp # Emoji - src/emoji/Category.cpp src/emoji/EmojiModel.cpp - src/emoji/ItemDelegate.cpp - src/emoji/Panel.cpp - src/emoji/PickButton.cpp - src/emoji/Provider.cpp src/emoji/Provider_new.cpp # Timeline src/timeline/EventStore.cpp + src/timeline/InputBar.cpp src/timeline/Reaction.cpp src/timeline/TimelineViewManager.cpp src/timeline/TimelineModel.cpp @@ -261,22 +257,23 @@ set(SRC_FILES src/ui/Avatar.cpp src/ui/Badge.cpp src/ui/DropShadow.cpp - src/ui/LoadingIndicator.cpp - src/ui/InfoMessage.cpp src/ui/FlatButton.cpp src/ui/FloatingButton.cpp + src/ui/InfoMessage.cpp src/ui/Label.cpp + src/ui/LoadingIndicator.cpp + src/ui/NhekoDropArea.cpp src/ui/OverlayModal.cpp - src/ui/SnackBar.cpp + src/ui/OverlayWidget.cpp src/ui/RaisedButton.cpp src/ui/Ripple.cpp src/ui/RippleOverlay.cpp - src/ui/OverlayWidget.cpp + src/ui/SnackBar.cpp src/ui/TextField.cpp src/ui/TextLabel.cpp - src/ui/ToggleButton.cpp src/ui/Theme.cpp src/ui/ThemeManager.cpp + src/ui/ToggleButton.cpp src/ui/UserProfile.cpp src/AvatarProvider.cpp @@ -287,6 +284,7 @@ set(SRC_FILES src/ColorImageProvider.cpp src/CommunitiesList.cpp src/CommunitiesListItem.cpp + src/CompletionProxyModel.cpp src/DeviceVerificationFlow.cpp src/EventAccessors.cpp src/InviteeItem.cpp @@ -303,10 +301,10 @@ set(SRC_FILES src/SSOHandler.cpp src/SideBarActions.cpp src/Splitter.cpp - src/TextInputWidget.cpp src/TrayIcon.cpp src/UserInfoWidget.cpp src/UserSettingsPage.cpp + src/UsersModel.cpp src/Utils.cpp src/WebRTCSession.cpp src/WelcomePage.cpp @@ -454,15 +452,12 @@ qt5_wrap_cpp(MOC_HEADERS src/dialogs/RoomSettings.h # Emoji - src/emoji/Category.h src/emoji/EmojiModel.h - src/emoji/ItemDelegate.h - src/emoji/Panel.h - src/emoji/PickButton.h src/emoji/Provider.h # Timeline src/timeline/EventStore.h + src/timeline/InputBar.h src/timeline/Reaction.h src/timeline/TimelineViewManager.h src/timeline/TimelineModel.h @@ -477,6 +472,7 @@ qt5_wrap_cpp(MOC_HEADERS src/ui/Label.h src/ui/FloatingButton.h src/ui/Menu.h + src/ui/NhekoDropArea.h src/ui/OverlayWidget.h src/ui/SnackBar.h src/ui/RaisedButton.h @@ -498,6 +494,7 @@ qt5_wrap_cpp(MOC_HEADERS src/ChatPage.h src/CommunitiesList.h src/CommunitiesListItem.h + src/CompletionProxyModel.h src/DeviceVerificationFlow.h src/InviteeItem.h src/LoginPage.h @@ -510,10 +507,10 @@ qt5_wrap_cpp(MOC_HEADERS src/SSOHandler.h src/SideBarActions.h src/Splitter.h - src/TextInputWidget.h src/TrayIcon.h src/UserInfoWidget.h src/UserSettingsPage.h + src/UsersModel.h src/WebRTCSession.h src/WelcomePage.h src/popups/PopupItem.h diff --git a/resources/qml/ActiveCallBar.qml b/resources/qml/ActiveCallBar.qml index f68c531e..9bbac632 100644 --- a/resources/qml/ActiveCallBar.qml +++ b/resources/qml/ActiveCallBar.qml @@ -12,8 +12,11 @@ Rectangle { MouseArea { anchors.fill: parent - onClicked: if (TimelineManager.onVideoCall) - stackLayout.currentIndex = stackLayout.currentIndex ? 0 : 1; + onClicked: { + if (TimelineManager.onVideoCall) + stackLayout.currentIndex = stackLayout.currentIndex ? 0 : 1; + + } } RowLayout { @@ -39,8 +42,7 @@ Rectangle { Image { Layout.preferredWidth: 24 Layout.preferredHeight: 24 - source: TimelineManager.onVideoCall ? - "qrc:/icons/icons/ui/video-call.png" : "qrc:/icons/icons/ui/place-call.png" + source: TimelineManager.onVideoCall ? "qrc:/icons/icons/ui/video-call.png" : "qrc:/icons/icons/ui/place-call.png" } Label { diff --git a/resources/qml/Completer.qml b/resources/qml/Completer.qml new file mode 100644 index 00000000..9703da64 --- /dev/null +++ b/resources/qml/Completer.qml @@ -0,0 +1,178 @@ +import QtQuick 2.9 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.2 +import im.nheko 1.0 + +Popup { + id: popup + + property int currentIndex: -1 + property string completerName + property var completer + property bool bottomToTop: true + + signal completionClicked(string completion) + + function up() { + if (bottomToTop) + down_(); + else + up_(); + } + + function down() { + if (bottomToTop) + up_(); + else + down_(); + } + + function up_() { + currentIndex = currentIndex - 1; + if (currentIndex == -2) + currentIndex = listView.count - 1; + + } + + function down_() { + currentIndex = currentIndex + 1; + if (currentIndex >= listView.count) + currentIndex = -1; + + } + + function currentCompletion() { + if (currentIndex > -1 && currentIndex < listView.count) + return completer.completionAt(currentIndex); + else + return null; + } + + onCompleterNameChanged: { + if (completerName) { + completer = TimelineManager.timeline.input.completerFor(completerName); + completer.setSearchString(""); + } else { + completer = undefined; + } + } + padding: 0 + onAboutToShow: currentIndex = -1 + height: listView.contentHeight + + Connections { + onTimelineChanged: completer = null + target: TimelineManager + } + + ListView { + id: listView + + anchors.fill: parent + implicitWidth: contentItem.childrenRect.width + model: completer + verticalLayoutDirection: popup.bottomToTop ? ListView.BottomToTop : ListView.TopToBottom + + delegate: Rectangle { + color: model.index == popup.currentIndex ? colors.highlight : colors.base + height: chooser.childrenRect.height + 4 + implicitWidth: chooser.childrenRect.width + 4 + + MouseArea { + anchors.fill: parent + hoverEnabled: true + onEntered: popup.currentIndex = model.index + onClicked: popup.completionClicked(completer.completionAt(model.index)) + } + + DelegateChooser { + id: chooser + + roleValue: popup.completerName + anchors.centerIn: parent + + DelegateChoice { + roleValue: "user" + + RowLayout { + id: del + + anchors.centerIn: parent + + Avatar { + height: 24 + width: 24 + displayName: model.displayName + url: model.avatarUrl.replace("mxc://", "image://MxcImage/") + } + + Label { + text: model.displayName + color: model.index == popup.currentIndex ? colors.highlightedText : colors.text + } + + Label { + text: "(" + model.userid + ")" + color: model.index == popup.currentIndex ? colors.highlightedText : colors.buttonText + } + + } + + } + + DelegateChoice { + roleValue: "emoji" + + RowLayout { + id: del + + anchors.centerIn: parent + + Label { + text: model.unicode + color: model.index == popup.currentIndex ? colors.highlightedText : colors.text + font: Settings.emojiFont + } + + Label { + text: model.shortName + color: model.index == popup.currentIndex ? colors.highlightedText : colors.text + } + + } + + } + + } + + } + + } + + enter: Transition { + NumberAnimation { + property: "opacity" + from: 0 + to: 1 + duration: 100 + } + + } + + exit: Transition { + NumberAnimation { + property: "opacity" + from: 1 + to: 0 + duration: 100 + } + + } + + background: Rectangle { + color: colors.base + implicitHeight: popup.contentHeight + implicitWidth: popup.contentWidth + } + +} diff --git a/resources/qml/ImageButton.qml b/resources/qml/ImageButton.qml index 49ddf671..4ebda680 100644 --- a/resources/qml/ImageButton.qml +++ b/resources/qml/ImageButton.qml @@ -8,6 +8,7 @@ AbstractButton { property color highlightColor: colors.highlight property color buttonTextColor: colors.buttonText + focusPolicy: Qt.NoFocus width: 16 height: 16 diff --git a/resources/qml/MatrixText.qml b/resources/qml/MatrixText.qml index a5781c73..bb3b4296 100644 --- a/resources/qml/MatrixText.qml +++ b/resources/qml/MatrixText.qml @@ -5,6 +5,7 @@ import im.nheko 1.0 TextEdit { textFormat: TextEdit.RichText readOnly: true + focus: false wrapMode: Text.Wrap selectByMouse: !Settings.mobileMode color: colors.text diff --git a/resources/qml/MessageInput.qml b/resources/qml/MessageInput.qml index 71da9cae..ae95cbb6 100644 --- a/resources/qml/MessageInput.qml +++ b/resources/qml/MessageInput.qml @@ -2,6 +2,7 @@ import QtQuick 2.9 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.2 import QtQuick.Window 2.2 +import im.nheko 1.0 Rectangle { color: colors.window @@ -16,14 +17,18 @@ Rectangle { spacing: 16 ImageButton { + visible: TimelineManager.callsSupported Layout.alignment: Qt.AlignBottom hoverEnabled: true width: 22 height: 22 - image: ":/icons/icons/ui/place-call.png" + image: TimelineManager.isOnCall ? ":/icons/icons/ui/end-call.png" : ":/icons/icons/ui/place-call.png" + ToolTip.visible: hovered + ToolTip.text: TimelineManager.isOnCall ? qsTr("Hang up") : qsTr("Place a call") Layout.topMargin: 8 Layout.bottomMargin: 8 Layout.leftMargin: 16 + onClicked: TimelineManager.timeline.input.callButton() } ImageButton { @@ -34,6 +39,23 @@ Rectangle { image: ":/icons/icons/ui/paper-clip-outline.png" Layout.topMargin: 8 Layout.bottomMargin: 8 + Layout.leftMargin: TimelineManager.callsSupported ? 0 : 16 + onClicked: TimelineManager.timeline.input.openFileSelection() + ToolTip.visible: hovered + ToolTip.text: qsTr("Send a file") + + Rectangle { + anchors.fill: parent + color: colors.window + visible: TimelineManager.timeline.input.uploading + + NhekoBusyIndicator { + anchors.fill: parent + running: parent.visible + } + + } + } ScrollView { @@ -44,16 +66,145 @@ Rectangle { Layout.fillWidth: true TextArea { + id: textArea + + property int completerTriggeredAt: -1 + + function insertCompletion(completion) { + textArea.remove(completerTriggeredAt, cursorPosition); + textArea.insert(cursorPosition, completion); + } + + function openCompleter(pos, type) { + completerTriggeredAt = pos; + popup.completerName = type; + popup.open(); + popup.completer.setSearchString(textArea.getText(completerTriggeredAt, cursorPosition)); + } + placeholderText: qsTr("Write a message...") placeholderTextColor: colors.buttonText color: colors.text wrapMode: TextEdit.Wrap + focus: true + onTextChanged: TimelineManager.timeline.input.updateState(selectionStart, selectionEnd, cursorPosition, text) + onCursorPositionChanged: { + TimelineManager.timeline.input.updateState(selectionStart, selectionEnd, cursorPosition, text); + if (cursorPosition <= completerTriggeredAt) { + completerTriggeredAt = -1; + popup.close(); + } + if (popup.opened) + popup.completer.setSearchString(textArea.getText(completerTriggeredAt, cursorPosition)); + + } + onSelectionStartChanged: TimelineManager.timeline.input.updateState(selectionStart, selectionEnd, cursorPosition, text) + onSelectionEndChanged: TimelineManager.timeline.input.updateState(selectionStart, selectionEnd, cursorPosition, text) + // Ensure that we get escape key press events first. + Keys.onShortcutOverride: event.accepted = (completerTriggeredAt != -1 && (event.key === Qt.Key_Escape || event.key === Qt.Key_Tab || event.key === Qt.Key_Enter)) + Keys.onPressed: { + if (event.matches(StandardKey.Paste)) { + TimelineManager.timeline.input.paste(false); + event.accepted = true; + } else if (event.modifiers == Qt.ControlModifier && event.key == Qt.Key_U) { + textArea.clear(); + } else if (event.modifiers == Qt.ControlModifier && event.key == Qt.Key_P) { + textArea.text = TimelineManager.timeline.input.previousText(); + } else if (event.modifiers == Qt.ControlModifier && event.key == Qt.Key_N) { + textArea.text = TimelineManager.timeline.input.nextText(); + } else if (event.key == Qt.Key_At) { + textArea.openCompleter(cursorPosition, "user"); + popup.open(); + } else if (event.key == Qt.Key_Colon) { + textArea.openCompleter(cursorPosition, "emoji"); + popup.open(); + } else if (event.key == Qt.Key_Escape && popup.opened) { + completerTriggeredAt = -1; + popup.completerName = ""; + event.accepted = true; + popup.close(); + } else if (event.matches(StandardKey.InsertParagraphSeparator)) { + if (popup.opened) { + var currentCompletion = popup.currentCompletion(); + popup.completerName = ""; + popup.close(); + if (currentCompletion) { + textArea.insertCompletion(currentCompletion); + event.accepted = true; + return ; + } + } + TimelineManager.timeline.input.send(); + textArea.clear(); + event.accepted = true; + } else if (event.key == Qt.Key_Tab) { + event.accepted = true; + if (popup.opened) { + popup.up(); + } else { + var pos = cursorPosition - 1; + while (pos > -1) { + var t = textArea.getText(pos, pos + 1); + console.log('"' + t + '"'); + if (t == '@' || t == ' ' || t == '\t') { + textArea.openCompleter(pos, "user"); + return ; + } else if (t == ':') { + textArea.openCompleter(pos, "emoji"); + return ; + } + pos = pos - 1; + } + // At start of input + textArea.openCompleter(0, "user"); + } + } else if (event.key == Qt.Key_Up && popup.opened) { + event.accepted = true; + popup.up(); + } else if (event.key == Qt.Key_Down && popup.opened) { + event.accepted = true; + popup.down(); + } + } + + Connections { + onTimelineChanged: { + textArea.clear(); + textArea.append(TimelineManager.timeline.input.text()); + textArea.completerTriggeredAt = -1; + popup.completerName = ""; + } + target: TimelineManager + } + + Connections { + onCompletionClicked: textArea.insertCompletion(completion) + target: popup + } + + Completer { + id: popup + + x: textArea.positionToRectangle(textArea.completerTriggeredAt).x + y: textArea.positionToRectangle(textArea.completerTriggeredAt).y - height + } + + Connections { + onInsertText: textArea.insert(textArea.cursorPosition, text) + target: TimelineManager.timeline.input + } MouseArea { // workaround for wrong cursor shape on some platforms anchors.fill: parent - acceptedButtons: Qt.NoButton + acceptedButtons: Qt.MiddleButton cursorShape: Qt.IBeamCursor + onClicked: TimelineManager.timeline.input.paste(true) + } + + NhekoDropArea { + anchors.fill: parent + roomid: TimelineManager.timeline.roomId() } background: Rectangle { @@ -65,6 +216,8 @@ Rectangle { } ImageButton { + id: emojiButton + Layout.alignment: Qt.AlignRight | Qt.AlignBottom hoverEnabled: true width: 22 @@ -72,6 +225,11 @@ Rectangle { image: ":/icons/icons/ui/smile.png" Layout.topMargin: 8 Layout.bottomMargin: 8 + ToolTip.visible: hovered + ToolTip.text: qsTr("Emoji") + onClicked: emojiPopup.visible ? emojiPopup.close() : emojiPopup.show(emojiButton, function(emoji) { + textArea.insert(textArea.cursorPosition, emoji); + }) } ImageButton { @@ -83,6 +241,12 @@ Rectangle { Layout.topMargin: 8 Layout.bottomMargin: 8 Layout.rightMargin: 16 + ToolTip.visible: hovered + ToolTip.text: qsTr("Send") + onClicked: { + TimelineManager.timeline.input.send(); + textArea.clear(); + } } } diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml index bc0acfa4..679c1f50 100644 --- a/resources/qml/MessageView.qml +++ b/resources/qml/MessageView.qml @@ -28,6 +28,7 @@ ListView { ScrollHelper { flickable: parent anchors.fill: parent + enabled: !Settings.mobileMode } Shortcut { @@ -181,7 +182,6 @@ ListView { Connections { target: chat - onMovementEnded: { if (y + height + 2 * chat.spacing > chat.contentY + chat.height && y < chat.contentY + chat.height) chat.model.currentIndex = index; diff --git a/resources/qml/NhekoBusyIndicator.qml b/resources/qml/NhekoBusyIndicator.qml new file mode 100644 index 00000000..89a40dd5 --- /dev/null +++ b/resources/qml/NhekoBusyIndicator.qml @@ -0,0 +1,64 @@ +import QtQuick 2.9 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.2 + +BusyIndicator { + id: control + + contentItem: Item { + implicitWidth: 64 + implicitHeight: 64 + + Item { + id: item + + height: Math.min(parent.height, parent.width) + width: height + opacity: control.running ? 1 : 0 + + RotationAnimator { + target: item + running: control.visible && control.running + from: 0 + to: 360 + loops: Animation.Infinite + duration: 2000 + } + + Repeater { + id: repeater + + model: 6 + + Rectangle { + implicitWidth: radius * 2 + implicitHeight: radius * 2 + radius: item.height / 6 + color: colors.text + opacity: (index + 2) / (repeater.count + 2) + transform: [ + Translate { + y: -Math.min(item.width, item.height) * 0.5 + item.height / 6 + }, + Rotation { + angle: index / repeater.count * 360 + origin.x: item.height / 2 + origin.y: item.height / 2 + } + ] + } + + } + + Behavior on opacity { + OpacityAnimator { + duration: 250 + } + + } + + } + + } + +} diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml index 95143b18..4234bb6d 100644 --- a/resources/qml/TimelineView.qml +++ b/resources/qml/TimelineView.qml @@ -72,7 +72,9 @@ Page { MenuItem { text: qsTr("React") - onClicked: emojiPopup.show(messageContextMenu.parent, messageContextMenu.eventId) + onClicked: emojiPopup.show(messageContextMenu.parent, function(emoji) { + TimelineManager.queueReactionMessage(messageContextMenu.eventId, emoji); + }) } MenuItem { @@ -95,6 +97,7 @@ Page { } MenuItem { + // TODO(Nico): Fix this still being iterated over, when using keyboard to select options visible: messageContextMenu.isEncrypted height: visible ? implicitHeight : 0 text: qsTr("View decrypted raw message") @@ -129,7 +132,6 @@ Page { Connections { target: TimelineManager - onNewDeviceVerificationRequest: { var dialog = deviceVerificationDialog.createObject(timelineRoot, { "flow": flow @@ -140,7 +142,6 @@ Page { Connections { target: TimelineManager.timeline - onOpenProfile: { var userProfile = userProfileComponent.createObject(timelineRoot, { "profile": profile @@ -192,13 +193,15 @@ Page { StackLayout { id: stackLayout + currentIndex: 0 Connections { - target: TimelineManager function onActiveTimelineChanged() { stackLayout.currentIndex = 0; } + + target: TimelineManager } MessageView { @@ -210,6 +213,7 @@ Page { source: TimelineManager.onVideoCall ? "VideoCall.qml" : "" onLoaded: TimelineManager.setVideoCallItem() } + } TypingIndicator { @@ -234,8 +238,8 @@ Page { ReplyPopup { } - //MessageInput { - //} + MessageInput { + } } diff --git a/resources/qml/VideoCall.qml b/resources/qml/VideoCall.qml index 69fc1a2b..14408b6e 100644 --- a/resources/qml/VideoCall.qml +++ b/resources/qml/VideoCall.qml @@ -1,7 +1,6 @@ import QtQuick 2.9 - import org.freedesktop.gstreamer.GLVideoItem 1.0 GstGLVideoItem { - objectName: "videoCallItem" + objectName: "videoCallItem" } diff --git a/resources/qml/emoji/EmojiButton.qml b/resources/qml/emoji/EmojiButton.qml index 1fcfc0c5..928d6226 100644 --- a/resources/qml/emoji/EmojiButton.qml +++ b/resources/qml/emoji/EmojiButton.qml @@ -12,5 +12,7 @@ ImageButton { property string event_id image: ":/icons/icons/ui/smile.png" - onClicked: emojiPicker.visible ? emojiPicker.close() : emojiPicker.show(emojiButton, event_id) + onClicked: emojiPicker.visible ? emojiPicker.close() : emojiPicker.show(emojiButton, function(emoji) { + TimelineManager.queueReactionMessage(event_id, emoji); + }) } diff --git a/resources/qml/emoji/EmojiPicker.qml b/resources/qml/emoji/EmojiPicker.qml index afe16350..e0e1ceaf 100644 --- a/resources/qml/emoji/EmojiPicker.qml +++ b/resources/qml/emoji/EmojiPicker.qml @@ -9,7 +9,7 @@ import im.nheko.EmojiModel 1.0 Popup { id: emojiPopup - property string event_id + property var callback property var colors property alias model: gridView.model property var textArea @@ -18,14 +18,14 @@ Popup { property real highlightSat: colors.highlight.hslSaturation property real highlightLight: colors.highlight.hslLightness - function show(showAt, event_id) { - console.debug("Showing emojiPicker for " + event_id); + function show(showAt, callback) { + console.debug("Showing emojiPicker"); if (showAt) { parent = showAt; x = Math.round((showAt.width - width) / 2); y = showAt.height; } - emojiPopup.event_id = event_id; + emojiPopup.callback = callback; open(); } @@ -70,9 +70,9 @@ Popup { ToolTip.visible: hovered // TODO: maybe add favorites at some point? onClicked: { - console.debug("Picked " + model.unicode + "in response to " + emojiPopup.event_id); + console.debug("Picked " + model.unicode); emojiPopup.close(); - TimelineManager.queueReactionMessage(emojiPopup.event_id, model.unicode); + callback(model.unicode); } // give the emoji a little oomf diff --git a/resources/res.qrc b/resources/res.qrc index efb9c907..a01907ec 100644 --- a/resources/res.qrc +++ b/resources/res.qrc @@ -123,20 +123,22 @@ qtquickcontrols2.conf qml/TimelineView.qml - qml/TopBar.qml - qml/MessageView.qml - qml/MessageInput.qml - qml/TypingIndicator.qml - qml/ReplyPopup.qml qml/ActiveCallBar.qml qml/Avatar.qml + qml/Completer.qml + qml/EncryptionIndicator.qml qml/ImageButton.qml qml/MatrixText.qml - qml/StatusIndicator.qml - qml/EncryptionIndicator.qml + qml/MessageInput.qml + qml/MessageView.qml + qml/NhekoBusyIndicator.qml qml/Reactions.qml + qml/ReplyPopup.qml qml/ScrollHelper.qml + qml/StatusIndicator.qml qml/TimelineRow.qml + qml/TopBar.qml + qml/TypingIndicator.qml qml/VideoCall.qml qml/emoji/EmojiButton.qml qml/emoji/EmojiPicker.qml diff --git a/src/Cache.cpp b/src/Cache.cpp index b37f69b3..3a6b0ca9 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -85,8 +85,6 @@ constexpr auto OUTBOUND_MEGOLM_SESSIONS_DB("outbound_megolm_sessions"); using CachedReceipts = std::multimap>; using Receipts = std::map>; -Q_DECLARE_METATYPE(SearchResult) -Q_DECLARE_METATYPE(std::vector) Q_DECLARE_METATYPE(RoomMember) Q_DECLARE_METATYPE(mtx::responses::Timeline) Q_DECLARE_METATYPE(RoomSearchResult) @@ -2334,39 +2332,6 @@ Cache::searchRooms(const std::string &query, std::uint8_t max_items) return results; } -std::vector -Cache::searchUsers(const std::string &room_id, const std::string &query, std::uint8_t max_items) -{ - std::multimap> items; - - auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY); - auto cursor = lmdb::cursor::open(txn, getMembersDb(txn, room_id)); - - std::string user_id, user_data; - while (cursor.get(user_id, user_data, MDB_NEXT)) { - const auto display_name = displayName(room_id, user_id); - const int score = utils::levenshtein_distance(query, display_name); - - items.emplace(score, std::make_pair(user_id, display_name)); - } - - auto end = items.begin(); - - if (items.size() >= max_items) - std::advance(end, max_items); - else if (items.size() > 0) - std::advance(end, items.size()); - - std::vector results; - for (auto it = items.begin(); it != end; it++) { - const auto user = it->second; - results.push_back(SearchResult{QString::fromStdString(user.first), - QString::fromStdString(user.second)}); - } - - return results; -} - std::vector Cache::getMembers(const std::string &room_id, std::size_t startIndex, std::size_t len) { @@ -3762,8 +3727,6 @@ namespace cache { void init(const QString &user_id) { - qRegisterMetaType(); - qRegisterMetaType>(); qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); @@ -4075,11 +4038,6 @@ calculateRoomReadStatus() instance_->calculateRoomReadStatus(); } -std::vector -searchUsers(const std::string &room_id, const std::string &query, std::uint8_t max_items) -{ - return instance_->searchUsers(room_id, query, max_items); -} std::vector searchRooms(const std::string &query, std::uint8_t max_items) { diff --git a/src/Cache.h b/src/Cache.h index 4c4f7071..573ab700 100644 --- a/src/Cache.h +++ b/src/Cache.h @@ -194,8 +194,6 @@ calculateRoomReadStatus(const std::string &room_id); void calculateRoomReadStatus(); -std::vector -searchUsers(const std::string &room_id, const std::string &query, std::uint8_t max_items = 5); std::vector searchRooms(const std::string &query, std::uint8_t max_items = 5); diff --git a/src/CacheStructs.h b/src/CacheStructs.h index ef08cfcb..b3d9acf1 100644 --- a/src/CacheStructs.h +++ b/src/CacheStructs.h @@ -24,12 +24,6 @@ struct RoomMember QImage avatar; }; -struct SearchResult -{ - QString user_id; - QString display_name; -}; - //! Used to uniquely identify a list of read receipts. struct ReadReceiptKey { diff --git a/src/Cache_p.h b/src/Cache_p.h index 05e13128..ffa7d509 100644 --- a/src/Cache_p.h +++ b/src/Cache_p.h @@ -164,9 +164,6 @@ public: bool calculateRoomReadStatus(const std::string &room_id); void calculateRoomReadStatus(); - std::vector searchUsers(const std::string &room_id, - const std::string &query, - std::uint8_t max_items = 5); std::vector searchRooms(const std::string &query, std::uint8_t max_items = 5); diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp index 78987fb9..1fd9b9bc 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp @@ -39,7 +39,6 @@ #include "RoomList.h" #include "SideBarActions.h" #include "Splitter.h" -#include "TextInputWidget.h" #include "UserInfoWidget.h" #include "UserSettingsPage.h" #include "Utils.h" @@ -138,21 +137,13 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) splitter->addWidget(content_); splitter->restoreSizes(parent->width()); - text_input_ = new TextInputWidget(this); - contentLayout_->addWidget(text_input_); - - typingRefresher_ = new QTimer(this); - typingRefresher_->setInterval(TYPING_REFRESH_TIMEOUT); - connect(this, &ChatPage::connectionLost, this, [this]() { nhlog::net()->info("connectivity lost"); isConnected_ = false; http::client()->shutdown(); - text_input_->disableInput(); }); connect(this, &ChatPage::connectionRestored, this, [this]() { nhlog::net()->info("trying to re-connect"); - text_input_->enableInput(); isConnected_ = true; // Drop all pending connections. @@ -160,15 +151,6 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) trySync(); }); - connect(text_input_, - &TextInputWidget::clearRoomTimeline, - view_manager_, - &TimelineViewManager::clearCurrentRoomTimeline); - - connect(text_input_, &TextInputWidget::rotateMegolmSession, this, [this]() { - cache::dropOutboundMegolmSession(current_room_.toStdString()); - }); - connect( new QShortcut(QKeySequence("Ctrl+Down"), this), &QShortcut::activated, this, [this]() { if (isVisible()) @@ -230,9 +212,7 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) connect(room_list_, &RoomList::roomChanged, this, [this](QString room_id) { this->current_room_ = room_id; }); - connect(room_list_, &RoomList::roomChanged, text_input_, &TextInputWidget::stopTyping); connect(room_list_, &RoomList::roomChanged, splitter, &Splitter::showChatView); - connect(room_list_, &RoomList::roomChanged, text_input_, &TextInputWidget::focusLineEdit); connect( room_list_, &RoomList::roomChanged, view_manager_, &TimelineViewManager::setHistoryView); @@ -246,27 +226,6 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) room_list_->removeRoom(room_id, currentRoom() == room_id); }); - connect( - text_input_, &TextInputWidget::startedTyping, this, &ChatPage::sendTypingNotifications); - connect(typingRefresher_, &QTimer::timeout, this, &ChatPage::sendTypingNotifications); - connect(text_input_, &TextInputWidget::stoppedTyping, this, [this]() { - if (!userSettings_->typingNotifications()) - return; - - typingRefresher_->stop(); - - if (current_room_.isEmpty()) - return; - - http::client()->stop_typing( - current_room_.toStdString(), [](mtx::http::RequestErr err) { - if (err) { - nhlog::net()->warn("failed to stop typing notifications: {}", - err->matrix_error.error); - } - }); - }); - connect(view_manager_, &TimelineViewManager::updateRoomsLastMessage, room_list_, @@ -277,197 +236,6 @@ ChatPage::ChatPage(QSharedPointer userSettings, QWidget *parent) this, SIGNAL(unreadMessages(int))); - connect(text_input_, - &TextInputWidget::sendTextMessage, - view_manager_, - &TimelineViewManager::queueTextMessage); - - connect(text_input_, - &TextInputWidget::sendEmoteMessage, - view_manager_, - &TimelineViewManager::queueEmoteMessage); - - connect(text_input_, &TextInputWidget::sendJoinRoomRequest, this, &ChatPage::joinRoom); - - // invites and bans via quick command - connect(text_input_, &TextInputWidget::sendInviteRoomRequest, this, &ChatPage::inviteUser); - connect(text_input_, &TextInputWidget::sendKickRoomRequest, this, &ChatPage::kickUser); - connect(text_input_, &TextInputWidget::sendBanRoomRequest, this, &ChatPage::banUser); - connect(text_input_, &TextInputWidget::sendUnbanRoomRequest, this, &ChatPage::unbanUser); - - connect( - text_input_, &TextInputWidget::changeRoomNick, this, [this](const QString &displayName) { - mtx::events::state::Member member; - member.display_name = displayName.toStdString(); - member.avatar_url = - cache::avatarUrl(currentRoom(), - QString::fromStdString(http::client()->user_id().to_string())) - .toStdString(); - member.membership = mtx::events::state::Membership::Join; - - http::client()->send_state_event( - currentRoom().toStdString(), - http::client()->user_id().to_string(), - member, - [](mtx::responses::EventId, mtx::http::RequestErr err) { - if (err) - nhlog::net()->error("Failed to set room displayname: {}", - err->matrix_error.error); - }); - }); - - connect( - text_input_, - &TextInputWidget::uploadMedia, - this, - [this](QSharedPointer dev, QString mimeClass, const QString &fn) { - if (!dev->open(QIODevice::ReadOnly)) { - emit uploadFailed( - QString("Error while reading media: %1").arg(dev->errorString())); - return; - } - - auto bin = dev->readAll(); - QMimeDatabase db; - QMimeType mime = db.mimeTypeForData(bin); - - auto payload = std::string(bin.data(), bin.size()); - std::optional encryptedFile; - if (cache::isRoomEncrypted(current_room_.toStdString())) { - mtx::crypto::BinaryBuf buf; - std::tie(buf, encryptedFile) = mtx::crypto::encrypt_file(payload); - payload = mtx::crypto::to_string(buf); - } - - QSize dimensions; - QString blurhash; - if (mimeClass == "image") { - QImage img = utils::readImage(&bin); - - dimensions = img.size(); - if (img.height() > 200 && img.width() > 360) - img = img.scaled(360, 200, Qt::KeepAspectRatioByExpanding); - std::vector data; - for (int y = 0; y < img.height(); y++) { - for (int x = 0; x < img.width(); x++) { - auto p = img.pixel(x, y); - data.push_back(static_cast(qRed(p))); - data.push_back(static_cast(qGreen(p))); - data.push_back(static_cast(qBlue(p))); - } - } - blurhash = QString::fromStdString( - blurhash::encode(data.data(), img.width(), img.height(), 4, 3)); - } - - http::client()->upload( - payload, - encryptedFile ? "application/octet-stream" : mime.name().toStdString(), - QFileInfo(fn).fileName().toStdString(), - [this, - room_id = current_room_, - filename = fn, - encryptedFile, - mimeClass, - mime = mime.name(), - size = payload.size(), - dimensions, - blurhash](const mtx::responses::ContentURI &res, mtx::http::RequestErr err) { - if (err) { - emit uploadFailed( - tr("Failed to upload media. Please try again.")); - nhlog::net()->warn("failed to upload media: {} {} ({})", - err->matrix_error.error, - to_string(err->matrix_error.errcode), - static_cast(err->status_code)); - return; - } - - emit mediaUploaded(room_id, - filename, - encryptedFile, - QString::fromStdString(res.content_uri), - mimeClass, - mime, - size, - dimensions, - blurhash); - }); - }); - - connect(this, &ChatPage::uploadFailed, this, [this](const QString &msg) { - text_input_->hideUploadSpinner(); - emit showNotification(msg); - }); - connect(this, - &ChatPage::mediaUploaded, - this, - [this](QString roomid, - QString filename, - std::optional encryptedFile, - QString url, - QString mimeClass, - QString mime, - qint64 dsize, - QSize dimensions, - QString blurhash) { - text_input_->hideUploadSpinner(); - - if (encryptedFile) - encryptedFile->url = url.toStdString(); - - if (mimeClass == "image") - view_manager_->queueImageMessage(roomid, - filename, - encryptedFile, - url, - mime, - dsize, - dimensions, - blurhash); - else if (mimeClass == "audio") - view_manager_->queueAudioMessage( - roomid, filename, encryptedFile, url, mime, dsize); - else if (mimeClass == "video") - view_manager_->queueVideoMessage( - roomid, filename, encryptedFile, url, mime, dsize); - else - view_manager_->queueFileMessage( - roomid, filename, encryptedFile, url, mime, dsize); - }); - - connect(text_input_, &TextInputWidget::callButtonPress, this, [this]() { - if (callManager_->onActiveCall()) { - callManager_->hangUp(); - } else { - if (auto roomInfo = cache::singleRoomInfo(current_room_.toStdString()); - roomInfo.member_count != 2) { - showNotification("Calls are limited to 1:1 rooms."); - } else { - std::vector members( - cache::getMembers(current_room_.toStdString())); - const RoomMember &callee = - members.front().user_id == utils::localUser() ? members.back() - : members.front(); - auto dialog = new dialogs::PlaceCall( - callee.user_id, - callee.display_name, - QString::fromStdString(roomInfo.name), - QString::fromStdString(roomInfo.avatar_url), - userSettings_, - MainWindow::instance()); - connect(dialog, &dialogs::PlaceCall::voice, this, [this]() { - callManager_->sendInvite(current_room_, false); - }); - connect(dialog, &dialogs::PlaceCall::video, this, [this]() { - callManager_->sendInvite(current_room_, true); - }); - utils::centerWidget(dialog, MainWindow::instance()); - dialog->show(); - } - } - }); - connect( this, &ChatPage::updateGroupsInfo, communitiesList_, &CommunitiesList::setCommunities); @@ -635,12 +403,6 @@ ChatPage::resetUI() emit unreadMessages(0); } -void -ChatPage::focusMessageInput() -{ - this->text_input_->focusLineEdit(); -} - void ChatPage::deleteConfigs() { @@ -805,7 +567,6 @@ ChatPage::showQuickSwitcher() connect(dialog, &QuickSwitcher::roomSelected, room_list_, &RoomList::highlightSelectedRoom); connect(dialog, &QuickSwitcher::closing, this, [this]() { MainWindow::instance()->hideOverlay(); - text_input_->setFocus(Qt::FocusReason::PopupFocusReason); }); MainWindow::instance()->showTransparentOverlayModal(dialog); @@ -1299,21 +1060,6 @@ ChatPage::receivedSessionKey(const std::string &room_id, const std::string &sess view_manager_->receivedSessionKey(room_id, session_id); } -void -ChatPage::sendTypingNotifications() -{ - if (!userSettings_->typingNotifications()) - return; - - http::client()->start_typing( - current_room_.toStdString(), 10'000, [](mtx::http::RequestErr err) { - if (err) { - nhlog::net()->warn("failed to send typing notification: {}", - err->matrix_error.error); - } - }); -} - QString ChatPage::status() const { diff --git a/src/ChatPage.h b/src/ChatPage.h index 0c12d89f..5b336cbb 100644 --- a/src/ChatPage.h +++ b/src/ChatPage.h @@ -46,7 +46,6 @@ class QuickSwitcher; class RoomList; class SideBarActions; class Splitter; -class TextInputWidget; class TimelineViewManager; class UserInfoWidget; class UserSettings; @@ -88,6 +87,8 @@ public: static ChatPage *instance() { return instance_; } QSharedPointer userSettings() { return userSettings_; } + CallManager *callManager() { return callManager_; } + TimelineViewManager *timelineManager() { return view_manager_; } void deleteConfigs(); CommunitiesList *communitiesList() { return communitiesList_; } @@ -99,7 +100,6 @@ public: //! Show the room/group list (if it was visible). void showSideBars(); void initiateLogout(); - void focusMessageInput(); QString status() const; void setStatus(const QString &status); @@ -109,6 +109,7 @@ public: public slots: void leaveRoom(const QString &room_id); void createRoom(const mtx::requests::CreateRoom &req); + void joinRoom(const QString &room); void inviteUser(QString userid, QString reason); void kickUser(QString userid, QString reason); @@ -125,17 +126,6 @@ signals: void highlightedNotifsRetrieved(const mtx::responses::Notifications &, const QPoint widgetPos); - void uploadFailed(const QString &msg); - void mediaUploaded(const QString &roomid, - const QString &filename, - const std::optional &file, - const QString &url, - const QString &mimeClass, - const QString &mime, - qint64 dsize, - const QSize &dimensions, - const QString &blurhash); - void contentLoaded(); void closing(); void changeWindowTitle(const int); @@ -200,8 +190,6 @@ private slots: void removeRoom(const QString &room_id); void dropToLoginPage(const QString &msg); - void joinRoom(const QString &room); - void sendTypingNotifications(); void handleSyncResponse(const mtx::responses::Sync &res); private: @@ -263,8 +251,6 @@ private: TimelineViewManager *view_manager_; SideBarActions *sidebarActions_; - TextInputWidget *text_input_; - QTimer connectivityTimer_; std::atomic_bool isConnected_; @@ -275,8 +261,6 @@ private: popups::UserMentions *user_mentions_popup_; - QTimer *typingRefresher_; - // Global user settings. QSharedPointer userSettings_; diff --git a/src/CompletionModel.h b/src/CompletionModel.h deleted file mode 100644 index ed021051..00000000 --- a/src/CompletionModel.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -// Class for showing a limited amount of completions at a time - -#include - -class CompletionModel : public QSortFilterProxyModel -{ -public: - CompletionModel(QAbstractItemModel *model, QObject *parent = nullptr) - : QSortFilterProxyModel(parent) - { - setSourceModel(model); - } - int rowCount(const QModelIndex &parent) const override - { - auto row_count = QSortFilterProxyModel::rowCount(parent); - return (row_count < 7) ? row_count : 7; - } -}; diff --git a/src/CompletionModelRoles.h b/src/CompletionModelRoles.h new file mode 100644 index 00000000..7c7307d3 --- /dev/null +++ b/src/CompletionModelRoles.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +// Interface for completion models +namespace CompletionModel { + +// Start at Qt::UserRole * 2 to prevent clashes +enum Roles +{ + CompletionRole = Qt::UserRole * 2, // The string to replace the active completion + SearchRole, // String completer uses for search + SearchRole2, // Secondary string completer uses for search +}; +} diff --git a/src/CompletionProxyModel.cpp b/src/CompletionProxyModel.cpp new file mode 100644 index 00000000..c520bb68 --- /dev/null +++ b/src/CompletionProxyModel.cpp @@ -0,0 +1,133 @@ +#include "CompletionProxyModel.h" + +#include + +#include "CompletionModelRoles.h" +#include "Logging.h" +#include "Utils.h" + +CompletionProxyModel::CompletionProxyModel(QAbstractItemModel *model, QObject *parent) + : QAbstractProxyModel(parent) +{ + setSourceModel(model); + QRegularExpression splitPoints("\\s+|-"); + + for (int i = 0; i < sourceModel()->rowCount(); i++) { + if (i < 7) + mapping.push_back(i); + + auto string1 = sourceModel() + ->data(sourceModel()->index(i, 0), CompletionModel::SearchRole) + .toString() + .toLower(); + trie_.insert(string1.toUcs4(), i); + + for (const auto &e : string1.split(splitPoints, Qt::SkipEmptyParts)) { + trie_.insert(e.toUcs4(), i); + } + + auto string2 = sourceModel() + ->data(sourceModel()->index(i, 0), CompletionModel::SearchRole2) + .toString() + .toLower(); + + if (!string2.isEmpty()) { + trie_.insert(string2.toUcs4(), i); + for (const auto &e : string2.split(splitPoints, Qt::SkipEmptyParts)) { + trie_.insert(e.toUcs4(), i); + } + } + } + + connect( + this, + &CompletionProxyModel::newSearchString, + this, + [this](QString s) { + s.remove(":"); + s.remove("@"); + searchString = s.toLower(); + invalidate(); + }, + Qt::QueuedConnection); +} + +void +CompletionProxyModel::invalidate() +{ + auto key = searchString.toUcs4(); + beginResetModel(); + mapping = trie_.search(key, 7); + endResetModel(); + + std::string temp; + for (auto v : mapping) { + temp += std::to_string(v) + ", "; + } + nhlog::ui()->debug("mapping: {}", temp); +} + +QHash +CompletionProxyModel::roleNames() const +{ + return this->sourceModel()->roleNames(); +} + +int +CompletionProxyModel::rowCount(const QModelIndex &) const +{ + return (int)mapping.size(); +} + +QModelIndex +CompletionProxyModel::mapFromSource(const QModelIndex &sourceIndex) const +{ + for (int i = 0; i < (int)mapping.size(); i++) { + if (mapping[i] == sourceIndex.row()) { + return index(i, 0); + } + } + return QModelIndex(); +} + +QModelIndex +CompletionProxyModel::mapToSource(const QModelIndex &proxyIndex) const +{ + auto row = proxyIndex.row(); + if (row < 0 || row >= (int)mapping.size()) + return QModelIndex(); + + return sourceModel()->index(mapping[row], 0); +} + +QModelIndex +CompletionProxyModel::index(int row, int column, const QModelIndex &) const +{ + return createIndex(row, column); +} + +QModelIndex +CompletionProxyModel::parent(const QModelIndex &) const +{ + return QModelIndex{}; +} +int +CompletionProxyModel::columnCount(const QModelIndex &) const +{ + return sourceModel()->columnCount(); +} + +QVariant +CompletionProxyModel::completionAt(int i) const +{ + if (i >= 0 && i < rowCount()) + return data(index(i, 0), CompletionModel::CompletionRole); + else + return {}; +} + +void +CompletionProxyModel::setSearchString(QString s) +{ + emit newSearchString(s); +} diff --git a/src/CompletionProxyModel.h b/src/CompletionProxyModel.h new file mode 100644 index 00000000..1517505f --- /dev/null +++ b/src/CompletionProxyModel.h @@ -0,0 +1,159 @@ +#pragma once + +// Class for showing a limited amount of completions at a time + +#include + +template +struct trie +{ + std::vector values; + std::map next; + + void insert(const QVector &keys, const Value &v) + { + auto t = this; + for (const auto k : keys) { + t = &t->next[k]; + } + + t->values.push_back(v); + } + + std::vector valuesAndSubvalues(size_t limit = -1) const + { + std::vector ret; + if (limit < 200) + ret.reserve(limit); + + for (const auto &v : values) { + if (ret.size() >= limit) + return ret; + else + ret.push_back(v); + } + + for (const auto &[k, t] : next) { + (void)k; + if (ret.size() >= limit) + return ret; + else { + auto temp = t.valuesAndSubvalues(limit - ret.size()); + for (auto &&v : temp) { + if (ret.size() >= limit) + return ret; + + if (std::find(ret.begin(), ret.end(), v) == ret.end()) { + ret.push_back(std::move(v)); + } + } + } + } + + return ret; + } + + std::vector search(const QVector &keys, //< TODO(Nico): replace this with a span + size_t limit, + size_t max_distance = 2) const + { + std::vector ret; + if (!limit) + return ret; + + if (keys.isEmpty()) + return valuesAndSubvalues(limit); + + auto append = [&ret, limit](std::vector &&in) { + for (auto &&v : in) { + if (ret.size() >= limit) + return; + + if (std::find(ret.begin(), ret.end(), v) == ret.end()) { + ret.push_back(std::move(v)); + } + } + }; + + if (auto e = this->next.find(keys[0]); e != this->next.end()) { + append(e->second.search(keys.mid(1), limit, max_distance)); + } + + if (max_distance && ret.size() < limit) { + max_distance -= 1; + + // swap chars case + if (keys.size() >= 2) { + auto t = this; + for (int i = 1; i >= 0; i--) { + if (auto e = t->next.find(keys[i]); e != t->next.end()) { + t = &e->second; + } else { + t = nullptr; + break; + } + } + + if (t) { + append(t->search( + keys.mid(2), (limit - ret.size()) * 2, max_distance)); + } + } + + // delete character case + append(this->search(keys.mid(1), (limit - ret.size()) * 2, max_distance)); + + // substitute and insert cases + for (const auto &[k, t] : this->next) { + if (k == keys[0] || ret.size() >= limit) + break; + + // substitute + append(t.search(keys.mid(1), limit - ret.size(), max_distance)); + + if (ret.size() >= limit) + break; + + // insert + append(t.search(keys, limit - ret.size(), max_distance)); + } + } + + return ret; + } +}; + +class CompletionProxyModel : public QAbstractProxyModel +{ + Q_OBJECT + +public: + CompletionProxyModel(QAbstractItemModel *model, QObject *parent = nullptr); + + void invalidate(); + + QHash roleNames() const override; + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &) const override; + + QModelIndex mapFromSource(const QModelIndex &sourceIndex) const override; + QModelIndex mapToSource(const QModelIndex &proxyIndex) const override; + + QModelIndex index(int row, + int column, + const QModelIndex &parent = QModelIndex()) const override; + QModelIndex parent(const QModelIndex &) const override; + +public slots: + QVariant completionAt(int i) const; + + void setSearchString(QString s); + +signals: + void newSearchString(QString); + +private: + QString searchString; + trie trie_; + std::vector mapping; +}; diff --git a/src/LoginPage.cpp b/src/LoginPage.cpp index 9a920d1d..ac625db1 100644 --- a/src/LoginPage.cpp +++ b/src/LoginPage.cpp @@ -16,9 +16,11 @@ */ #include +#include #include #include #include +#include #include #include @@ -95,8 +97,6 @@ LoginPage::LoginPage(QWidget *parent) "address there, if your server doesn't support .well-known lookup.\nExample: " "@user:server.my\nIf Nheko fails to discover your homeserver, it will show you a " "field to enter the server manually.")); - matrixid_input_->setValidator( - new QRegularExpressionValidator(QRegularExpression("@.+?:.{3,}"), this)); spinner_ = new LoadingIndicator(this); spinner_->setFixedHeight(40); @@ -110,6 +110,12 @@ LoginPage::LoginPage(QWidget *parent) matrixidLayout_ = new QHBoxLayout(); matrixidLayout_->addWidget(matrixid_input_, 0, Qt::AlignVCenter); + QFont font; + + error_matrixid_label_ = new QLabel(this); + error_matrixid_label_->setFont(font); + error_matrixid_label_->setWordWrap(true); + password_input_ = new TextField(this); password_input_->setLabel(tr("Password")); password_input_->setEchoMode(QLineEdit::Password); @@ -132,10 +138,13 @@ LoginPage::LoginPage(QWidget *parent) serverLayout_->addWidget(serverInput_, 0, Qt::AlignVCenter); form_layout_->addLayout(matrixidLayout_); + form_layout_->addWidget(error_matrixid_label_, 0, Qt::AlignHCenter); form_layout_->addWidget(password_input_); form_layout_->addWidget(deviceName_, Qt::AlignHCenter); form_layout_->addLayout(serverLayout_); + error_matrixid_label_->hide(); + button_layout_ = new QHBoxLayout(); button_layout_->setSpacing(0); button_layout_->setContentsMargins(0, 0, 0, 30); @@ -149,8 +158,6 @@ LoginPage::LoginPage(QWidget *parent) button_layout_->addWidget(login_button_); button_layout_->addStretch(1); - QFont font; - error_label_ = new QLabel(this); error_label_->setFont(font); error_label_->setWordWrap(true); @@ -183,9 +190,30 @@ LoginPage::LoginPage(QWidget *parent) void LoginPage::loginError(const QString &msg) { + auto rect = QFontMetrics(font()).boundingRect(msg); + int width = rect.width(); + int height = rect.height(); + error_label_->setFixedHeight(qCeil(width / 200) * height); error_label_->setText(msg); } +void +LoginPage::matrixIdError(const QString &msg) +{ + error_matrixid_label_->show(); + error_matrixid_label_->setText(msg); + matrixid_input_->setValid(false); +} + +bool +LoginPage::isMatrixIdValid() +{ + QRegularExpressionValidator v(QRegularExpression("@.+?:.{3,}"), this); + QString s = matrixid_input_->text(); + int pos = 0; + return v.validate(s, pos) == QValidator::Acceptable; +} + void LoginPage::onMatrixIdEntered() { @@ -193,10 +221,20 @@ LoginPage::onMatrixIdEntered() User user; + if (!isMatrixIdValid()) { + matrixIdError("You have entered an invalid Matrix ID e.g @joe:matrix.org"); + return; + } else { + error_matrixid_label_->setText(""); + error_matrixid_label_->hide(); + matrixid_input_->setValid(true); + } + try { user = parse(matrixid_input_->text().toStdString()); } catch (const std::exception &e) { - return loginError("You have entered an invalid Matrix ID e.g @joe:matrix.org"); + matrixIdError("You have entered an invalid Matrix ID e.g @joe:matrix.org"); + return; } QString homeServer = QString::fromStdString(user.hostname()); @@ -307,7 +345,7 @@ LoginPage::onServerAddressEntered() void LoginPage::versionError(const QString &error) { - error_label_->setText(error); + loginError(error); serverInput_->show(); spinner_->stop(); @@ -345,10 +383,20 @@ LoginPage::onLoginButtonClicked() User user; + if (!isMatrixIdValid()) { + matrixIdError("You have entered an invalid Matrix ID e.g @joe:matrix.org"); + return; + } else { + error_matrixid_label_->setText(""); + error_matrixid_label_->hide(); + matrixid_input_->setValid(true); + } + try { user = parse(matrixid_input_->text().toStdString()); } catch (const std::exception &e) { - return loginError("You have entered an invalid Matrix ID e.g @joe:matrix.org"); + matrixIdError("You have entered an invalid Matrix ID e.g @joe:matrix.org"); + return; } if (loginMethod == LoginMethod::Password) { diff --git a/src/LoginPage.h b/src/LoginPage.h index c9220297..92b60afe 100644 --- a/src/LoginPage.h +++ b/src/LoginPage.h @@ -67,6 +67,7 @@ protected: public slots: // Displays errors produced during the login. void loginError(const QString &msg); + void matrixIdError(const QString &msg); private slots: // Callback for the back button. @@ -112,6 +113,7 @@ private: QLabel *logo_; QLabel *error_label_; + QLabel *error_matrixid_label_; QHBoxLayout *serverLayout_; QHBoxLayout *matrixidLayout_; diff --git a/src/QuickSwitcher.cpp b/src/QuickSwitcher.cpp index 05a9f431..046c774d 100644 --- a/src/QuickSwitcher.cpp +++ b/src/QuickSwitcher.cpp @@ -118,7 +118,7 @@ QuickSwitcher::QuickSwitcher(QWidget *parent) connect(roomSearch_, &RoomSearchInput::hiding, this, [this]() { popup_.hide(); }); connect(roomSearch_, &QLineEdit::returnPressed, this, [this]() { reset(); - popup_.selectHoveredSuggestion(); + popup_.selectHoveredSuggestion(); }); } diff --git a/src/TextInputWidget.cpp b/src/TextInputWidget.cpp deleted file mode 100644 index 454353fd..00000000 --- a/src/TextInputWidget.cpp +++ /dev/null @@ -1,796 +0,0 @@ -/* - * nheko Copyright (C) 2017 Konstantinos Sideris - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Cache.h" -#include "ChatPage.h" -#include "CompletionModel.h" -#include "Logging.h" -#include "TextInputWidget.h" -#include "Utils.h" -#include "emoji/EmojiSearchModel.h" -#include "emoji/Provider.h" -#include "ui/FlatButton.h" -#include "ui/LoadingIndicator.h" - -#if defined(Q_OS_MAC) -#include "emoji/MacHelper.h" -#endif - -static constexpr size_t INPUT_HISTORY_SIZE = 127; -static constexpr int MAX_TEXTINPUT_HEIGHT = 120; -static constexpr int ButtonHeight = 22; - -FilteredTextEdit::FilteredTextEdit(QWidget *parent) - : QTextEdit{parent} - , history_index_{0} - , suggestionsPopup_{parent} - , previewDialog_{parent} -{ - setFrameStyle(QFrame::NoFrame); - connect(document()->documentLayout(), - &QAbstractTextDocumentLayout::documentSizeChanged, - this, - &FilteredTextEdit::updateGeometry); - connect(document()->documentLayout(), - &QAbstractTextDocumentLayout::documentSizeChanged, - this, - [this]() { emit heightChanged(document()->size().toSize().height()); }); - working_history_.push_back(""); - connect(this, &QTextEdit::textChanged, this, &FilteredTextEdit::textChanged); - setAcceptRichText(false); - - completer_ = new QCompleter(this); - completer_->setWidget(this); - auto model = new emoji::EmojiSearchModel(this); - model->sort(0, Qt::AscendingOrder); - completer_->setModel((emoji_completion_model_ = new CompletionModel(model, this))); - completer_->setModelSorting(QCompleter::UnsortedModel); - completer_->popup()->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - completer_->popup()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - - connect(completer_, - QOverload::of(&QCompleter::activated), - [this](auto &index) { - emoji_popup_open_ = false; - auto emoji = index.data(emoji::EmojiModel::Unicode).toString(); - insertCompletion(emoji); - }); - - typingTimer_ = new QTimer(this); - typingTimer_->setInterval(1000); - typingTimer_->setSingleShot(true); - - connect(typingTimer_, &QTimer::timeout, this, &FilteredTextEdit::stopTyping); - connect(&previewDialog_, - &dialogs::PreviewUploadOverlay::confirmUpload, - this, - &FilteredTextEdit::uploadData); - - connect(this, &FilteredTextEdit::resultsRetrieved, this, &FilteredTextEdit::showResults); - connect( - &suggestionsPopup_, &SuggestionsPopup::itemSelected, this, [this](const QString &text) { - suggestionsPopup_.hide(); - - auto cursor = textCursor(); - const int end = cursor.position(); - - cursor.setPosition(atTriggerPosition_, QTextCursor::MoveAnchor); - cursor.setPosition(end, QTextCursor::KeepAnchor); - cursor.removeSelectedText(); - cursor.insertText(text); - }); - - // For cycling through the suggestions by hitting tab. - connect(this, - &FilteredTextEdit::selectNextSuggestion, - &suggestionsPopup_, - &SuggestionsPopup::selectNextSuggestion); - connect(this, - &FilteredTextEdit::selectPreviousSuggestion, - &suggestionsPopup_, - &SuggestionsPopup::selectPreviousSuggestion); - connect(this, &FilteredTextEdit::selectHoveredSuggestion, this, [this]() { - suggestionsPopup_.selectHoveredSuggestion(); - }); - - previewDialog_.hide(); -} - -void -FilteredTextEdit::insertCompletion(QString completion) -{ - // Paint the current word and replace it with 'completion' - auto cur_text = textAfterPosition(trigger_pos_); - auto tc = textCursor(); - tc.movePosition(QTextCursor::Left, QTextCursor::MoveAnchor, cur_text.length()); - tc.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, cur_text.length()); - tc.insertText(completion); - setTextCursor(tc); -} - -void -FilteredTextEdit::showResults(const std::vector &results) -{ - QPoint pos; - - if (isAnchorValid()) { - auto cursor = textCursor(); - cursor.setPosition(atTriggerPosition_); - pos = viewport()->mapToGlobal(cursorRect(cursor).topLeft()); - } else { - auto rect = cursorRect(); - pos = viewport()->mapToGlobal(rect.topLeft()); - } - - suggestionsPopup_.addUsers(results); - suggestionsPopup_.move(pos.x(), pos.y() - suggestionsPopup_.height() - 10); - suggestionsPopup_.show(); -} - -void -FilteredTextEdit::keyPressEvent(QKeyEvent *event) -{ - const bool isModifier = (event->modifiers() != Qt::NoModifier); - -#if defined(Q_OS_MAC) - if (event->modifiers() == (Qt::ControlModifier | Qt::MetaModifier) && - event->key() == Qt::Key_Space) - MacHelper::showEmojiWindow(); -#endif - - if (event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_U) - QTextEdit::setText(""); - - if (!isModifier) { - if (!typingTimer_->isActive()) - emit startedTyping(); - - typingTimer_->start(); - } - - // calculate the new query - if (textCursor().position() < atTriggerPosition_ || !isAnchorValid()) { - resetAnchor(); - closeSuggestions(); - } - - if (suggestionsPopup_.isVisible()) { - switch (event->key()) { - case Qt::Key_Down: - case Qt::Key_Tab: - emit selectNextSuggestion(); - return; - case Qt::Key_Enter: - case Qt::Key_Return: - emit selectHoveredSuggestion(); - return; - case Qt::Key_Escape: - closeSuggestions(); - return; - case Qt::Key_Up: - case Qt::Key_Backtab: { - emit selectPreviousSuggestion(); - return; - } - default: - break; - } - } - - if (emoji_popup_open_) { - auto fake_key = (event->key() == Qt::Key_Backtab) ? Qt::Key_Up : Qt::Key_Down; - switch (event->key()) { - case Qt::Key_Backtab: - case Qt::Key_Tab: { - // Simulate up/down arrow press - auto ev = new QKeyEvent(QEvent::KeyPress, fake_key, Qt::NoModifier); - QCoreApplication::postEvent(completer_->popup(), ev); - return; - } - default: - break; - } - } - - switch (event->key()) { - case Qt::Key_At: - atTriggerPosition_ = textCursor().position(); - anchorType_ = AnchorType::Sigil; - - QTextEdit::keyPressEvent(event); - break; - case Qt::Key_Tab: { - auto cursor = textCursor(); - const int initialPos = cursor.position(); - - cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor); - auto word = cursor.selectedText(); - - const int startOfWord = cursor.position(); - - // There is a word to complete. - if (initialPos != startOfWord) { - atTriggerPosition_ = startOfWord; - anchorType_ = AnchorType::Tab; - - emit showSuggestions(word); - } else { - QTextEdit::keyPressEvent(event); - } - - break; - } - case Qt::Key_Colon: { - QTextEdit::keyPressEvent(event); - trigger_pos_ = textCursor().position() - 1; - emoji_completion_model_->setFilterRegExp(""); - emoji_popup_open_ = true; - break; - } - case Qt::Key_Return: - case Qt::Key_Enter: - if (emoji_popup_open_) { - if (!completer_->popup()->currentIndex().isValid()) { - // No completion to select, do normal behavior - completer_->popup()->hide(); - emoji_popup_open_ = false; - } else { - event->ignore(); - return; - } - } - - if (!(event->modifiers() & Qt::ShiftModifier)) { - stopTyping(); - submit(); - } else { - QTextEdit::keyPressEvent(event); - } - break; - case Qt::Key_Up: { - auto initial_cursor = textCursor(); - QTextEdit::keyPressEvent(event); - - if (textCursor() == initial_cursor && textCursor().atStart() && - history_index_ + 1 < working_history_.size()) { - ++history_index_; - setPlainText(working_history_[history_index_]); - moveCursor(QTextCursor::End); - } else if (textCursor() == initial_cursor) { - // Move to the start of the text if there aren't any lines to move up to. - initial_cursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor, 1); - setTextCursor(initial_cursor); - } - - break; - } - case Qt::Key_Down: { - auto initial_cursor = textCursor(); - QTextEdit::keyPressEvent(event); - - if (textCursor() == initial_cursor && textCursor().atEnd() && history_index_ > 0) { - --history_index_; - setPlainText(working_history_[history_index_]); - moveCursor(QTextCursor::End); - } else if (textCursor() == initial_cursor) { - // Move to the end of the text if there aren't any lines to move down to. - initial_cursor.movePosition(QTextCursor::End, QTextCursor::MoveAnchor, 1); - setTextCursor(initial_cursor); - } - - break; - } - default: - QTextEdit::keyPressEvent(event); - - if (isModifier) - return; - - if (emoji_popup_open_ && textAfterPosition(trigger_pos_).length() > 2) { - // Update completion - emoji_completion_model_->setFilterRegExp(textAfterPosition(trigger_pos_)); - completer_->complete(completerRect()); - } - - if (emoji_popup_open_ && (completer_->completionCount() < 1 || - !textAfterPosition(trigger_pos_) - .contains(QRegularExpression(":[^\r\n\t\f\v :]+$")))) { - // No completions for this word or another word than the completer was - // started with - emoji_popup_open_ = false; - completer_->popup()->hide(); - } - - if (textCursor().position() == 0) { - resetAnchor(); - closeSuggestions(); - return; - } - - // Check if the current word should be autocompleted. - auto cursor = textCursor(); - cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor); - auto word = cursor.selectedText(); - - if (hasAnchor(cursor.position(), anchorType_) && isAnchorValid()) { - if (word.isEmpty()) { - closeSuggestions(); - return; - } - - emit showSuggestions(word); - } else { - resetAnchor(); - closeSuggestions(); - } - - break; - } -} - -bool -FilteredTextEdit::canInsertFromMimeData(const QMimeData *source) const -{ - return (source->hasImage() || QTextEdit::canInsertFromMimeData(source)); -} - -void -FilteredTextEdit::insertFromMimeData(const QMimeData *source) -{ - qInfo() << "Got mime formats: \n" << source->formats(); - const auto formats = source->formats().filter("/"); - const auto image = formats.filter("image/", Qt::CaseInsensitive); - const auto audio = formats.filter("audio/", Qt::CaseInsensitive); - const auto video = formats.filter("video/", Qt::CaseInsensitive); - - if (!image.empty() && source->hasImage()) { - QImage img = qvariant_cast(source->imageData()); - previewDialog_.setPreview(img, image.front()); - } else if (!audio.empty()) { - showPreview(source, audio); - } else if (!video.empty()) { - showPreview(source, video); - } else if (source->hasUrls()) { - // Generic file path for any platform. - QString path; - for (auto &&u : source->urls()) { - if (u.isLocalFile()) { - path = u.toLocalFile(); - break; - } - } - - if (!path.isEmpty() && QFileInfo{path}.exists()) { - previewDialog_.setPreview(path); - } else { - qWarning() - << "Clipboard does not contain any valid file paths:" << source->urls(); - } - } else if (source->hasFormat("x-special/gnome-copied-files")) { - // Special case for X11 users. See "Notes for X11 Users" in source. - // Source: http://doc.qt.io/qt-5/qclipboard.html - - // This MIME type returns a string with multiple lines separated by '\n'. The first - // line is the command to perform with the clipboard (not useful to us). The - // following lines are the file URIs. - // - // Source: the nautilus source code in file 'src/nautilus-clipboard.c' in function - // nautilus_clipboard_get_uri_list_from_selection_data() - // https://github.com/GNOME/nautilus/blob/master/src/nautilus-clipboard.c - - auto data = source->data("x-special/gnome-copied-files").split('\n'); - if (data.size() < 2) { - qWarning() << "MIME format is malformed, cannot perform paste."; - return; - } - - QString path; - for (int i = 1; i < data.size(); ++i) { - QUrl url{data[i]}; - if (url.isLocalFile()) { - path = url.toLocalFile(); - break; - } - } - - if (!path.isEmpty()) { - previewDialog_.setPreview(path); - } else { - qWarning() << "Clipboard does not contain any valid file paths:" << data; - } - } else { - QTextEdit::insertFromMimeData(source); - } -} - -void -FilteredTextEdit::stopTyping() -{ - typingTimer_->stop(); - emit stoppedTyping(); -} - -QRect -FilteredTextEdit::completerRect() -{ - // Move left edge to the beginning of the word - auto cursor = textCursor(); - auto rect = cursorRect(); - cursor.movePosition( - QTextCursor::Left, QTextCursor::MoveAnchor, textAfterPosition(trigger_pos_).length()); - auto cursor_global_x = viewport()->mapToGlobal(cursorRect(cursor).topLeft()).x(); - auto rect_global_left = viewport()->mapToGlobal(rect.bottomLeft()).x(); - auto dx = qAbs(rect_global_left - cursor_global_x); - rect.moveLeft(rect.left() - dx); - - auto item_height = completer_->popup()->sizeHintForRow(0); - auto max_height = item_height * completer_->maxVisibleItems(); - auto height = (completer_->completionCount() > completer_->maxVisibleItems()) - ? max_height - : completer_->completionCount() * item_height; - rect.setWidth(completer_->popup()->sizeHintForColumn(0)); - rect.moveBottom(-height); - return rect; -} - -QSize -FilteredTextEdit::sizeHint() const -{ - ensurePolished(); - auto margins = viewportMargins(); - margins += document()->documentMargin(); - QSize size = document()->size().toSize(); - size.rwidth() += margins.left() + margins.right(); - size.rheight() += margins.top() + margins.bottom(); - return size; -} - -QSize -FilteredTextEdit::minimumSizeHint() const -{ - ensurePolished(); - auto margins = viewportMargins(); - margins += document()->documentMargin(); - margins += contentsMargins(); - QSize size(fontMetrics().averageCharWidth() * 10, - fontMetrics().lineSpacing() + margins.top() + margins.bottom()); - return size; -} - -void -FilteredTextEdit::submit() -{ - if (toPlainText().trimmed().isEmpty()) - return; - - if (true_history_.size() == INPUT_HISTORY_SIZE) - true_history_.pop_back(); - true_history_.push_front(toPlainText()); - working_history_ = true_history_; - working_history_.push_front(""); - history_index_ = 0; - - QString text = toPlainText(); - - if (text.startsWith('/')) { - int command_end = text.indexOf(' '); - if (command_end == -1) - command_end = text.size(); - auto name = text.mid(1, command_end - 1); - auto args = text.mid(command_end + 1); - if (name.isEmpty() || name == "/") { - message(args); - } else { - command(name, args); - } - } else { - message(std::move(text)); - } - - clear(); -} - -void -FilteredTextEdit::textChanged() -{ - working_history_[history_index_] = toPlainText(); -} - -void -FilteredTextEdit::uploadData(const QByteArray data, - const QString &mediaType, - const QString &filename) -{ - QSharedPointer buffer{new QBuffer{this}}; - buffer->setData(data); - - emit startedUpload(); - - emit media(buffer, mediaType, filename); -} - -void -FilteredTextEdit::showPreview(const QMimeData *source, const QStringList &formats) -{ - // Retrieve data as MIME type. - auto const &mime = formats.first(); - QByteArray data = source->data(mime); - previewDialog_.setPreview(data, mime); -} - -TextInputWidget::TextInputWidget(QWidget *parent) - : QWidget(parent) -{ - QFont f; - f.setPointSizeF(f.pointSizeF()); - const int fontHeight = QFontMetrics(f).height(); - const int contentHeight = static_cast(fontHeight * 2.5); - const int InputHeight = static_cast(fontHeight * 1.5); - - setFixedHeight(contentHeight); - setCursor(Qt::ArrowCursor); - - topLayout_ = new QHBoxLayout(); - topLayout_->setSpacing(0); - topLayout_->setContentsMargins(13, 1, 13, 0); - -#ifdef GSTREAMER_AVAILABLE - callBtn_ = new FlatButton(this); - changeCallButtonState(webrtc::State::DISCONNECTED); - connect(&WebRTCSession::instance(), - &WebRTCSession::stateChanged, - this, - &TextInputWidget::changeCallButtonState); -#endif - - QIcon send_file_icon; - send_file_icon.addFile(":/icons/icons/ui/paper-clip-outline.png"); - - sendFileBtn_ = new FlatButton(this); - sendFileBtn_->setToolTip(tr("Send a file")); - sendFileBtn_->setIcon(send_file_icon); - sendFileBtn_->setIconSize(QSize(ButtonHeight, ButtonHeight)); - - spinner_ = new LoadingIndicator(this); - spinner_->setFixedHeight(InputHeight); - spinner_->setFixedWidth(InputHeight); - spinner_->setObjectName("FileUploadSpinner"); - spinner_->hide(); - - input_ = new FilteredTextEdit(this); - input_->setFixedHeight(InputHeight); - input_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - input_->setPlaceholderText(tr("Write a message...")); - - connect(input_, - &FilteredTextEdit::heightChanged, - this, - [this, InputHeight, contentHeight](int height) { - int widgetHeight = - std::min(MAX_TEXTINPUT_HEIGHT, std::max(height, contentHeight)); - int textInputHeight = - std::min(widgetHeight - 1, std::max(height, InputHeight)); - - setFixedHeight(widgetHeight); - input_->setFixedHeight(textInputHeight); - - emit heightChanged(widgetHeight); - }); - connect(input_, &FilteredTextEdit::showSuggestions, this, [this](const QString &q) { - if (q.isEmpty()) - return; - - QtConcurrent::run([this, q = q.toLower().toStdString()]() { - try { - emit input_->resultsRetrieved(cache::searchUsers( - ChatPage::instance()->currentRoom().toStdString(), q)); - } catch (const lmdb::error &e) { - nhlog::db()->error("Suggestion retrieval failed: {}", e.what()); - } - }); - }); - - sendMessageBtn_ = new FlatButton(this); - sendMessageBtn_->setToolTip(tr("Send a message")); - - QIcon send_message_icon; - send_message_icon.addFile(":/icons/icons/ui/cursor.png"); - sendMessageBtn_->setIcon(send_message_icon); - sendMessageBtn_->setIconSize(QSize(ButtonHeight, ButtonHeight)); - - emojiBtn_ = new emoji::PickButton(this); - emojiBtn_->setToolTip(tr("Emoji")); - -#if defined(Q_OS_MAC) - // macOS has a native emoji picker. - emojiBtn_->hide(); -#endif - - QIcon emoji_icon; - emoji_icon.addFile(":/icons/icons/ui/smile.png"); - emojiBtn_->setIcon(emoji_icon); - emojiBtn_->setIconSize(QSize(ButtonHeight, ButtonHeight)); - -#ifdef GSTREAMER_AVAILABLE - topLayout_->addWidget(callBtn_); -#endif - topLayout_->addWidget(sendFileBtn_); - topLayout_->addWidget(input_); - topLayout_->addWidget(emojiBtn_); - topLayout_->addWidget(sendMessageBtn_); - - setLayout(topLayout_); - -#ifdef GSTREAMER_AVAILABLE - connect(callBtn_, &FlatButton::clicked, this, &TextInputWidget::callButtonPress); -#endif - connect(sendMessageBtn_, &FlatButton::clicked, input_, &FilteredTextEdit::submit); - connect(sendFileBtn_, SIGNAL(clicked()), this, SLOT(openFileSelection())); - connect(input_, &FilteredTextEdit::message, this, &TextInputWidget::sendTextMessage); - connect(input_, &FilteredTextEdit::command, this, &TextInputWidget::command); - connect(input_, &FilteredTextEdit::media, this, &TextInputWidget::uploadMedia); - connect(emojiBtn_, - SIGNAL(emojiSelected(const QString &)), - this, - SLOT(addSelectedEmoji(const QString &))); - - connect(input_, &FilteredTextEdit::startedTyping, this, &TextInputWidget::startedTyping); - - connect(input_, &FilteredTextEdit::stoppedTyping, this, &TextInputWidget::stoppedTyping); - - connect( - input_, &FilteredTextEdit::startedUpload, this, &TextInputWidget::showUploadSpinner); -} - -void -TextInputWidget::addSelectedEmoji(const QString &emoji) -{ - QTextCursor cursor = input_->textCursor(); - - QTextCharFormat charfmt; - input_->setCurrentCharFormat(charfmt); - - input_->insertPlainText(emoji); - cursor.movePosition(QTextCursor::End); - - input_->setCurrentCharFormat(charfmt); - - input_->show(); -} - -void -TextInputWidget::command(QString command, QString args) -{ - if (command == "me") { - emit sendEmoteMessage(args); - } else if (command == "join") { - emit sendJoinRoomRequest(args); - } else if (command == "invite") { - emit sendInviteRoomRequest(args.section(' ', 0, 0), args.section(' ', 1, -1)); - } else if (command == "kick") { - emit sendKickRoomRequest(args.section(' ', 0, 0), args.section(' ', 1, -1)); - } else if (command == "ban") { - emit sendBanRoomRequest(args.section(' ', 0, 0), args.section(' ', 1, -1)); - } else if (command == "unban") { - emit sendUnbanRoomRequest(args.section(' ', 0, 0), args.section(' ', 1, -1)); - } else if (command == "roomnick") { - emit changeRoomNick(args); - } else if (command == "shrug") { - emit sendTextMessage("¯\\_(ツ)_/¯" + (args.isEmpty() ? "" : " " + args)); - } else if (command == "fliptable") { - emit sendTextMessage("(╯°□°)╯︵ ┻━┻"); - } else if (command == "unfliptable") { - emit sendTextMessage(" ┯━┯╭( º _ º╭)"); - } else if (command == "sovietflip") { - emit sendTextMessage("ノ┬─┬ノ ︵ ( \\o°o)\\"); - } else if (command == "clear-timeline") { - emit clearRoomTimeline(); - } else if (command == "rotate-megolm-session") { - emit rotateMegolmSession(); - } -} - -void -TextInputWidget::openFileSelection() -{ - const QString homeFolder = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); - const auto fileName = - QFileDialog::getOpenFileName(this, tr("Select a file"), homeFolder, tr("All Files (*)")); - - if (fileName.isEmpty()) - return; - - QMimeDatabase db; - QMimeType mime = db.mimeTypeForFile(fileName, QMimeDatabase::MatchContent); - - const auto format = mime.name().split("/")[0]; - - QSharedPointer file{new QFile{fileName, this}}; - - emit uploadMedia(file, format, QFileInfo(fileName).fileName()); - - showUploadSpinner(); -} - -void -TextInputWidget::showUploadSpinner() -{ - topLayout_->removeWidget(sendFileBtn_); - sendFileBtn_->hide(); - - topLayout_->insertWidget(1, spinner_); - spinner_->start(); -} - -void -TextInputWidget::hideUploadSpinner() -{ - topLayout_->removeWidget(spinner_); - topLayout_->insertWidget(1, sendFileBtn_); - sendFileBtn_->show(); - spinner_->stop(); -} - -void -TextInputWidget::stopTyping() -{ - input_->stopTyping(); -} - -void -TextInputWidget::focusInEvent(QFocusEvent *event) -{ - input_->setFocus(event->reason()); -} - -void -TextInputWidget::paintEvent(QPaintEvent *) -{ - QStyleOption opt; - opt.init(this); - QPainter p(this); - - style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); -} - -void -TextInputWidget::changeCallButtonState(webrtc::State state) -{ - QIcon icon; - if (state == webrtc::State::ICEFAILED || state == webrtc::State::DISCONNECTED) { - callBtn_->setToolTip(tr("Place a call")); - icon.addFile(":/icons/icons/ui/place-call.png"); - } else { - callBtn_->setToolTip(tr("Hang up")); - icon.addFile(":/icons/icons/ui/end-call.png"); - } - callBtn_->setIcon(icon); - callBtn_->setIconSize(QSize(ButtonHeight * 1.1, ButtonHeight * 1.1)); -} diff --git a/src/TextInputWidget.h b/src/TextInputWidget.h deleted file mode 100644 index 7cc73e98..00000000 --- a/src/TextInputWidget.h +++ /dev/null @@ -1,213 +0,0 @@ -/* - * nheko Copyright (C) 2017 Konstantinos Sideris - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -#include -#include - -#include -#include -#include -#include -#include - -#include "WebRTCSession.h" -#include "dialogs/PreviewUploadOverlay.h" -#include "emoji/PickButton.h" -#include "popups/SuggestionsPopup.h" - -struct SearchResult; - -class CompletionModel; -class FlatButton; -class LoadingIndicator; -class QCompleter; - -class FilteredTextEdit : public QTextEdit -{ - Q_OBJECT - -public: - explicit FilteredTextEdit(QWidget *parent = nullptr); - - void stopTyping(); - - QSize sizeHint() const override; - QSize minimumSizeHint() const override; - - void submit(); - -signals: - void heightChanged(int height); - void startedTyping(); - void stoppedTyping(); - void startedUpload(); - void message(QString msg); - void command(QString name, QString args); - void media(QSharedPointer data, QString mimeClass, const QString &filename); - - //! Trigger the suggestion popup. - void showSuggestions(const QString &query); - void resultsRetrieved(const std::vector &results); - void selectNextSuggestion(); - void selectPreviousSuggestion(); - void selectHoveredSuggestion(); - -public slots: - void showResults(const std::vector &results); - -protected: - void keyPressEvent(QKeyEvent *event) override; - bool canInsertFromMimeData(const QMimeData *source) const override; - void insertFromMimeData(const QMimeData *source) override; - void focusOutEvent(QFocusEvent *event) override - { - suggestionsPopup_.hide(); - QTextEdit::focusOutEvent(event); - } - -private: - bool emoji_popup_open_ = false; - CompletionModel *emoji_completion_model_; - std::deque true_history_, working_history_; - int trigger_pos_; // Where emoji completer was triggered - size_t history_index_; - QCompleter *completer_; - QTimer *typingTimer_; - - SuggestionsPopup suggestionsPopup_; - - enum class AnchorType - { - Tab = 0, - Sigil = 1, - }; - - AnchorType anchorType_ = AnchorType::Sigil; - - int anchorWidth(AnchorType anchor) { return static_cast(anchor); } - - void closeSuggestions() { suggestionsPopup_.hide(); } - void resetAnchor() { atTriggerPosition_ = -1; } - bool isAnchorValid() { return atTriggerPosition_ != -1; } - bool hasAnchor(int pos, AnchorType anchor) - { - return pos == atTriggerPosition_ + anchorWidth(anchor); - } - QRect completerRect(); - QString query() - { - auto cursor = textCursor(); - cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor); - return cursor.selectedText(); - } - QString textAfterPosition(int pos) - { - auto tc = textCursor(); - tc.setPosition(pos); - tc.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); - return tc.selectedText(); - } - - dialogs::PreviewUploadOverlay previewDialog_; - - //! Latest position of the '@' character that triggers the username completer. - int atTriggerPosition_ = -1; - - void insertCompletion(QString completion); - void textChanged(); - void uploadData(const QByteArray data, const QString &media, const QString &filename); - void afterCompletion(int); - void showPreview(const QMimeData *source, const QStringList &formats); -}; - -class TextInputWidget : public QWidget -{ - Q_OBJECT - - Q_PROPERTY(QColor borderColor READ borderColor WRITE setBorderColor) - -public: - TextInputWidget(QWidget *parent = nullptr); - - void stopTyping(); - - QColor borderColor() const { return borderColor_; } - void setBorderColor(QColor &color) { borderColor_ = color; } - void disableInput() - { - input_->setEnabled(false); - input_->setPlaceholderText(tr("Connection lost. Nheko is trying to re-connect...")); - } - void enableInput() - { - input_->setEnabled(true); - input_->setPlaceholderText(tr("Write a message...")); - } - -public slots: - void openFileSelection(); - void hideUploadSpinner(); - void focusLineEdit() { input_->setFocus(); } - void changeCallButtonState(webrtc::State); - -private slots: - void addSelectedEmoji(const QString &emoji); - -signals: - void sendTextMessage(const QString &msg); - void sendEmoteMessage(QString msg); - void clearRoomTimeline(); - void heightChanged(int height); - - void uploadMedia(const QSharedPointer data, - QString mimeClass, - const QString &filename); - void callButtonPress(); - - void sendJoinRoomRequest(const QString &room); - void sendInviteRoomRequest(const QString &userid, const QString &reason); - void sendKickRoomRequest(const QString &userid, const QString &reason); - void sendBanRoomRequest(const QString &userid, const QString &reason); - void sendUnbanRoomRequest(const QString &userid, const QString &reason); - void changeRoomNick(const QString &displayname); - void rotateMegolmSession(); - - void startedTyping(); - void stoppedTyping(); - -protected: - void focusInEvent(QFocusEvent *event) override; - void paintEvent(QPaintEvent *) override; - -private: - void showUploadSpinner(); - void command(QString name, QString args); - - QHBoxLayout *topLayout_; - FilteredTextEdit *input_; - - LoadingIndicator *spinner_; - - FlatButton *callBtn_; - FlatButton *sendFileBtn_; - FlatButton *sendMessageBtn_; - emoji::PickButton *emojiBtn_; - - QColor borderColor_; -}; diff --git a/src/UsersModel.cpp b/src/UsersModel.cpp new file mode 100644 index 00000000..4be37503 --- /dev/null +++ b/src/UsersModel.cpp @@ -0,0 +1,53 @@ +#include "UsersModel.h" + +#include "Cache.h" +#include "CompletionModelRoles.h" + +UsersModel::UsersModel(const std::string &roomId, QObject *parent) + : QAbstractListModel(parent) + , room_id(roomId) +{ + roomMembers_ = cache::roomMembers(roomId); + for (const auto &m : roomMembers_) { + displayNames.push_back(QString::fromStdString(cache::displayName(room_id, m))); + userids.push_back(QString::fromStdString(m)); + } +} + +QHash +UsersModel::roleNames() const +{ + return { + {CompletionModel::CompletionRole, "completionRole"}, + {CompletionModel::SearchRole, "searchRole"}, + {CompletionModel::SearchRole2, "searchRole2"}, + {Roles::DisplayName, "displayName"}, + {Roles::AvatarUrl, "avatarUrl"}, + {Roles::UserID, "userid"}, + }; +} + +QVariant +UsersModel::data(const QModelIndex &index, int role) const +{ + if (hasIndex(index.row(), index.column(), index.parent())) { + switch (role) { + case CompletionModel::CompletionRole: + return QString("[%1](https://matrix.to/#/%2)") + .arg(displayNames[index.row()]) + .arg(userids[index.row()]); + case CompletionModel::SearchRole: + case Qt::DisplayRole: + case Roles::DisplayName: + return displayNames[index.row()]; + case CompletionModel::SearchRole2: + return userids[index.row()]; + case Roles::AvatarUrl: + return cache::avatarUrl(QString::fromStdString(room_id), + QString::fromStdString(roomMembers_[index.row()])); + case Roles::UserID: + return userids[index.row()]; + } + } + return {}; +} diff --git a/src/UsersModel.h b/src/UsersModel.h new file mode 100644 index 00000000..c60b34b8 --- /dev/null +++ b/src/UsersModel.h @@ -0,0 +1,29 @@ +#pragma once + +#include + +class UsersModel : public QAbstractListModel +{ +public: + enum Roles + { + AvatarUrl = Qt::UserRole, + DisplayName, + UserID, + }; + + UsersModel(const std::string &roomId, QObject *parent = nullptr); + QHash roleNames() const override; + int rowCount(const QModelIndex &parent = QModelIndex()) const override + { + (void)parent; + return roomMembers_.size(); + } + QVariant data(const QModelIndex &index, int role) const override; + +private: + std::string room_id; + std::vector roomMembers_; + std::vector displayNames; + std::vector userids; +}; diff --git a/src/Utils.cpp b/src/Utils.cpp index 38dbba22..2896e773 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -677,9 +677,10 @@ utils::restoreCombobox(QComboBox *combo, const QString &value) } QImage -utils::readImage(QByteArray *data) +utils::readImage(const QByteArray *data) { - QBuffer buf(data); + QBuffer buf; + buf.setData(*data); QImageReader reader(&buf); reader.setAutoTransform(true); return reader.read(); diff --git a/src/Utils.h b/src/Utils.h index 5e7fb601..f59e8673 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -303,5 +303,5 @@ restoreCombobox(QComboBox *combo, const QString &value); //! Read image respecting exif orientation QImage -readImage(QByteArray *data); +readImage(const QByteArray *data); } diff --git a/src/dialogs/PreviewUploadOverlay.cpp b/src/dialogs/PreviewUploadOverlay.cpp index 20959b0a..bd207642 100644 --- a/src/dialogs/PreviewUploadOverlay.cpp +++ b/src/dialogs/PreviewUploadOverlay.cpp @@ -60,7 +60,10 @@ PreviewUploadOverlay::PreviewUploadOverlay(QWidget *parent) emit confirmUpload(data_, mediaType_, fileName_.text()); close(); }); - connect(&cancel_, &QPushButton::clicked, this, &PreviewUploadOverlay::close); + connect(&cancel_, &QPushButton::clicked, this, [this]() { + emit aborted(); + close(); + }); } void @@ -115,7 +118,7 @@ PreviewUploadOverlay::init() void PreviewUploadOverlay::setLabels(const QString &type, const QString &mime, uint64_t upload_size) { - if (mediaType_ == "image") { + if (mediaType_.split('/')[0] == "image") { if (!image_.loadFromData(data_)) { titleLabel_.setText(QString{tr(ERR_MSG)}.arg(type)); } else { @@ -151,7 +154,7 @@ PreviewUploadOverlay::setPreview(const QImage &src, const QString &mime) else titleLabel_.setText(QString{tr(ERR_MSG)}.arg(type)); - mediaType_ = split[0]; + mediaType_ = mime; filePath_ = "clipboard." + type; image_.convertFromImage(src); isImage_ = true; @@ -167,7 +170,7 @@ PreviewUploadOverlay::setPreview(const QByteArray data, const QString &mime) auto const &type = split[1]; data_ = data; - mediaType_ = split[0]; + mediaType_ = mime; filePath_ = "clipboard." + type; isImage_ = false; @@ -199,7 +202,7 @@ PreviewUploadOverlay::setPreview(const QString &path) auto const &split = mime.name().split('/'); - mediaType_ = split[0]; + mediaType_ = mime.name(); filePath_ = file.fileName(); isImage_ = false; diff --git a/src/dialogs/PreviewUploadOverlay.h b/src/dialogs/PreviewUploadOverlay.h index 11cd49bc..5139e3f2 100644 --- a/src/dialogs/PreviewUploadOverlay.h +++ b/src/dialogs/PreviewUploadOverlay.h @@ -40,6 +40,7 @@ public: signals: void confirmUpload(const QByteArray data, const QString &media, const QString &filename); + void aborted(); private: void init(); diff --git a/src/emoji/Category.cpp b/src/emoji/Category.cpp deleted file mode 100644 index 5197c474..00000000 --- a/src/emoji/Category.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - * nheko Copyright (C) 2017 Konstantinos Sideris - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include -#include -#include -#include - -#include "Config.h" - -#include "emoji/Category.h" - -using namespace emoji; - -Category::Category(QString category, std::vector emoji, QWidget *parent) - : QWidget(parent) -{ - mainLayout_ = new QVBoxLayout(this); - mainLayout_->setMargin(0); - mainLayout_->setSpacing(0); - - emojiListView_ = new QListView(); - itemModel_ = new QStandardItemModel(this); - - delegate_ = new ItemDelegate(this); - data_ = new Emoji; - - emojiListView_->setItemDelegate(delegate_); - emojiListView_->setModel(itemModel_); - emojiListView_->setViewMode(QListView::IconMode); - emojiListView_->setFlow(QListView::LeftToRight); - emojiListView_->setResizeMode(QListView::Adjust); - emojiListView_->setMouseTracking(true); - emojiListView_->verticalScrollBar()->setEnabled(false); - emojiListView_->horizontalScrollBar()->setEnabled(false); - - const int cols = 7; - const int rows = emoji.size() / 7 + 1; - - const int emojiSize = 48; - const int gridSize = emojiSize + 4; - // TODO: Be precise here. Take the parent into consideration. - emojiListView_->setFixedSize(cols * gridSize + 20, rows * gridSize); - emojiListView_->setGridSize(QSize(gridSize, gridSize)); - emojiListView_->setDragEnabled(false); - emojiListView_->setEditTriggers(QAbstractItemView::NoEditTriggers); - - for (const auto &e : emoji) { - data_->unicode = e.unicode; - - auto item = new QStandardItem; - item->setSizeHint(QSize(emojiSize, emojiSize)); - - QVariant unicode(data_->unicode); - item->setData(unicode.toString(), Qt::UserRole); - - itemModel_->appendRow(item); - } - - QFont font; - font.setWeight(QFont::Medium); - - category_ = new QLabel(category, this); - category_->setFont(font); - - mainLayout_->addWidget(category_); - mainLayout_->addWidget(emojiListView_); - - connect(emojiListView_, &QListView::clicked, this, &Category::clickIndex); -} - -void -Category::paintEvent(QPaintEvent *) -{ - QStyleOption opt; - opt.init(this); - QPainter p(this); - style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); -} diff --git a/src/emoji/Category.h b/src/emoji/Category.h deleted file mode 100644 index 79e616ee..00000000 --- a/src/emoji/Category.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * nheko Copyright (C) 2017 Konstantinos Sideris - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -#include - -#include "ItemDelegate.h" - -class QLabel; -class QListView; -class QStandardItemModel; -class QVBoxLayout; - -namespace emoji { - -class Category : public QWidget -{ - Q_OBJECT - Q_PROPERTY( - QColor hoverBackgroundColor READ hoverBackgroundColor WRITE setHoverBackgroundColor) - -public: - Category(QString category, std::vector emoji, QWidget *parent = nullptr); - QColor hoverBackgroundColor() const { return hoverBackgroundColor_; } - void setHoverBackgroundColor(QColor color) { hoverBackgroundColor_ = color; } - -signals: - void emojiSelected(const QString &emoji); - -protected: - void paintEvent(QPaintEvent *event) override; - -private slots: - void clickIndex(const QModelIndex &index) - { - emit emojiSelected(index.data(Qt::UserRole).toString()); - }; - -private: - QVBoxLayout *mainLayout_; - - QStandardItemModel *itemModel_; - QListView *emojiListView_; - - emoji::Emoji *data_; - emoji::ItemDelegate *delegate_; - - QLabel *category_; - - QColor hoverBackgroundColor_; -}; -} // namespace emoji diff --git a/src/emoji/EmojiModel.cpp b/src/emoji/EmojiModel.cpp index b6a985b8..85c2dd34 100644 --- a/src/emoji/EmojiModel.cpp +++ b/src/emoji/EmojiModel.cpp @@ -3,6 +3,8 @@ #include #include +#include "CompletionModelRoles.h" + using namespace emoji; QHash @@ -35,10 +37,12 @@ EmojiModel::data(const QModelIndex &index, int role) const if (hasIndex(index.row(), index.column(), index.parent())) { switch (role) { case Qt::DisplayRole: + case CompletionModel::CompletionRole: case static_cast(EmojiModel::Roles::Unicode): return Provider::emoji[index.row()].unicode; case Qt::ToolTipRole: + case CompletionModel::SearchRole: case static_cast(EmojiModel::Roles::ShortName): return Provider::emoji[index.row()].shortName; diff --git a/src/emoji/EmojiSearchModel.h b/src/emoji/EmojiSearchModel.h index 13a03934..7dbe6732 100644 --- a/src/emoji/EmojiSearchModel.h +++ b/src/emoji/EmojiSearchModel.h @@ -2,6 +2,7 @@ #include "EmojiModel.h" +#include #include #include #include @@ -19,12 +20,21 @@ public: } QVariant data(const QModelIndex &index, int role = Qt::UserRole + 1) const override { - if (role == Qt::DisplayRole) { + switch (role) { + case Qt::DisplayRole: { auto emoji = QSortFilterProxyModel::data(index, role).toString(); return emoji + " :" + toShortcode(data(index, EmojiModel::ShortName).toString()) + ":"; } - return QSortFilterProxyModel::data(index, role); + case CompletionModel::CompletionRole: + return QSortFilterProxyModel::data(index, EmojiModel::Unicode); + case CompletionModel::SearchRole: { + return toShortcode( + QSortFilterProxyModel::data(index, EmojiModel::ShortName).toString()); + } + default: + return QSortFilterProxyModel::data(index, role); + } } private: diff --git a/src/emoji/ItemDelegate.cpp b/src/emoji/ItemDelegate.cpp deleted file mode 100644 index afa01625..00000000 --- a/src/emoji/ItemDelegate.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * nheko Copyright (C) 2017 Konstantinos Sideris - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include - -#include "emoji/ItemDelegate.h" - -using namespace emoji; - -ItemDelegate::ItemDelegate(QObject *parent) - : QStyledItemDelegate(parent) -{ - data_ = new Emoji; -} - -ItemDelegate::~ItemDelegate() { delete data_; } - -void -ItemDelegate::paint(QPainter *painter, - const QStyleOptionViewItem &option, - const QModelIndex &index) const -{ - Q_UNUSED(index); - - painter->save(); - - QStyleOptionViewItem viewOption(option); - - auto emoji = index.data(Qt::UserRole).toString(); - - QSettings settings; - - QFont font; - QString userFontFamily = settings.value("user/emoji_font_family", "emoji").toString(); - if (!userFontFamily.isEmpty()) { - font.setFamily(userFontFamily); - } else { - font.setFamily("emoji"); - } - - font.setPixelSize(36); - painter->setFont(font); - if (option.state & QStyle::State_MouseOver) { - painter->setBackgroundMode(Qt::OpaqueMode); - QColor hoverColor = parent()->property("hoverBackgroundColor").value(); - painter->setBackground(hoverColor); - } - painter->drawText(viewOption.rect, Qt::AlignCenter, emoji); - - painter->restore(); -} diff --git a/src/emoji/ItemDelegate.h b/src/emoji/ItemDelegate.h deleted file mode 100644 index d6b9b9d7..00000000 --- a/src/emoji/ItemDelegate.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * nheko Copyright (C) 2017 Konstantinos Sideris - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -#include -#include -#include - -#include "Provider.h" - -namespace emoji { - -class ItemDelegate : public QStyledItemDelegate -{ - Q_OBJECT - -public: - explicit ItemDelegate(QObject *parent = nullptr); - ~ItemDelegate() override; - - void paint(QPainter *painter, - const QStyleOptionViewItem &option, - const QModelIndex &index) const override; - -private: - Emoji *data_; -}; -} // namespace emoji diff --git a/src/emoji/Panel.cpp b/src/emoji/Panel.cpp deleted file mode 100644 index f0e4449d..00000000 --- a/src/emoji/Panel.cpp +++ /dev/null @@ -1,231 +0,0 @@ -/* - * nheko Copyright (C) 2017 Konstantinos Sideris - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include -#include - -#include "ui/DropShadow.h" -#include "ui/FlatButton.h" - -#include "emoji/Category.h" -#include "emoji/Panel.h" - -using namespace emoji; - -Panel::Panel(QWidget *parent) - : QWidget(parent) - , shadowMargin_{2} - , width_{370} - , height_{350} - , categoryIconSize_{20} -{ - setAttribute(Qt::WA_ShowWithoutActivating, true); - setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint); - - auto mainWidget = new QWidget(this); - mainWidget->setMaximumSize(width_, height_); - - auto topLayout = new QVBoxLayout(this); - topLayout->addWidget(mainWidget); - topLayout->setMargin(shadowMargin_); - topLayout->setSpacing(0); - - auto contentLayout = new QVBoxLayout(mainWidget); - contentLayout->setMargin(0); - contentLayout->setSpacing(0); - - auto emojiCategories = new QFrame(mainWidget); - - auto categoriesLayout = new QHBoxLayout(emojiCategories); - categoriesLayout->setSpacing(0); - categoriesLayout->setMargin(0); - - QIcon icon; - - auto peopleCategory = new FlatButton(emojiCategories); - icon.addFile(":/icons/icons/emoji-categories/people.png"); - peopleCategory->setIcon(icon); - peopleCategory->setIconSize(QSize(categoryIconSize_, categoryIconSize_)); - - auto natureCategory_ = new FlatButton(emojiCategories); - icon.addFile(":/icons/icons/emoji-categories/nature.png"); - natureCategory_->setIcon(icon); - natureCategory_->setIconSize(QSize(categoryIconSize_, categoryIconSize_)); - - auto foodCategory_ = new FlatButton(emojiCategories); - icon.addFile(":/icons/icons/emoji-categories/foods.png"); - foodCategory_->setIcon(icon); - foodCategory_->setIconSize(QSize(categoryIconSize_, categoryIconSize_)); - - auto activityCategory = new FlatButton(emojiCategories); - icon.addFile(":/icons/icons/emoji-categories/activity.png"); - activityCategory->setIcon(icon); - activityCategory->setIconSize(QSize(categoryIconSize_, categoryIconSize_)); - - auto travelCategory = new FlatButton(emojiCategories); - icon.addFile(":/icons/icons/emoji-categories/travel.png"); - travelCategory->setIcon(icon); - travelCategory->setIconSize(QSize(categoryIconSize_, categoryIconSize_)); - - auto objectsCategory = new FlatButton(emojiCategories); - icon.addFile(":/icons/icons/emoji-categories/objects.png"); - objectsCategory->setIcon(icon); - objectsCategory->setIconSize(QSize(categoryIconSize_, categoryIconSize_)); - - auto symbolsCategory = new FlatButton(emojiCategories); - icon.addFile(":/icons/icons/emoji-categories/symbols.png"); - symbolsCategory->setIcon(icon); - symbolsCategory->setIconSize(QSize(categoryIconSize_, categoryIconSize_)); - - auto flagsCategory = new FlatButton(emojiCategories); - icon.addFile(":/icons/icons/emoji-categories/flags.png"); - flagsCategory->setIcon(icon); - flagsCategory->setIconSize(QSize(categoryIconSize_, categoryIconSize_)); - - categoriesLayout->addWidget(peopleCategory); - categoriesLayout->addWidget(natureCategory_); - categoriesLayout->addWidget(foodCategory_); - categoriesLayout->addWidget(activityCategory); - categoriesLayout->addWidget(travelCategory); - categoriesLayout->addWidget(objectsCategory); - categoriesLayout->addWidget(symbolsCategory); - categoriesLayout->addWidget(flagsCategory); - - scrollArea_ = new QScrollArea(this); - scrollArea_->setWidgetResizable(true); - scrollArea_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - - auto scrollWidget = new QWidget(this); - auto scrollLayout = new QVBoxLayout(scrollWidget); - - scrollLayout->setMargin(0); - scrollLayout->setSpacing(0); - scrollArea_->setWidget(scrollWidget); - - auto peopleEmoji = - new Category(tr("Smileys & People"), emoji_provider_.people, scrollWidget); - scrollLayout->addWidget(peopleEmoji); - - auto natureEmoji = - new Category(tr("Animals & Nature"), emoji_provider_.nature, scrollWidget); - scrollLayout->addWidget(natureEmoji); - - auto foodEmoji = new Category(tr("Food & Drink"), emoji_provider_.food, scrollWidget); - scrollLayout->addWidget(foodEmoji); - - auto activityEmoji = new Category(tr("Activity"), emoji_provider_.activity, scrollWidget); - scrollLayout->addWidget(activityEmoji); - - auto travelEmoji = - new Category(tr("Travel & Places"), emoji_provider_.travel, scrollWidget); - scrollLayout->addWidget(travelEmoji); - - auto objectsEmoji = new Category(tr("Objects"), emoji_provider_.objects, scrollWidget); - scrollLayout->addWidget(objectsEmoji); - - auto symbolsEmoji = new Category(tr("Symbols"), emoji_provider_.symbols, scrollWidget); - scrollLayout->addWidget(symbolsEmoji); - - auto flagsEmoji = new Category(tr("Flags"), emoji_provider_.flags, scrollWidget); - scrollLayout->addWidget(flagsEmoji); - - contentLayout->addWidget(scrollArea_); - contentLayout->addWidget(emojiCategories); - - connect(peopleEmoji, &Category::emojiSelected, this, &Panel::emojiSelected); - connect(peopleCategory, &QPushButton::clicked, [this, peopleEmoji]() { - this->showCategory(peopleEmoji); - }); - - connect(natureEmoji, &Category::emojiSelected, this, &Panel::emojiSelected); - connect(natureCategory_, &QPushButton::clicked, [this, natureEmoji]() { - this->showCategory(natureEmoji); - }); - - connect(foodEmoji, &Category::emojiSelected, this, &Panel::emojiSelected); - connect(foodCategory_, &QPushButton::clicked, [this, foodEmoji]() { - this->showCategory(foodEmoji); - }); - - connect(activityEmoji, &Category::emojiSelected, this, &Panel::emojiSelected); - connect(activityCategory, &QPushButton::clicked, [this, activityEmoji]() { - this->showCategory(activityEmoji); - }); - - connect(travelEmoji, &Category::emojiSelected, this, &Panel::emojiSelected); - connect(travelCategory, &QPushButton::clicked, [this, travelEmoji]() { - this->showCategory(travelEmoji); - }); - - connect(objectsEmoji, &Category::emojiSelected, this, &Panel::emojiSelected); - connect(objectsCategory, &QPushButton::clicked, [this, objectsEmoji]() { - this->showCategory(objectsEmoji); - }); - - connect(symbolsEmoji, &Category::emojiSelected, this, &Panel::emojiSelected); - connect(symbolsCategory, &QPushButton::clicked, [this, symbolsEmoji]() { - this->showCategory(symbolsEmoji); - }); - - connect(flagsEmoji, &Category::emojiSelected, this, &Panel::emojiSelected); - connect(flagsCategory, &QPushButton::clicked, [this, flagsEmoji]() { - this->showCategory(flagsEmoji); - }); -} - -void -Panel::showCategory(const Category *category) -{ - auto posToGo = category->mapToParent(QPoint()).y(); - auto current = scrollArea_->verticalScrollBar()->value(); - - if (current == posToGo) - return; - - // HACK - // We want the top of the category to be visible, so scroll to the top first and then to the - // category - if (current > posToGo) - this->scrollArea_->ensureVisible(0, 0, 0, 0); - - posToGo += scrollArea_->height(); - this->scrollArea_->ensureVisible(0, posToGo, 0, 0); -} - -void -Panel::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event); - - QStyleOption opt; - opt.init(this); - QPainter p(this); - style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); - - DropShadow::draw(p, - shadowMargin_, - 4.0, - QColor(120, 120, 120, 92), - QColor(255, 255, 255, 0), - 0.0, - 1.0, - 0.6, - width(), - height()); -} diff --git a/src/emoji/Panel.h b/src/emoji/Panel.h deleted file mode 100644 index ad233c27..00000000 --- a/src/emoji/Panel.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * nheko Copyright (C) 2017 Konstantinos Sideris - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -#include - -#include "Provider.h" - -namespace emoji { - -class Category; - -class Panel : public QWidget -{ - Q_OBJECT - -public: - Panel(QWidget *parent = nullptr); - -signals: - void mouseLeft(); - void emojiSelected(const QString &emoji); - -protected: - void leaveEvent(QEvent *event) override - { - emit leaving(); - QWidget::leaveEvent(event); - } - - void paintEvent(QPaintEvent *event) override; - -signals: - void leaving(); - -private: - void showCategory(const Category *category); - - Provider emoji_provider_; - - QScrollArea *scrollArea_; - - int shadowMargin_; - - // Panel dimensions. - int width_; - int height_; - - int categoryIconSize_; -}; -} // namespace emoji diff --git a/src/emoji/PickButton.cpp b/src/emoji/PickButton.cpp deleted file mode 100644 index 608b4fa2..00000000 --- a/src/emoji/PickButton.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - * nheko Copyright (C) 2017 Konstantinos Sideris - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include - -#include "emoji/Panel.h" -#include "emoji/PickButton.h" - -using namespace emoji; - -// Number of milliseconds after which the panel will be hidden -// if the mouse cursor is not on top of the widget. -constexpr int HIDE_TIMEOUT = 300; - -PickButton::PickButton(QWidget *parent) - : FlatButton(parent) - , panel_{nullptr} -{ - connect(&hideTimer_, &QTimer::timeout, this, &PickButton::hidePanel); - connect(this, &QPushButton::clicked, this, [this]() { - if (panel_ && panel_->isVisible()) { - hidePanel(); - return; - } - - showPanel(); - }); -} - -void -PickButton::hidePanel() -{ - if (panel_ && !panel_->underMouse()) { - hideTimer_.stop(); - panel_->hide(); - } -} - -void -PickButton::showPanel() -{ - if (panel_.isNull()) { - panel_ = QSharedPointer(new Panel(this)); - connect(panel_.data(), &Panel::emojiSelected, this, &PickButton::emojiSelected); - connect(panel_.data(), &Panel::leaving, this, [this]() { panel_->hide(); }); - } - - if (panel_->isVisible()) - return; - - QPoint pos(rect().x(), rect().y()); - pos = this->mapToGlobal(pos); - - auto panel_size = panel_->sizeHint(); - - auto x = pos.x() - panel_size.width() + horizontal_distance_; - auto y = pos.y() - panel_size.height() - vertical_distance_; - - panel_->move(x, y); - panel_->show(); -} - -void -PickButton::leaveEvent(QEvent *e) -{ - hideTimer_.start(HIDE_TIMEOUT); - FlatButton::leaveEvent(e); -} diff --git a/src/emoji/PickButton.h b/src/emoji/PickButton.h deleted file mode 100644 index 97ed8c37..00000000 --- a/src/emoji/PickButton.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * nheko Copyright (C) 2017 Konstantinos Sideris - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -#include -#include -#include - -#include "ui/FlatButton.h" - -namespace emoji { - -class Panel; - -class PickButton : public FlatButton -{ - Q_OBJECT -public: - explicit PickButton(QWidget *parent = nullptr); - -signals: - void emojiSelected(const QString &emoji); - -protected: - void leaveEvent(QEvent *e) override; - -private: - void showPanel(); - void hidePanel(); - - // Vertical distance from panel's bottom. - int vertical_distance_ = 10; - - // Horizontal distance from panel's bottom right corner. - int horizontal_distance_ = 70; - - QSharedPointer panel_; - QTimer hideTimer_; -}; -} // namespace emoji diff --git a/src/emoji/Provider.cpp b/src/emoji/Provider.cpp deleted file mode 100644 index 0e11be4a..00000000 --- a/src/emoji/Provider.cpp +++ /dev/null @@ -1,7734 +0,0 @@ -/* - * nheko Copyright (C) 2017 Konstantinos Sideris - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "emoji/Provider.h" - -using namespace emoji; - -const std::vector emoji::Provider::people = { - // People - Emoji{QString::fromUtf8("\xf0\x9f\x98\x80"), "grinning face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x83"), - "grinning face with big eyes", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x84"), - "grinning face with smiling eyes", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x81"), - "beaming face with smiling eyes", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x86"), - "grinning squinting face", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x85"), - "grinning face with sweat", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa3"), - "rolling on the floor laughing", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x82"), - "face with tears of joy", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x82"), - "slightly smiling face", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x83"), "upside-down face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x89"), "winking face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x8a"), - "smiling face with smiling eyes", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x87"), - "smiling face with halo", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xb0"), - "smiling face with hearts", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x8d"), - "smiling face with heart-eyes", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa9"), "star-struck", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x98"), "face blowing a kiss", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x97"), "kissing face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x98\xba"), "smiling face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x9a"), - "kissing face with closed eyes", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x99"), - "kissing face with smiling eyes", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xb2"), - "smiling face with tear", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x8b"), "face savoring food", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x9b"), "face with tongue", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x9c"), - "winking face with tongue", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xaa"), "zany face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x9d"), - "squinting face with tongue", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x91"), "money-mouth face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x97"), "hugging face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xad"), - "face with hand over mouth", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xab"), "shushing face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x94"), "thinking face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x90"), "zipper-mouth face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa8"), - "face with raised eyebrow", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x90"), "neutral face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x91"), "expressionless face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xb6"), "face without mouth", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x8f"), "smirking face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x92"), "unamused face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x84"), - "face with rolling eyes", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xac"), "grimacing face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa5"), "lying face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x8c"), "relieved face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x94"), "pensive face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xaa"), "sleepy face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa4"), "drooling face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xb4"), "sleeping face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xb7"), - "face with medical mask", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x92"), - "face with thermometer", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x95"), - "face with head-bandage", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa2"), "nauseated face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xae"), "face vomiting", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa7"), "sneezing face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xb5"), "hot face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xb6"), "cold face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xb4"), "woozy face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xb5"), "dizzy face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xaf"), "exploding head", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa0"), "cowboy hat face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xb3"), "partying face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xb8"), "disguised face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x8e"), - "smiling face with sunglasses", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x93"), "nerd face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x90"), "face with monocle", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x95"), "confused face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x9f"), "worried face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x81"), - "slightly frowning face", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x98\xb9"), "frowning face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xae"), - "face with open mouth", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xaf"), "hushed face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xb2"), "astonished face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xb3"), "flushed face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xba"), "pleading face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xa6"), - "frowning face with open mouth", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xa7"), "anguished face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xa8"), "fearful face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xb0"), - "anxious face with sweat", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xa5"), - "sad but relieved face", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xa2"), "crying face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xad"), "loudly crying face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xb1"), - "face screaming in fear", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x96"), "confounded face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xa3"), "persevering face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x9e"), "disappointed face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x93"), - "downcast face with sweat", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xa9"), "weary face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xab"), "tired face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xb1"), "yawning face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xa4"), - "face with steam from nose", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xa1"), "pouting face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xa0"), "angry face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xac"), - "face with symbols on mouth", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\x88"), - "smiling face with horns", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xbf"), - "angry face with horns", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x80"), "skull", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x98\xa0"), "skull and crossbones", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xa9"), "pile of poo", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa1"), "clown face", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb9"), "ogre", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xba"), "goblin", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xbb"), "ghost", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xbd"), "alien", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xbe"), "alien monster", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x96"), "robot", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xba"), "grinning cat", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xb8"), - "grinning cat with smiling eyes", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xb9"), - "cat with tears of joy", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xbb"), - "smiling cat with heart-eyes", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xbc"), "cat with wry smile", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xbd"), "kissing cat", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x80"), "weary cat", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xbf"), "crying cat", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x98\xbe"), "pouting cat", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x88"), "see-no-evil monkey", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x89"), "hear-no-evil monkey", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8a"), - "speak-no-evil monkey", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x8b"), "kiss mark", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x8c"), "love letter", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x98"), "heart with arrow", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x9d"), "heart with ribbon", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x96"), "sparkling heart", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x97"), "growing heart", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x93"), "beating heart", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x9e"), "revolving hearts", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x95"), "two hearts", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x9f"), "heart decoration", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9d\xa3"), "heart exclamation", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x94"), "broken heart", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9d\xa4"), "red heart", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xa1"), "orange heart", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x9b"), "yellow heart", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x9a"), "green heart", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x99"), "blue heart", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x9c"), "purple heart", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x8e"), "brown heart", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\xa4"), "black heart", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x8d"), "white heart", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xaf"), "hundred points", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xa2"), "anger symbol", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xa5"), "collision", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xab"), "dizzy", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xa6"), "sweat droplets", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xa8"), "dashing away", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb3"), "hole", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xa3"), "bomb", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xac"), "speech balloon", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x81\xef\xb8\x8f\xe2\x80\x8d\xf0\x9f\x97\xa8"), - "eye in speech bubble", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x81\xe2\x80\x8d\xf0\x9f\x97\xa8"), - "eye in speech bubble", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\xa8"), "left speech bubble", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\xaf"), "right anger bubble", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xad"), "thought balloon", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xa4"), "zzz", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8b"), "waving hand", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8b\xf0\x9f\x8f\xbb"), - "waving hand: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8b\xf0\x9f\x8f\xbc"), - "waving hand: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8b\xf0\x9f\x8f\xbd"), - "waving hand: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8b\xf0\x9f\x8f\xbe"), - "waving hand: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8b\xf0\x9f\x8f\xbf"), - "waving hand: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9a"), "raised back of hand", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9a\xf0\x9f\x8f\xbb"), - "raised back of hand: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9a\xf0\x9f\x8f\xbc"), - "raised back of hand: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9a\xf0\x9f\x8f\xbd"), - "raised back of hand: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9a\xf0\x9f\x8f\xbe"), - "raised back of hand: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9a\xf0\x9f\x8f\xbf"), - "raised back of hand: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x90"), - "hand with fingers splayed", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x90\xf0\x9f\x8f\xbb"), - "hand with fingers splayed: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x90\xf0\x9f\x8f\xbc"), - "hand with fingers splayed: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x90\xf0\x9f\x8f\xbd"), - "hand with fingers splayed: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x90\xf0\x9f\x8f\xbe"), - "hand with fingers splayed: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x90\xf0\x9f\x8f\xbf"), - "hand with fingers splayed: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8b"), "raised hand", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8b\xf0\x9f\x8f\xbb"), - "raised hand: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8b\xf0\x9f\x8f\xbc"), - "raised hand: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8b\xf0\x9f\x8f\xbd"), - "raised hand: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8b\xf0\x9f\x8f\xbe"), - "raised hand: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8b\xf0\x9f\x8f\xbf"), - "raised hand: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x96"), "vulcan salute", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x96\xf0\x9f\x8f\xbb"), - "vulcan salute: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x96\xf0\x9f\x8f\xbc"), - "vulcan salute: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x96\xf0\x9f\x8f\xbd"), - "vulcan salute: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x96\xf0\x9f\x8f\xbe"), - "vulcan salute: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x96\xf0\x9f\x8f\xbf"), - "vulcan salute: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8c"), "OK hand", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8c\xf0\x9f\x8f\xbb"), - "OK hand: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8c\xf0\x9f\x8f\xbc"), - "OK hand: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8c\xf0\x9f\x8f\xbd"), - "OK hand: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8c\xf0\x9f\x8f\xbe"), - "OK hand: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8c\xf0\x9f\x8f\xbf"), - "OK hand: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x8c"), "pinched fingers", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x8c\xf0\x9f\x8f\xbb"), - "pinched fingers: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x8c\xf0\x9f\x8f\xbc"), - "pinched fingers: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x8c\xf0\x9f\x8f\xbd"), - "pinched fingers: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x8c\xf0\x9f\x8f\xbe"), - "pinched fingers: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x8c\xf0\x9f\x8f\xbf"), - "pinched fingers: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x8f"), "pinching hand", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x8f\xf0\x9f\x8f\xbb"), - "pinching hand: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x8f\xf0\x9f\x8f\xbc"), - "pinching hand: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x8f\xf0\x9f\x8f\xbd"), - "pinching hand: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x8f\xf0\x9f\x8f\xbe"), - "pinching hand: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x8f\xf0\x9f\x8f\xbf"), - "pinching hand: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8c"), "victory hand", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8c\xf0\x9f\x8f\xbb"), - "victory hand: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8c\xf0\x9f\x8f\xbc"), - "victory hand: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8c\xf0\x9f\x8f\xbd"), - "victory hand: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8c\xf0\x9f\x8f\xbe"), - "victory hand: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8c\xf0\x9f\x8f\xbf"), - "victory hand: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9e"), "crossed fingers", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9e\xf0\x9f\x8f\xbb"), - "crossed fingers: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9e\xf0\x9f\x8f\xbc"), - "crossed fingers: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9e\xf0\x9f\x8f\xbd"), - "crossed fingers: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9e\xf0\x9f\x8f\xbe"), - "crossed fingers: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9e\xf0\x9f\x8f\xbf"), - "crossed fingers: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9f"), "love-you gesture", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9f\xf0\x9f\x8f\xbb"), - "love-you gesture: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9f\xf0\x9f\x8f\xbc"), - "love-you gesture: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9f\xf0\x9f\x8f\xbd"), - "love-you gesture: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9f\xf0\x9f\x8f\xbe"), - "love-you gesture: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9f\xf0\x9f\x8f\xbf"), - "love-you gesture: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x98"), "sign of the horns", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x98\xf0\x9f\x8f\xbb"), - "sign of the horns: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x98\xf0\x9f\x8f\xbc"), - "sign of the horns: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x98\xf0\x9f\x8f\xbd"), - "sign of the horns: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x98\xf0\x9f\x8f\xbe"), - "sign of the horns: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x98\xf0\x9f\x8f\xbf"), - "sign of the horns: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x99"), "call me hand", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x99\xf0\x9f\x8f\xbb"), - "call me hand: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x99\xf0\x9f\x8f\xbc"), - "call me hand: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x99\xf0\x9f\x8f\xbd"), - "call me hand: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x99\xf0\x9f\x8f\xbe"), - "call me hand: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x99\xf0\x9f\x8f\xbf"), - "call me hand: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x88"), - "backhand index pointing left", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x88\xf0\x9f\x8f\xbb"), - "backhand index pointing left: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x88\xf0\x9f\x8f\xbc"), - "backhand index pointing left: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x88\xf0\x9f\x8f\xbd"), - "backhand index pointing left: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x88\xf0\x9f\x8f\xbe"), - "backhand index pointing left: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x88\xf0\x9f\x8f\xbf"), - "backhand index pointing left: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x89"), - "backhand index pointing right", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x89\xf0\x9f\x8f\xbb"), - "backhand index pointing right: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x89\xf0\x9f\x8f\xbc"), - "backhand index pointing right: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x89\xf0\x9f\x8f\xbd"), - "backhand index pointing right: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x89\xf0\x9f\x8f\xbe"), - "backhand index pointing right: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x89\xf0\x9f\x8f\xbf"), - "backhand index pointing right: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x86"), - "backhand index pointing up", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x86\xf0\x9f\x8f\xbb"), - "backhand index pointing up: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x86\xf0\x9f\x8f\xbc"), - "backhand index pointing up: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x86\xf0\x9f\x8f\xbd"), - "backhand index pointing up: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x86\xf0\x9f\x8f\xbe"), - "backhand index pointing up: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x86\xf0\x9f\x8f\xbf"), - "backhand index pointing up: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x95"), "middle finger", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x95\xf0\x9f\x8f\xbb"), - "middle finger: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x95\xf0\x9f\x8f\xbc"), - "middle finger: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x95\xf0\x9f\x8f\xbd"), - "middle finger: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x95\xf0\x9f\x8f\xbe"), - "middle finger: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x95\xf0\x9f\x8f\xbf"), - "middle finger: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x87"), - "backhand index pointing down", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x87\xf0\x9f\x8f\xbb"), - "backhand index pointing down: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x87\xf0\x9f\x8f\xbc"), - "backhand index pointing down: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x87\xf0\x9f\x8f\xbd"), - "backhand index pointing down: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x87\xf0\x9f\x8f\xbe"), - "backhand index pointing down: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x87\xf0\x9f\x8f\xbf"), - "backhand index pointing down: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x98\x9d"), "index pointing up", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x98\x9d\xf0\x9f\x8f\xbb"), - "index pointing up: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x98\x9d\xf0\x9f\x8f\xbc"), - "index pointing up: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x98\x9d\xf0\x9f\x8f\xbd"), - "index pointing up: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x98\x9d\xf0\x9f\x8f\xbe"), - "index pointing up: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x98\x9d\xf0\x9f\x8f\xbf"), - "index pointing up: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8d"), "thumbs up", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8d\xf0\x9f\x8f\xbb"), - "thumbs up: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8d\xf0\x9f\x8f\xbc"), - "thumbs up: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8d\xf0\x9f\x8f\xbd"), - "thumbs up: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8d\xf0\x9f\x8f\xbe"), - "thumbs up: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8d\xf0\x9f\x8f\xbf"), - "thumbs up: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8e"), "thumbs down", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8e\xf0\x9f\x8f\xbb"), - "thumbs down: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8e\xf0\x9f\x8f\xbc"), - "thumbs down: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8e\xf0\x9f\x8f\xbd"), - "thumbs down: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8e\xf0\x9f\x8f\xbe"), - "thumbs down: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8e\xf0\x9f\x8f\xbf"), - "thumbs down: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8a"), "raised fist", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8a\xf0\x9f\x8f\xbb"), - "raised fist: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8a\xf0\x9f\x8f\xbc"), - "raised fist: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8a\xf0\x9f\x8f\xbd"), - "raised fist: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8a\xf0\x9f\x8f\xbe"), - "raised fist: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8a\xf0\x9f\x8f\xbf"), - "raised fist: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8a"), "oncoming fist", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8a\xf0\x9f\x8f\xbb"), - "oncoming fist: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8a\xf0\x9f\x8f\xbc"), - "oncoming fist: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8a\xf0\x9f\x8f\xbd"), - "oncoming fist: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8a\xf0\x9f\x8f\xbe"), - "oncoming fist: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8a\xf0\x9f\x8f\xbf"), - "oncoming fist: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9b"), "left-facing fist", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9b\xf0\x9f\x8f\xbb"), - "left-facing fist: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9b\xf0\x9f\x8f\xbc"), - "left-facing fist: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9b\xf0\x9f\x8f\xbd"), - "left-facing fist: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9b\xf0\x9f\x8f\xbe"), - "left-facing fist: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9b\xf0\x9f\x8f\xbf"), - "left-facing fist: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9c"), "right-facing fist", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9c\xf0\x9f\x8f\xbb"), - "right-facing fist: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9c\xf0\x9f\x8f\xbc"), - "right-facing fist: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9c\xf0\x9f\x8f\xbd"), - "right-facing fist: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9c\xf0\x9f\x8f\xbe"), - "right-facing fist: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9c\xf0\x9f\x8f\xbf"), - "right-facing fist: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8f"), "clapping hands", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8f\xf0\x9f\x8f\xbb"), - "clapping hands: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8f\xf0\x9f\x8f\xbc"), - "clapping hands: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8f\xf0\x9f\x8f\xbd"), - "clapping hands: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8f\xf0\x9f\x8f\xbe"), - "clapping hands: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x8f\xf0\x9f\x8f\xbf"), - "clapping hands: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8c"), "raising hands", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8c\xf0\x9f\x8f\xbb"), - "raising hands: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8c\xf0\x9f\x8f\xbc"), - "raising hands: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8c\xf0\x9f\x8f\xbd"), - "raising hands: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8c\xf0\x9f\x8f\xbe"), - "raising hands: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8c\xf0\x9f\x8f\xbf"), - "raising hands: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x90"), "open hands", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x90\xf0\x9f\x8f\xbb"), - "open hands: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x90\xf0\x9f\x8f\xbc"), - "open hands: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x90\xf0\x9f\x8f\xbd"), - "open hands: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x90\xf0\x9f\x8f\xbe"), - "open hands: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x90\xf0\x9f\x8f\xbf"), - "open hands: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb2"), "palms up together", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb2\xf0\x9f\x8f\xbb"), - "palms up together: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb2\xf0\x9f\x8f\xbc"), - "palms up together: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb2\xf0\x9f\x8f\xbd"), - "palms up together: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb2\xf0\x9f\x8f\xbe"), - "palms up together: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb2\xf0\x9f\x8f\xbf"), - "palms up together: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\x9d"), "handshake", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8f"), "folded hands", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8f\xf0\x9f\x8f\xbb"), - "folded hands: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8f\xf0\x9f\x8f\xbc"), - "folded hands: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8f\xf0\x9f\x8f\xbd"), - "folded hands: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8f\xf0\x9f\x8f\xbe"), - "folded hands: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8f\xf0\x9f\x8f\xbf"), - "folded hands: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8d"), "writing hand", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8d\xf0\x9f\x8f\xbb"), - "writing hand: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8d\xf0\x9f\x8f\xbc"), - "writing hand: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8d\xf0\x9f\x8f\xbd"), - "writing hand: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8d\xf0\x9f\x8f\xbe"), - "writing hand: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9c\x8d\xf0\x9f\x8f\xbf"), - "writing hand: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x85"), "nail polish", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x85\xf0\x9f\x8f\xbb"), - "nail polish: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x85\xf0\x9f\x8f\xbc"), - "nail polish: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x85\xf0\x9f\x8f\xbd"), - "nail polish: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x85\xf0\x9f\x8f\xbe"), - "nail polish: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x85\xf0\x9f\x8f\xbf"), - "nail polish: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb3"), "selfie", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb3\xf0\x9f\x8f\xbb"), - "selfie: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb3\xf0\x9f\x8f\xbc"), - "selfie: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb3\xf0\x9f\x8f\xbd"), - "selfie: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb3\xf0\x9f\x8f\xbe"), - "selfie: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb3\xf0\x9f\x8f\xbf"), - "selfie: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xaa"), "flexed biceps", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xaa\xf0\x9f\x8f\xbb"), - "flexed biceps: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xaa\xf0\x9f\x8f\xbc"), - "flexed biceps: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xaa\xf0\x9f\x8f\xbd"), - "flexed biceps: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xaa\xf0\x9f\x8f\xbe"), - "flexed biceps: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xaa\xf0\x9f\x8f\xbf"), - "flexed biceps: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xbe"), "mechanical arm", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xbf"), "mechanical leg", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb5"), "leg", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb5\xf0\x9f\x8f\xbb"), - "leg: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb5\xf0\x9f\x8f\xbc"), - "leg: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb5\xf0\x9f\x8f\xbd"), - "leg: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb5\xf0\x9f\x8f\xbe"), - "leg: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb5\xf0\x9f\x8f\xbf"), - "leg: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb6"), "foot", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb6\xf0\x9f\x8f\xbb"), - "foot: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb6\xf0\x9f\x8f\xbc"), - "foot: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb6\xf0\x9f\x8f\xbd"), - "foot: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb6\xf0\x9f\x8f\xbe"), - "foot: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb6\xf0\x9f\x8f\xbf"), - "foot: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x82"), "ear", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x82\xf0\x9f\x8f\xbb"), - "ear: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x82\xf0\x9f\x8f\xbc"), - "ear: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x82\xf0\x9f\x8f\xbd"), - "ear: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x82\xf0\x9f\x8f\xbe"), - "ear: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x82\xf0\x9f\x8f\xbf"), - "ear: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xbb"), - "ear with hearing aid", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xbb\xf0\x9f\x8f\xbb"), - "ear with hearing aid: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xbb\xf0\x9f\x8f\xbc"), - "ear with hearing aid: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xbb\xf0\x9f\x8f\xbd"), - "ear with hearing aid: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xbb\xf0\x9f\x8f\xbe"), - "ear with hearing aid: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xbb\xf0\x9f\x8f\xbf"), - "ear with hearing aid: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x83"), "nose", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x83\xf0\x9f\x8f\xbb"), - "nose: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x83\xf0\x9f\x8f\xbc"), - "nose: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x83\xf0\x9f\x8f\xbd"), - "nose: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x83\xf0\x9f\x8f\xbe"), - "nose: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x83\xf0\x9f\x8f\xbf"), - "nose: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xa0"), "brain", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xab\x80"), "anatomical heart", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xab\x81"), "lungs", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb7"), "tooth", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb4"), "bone", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x80"), "eyes", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x81"), "eye", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x85"), "tongue", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x84"), "mouth", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb6"), "baby", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb6\xf0\x9f\x8f\xbb"), - "baby: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb6\xf0\x9f\x8f\xbc"), - "baby: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb6\xf0\x9f\x8f\xbd"), - "baby: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb6\xf0\x9f\x8f\xbe"), - "baby: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb6\xf0\x9f\x8f\xbf"), - "baby: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x92"), "child", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x92\xf0\x9f\x8f\xbb"), - "child: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x92\xf0\x9f\x8f\xbc"), - "child: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x92\xf0\x9f\x8f\xbd"), - "child: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x92\xf0\x9f\x8f\xbe"), - "child: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x92\xf0\x9f\x8f\xbf"), - "child: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa6"), "boy", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa6\xf0\x9f\x8f\xbb"), - "boy: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa6\xf0\x9f\x8f\xbc"), - "boy: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa6\xf0\x9f\x8f\xbd"), - "boy: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa6\xf0\x9f\x8f\xbe"), - "boy: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa6\xf0\x9f\x8f\xbf"), - "boy: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa7"), "girl", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa7\xf0\x9f\x8f\xbb"), - "girl: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa7\xf0\x9f\x8f\xbc"), - "girl: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa7\xf0\x9f\x8f\xbd"), - "girl: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa7\xf0\x9f\x8f\xbe"), - "girl: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa7\xf0\x9f\x8f\xbf"), - "girl: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91"), "person", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb"), - "person: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc"), - "person: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd"), - "person: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe"), - "person: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf"), - "person: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1"), "person: blond hair", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xf0\x9f\x8f\xbb"), - "person: light skin tone, blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xf0\x9f\x8f\xbc"), - "person: medium-light skin tone, blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xf0\x9f\x8f\xbd"), - "person: medium skin tone, blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xf0\x9f\x8f\xbe"), - "person: medium-dark skin tone, blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xf0\x9f\x8f\xbf"), - "person: dark skin tone, blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8"), "man", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb"), - "man: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc"), - "man: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd"), - "man: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe"), - "man: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf"), - "man: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x94"), "man: beard", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x94\xf0\x9f\x8f\xbb"), - "man: light skin tone, beard", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x94\xf0\x9f\x8f\xbc"), - "man: medium-light skin tone, beard", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x94\xf0\x9f\x8f\xbd"), - "man: medium skin tone, beard", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x94\xf0\x9f\x8f\xbe"), - "man: medium-dark skin tone, beard", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x94\xf0\x9f\x8f\xbf"), - "man: dark skin tone, beard", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "man: red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "man: light skin tone, red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "man: medium-light skin tone, red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "man: medium skin tone, red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "man: medium-dark skin tone, red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "man: dark skin tone, red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "man: curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "man: light skin tone, curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "man: medium-light skin tone, curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "man: medium skin tone, curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "man: medium-dark skin tone, curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "man: dark skin tone, curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "man: white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "man: light skin tone, white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "man: medium-light skin tone, white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "man: medium skin tone, white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "man: medium-dark skin tone, white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "man: dark skin tone, white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "man: bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "man: light skin tone, bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "man: medium-light skin tone, bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "man: medium skin tone, bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "man: medium-dark skin tone, bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "man: dark skin tone, bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9"), "woman", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb"), - "woman: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc"), - "woman: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd"), - "woman: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe"), - "woman: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf"), - "woman: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "woman: red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "woman: light skin tone, red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "woman: medium-light skin tone, red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "woman: medium skin tone, red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "woman: medium-dark skin tone, red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "woman: dark skin tone, red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "person: red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "person: light skin tone, red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "person: medium-light skin tone, red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "person: medium skin tone, red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "person: medium-dark skin tone, red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xb0"), - "person: dark skin tone, red hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "woman: curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "woman: light skin tone, curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "woman: medium-light skin tone, curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "woman: medium skin tone, curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "woman: medium-dark skin tone, curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "woman: dark skin tone, curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "person: curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "person: light skin tone, curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "person: medium-light skin tone, curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "person: medium skin tone, curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "person: medium-dark skin tone, curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xb1"), - "person: dark skin tone, curly hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "woman: white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "woman: light skin tone, white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "woman: medium-light skin tone, white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "woman: medium skin tone, white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "woman: medium-dark skin tone, white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "woman: dark skin tone, white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "person: white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "person: light skin tone, white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "person: medium-light skin tone, white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "person: medium skin tone, white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "person: medium-dark skin tone, white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xb3"), - "person: dark skin tone, white hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "woman: bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "woman: light skin tone, bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "woman: medium-light skin tone, bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "woman: medium skin tone, bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "woman: medium-dark skin tone, bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "woman: dark skin tone, bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "person: bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "person: light skin tone, bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "person: medium-light skin tone, bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "person: medium skin tone, bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "person: medium-dark skin tone, bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xb2"), - "person: dark skin tone, bald", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xe2\x80\x8d\xe2\x99\x80"), - "woman: blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman: light skin tone, blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman: medium-light skin tone, blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman: medium skin tone, blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman: medium-dark skin tone, blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman: dark skin tone, blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xe2\x80\x8d\xe2\x99\x82"), - "man: blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man: light skin tone, blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man: medium-light skin tone, blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man: medium skin tone, blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man: medium-dark skin tone, blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb1\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man: dark skin tone, blond hair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x93"), "older person", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x93\xf0\x9f\x8f\xbb"), - "older person: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x93\xf0\x9f\x8f\xbc"), - "older person: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x93\xf0\x9f\x8f\xbd"), - "older person: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x93\xf0\x9f\x8f\xbe"), - "older person: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x93\xf0\x9f\x8f\xbf"), - "older person: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb4"), "old man", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb4\xf0\x9f\x8f\xbb"), - "old man: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb4\xf0\x9f\x8f\xbc"), - "old man: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb4\xf0\x9f\x8f\xbd"), - "old man: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb4\xf0\x9f\x8f\xbe"), - "old man: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb4\xf0\x9f\x8f\xbf"), - "old man: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb5"), "old woman", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb5\xf0\x9f\x8f\xbb"), - "old woman: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb5\xf0\x9f\x8f\xbc"), - "old woman: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb5\xf0\x9f\x8f\xbd"), - "old woman: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb5\xf0\x9f\x8f\xbe"), - "old woman: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb5\xf0\x9f\x8f\xbf"), - "old woman: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d"), "person frowning", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xf0\x9f\x8f\xbb"), - "person frowning: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xf0\x9f\x8f\xbc"), - "person frowning: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xf0\x9f\x8f\xbd"), - "person frowning: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xf0\x9f\x8f\xbe"), - "person frowning: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xf0\x9f\x8f\xbf"), - "person frowning: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xe2\x80\x8d\xe2\x99\x82"), - "man frowning", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man frowning: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man frowning: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man frowning: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man frowning: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man frowning: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xe2\x80\x8d\xe2\x99\x80"), - "woman frowning", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman frowning: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman frowning: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman frowning: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman frowning: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8d\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman frowning: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e"), "person pouting", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xf0\x9f\x8f\xbb"), - "person pouting: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xf0\x9f\x8f\xbc"), - "person pouting: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xf0\x9f\x8f\xbd"), - "person pouting: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xf0\x9f\x8f\xbe"), - "person pouting: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xf0\x9f\x8f\xbf"), - "person pouting: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xe2\x80\x8d\xe2\x99\x82"), - "man pouting", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man pouting: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man pouting: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man pouting: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man pouting: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man pouting: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xe2\x80\x8d\xe2\x99\x80"), - "woman pouting", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman pouting: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman pouting: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman pouting: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman pouting: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8e\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman pouting: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85"), "person gesturing NO", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xf0\x9f\x8f\xbb"), - "person gesturing NO: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xf0\x9f\x8f\xbc"), - "person gesturing NO: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xf0\x9f\x8f\xbd"), - "person gesturing NO: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xf0\x9f\x8f\xbe"), - "person gesturing NO: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xf0\x9f\x8f\xbf"), - "person gesturing NO: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xe2\x80\x8d\xe2\x99\x82"), - "man gesturing NO", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man gesturing NO: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man gesturing NO: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man gesturing NO: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man gesturing NO: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man gesturing NO: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xe2\x80\x8d\xe2\x99\x80"), - "woman gesturing NO", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman gesturing NO: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman gesturing NO: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman gesturing NO: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman gesturing NO: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x85\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman gesturing NO: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86"), "person gesturing OK", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xf0\x9f\x8f\xbb"), - "person gesturing OK: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xf0\x9f\x8f\xbc"), - "person gesturing OK: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xf0\x9f\x8f\xbd"), - "person gesturing OK: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xf0\x9f\x8f\xbe"), - "person gesturing OK: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xf0\x9f\x8f\xbf"), - "person gesturing OK: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xe2\x80\x8d\xe2\x99\x82"), - "man gesturing OK", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man gesturing OK: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man gesturing OK: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man gesturing OK: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man gesturing OK: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man gesturing OK: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xe2\x80\x8d\xe2\x99\x80"), - "woman gesturing OK", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman gesturing OK: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman gesturing OK: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman gesturing OK: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman gesturing OK: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x86\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman gesturing OK: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81"), "person tipping hand", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xf0\x9f\x8f\xbb"), - "person tipping hand: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xf0\x9f\x8f\xbc"), - "person tipping hand: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xf0\x9f\x8f\xbd"), - "person tipping hand: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xf0\x9f\x8f\xbe"), - "person tipping hand: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xf0\x9f\x8f\xbf"), - "person tipping hand: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xe2\x80\x8d\xe2\x99\x82"), - "man tipping hand", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man tipping hand: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man tipping hand: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man tipping hand: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man tipping hand: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man tipping hand: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xe2\x80\x8d\xe2\x99\x80"), - "woman tipping hand", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman tipping hand: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman tipping hand: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman tipping hand: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman tipping hand: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x81\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman tipping hand: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b"), "person raising hand", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xf0\x9f\x8f\xbb"), - "person raising hand: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xf0\x9f\x8f\xbc"), - "person raising hand: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xf0\x9f\x8f\xbd"), - "person raising hand: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xf0\x9f\x8f\xbe"), - "person raising hand: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xf0\x9f\x8f\xbf"), - "person raising hand: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xe2\x80\x8d\xe2\x99\x82"), - "man raising hand", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man raising hand: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man raising hand: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man raising hand: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man raising hand: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man raising hand: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xe2\x80\x8d\xe2\x99\x80"), - "woman raising hand", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman raising hand: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman raising hand: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman raising hand: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman raising hand: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x8b\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman raising hand: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f"), "deaf person", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xf0\x9f\x8f\xbb"), - "deaf person: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xf0\x9f\x8f\xbc"), - "deaf person: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xf0\x9f\x8f\xbd"), - "deaf person: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xf0\x9f\x8f\xbe"), - "deaf person: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xf0\x9f\x8f\xbf"), - "deaf person: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xe2\x80\x8d\xe2\x99\x82"), - "deaf man", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "deaf man: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "deaf man: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "deaf man: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "deaf man: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "deaf man: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xe2\x80\x8d\xe2\x99\x80"), - "deaf woman", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "deaf woman: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "deaf woman: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "deaf woman: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "deaf woman: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8f\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "deaf woman: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87"), "person bowing", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xf0\x9f\x8f\xbb"), - "person bowing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xf0\x9f\x8f\xbc"), - "person bowing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xf0\x9f\x8f\xbd"), - "person bowing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xf0\x9f\x8f\xbe"), - "person bowing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xf0\x9f\x8f\xbf"), - "person bowing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xe2\x80\x8d\xe2\x99\x82"), - "man bowing", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man bowing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man bowing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man bowing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man bowing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man bowing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xe2\x80\x8d\xe2\x99\x80"), - "woman bowing", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman bowing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman bowing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman bowing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman bowing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x99\x87\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman bowing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6"), "person facepalming", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xf0\x9f\x8f\xbb"), - "person facepalming: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xf0\x9f\x8f\xbc"), - "person facepalming: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xf0\x9f\x8f\xbd"), - "person facepalming: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xf0\x9f\x8f\xbe"), - "person facepalming: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xf0\x9f\x8f\xbf"), - "person facepalming: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xe2\x80\x8d\xe2\x99\x82"), - "man facepalming", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man facepalming: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man facepalming: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man facepalming: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man facepalming: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man facepalming: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xe2\x80\x8d\xe2\x99\x80"), - "woman facepalming", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman facepalming: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman facepalming: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman facepalming: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman facepalming: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xa6\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman facepalming: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7"), "person shrugging", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xf0\x9f\x8f\xbb"), - "person shrugging: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xf0\x9f\x8f\xbc"), - "person shrugging: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xf0\x9f\x8f\xbd"), - "person shrugging: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xf0\x9f\x8f\xbe"), - "person shrugging: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xf0\x9f\x8f\xbf"), - "person shrugging: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xe2\x80\x8d\xe2\x99\x82"), - "man shrugging", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man shrugging: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man shrugging: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man shrugging: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man shrugging: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man shrugging: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xe2\x80\x8d\xe2\x99\x80"), - "woman shrugging", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman shrugging: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman shrugging: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman shrugging: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman shrugging: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb7\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman shrugging: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xe2\x9a\x95"), - "health worker", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x9a\x95"), - "health worker: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x9a\x95"), - "health worker: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x9a\x95"), - "health worker: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x9a\x95"), - "health worker: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x9a\x95"), - "health worker: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xe2\x9a\x95"), - "man health worker", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x9a\x95"), - "man health worker: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x9a\x95"), - "man health worker: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x9a\x95"), - "man health worker: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x9a\x95"), - "man health worker: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x9a\x95"), - "man health worker: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xe2\x9a\x95"), - "woman health worker", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x9a\x95"), - "woman health worker: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x9a\x95"), - "woman health worker: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x9a\x95"), - "woman health worker: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x9a\x95"), - "woman health worker: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x9a\x95"), - "woman health worker: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "student", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "student: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "student: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "student: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "student: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "student: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "man student", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "man student: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "man student: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "man student: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "man student: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "man student: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "woman student", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "woman student: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "woman student: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "woman student: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "woman student: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8e\x93"), - "woman student: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "teacher", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "teacher: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "teacher: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "teacher: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "teacher: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "teacher: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "man teacher", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "man teacher: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "man teacher: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "man teacher: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "man teacher: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "man teacher: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "woman teacher", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "woman teacher: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "woman teacher: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "woman teacher: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "woman teacher: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8f\xab"), - "woman teacher: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xe2\x9a\x96"), - "judge", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x9a\x96"), - "judge: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x9a\x96"), - "judge: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x9a\x96"), - "judge: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x9a\x96"), - "judge: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x9a\x96"), - "judge: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xe2\x9a\x96"), - "man judge", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x9a\x96"), - "man judge: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x9a\x96"), - "man judge: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x9a\x96"), - "man judge: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x9a\x96"), - "man judge: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x9a\x96"), - "man judge: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xe2\x9a\x96"), - "woman judge", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x9a\x96"), - "woman judge: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x9a\x96"), - "woman judge: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x9a\x96"), - "woman judge: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x9a\x96"), - "woman judge: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x9a\x96"), - "woman judge: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "farmer", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "farmer: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "farmer: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "farmer: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "farmer: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "farmer: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "man farmer", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "man farmer: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "man farmer: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "man farmer: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "man farmer: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "man farmer: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "woman farmer", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "woman farmer: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "woman farmer: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "woman farmer: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "woman farmer: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8c\xbe"), - "woman farmer: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "cook", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "cook: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "cook: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "cook: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "cook: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "cook: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "man cook", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "man cook: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "man cook: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "man cook: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "man cook: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "man cook: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "woman cook", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "woman cook: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "woman cook: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "woman cook: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "woman cook: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8d\xb3"), - "woman cook: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "mechanic", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "mechanic: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "mechanic: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "mechanic: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "mechanic: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "mechanic: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "man mechanic", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "man mechanic: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "man mechanic: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "man mechanic: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "man mechanic: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "man mechanic: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "woman mechanic", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "woman mechanic: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "woman mechanic: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "woman mechanic: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "woman mechanic: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x94\xa7"), - "woman mechanic: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "factory worker", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "factory worker: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "factory worker: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "factory worker: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "factory worker: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "factory worker: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "man factory worker", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "man factory worker: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "man factory worker: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "man factory worker: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "man factory worker: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "man factory worker: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "woman factory worker", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "woman factory worker: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "woman factory worker: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "woman factory worker: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "woman factory worker: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8f\xad"), - "woman factory worker: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "office worker", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "office worker: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "office worker: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "office worker: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "office worker: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "office worker: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "man office worker", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "man office worker: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "man office worker: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "man office worker: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "man office worker: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "man office worker: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "woman office worker", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "woman office worker: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "woman office worker: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "woman office worker: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "woman office worker: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x92\xbc"), - "woman office worker: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\x94\xac"), - "scientist", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x94\xac"), - "scientist: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x94\xac"), - "scientist: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x94\xac"), - "scientist: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x94\xac"), - "scientist: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x94\xac"), - "scientist: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x94\xac"), - "man scientist", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x94\xac"), - "man scientist: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x94\xac"), - "man scientist: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x94\xac"), - "man scientist: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x94\xac"), - "man scientist: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x94\xac"), - "man scientist: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x94\xac"), - "woman scientist", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x94\xac"), - "woman scientist: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x94\xac"), - "woman scientist: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x94\xac"), - "woman scientist: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x94\xac"), - "woman scientist: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x94\xac"), - "woman scientist: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "technologist", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "technologist: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "technologist: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "technologist: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "technologist: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "technologist: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "man technologist", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "man technologist: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "man technologist: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "man technologist: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "man technologist: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "man technologist: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "woman technologist", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "woman technologist: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "woman technologist: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "woman technologist: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "woman technologist: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x92\xbb"), - "woman technologist: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "singer", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "singer: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "singer: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "singer: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "singer: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "singer: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "man singer", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "man singer: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "man singer: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "man singer: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "man singer: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "man singer: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "woman singer", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "woman singer: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "woman singer: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "woman singer: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "woman singer: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8e\xa4"), - "woman singer: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "artist", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "artist: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "artist: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "artist: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "artist: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "artist: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "man artist", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "man artist: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "man artist: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "man artist: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "man artist: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "man artist: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "woman artist", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "woman artist: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "woman artist: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "woman artist: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "woman artist: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8e\xa8"), - "woman artist: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xe2\x9c\x88"), - "pilot", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x9c\x88"), - "pilot: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x9c\x88"), - "pilot: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x9c\x88"), - "pilot: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x9c\x88"), - "pilot: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x9c\x88"), - "pilot: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xe2\x9c\x88"), - "man pilot", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x9c\x88"), - "man pilot: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x9c\x88"), - "man pilot: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x9c\x88"), - "man pilot: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x9c\x88"), - "man pilot: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x9c\x88"), - "man pilot: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xe2\x9c\x88"), - "woman pilot", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x9c\x88"), - "woman pilot: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x9c\x88"), - "woman pilot: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x9c\x88"), - "woman pilot: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x9c\x88"), - "woman pilot: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x9c\x88"), - "woman pilot: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "astronaut", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "astronaut: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "astronaut: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "astronaut: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "astronaut: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "astronaut: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "man astronaut", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "man astronaut: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "man astronaut: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "man astronaut: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "man astronaut: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "man astronaut: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "woman astronaut", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "woman astronaut: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "woman astronaut: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "woman astronaut: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "woman astronaut: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x9a\x80"), - "woman astronaut: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "firefighter", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "firefighter: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "firefighter: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "firefighter: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "firefighter: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "firefighter: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "man firefighter", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "man firefighter: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "man firefighter: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "man firefighter: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "man firefighter: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "man firefighter: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "woman firefighter", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "woman firefighter: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "woman firefighter: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "woman firefighter: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "woman firefighter: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x9a\x92"), - "woman firefighter: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae"), "police officer", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xf0\x9f\x8f\xbb"), - "police officer: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xf0\x9f\x8f\xbc"), - "police officer: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xf0\x9f\x8f\xbd"), - "police officer: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xf0\x9f\x8f\xbe"), - "police officer: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xf0\x9f\x8f\xbf"), - "police officer: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xe2\x80\x8d\xe2\x99\x82"), - "man police officer", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man police officer: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man police officer: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man police officer: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man police officer: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man police officer: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xe2\x80\x8d\xe2\x99\x80"), - "woman police officer", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman police officer: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman police officer: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman police officer: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman police officer: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xae\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman police officer: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5"), "detective", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xf0\x9f\x8f\xbb"), - "detective: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xf0\x9f\x8f\xbc"), - "detective: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xf0\x9f\x8f\xbd"), - "detective: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xf0\x9f\x8f\xbe"), - "detective: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xf0\x9f\x8f\xbf"), - "detective: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xef\xb8\x8f\xe2\x80\x8d\xe2\x99\x82"), - "man detective", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xe2\x80\x8d\xe2\x99\x82"), - "man detective", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man detective: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man detective: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man detective: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man detective: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man detective: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xef\xb8\x8f\xe2\x80\x8d\xe2\x99\x80"), - "woman detective", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xe2\x80\x8d\xe2\x99\x80"), - "woman detective", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman detective: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman detective: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman detective: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman detective: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb5\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman detective: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82"), "guard", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xf0\x9f\x8f\xbb"), - "guard: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xf0\x9f\x8f\xbc"), - "guard: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xf0\x9f\x8f\xbd"), - "guard: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xf0\x9f\x8f\xbe"), - "guard: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xf0\x9f\x8f\xbf"), - "guard: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xe2\x80\x8d\xe2\x99\x82"), - "man guard", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man guard: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man guard: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man guard: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man guard: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man guard: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xe2\x80\x8d\xe2\x99\x80"), - "woman guard", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman guard: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman guard: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman guard: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman guard: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x82\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman guard: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7"), "construction worker", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xf0\x9f\x8f\xbb"), - "construction worker: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xf0\x9f\x8f\xbc"), - "construction worker: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xf0\x9f\x8f\xbd"), - "construction worker: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xf0\x9f\x8f\xbe"), - "construction worker: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xf0\x9f\x8f\xbf"), - "construction worker: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xe2\x80\x8d\xe2\x99\x82"), - "man construction worker", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man construction worker: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man construction worker: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man construction worker: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man construction worker: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man construction worker: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xe2\x80\x8d\xe2\x99\x80"), - "woman construction worker", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman construction worker: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman construction worker: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman construction worker: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman construction worker: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb7\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman construction worker: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb4"), "prince", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb4\xf0\x9f\x8f\xbb"), - "prince: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb4\xf0\x9f\x8f\xbc"), - "prince: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb4\xf0\x9f\x8f\xbd"), - "prince: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb4\xf0\x9f\x8f\xbe"), - "prince: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb4\xf0\x9f\x8f\xbf"), - "prince: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb8"), "princess", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb8\xf0\x9f\x8f\xbb"), - "princess: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb8\xf0\x9f\x8f\xbc"), - "princess: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb8\xf0\x9f\x8f\xbd"), - "princess: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb8\xf0\x9f\x8f\xbe"), - "princess: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb8\xf0\x9f\x8f\xbf"), - "princess: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3"), - "person wearing turban", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xf0\x9f\x8f\xbb"), - "person wearing turban: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xf0\x9f\x8f\xbc"), - "person wearing turban: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xf0\x9f\x8f\xbd"), - "person wearing turban: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xf0\x9f\x8f\xbe"), - "person wearing turban: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xf0\x9f\x8f\xbf"), - "person wearing turban: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xe2\x80\x8d\xe2\x99\x82"), - "man wearing turban", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man wearing turban: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man wearing turban: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man wearing turban: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man wearing turban: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man wearing turban: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xe2\x80\x8d\xe2\x99\x80"), - "woman wearing turban", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman wearing turban: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman wearing turban: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman wearing turban: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman wearing turban: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb3\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman wearing turban: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb2"), "man with skullcap", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb2\xf0\x9f\x8f\xbb"), - "man with skullcap: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb2\xf0\x9f\x8f\xbc"), - "man with skullcap: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb2\xf0\x9f\x8f\xbd"), - "man with skullcap: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb2\xf0\x9f\x8f\xbe"), - "man with skullcap: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb2\xf0\x9f\x8f\xbf"), - "man with skullcap: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x95"), - "woman with headscarf", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x95\xf0\x9f\x8f\xbb"), - "woman with headscarf: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x95\xf0\x9f\x8f\xbc"), - "woman with headscarf: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x95\xf0\x9f\x8f\xbd"), - "woman with headscarf: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x95\xf0\x9f\x8f\xbe"), - "woman with headscarf: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x95\xf0\x9f\x8f\xbf"), - "woman with headscarf: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5"), "man in tuxedo", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xf0\x9f\x8f\xbb"), - "man in tuxedo: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xf0\x9f\x8f\xbc"), - "man in tuxedo: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xf0\x9f\x8f\xbd"), - "man in tuxedo: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xf0\x9f\x8f\xbe"), - "man in tuxedo: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xf0\x9f\x8f\xbf"), - "man in tuxedo: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xe2\x80\x8d\xe2\x99\x82"), - "man in tuxedo", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man in tuxedo: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man in tuxedo: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man in tuxedo: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man in tuxedo: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man in tuxedo: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xe2\x80\x8d\xe2\x99\x80"), - "woman in tuxedo", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman in tuxedo: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman in tuxedo: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman in tuxedo: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman in tuxedo: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb5\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman in tuxedo: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0"), "bride with veil", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xf0\x9f\x8f\xbb"), - "bride with veil: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xf0\x9f\x8f\xbc"), - "bride with veil: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xf0\x9f\x8f\xbd"), - "bride with veil: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xf0\x9f\x8f\xbe"), - "bride with veil: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xf0\x9f\x8f\xbf"), - "bride with veil: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xe2\x80\x8d\xe2\x99\x82"), - "man with veil", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man with veil: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man with veil: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man with veil: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man with veil: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man with veil: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xe2\x80\x8d\xe2\x99\x80"), - "woman with veil", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman with veil: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman with veil: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman with veil: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman with veil: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xb0\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman with veil: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb0"), "pregnant woman", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb0\xf0\x9f\x8f\xbb"), - "pregnant woman: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb0\xf0\x9f\x8f\xbc"), - "pregnant woman: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb0\xf0\x9f\x8f\xbd"), - "pregnant woman: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb0\xf0\x9f\x8f\xbe"), - "pregnant woman: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb0\xf0\x9f\x8f\xbf"), - "pregnant woman: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb1"), "breast-feeding", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb1\xf0\x9f\x8f\xbb"), - "breast-feeding: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb1\xf0\x9f\x8f\xbc"), - "breast-feeding: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb1\xf0\x9f\x8f\xbd"), - "breast-feeding: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb1\xf0\x9f\x8f\xbe"), - "breast-feeding: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb1\xf0\x9f\x8f\xbf"), - "breast-feeding: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "woman feeding baby", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "woman feeding baby: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "woman feeding baby: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "woman feeding baby: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "woman feeding baby: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "woman feeding baby: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "man feeding baby", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "man feeding baby: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "man feeding baby: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "man feeding baby: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "man feeding baby: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "man feeding baby: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "person feeding baby", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "person feeding baby: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "person feeding baby: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "person feeding baby: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "person feeding baby: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8d\xbc"), - "person feeding baby: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xbc"), "baby angel", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xbc\xf0\x9f\x8f\xbb"), - "baby angel: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xbc\xf0\x9f\x8f\xbc"), - "baby angel: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xbc\xf0\x9f\x8f\xbd"), - "baby angel: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xbc\xf0\x9f\x8f\xbe"), - "baby angel: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xbc\xf0\x9f\x8f\xbf"), - "baby angel: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x85"), "Santa Claus", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x85\xf0\x9f\x8f\xbb"), - "Santa Claus: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x85\xf0\x9f\x8f\xbc"), - "Santa Claus: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x85\xf0\x9f\x8f\xbd"), - "Santa Claus: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x85\xf0\x9f\x8f\xbe"), - "Santa Claus: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x85\xf0\x9f\x8f\xbf"), - "Santa Claus: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb6"), "Mrs. Claus", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb6\xf0\x9f\x8f\xbb"), - "Mrs. Claus: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb6\xf0\x9f\x8f\xbc"), - "Mrs. Claus: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb6\xf0\x9f\x8f\xbd"), - "Mrs. Claus: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb6\xf0\x9f\x8f\xbe"), - "Mrs. Claus: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb6\xf0\x9f\x8f\xbf"), - "Mrs. Claus: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\x8e\x84"), - "mx claus", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\x8e\x84"), - "mx claus: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\x8e\x84"), - "mx claus: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\x8e\x84"), - "mx claus: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\x8e\x84"), - "mx claus: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\x8e\x84"), - "mx claus: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8"), "superhero", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xf0\x9f\x8f\xbb"), - "superhero: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xf0\x9f\x8f\xbc"), - "superhero: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xf0\x9f\x8f\xbd"), - "superhero: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xf0\x9f\x8f\xbe"), - "superhero: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xf0\x9f\x8f\xbf"), - "superhero: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xe2\x80\x8d\xe2\x99\x82"), - "man superhero", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man superhero: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man superhero: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man superhero: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man superhero: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man superhero: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xe2\x80\x8d\xe2\x99\x80"), - "woman superhero", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman superhero: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman superhero: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman superhero: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman superhero: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman superhero: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9"), "supervillain", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xf0\x9f\x8f\xbb"), - "supervillain: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xf0\x9f\x8f\xbc"), - "supervillain: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xf0\x9f\x8f\xbd"), - "supervillain: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xf0\x9f\x8f\xbe"), - "supervillain: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xf0\x9f\x8f\xbf"), - "supervillain: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xe2\x80\x8d\xe2\x99\x82"), - "man supervillain", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man supervillain: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man supervillain: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man supervillain: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man supervillain: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man supervillain: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xe2\x80\x8d\xe2\x99\x80"), - "woman supervillain", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman supervillain: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman supervillain: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman supervillain: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman supervillain: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xb9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman supervillain: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99"), "mage", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xf0\x9f\x8f\xbb"), - "mage: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xf0\x9f\x8f\xbc"), - "mage: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xf0\x9f\x8f\xbd"), - "mage: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xf0\x9f\x8f\xbe"), - "mage: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xf0\x9f\x8f\xbf"), - "mage: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xe2\x80\x8d\xe2\x99\x82"), - "man mage", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man mage: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man mage: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man mage: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man mage: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man mage: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xe2\x80\x8d\xe2\x99\x80"), - "woman mage", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman mage: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman mage: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman mage: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman mage: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x99\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman mage: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a"), "fairy", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xf0\x9f\x8f\xbb"), - "fairy: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xf0\x9f\x8f\xbc"), - "fairy: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xf0\x9f\x8f\xbd"), - "fairy: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xf0\x9f\x8f\xbe"), - "fairy: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xf0\x9f\x8f\xbf"), - "fairy: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xe2\x80\x8d\xe2\x99\x82"), - "man fairy", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man fairy: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man fairy: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man fairy: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man fairy: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man fairy: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xe2\x80\x8d\xe2\x99\x80"), - "woman fairy", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman fairy: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman fairy: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman fairy: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman fairy: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9a\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman fairy: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b"), "vampire", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xf0\x9f\x8f\xbb"), - "vampire: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xf0\x9f\x8f\xbc"), - "vampire: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xf0\x9f\x8f\xbd"), - "vampire: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xf0\x9f\x8f\xbe"), - "vampire: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xf0\x9f\x8f\xbf"), - "vampire: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xe2\x80\x8d\xe2\x99\x82"), - "man vampire", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man vampire: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man vampire: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man vampire: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man vampire: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man vampire: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xe2\x80\x8d\xe2\x99\x80"), - "woman vampire", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman vampire: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman vampire: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman vampire: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman vampire: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9b\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman vampire: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c"), "merperson", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xf0\x9f\x8f\xbb"), - "merperson: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xf0\x9f\x8f\xbc"), - "merperson: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xf0\x9f\x8f\xbd"), - "merperson: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xf0\x9f\x8f\xbe"), - "merperson: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xf0\x9f\x8f\xbf"), - "merperson: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xe2\x80\x8d\xe2\x99\x82"), - "merman", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "merman: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "merman: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "merman: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "merman: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "merman: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xe2\x80\x8d\xe2\x99\x80"), - "mermaid", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "mermaid: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "mermaid: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "mermaid: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "mermaid: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9c\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "mermaid: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d"), "elf", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xf0\x9f\x8f\xbb"), - "elf: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xf0\x9f\x8f\xbc"), - "elf: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xf0\x9f\x8f\xbd"), - "elf: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xf0\x9f\x8f\xbe"), - "elf: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xf0\x9f\x8f\xbf"), - "elf: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xe2\x80\x8d\xe2\x99\x82"), - "man elf", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man elf: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man elf: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man elf: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man elf: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man elf: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xe2\x80\x8d\xe2\x99\x80"), - "woman elf", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman elf: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman elf: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman elf: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman elf: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9d\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman elf: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9e"), "genie", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9e\xe2\x80\x8d\xe2\x99\x82"), - "man genie", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9e\xe2\x80\x8d\xe2\x99\x80"), - "woman genie", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9f"), "zombie", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9f\xe2\x80\x8d\xe2\x99\x82"), - "man zombie", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x9f\xe2\x80\x8d\xe2\x99\x80"), - "woman zombie", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86"), - "person getting massage", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xf0\x9f\x8f\xbb"), - "person getting massage: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xf0\x9f\x8f\xbc"), - "person getting massage: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xf0\x9f\x8f\xbd"), - "person getting massage: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xf0\x9f\x8f\xbe"), - "person getting massage: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xf0\x9f\x8f\xbf"), - "person getting massage: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xe2\x80\x8d\xe2\x99\x82"), - "man getting massage", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man getting massage: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man getting massage: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man getting massage: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man getting massage: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man getting massage: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xe2\x80\x8d\xe2\x99\x80"), - "woman getting massage", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman getting massage: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman getting massage: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman getting massage: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman getting massage: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x86\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman getting massage: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87"), - "person getting haircut", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xf0\x9f\x8f\xbb"), - "person getting haircut: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xf0\x9f\x8f\xbc"), - "person getting haircut: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xf0\x9f\x8f\xbd"), - "person getting haircut: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xf0\x9f\x8f\xbe"), - "person getting haircut: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xf0\x9f\x8f\xbf"), - "person getting haircut: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xe2\x80\x8d\xe2\x99\x82"), - "man getting haircut", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man getting haircut: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man getting haircut: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man getting haircut: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man getting haircut: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man getting haircut: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xe2\x80\x8d\xe2\x99\x80"), - "woman getting haircut", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman getting haircut: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman getting haircut: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman getting haircut: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman getting haircut: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x87\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman getting haircut: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6"), "person walking", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xf0\x9f\x8f\xbb"), - "person walking: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xf0\x9f\x8f\xbc"), - "person walking: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xf0\x9f\x8f\xbd"), - "person walking: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xf0\x9f\x8f\xbe"), - "person walking: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xf0\x9f\x8f\xbf"), - "person walking: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xe2\x80\x8d\xe2\x99\x82"), - "man walking", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man walking: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man walking: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man walking: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man walking: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man walking: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xe2\x80\x8d\xe2\x99\x80"), - "woman walking", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman walking: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman walking: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman walking: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman walking: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb6\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman walking: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d"), "person standing", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xf0\x9f\x8f\xbb"), - "person standing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xf0\x9f\x8f\xbc"), - "person standing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xf0\x9f\x8f\xbd"), - "person standing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xf0\x9f\x8f\xbe"), - "person standing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xf0\x9f\x8f\xbf"), - "person standing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xe2\x80\x8d\xe2\x99\x82"), - "man standing", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man standing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man standing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man standing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man standing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man standing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xe2\x80\x8d\xe2\x99\x80"), - "woman standing", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman standing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman standing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman standing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman standing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8d\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman standing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e"), "person kneeling", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xf0\x9f\x8f\xbb"), - "person kneeling: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xf0\x9f\x8f\xbc"), - "person kneeling: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xf0\x9f\x8f\xbd"), - "person kneeling: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xf0\x9f\x8f\xbe"), - "person kneeling: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xf0\x9f\x8f\xbf"), - "person kneeling: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xe2\x80\x8d\xe2\x99\x82"), - "man kneeling", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man kneeling: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man kneeling: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man kneeling: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man kneeling: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man kneeling: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xe2\x80\x8d\xe2\x99\x80"), - "woman kneeling", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman kneeling: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman kneeling: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman kneeling: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman kneeling: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8e\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman kneeling: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "person with probing cane", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "person with probing cane: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "person with probing cane: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "person with probing cane: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "person with probing cane: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "person with probing cane: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "man with probing cane", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "man with probing cane: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "man with probing cane: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "man with probing cane: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "man with probing cane: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "man with probing cane: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "woman with probing cane", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "woman with probing cane: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "woman with probing cane: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "woman with probing cane: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "woman with probing cane: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xaf"), - "woman with probing cane: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "person in motorized wheelchair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "person in motorized wheelchair: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "person in motorized wheelchair: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "person in motorized wheelchair: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "person in motorized wheelchair: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "person in motorized wheelchair: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "man in motorized wheelchair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "man in motorized wheelchair: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "man in motorized wheelchair: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "man in motorized wheelchair: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "man in motorized wheelchair: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "man in motorized wheelchair: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "woman in motorized wheelchair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "woman in motorized wheelchair: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "woman in motorized wheelchair: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "woman in motorized wheelchair: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "woman in motorized wheelchair: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xbc"), - "woman in motorized wheelchair: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "person in manual wheelchair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "person in manual wheelchair: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "person in manual wheelchair: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "person in manual wheelchair: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "person in manual wheelchair: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "person in manual wheelchair: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "man in manual wheelchair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "man in manual wheelchair: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "man in manual wheelchair: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "man in manual wheelchair: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "man in manual wheelchair: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "man in manual wheelchair: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "woman in manual wheelchair", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "woman in manual wheelchair: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "woman in manual wheelchair: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "woman in manual wheelchair: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "woman in manual wheelchair: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa6\xbd"), - "woman in manual wheelchair: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83"), "person running", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xf0\x9f\x8f\xbb"), - "person running: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xf0\x9f\x8f\xbc"), - "person running: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xf0\x9f\x8f\xbd"), - "person running: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xf0\x9f\x8f\xbe"), - "person running: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xf0\x9f\x8f\xbf"), - "person running: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xe2\x80\x8d\xe2\x99\x82"), - "man running", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man running: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man running: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man running: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man running: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man running: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xe2\x80\x8d\xe2\x99\x80"), - "woman running", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman running: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman running: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman running: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman running: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x83\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman running: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x83"), "woman dancing", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x83\xf0\x9f\x8f\xbb"), - "woman dancing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x83\xf0\x9f\x8f\xbc"), - "woman dancing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x83\xf0\x9f\x8f\xbd"), - "woman dancing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x83\xf0\x9f\x8f\xbe"), - "woman dancing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x83\xf0\x9f\x8f\xbf"), - "woman dancing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xba"), "man dancing", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xba\xf0\x9f\x8f\xbb"), - "man dancing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xba\xf0\x9f\x8f\xbc"), - "man dancing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xba\xf0\x9f\x8f\xbd"), - "man dancing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xba\xf0\x9f\x8f\xbe"), - "man dancing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xba\xf0\x9f\x8f\xbf"), - "man dancing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb4"), - "man in suit levitating", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb4\xf0\x9f\x8f\xbb"), - "man in suit levitating: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb4\xf0\x9f\x8f\xbc"), - "man in suit levitating: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb4\xf0\x9f\x8f\xbd"), - "man in suit levitating: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb4\xf0\x9f\x8f\xbe"), - "man in suit levitating: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb4\xf0\x9f\x8f\xbf"), - "man in suit levitating: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xaf"), - "people with bunny ears", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xaf\xe2\x80\x8d\xe2\x99\x82"), - "men with bunny ears", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xaf\xe2\x80\x8d\xe2\x99\x80"), - "women with bunny ears", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96"), - "person in steamy room", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xf0\x9f\x8f\xbb"), - "person in steamy room: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xf0\x9f\x8f\xbc"), - "person in steamy room: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xf0\x9f\x8f\xbd"), - "person in steamy room: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xf0\x9f\x8f\xbe"), - "person in steamy room: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xf0\x9f\x8f\xbf"), - "person in steamy room: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xe2\x80\x8d\xe2\x99\x82"), - "man in steamy room", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man in steamy room: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man in steamy room: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man in steamy room: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man in steamy room: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man in steamy room: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xe2\x80\x8d\xe2\x99\x80"), - "woman in steamy room", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman in steamy room: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman in steamy room: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman in steamy room: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman in steamy room: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x96\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman in steamy room: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97"), "person climbing", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xf0\x9f\x8f\xbb"), - "person climbing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xf0\x9f\x8f\xbc"), - "person climbing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xf0\x9f\x8f\xbd"), - "person climbing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xf0\x9f\x8f\xbe"), - "person climbing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xf0\x9f\x8f\xbf"), - "person climbing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xe2\x80\x8d\xe2\x99\x82"), - "man climbing", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man climbing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man climbing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man climbing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man climbing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man climbing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xe2\x80\x8d\xe2\x99\x80"), - "woman climbing", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman climbing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman climbing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman climbing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman climbing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x97\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman climbing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xb7"), "ninja", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xba"), "person fencing", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x87"), "horse racing", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x87\xf0\x9f\x8f\xbb"), - "horse racing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x87\xf0\x9f\x8f\xbc"), - "horse racing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x87\xf0\x9f\x8f\xbd"), - "horse racing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x87\xf0\x9f\x8f\xbe"), - "horse racing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x87\xf0\x9f\x8f\xbf"), - "horse racing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb7"), "skier", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x82"), "snowboarder", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x82\xf0\x9f\x8f\xbb"), - "snowboarder: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x82\xf0\x9f\x8f\xbc"), - "snowboarder: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x82\xf0\x9f\x8f\xbd"), - "snowboarder: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x82\xf0\x9f\x8f\xbe"), - "snowboarder: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x82\xf0\x9f\x8f\xbf"), - "snowboarder: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c"), "person golfing", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xf0\x9f\x8f\xbb"), - "person golfing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xf0\x9f\x8f\xbc"), - "person golfing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xf0\x9f\x8f\xbd"), - "person golfing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xf0\x9f\x8f\xbe"), - "person golfing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xf0\x9f\x8f\xbf"), - "person golfing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xef\xb8\x8f\xe2\x80\x8d\xe2\x99\x82"), - "man golfing", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xe2\x80\x8d\xe2\x99\x82"), - "man golfing", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man golfing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man golfing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man golfing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man golfing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man golfing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xef\xb8\x8f\xe2\x80\x8d\xe2\x99\x80"), - "woman golfing", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xe2\x80\x8d\xe2\x99\x80"), - "woman golfing", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman golfing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman golfing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman golfing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman golfing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8c\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman golfing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84"), "person surfing", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbb"), - "person surfing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbc"), - "person surfing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbd"), - "person surfing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbe"), - "person surfing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbf"), - "person surfing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xe2\x80\x8d\xe2\x99\x82"), - "man surfing", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man surfing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man surfing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man surfing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man surfing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man surfing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xe2\x80\x8d\xe2\x99\x80"), - "woman surfing", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman surfing: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman surfing: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman surfing: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman surfing: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x84\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman surfing: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3"), "person rowing boat", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbb"), - "person rowing boat: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbc"), - "person rowing boat: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbd"), - "person rowing boat: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbe"), - "person rowing boat: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbf"), - "person rowing boat: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xe2\x80\x8d\xe2\x99\x82"), - "man rowing boat", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man rowing boat: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man rowing boat: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man rowing boat: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man rowing boat: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man rowing boat: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xe2\x80\x8d\xe2\x99\x80"), - "woman rowing boat", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman rowing boat: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman rowing boat: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman rowing boat: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman rowing boat: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa3\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman rowing boat: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a"), "person swimming", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbb"), - "person swimming: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbc"), - "person swimming: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbd"), - "person swimming: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbe"), - "person swimming: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbf"), - "person swimming: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xe2\x80\x8d\xe2\x99\x82"), - "man swimming", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man swimming: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man swimming: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man swimming: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man swimming: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man swimming: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xe2\x80\x8d\xe2\x99\x80"), - "woman swimming", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman swimming: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman swimming: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman swimming: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman swimming: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8a\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman swimming: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9"), "person bouncing ball", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbb"), - "person bouncing ball: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbc"), - "person bouncing ball: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbd"), - "person bouncing ball: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbe"), - "person bouncing ball: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbf"), - "person bouncing ball: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xef\xb8\x8f\xe2\x80\x8d\xe2\x99\x82"), - "man bouncing ball", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xe2\x80\x8d\xe2\x99\x82"), - "man bouncing ball", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man bouncing ball: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man bouncing ball: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man bouncing ball: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man bouncing ball: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man bouncing ball: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xef\xb8\x8f\xe2\x80\x8d\xe2\x99\x80"), - "woman bouncing ball", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xe2\x80\x8d\xe2\x99\x80"), - "woman bouncing ball", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman bouncing ball: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman bouncing ball: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman bouncing ball: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman bouncing ball: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xe2\x9b\xb9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman bouncing ball: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b"), - "person lifting weights", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbb"), - "person lifting weights: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbc"), - "person lifting weights: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbd"), - "person lifting weights: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbe"), - "person lifting weights: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbf"), - "person lifting weights: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xef\xb8\x8f\xe2\x80\x8d\xe2\x99\x82"), - "man lifting weights", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xe2\x80\x8d\xe2\x99\x82"), - "man lifting weights", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man lifting weights: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man lifting weights: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man lifting weights: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man lifting weights: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man lifting weights: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xef\xb8\x8f\xe2\x80\x8d\xe2\x99\x80"), - "woman lifting weights", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xe2\x80\x8d\xe2\x99\x80"), - "woman lifting weights", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman lifting weights: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman lifting weights: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman lifting weights: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman lifting weights: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8b\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman lifting weights: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4"), "person biking", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbb"), - "person biking: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbc"), - "person biking: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbd"), - "person biking: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbe"), - "person biking: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbf"), - "person biking: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xe2\x80\x8d\xe2\x99\x82"), - "man biking", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man biking: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man biking: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man biking: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man biking: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man biking: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xe2\x80\x8d\xe2\x99\x80"), - "woman biking", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman biking: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman biking: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman biking: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman biking: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb4\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman biking: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5"), - "person mountain biking", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbb"), - "person mountain biking: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbc"), - "person mountain biking: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbd"), - "person mountain biking: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbe"), - "person mountain biking: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbf"), - "person mountain biking: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xe2\x80\x8d\xe2\x99\x82"), - "man mountain biking", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man mountain biking: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man mountain biking: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man mountain biking: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man mountain biking: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man mountain biking: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xe2\x80\x8d\xe2\x99\x80"), - "woman mountain biking", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman mountain biking: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman mountain biking: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman mountain biking: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman mountain biking: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb5\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman mountain biking: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8"), "person cartwheeling", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbb"), - "person cartwheeling: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbc"), - "person cartwheeling: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbd"), - "person cartwheeling: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbe"), - "person cartwheeling: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbf"), - "person cartwheeling: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xe2\x80\x8d\xe2\x99\x82"), - "man cartwheeling", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man cartwheeling: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man cartwheeling: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man cartwheeling: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man cartwheeling: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man cartwheeling: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xe2\x80\x8d\xe2\x99\x80"), - "woman cartwheeling", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman cartwheeling: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman cartwheeling: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman cartwheeling: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman cartwheeling: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman cartwheeling: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbc"), "people wrestling", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbc\xe2\x80\x8d\xe2\x99\x82"), - "men wrestling", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbc\xe2\x80\x8d\xe2\x99\x80"), - "women wrestling", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd"), - "person playing water polo", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbb"), - "person playing water polo: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbc"), - "person playing water polo: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbd"), - "person playing water polo: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbe"), - "person playing water polo: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbf"), - "person playing water polo: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man playing water polo", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man playing water polo: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man playing water polo: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man playing water polo: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man playing water polo: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man playing water polo: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman playing water polo", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman playing water polo: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman playing water polo: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman playing water polo: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman playing water polo: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbd\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman playing water polo: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe"), - "person playing handball", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbb"), - "person playing handball: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbc"), - "person playing handball: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbd"), - "person playing handball: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbe"), - "person playing handball: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbf"), - "person playing handball: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man playing handball", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man playing handball: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man playing handball: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man playing handball: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man playing handball: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man playing handball: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman playing handball", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman playing handball: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman playing handball: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman playing handball: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman playing handball: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbe\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman playing handball: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9"), "person juggling", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbb"), - "person juggling: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbc"), - "person juggling: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbd"), - "person juggling: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbe"), - "person juggling: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbf"), - "person juggling: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xe2\x80\x8d\xe2\x99\x82"), - "man juggling", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man juggling: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man juggling: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man juggling: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man juggling: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man juggling: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xe2\x80\x8d\xe2\x99\x80"), - "woman juggling", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman juggling: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman juggling: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman juggling: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman juggling: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xb9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman juggling: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98"), - "person in lotus position", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xf0\x9f\x8f\xbb"), - "person in lotus position: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xf0\x9f\x8f\xbc"), - "person in lotus position: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xf0\x9f\x8f\xbd"), - "person in lotus position: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xf0\x9f\x8f\xbe"), - "person in lotus position: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xf0\x9f\x8f\xbf"), - "person in lotus position: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xe2\x80\x8d\xe2\x99\x82"), - "man in lotus position", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x82"), - "man in lotus position: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x82"), - "man in lotus position: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x82"), - "man in lotus position: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x82"), - "man in lotus position: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x82"), - "man in lotus position: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xe2\x80\x8d\xe2\x99\x80"), - "woman in lotus position", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xf0\x9f\x8f\xbb\xe2\x80\x8d\xe2\x99\x80"), - "woman in lotus position: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xf0\x9f\x8f\xbc\xe2\x80\x8d\xe2\x99\x80"), - "woman in lotus position: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xf0\x9f\x8f\xbd\xe2\x80\x8d\xe2\x99\x80"), - "woman in lotus position: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xf0\x9f\x8f\xbe\xe2\x80\x8d\xe2\x99\x80"), - "woman in lotus position: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x98\xf0\x9f\x8f\xbf\xe2\x80\x8d\xe2\x99\x80"), - "woman in lotus position: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x80"), "person taking bath", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x80\xf0\x9f\x8f\xbb"), - "person taking bath: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x80\xf0\x9f\x8f\xbc"), - "person taking bath: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x80\xf0\x9f\x8f\xbd"), - "person taking bath: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x80\xf0\x9f\x8f\xbe"), - "person taking bath: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x80\xf0\x9f\x8f\xbf"), - "person taking bath: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x8c"), "person in bed", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x8c\xf0\x9f\x8f\xbb"), - "person in bed: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x8c\xf0\x9f\x8f\xbc"), - "person in bed: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x8c\xf0\x9f\x8f\xbd"), - "person in bed: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x8c\xf0\x9f\x8f\xbe"), - "person in bed: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x8c\xf0\x9f\x8f\xbf"), - "person in bed: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{ - QString::fromUtf8("\xf0\x9f\xa7\x91\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d\xf0\x9f\xa7\x91"), - "people holding hands", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb"), - "people holding hands: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc"), - "people holding hands: light skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd"), - "people holding hands: light skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe"), - "people holding hands: light skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf"), - "people holding hands: light skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb"), - "people holding hands: medium-light skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc"), - "people holding hands: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd"), - "people holding hands: medium-light skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe"), - "people holding hands: medium-light skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf"), - "people holding hands: medium-light skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb"), - "people holding hands: medium skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc"), - "people holding hands: medium skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd"), - "people holding hands: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe"), - "people holding hands: medium skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf"), - "people holding hands: medium skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb"), - "people holding hands: medium-dark skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc"), - "people holding hands: medium-dark skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd"), - "people holding hands: medium-dark skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe"), - "people holding hands: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf"), - "people holding hands: medium-dark skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbb"), - "people holding hands: dark skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbc"), - "people holding hands: dark skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbd"), - "people holding hands: dark skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbe"), - "people holding hands: dark skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\xa7\x91\xf0\x9f\x8f\xbf"), - "people holding hands: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xad"), "women holding hands", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xad\xf0\x9f\x8f\xbb"), - "women holding hands: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc"), - "women holding hands: light skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd"), - "women holding hands: light skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe"), - "women holding hands: light skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf"), - "women holding hands: light skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb"), - "women holding hands: medium-light skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xad\xf0\x9f\x8f\xbc"), - "women holding hands: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd"), - "women holding hands: medium-light skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe"), - "women holding hands: medium-light skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf"), - "women holding hands: medium-light skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb"), - "women holding hands: medium skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc"), - "women holding hands: medium skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xad\xf0\x9f\x8f\xbd"), - "women holding hands: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe"), - "women holding hands: medium skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf"), - "women holding hands: medium skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb"), - "women holding hands: medium-dark skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc"), - "women holding hands: medium-dark skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd"), - "women holding hands: medium-dark skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xad\xf0\x9f\x8f\xbe"), - "women holding hands: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf"), - "women holding hands: medium-dark skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb"), - "women holding hands: dark skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc"), - "women holding hands: dark skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd"), - "women holding hands: dark skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe"), - "women holding hands: dark skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xad\xf0\x9f\x8f\xbf"), - "women holding hands: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xab"), - "woman and man holding hands", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xab\xf0\x9f\x8f\xbb"), - "woman and man holding hands: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc"), - "woman and man holding hands: light skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd"), - "woman and man holding hands: light skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe"), - "woman and man holding hands: light skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf"), - "woman and man holding hands: light skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb"), - "woman and man holding hands: medium-light skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xab\xf0\x9f\x8f\xbc"), - "woman and man holding hands: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd"), - "woman and man holding hands: medium-light skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe"), - "woman and man holding hands: medium-light skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf"), - "woman and man holding hands: medium-light skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb"), - "woman and man holding hands: medium skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc"), - "woman and man holding hands: medium skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xab\xf0\x9f\x8f\xbd"), - "woman and man holding hands: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe"), - "woman and man holding hands: medium skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf"), - "woman and man holding hands: medium skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb"), - "woman and man holding hands: medium-dark skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc"), - "woman and man holding hands: medium-dark skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd"), - "woman and man holding hands: medium-dark skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xab\xf0\x9f\x8f\xbe"), - "woman and man holding hands: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf"), - "woman and man holding hands: medium-dark skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb"), - "woman and man holding hands: dark skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc"), - "woman and man holding hands: dark skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd"), - "woman and man holding hands: dark skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe"), - "woman and man holding hands: dark skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xab\xf0\x9f\x8f\xbf"), - "woman and man holding hands: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xac"), "men holding hands", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xac\xf0\x9f\x8f\xbb"), - "men holding hands: light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc"), - "men holding hands: light skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd"), - "men holding hands: light skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe"), - "men holding hands: light skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf"), - "men holding hands: light skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb"), - "men holding hands: medium-light skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xac\xf0\x9f\x8f\xbc"), - "men holding hands: medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd"), - "men holding hands: medium-light skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe"), - "men holding hands: medium-light skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf"), - "men holding hands: medium-light skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb"), - "men holding hands: medium skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc"), - "men holding hands: medium skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xac\xf0\x9f\x8f\xbd"), - "men holding hands: medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe"), - "men holding hands: medium skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf"), - "men holding hands: medium skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb"), - "men holding hands: medium-dark skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc"), - "men holding hands: medium-dark skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd"), - "men holding hands: medium-dark skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xac\xf0\x9f\x8f\xbe"), - "men holding hands: medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf"), - "men holding hands: medium-dark skin tone, dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbb"), - "men holding hands: dark skin tone, light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbc"), - "men holding hands: dark skin tone, medium-light skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbd"), - "men holding hands: dark skin tone, medium skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbf\xe2\x80\x8d\xf0\x9f\xa4\x9d\xe2\x80\x8d" - "\xf0\x9f\x91\xa8\xf0\x9f\x8f\xbe"), - "men holding hands: dark skin tone, medium-dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xac\xf0\x9f\x8f\xbf"), - "men holding hands: dark skin tone", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x8f"), "kiss", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xe2\x9d\xa4\xef\xb8\x8f\xe2\x80\x8d\xf0\x9f" - "\x92\x8b\xe2\x80\x8d\xf0\x9f\x91\xa8"), - "kiss: woman, man", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xe2\x9d\xa4\xe2\x80\x8d\xf0\x9f\x92\x8b\xe2" - "\x80\x8d\xf0\x9f\x91\xa8"), - "kiss: woman, man", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xe2\x9d\xa4\xef\xb8\x8f\xe2\x80\x8d\xf0\x9f" - "\x92\x8b\xe2\x80\x8d\xf0\x9f\x91\xa8"), - "kiss: man, man", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xe2\x9d\xa4\xe2\x80\x8d\xf0\x9f\x92\x8b\xe2" - "\x80\x8d\xf0\x9f\x91\xa8"), - "kiss: man, man", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xe2\x9d\xa4\xef\xb8\x8f\xe2\x80\x8d\xf0\x9f" - "\x92\x8b\xe2\x80\x8d\xf0\x9f\x91\xa9"), - "kiss: woman, woman", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xe2\x9d\xa4\xe2\x80\x8d\xf0\x9f\x92\x8b\xe2" - "\x80\x8d\xf0\x9f\x91\xa9"), - "kiss: woman, woman", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x91"), "couple with heart", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8( - "\xf0\x9f\x91\xa9\xe2\x80\x8d\xe2\x9d\xa4\xef\xb8\x8f\xe2\x80\x8d\xf0\x9f\x91\xa8"), - "couple with heart: woman, man", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xe2\x9d\xa4\xe2\x80\x8d\xf0\x9f\x91\xa8"), - "couple with heart: woman, man", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8( - "\xf0\x9f\x91\xa8\xe2\x80\x8d\xe2\x9d\xa4\xef\xb8\x8f\xe2\x80\x8d\xf0\x9f\x91\xa8"), - "couple with heart: man, man", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xe2\x9d\xa4\xe2\x80\x8d\xf0\x9f\x91\xa8"), - "couple with heart: man, man", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8( - "\xf0\x9f\x91\xa9\xe2\x80\x8d\xe2\x9d\xa4\xef\xb8\x8f\xe2\x80\x8d\xf0\x9f\x91\xa9"), - "couple with heart: woman, woman", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xe2\x9d\xa4\xe2\x80\x8d\xf0\x9f\x91\xa9"), - "couple with heart: woman, woman", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xaa"), "family", emoji::EmojiCategory::People}, - Emoji{ - QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa6"), - "family: man, woman, boy", - emoji::EmojiCategory::People}, - Emoji{ - QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa7"), - "family: man, woman, girl", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa7" - "\xe2\x80\x8d\xf0\x9f\x91\xa6"), - "family: man, woman, girl, boy", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa6" - "\xe2\x80\x8d\xf0\x9f\x91\xa6"), - "family: man, woman, boy, boy", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa7" - "\xe2\x80\x8d\xf0\x9f\x91\xa7"), - "family: man, woman, girl, girl", - emoji::EmojiCategory::People}, - Emoji{ - QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa6"), - "family: man, man, boy", - emoji::EmojiCategory::People}, - Emoji{ - QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa7"), - "family: man, man, girl", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa7" - "\xe2\x80\x8d\xf0\x9f\x91\xa6"), - "family: man, man, girl, boy", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa6" - "\xe2\x80\x8d\xf0\x9f\x91\xa6"), - "family: man, man, boy, boy", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa7" - "\xe2\x80\x8d\xf0\x9f\x91\xa7"), - "family: man, man, girl, girl", - emoji::EmojiCategory::People}, - Emoji{ - QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa6"), - "family: woman, woman, boy", - emoji::EmojiCategory::People}, - Emoji{ - QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa7"), - "family: woman, woman, girl", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa7" - "\xe2\x80\x8d\xf0\x9f\x91\xa6"), - "family: woman, woman, girl, boy", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa6" - "\xe2\x80\x8d\xf0\x9f\x91\xa6"), - "family: woman, woman, boy, boy", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa7" - "\xe2\x80\x8d\xf0\x9f\x91\xa7"), - "family: woman, woman, girl, girl", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa6"), - "family: man, boy", - emoji::EmojiCategory::People}, - Emoji{ - QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa6\xe2\x80\x8d\xf0\x9f\x91\xa6"), - "family: man, boy, boy", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa7"), - "family: man, girl", - emoji::EmojiCategory::People}, - Emoji{ - QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa7\xe2\x80\x8d\xf0\x9f\x91\xa6"), - "family: man, girl, boy", - emoji::EmojiCategory::People}, - Emoji{ - QString::fromUtf8("\xf0\x9f\x91\xa8\xe2\x80\x8d\xf0\x9f\x91\xa7\xe2\x80\x8d\xf0\x9f\x91\xa7"), - "family: man, girl, girl", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa6"), - "family: woman, boy", - emoji::EmojiCategory::People}, - Emoji{ - QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa6\xe2\x80\x8d\xf0\x9f\x91\xa6"), - "family: woman, boy, boy", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa7"), - "family: woman, girl", - emoji::EmojiCategory::People}, - Emoji{ - QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa7\xe2\x80\x8d\xf0\x9f\x91\xa6"), - "family: woman, girl, boy", - emoji::EmojiCategory::People}, - Emoji{ - QString::fromUtf8("\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x91\xa7\xe2\x80\x8d\xf0\x9f\x91\xa7"), - "family: woman, girl, girl", - emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\xa3"), "speaking head", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa4"), "bust in silhouette", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa5"), "busts in silhouette", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\xab\x82"), "people hugging", emoji::EmojiCategory::People}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa3"), "footprints", emoji::EmojiCategory::People}, -}; - -const std::vector emoji::Provider::nature = { - // Nature - Emoji{QString::fromUtf8("\xf0\x9f\x90\xb5"), "monkey face", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x92"), "monkey", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x8d"), "gorilla", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xa7"), "orangutan", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xb6"), "dog face", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x95"), "dog", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xae"), "guide dog", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x95\xe2\x80\x8d\xf0\x9f\xa6\xba"), - "service dog", - emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xa9"), "poodle", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xba"), "wolf", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x8a"), "fox", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x9d"), "raccoon", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xb1"), "cat face", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x88"), "cat", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x88\xe2\x80\x8d\xe2\xac\x9b"), - "black cat", - emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x81"), "lion", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xaf"), "tiger face", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x85"), "tiger", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x86"), "leopard", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xb4"), "horse face", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x8e"), "horse", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x84"), "unicorn", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x93"), "zebra", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x8c"), "deer", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xac"), "bison", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xae"), "cow face", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x82"), "ox", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x83"), "water buffalo", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x84"), "cow", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xb7"), "pig face", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x96"), "pig", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x97"), "boar", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xbd"), "pig nose", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x8f"), "ram", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x91"), "ewe", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x90"), "goat", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xaa"), "camel", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xab"), "two-hump camel", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x99"), "llama", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x92"), "giraffe", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x98"), "elephant", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xa3"), "mammoth", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x8f"), "rhinoceros", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x9b"), "hippopotamus", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xad"), "mouse face", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x81"), "mouse", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x80"), "rat", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xb9"), "hamster", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xb0"), "rabbit face", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x87"), "rabbit", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xbf"), "chipmunk", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xab"), "beaver", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x94"), "hedgehog", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x87"), "bat", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xbb"), "bear", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xbb\xe2\x80\x8d\xe2\x9d\x84"), - "polar bear", - emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xa8"), "koala", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xbc"), "panda", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xa5"), "sloth", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xa6"), "otter", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xa8"), "skunk", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x98"), "kangaroo", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xa1"), "badger", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xbe"), "paw prints", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x83"), "turkey", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x94"), "chicken", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x93"), "rooster", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xa3"), "hatching chick", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xa4"), "baby chick", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xa5"), - "front-facing baby chick", - emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xa6"), "bird", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xa7"), "penguin", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x8a"), "dove", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x85"), "eagle", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x86"), "duck", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xa2"), "swan", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x89"), "owl", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xa4"), "dodo", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xb6"), "feather", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xa9"), "flamingo", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x9a"), "peacock", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x9c"), "parrot", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xb8"), "frog", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x8a"), "crocodile", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xa2"), "turtle", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x8e"), "lizard", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x8d"), "snake", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xb2"), "dragon face", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x89"), "dragon", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x95"), "sauropod", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x96"), "T-Rex", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xb3"), "spouting whale", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x8b"), "whale", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xac"), "dolphin", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xad"), "seal", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x9f"), "fish", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xa0"), "tropical fish", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\xa1"), "blowfish", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x88"), "shark", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x99"), "octopus", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x9a"), "spiral shell", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x8c"), "snail", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x8b"), "butterfly", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x9b"), "bug", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x9c"), "ant", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x9d"), "honeybee", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xb2"), "beetle", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x90\x9e"), "lady beetle", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x97"), "cricket", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xb3"), "cockroach", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb7"), "spider", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb8"), "spider web", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x82"), "scorpion", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x9f"), "mosquito", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xb0"), "fly", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xb1"), "worm", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xa0"), "microbe", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x90"), "bouquet", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb8"), "cherry blossom", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xae"), "white flower", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb5"), "rosette", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb9"), "rose", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x80"), "wilted flower", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xba"), "hibiscus", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xbb"), "sunflower", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xbc"), "blossom", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb7"), "tulip", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb1"), "seedling", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xb4"), "potted plant", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb2"), "evergreen tree", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb3"), "deciduous tree", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb4"), "palm tree", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb5"), "cactus", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xbe"), "sheaf of rice", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xbf"), "herb", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xe2\x98\x98"), "shamrock", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x80"), "four leaf clover", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x81"), "maple leaf", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x82"), "fallen leaf", emoji::EmojiCategory::Nature}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x83"), - "leaf fluttering in wind", - emoji::EmojiCategory::Nature}, -}; - -const std::vector emoji::Provider::food = { - // Food - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x87"), "grapes", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x88"), "melon", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x89"), "watermelon", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x8a"), "tangerine", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x8b"), "lemon", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x8c"), "banana", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x8d"), "pineapple", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xad"), "mango", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x8e"), "red apple", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x8f"), "green apple", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x90"), "pear", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x91"), "peach", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x92"), "cherries", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x93"), "strawberry", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xab\x90"), "blueberries", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x9d"), "kiwi fruit", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x85"), "tomato", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xab\x92"), "olive", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xa5"), "coconut", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x91"), "avocado", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x86"), "eggplant", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x94"), "potato", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x95"), "carrot", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xbd"), "ear of corn", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb6"), "hot pepper", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xab\x91"), "bell pepper", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x92"), "cucumber", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xac"), "leafy green", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xa6"), "broccoli", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x84"), "garlic", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x85"), "onion", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x84"), "mushroom", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x9c"), "peanuts", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xb0"), "chestnut", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x9e"), "bread", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x90"), "croissant", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x96"), "baguette bread", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xab\x93"), "flatbread", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xa8"), "pretzel", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xaf"), "bagel", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x9e"), "pancakes", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x87"), "waffle", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x80"), "cheese wedge", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x96"), "meat on bone", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x97"), "poultry leg", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xa9"), "cut of meat", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x93"), "bacon", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x94"), "hamburger", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x9f"), "french fries", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x95"), "pizza", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xad"), "hot dog", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xaa"), "sandwich", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xae"), "taco", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xaf"), "burrito", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xab\x94"), "tamale", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x99"), "stuffed flatbread", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x86"), "falafel", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x9a"), "egg", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb3"), "cooking", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x98"), "shallow pan of food", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb2"), "pot of food", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xab\x95"), "fondue", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xa3"), "bowl with spoon", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x97"), "green salad", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xbf"), "popcorn", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x88"), "butter", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x82"), "salt", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xab"), "canned food", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb1"), "bento box", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x98"), "rice cracker", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x99"), "rice ball", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x9a"), "cooked rice", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x9b"), "curry rice", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x9c"), "steaming bowl", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\x9d"), "spaghetti", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa0"), "roasted sweet potato", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa2"), "oden", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa3"), "sushi", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa4"), "fried shrimp", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa5"), "fish cake with swirl", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xae"), "moon cake", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa1"), "dango", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x9f"), "dumpling", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xa0"), "fortune cookie", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xa1"), "takeout box", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x80"), "crab", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x9e"), "lobster", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x90"), "shrimp", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\x91"), "squid", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xaa"), "oyster", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa6"), "soft ice cream", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa7"), "shaved ice", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa8"), "ice cream", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xa9"), "doughnut", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xaa"), "cookie", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x82"), "birthday cake", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb0"), "shortcake", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x81"), "cupcake", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xa7"), "pie", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xab"), "chocolate bar", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xac"), "candy", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xad"), "lollipop", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xae"), "custard", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xaf"), "honey pot", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xbc"), "baby bottle", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x9b"), "glass of milk", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xe2\x98\x95"), "hot beverage", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xab\x96"), "teapot", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb5"), "teacup without handle", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb6"), "sake", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xbe"), - "bottle with popping cork", - emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb7"), "wine glass", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb8"), "cocktail glass", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb9"), "tropical drink", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xba"), "beer mug", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xbb"), "clinking beer mugs", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x82"), "clinking glasses", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x83"), "tumbler glass", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xa4"), "cup with straw", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8b"), "bubble tea", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x83"), "beverage box", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x89"), "mate", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\x8a"), "ice", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xa2"), "chopsticks", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xbd"), - "fork and knife with plate", - emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8d\xb4"), "fork and knife", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x84"), "spoon", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xaa"), "kitchen knife", emoji::EmojiCategory::Food}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xba"), "amphora", emoji::EmojiCategory::Food}, -}; - -const std::vector emoji::Provider::activity = { - // Activity - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x83"), "jack-o-lantern", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x84"), "Christmas tree", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x86"), "fireworks", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x87"), "sparkler", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xa8"), "firecracker", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xe2\x9c\xa8"), "sparkles", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x88"), "balloon", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x89"), "party popper", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x8a"), "confetti ball", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x8b"), "tanabata tree", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x8d"), "pine decoration", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x8e"), "Japanese dolls", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x8f"), "carp streamer", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x90"), "wind chime", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x91"), - "moon viewing ceremony", - emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xa7"), "red envelope", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x80"), "ribbon", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x81"), "wrapped gift", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x97"), "reminder ribbon", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x9f"), "admission tickets", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xab"), "ticket", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x96"), "military medal", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x86"), "trophy", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x85"), "sports medal", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x87"), "1st place medal", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x88"), "2nd place medal", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x89"), "3rd place medal", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xe2\x9a\xbd"), "soccer ball", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xe2\x9a\xbe"), "baseball", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x8e"), "softball", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x80"), "basketball", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x90"), "volleyball", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x88"), "american football", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x89"), "rugby football", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xbe"), "tennis", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x8f"), "flying disc", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb3"), "bowling", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8f"), "cricket game", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x91"), "field hockey", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x92"), "ice hockey", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x8d"), "lacrosse", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x93"), "ping pong", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb8"), "badminton", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x8a"), "boxing glove", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x8b"), - "martial arts uniform", - emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x85"), "goal net", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xe2\x9b\xb3"), "flag in hole", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xe2\x9b\xb8"), "ice skate", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa3"), "fishing pole", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa4\xbf"), "diving mask", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xbd"), "running shirt", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xbf"), "skis", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xb7"), "sled", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x8c"), "curling stone", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xaf"), "direct hit", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x80"), "yo-yo", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x81"), "kite", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb1"), "pool 8 ball", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xae"), "crystal ball", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x84"), "magic wand", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xbf"), "nazar amulet", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xae"), "video game", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb9"), "joystick", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb0"), "slot machine", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb2"), "game die", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xa9"), "puzzle piece", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xb8"), "teddy bear", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x85"), "piñata", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x86"), "nesting dolls", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xe2\x99\xa0"), "spade suit", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xe2\x99\xa5"), "heart suit", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xe2\x99\xa6"), "diamond suit", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xe2\x99\xa3"), "club suit", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xe2\x99\x9f"), "chess pawn", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x83\x8f"), "joker", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x80\x84"), - "mahjong red dragon", - emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb4"), - "flower playing cards", - emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xad"), "performing arts", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\xbc"), "framed picture", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa8"), "artist palette", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xb5"), "thread", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xa1"), "sewing needle", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xb6"), "yarn", emoji::EmojiCategory::Activity}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xa2"), "knot", emoji::EmojiCategory::Activity}, -}; - -const std::vector emoji::Provider::travel = { - // Travel - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x8d"), - "globe showing Europe-Africa", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x8e"), - "globe showing Americas", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x8f"), - "globe showing Asia-Australia", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x90"), - "globe with meridians", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\xba"), "world map", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\xbe"), "map of Japan", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xad"), "compass", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x94"), - "snow-capped mountain", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9b\xb0"), "mountain", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x8b"), "volcano", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\xbb"), "mount fuji", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x95"), "camping", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x96"), "beach with umbrella", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x9c"), "desert", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x9d"), "desert island", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x9e"), "national park", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x9f"), "stadium", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x9b"), "classical building", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x97"), - "building construction", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xb1"), "brick", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xa8"), "rock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xb5"), "wood", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x96"), "hut", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x98"), "houses", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x9a"), "derelict house", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa0"), "house", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa1"), "house with garden", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa2"), "office building", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa3"), - "Japanese post office", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa4"), "post office", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa5"), "hospital", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa6"), "bank", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa8"), "hotel", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa9"), "love hotel", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xaa"), "convenience store", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xab"), "school", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xac"), "department store", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xad"), "factory", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xaf"), "Japanese castle", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb0"), "castle", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x92"), "wedding", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\xbc"), "Tokyo tower", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\xbd"), "Statue of Liberty", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9b\xaa"), "church", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x8c"), "mosque", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x95"), "hindu temple", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x8d"), "synagogue", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9b\xa9"), "shinto shrine", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x8b"), "kaaba", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9b\xb2"), "fountain", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9b\xba"), "tent", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x81"), "foggy", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x83"), "night with stars", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x99"), "cityscape", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x84"), - "sunrise over mountains", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x85"), "sunrise", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x86"), "cityscape at dusk", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x87"), "sunset", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x89"), "bridge at night", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x99\xa8"), "hot springs", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa0"), "carousel horse", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa1"), "ferris wheel", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa2"), "roller coaster", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x88"), "barber pole", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xaa"), "circus tent", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x82"), "locomotive", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x83"), "railway car", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x84"), "high-speed train", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x85"), "bullet train", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x86"), "train", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x87"), "metro", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x88"), "light rail", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x89"), "station", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x8a"), "tram", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x9d"), "monorail", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x9e"), "mountain railway", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x8b"), "tram car", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x8c"), "bus", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x8d"), "oncoming bus", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x8e"), "trolleybus", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x90"), "minibus", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x91"), "ambulance", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x92"), "fire engine", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x93"), "police car", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x94"), "oncoming police car", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x95"), "taxi", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x96"), "oncoming taxi", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x97"), "automobile", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x98"), "oncoming automobile", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x99"), - "sport utility vehicle", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xbb"), "pickup truck", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x9a"), "delivery truck", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x9b"), "articulated lorry", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x9c"), "tractor", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8e"), "racing car", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x8d"), "motorcycle", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xb5"), "motor scooter", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xbd"), "manual wheelchair", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xbc"), - "motorized wheelchair", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xba"), "auto rickshaw", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb2"), "bicycle", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xb4"), "kick scooter", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xb9"), "skateboard", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xbc"), "roller skate", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x8f"), "bus stop", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xa3"), "motorway", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xa4"), "railway track", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xa2"), "oil drum", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9b\xbd"), "fuel pump", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa8"), "police car light", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa5"), - "horizontal traffic light", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa6"), - "vertical traffic light", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x91"), "stop sign", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa7"), "construction", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9a\x93"), "anchor", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9b\xb5"), "sailboat", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xb6"), "canoe", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa4"), "speedboat", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xb3"), "passenger ship", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9b\xb4"), "ferry", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xa5"), "motor boat", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa2"), "ship", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9c\x88"), "airplane", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xa9"), "small airplane", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xab"), "airplane departure", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xac"), "airplane arrival", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x82"), "parachute", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xba"), "seat", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x81"), "helicopter", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x9f"), "suspension railway", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa0"), "mountain cableway", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa1"), "aerial tramway", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xb0"), "satellite", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\x80"), "rocket", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xb8"), "flying saucer", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x8e"), "bellhop bell", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xb3"), "luggage", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x8c\x9b"), "hourglass done", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x8f\xb3"), "hourglass not done", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x8c\x9a"), "watch", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x8f\xb0"), "alarm clock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x8f\xb1"), "stopwatch", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x8f\xb2"), "timer clock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb0"), "mantelpiece clock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x9b"), "twelve o’clock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xa7"), "twelve-thirty", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x90"), "one o’clock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x9c"), "one-thirty", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x91"), "two o’clock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x9d"), "two-thirty", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x92"), "three o’clock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x9e"), "three-thirty", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x93"), "four o’clock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x9f"), "four-thirty", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x94"), "five o’clock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xa0"), "five-thirty", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x95"), "six o’clock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xa1"), "six-thirty", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x96"), "seven o’clock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xa2"), "seven-thirty", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x97"), "eight o’clock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xa3"), "eight-thirty", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x98"), "nine o’clock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xa4"), "nine-thirty", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x99"), "ten o’clock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xa5"), "ten-thirty", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x9a"), "eleven o’clock", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xa6"), "eleven-thirty", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x91"), "new moon", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x92"), - "waxing crescent moon", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x93"), "first quarter moon", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x94"), "waxing gibbous moon", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x95"), "full moon", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x96"), "waning gibbous moon", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x97"), "last quarter moon", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x98"), - "waning crescent moon", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x99"), "crescent moon", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x9a"), "new moon face", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x9b"), - "first quarter moon face", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x9c"), - "last quarter moon face", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa1"), "thermometer", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x98\x80"), "sun", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x9d"), "full moon face", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x9e"), "sun with face", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x90"), "ringed planet", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\xad\x90"), "star", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x9f"), "glowing star", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa0"), "shooting star", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x8c"), "milky way", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x98\x81"), "cloud", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9b\x85"), "sun behind cloud", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9b\x88"), - "cloud with lightning and rain", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa4"), - "sun behind small cloud", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa5"), - "sun behind large cloud", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa6"), - "sun behind rain cloud", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa7"), "cloud with rain", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa8"), "cloud with snow", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xa9"), - "cloud with lightning", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xaa"), "tornado", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xab"), "fog", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\xac"), "wind face", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x80"), "cyclone", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x88"), "rainbow", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x82"), "closed umbrella", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x98\x82"), "umbrella", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x98\x94"), - "umbrella with rain drops", - emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9b\xb1"), "umbrella on ground", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9a\xa1"), "high voltage", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9d\x84"), "snowflake", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x98\x83"), "snowman", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x9b\x84"), "snowman without snow", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xe2\x98\x84"), "comet", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xa5"), "fire", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xa7"), "droplet", emoji::EmojiCategory::Travel}, - Emoji{QString::fromUtf8("\xf0\x9f\x8c\x8a"), "water wave", emoji::EmojiCategory::Travel}, -}; - -const std::vector emoji::Provider::objects = { - // Objects - Emoji{QString::fromUtf8("\xf0\x9f\x91\x93"), "glasses", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xb6"), "sunglasses", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xbd"), "goggles", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xbc"), "lab coat", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xba"), "safety vest", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x94"), "necktie", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x95"), "t-shirt", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x96"), "jeans", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xa3"), "scarf", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xa4"), "gloves", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xa5"), "coat", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xa6"), "socks", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x97"), "dress", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x98"), "kimono", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xbb"), "sari", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa9\xb1"), "one-piece swimsuit", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa9\xb2"), "briefs", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa9\xb3"), "shorts", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x99"), "bikini", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x9a"), "woman’s clothes", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x9b"), "purse", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x9c"), "handbag", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x9d"), "clutch bag", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x8d"), "shopping bags", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x92"), "backpack", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa9\xb4"), "thong sandal", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x9e"), "man’s shoe", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x9f"), "running shoe", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xbe"), "hiking boot", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\xbf"), "flat shoe", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa0"), "high-heeled shoe", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa1"), "woman’s sandal", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa9\xb0"), "ballet shoes", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\xa2"), "woman’s boot", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x91"), "crown", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x91\x92"), "woman’s hat", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa9"), "top hat", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x93"), "graduation cap", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xa2"), "billed cap", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x96"), "military helmet", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x9b\x91"), "rescue worker’s helmet", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xbf"), "prayer beads", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x84"), "lipstick", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x8d"), "ring", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x8e"), "gem stone", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x87"), "muted speaker", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x88"), "speaker low volume", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x89"), - "speaker medium volume", - emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x8a"), - "speaker high volume", - emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xa2"), "loudspeaker", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xa3"), "megaphone", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xaf"), "postal horn", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x94"), "bell", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x95"), "bell with slash", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xbc"), "musical score", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb5"), "musical note", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb6"), "musical notes", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x99"), "studio microphone", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x9a"), "level slider", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x9b"), "control knobs", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa4"), "microphone", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa7"), "headphone", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xbb"), "radio", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb7"), "saxophone", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x97"), "accordion", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb8"), "guitar", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xb9"), "musical keyboard", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xba"), "trumpet", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xbb"), "violin", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x95"), "banjo", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa5\x81"), "drum", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x98"), "long drum", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xb1"), "mobile phone", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xb2"), - "mobile phone with arrow", - emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x98\x8e"), "telephone", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x9e"), "telephone receiver", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x9f"), "pager", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xa0"), "fax machine", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x8b"), "battery", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x8c"), "electric plug", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xbb"), "laptop", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\xa5"), "desktop computer", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\xa8"), "printer", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x8c\xa8"), "keyboard", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\xb1"), "computer mouse", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\xb2"), "trackball", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xbd"), "computer disk", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xbe"), "floppy disk", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xbf"), "optical disk", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x80"), "dvd", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xae"), "abacus", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa5"), "movie camera", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x9e"), "film frames", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xbd"), "film projector", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xac"), "clapper board", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xba"), "television", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xb7"), "camera", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xb8"), "camera with flash", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xb9"), "video camera", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xbc"), "videocassette", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x8d"), - "magnifying glass tilted left", - emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x8e"), - "magnifying glass tilted right", - emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\xaf"), "candle", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xa1"), "light bulb", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xa6"), "flashlight", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xae"), "red paper lantern", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x94"), "diya lamp", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x94"), - "notebook with decorative cover", - emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x95"), "closed book", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x96"), "open book", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x97"), "green book", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x98"), "blue book", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x99"), "orange book", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x9a"), "books", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x93"), "notebook", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x92"), "ledger", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x83"), "page with curl", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x9c"), "scroll", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x84"), "page facing up", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xb0"), "newspaper", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\x9e"), - "rolled-up newspaper", - emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x91"), "bookmark tabs", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x96"), "bookmark", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb7"), "label", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xb0"), "money bag", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x99"), "coin", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xb4"), "yen banknote", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xb5"), "dollar banknote", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xb6"), "euro banknote", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xb7"), "pound banknote", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xb8"), "money with wings", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xb3"), "credit card", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xbe"), "receipt", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xb9"), - "chart increasing with yen", - emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xb1"), "currency exchange", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xb2"), "heavy dollar sign", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x9c\x89"), "envelope", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xa7"), "e-mail", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xa8"), "incoming envelope", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xa9"), - "envelope with arrow", - emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xa4"), "outbox tray", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xa5"), "inbox tray", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xa6"), "package", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xab"), - "closed mailbox with raised flag", - emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xaa"), - "closed mailbox with lowered flag", - emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xac"), - "open mailbox with raised flag", - emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xad"), - "open mailbox with lowered flag", - emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xae"), "postbox", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\xb3"), - "ballot box with ballot", - emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x9c\x8f"), "pencil", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x9c\x92"), "black nib", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x8b"), "fountain pen", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x8a"), "pen", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x8c"), "paintbrush", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x8d"), "crayon", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x9d"), "memo", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xbc"), "briefcase", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x81"), "file folder", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x82"), "open file folder", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\x82"), - "card index dividers", - emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x85"), "calendar", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x86"), "tear-off calendar", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\x92"), "spiral notepad", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\x93"), "spiral calendar", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x87"), "card index", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x88"), "chart increasing", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x89"), "chart decreasing", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x8a"), "bar chart", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x8b"), "clipboard", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x8c"), "pushpin", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x8d"), "round pushpin", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x8e"), "paperclip", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x96\x87"), "linked paperclips", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x8f"), "straight ruler", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x90"), "triangular ruler", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x9c\x82"), "scissors", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\x83"), "card file box", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\x84"), "file cabinet", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\x91"), "wastebasket", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x92"), "locked", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x93"), "unlocked", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x8f"), "locked with pen", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x90"), "locked with key", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x91"), "key", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\x9d"), "old key", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xa8"), "hammer", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x93"), "axe", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x9b\x8f"), "pick", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x9a\x92"), "hammer and pick", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xa0"), "hammer and wrench", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\xa1"), "dagger", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x9a\x94"), "crossed swords", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xab"), "pistol", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x83"), "boomerang", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb9"), "bow and arrow", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\xa1"), "shield", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x9a"), "carpentry saw", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xa7"), "wrench", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x9b"), "screwdriver", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xa9"), "nut and bolt", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x9a\x99"), "gear", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\x9c"), "clamp", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x9a\x96"), "balance scale", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa6\xaf"), "probing cane", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x97"), "link", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x9b\x93"), "chains", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x9d"), "hook", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xb0"), "toolbox", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xb2"), "magnet", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x9c"), "ladder", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x9a\x97"), "alembic", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xaa"), "test tube", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xab"), "petri dish", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xac"), "dna", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xac"), "microscope", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xad"), "telescope", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xa1"), "satellite antenna", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x89"), "syringe", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa9\xb8"), "drop of blood", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\x8a"), "pill", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa9\xb9"), "adhesive bandage", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa9\xba"), "stethoscope", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xaa"), "door", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x97"), "elevator", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x9e"), "mirror", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x9f"), "window", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x8f"), "bed", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x8b"), "couch and lamp", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x91"), "chair", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xbd"), "toilet", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xa0"), "plunger", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xbf"), "shower", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x81"), "bathtub", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xa4"), "mouse trap", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\x92"), "razor", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xb4"), "lotion bottle", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xb7"), "safety pin", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xb9"), "broom", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xba"), "basket", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xbb"), "roll of paper", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xa3"), "bucket", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xbc"), "soap", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xa5"), "toothbrush", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xbd"), "sponge", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xa7\xaf"), "fire extinguisher", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x92"), "shopping cart", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xac"), "cigarette", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x9a\xb0"), "coffin", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xa6"), "headstone", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xe2\x9a\xb1"), "funeral urn", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\x97\xbf"), "moai", emoji::EmojiCategory::Objects}, - Emoji{QString::fromUtf8("\xf0\x9f\xaa\xa7"), "placard", emoji::EmojiCategory::Objects}, -}; - -const std::vector emoji::Provider::symbols = { - // Symbols - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xa7"), "ATM sign", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xae"), "litter in bin sign", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb0"), "potable water", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\xbf"), "wheelchair symbol", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb9"), "men’s room", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xba"), "women’s room", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xbb"), "restroom", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xbc"), "baby symbol", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xbe"), "water closet", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x82"), "passport control", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x83"), "customs", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x84"), "baggage claim", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x85"), "left luggage", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9a\xa0"), "warning", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb8"), "children crossing", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9b\x94"), "no entry", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xab"), "prohibited", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb3"), "no bicycles", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xad"), "no smoking", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xaf"), "no littering", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb1"), "non-potable water", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xb7"), "no pedestrians", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xb5"), "no mobile phones", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x9e"), - "no one under eighteen", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x98\xa2"), "radioactive", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x98\xa3"), "biohazard", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\xac\x86"), "up arrow", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x86\x97"), "up-right arrow", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9e\xa1"), "right arrow", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x86\x98"), "down-right arrow", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\xac\x87"), "down arrow", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x86\x99"), "down-left arrow", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\xac\x85"), "left arrow", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x86\x96"), "up-left arrow", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x86\x95"), "up-down arrow", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x86\x94"), "left-right arrow", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x86\xa9"), - "right arrow curving left", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x86\xaa"), - "left arrow curving right", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\xa4\xb4"), "right arrow curving up", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\xa4\xb5"), - "right arrow curving down", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x83"), - "clockwise vertical arrows", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x84"), - "counterclockwise arrows button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x99"), "BACK arrow", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x9a"), "END arrow", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x9b"), "ON! arrow", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x9c"), "SOON arrow", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x9d"), "TOP arrow", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9b\x90"), "place of worship", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9a\x9b"), "atom symbol", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x89"), "om", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9c\xa1"), "star of David", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x98\xb8"), "wheel of dharma", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x98\xaf"), "yin yang", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9c\x9d"), "latin cross", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x98\xa6"), "orthodox cross", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x98\xaa"), "star and crescent", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x98\xae"), "peace symbol", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x95\x8e"), "menorah", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xaf"), - "dotted six-pointed star", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\x88"), "Aries", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\x89"), "Taurus", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\x8a"), "Gemini", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\x8b"), "Cancer", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\x8c"), "Leo", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\x8d"), "Virgo", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\x8e"), "Libra", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\x8f"), "Scorpio", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\x90"), "Sagittarius", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\x91"), "Capricorn", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\x92"), "Aquarius", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\x93"), "Pisces", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9b\x8e"), "Ophiuchus", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x80"), - "shuffle tracks button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x81"), "repeat button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x82"), - "repeat single button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x96\xb6"), "play button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x8f\xa9"), "fast-forward button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x8f\xad"), "next track button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x8f\xaf"), "play or pause button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x97\x80"), "reverse button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x8f\xaa"), "fast reverse button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x8f\xae"), "last track button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xbc"), "upwards button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x8f\xab"), "fast up button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xbd"), "downwards button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x8f\xac"), "fast down button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x8f\xb8"), "pause button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x8f\xb9"), "stop button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x8f\xba"), "record button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x8f\x8f"), "eject button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\xa6"), "cinema", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x85"), "dim button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x86"), "bright button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xb6"), "antenna bars", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xb3"), "vibration mode", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\xb4"), "mobile phone off", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\x80"), "female sign", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\x82"), "male sign", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9a\xa7"), "transgender symbol", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9a\x95"), "medical symbol", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\xbe"), "infinity", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x99\xbb"), "recycling symbol", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9a\x9c"), "fleur-de-lis", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xb1"), "trident emblem", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x93\x9b"), "name badge", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xb0"), - "Japanese symbol for beginner", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\xad\x95"), "hollow red circle", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9c\x85"), "check mark button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x98\x91"), "check box with check", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9c\x94"), "check mark", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9c\x96"), "multiplication sign", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9d\x8c"), "cross mark", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9d\x8e"), "cross mark button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9e\x95"), "plus sign", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9e\x96"), "minus sign", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9e\x97"), "division sign", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9e\xb0"), "curly loop", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9e\xbf"), "double curly loop", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe3\x80\xbd"), "part alternation mark", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9c\xb3"), "eight-spoked asterisk", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9c\xb4"), "eight-pointed star", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9d\x87"), "sparkle", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x80\xbc"), - "double exclamation mark", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x81\x89"), - "exclamation question mark", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9d\x93"), "question mark", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9d\x94"), "white question mark", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9d\x95"), "white exclamation mark", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9d\x97"), "exclamation mark", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe3\x80\xb0"), "wavy dash", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xc2\xa9"), "copyright", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xc2\xae"), "registered", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x84\xa2"), "trade mark", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("#\xef\xb8\x8f\xe2\x83\xa3"), "keycap: #", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("#\xe2\x83\xa3"), "keycap: #", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("*\xef\xb8\x8f\xe2\x83\xa3"), "keycap: *", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("*\xe2\x83\xa3"), "keycap: *", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("0\xef\xb8\x8f\xe2\x83\xa3"), "keycap: 0", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("0\xe2\x83\xa3"), "keycap: 0", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("1\xef\xb8\x8f\xe2\x83\xa3"), "keycap: 1", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("1\xe2\x83\xa3"), "keycap: 1", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("2\xef\xb8\x8f\xe2\x83\xa3"), "keycap: 2", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("2\xe2\x83\xa3"), "keycap: 2", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("3\xef\xb8\x8f\xe2\x83\xa3"), "keycap: 3", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("3\xe2\x83\xa3"), "keycap: 3", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("4\xef\xb8\x8f\xe2\x83\xa3"), "keycap: 4", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("4\xe2\x83\xa3"), "keycap: 4", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("5\xef\xb8\x8f\xe2\x83\xa3"), "keycap: 5", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("5\xe2\x83\xa3"), "keycap: 5", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("6\xef\xb8\x8f\xe2\x83\xa3"), "keycap: 6", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("6\xe2\x83\xa3"), "keycap: 6", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("7\xef\xb8\x8f\xe2\x83\xa3"), "keycap: 7", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("7\xe2\x83\xa3"), "keycap: 7", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("8\xef\xb8\x8f\xe2\x83\xa3"), "keycap: 8", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("8\xe2\x83\xa3"), "keycap: 8", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("9\xef\xb8\x8f\xe2\x83\xa3"), "keycap: 9", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("9\xe2\x83\xa3"), "keycap: 9", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x9f"), "keycap: 10", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xa0"), - "input latin uppercase", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xa1"), - "input latin lowercase", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xa2"), "input numbers", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xa3"), "input symbols", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xa4"), - "input latin letters", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x85\xb0"), - "A button (blood type)", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x86\x8e"), - "AB button (blood type)", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x85\xb1"), - "B button (blood type)", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x86\x91"), "CL button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x86\x92"), "COOL button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x86\x93"), "FREE button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x84\xb9"), "information", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x86\x94"), "ID button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x93\x82"), "circled M", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x86\x95"), "NEW button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x86\x96"), "NG button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x85\xbe"), - "O button (blood type)", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x86\x97"), "OK button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x85\xbf"), "P button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x86\x98"), "SOS button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x86\x99"), "UP! button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x86\x9a"), "VS button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x88\x81"), - "Japanese “here” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x88\x82"), - "Japanese “service charge” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x88\xb7"), - "Japanese “monthly amount” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x88\xb6"), - "Japanese “not free of charge” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x88\xaf"), - "Japanese “reserved” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x89\x90"), - "Japanese “bargain” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x88\xb9"), - "Japanese “discount” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x88\x9a"), - "Japanese “free of charge” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x88\xb2"), - "Japanese “prohibited” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x89\x91"), - "Japanese “acceptable” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x88\xb8"), - "Japanese “application” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x88\xb4"), - "Japanese “passing grade” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x88\xb3"), - "Japanese “vacancy” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe3\x8a\x97"), - "Japanese “congratulations” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe3\x8a\x99"), - "Japanese “secret” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x88\xba"), - "Japanese “open for business” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x88\xb5"), - "Japanese “no vacancy” button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xb4"), "red circle", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9f\xa0"), "orange circle", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9f\xa1"), "yellow circle", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9f\xa2"), "green circle", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xb5"), "blue circle", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9f\xa3"), "purple circle", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9f\xa4"), "brown circle", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9a\xab"), "black circle", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x9a\xaa"), "white circle", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9f\xa5"), "red square", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9f\xa7"), "orange square", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9f\xa8"), "yellow square", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9f\xa9"), "green square", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9f\xa6"), "blue square", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9f\xaa"), "purple square", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x9f\xab"), "brown square", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\xac\x9b"), "black large square", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\xac\x9c"), "white large square", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x97\xbc"), "black medium square", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x97\xbb"), "white medium square", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x97\xbe"), - "black medium-small square", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x97\xbd"), - "white medium-small square", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x96\xaa"), "black small square", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xe2\x96\xab"), "white small square", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xb6"), - "large orange diamond", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xb7"), "large blue diamond", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xb8"), - "small orange diamond", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xb9"), "small blue diamond", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xba"), - "red triangle pointed up", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xbb"), - "red triangle pointed down", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x92\xa0"), "diamond with a dot", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\x98"), "radio button", emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xb3"), - "white square button", - emoji::EmojiCategory::Symbols}, - Emoji{QString::fromUtf8("\xf0\x9f\x94\xb2"), - "black square button", - emoji::EmojiCategory::Symbols}, -}; - -const std::vector emoji::Provider::flags = { - // Flags - Emoji{QString::fromUtf8("\xf0\x9f\x8f\x81"), "chequered flag", emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x9a\xa9"), "triangular flag", emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x8e\x8c"), "crossed flags", emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb4"), "black flag", emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb3"), "white flag", emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb3\xef\xb8\x8f\xe2\x80\x8d\xf0\x9f\x8c\x88"), - "rainbow flag", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb3\xe2\x80\x8d\xf0\x9f\x8c\x88"), - "rainbow flag", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb3\xef\xb8\x8f\xe2\x80\x8d\xe2\x9a\xa7"), - "transgender flag", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb3\xe2\x80\x8d\xe2\x9a\xa7"), - "transgender flag", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb4\xe2\x80\x8d\xe2\x98\xa0"), - "pirate flag", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xa8"), - "flag: Ascension Island", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xa9"), - "flag: Andorra", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xaa"), - "flag: United Arab Emirates", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xab"), - "flag: Afghanistan", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xac"), - "flag: Antigua & Barbuda", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xae"), - "flag: Anguilla", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb1"), - "flag: Albania", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb2"), - "flag: Armenia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb4"), - "flag: Angola", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb6"), - "flag: Antarctica", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb7"), - "flag: Argentina", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb8"), - "flag: American Samoa", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xb9"), - "flag: Austria", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xba"), - "flag: Australia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xbc"), - "flag: Aruba", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xbd"), - "flag: Åland Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa6\xf0\x9f\x87\xbf"), - "flag: Azerbaijan", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xa6"), - "flag: Bosnia & Herzegovina", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xa7"), - "flag: Barbados", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xa9"), - "flag: Bangladesh", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xaa"), - "flag: Belgium", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xab"), - "flag: Burkina Faso", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xac"), - "flag: Bulgaria", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xad"), - "flag: Bahrain", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xae"), - "flag: Burundi", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xaf"), - "flag: Benin", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb1"), - "flag: St. Barthélemy", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb2"), - "flag: Bermuda", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb3"), - "flag: Brunei", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb4"), - "flag: Bolivia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb6"), - "flag: Caribbean Netherlands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb7"), - "flag: Brazil", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb8"), - "flag: Bahamas", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xb9"), - "flag: Bhutan", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbb"), - "flag: Bouvet Island", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbc"), - "flag: Botswana", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbe"), - "flag: Belarus", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa7\xf0\x9f\x87\xbf"), - "flag: Belize", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xa6"), - "flag: Canada", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xa8"), - "flag: Cocos (Keeling) Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xa9"), - "flag: Congo - Kinshasa", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xab"), - "flag: Central African Republic", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xac"), - "flag: Congo - Brazzaville", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xad"), - "flag: Switzerland", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xae"), - "flag: Côte d’Ivoire", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb0"), - "flag: Cook Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb1"), - "flag: Chile", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb2"), - "flag: Cameroon", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb3"), - "flag: China", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb4"), - "flag: Colombia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb5"), - "flag: Clipperton Island", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xb7"), - "flag: Costa Rica", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xba"), - "flag: Cuba", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbb"), - "flag: Cape Verde", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbc"), - "flag: Curaçao", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbd"), - "flag: Christmas Island", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbe"), - "flag: Cyprus", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa8\xf0\x9f\x87\xbf"), - "flag: Czechia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xaa"), - "flag: Germany", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xac"), - "flag: Diego Garcia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xaf"), - "flag: Djibouti", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xb0"), - "flag: Denmark", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xb2"), - "flag: Dominica", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xb4"), - "flag: Dominican Republic", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xa9\xf0\x9f\x87\xbf"), - "flag: Algeria", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xa6"), - "flag: Ceuta & Melilla", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xa8"), - "flag: Ecuador", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xaa"), - "flag: Estonia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xac"), - "flag: Egypt", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xad"), - "flag: Western Sahara", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xb7"), - "flag: Eritrea", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xb8"), - "flag: Spain", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xb9"), - "flag: Ethiopia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xaa\xf0\x9f\x87\xba"), - "flag: European Union", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xae"), - "flag: Finland", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xaf"), - "flag: Fiji", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb0"), - "flag: Falkland Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb2"), - "flag: Micronesia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb4"), - "flag: Faroe Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xab\xf0\x9f\x87\xb7"), - "flag: France", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xa6"), - "flag: Gabon", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xa7"), - "flag: United Kingdom", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xa9"), - "flag: Grenada", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xaa"), - "flag: Georgia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xab"), - "flag: French Guiana", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xac"), - "flag: Guernsey", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xad"), - "flag: Ghana", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xae"), - "flag: Gibraltar", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb1"), - "flag: Greenland", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb2"), - "flag: Gambia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb3"), - "flag: Guinea", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb5"), - "flag: Guadeloupe", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb6"), - "flag: Equatorial Guinea", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb7"), - "flag: Greece", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb8"), - "flag: South Georgia & South Sandwich Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xb9"), - "flag: Guatemala", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xba"), - "flag: Guam", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xbc"), - "flag: Guinea-Bissau", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xac\xf0\x9f\x87\xbe"), - "flag: Guyana", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb0"), - "flag: Hong Kong SAR China", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb2"), - "flag: Heard & McDonald Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb3"), - "flag: Honduras", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb7"), - "flag: Croatia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xb9"), - "flag: Haiti", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xad\xf0\x9f\x87\xba"), - "flag: Hungary", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xa8"), - "flag: Canary Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xa9"), - "flag: Indonesia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xaa"), - "flag: Ireland", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb1"), - "flag: Israel", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb2"), - "flag: Isle of Man", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb3"), - "flag: India", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb4"), - "flag: British Indian Ocean Territory", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb6"), - "flag: Iraq", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb7"), - "flag: Iran", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb8"), - "flag: Iceland", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xae\xf0\x9f\x87\xb9"), - "flag: Italy", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xaa"), - "flag: Jersey", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xb2"), - "flag: Jamaica", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xb4"), - "flag: Jordan", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xaf\xf0\x9f\x87\xb5"), - "flag: Japan", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xaa"), - "flag: Kenya", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xac"), - "flag: Kyrgyzstan", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xad"), - "flag: Cambodia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xae"), - "flag: Kiribati", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb2"), - "flag: Comoros", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb3"), - "flag: St. Kitts & Nevis", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb5"), - "flag: North Korea", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xb7"), - "flag: South Korea", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xbc"), - "flag: Kuwait", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xbe"), - "flag: Cayman Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb0\xf0\x9f\x87\xbf"), - "flag: Kazakhstan", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xa6"), - "flag: Laos", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xa7"), - "flag: Lebanon", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xa8"), - "flag: St. Lucia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xae"), - "flag: Liechtenstein", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb0"), - "flag: Sri Lanka", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb7"), - "flag: Liberia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb8"), - "flag: Lesotho", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xb9"), - "flag: Lithuania", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xba"), - "flag: Luxembourg", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xbb"), - "flag: Latvia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb1\xf0\x9f\x87\xbe"), - "flag: Libya", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xa6"), - "flag: Morocco", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xa8"), - "flag: Monaco", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xa9"), - "flag: Moldova", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xaa"), - "flag: Montenegro", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xab"), - "flag: St. Martin", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xac"), - "flag: Madagascar", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xad"), - "flag: Marshall Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb0"), - "flag: North Macedonia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb1"), - "flag: Mali", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb2"), - "flag: Myanmar (Burma)", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb3"), - "flag: Mongolia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb4"), - "flag: Macao SAR China", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb5"), - "flag: Northern Mariana Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb6"), - "flag: Martinique", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb7"), - "flag: Mauritania", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb8"), - "flag: Montserrat", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xb9"), - "flag: Malta", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xba"), - "flag: Mauritius", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbb"), - "flag: Maldives", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbc"), - "flag: Malawi", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbd"), - "flag: Mexico", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbe"), - "flag: Malaysia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb2\xf0\x9f\x87\xbf"), - "flag: Mozambique", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xa6"), - "flag: Namibia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xa8"), - "flag: New Caledonia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xaa"), - "flag: Niger", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xab"), - "flag: Norfolk Island", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xac"), - "flag: Nigeria", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xae"), - "flag: Nicaragua", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb1"), - "flag: Netherlands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb4"), - "flag: Norway", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb5"), - "flag: Nepal", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xb7"), - "flag: Nauru", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xba"), - "flag: Niue", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb3\xf0\x9f\x87\xbf"), - "flag: New Zealand", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb4\xf0\x9f\x87\xb2"), - "flag: Oman", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xa6"), - "flag: Panama", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xaa"), - "flag: Peru", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xab"), - "flag: French Polynesia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xac"), - "flag: Papua New Guinea", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xad"), - "flag: Philippines", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb0"), - "flag: Pakistan", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb1"), - "flag: Poland", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb2"), - "flag: St. Pierre & Miquelon", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb3"), - "flag: Pitcairn Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb7"), - "flag: Puerto Rico", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb8"), - "flag: Palestinian Territories", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xb9"), - "flag: Portugal", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xbc"), - "flag: Palau", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb5\xf0\x9f\x87\xbe"), - "flag: Paraguay", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb6\xf0\x9f\x87\xa6"), - "flag: Qatar", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xaa"), - "flag: Réunion", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xb4"), - "flag: Romania", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xb8"), - "flag: Serbia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xba"), - "flag: Russia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb7\xf0\x9f\x87\xbc"), - "flag: Rwanda", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa6"), - "flag: Saudi Arabia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa7"), - "flag: Solomon Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa8"), - "flag: Seychelles", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xa9"), - "flag: Sudan", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xaa"), - "flag: Sweden", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xac"), - "flag: Singapore", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xad"), - "flag: St. Helena", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xae"), - "flag: Slovenia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xaf"), - "flag: Svalbard & Jan Mayen", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb0"), - "flag: Slovakia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb1"), - "flag: Sierra Leone", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb2"), - "flag: San Marino", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb3"), - "flag: Senegal", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb4"), - "flag: Somalia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb7"), - "flag: Suriname", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb8"), - "flag: South Sudan", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xb9"), - "flag: São Tomé & Príncipe", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbb"), - "flag: El Salvador", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbd"), - "flag: Sint Maarten", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbe"), - "flag: Syria", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb8\xf0\x9f\x87\xbf"), - "flag: Eswatini", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xa6"), - "flag: Tristan da Cunha", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xa8"), - "flag: Turks & Caicos Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xa9"), - "flag: Chad", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xab"), - "flag: French Southern Territories", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xac"), - "flag: Togo", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xad"), - "flag: Thailand", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xaf"), - "flag: Tajikistan", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb0"), - "flag: Tokelau", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb1"), - "flag: Timor-Leste", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb2"), - "flag: Turkmenistan", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb3"), - "flag: Tunisia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb4"), - "flag: Tonga", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb7"), - "flag: Turkey", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xb9"), - "flag: Trinidad & Tobago", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xbb"), - "flag: Tuvalu", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xbc"), - "flag: Taiwan", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xb9\xf0\x9f\x87\xbf"), - "flag: Tanzania", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xa6"), - "flag: Ukraine", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xac"), - "flag: Uganda", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xb2"), - "flag: U.S. Outlying Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xb3"), - "flag: United Nations", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xb8"), - "flag: United States", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xbe"), - "flag: Uruguay", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xba\xf0\x9f\x87\xbf"), - "flag: Uzbekistan", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xa6"), - "flag: Vatican City", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xa8"), - "flag: St. Vincent & Grenadines", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xaa"), - "flag: Venezuela", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xac"), - "flag: British Virgin Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xae"), - "flag: U.S. Virgin Islands", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xb3"), - "flag: Vietnam", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xbb\xf0\x9f\x87\xba"), - "flag: Vanuatu", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xbc\xf0\x9f\x87\xab"), - "flag: Wallis & Futuna", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xbc\xf0\x9f\x87\xb8"), - "flag: Samoa", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xbd\xf0\x9f\x87\xb0"), - "flag: Kosovo", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xbe\xf0\x9f\x87\xaa"), - "flag: Yemen", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xbe\xf0\x9f\x87\xb9"), - "flag: Mayotte", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xbf\xf0\x9f\x87\xa6"), - "flag: South Africa", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xbf\xf0\x9f\x87\xb2"), - "flag: Zambia", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x87\xbf\xf0\x9f\x87\xbc"), - "flag: Zimbabwe", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb4\xf3\xa0\x81\xa7\xf3\xa0\x81\xa2\xf3\xa0\x81\xa5\xf3\xa0" - "\x81\xae\xf3\xa0\x81\xa7\xf3\xa0\x81\xbf"), - "flag: England", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb4\xf3\xa0\x81\xa7\xf3\xa0\x81\xa2\xf3\xa0\x81\xb3\xf3\xa0" - "\x81\xa3\xf3\xa0\x81\xb4\xf3\xa0\x81\xbf"), - "flag: Scotland", - emoji::EmojiCategory::Flags}, - Emoji{QString::fromUtf8("\xf0\x9f\x8f\xb4\xf3\xa0\x81\xa7\xf3\xa0\x81\xa2\xf3\xa0\x81\xb7\xf3\xa0" - "\x81\xac\xf3\xa0\x81\xb3\xf3\xa0\x81\xbf"), - "flag: Wales", - emoji::EmojiCategory::Flags}, -}; diff --git a/src/emoji/Provider.h b/src/emoji/Provider.h index ed77b5ac..ad03eb26 100644 --- a/src/emoji/Provider.h +++ b/src/emoji/Provider.h @@ -59,14 +59,6 @@ class Provider public: // all emoji for QML purposes static const QVector emoji; - static const std::vector people; - static const std::vector nature; - static const std::vector food; - static const std::vector activity; - static const std::vector travel; - static const std::vector objects; - static const std::vector symbols; - static const std::vector flags; }; } // namespace emoji diff --git a/src/popups/SuggestionsPopup.cpp b/src/popups/SuggestionsPopup.cpp index e84435b7..2650b5e6 100644 --- a/src/popups/SuggestionsPopup.cpp +++ b/src/popups/SuggestionsPopup.cpp @@ -6,6 +6,8 @@ #include "../Utils.h" #include "../ui/Avatar.h" #include "../ui/DropShadow.h" +#include "ChatPage.h" +#include "PopupItem.h" #include "SuggestionsPopup.h" SuggestionsPopup::SuggestionsPopup(QWidget *parent) @@ -65,44 +67,6 @@ SuggestionsPopup::addRooms(const std::vector &rooms) selectNextSuggestion(); } -void -SuggestionsPopup::addUsers(const std::vector &users) -{ - if (users.empty()) { - hide(); - return; - } - - const size_t layoutCount = layout_->count(); - const size_t userCount = users.size(); - - // Remove the extra widgets from the layout. - if (userCount < layoutCount) - removeLayoutItemsAfter(userCount - 1); - - for (size_t i = 0; i < userCount; ++i) { - auto item = layout_->itemAt(i); - - // Create a new widget if there isn't already one in that - // layout position. - if (!item) { - auto user = new UserItem(this, users.at(i).user_id); - connect(user, &UserItem::clicked, this, &SuggestionsPopup::itemSelected); - layout_->addWidget(user); - } else { - // Update the current widget with the new data. - auto userWidget = qobject_cast(item->widget()); - if (userWidget) - userWidget->updateItem(users.at(i).user_id); - } - } - - resetSelection(); - adjustSize(); - - selectNextSuggestion(); -} - void SuggestionsPopup::hoverSelection() { @@ -111,6 +75,19 @@ SuggestionsPopup::hoverSelection() update(); } +void +SuggestionsPopup::selectHoveredSuggestion() +{ + const auto item = layout_->itemAt(selectedItem_); + if (!item) + return; + + const auto &widget = qobject_cast(item->widget()); + emit itemSelected(displayName(ChatPage::instance()->currentRoom(), widget->selectedText())); + + resetSelection(); +} + void SuggestionsPopup::selectNextSuggestion() { @@ -160,3 +137,23 @@ SuggestionsPopup::paintEvent(QPaintEvent *) QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } + +void +SuggestionsPopup::selectLastItem() +{ + selectedItem_ = layout_->count() - 1; +} + +void +SuggestionsPopup::removeLayoutItemsAfter(size_t startingPos) +{ + size_t posToRemove = layout_->count() - 1; + + QLayoutItem *item; + while (startingPos <= posToRemove && (item = layout_->takeAt(posToRemove)) != nullptr) { + delete item->widget(); + delete item; + + posToRemove = layout_->count() - 1; + } +} diff --git a/src/popups/SuggestionsPopup.h b/src/popups/SuggestionsPopup.h index c66f2903..6a0157a1 100644 --- a/src/popups/SuggestionsPopup.h +++ b/src/popups/SuggestionsPopup.h @@ -3,8 +3,9 @@ #include #include "CacheStructs.h" -#include "ChatPage.h" -#include "PopupItem.h" + +class QVBoxLayout; +class QLayoutItem; class SuggestionsPopup : public QWidget { @@ -13,22 +14,9 @@ class SuggestionsPopup : public QWidget public: explicit SuggestionsPopup(QWidget *parent = nullptr); - template - void selectHoveredSuggestion() - { - const auto item = layout_->itemAt(selectedItem_); - if (!item) - return; - - const auto &widget = qobject_cast(item->widget()); - emit itemSelected( - displayName(ChatPage::instance()->currentRoom(), widget->selectedText())); - - resetSelection(); - } + void selectHoveredSuggestion(); public slots: - void addUsers(const std::vector &users); void addRooms(const std::vector &rooms); //! Move to the next available suggestion item. @@ -51,20 +39,8 @@ private: void hoverSelection(); void resetSelection() { selectedItem_ = -1; } void selectFirstItem() { selectedItem_ = 0; } - void selectLastItem() { selectedItem_ = layout_->count() - 1; } - void removeLayoutItemsAfter(size_t startingPos) - { - size_t posToRemove = layout_->count() - 1; - - QLayoutItem *item; - while (startingPos <= posToRemove && - (item = layout_->takeAt(posToRemove)) != nullptr) { - delete item->widget(); - delete item; - - posToRemove = layout_->count() - 1; - } - } + void selectLastItem(); + void removeLayoutItemsAfter(size_t startingPos); QVBoxLayout *layout_; diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp new file mode 100644 index 00000000..46bbd9a2 --- /dev/null +++ b/src/timeline/InputBar.cpp @@ -0,0 +1,666 @@ +#include "InputBar.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "Cache.h" +#include "CallManager.h" +#include "ChatPage.h" +#include "CompletionProxyModel.h" +#include "Logging.h" +#include "MainWindow.h" +#include "MatrixClient.h" +#include "Olm.h" +#include "TimelineModel.h" +#include "UserSettingsPage.h" +#include "UsersModel.h" +#include "Utils.h" +#include "dialogs/PlaceCall.h" +#include "dialogs/PreviewUploadOverlay.h" +#include "emoji/EmojiModel.h" + +#include "blurhash.hpp" + +static constexpr size_t INPUT_HISTORY_SIZE = 10; + +void +InputBar::paste(bool fromMouse) +{ + const QMimeData *md = nullptr; + + if (fromMouse) { + if (QGuiApplication::clipboard()->supportsSelection()) { + md = QGuiApplication::clipboard()->mimeData(QClipboard::Selection); + } + } else { + md = QGuiApplication::clipboard()->mimeData(QClipboard::Clipboard); + } + + if (md) + insertMimeData(md); +} + +void +InputBar::insertMimeData(const QMimeData *md) +{ + if (!md) + return; + + nhlog::ui()->debug("Got mime formats: {}", md->formats().join(", ").toStdString()); + const auto formats = md->formats().filter("/"); + const auto image = formats.filter("image/", Qt::CaseInsensitive); + const auto audio = formats.filter("audio/", Qt::CaseInsensitive); + const auto video = formats.filter("video/", Qt::CaseInsensitive); + + if (!image.empty() && md->hasImage()) { + showPreview(*md, "", image); + } else if (!audio.empty()) { + showPreview(*md, "", audio); + } else if (!video.empty()) { + showPreview(*md, "", video); + } else if (md->hasUrls()) { + // Generic file path for any platform. + QString path; + for (auto &&u : md->urls()) { + if (u.isLocalFile()) { + path = u.toLocalFile(); + break; + } + } + + if (!path.isEmpty() && QFileInfo{path}.exists()) { + showPreview(*md, path, formats); + } else { + nhlog::ui()->warn("Clipboard does not contain any valid file paths."); + } + } else if (md->hasFormat("x-special/gnome-copied-files")) { + // Special case for X11 users. See "Notes for X11 Users" in md. + // Source: http://doc.qt.io/qt-5/qclipboard.html + + // This MIME type returns a string with multiple lines separated by '\n'. The first + // line is the command to perform with the clipboard (not useful to us). The + // following lines are the file URIs. + // + // Source: the nautilus source code in file 'src/nautilus-clipboard.c' in function + // nautilus_clipboard_get_uri_list_from_selection_data() + // https://github.com/GNOME/nautilus/blob/master/src/nautilus-clipboard.c + + auto data = md->data("x-special/gnome-copied-files").split('\n'); + if (data.size() < 2) { + nhlog::ui()->warn("MIME format is malformed, cannot perform paste."); + return; + } + + QString path; + for (int i = 1; i < data.size(); ++i) { + QUrl url{data[i]}; + if (url.isLocalFile()) { + path = url.toLocalFile(); + break; + } + } + + if (!path.isEmpty()) { + showPreview(*md, path, formats); + } else { + nhlog::ui()->warn("Clipboard does not contain any valid file paths: {}", + data.join(", ").toStdString()); + } + } else if (md->hasText()) { + emit insertText(md->text()); + } else { + nhlog::ui()->debug("formats: {}", md->formats().join(", ").toStdString()); + } +} + +void +InputBar::updateState(int selectionStart_, int selectionEnd_, int cursorPosition_, QString text_) +{ + if (text_.isEmpty()) + stopTyping(); + else + startTyping(); + + if (text_ != text()) { + if (history_.empty()) + history_.push_front(text_); + else + history_.front() = text_; + history_index_ = 0; + } + + selectionStart = selectionStart_; + selectionEnd = selectionEnd_; + cursorPosition = cursorPosition_; +} + +QString +InputBar::text() const +{ + if (history_index_ < history_.size()) + return history_.at(history_index_); + + return ""; +} + +QString +InputBar::previousText() +{ + history_index_++; + if (history_index_ >= INPUT_HISTORY_SIZE) + history_index_ = INPUT_HISTORY_SIZE; + else if (text().isEmpty()) + history_index_--; + + return text(); +} + +QString +InputBar::nextText() +{ + history_index_--; + if (history_index_ >= INPUT_HISTORY_SIZE) + history_index_ = 0; + + return text(); +} + +QObject * +InputBar::completerFor(QString completerName) +{ + if (completerName == "user") { + auto userModel = new UsersModel(room->roomId().toStdString()); + auto proxy = new CompletionProxyModel(userModel); + userModel->setParent(proxy); + return proxy; + } else if (completerName == "emoji") { + auto emojiModel = new emoji::EmojiModel(); + auto proxy = new CompletionProxyModel(emojiModel); + emojiModel->setParent(proxy); + return proxy; + } + return nullptr; +} + +void +InputBar::send() +{ + if (text().trimmed().isEmpty()) + return; + + if (text().startsWith('/')) { + int command_end = text().indexOf(' '); + if (command_end == -1) + command_end = text().size(); + auto name = text().mid(1, command_end - 1); + auto args = text().mid(command_end + 1); + if (name.isEmpty() || name == "/") { + message(args); + } else { + command(name, args); + } + } else { + message(text()); + } + + nhlog::ui()->debug("Send: {}", text().toStdString()); + + if (history_.size() == INPUT_HISTORY_SIZE) + history_.pop_back(); + history_.push_front(""); + history_index_ = 0; +} + +void +InputBar::openFileSelection() +{ + const QString homeFolder = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); + const auto fileName = QFileDialog::getOpenFileName( + ChatPage::instance(), tr("Select a file"), homeFolder, tr("All Files (*)")); + + if (fileName.isEmpty()) + return; + + QMimeDatabase db; + QMimeType mime = db.mimeTypeForFile(fileName, QMimeDatabase::MatchContent); + + QFile file{fileName}; + + if (!file.open(QIODevice::ReadOnly)) { + emit ChatPage::instance()->showNotification( + QString("Error while reading media: %1").arg(file.errorString())); + return; + } + + setUploading(true); + + auto bin = file.readAll(); + + QMimeData data; + data.setData(mime.name(), bin); + + showPreview(data, fileName, QStringList{mime.name()}); +} + +void +InputBar::message(QString msg) +{ + mtx::events::msg::Text text = {}; + text.body = msg.trimmed().toStdString(); + + if (ChatPage::instance()->userSettings()->markdown()) { + text.formatted_body = utils::markdownToHtml(msg).toStdString(); + + // Don't send formatted_body, when we don't need to + if (text.formatted_body.find("<") == std::string::npos) + text.formatted_body = ""; + else + text.format = "org.matrix.custom.html"; + } + + if (!room->reply().isEmpty()) { + auto related = room->relatedInfo(room->reply()); + + QString body; + bool firstLine = true; + for (const auto &line : related.quoted_body.split("\n")) { + if (firstLine) { + firstLine = false; + body = QString("> <%1> %2\n").arg(related.quoted_user).arg(line); + } else { + body = QString("%1\n> %2\n").arg(body).arg(line); + } + } + + text.body = QString("%1\n%2").arg(body).arg(msg).toStdString(); + + // NOTE(Nico): rich replies always need a formatted_body! + text.format = "org.matrix.custom.html"; + if (ChatPage::instance()->userSettings()->markdown()) + text.formatted_body = + utils::getFormattedQuoteBody(related, utils::markdownToHtml(msg)) + .toStdString(); + else + text.formatted_body = + utils::getFormattedQuoteBody(related, msg.toHtmlEscaped()).toStdString(); + + text.relates_to.in_reply_to.event_id = related.related_event; + room->resetReply(); + } + + room->sendMessageEvent(text, mtx::events::EventType::RoomMessage); +} + +void +InputBar::emote(QString msg) +{ + auto html = utils::markdownToHtml(msg); + + mtx::events::msg::Emote emote; + emote.body = msg.trimmed().toStdString(); + + if (html != msg.trimmed().toHtmlEscaped() && + ChatPage::instance()->userSettings()->markdown()) { + emote.formatted_body = html.toStdString(); + emote.format = "org.matrix.custom.html"; + } + + if (!room->reply().isEmpty()) { + emote.relates_to.in_reply_to.event_id = room->reply().toStdString(); + room->resetReply(); + } + + room->sendMessageEvent(emote, mtx::events::EventType::RoomMessage); +} + +void +InputBar::image(const QString &filename, + const std::optional &file, + const QString &url, + const QString &mime, + uint64_t dsize, + const QSize &dimensions, + const QString &blurhash) +{ + mtx::events::msg::Image image; + image.info.mimetype = mime.toStdString(); + image.info.size = dsize; + image.info.blurhash = blurhash.toStdString(); + image.body = filename.toStdString(); + image.info.h = dimensions.height(); + image.info.w = dimensions.width(); + + if (file) + image.file = file; + else + image.url = url.toStdString(); + + if (!room->reply().isEmpty()) { + image.relates_to.in_reply_to.event_id = room->reply().toStdString(); + room->resetReply(); + } + + room->sendMessageEvent(image, mtx::events::EventType::RoomMessage); +} + +void +InputBar::file(const QString &filename, + const std::optional &encryptedFile, + const QString &url, + const QString &mime, + uint64_t dsize) +{ + mtx::events::msg::File file; + file.info.mimetype = mime.toStdString(); + file.info.size = dsize; + file.body = filename.toStdString(); + + if (encryptedFile) + file.file = encryptedFile; + else + file.url = url.toStdString(); + + if (!room->reply().isEmpty()) { + file.relates_to.in_reply_to.event_id = room->reply().toStdString(); + room->resetReply(); + } + + room->sendMessageEvent(file, mtx::events::EventType::RoomMessage); +} + +void +InputBar::audio(const QString &filename, + const std::optional &file, + const QString &url, + const QString &mime, + uint64_t dsize) +{ + mtx::events::msg::Audio audio; + audio.info.mimetype = mime.toStdString(); + audio.info.size = dsize; + audio.body = filename.toStdString(); + audio.url = url.toStdString(); + + if (file) + audio.file = file; + else + audio.url = url.toStdString(); + + if (!room->reply().isEmpty()) { + audio.relates_to.in_reply_to.event_id = room->reply().toStdString(); + room->resetReply(); + } + + room->sendMessageEvent(audio, mtx::events::EventType::RoomMessage); +} + +void +InputBar::video(const QString &filename, + const std::optional &file, + const QString &url, + const QString &mime, + uint64_t dsize) +{ + mtx::events::msg::Video video; + video.info.mimetype = mime.toStdString(); + video.info.size = dsize; + video.body = filename.toStdString(); + + if (file) + video.file = file; + else + video.url = url.toStdString(); + + if (!room->reply().isEmpty()) { + video.relates_to.in_reply_to.event_id = room->reply().toStdString(); + room->resetReply(); + } + + room->sendMessageEvent(video, mtx::events::EventType::RoomMessage); +} + +void +InputBar::command(QString command, QString args) +{ + if (command == "me") { + emote(args); + } else if (command == "join") { + ChatPage::instance()->joinRoom(args); + } else if (command == "invite") { + ChatPage::instance()->inviteUser(args.section(' ', 0, 0), args.section(' ', 1, -1)); + } else if (command == "kick") { + ChatPage::instance()->kickUser(args.section(' ', 0, 0), args.section(' ', 1, -1)); + } else if (command == "ban") { + ChatPage::instance()->banUser(args.section(' ', 0, 0), args.section(' ', 1, -1)); + } else if (command == "unban") { + ChatPage::instance()->unbanUser(args.section(' ', 0, 0), args.section(' ', 1, -1)); + } else if (command == "roomnick") { + mtx::events::state::Member member; + member.display_name = args.toStdString(); + member.avatar_url = + cache::avatarUrl(room->roomId(), + QString::fromStdString(http::client()->user_id().to_string())) + .toStdString(); + member.membership = mtx::events::state::Membership::Join; + + http::client()->send_state_event( + room->roomId().toStdString(), + http::client()->user_id().to_string(), + member, + [](mtx::responses::EventId, mtx::http::RequestErr err) { + if (err) + nhlog::net()->error("Failed to set room displayname: {}", + err->matrix_error.error); + }); + } else if (command == "shrug") { + message("¯\\_(ツ)_/¯" + (args.isEmpty() ? "" : " " + args)); + } else if (command == "fliptable") { + message("(╯°□°)╯︵ ┻━┻"); + } else if (command == "unfliptable") { + message(" ┯━┯╭( º _ º╭)"); + } else if (command == "sovietflip") { + message("ノ┬─┬ノ ︵ ( \\o°o)\\"); + } else if (command == "clear-timeline") { + room->clearTimeline(); + } else if (command == "rotate-megolm-session") { + cache::dropOutboundMegolmSession(room->roomId().toStdString()); + } +} + +void +InputBar::showPreview(const QMimeData &source, QString path, const QStringList &formats) +{ + dialogs::PreviewUploadOverlay *previewDialog_ = + new dialogs::PreviewUploadOverlay(ChatPage::instance()); + previewDialog_->setAttribute(Qt::WA_DeleteOnClose); + + if (source.hasImage()) + previewDialog_->setPreview(qvariant_cast(source.imageData()), + formats.front()); + else if (!path.isEmpty()) + previewDialog_->setPreview(path); + else if (!formats.isEmpty()) { + auto mime = formats.first(); + previewDialog_->setPreview(source.data(mime), mime); + } else { + setUploading(false); + previewDialog_->deleteLater(); + return; + } + + connect(previewDialog_, &dialogs::PreviewUploadOverlay::aborted, this, [this]() { + setUploading(false); + }); + + connect( + previewDialog_, + &dialogs::PreviewUploadOverlay::confirmUpload, + this, + [this](const QByteArray data, const QString &mime, const QString &fn) { + setUploading(true); + + auto payload = std::string(data.data(), data.size()); + std::optional encryptedFile; + if (cache::isRoomEncrypted(room->roomId().toStdString())) { + mtx::crypto::BinaryBuf buf; + std::tie(buf, encryptedFile) = mtx::crypto::encrypt_file(payload); + payload = mtx::crypto::to_string(buf); + } + + QSize dimensions; + QString blurhash; + auto mimeClass = mime.split("/")[0]; + nhlog::ui()->debug("Mime: {}", mime.toStdString()); + if (mimeClass == "image") { + QImage img = utils::readImage(&data); + + dimensions = img.size(); + if (img.height() > 200 && img.width() > 360) + img = img.scaled(360, 200, Qt::KeepAspectRatioByExpanding); + std::vector data; + for (int y = 0; y < img.height(); y++) { + for (int x = 0; x < img.width(); x++) { + auto p = img.pixel(x, y); + data.push_back(static_cast(qRed(p))); + data.push_back(static_cast(qGreen(p))); + data.push_back(static_cast(qBlue(p))); + } + } + blurhash = QString::fromStdString( + blurhash::encode(data.data(), img.width(), img.height(), 4, 3)); + } + + http::client()->upload( + payload, + encryptedFile ? "application/octet-stream" : mime.toStdString(), + QFileInfo(fn).fileName().toStdString(), + [this, + filename = fn, + encryptedFile = std::move(encryptedFile), + mimeClass, + mime, + size = payload.size(), + dimensions, + blurhash](const mtx::responses::ContentURI &res, + mtx::http::RequestErr err) mutable { + if (err) { + emit ChatPage::instance()->showNotification( + tr("Failed to upload media. Please try again.")); + nhlog::net()->warn("failed to upload media: {} {} ({})", + err->matrix_error.error, + to_string(err->matrix_error.errcode), + static_cast(err->status_code)); + setUploading(false); + return; + } + + auto url = QString::fromStdString(res.content_uri); + if (encryptedFile) + encryptedFile->url = res.content_uri; + + if (mimeClass == "image") + image(filename, + encryptedFile, + url, + mime, + size, + dimensions, + blurhash); + else if (mimeClass == "audio") + audio(filename, encryptedFile, url, mime, size); + else if (mimeClass == "video") + video(filename, encryptedFile, url, mime, size); + else + file(filename, encryptedFile, url, mime, size); + + setUploading(false); + }); + }); +} + +void +InputBar::callButton() +{ + auto callManager_ = ChatPage::instance()->callManager(); + if (callManager_->onActiveCall()) { + callManager_->hangUp(); + } else { + auto current_room_ = room->roomId(); + if (auto roomInfo = cache::singleRoomInfo(current_room_.toStdString()); + roomInfo.member_count != 2) { + ChatPage::instance()->showNotification("Calls are limited to 1:1 rooms."); + } else { + std::vector members( + cache::getMembers(current_room_.toStdString())); + const RoomMember &callee = members.front().user_id == utils::localUser() + ? members.back() + : members.front(); + auto dialog = + new dialogs::PlaceCall(callee.user_id, + callee.display_name, + QString::fromStdString(roomInfo.name), + QString::fromStdString(roomInfo.avatar_url), + ChatPage::instance()->userSettings(), + MainWindow::instance()); + connect(dialog, + &dialogs::PlaceCall::voice, + callManager_, + [callManager_, current_room_]() { + callManager_->sendInvite(current_room_, false); + }); + connect(dialog, + &dialogs::PlaceCall::video, + callManager_, + [callManager_, current_room_]() { + callManager_->sendInvite(current_room_, true); + }); + utils::centerWidget(dialog, MainWindow::instance()); + dialog->show(); + } + } +} + +void +InputBar::startTyping() +{ + if (!typingRefresh_.isActive()) { + typingRefresh_.start(); + + if (ChatPage::instance()->userSettings()->typingNotifications()) { + http::client()->start_typing( + room->roomId().toStdString(), 10'000, [](mtx::http::RequestErr err) { + if (err) { + nhlog::net()->warn( + "failed to send typing notification: {}", + err->matrix_error.error); + } + }); + } + } + typingTimeout_.start(); +} +void +InputBar::stopTyping() +{ + typingRefresh_.stop(); + typingTimeout_.stop(); + + if (!ChatPage::instance()->userSettings()->typingNotifications()) + return; + + http::client()->stop_typing(room->roomId().toStdString(), [](mtx::http::RequestErr err) { + if (err) { + nhlog::net()->warn("failed to stop typing notifications: {}", + err->matrix_error.error); + } + }); +} diff --git a/src/timeline/InputBar.h b/src/timeline/InputBar.h new file mode 100644 index 00000000..27aa4bc3 --- /dev/null +++ b/src/timeline/InputBar.h @@ -0,0 +1,99 @@ +#pragma once + +#include +#include +#include + +#include +#include + +class TimelineModel; +class QMimeData; +class QDropEvent; +class QStringList; + +class InputBar : public QObject +{ + Q_OBJECT + Q_PROPERTY(bool uploading READ uploading NOTIFY uploadingChanged) + +public: + InputBar(TimelineModel *parent) + : QObject() + , room(parent) + { + typingRefresh_.setInterval(10'000); + typingRefresh_.setSingleShot(true); + typingTimeout_.setInterval(5'000); + typingTimeout_.setSingleShot(true); + connect(&typingRefresh_, &QTimer::timeout, this, &InputBar::startTyping); + connect(&typingTimeout_, &QTimer::timeout, this, &InputBar::stopTyping); + } + +public slots: + QString text() const; + QString previousText(); + QString nextText(); + + void send(); + void paste(bool fromMouse); + void insertMimeData(const QMimeData *data); + void updateState(int selectionStart, int selectionEnd, int cursorPosition, QString text); + void openFileSelection(); + bool uploading() const { return uploading_; } + void callButton(); + + QObject *completerFor(QString completerName); + +private slots: + void startTyping(); + void stopTyping(); + +signals: + void insertText(QString text); + void uploadingChanged(bool value); + +private: + void message(QString body); + void emote(QString body); + void command(QString name, QString args); + void image(const QString &filename, + const std::optional &file, + const QString &url, + const QString &mime, + uint64_t dsize, + const QSize &dimensions, + const QString &blurhash); + void file(const QString &filename, + const std::optional &encryptedFile, + const QString &url, + const QString &mime, + uint64_t dsize); + void audio(const QString &filename, + const std::optional &file, + const QString &url, + const QString &mime, + uint64_t dsize); + void video(const QString &filename, + const std::optional &file, + const QString &url, + const QString &mime, + uint64_t dsize); + + void showPreview(const QMimeData &source, QString path, const QStringList &formats); + void setUploading(bool value) + { + if (value != uploading_) { + uploading_ = value; + emit uploadingChanged(value); + } + } + + QTimer typingRefresh_; + QTimer typingTimeout_; + TimelineModel *room; + std::deque history_; + std::size_t history_index_ = 0; + int selectionStart = 0, selectionEnd = 0, cursorPosition = 0; + bool uploading_ = false; +}; diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index 8b80ea51..4cbd5777 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -800,7 +800,6 @@ void TimelineModel::replyAction(QString id) { setReply(id); - ChatPage::instance()->focusMessageInput(); } RelatedInfo diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h index e1fb9196..16a2565e 100644 --- a/src/timeline/TimelineModel.h +++ b/src/timeline/TimelineModel.h @@ -10,6 +10,7 @@ #include "CacheCryptoStructs.h" #include "EventStore.h" +#include "InputBar.h" #include "ui/UserProfile.h" namespace mtx::http { @@ -149,6 +150,7 @@ class TimelineModel : public QAbstractListModel Q_PROPERTY(QString roomName READ roomName NOTIFY roomNameChanged) Q_PROPERTY(QString roomAvatarUrl READ roomAvatarUrl NOTIFY roomAvatarUrlChanged) Q_PROPERTY(QString roomTopic READ roomTopic NOTIFY roomTopicChanged) + Q_PROPERTY(InputBar *input READ input CONSTANT) public: explicit TimelineModel(TimelineViewManager *manager, @@ -271,6 +273,7 @@ public slots: QString roomName() const; QString roomTopic() const; + InputBar *input() { return &input_; } QString roomAvatarUrl() const; QString roomId() const { return room_id_; } @@ -320,6 +323,8 @@ private: TimelineViewManager *manager_; + InputBar input_{this}; + friend struct SendMessageVisitor; }; diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp index 3b80d020..d0356e15 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp @@ -1,6 +1,7 @@ #include "TimelineViewManager.h" #include +#include #include #include #include @@ -20,6 +21,7 @@ #include "dialogs/ImageOverlay.h" #include "emoji/EmojiModel.h" #include "emoji/Provider.h" +#include "ui/NhekoDropArea.h" #include //only for debugging @@ -115,6 +117,7 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par qmlRegisterType("im.nheko", 1, 0, "DelegateChoice"); qmlRegisterType("im.nheko", 1, 0, "DelegateChooser"); + qmlRegisterType("im.nheko", 1, 0, "NhekoDropArea"); qmlRegisterUncreatableType( "im.nheko", 1, 0, "DeviceVerificationFlow", "Can't create verification flow from QML!"); qmlRegisterUncreatableType( @@ -244,6 +247,26 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par &CallManager::newVideoCallState, this, &TimelineViewManager::videoCallChanged); + + connect(&WebRTCSession::instance(), + &WebRTCSession::stateChanged, + this, + &TimelineViewManager::onCallChanged); +} + +bool +TimelineViewManager::isOnCall() const +{ + return callManager_->onActiveCall(); +} +bool +TimelineViewManager::callsSupported() const +{ +#ifdef GSTREAMER_AVAILABLE + return true; +#else + return false; +#endif } void @@ -313,6 +336,7 @@ TimelineViewManager::setHistoryView(const QString &room_id) if (room != models.end()) { timeline_ = room.value().data(); emit activeTimelineChanged(timeline_); + container->setFocus(); nhlog::ui()->info("Activated room {}", room_id.toStdString()); } } @@ -474,81 +498,6 @@ TimelineViewManager::initWithMessages(const std::vector &roomIds) addRoom(roomId); } -void -TimelineViewManager::queueTextMessage(const QString &msg) -{ - if (!timeline_) - return; - - mtx::events::msg::Text text = {}; - text.body = msg.trimmed().toStdString(); - - if (ChatPage::instance()->userSettings()->markdown()) { - text.formatted_body = utils::markdownToHtml(msg).toStdString(); - - // Don't send formatted_body, when we don't need to - if (text.formatted_body.find("<") == std::string::npos) - text.formatted_body = ""; - else - text.format = "org.matrix.custom.html"; - } - - if (!timeline_->reply().isEmpty()) { - auto related = timeline_->relatedInfo(timeline_->reply()); - - QString body; - bool firstLine = true; - for (const auto &line : related.quoted_body.split("\n")) { - if (firstLine) { - firstLine = false; - body = QString("> <%1> %2\n").arg(related.quoted_user).arg(line); - } else { - body = QString("%1\n> %2\n").arg(body).arg(line); - } - } - - text.body = QString("%1\n%2").arg(body).arg(msg).toStdString(); - - // NOTE(Nico): rich replies always need a formatted_body! - text.format = "org.matrix.custom.html"; - if (ChatPage::instance()->userSettings()->markdown()) - text.formatted_body = - utils::getFormattedQuoteBody(related, utils::markdownToHtml(msg)) - .toStdString(); - else - text.formatted_body = - utils::getFormattedQuoteBody(related, msg.toHtmlEscaped()).toStdString(); - - text.relates_to.in_reply_to.event_id = related.related_event; - timeline_->resetReply(); - } - - timeline_->sendMessageEvent(text, mtx::events::EventType::RoomMessage); -} - -void -TimelineViewManager::queueEmoteMessage(const QString &msg) -{ - auto html = utils::markdownToHtml(msg); - - mtx::events::msg::Emote emote; - emote.body = msg.trimmed().toStdString(); - - if (html != msg.trimmed().toHtmlEscaped() && - ChatPage::instance()->userSettings()->markdown()) { - emote.formatted_body = html.toStdString(); - emote.format = "org.matrix.custom.html"; - } - - if (!timeline_->reply().isEmpty()) { - emote.relates_to.in_reply_to.event_id = timeline_->reply().toStdString(); - timeline_->resetReply(); - } - - if (timeline_) - timeline_->sendMessageEvent(emote, mtx::events::EventType::RoomMessage); -} - void TimelineViewManager::queueReactionMessage(const QString &reactedEvent, const QString &reactionKey) { @@ -581,122 +530,6 @@ TimelineViewManager::queueReactionMessage(const QString &reactedEvent, const QSt timeline_->redactEvent(selfReactedEvent); } } - -void -TimelineViewManager::queueImageMessage(const QString &roomid, - const QString &filename, - const std::optional &file, - const QString &url, - const QString &mime, - uint64_t dsize, - const QSize &dimensions, - const QString &blurhash) -{ - mtx::events::msg::Image image; - image.info.mimetype = mime.toStdString(); - image.info.size = dsize; - image.info.blurhash = blurhash.toStdString(); - image.body = filename.toStdString(); - image.info.h = dimensions.height(); - image.info.w = dimensions.width(); - - if (file) - image.file = file; - else - image.url = url.toStdString(); - - auto model = models.value(roomid); - if (!model->reply().isEmpty()) { - image.relates_to.in_reply_to.event_id = model->reply().toStdString(); - model->resetReply(); - } - - model->sendMessageEvent(image, mtx::events::EventType::RoomMessage); -} - -void -TimelineViewManager::queueFileMessage( - const QString &roomid, - const QString &filename, - const std::optional &encryptedFile, - const QString &url, - const QString &mime, - uint64_t dsize) -{ - mtx::events::msg::File file; - file.info.mimetype = mime.toStdString(); - file.info.size = dsize; - file.body = filename.toStdString(); - - if (encryptedFile) - file.file = encryptedFile; - else - file.url = url.toStdString(); - - auto model = models.value(roomid); - if (!model->reply().isEmpty()) { - file.relates_to.in_reply_to.event_id = model->reply().toStdString(); - model->resetReply(); - } - - model->sendMessageEvent(file, mtx::events::EventType::RoomMessage); -} - -void -TimelineViewManager::queueAudioMessage(const QString &roomid, - const QString &filename, - const std::optional &file, - const QString &url, - const QString &mime, - uint64_t dsize) -{ - mtx::events::msg::Audio audio; - audio.info.mimetype = mime.toStdString(); - audio.info.size = dsize; - audio.body = filename.toStdString(); - audio.url = url.toStdString(); - - if (file) - audio.file = file; - else - audio.url = url.toStdString(); - - auto model = models.value(roomid); - if (!model->reply().isEmpty()) { - audio.relates_to.in_reply_to.event_id = model->reply().toStdString(); - model->resetReply(); - } - - model->sendMessageEvent(audio, mtx::events::EventType::RoomMessage); -} - -void -TimelineViewManager::queueVideoMessage(const QString &roomid, - const QString &filename, - const std::optional &file, - const QString &url, - const QString &mime, - uint64_t dsize) -{ - mtx::events::msg::Video video; - video.info.mimetype = mime.toStdString(); - video.info.size = dsize; - video.body = filename.toStdString(); - - if (file) - video.file = file; - else - video.url = url.toStdString(); - - auto model = models.value(roomid); - if (!model->reply().isEmpty()) { - video.relates_to.in_reply_to.event_id = model->reply().toStdString(); - model->resetReply(); - } - - model->sendMessageEvent(video, mtx::events::EventType::RoomMessage); -} - void TimelineViewManager::queueCallMessage(const QString &roomid, const mtx::events::msg::CallInvite &callInvite) diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h index f330d870..b9febf75 100644 --- a/src/timeline/TimelineViewManager.h +++ b/src/timeline/TimelineViewManager.h @@ -41,6 +41,8 @@ class TimelineViewManager : public QObject Q_PROPERTY(QString callPartyName READ callPartyName NOTIFY callPartyChanged) Q_PROPERTY(QString callPartyAvatarUrl READ callPartyAvatarUrl NOTIFY callPartyChanged) Q_PROPERTY(bool isMicMuted READ isMicMuted NOTIFY micMuteChanged) + Q_PROPERTY(bool isOnCall READ isOnCall NOTIFY onCallChanged) + Q_PROPERTY(bool callsSupported READ callsSupported CONSTANT) public: TimelineViewManager(CallManager *callManager, ChatPage *parent = nullptr); @@ -95,6 +97,7 @@ signals: void videoCallChanged(); void callPartyChanged(); void micMuteChanged(); + void onCallChanged(); public slots: void updateReadReceipts(const QString &room_id, const std::vector &event_ids); @@ -102,48 +105,25 @@ public slots: void initWithMessages(const std::vector &roomIds); void setHistoryView(const QString &room_id); + TimelineModel *getHistoryView(const QString &room_id) + { + auto room = models.find(room_id); + if (room != models.end()) + return room.value().data(); + else + return nullptr; + } + void updateColorPalette(); void queueReactionMessage(const QString &reactedEvent, const QString &reactionKey); - void queueTextMessage(const QString &msg); - void queueEmoteMessage(const QString &msg); - void queueImageMessage(const QString &roomid, - const QString &filename, - const std::optional &file, - const QString &url, - const QString &mime, - uint64_t dsize, - const QSize &dimensions, - const QString &blurhash); - void queueFileMessage(const QString &roomid, - const QString &filename, - const std::optional &file, - const QString &url, - const QString &mime, - uint64_t dsize); - void queueAudioMessage(const QString &roomid, - const QString &filename, - const std::optional &file, - const QString &url, - const QString &mime, - uint64_t dsize); - void queueVideoMessage(const QString &roomid, - const QString &filename, - const std::optional &file, - const QString &url, - const QString &mime, - uint64_t dsize); void queueCallMessage(const QString &roomid, const mtx::events::msg::CallInvite &); void queueCallMessage(const QString &roomid, const mtx::events::msg::CallCandidates &); void queueCallMessage(const QString &roomid, const mtx::events::msg::CallAnswer &); void queueCallMessage(const QString &roomid, const mtx::events::msg::CallHangUp &); void updateEncryptedDescriptions(); - - void clearCurrentRoomTimeline() - { - if (timeline_) - timeline_->clearTimeline(); - } + bool isOnCall() const; + bool callsSupported() const; void enableBackButton() { diff --git a/src/ui/NhekoDropArea.cpp b/src/ui/NhekoDropArea.cpp new file mode 100644 index 00000000..14b71524 --- /dev/null +++ b/src/ui/NhekoDropArea.cpp @@ -0,0 +1,39 @@ +#include "NhekoDropArea.h" + +#include + +#include "ChatPage.h" +#include "timeline/InputBar.h" +#include "timeline/TimelineModel.h" +#include "timeline/TimelineViewManager.h" + +#include "Logging.h" + +NhekoDropArea::NhekoDropArea(QQuickItem *parent) + : QQuickItem(parent) +{ + setFlags(ItemAcceptsDrops); +} + +void +NhekoDropArea::dragEnterEvent(QDragEnterEvent *event) +{ + event->acceptProposedAction(); +} + +void +NhekoDropArea::dragMoveEvent(QDragMoveEvent *event) +{ + event->acceptProposedAction(); +} + +void +NhekoDropArea::dropEvent(QDropEvent *event) +{ + if (event) { + auto model = ChatPage::instance()->timelineManager()->getHistoryView(roomid_); + if (model) { + model->input()->insertMimeData(event->mimeData()); + } + } +} diff --git a/src/ui/NhekoDropArea.h b/src/ui/NhekoDropArea.h new file mode 100644 index 00000000..b03620f2 --- /dev/null +++ b/src/ui/NhekoDropArea.h @@ -0,0 +1,30 @@ +#include + +class NhekoDropArea : public QQuickItem +{ + Q_OBJECT + Q_PROPERTY(QString roomid READ roomid WRITE setRoomid NOTIFY roomidChanged) +public: + NhekoDropArea(QQuickItem *parent = nullptr); + +signals: + void roomidChanged(QString roomid); + +public slots: + void setRoomid(QString roomid) + { + if (roomid_ != roomid) { + roomid_ = roomid; + emit roomidChanged(roomid); + } + } + QString roomid() const { return roomid_; } + +protected: + void dragEnterEvent(QDragEnterEvent *event) override; + void dragMoveEvent(QDragMoveEvent *event) override; + void dropEvent(QDropEvent *event) override; + +private: + QString roomid_; +}; diff --git a/src/ui/TextField.cpp b/src/ui/TextField.cpp index 27584693..f717bcba 100644 --- a/src/ui/TextField.cpp +++ b/src/ui/TextField.cpp @@ -69,6 +69,18 @@ TextField::hasLabel() const return show_label_; } +bool +TextField::isValid() const +{ + return is_valid_; +} + +void +TextField::setValid(bool valid) +{ + is_valid_ = valid; +} + void TextField::setLabelFontSize(qreal size) { @@ -147,7 +159,7 @@ QColor TextField::underlineColor() const { if (!underline_color_.isValid()) { - if (hasAcceptableInput() || !isModified()) + if ((hasAcceptableInput() && isValid()) || !isModified()) return QPalette().color(QPalette::Highlight); else return Qt::red; diff --git a/src/ui/TextField.h b/src/ui/TextField.h index 85d5036d..966155f4 100644 --- a/src/ui/TextField.h +++ b/src/ui/TextField.h @@ -30,6 +30,7 @@ public: void setLabelFontSize(qreal size); void setShowLabel(bool value); void setUnderlineColor(const QColor &color); + void setValid(bool valid); QColor inkColor() const; QColor labelColor() const; @@ -37,6 +38,7 @@ public: QColor backgroundColor() const; QString label() const; bool hasLabel() const; + bool isValid() const; qreal labelFontSize() const; protected: @@ -54,6 +56,7 @@ private: TextFieldLabel *label_; TextFieldStateMachine *state_machine_; bool show_label_; + bool is_valid_; qreal label_font_size_; };