summaryrefslogtreecommitdiffstats
path: root/webapp/utils
diff options
context:
space:
mode:
authorChristopher Speller <crspeller@gmail.com>2017-09-06 23:04:13 -0700
committerChristopher Speller <crspeller@gmail.com>2017-09-06 23:11:58 -0700
commitd8bd57901e33a7057e26e782e295099ffcc0da89 (patch)
treee12dfc8cad42b1576756d19d7fbfd82646a009bf /webapp/utils
parent7bc8e9a08dfde56387f946fdf5086252aa4d0491 (diff)
downloadchat-d8bd57901e33a7057e26e782e295099ffcc0da89.tar.gz
chat-d8bd57901e33a7057e26e782e295099ffcc0da89.tar.bz2
chat-d8bd57901e33a7057e26e782e295099ffcc0da89.zip
Removing webapp
Diffstat (limited to 'webapp/utils')
-rw-r--r--webapp/utils/channel_intro_messages.jsx389
-rw-r--r--webapp/utils/channel_utils.jsx325
-rw-r--r--webapp/utils/commons.jsx20
-rw-r--r--webapp/utils/constants.jsx1004
-rw-r--r--webapp/utils/delayed_action.jsx31
-rw-r--r--webapp/utils/emoji.jsx15
-rw-r--r--webapp/utils/emoticons.jsx66
-rw-r--r--webapp/utils/event_types.jsx8
-rw-r--r--webapp/utils/file_utils.jsx24
-rw-r--r--webapp/utils/global_event_emitter.jsx27
-rw-r--r--webapp/utils/latinise.jsx1003
-rw-r--r--webapp/utils/license_utils.jsx39
-rw-r--r--webapp/utils/markdown.jsx270
-rw-r--r--webapp/utils/post_utils.jsx127
-rw-r--r--webapp/utils/syntax_highlighting.jsx171
-rw-r--r--webapp/utils/team_utils.jsx27
-rw-r--r--webapp/utils/text_formatting.jsx504
-rw-r--r--webapp/utils/url.jsx29
-rw-r--r--webapp/utils/user_agent.jsx115
-rw-r--r--webapp/utils/utils.jsx1441
20 files changed, 0 insertions, 5635 deletions
diff --git a/webapp/utils/channel_intro_messages.jsx b/webapp/utils/channel_intro_messages.jsx
deleted file mode 100644
index f85b0cf87..000000000
--- a/webapp/utils/channel_intro_messages.jsx
+++ /dev/null
@@ -1,389 +0,0 @@
-// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-import * as Utils from './utils.jsx';
-import ChannelInviteModal from 'components/channel_invite_modal';
-import EditChannelHeaderModal from 'components/edit_channel_header_modal.jsx';
-import ToggleModalButton from 'components/toggle_modal_button.jsx';
-import UserProfile from 'components/user_profile.jsx';
-import ChannelStore from 'stores/channel_store.jsx';
-import UserStore from 'stores/user_store.jsx';
-import TeamStore from 'stores/team_store.jsx';
-import Constants from 'utils/constants.jsx';
-import * as GlobalActions from 'actions/global_actions.jsx';
-import ProfilePicture from 'components/profile_picture.jsx';
-
-import {showManagementOptions} from './channel_utils.jsx';
-
-import React from 'react';
-import {FormattedMessage, FormattedHTMLMessage, FormattedDate} from 'react-intl';
-
-export function createChannelIntroMessage(channel, fullWidthIntro) {
- let centeredIntro = '';
- if (!fullWidthIntro) {
- centeredIntro = 'channel-intro--centered';
- }
-
- if (channel.type === Constants.DM_CHANNEL) {
- return createDMIntroMessage(channel, centeredIntro);
- } else if (channel.type === Constants.GM_CHANNEL) {
- return createGMIntroMessage(channel, centeredIntro);
- } else if (ChannelStore.isDefault(channel)) {
- return createDefaultIntroMessage(channel, centeredIntro);
- } else if (channel.name === Constants.OFFTOPIC_CHANNEL) {
- return createOffTopicIntroMessage(channel, centeredIntro);
- } else if (channel.type === 'O' || channel.type === 'P') {
- return createStandardIntroMessage(channel, centeredIntro);
- }
- return null;
-}
-
-export function createGMIntroMessage(channel, centeredIntro) {
- const profiles = UserStore.getProfileListInChannel(channel.id, true);
-
- if (profiles.length > 0) {
- const pictures = [];
- let names = '';
- for (let i = 0; i < profiles.length; i++) {
- const profile = profiles[i];
-
- pictures.push(
- <ProfilePicture
- key={'introprofilepicture' + profile.id}
- src={Utils.imageURLForUser(profile)}
- width='50'
- height='50'
- user={profile}
- />
- );
-
- if (i === profiles.length - 1) {
- names += Utils.displayUsernameForUser(profile);
- } else if (i === profiles.length - 2) {
- names += Utils.displayUsernameForUser(profile) + ' and ';
- } else {
- names += Utils.displayUsernameForUser(profile) + ', ';
- }
- }
-
- return (
- <div className={'channel-intro ' + centeredIntro}>
- <div className='post-profile-img__container channel-intro-img'>
- {pictures}
- </div>
- <p className='channel-intro-text'>
- <FormattedHTMLMessage
- id='intro_messages.GM'
- defaultMessage='This is the start of your group message history with {names}.<br />Messages and files shared here are not shown to people outside this area.'
- values={{
- names
- }}
- />
- </p>
- {createSetHeaderButton(channel)}
- </div>
- );
- }
-
- return (
- <div className={'channel-intro ' + centeredIntro}>
- <p className='channel-intro-text'>
- <FormattedMessage
- id='intro_messages.group_message'
- defaultMessage='This is the start of your group message history with these teammates. Messages and files shared here are not shown to people outside this area.'
- />
- </p>
- </div>
- );
-}
-
-export function createDMIntroMessage(channel, centeredIntro) {
- var teammate = Utils.getDirectTeammate(channel.id);
-
- if (teammate) {
- var teammateName = teammate.username;
- if (teammate.nickname.length > 0) {
- teammateName = teammate.nickname;
- }
-
- return (
- <div className={'channel-intro ' + centeredIntro}>
- <div className='post-profile-img__container channel-intro-img'>
- <ProfilePicture
- src={Utils.imageURLForUser(teammate)}
- width='50'
- height='50'
- user={teammate}
- hasMention={true}
- />
- </div>
- <div className='channel-intro-profile'>
- <strong>
- <UserProfile
- user={teammate}
- disablePopover={false}
- hasMention={true}
- />
- </strong>
- </div>
- <p className='channel-intro-text'>
- <FormattedHTMLMessage
- id='intro_messages.DM'
- defaultMessage='This is the start of your direct message history with {teammate}.<br />Direct messages and files shared here are not shown to people outside this area.'
- values={{
- teammate: teammateName
- }}
- />
- </p>
- {createSetHeaderButton(channel)}
- </div>
- );
- }
-
- return (
- <div className={'channel-intro ' + centeredIntro}>
- <p className='channel-intro-text'>
- <FormattedMessage
- id='intro_messages.teammate'
- defaultMessage='This is the start of your direct message history with this teammate. Direct messages and files shared here are not shown to people outside this area.'
- />
- </p>
- </div>
- );
-}
-
-export function createOffTopicIntroMessage(channel, centeredIntro) {
- var uiType = (
- <FormattedMessage
- id='intro_messages.channel'
- defaultMessage='channel'
- />
- );
-
- const isChannelAdmin = ChannelStore.isChannelAdminForCurrentChannel();
- const isTeamAdmin = TeamStore.isTeamAdminForCurrentTeam();
- const isSystemAdmin = UserStore.isSystemAdminForCurrentUser();
-
- let setHeaderButton = createSetHeaderButton(channel);
- if (!showManagementOptions(channel, isChannelAdmin, isTeamAdmin, isSystemAdmin)) {
- setHeaderButton = null;
- }
-
- return (
- <div className={'channel-intro ' + centeredIntro}>
- <FormattedHTMLMessage
- id='intro_messages.offTopic'
- defaultMessage='<h4 class="channel-intro__title">Beginning of {display_name}</h4><p class="channel-intro__content">This is the start of {display_name}, a channel for non-work-related conversations.<br/></p>'
- values={{
- display_name: channel.display_name
- }}
- />
- {createInviteChannelMemberButton(channel, uiType)}
- {setHeaderButton}
- </div>
- );
-}
-
-export function createDefaultIntroMessage(channel, centeredIntro) {
- let inviteModalLink = (
- <a
- className='intro-links'
- href='#'
- onClick={GlobalActions.showGetTeamInviteLinkModal}
- >
- <i className='fa fa-user-plus'/>
- <FormattedMessage
- id='intro_messages.inviteOthers'
- defaultMessage='Invite others to this team'
- />
- </a>
- );
-
- const isChannelAdmin = ChannelStore.isChannelAdminForCurrentChannel();
- const isTeamAdmin = TeamStore.isTeamAdminForCurrentTeam();
- const isSystemAdmin = UserStore.isSystemAdminForCurrentUser();
-
- if (global.window.mm_license.IsLicensed === 'true') {
- if (global.window.mm_config.RestrictTeamInvite === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
- inviteModalLink = null;
- } else if (global.window.mm_config.RestrictTeamInvite === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) {
- inviteModalLink = null;
- }
- }
-
- let setHeaderButton = createSetHeaderButton(channel);
- if (!showManagementOptions(channel, isChannelAdmin, isTeamAdmin, isSystemAdmin)) {
- setHeaderButton = null;
- }
-
- return (
- <div className={'channel-intro ' + centeredIntro}>
- <FormattedHTMLMessage
- id='intro_messages.default'
- defaultMessage="<h4 class='channel-intro__title'>Beginning of {display_name}</h4><p class='channel-intro__content'><strong>Welcome to {display_name}!</strong><br/><br/>This is the first channel teammates see when they sign up - use it for posting updates everyone needs to know.</p>"
- values={{
- display_name: channel.display_name
- }}
- />
- {inviteModalLink}
- {setHeaderButton}
- <br/>
- </div>
- );
-}
-
-export function createStandardIntroMessage(channel, centeredIntro) {
- var uiName = channel.display_name;
- var creatorName = Utils.displayUsername(channel.creator_id);
- var uiType;
- var memberMessage;
-
- if (channel.type === 'P') {
- uiType = (
- <FormattedMessage
- id='intro_messages.group'
- defaultMessage='private channel'
- />
- );
- memberMessage = (
- <FormattedMessage
- id='intro_messages.onlyInvited'
- defaultMessage=' Only invited members can see this private channel.'
- />
- );
- } else {
- uiType = (
- <FormattedMessage
- id='intro_messages.channel'
- defaultMessage='channel'
- />
- );
- memberMessage = (
- <FormattedMessage
- id='intro_messages.anyMember'
- defaultMessage=' Any member can join and read this channel.'
- />
- );
- }
-
- const date = (
- <FormattedDate
- value={channel.create_at}
- month='long'
- day='2-digit'
- year='numeric'
- />
- );
-
- var createMessage;
- if (creatorName === '') {
- createMessage = (
- <FormattedMessage
- id='intro_messages.noCreator'
- defaultMessage='This is the start of the {name} {type}, created on {date}.'
- values={{
- name: (uiName),
- type: (uiType),
- date
- }}
- />
- );
- } else {
- createMessage = (
- <span>
- <FormattedMessage
- id='intro_messages.creator'
- defaultMessage='This is the start of the {name} {type}, created by {creator} on {date}.'
- values={{
- name: (uiName),
- type: (uiType),
- creator: (creatorName),
- date
- }}
- />
- </span>
- );
- }
-
- var purposeMessage = '';
- if (channel.purpose && channel.purpose !== '') {
- purposeMessage = (
- <span>
- <FormattedMessage
- id='intro_messages.purpose'
- defaultMessage=" This {type}'s purpose is: {purpose}"
- values={{
- purpose: channel.purpose,
- type: (uiType)
- }}
- />
- </span>
- );
- }
-
- const isChannelAdmin = ChannelStore.isChannelAdminForCurrentChannel();
- const isTeamAdmin = TeamStore.isTeamAdminForCurrentTeam();
- const isSystemAdmin = UserStore.isSystemAdminForCurrentUser();
-
- let setHeaderButton = createSetHeaderButton(channel);
- if (!showManagementOptions(channel, isChannelAdmin, isTeamAdmin, isSystemAdmin)) {
- setHeaderButton = null;
- }
-
- return (
- <div className={'channel-intro ' + centeredIntro}>
- <h4 className='channel-intro__title'>
- <FormattedMessage
- id='intro_messages.beginning'
- defaultMessage='Beginning of {name}'
- values={{
- name: (uiName)
- }}
- />
- </h4>
- <p className='channel-intro__content'>
- {createMessage}
- {memberMessage}
- {purposeMessage}
- <br/>
- </p>
- {createInviteChannelMemberButton(channel, uiType)}
- {setHeaderButton}
- </div>
- );
-}
-
-function createInviteChannelMemberButton(channel, uiType) {
- return (
- <ToggleModalButton
- className='intro-links'
- dialogType={ChannelInviteModal}
- dialogProps={{channel}}
- >
- <i className='fa fa-user-plus'/>
- <FormattedMessage
- id='intro_messages.invite'
- defaultMessage='Invite others to this {type}'
- values={{
- type: (uiType)
- }}
- />
- </ToggleModalButton>
- );
-}
-
-function createSetHeaderButton(channel) {
- return (
- <ToggleModalButton
- className='intro-links'
- dialogType={EditChannelHeaderModal}
- dialogProps={{channel}}
- >
- <i className='fa fa-pencil'/>
- <FormattedMessage
- id='intro_messages.setHeader'
- defaultMessage='Set a Header'
- />
- </ToggleModalButton>
- );
-}
diff --git a/webapp/utils/channel_utils.jsx b/webapp/utils/channel_utils.jsx
deleted file mode 100644
index d9887ff89..000000000
--- a/webapp/utils/channel_utils.jsx
+++ /dev/null
@@ -1,325 +0,0 @@
-
-import Constants from 'utils/constants.jsx';
-const Preferences = Constants.Preferences;
-
-import * as Utils from 'utils/utils.jsx';
-
-import UserStore from 'stores/user_store.jsx';
-import ChannelStore from 'stores/channel_store.jsx';
-import TeamStore from 'stores/team_store.jsx';
-import PreferenceStore from 'stores/preference_store.jsx';
-import LocalizationStore from 'stores/localization_store.jsx';
-
-/**
- * Returns list of sorted channels grouped by type. Favorites here is considered as separated type.
- *
- * Example: {
- * publicChannels: [...],
- * privateChannels: [...],
- * directAndGroupChannels: [...],
- * favoriteChannels: [...]
- * }
- */
-export function buildDisplayableChannelList(persistentChannels) {
- const missingDirectChannels = createMissingDirectChannels(persistentChannels);
-
- const channels = persistentChannels.
- concat(missingDirectChannels).
- map(completeDirectChannelInfo).
- filter(isNotDeletedChannel).
- sort(sortChannelsByDisplayName);
-
- const favoriteChannels = channels.filter(isFavoriteChannel);
- const notFavoriteChannels = channels.filter(not(isFavoriteChannel));
- const directAndGroupChannels = notFavoriteChannels.filter(orX(andX(isGroupChannel, isGroupChannelVisible), andX(isDirectChannel, isDirectChannelVisible)));
-
- return {
- favoriteChannels,
- publicChannels: notFavoriteChannels.filter(isOpenChannel),
- privateChannels: notFavoriteChannels.filter(isPrivateChannel),
- directAndGroupChannels
- };
-}
-
-export function isFavoriteChannel(channel) {
- return PreferenceStore.getBool(Preferences.CATEGORY_FAVORITE_CHANNEL, channel.id);
-}
-
-export function isFavoriteChannelId(channelId) {
- return PreferenceStore.getBool(Preferences.CATEGORY_FAVORITE_CHANNEL, channelId);
-}
-
-export function isNotDeletedChannel(channel) {
- return channel.delete_at === 0;
-}
-
-export function isOpenChannel(channel) {
- return channel.type === Constants.OPEN_CHANNEL;
-}
-
-export function isPrivateChannel(channel) {
- return channel.type === Constants.PRIVATE_CHANNEL;
-}
-
-export function isGroupChannel(channel) {
- return channel.type === Constants.GM_CHANNEL;
-}
-
-export function isGroupChannelVisible(channel) {
- return PreferenceStore.getBool(Preferences.CATEGORY_GROUP_CHANNEL_SHOW, channel.id);
-}
-
-export function isDirectChannel(channel) {
- return channel.type === Constants.DM_CHANNEL;
-}
-
-export function isDirectChannelVisible(channel) {
- const channelId = Utils.getUserIdFromChannelName(channel);
-
- return PreferenceStore.getBool(Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, channelId);
-}
-
-export function completeDirectChannelInfo(channel) {
- if (!isDirectChannel(channel)) {
- return channel;
- }
-
- const dmChannelClone = JSON.parse(JSON.stringify(channel));
- const teammateId = Utils.getUserIdFromChannelName(channel);
-
- return Object.assign(dmChannelClone, {
- display_name: Utils.displayUsername(teammateId),
- teammate_id: teammateId,
- status: UserStore.getStatus(teammateId) || 'offline'
- });
-}
-
-const defaultPrefix = 'D'; // fallback for future types
-const typeToPrefixMap = {[Constants.OPEN_CHANNEL]: 'A', [Constants.PRIVATE_CHANNEL]: 'B', [Constants.DM_CHANNEL]: 'C', [Constants.GM_CHANNEL]: 'C'};
-
-export function sortChannelsByDisplayName(a, b) {
- const locale = LocalizationStore.getLocale();
-
- if (a.type !== b.type && typeToPrefixMap[a.type] !== typeToPrefixMap[b.type]) {
- return (typeToPrefixMap[a.type] || defaultPrefix).localeCompare((typeToPrefixMap[b.type] || defaultPrefix), locale);
- }
-
- const aDisplayName = getChannelDisplayName(a);
- const bDisplayName = getChannelDisplayName(b);
-
- if (aDisplayName !== null && bDisplayName !== null && aDisplayName !== bDisplayName) {
- return aDisplayName.localeCompare(bDisplayName, locale, {numeric: true});
- }
-
- return a.name.localeCompare(b.name, locale, {numeric: true});
-}
-
-const MAX_CHANNEL_NAME_LENGTH = 64;
-
-export function getChannelDisplayName(channel) {
- if (channel.type !== Constants.GM_CHANNEL) {
- return channel.display_name;
- }
-
- const currentUser = UserStore.getCurrentUser();
-
- if (currentUser) {
- let displayName = channel.display_name;
- if (displayName.length >= MAX_CHANNEL_NAME_LENGTH) {
- displayName += '...';
- }
- displayName = displayName.replace(currentUser.username + ', ', '').replace(currentUser.username, '').trim();
- if (displayName[displayName.length - 1] === ',') {
- return displayName.slice(0, -1);
- }
- return displayName;
- }
-
- return channel.display_name;
-}
-
-export function showCreateOption(channelType, isTeamAdmin, isSystemAdmin) {
- if (global.window.mm_license.IsLicensed !== 'true') {
- return true;
- }
-
- if (channelType === Constants.OPEN_CHANNEL) {
- if (global.window.mm_config.RestrictPublicChannelCreation === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
- return false;
- } else if (global.window.mm_config.RestrictPublicChannelCreation === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) {
- return false;
- }
- } else if (channelType === Constants.PRIVATE_CHANNEL) {
- if (global.window.mm_config.RestrictPrivateChannelCreation === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
- return false;
- } else if (global.window.mm_config.RestrictPrivateChannelCreation === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) {
- return false;
- }
- }
-
- return true;
-}
-
-export function showManagementOptions(channel, isChannelAdmin, isTeamAdmin, isSystemAdmin) {
- if (global.window.mm_license.IsLicensed !== 'true') {
- // policies are only enforced in enterprise editions
- return true;
- }
-
- if (channel.type === Constants.OPEN_CHANNEL) {
- if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_CHANNEL_ADMIN && !(isChannelAdmin || isTeamAdmin || isSystemAdmin)) {
- return false;
- }
- if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) {
- return false;
- }
- if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
- return false;
- }
- } else if (channel.type === Constants.PRIVATE_CHANNEL) {
- if (global.window.mm_config.RestrictPrivateChannelManagement === Constants.PERMISSIONS_CHANNEL_ADMIN && !(isChannelAdmin || isTeamAdmin || isSystemAdmin)) {
- return false;
- }
- if (global.window.mm_config.RestrictPrivateChannelManagement === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) {
- return false;
- }
- if (global.window.mm_config.RestrictPrivateChannelManagement === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
- return false;
- }
- }
-
- return true;
-}
-
-export function showDeleteOptionForCurrentUser(channel, isChannelAdmin, isTeamAdmin, isSystemAdmin) {
- if (global.window.mm_license.IsLicensed !== 'true') {
- // policies are only enforced in enterprise editions
- return true;
- }
-
- if (ChannelStore.isDefault(channel)) {
- // can't delete default channels, no matter who you are
- return false;
- }
-
- if (channel.type === Constants.OPEN_CHANNEL) {
- if (global.window.mm_config.RestrictPublicChannelDeletion === Constants.PERMISSIONS_CHANNEL_ADMIN && !(isChannelAdmin || isTeamAdmin || isSystemAdmin)) {
- return false;
- }
- if (global.window.mm_config.RestrictPublicChannelDeletion === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) {
- return false;
- }
- if (global.window.mm_config.RestrictPublicChannelDeletion === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
- return false;
- }
- } else if (channel.type === Constants.PRIVATE_CHANNEL) {
- if (global.window.mm_config.RestrictPrivateChannelDeletion === Constants.PERMISSIONS_CHANNEL_ADMIN && !(isChannelAdmin || isTeamAdmin || isSystemAdmin)) {
- return false;
- }
- if (global.window.mm_config.RestrictPrivateChannelDeletion === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) {
- return false;
- }
- if (global.window.mm_config.RestrictPrivateChannelDeletion === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
- return false;
- }
- }
-
- return true;
-}
-
-export function canManageMembers(channel, isChannelAdmin, isTeamAdmin, isSystemAdmin) {
- if (global.window.mm_license.IsLicensed !== 'true') {
- return true;
- }
-
- if (channel.type === Constants.PRIVATE_CHANNEL) {
- if (global.window.mm_config.RestrictPrivateChannelManageMembers === Constants.PERMISSIONS_CHANNEL_ADMIN && !(isChannelAdmin || isTeamAdmin || isSystemAdmin)) {
- return false;
- }
- if (global.window.mm_config.RestrictPrivateChannelManageMembers === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) {
- return false;
- }
- if (global.window.mm_config.RestrictPrivateChannelManageMembers === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) {
- return false;
- }
- }
-
- return true;
-}
-
-export function buildGroupChannelName(channelId) {
- const profiles = UserStore.getProfileListInChannel(channelId, true);
- let displayName = '';
- for (let i = 0; i < profiles.length; i++) {
- displayName += Utils.displayUsernameForUser(profiles[i]);
- if (i !== profiles.length - 1) {
- displayName += ', ';
- }
- }
-
- return displayName;
-}
-
-export function getCountsStateFromStores(team = TeamStore.getCurrent(), teamMembers = TeamStore.getMyTeamMembers(), unreadCounts = ChannelStore.getUnreadCounts()) {
- let mentionCount = 0;
- let messageCount = 0;
-
- teamMembers.forEach((member) => {
- if (member.team_id !== TeamStore.getCurrentId()) {
- mentionCount += (member.mention_count || 0);
- messageCount += (member.msg_count || 0);
- }
- });
-
- Object.keys(unreadCounts).forEach((chId) => {
- const channel = ChannelStore.get(chId);
-
- if (channel && (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL || channel.team_id === team.id)) {
- messageCount += unreadCounts[chId].msgs;
- mentionCount += unreadCounts[chId].mentions;
- }
- });
-
- return {mentionCount, messageCount};
-}
-
-/*
- * not exported helpers
- */
-
-function createMissingDirectChannels(channels) {
- const directChannelsDisplayPreferences = PreferenceStore.getCategory(Preferences.CATEGORY_DIRECT_CHANNEL_SHOW);
-
- return Array.
- from(directChannelsDisplayPreferences).
- filter((entry) => entry[1] === 'true').
- map((entry) => entry[0]).
- filter((teammateId) => !channels.some(Utils.isDirectChannelForUser.bind(null, teammateId))).
- map(createFakeChannelCurried(UserStore.getCurrentId()));
-}
-
-function createFakeChannel(userId, otherUserId) {
- return {
- name: Utils.getDirectChannelName(userId, otherUserId),
- last_post_at: 0,
- total_msg_count: 0,
- type: Constants.DM_CHANNEL,
- fake: true
- };
-}
-
-function createFakeChannelCurried(userId) {
- return (otherUserId) => createFakeChannel(userId, otherUserId);
-}
-
-function not(f) {
- return (...args) => !f(...args);
-}
-
-function orX(...fns) {
- return (...args) => fns.some((f) => f(...args));
-}
-
-function andX(...fns) {
- return (...args) => fns.every((f) => f(...args));
-}
diff --git a/webapp/utils/commons.jsx b/webapp/utils/commons.jsx
deleted file mode 100644
index 224653df7..000000000
--- a/webapp/utils/commons.jsx
+++ /dev/null
@@ -1,20 +0,0 @@
-export function getDistanceBW2Points(point1, point2, xAttr = 'x', yAttr = 'y') {
- return Math.sqrt(Math.pow(point1[xAttr] - point2[xAttr], 2) + Math.pow(point1[yAttr] - point2[yAttr], 2));
-}
-
-/**
- * Funtion to return nearest point of given pivot point.
- * It return two points one nearest and other nearest but having both coorditanes smaller than the given point's coordinates.
- */
-export function getNearestPoint(pivotPoint, points, xAttr = 'x', yAttr = 'y') {
- var nearestPoint = {};
- for (const point of points) {
- if (typeof nearestPoint[xAttr] === 'undefined' || typeof nearestPoint[yAttr] === 'undefined') {
- nearestPoint = point;
- } else if (getDistanceBW2Points(point, pivotPoint, xAttr, yAttr) < getDistanceBW2Points(nearestPoint, pivotPoint, xAttr, yAttr)) {
- // Check for bestImage
- nearestPoint = point;
- }
- }
- return nearestPoint;
-}
diff --git a/webapp/utils/constants.jsx b/webapp/utils/constants.jsx
deleted file mode 100644
index 0741299fd..000000000
--- a/webapp/utils/constants.jsx
+++ /dev/null
@@ -1,1004 +0,0 @@
-// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-/* eslint-disable no-magic-numbers */
-
-import keyMirror from 'key-mirror';
-
-import audioIcon from 'images/icons/audio.png';
-import videoIcon from 'images/icons/video.png';
-import excelIcon from 'images/icons/excel.png';
-import pptIcon from 'images/icons/ppt.png';
-import pdfIcon from 'images/icons/pdf.png';
-import codeIcon from 'images/icons/code.png';
-import wordIcon from 'images/icons/word.png';
-import patchIcon from 'images/icons/patch.png';
-import genericIcon from 'images/icons/generic.png';
-
-import logoImage from 'images/logo_compact.png';
-import logoWebhook from 'images/webhook_icon.jpg';
-
-import solarizedDarkCSS from '!!file-loader?name=files/code_themes/[hash].[ext]!highlight.js/styles/solarized-dark.css';
-import solarizedDarkIcon from 'images/themes/code_themes/solarized-dark.png';
-
-import solarizedLightCSS from '!!file-loader?name=files/code_themes/[hash].[ext]!highlight.js/styles/solarized-light.css';
-import solarizedLightIcon from 'images/themes/code_themes/solarized-light.png';
-
-import githubCSS from '!!file-loader?name=files/code_themes/[hash].[ext]!highlight.js/styles/github.css';
-import githubIcon from 'images/themes/code_themes/github.png';
-
-import monokaiCSS from '!!file-loader?name=files/code_themes/[hash].[ext]!highlight.js/styles/monokai.css';
-import monokaiIcon from 'images/themes/code_themes/monokai.png';
-
-import defaultThemeImage from 'images/themes/organization.png';
-import mattermostDarkThemeImage from 'images/themes/mattermost_dark.png';
-import mattermostThemeImage from 'images/themes/mattermost.png';
-import windows10ThemeImage from 'images/themes/windows_dark.png';
-
-export const Preferences = {
- CATEGORY_DIRECT_CHANNEL_SHOW: 'direct_channel_show',
- CATEGORY_GROUP_CHANNEL_SHOW: 'group_channel_show',
- CATEGORY_DISPLAY_SETTINGS: 'display_settings',
- CATEGORY_ADVANCED_SETTINGS: 'advanced_settings',
- TUTORIAL_STEP: 'tutorial_step',
- CHANNEL_DISPLAY_MODE: 'channel_display_mode',
- CHANNEL_DISPLAY_MODE_CENTERED: 'centered',
- CHANNEL_DISPLAY_MODE_FULL_SCREEN: 'full',
- CHANNEL_DISPLAY_MODE_DEFAULT: 'full',
- MESSAGE_DISPLAY: 'message_display',
- MESSAGE_DISPLAY_CLEAN: 'clean',
- MESSAGE_DISPLAY_COMPACT: 'compact',
- MESSAGE_DISPLAY_DEFAULT: 'clean',
- COLLAPSE_DISPLAY: 'collapse_previews',
- COLLAPSE_DISPLAY_DEFAULT: 'false',
- USE_MILITARY_TIME: 'use_military_time',
- CATEGORY_THEME: 'theme',
- CATEGORY_FLAGGED_POST: 'flagged_post',
- CATEGORY_NOTIFICATIONS: 'notifications',
- CATEGORY_FAVORITE_CHANNEL: 'favorite_channel',
- EMAIL_INTERVAL: 'email_interval',
- INTERVAL_IMMEDIATE: 30, // "immediate" is a 30 second interval
- INTERVAL_FIFTEEN_MINUTES: 15 * 60,
- INTERVAL_HOUR: 60 * 60,
- INTERVAL_NEVER: 0
-};
-
-export const ActionTypes = keyMirror({
- RECEIVED_ERROR: null,
-
- CLICK_CHANNEL: null,
- CREATE_CHANNEL: null,
- CREATE_POST: null,
- CREATE_COMMENT: null,
- POST_DELETED: null,
- POST_UPDATED: null,
- REMOVE_POST: null,
-
- RECEIVED_CHANNELS: null,
- RECEIVED_CHANNEL: null,
- RECEIVED_CHANNEL_MEMBER: null,
- RECEIVED_MORE_CHANNELS: null,
- RECEIVED_CHANNEL_STATS: null,
- RECEIVED_MY_CHANNEL_MEMBERS: null,
- RECEIVED_MEMBERS_IN_CHANNEL: null,
-
- FOCUS_POST: null,
- RECEIVED_POSTS: null,
- RECEIVED_FOCUSED_POST: null,
- RECEIVED_POST: null,
- RECEIVED_EDIT_POST: null,
- RECEIVED_SEARCH: null,
- RECEIVED_SEARCH_TERM: null,
- SELECT_POST: null,
- RECEIVED_POST_SELECTED: null,
- RECEIVED_MENTION_DATA: null,
- RECEIVED_ADD_MENTION: null,
- RECEIVED_POST_PINNED: null,
- RECEIVED_POST_UNPINNED: null,
- INCREASE_POST_VISIBILITY: null,
- LOADING_POSTS: null,
-
- RECEIVED_PROFILES: null,
- RECEIVED_PROFILES_IN_TEAM: null,
- RECEIVED_PROFILES_NOT_IN_TEAM: null,
- RECEIVED_PROFILE: null,
- RECEIVED_PROFILES_IN_CHANNEL: null,
- RECEIVED_PROFILES_NOT_IN_CHANNEL: null,
- RECEIVED_PROFILES_WITHOUT_TEAM: null,
- RECEIVED_ME: null,
- RECEIVED_SESSIONS: null,
- RECEIVED_AUDITS: null,
- RECEIVED_TEAMS: null,
- RECEIVED_STATUSES: null,
- RECEIVED_PREFERENCE: null,
- RECEIVED_PREFERENCES: null,
- DELETED_PREFERENCES: null,
- RECEIVED_FILE_INFOS: null,
- RECEIVED_ANALYTICS: null,
-
- RECEIVED_INCOMING_WEBHOOKS: null,
- RECEIVED_INCOMING_WEBHOOK: null,
- UPDATED_INCOMING_WEBHOOK: null,
- REMOVED_INCOMING_WEBHOOK: null,
- RECEIVED_OUTGOING_WEBHOOKS: null,
- RECEIVED_OUTGOING_WEBHOOK: null,
- UPDATED_OUTGOING_WEBHOOK: null,
- REMOVED_OUTGOING_WEBHOOK: null,
- RECEIVED_COMMANDS: null,
- RECEIVED_COMMAND: null,
- UPDATED_COMMAND: null,
- REMOVED_COMMAND: null,
- RECEIVED_OAUTHAPPS: null,
- RECEIVED_OAUTHAPP: null,
- REMOVED_OAUTHAPP: null,
-
- RECEIVED_CUSTOM_EMOJIS: null,
- RECEIVED_CUSTOM_EMOJI: null,
- UPDATED_CUSTOM_EMOJI: null,
- REMOVED_CUSTOM_EMOJI: null,
-
- RECEIVED_REACTIONS: null,
- ADDED_REACTION: null,
- REMOVED_REACTION: null,
-
- RECEIVED_MSG: null,
-
- RECEIVED_TEAM: null,
- RECEIVED_MY_TEAM: null,
- CREATED_TEAM: null,
- UPDATE_TEAM: null,
-
- RECEIVED_CONFIG: null,
- RECEIVED_LOGS: null,
- RECEIVED_SERVER_AUDITS: null,
- RECEIVED_SERVER_COMPLIANCE_REPORTS: null,
- RECEIVED_ALL_TEAMS: null,
- RECEIVED_ALL_TEAM_LISTINGS: null,
- RECEIVED_MY_TEAM_MEMBERS: null,
- RECEIVED_MY_TEAMS_UNREAD: null,
- RECEIVED_MEMBERS_IN_TEAM: null,
- RECEIVED_TEAM_STATS: null,
-
- RECEIVED_LOCALE: null,
-
- UPDATE_OPEN_GRAPH_METADATA: null,
- RECIVED_OPEN_GRAPH_METADATA: null,
-
- SHOW_SEARCH: null,
-
- USER_TYPING: null,
-
- TOGGLE_ACCOUNT_SETTINGS_MODAL: null,
- TOGGLE_SHORTCUTS_MODAL: null,
- TOGGLE_IMPORT_THEME_MODAL: null,
- TOGGLE_INVITE_MEMBER_MODAL: null,
- TOGGLE_LEAVE_TEAM_MODAL: null,
- TOGGLE_DELETE_POST_MODAL: null,
- TOGGLE_GET_POST_LINK_MODAL: null,
- TOGGLE_GET_TEAM_INVITE_LINK_MODAL: null,
- TOGGLE_GET_PUBLIC_LINK_MODAL: null,
- TOGGLE_DM_MODAL: null,
- TOGGLE_QUICK_SWITCH_MODAL: null,
- TOGGLE_CHANNEL_HEADER_UPDATE_MODAL: null,
- TOGGLE_CHANNEL_PURPOSE_UPDATE_MODAL: null,
- TOGGLE_CHANNEL_NAME_UPDATE_MODAL: null,
- TOGGLE_LEAVE_PRIVATE_CHANNEL_MODAL: null,
-
- SUGGESTION_PRETEXT_CHANGED: null,
- SUGGESTION_RECEIVED_SUGGESTIONS: null,
- SUGGESTION_CLEAR_SUGGESTIONS: null,
- SUGGESTION_COMPLETE_WORD: null,
- SUGGESTION_SELECT_NEXT: null,
- SUGGESTION_SELECT_PREVIOUS: null,
-
- BROWSER_CHANGE_FOCUS: null,
-
- EMOJI_POSTED: null,
-
- RECEIVED_PLUGIN_COMPONENTS: null
-});
-
-export const WebrtcActionTypes = keyMirror({
- INITIALIZE: null,
- NOTIFY: null,
- CHANGED: null,
- ANSWER: null,
- DECLINE: null,
- CANCEL: null,
- NO_ANSWER: null,
- BUSY: null,
- FAILED: null,
- UNSUPPORTED: null,
- MUTED: null,
- IN_PROGRESS: null,
- DISABLED: null,
- RHS: null
-});
-
-export const UserStatuses = {
- OFFLINE: 'offline',
- AWAY: 'away',
- ONLINE: 'online'
-};
-
-export const UserSearchOptions = {
- ALLOW_INACTIVE: 'allow_inactive',
- WITHOUT_TEAM: 'without_team'
-};
-
-export const SocketEvents = {
- POSTED: 'posted',
- POST_EDITED: 'post_edited',
- POST_DELETED: 'post_deleted',
- POST_UPDATED: 'post_updated',
- CHANNEL_CREATED: 'channel_created',
- CHANNEL_DELETED: 'channel_deleted',
- CHANNEL_UPDATED: 'channel_updated',
- CHANNEL_VIEWED: 'channel_viewed',
- DIRECT_ADDED: 'direct_added',
- NEW_USER: 'new_user',
- ADDED_TO_TEAM: 'added_to_team',
- LEAVE_TEAM: 'leave_team',
- UPDATE_TEAM: 'update_team',
- USER_ADDED: 'user_added',
- USER_REMOVED: 'user_removed',
- USER_UPDATED: 'user_updated',
- MEMBERROLE_UPDATED: 'memberrole_updated',
- TYPING: 'typing',
- PREFERENCE_CHANGED: 'preference_changed',
- PREFERENCES_CHANGED: 'preferences_changed',
- PREFERENCES_DELETED: 'preferences_deleted',
- EPHEMERAL_MESSAGE: 'ephemeral_message',
- STATUS_CHANGED: 'status_change',
- HELLO: 'hello',
- WEBRTC: 'webrtc',
- REACTION_ADDED: 'reaction_added',
- REACTION_REMOVED: 'reaction_removed',
- EMOJI_ADDED: 'emoji_added'
-};
-
-export const TutorialSteps = {
- INTRO_SCREENS: 0,
- POST_POPOVER: 1,
- CHANNEL_POPOVER: 2,
- MENU_POPOVER: 3
-};
-
-export const PostTypes = {
- JOIN_LEAVE: 'system_join_leave',
- JOIN_CHANNEL: 'system_join_channel',
- LEAVE_CHANNEL: 'system_leave_channel',
- ADD_TO_CHANNEL: 'system_add_to_channel',
- REMOVE_FROM_CHANNEL: 'system_remove_from_channel',
- ADD_REMOVE: 'system_add_remove',
- HEADER_CHANGE: 'system_header_change',
- DISPLAYNAME_CHANGE: 'system_displayname_change',
- PURPOSE_CHANGE: 'system_purpose_change',
- CHANNEL_DELETED: 'system_channel_deleted',
- EPHEMERAL: 'system_ephemeral',
- REMOVE_LINK_PREVIEW: 'remove_link_preview'
-};
-
-export const StatTypes = keyMirror({
- TOTAL_USERS: null,
- TOTAL_PUBLIC_CHANNELS: null,
- TOTAL_PRIVATE_GROUPS: null,
- TOTAL_POSTS: null,
- TOTAL_TEAMS: null,
- TOTAL_FILE_POSTS: null,
- TOTAL_HASHTAG_POSTS: null,
- TOTAL_IHOOKS: null,
- TOTAL_OHOOKS: null,
- TOTAL_COMMANDS: null,
- TOTAL_SESSIONS: null,
- POST_PER_DAY: null,
- USERS_WITH_POSTS_PER_DAY: null,
- RECENTLY_ACTIVE_USERS: null,
- NEWLY_CREATED_USERS: null,
- TOTAL_WEBSOCKET_CONNECTIONS: null,
- TOTAL_MASTER_DB_CONNECTIONS: null,
- TOTAL_READ_DB_CONNECTIONS: null,
- DAILY_ACTIVE_USERS: null,
- MONTHLY_ACTIVE_USERS: null
-});
-
-export const ErrorPageTypes = {
- LOCAL_STORAGE: 'local_storage',
- OAUTH_MISSING_CODE: 'oauth_missing_code',
- PAGE_NOT_FOUND: 'page_not_found',
- PERMALINK_NOT_FOUND: 'permalink_not_found'
-};
-
-export const JobTypes = {
- DATA_RETENTION: 'data_retention',
- ELASTICSEARCH_POST_INDEXING: 'elasticsearch_post_indexing'
-};
-
-export const JobStatuses = {
- PENDING: 'pending',
- IN_PROGRESS: 'in_progress',
- SUCCESS: 'success',
- ERROR: 'error',
- CANCEL_REQUESTED: 'cancel_requested',
- CANCELED: 'canceled'
-};
-
-export const ErrorBarTypes = {
- LICENSE_EXPIRING: 'error_bar.license_expiring',
- LICENSE_EXPIRED: 'error_bar.license_expired',
- LICENSE_PAST_GRACE: 'error_bar.past_grace',
- PREVIEW_MODE: 'error_bar.preview_mode',
- SITE_URL: 'error_bar.site_url',
- WEBSOCKET_PORT_ERROR: 'channel_loader.socketError'
-};
-
-export const Constants = {
- Preferences,
- SocketEvents,
- ActionTypes,
- WebrtcActionTypes,
- UserStatuses,
- UserSearchOptions,
- TutorialSteps,
- PostTypes,
- ErrorPageTypes,
- ErrorBarTypes,
-
- MAX_POST_VISIBILITY: 1000000,
-
- IGNORE_POST_TYPES: [PostTypes.JOIN_LEAVE, PostTypes.JOIN_CHANNEL, PostTypes.LEAVE_CHANNEL, PostTypes.REMOVE_FROM_CHANNEL, PostTypes.ADD_TO_CHANNEL, PostTypes.ADD_REMOVE],
-
- PayloadSources: keyMirror({
- SERVER_ACTION: null,
- VIEW_ACTION: null
- }),
-
- StatTypes,
- STAT_MAX_ACTIVE_USERS: 20,
- STAT_MAX_NEW_USERS: 20,
-
- UserUpdateEvents: {
- USERNAME: 'username',
- FULLNAME: 'fullname',
- NICKNAME: 'nickname',
- EMAIL: 'email',
- LANGUAGE: 'language',
- POSITION: 'position'
- },
-
- ScrollTypes: {
- FREE: 1,
- BOTTOM: 2,
- SIDEBBAR_OPEN: 3,
- NEW_MESSAGE: 4,
- POST: 5
- },
-
- SPECIAL_MENTIONS: ['all', 'channel', 'here'],
- NOTIFY_ALL_MEMBERS: 5,
- CHARACTER_LIMIT: 4000,
- IMAGE_TYPES: ['jpg', 'gif', 'bmp', 'png', 'jpeg'],
- AUDIO_TYPES: ['mp3', 'wav', 'wma', 'm4a', 'flac', 'aac', 'ogg'],
- VIDEO_TYPES: ['mp4', 'avi', 'webm', 'mkv', 'wmv', 'mpg', 'mov', 'flv'],
- PRESENTATION_TYPES: ['ppt', 'pptx'],
- SPREADSHEET_TYPES: ['xlsx', 'csv'],
- WORD_TYPES: ['doc', 'docx'],
- CODE_TYPES: ['as', 'applescript', 'osascript', 'scpt', 'bash', 'sh', 'zsh', 'clj', 'boot', 'cl2', 'cljc', 'cljs', 'cljs.hl', 'cljscm', 'cljx', 'hic', 'coffee', '_coffee', 'cake', 'cjsx', 'cson', 'iced', 'cpp', 'c', 'cc', 'h', 'c++', 'h++', 'hpp', 'cs', 'csharp', 'css', 'd', 'di', 'dart', 'delphi', 'dpr', 'dfm', 'pas', 'pascal', 'freepascal', 'lazarus', 'lpr', 'lfm', 'diff', 'django', 'jinja', 'dockerfile', 'docker', 'erl', 'f90', 'f95', 'fsharp', 'fs', 'gcode', 'nc', 'go', 'groovy', 'handlebars', 'hbs', 'html.hbs', 'html.handlebars', 'hs', 'hx', 'java', 'jsp', 'js', 'jsx', 'json', 'jl', 'kt', 'ktm', 'kts', 'less', 'lisp', 'lua', 'mk', 'mak', 'md', 'mkdown', 'mkd', 'matlab', 'm', 'mm', 'objc', 'obj-c', 'ml', 'perl', 'pl', 'php', 'php3', 'php4', 'php5', 'php6', 'ps', 'ps1', 'pp', 'py', 'gyp', 'r', 'ruby', 'rb', 'gemspec', 'podspec', 'thor', 'irb', 'rs', 'scala', 'scm', 'sld', 'scss', 'st', 'sql', 'swift', 'tex', 'txt', 'vbnet', 'vb', 'bas', 'vbs', 'v', 'veo', 'xml', 'html', 'xhtml', 'rss', 'atom', 'xsl', 'plist', 'yaml'],
- PDF_TYPES: ['pdf'],
- PATCH_TYPES: ['patch'],
- SVG_TYPES: ['svg'],
- ICON_FROM_TYPE: {
- audio: audioIcon,
- video: videoIcon,
- spreadsheet: excelIcon,
- presentation: pptIcon,
- pdf: pdfIcon,
- code: codeIcon,
- word: wordIcon,
- patch: patchIcon,
- other: genericIcon
- },
- ICON_NAME_FROM_TYPE: {
- audio: 'audio',
- video: 'video',
- spreadsheet: 'excel',
- presentation: 'ppt',
- pdf: 'pdf',
- code: 'code',
- word: 'word',
- patch: 'patch',
- other: 'generic'
- },
- MAX_DISPLAY_FILES: 5,
- MAX_UPLOAD_FILES: 5,
- THUMBNAIL_WIDTH: 128,
- THUMBNAIL_HEIGHT: 100,
- PROFILE_WIDTH: 128,
- PROFILE_HEIGHT: 128,
- WEB_VIDEO_WIDTH: 640,
- WEB_VIDEO_HEIGHT: 480,
- MOBILE_VIDEO_WIDTH: 480,
- MOBILE_VIDEO_HEIGHT: 360,
- MOBILE_SCREEN_WIDTH: 768,
- SCROLL_DELAY: 2000,
- SCROLL_PAGE_FRACTION: 3,
- DEFAULT_CHANNEL: 'town-square',
- DEFAULT_CHANNEL_UI_NAME: 'Town Square',
- OFFTOPIC_CHANNEL: 'off-topic',
- OFFTOPIC_CHANNEL_UI_NAME: 'Off-Topic',
- GITLAB_SERVICE: 'gitlab',
- GOOGLE_SERVICE: 'google',
- OFFICE365_SERVICE: 'office365',
- EMAIL_SERVICE: 'email',
- LDAP_SERVICE: 'ldap',
- SAML_SERVICE: 'saml',
- USERNAME_SERVICE: 'username',
- SIGNIN_CHANGE: 'signin_change',
- PASSWORD_CHANGE: 'password_change',
- SIGNIN_VERIFIED: 'verified',
- SESSION_EXPIRED: 'expired',
- POST_CHUNK_SIZE: 60,
- PROFILE_CHUNK_SIZE: 100,
- POST_FOCUS_CONTEXT_RADIUS: 10,
- POST_LOADING: 'loading',
- POST_FAILED: 'failed',
- POST_DELETED: 'deleted',
- POST_UPDATED: 'updated',
- SYSTEM_MESSAGE_PREFIX: 'system_',
- SYSTEM_MESSAGE_PROFILE_IMAGE: logoImage,
- RESERVED_TEAM_NAMES: [
- 'signup',
- 'login',
- 'admin',
- 'channel',
- 'post',
- 'api',
- 'oauth'
- ],
- RESERVED_USERNAMES: [
- 'valet',
- 'all',
- 'channel',
- 'here',
- 'matterbot'
- ],
- MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
- MAX_DMS: 20,
- MAX_USERS_IN_GM: 8,
- MIN_USERS_IN_GM: 3,
- MAX_CHANNEL_POPOVER_COUNT: 100,
- DM_CHANNEL: 'D',
- GM_CHANNEL: 'G',
- OPEN_CHANNEL: 'O',
- PRIVATE_CHANNEL: 'P',
- INVITE_TEAM: 'I',
- OPEN_TEAM: 'O',
- MAX_POST_LEN: 4000,
- EMOJI_SIZE: 16,
- EMOJI_ICON_SVG: "<svg width='15px' height='15px' viewBox='0 0 15 15' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <g stroke='none' stroke-width='1' fill='inherit' fill-rule='evenodd'> <g transform='translate(-1071.000000, -954.000000)' fill='inherit'> <g transform='translate(25.000000, 937.000000)'> <g transform='translate(1046.000000, 17.000000)'> <path d='M7.5,0.0852272727 C3.405,0.0852272727 0.0852272727,3.405 0.0852272727,7.5 C0.0852272727,11.595 3.405,14.9147727 7.5,14.9147727 C11.595,14.9147727 14.9147727,11.595 14.9147727,7.5 C14.9147727,3.405 11.595,0.0852272727 7.5,0.0852272727 Z M7.5,14.0663436 C3.87926951,14.0663436 0.933656417,11.1207305 0.933656417,7.5 C0.933656417,3.87926951 3.87926951,0.933656417 7.5,0.933656417 C11.1207305,0.933656417 14.0663436,3.87926951 14.0663436,7.5 C14.0663436,11.1207305 11.1207305,14.0663436 7.5,14.0663436 Z'></path> <path d='M11.7732955,8.95397727 C12.0119318,8.90488636 12.2159659,9.11778409 12.1684091,9.35676136 C11.8063636,11.1790909 9.85346591,12.5710227 7.49846591,12.5710227 C5.15096591,12.5710227 3.20284091,11.1877841 2.83193182,9.37397727 C2.78181818,9.129375 2.99267045,8.911875 3.23744318,8.96198864 C4.85369318,9.29232955 10.1786932,9.28142045 11.7732955,8.95397727 Z'></path> <ellipse cx='4.94318182' cy='5.50431818' rx='1' ry='1.06534091'></ellipse> <ellipse cx='10.0568182' cy='5.50431818' rx='1' ry='1.06534091'></ellipse> </g> </g> </g> </g> </svg>",
- UNREAD_ICON_SVG: "<svg width='10px' height='10px' viewBox='0 0 10 10' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;'><g transform='matrix(1,0,0,1,-20,-18)'><g transform='matrix(0.0330723,0,0,0.0322634,15.8132,12.3164)'><path d='M245.803,377.493C245.803,377.493 204.794,336.485 179.398,311.088C168.55,300.24 150.962,300.24 140.114,311.088C138.327,312.875 136.517,314.686 134.73,316.473C123.882,327.321 123.882,344.908 134.73,355.756C167.972,388.998 233.949,454.975 256.949,477.975C262.158,483.184 269.223,486.111 276.591,486.111C277.38,486.111 278.176,486.111 278.965,486.111C286.332,486.111 293.397,483.184 298.607,477.975C321.607,454.975 387.584,388.998 420.826,355.756C431.674,344.908 431.674,327.321 420.826,316.473C419.039,314.686 417.228,312.875 415.441,311.088C404.593,300.24 387.005,300.24 376.158,311.088C350.761,336.485 309.753,377.493 309.753,377.493C309.753,377.493 309.753,279.687 309.753,203.94C309.753,196.573 306.826,189.508 301.617,184.298C296.408,179.089 289.342,176.162 281.975,176.162C279.191,176.162 276.364,176.162 273.58,176.162C266.213,176.162 259.148,179.089 253.939,184.298C248.729,189.508 245.803,196.573 245.803,203.94L245.803,377.493Z'/></g></g></svg>",
- MEMBERS_ICON_SVG: "<svg width='16px' height='16px' viewBox='0 0 16 16' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g id='Symbols' stroke='none' stroke-width='1' fill='inherit' fill-rule='evenodd'> <g id='Channel-Header/Web-HD' transform='translate(-725.000000, -32.000000)' fill-rule='nonzero' fill='inherit'> <g id='Channel-Header'> <g id='user-count' transform='translate(676.000000, 22.000000)'> <path d='M64.9481342,24 C64.6981342,20.955 63.2551342,19.076 60.6731342,18.354 C61.4831342,17.466 61.9881342,16.296 61.9881342,15 C61.9881342,12.238 59.7501342,10 56.9881342,10 C54.2261342,10 51.9881342,12.238 51.9881342,15 C51.9881342,16.297 52.4941342,17.467 53.3031342,18.354 C50.7221342,19.076 49.2771342,20.955 49.0271342,24 C49.0161342,24.146 49.0061342,24.577 49.0001342,25.001 C48.9911342,25.553 49.4361342,26 49.9881342,26 L63.9881342,26 C64.5411342,26 64.9851342,25.553 64.9761342,25.001 C64.9701342,24.577 64.9601342,24.146 64.9481342,24 Z M56.9881342,12 C58.6421342,12 59.9881342,13.346 59.9881342,15 C59.9881342,16.654 58.6421342,18 56.9881342,18 C55.3341342,18 53.9881342,16.654 53.9881342,15 C53.9881342,13.346 55.3341342,12 56.9881342,12 Z M51.0321342,24 C51.2981342,21.174 52.7911342,20 55.9881342,20 L57.9881342,20 C61.1851342,20 62.6781342,21.174 62.9441342,24 L51.0321342,24 Z' id='User_4_x2C__Profile_5-Copy-9'></path> </g> </g> </g> </g> </svg>",
- TEAM_INFO_SVG: "<svg width='100%' height='100%' viewBox='0 0 20 20' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;'> <g transform='matrix(1.17647,0,0,1.17647,-1.55431e-15,-1.00573e-14)'> <path d='M8.5,0C3.797,0 0,3.797 0,8.5C0,13.203 3.797,17 8.5,17C13.203,17 17,13.203 17,8.5C17,3.797 13.203,0 8.5,0ZM10,8.5C10,7.672 9.328,7 8.5,7C7.672,7 7,7.672 7,8.5L7,12.45C7,13.278 7.672,13.95 8.5,13.95C9.328,13.95 10,13.278 10,12.45L10,8.5ZM8.5,3C9.328,3 10,3.672 10,4.5C10,5.328 9.328,6 8.5,6C7.672,6 7,5.328 7,4.5C7,3.672 7.672,3 8.5,3Z'/> </g> </svg>",
- FLAG_FILLED_ICON_SVG: "<svg width='16px' height='16px' viewBox='0 0 16 16' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <g stroke='none' stroke-width='1' fill='inherit' fill-rule='evenodd'> <g transform='translate(-1073.000000, -33.000000)' fill-rule='nonzero' fill='inherit'> <g transform='translate(-1.000000, 0.000000)'> <g transform='translate(1064.000000, 22.000000)'> <g transform='translate(10.000000, 11.000000)'> <path d='M8,1 L2,1 C2,0.447 1.553,0 1,0 C0.447,0 0,0.447 0,1 L0,15.5 C0,15.776 0.224,16 0.5,16 L1.5,16 C1.776,16 2,15.776 2,15.5 L2,11 L7,11 L7,12 C7,12.553 7.447,13 8,13 L15,13 C15.553,13 16,12.553 16,12 L16,4 C16,3.447 15.553,3 15,3 L9,3 L9,2 C9,1.447 8.553,1 8,1 Z'></path> </g> </g> </g> </g> </g> </svg>",
- FLAG_ICON_SVG: "<svg width='16px' height='16px' viewBox='0 0 16 16' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <g stroke='none' stroke-width='1' fill='inherit' fill-rule='evenodd'> <g transform='translate(-1106.000000, -33.000000)' fill-rule='nonzero' fill='inherit'> <g> <g transform='translate(1096.000000, 22.000000)'> <g transform='translate(10.000000, 11.000000)'> <path d='M8,1 L2,1 C2,0.447 1.553,0 1,0 C0.447,0 0,0.447 0,1 L0,15.5 C0,15.776 0.224,16 0.5,16 L1.5,16 C1.776,16 2,15.776 2,15.5 L2,11 L7,11 L7,12 C7,12.553 7.447,13 8,13 L15,13 C15.553,13 16,12.553 16,12 L16,4 C16,3.447 15.553,3 15,3 L9,3 L9,2 C9,1.447 8.553,1 8,1 Z M9,11 L9,9.5 C9,9.224 8.776,9 8.5,9 L2,9 L2,3 L7,3 L7,4.5 C7,4.776 7.224,5 7.5,5 L14,5 L14,11 L9,11 Z'></path> </g> </g> </g> </g> </g> </svg>",
- ATTACHMENT_ICON_SVG: "<svg width='17px' height='16px' viewBox='0 0 17 16' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <g fill='inherit' fill-rule='evenodd'> <g transform='translate(-1029.000000, -954.000000)' fill-rule='nonzero' fill='inherit'> <g transform='translate(25.000000, 937.000000)'> <g transform='translate(1004.000000, 17.000000)'> <path d='M5.35,15.56 C3.98,15.56 2.61,15.039 1.567,13.997 C0.557,12.984 0,11.642 0,10.212 C0,8.783 0.557,7.44 1.566,6.429 L6.869,1.126 C8.371,-0.376 10.812,-0.375 12.314,1.125 C13.815,2.627 13.815,5.069 12.314,6.57 L7.011,11.873 C6.094,12.792 4.603,12.79 3.687,11.873 C2.771,10.958 2.771,9.467 3.687,8.551 L8.99,3.248 C9.323,2.916 9.861,2.916 10.193,3.248 C10.525,3.579 10.525,4.118 10.193,4.449 L4.89,9.752 C4.637,10.006 4.637,10.418 4.89,10.672 C5.143,10.923 5.555,10.925 5.809,10.672 L11.113,5.369 C11.952,4.53 11.952,3.166 11.113,2.327 C10.276,1.49 8.911,1.488 8.073,2.327 L2.769,7.631 C2.079,8.32 1.699,9.237 1.699,10.212 C1.699,11.188 2.079,12.104 2.768,12.794 C4.19,14.216 6.502,14.216 7.925,12.798 L7.929,12.794 C7.929,12.793 7.929,12.793 7.929,12.793 L15.355,5.369 C15.687,5.037 16.224,5.037 16.556,5.369 C16.888,5.7 16.888,6.239 16.556,6.57 L8.779,14.348 L8.761,14.332 C7.776,15.15 6.562,15.56 5.35,15.56 Z'></path> </g> </g> </g> </g> </svg>",
- MATTERMOST_ICON_SVG: "<svg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px'viewBox='0 0 500 500' style='enable-background:new 0 0 500 500;' xml:space='preserve'> <style type='text/css'> .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#222222;} </style> <g id='XMLID_1_'> <g id='XMLID_3_'> <path id='XMLID_4_' class='st0' d='M396.9,47.7l2.6,53.1c43,47.5,60,114.8,38.6,178.1c-32,94.4-137.4,144.1-235.4,110.9 S51.1,253.1,83,158.7C104.5,95.2,159.2,52,222.5,40.5l34.2-40.4C150-2.8,49.3,63.4,13.3,169.9C-31,300.6,39.1,442.5,169.9,486.7 s272.6-25.8,316.9-156.6C522.7,223.9,483.1,110.3,396.9,47.7z'/> </g> <path id='XMLID_2_' class='st0' d='M335.6,204.3l-1.8-74.2l-1.5-42.7l-1-37c0,0,0.2-17.8-0.4-22c-0.1-0.9-0.4-1.6-0.7-2.2 c0-0.1-0.1-0.2-0.1-0.3c0-0.1-0.1-0.2-0.1-0.2c-0.7-1.2-1.8-2.1-3.1-2.6c-1.4-0.5-2.9-0.4-4.2,0.2c0,0-0.1,0-0.1,0 c-0.2,0.1-0.3,0.1-0.4,0.2c-0.6,0.3-1.2,0.7-1.8,1.3c-3,3-13.7,17.2-13.7,17.2l-23.2,28.8l-27.1,33l-46.5,57.8 c0,0-21.3,26.6-16.6,59.4s29.1,48.7,48,55.1c18.9,6.4,48,8.5,71.6-14.7C336.4,238.4,335.6,204.3,335.6,204.3z'/> </g> </svg>",
- ONLINE_AVATAR_SVG: "<svg version='1.1'id='Layer_1' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:cc='http://creativecommons.org/ns#' inkscape:version='0.48.4 r9939' sodipodi:docname='TRASH_1_4.svg'xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='-243 245 12 12'style='enable-background:new -243 245 12 12;' xml:space='preserve'> <sodipodi:namedview inkscape:cx='26.358185' inkscape:zoom='1.18' bordercolor='#666666' pagecolor='#ffffff' borderopacity='1' objecttolerance='10' inkscape:cy='139.7898' gridtolerance='10' guidetolerance='10' showgrid='false' showguides='true' id='namedview6' inkscape:pageopacity='0' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-width='1366' inkscape:current-layer='Layer_1' inkscape:window-height='705' inkscape:window-y='-8' inkscape:window-maximized='1' inkscape:window-x='-8'> <sodipodi:guide position='50.036793,85.991376' orientation='1,0' id='guide2986'></sodipodi:guide> <sodipodi:guide position='58.426196,66.216355' orientation='0,1' id='guide3047'></sodipodi:guide> </sodipodi:namedview> <g> <path class='online--icon' d='M-236,250.5C-236,250.5-236,250.5-236,250.5C-236,250.5-236,250.5-236,250.5C-236,250.5-236,250.5-236,250.5z'/> <ellipse class='online--icon' cx='-238.5' cy='248' rx='2.5' ry='2.5'/> </g> <path class='online--icon' d='M-238.9,253.8c0-0.4,0.1-0.9,0.2-1.3c-2.2-0.2-2.2-2-2.2-2s-1,0.1-1.2,0.5c-0.4,0.6-0.6,1.7-0.7,2.5c0,0.1-0.1,0.5,0,0.6 c0.2,1.3,2.2,2.3,4.4,2.4c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0C-238.7,255.7-238.9,254.8-238.9,253.8z'/> <g> <g> <path class='online--icon' d='M-232.3,250.1l1.3,1.3c0,0,0,0.1,0,0.1l-4.1,4.1c0,0,0,0-0.1,0c0,0,0,0,0,0l-2.7-2.7c0,0,0-0.1,0-0.1l1.2-1.2 c0,0,0.1,0,0.1,0l1.4,1.4l2.9-2.9C-232.4,250.1-232.3,250.1-232.3,250.1z'/> </g> </g> </svg>",
- AWAY_AVATAR_SVG: "<svg version='1.1'id='Layer_1' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:cc='http://creativecommons.org/ns#' inkscape:version='0.48.4 r9939' sodipodi:docname='TRASH_1_4.svg'xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='-299 391 12 12'style='enable-background:new -299 391 12 12;' xml:space='preserve'> <sodipodi:namedview inkscape:cx='26.358185' inkscape:zoom='1.18' bordercolor='#666666' pagecolor='#ffffff' borderopacity='1' objecttolerance='10' inkscape:cy='139.7898' gridtolerance='10' guidetolerance='10' showgrid='false' showguides='true' id='namedview6' inkscape:pageopacity='0' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-width='1366' inkscape:current-layer='Layer_1' inkscape:window-height='705' inkscape:window-y='-8' inkscape:window-maximized='1' inkscape:window-x='-8'> <sodipodi:guide position='50.036793,85.991376' orientation='1,0' id='guide2986'></sodipodi:guide> <sodipodi:guide position='58.426196,66.216355' orientation='0,1' id='guide3047'></sodipodi:guide> </sodipodi:namedview> <g> <ellipse class='away--icon' cx='-294.6' cy='394' rx='2.5' ry='2.5'/> <path class='away--icon' d='M-293.8,399.4c0-0.4,0.1-0.7,0.2-1c-0.3,0.1-0.6,0.2-1,0.2c-2.5,0-2.5-2-2.5-2s-1,0.1-1.2,0.5c-0.4,0.6-0.6,1.7-0.7,2.5 c0,0.1-0.1,0.5,0,0.6c0.2,1.3,2.2,2.3,4.4,2.4c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0c0.7,0,1.4-0.1,2-0.3 C-293.3,401.5-293.8,400.5-293.8,399.4z'/> </g> <path class='away--icon' d='M-287,400c0,0.1-0.1,0.1-0.1,0.1l-4.9,0c-0.1,0-0.1-0.1-0.1-0.1v-1.6c0-0.1,0.1-0.1,0.1-0.1l4.9,0c0.1,0,0.1,0.1,0.1,0.1 V400z'/> </svg>",
- OFFLINE_AVATAR_SVG: "<svg version='1.1'id='Layer_1' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:svg='http://www.w3.org/2000/svg' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:cc='http://creativecommons.org/ns#' inkscape:version='0.48.4 r9939' sodipodi:docname='TRASH_1_4.svg'xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='-299 391 12 12'style='enable-background:new -299 391 12 12;' xml:space='preserve'> <sodipodi:namedview inkscape:cx='26.358185' inkscape:zoom='1.18' bordercolor='#666666' pagecolor='#ffffff' borderopacity='1' objecttolerance='10' inkscape:cy='139.7898' gridtolerance='10' guidetolerance='10' showgrid='false' showguides='true' id='namedview6' inkscape:pageopacity='0' inkscape:pageshadow='2' inkscape:guide-bbox='true' inkscape:window-width='1366' inkscape:current-layer='Layer_1' inkscape:window-height='705' inkscape:window-y='-8' inkscape:window-maximized='1' inkscape:window-x='-8'> <sodipodi:guide position='50.036793,85.991376' orientation='1,0' id='guide2986'></sodipodi:guide> <sodipodi:guide position='58.426196,66.216355' orientation='0,1' id='guide3047'></sodipodi:guide> </sodipodi:namedview> <g> <g> <ellipse class='offline--icon' cx='-294.5' cy='394' rx='2.5' ry='2.5'/> <path class='offline--icon' d='M-294.3,399.7c0-0.4,0.1-0.8,0.2-1.2c-0.1,0-0.2,0-0.4,0c-2.5,0-2.5-2-2.5-2s-1,0.1-1.2,0.5c-0.4,0.6-0.6,1.7-0.7,2.5 c0,0.1-0.1,0.5,0,0.6c0.2,1.3,2.2,2.3,4.4,2.4h0.1h0.1c0.3,0,0.7,0,1-0.1C-293.9,401.6-294.3,400.7-294.3,399.7z'/> </g> </g> <g> <path class='offline--icon' d='M-288.9,399.4l1.8-1.8c0.1-0.1,0.1-0.3,0-0.3l-0.7-0.7c-0.1-0.1-0.3-0.1-0.3,0l-1.8,1.8l-1.8-1.8c-0.1-0.1-0.3-0.1-0.3,0 l-0.7,0.7c-0.1,0.1-0.1,0.3,0,0.3l1.8,1.8l-1.8,1.8c-0.1,0.1-0.1,0.3,0,0.3l0.7,0.7c0.1,0.1,0.3,0.1,0.3,0l1.8-1.8l1.8,1.8 c0.1,0.1,0.3,0.1,0.3,0l0.7-0.7c0.1-0.1,0.1-0.3,0-0.3L-288.9,399.4z'/> </g> </svg>",
- ONLINE_ICON_SVG: "<div class='icon__container'><svg width='100%' height='100%' viewBox='0 0 20 20' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;'><path class='online--icon' d='M10,0c5.519,0 10,4.481 10,10c0,5.519 -4.481,10 -10,10c-5.519,0 -10,-4.481 -10,-10c0,-5.519 4.481,-10 10,-10Zm6.19,7.18c0,0.208 -0.075,0.384 -0.224,0.53l-5.782,5.64l-1.087,1.059c-0.149,0.146 -0.33,0.218 -0.543,0.218c-0.213,0 -0.394,-0.072 -0.543,-0.218l-1.086,-1.059l-2.891,-2.82c-0.149,-0.146 -0.224,-0.322 -0.224,-0.53c0,-0.208 0.075,-0.384 0.224,-0.53l1.086,-1.059c0.149,-0.146 0.33,-0.218 0.543,-0.218c0.213,0 0.394,0.072 0.543,0.218l2.348,2.298l5.24,-5.118c0.149,-0.146 0.33,-0.218 0.543,-0.218c0.213,0 0.394,0.072 0.543,0.218l1.086,1.059c0.149,0.146 0.224,0.322 0.224,0.53Z'/></svg></div>",
- AWAY_ICON_SVG: "<div class='icon__container'><svg width='100%' height='100%' viewBox='0 0 20 20' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;'><path class='away--icon' d='M10,0c5.519,0 10,4.481 10,10c0,5.519 -4.481,10 -10,10c-5.519,0 -10,-4.481 -10,-10c0,-5.519 4.481,-10 10,-10Zm5.25,8.5l-10.5,0c-0.414,0 -0.75,0.336 -0.75,0.75l0,1.5c0,0.414 0.336,0.75 0.75,0.75l10.5,0c0.414,0 0.75,-0.336 0.75,-0.75l0,-1.5c0,-0.414 -0.336,-0.75 -0.75,-0.75Z'/></svg></div>",
- OFFLINE_ICON_SVG: "<svg class='offline--icon' width='100%' height='100%' viewBox='0 0 20 20' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;'><path d='M10,0c5.519,0 10,4.481 10,10c0,5.519 -4.481,10 -10,10c-5.519,0 -10,-4.481 -10,-10c0,-5.519 4.481,-10 10,-10Zm0,2c4.415,0 8,3.585 8,8c0,4.415 -3.585,8 -8,8c-4.415,0 -8,-3.585 -8,-8c0,-4.415 3.585,-8 8,-8Z'/></svg>",
- MENU_ICON: "<svg width='16px' height='10px' viewBox='0 0 16 10' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <g stroke='none' stroke-width='1' fill='inherit' fill-rule='evenodd'> <g transform='translate(-188.000000, -38.000000)' fill-rule='nonzero' fill='inherit'> <g> <g> <g transform='translate(188.000000, 38.000000)'> <path d='M15.5,0 C15.776,0 16,0.224 16,0.5 L16,1.5 C16,1.776 15.776,2 15.5,2 L0.5,2 C0.224,2 0,1.776 0,1.5 L0,0.5 C0,0.224 0.224,0 0.5,0 L15.5,0 Z M15.5,4 C15.776,4 16,4.224 16,4.5 L16,5.5 C16,5.776 15.776,6 15.5,6 L0.5,6 C0.224,6 0,5.776 0,5.5 L0,4.5 C0,4.224 0.224,4 0.5,4 L15.5,4 Z M15.5,8 C15.776,8 16,8.224 16,8.5 L16,9.5 C16,9.776 15.776,10 15.5,10 L0.5,10 C0.224,10 0,9.776 0,9.5 L0,8.5 C0,8.224 0.224,8 0.5,8 L15.5,8 Z'></path> </g> </g> </g> </g> </g> </svg>",
- COMMENT_ICON: "<svg version='1.1' id='Layer_2' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px'width='15px' height='15px' viewBox='1 1.5 15 15' enable-background='new 1 1.5 15 15' xml:space='preserve'> <g> <g> <path fill='#211B1B' d='M14,1.5H3c-1.104,0-2,0.896-2,2v8c0,1.104,0.896,2,2,2h1.628l1.884,3l1.866-3H14c1.104,0,2-0.896,2-2v-8 C16,2.396,15.104,1.5,14,1.5z M15,11.5c0,0.553-0.447,1-1,1H8l-1.493,2l-1.504-1.991L5,12.5H3c-0.552,0-1-0.447-1-1v-8 c0-0.552,0.448-1,1-1h11c0.553,0,1,0.448,1,1V11.5z'/> </g> </g> </svg>",
- REPLY_ICON: "<svg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px'viewBox='-158 242 18 18' style='enable-background:new -158 242 18 18;' xml:space='preserve'> <path d='M-142.2,252.6c-2-3-4.8-4.7-8.3-4.8v-3.3c0-0.2-0.1-0.3-0.2-0.3s-0.3,0-0.4,0.1l-6.9,6.2c-0.1,0.1-0.1,0.2-0.1,0.3 c0,0.1,0,0.2,0.1,0.3l6.9,6.4c0.1,0.1,0.3,0.1,0.4,0.1c0.1-0.1,0.2-0.2,0.2-0.4v-3.8c4.2,0,7.4,0.4,9.6,4.4c0.1,0.1,0.2,0.2,0.3,0.2 c0,0,0.1,0,0.1,0c0.2-0.1,0.3-0.3,0.2-0.4C-140.2,257.3-140.6,255-142.2,252.6z M-150.8,252.5c-0.2,0-0.4,0.2-0.4,0.4v3.3l-6-5.5 l6-5.3v2.8c0,0.2,0.2,0.4,0.4,0.4c3.3,0,6,1.5,8,4.5c0.5,0.8,0.9,1.6,1.2,2.3C-144,252.8-147.1,252.5-150.8,252.5z'/> </svg>",
- SCROLL_BOTTOM_ICON: "<svg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px'viewBox='-239 239 21 23' style='enable-background:new -239 239 21 23;' xml:space='preserve'> <path d='M-239,241.4l2.4-2.4l8.1,8.2l8.1-8.2l2.4,2.4l-10.5,10.6L-239,241.4z M-228.5,257.2l8.1-8.2l2.4,2.4l-10.5,10.6l-10.5-10.6 l2.4-2.4L-228.5,257.2z'/> </svg>",
- VIDEO_ICON: "<svg width='16px' height='12px' viewBox='0 0 16 12' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <g stroke='none' stroke-width='1' fill='inherit' fill-rule='evenodd'> <g transform='translate(-696.000000, -34.000000)' fill-rule='nonzero' fill='inherit'> <g transform='translate(-1.000000, 0.000000)'> <g transform='translate(687.000000, 22.000000)'> <g transform='translate(10.000000, 12.000000)'> <path d='M15.105,1.447 L12,3 L12,1 C12,0.447 11.553,0 11,0 L1,0 C0.447,0 0,0.447 0,1 L0,11 C0,11.553 0.447,12 1,12 L11,12 C11.553,12 12,11.553 12,11 L12,9 L15.105,10.553 C15.6,10.8 16,10.553 16,10 L16,2 C16,1.447 15.6,1.2 15.105,1.447 Z M12.895,7.211 C12.612,7.07 12.306,7 12,7 L10.5,7 C10.224,7 10,7.224 10,7.5 L10,10 L2,10 L2,2 L10,2 L10,4.5 C10,4.776 10.224,5 10.5,5 L12,5 C12.306,5 12.612,4.93 12.895,4.789 L14,4.236 L14,7.763 L12.895,7.211 Z'></path> </g> </g> </g> </g> </g> </svg>",
- PIN_ICON_SVG: "<svg width='16px' height='16px' viewBox='0 0 16 16' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g id='Symbols' stroke='inherit' stroke-width='1' fill='inherit' fill-rule='evenodd'> <g transform='translate(-775.000000, -32.000000)' fill-rule='nonzero' fill='inherit'> <g> <g transform='translate(764.000000, 22.000000)'> <g transform='translate(10.000000, 10.000000)'> <path d='M16.456,7.291 L9.483,0.25 C9.31,0.078 9.178,0 9.08,0 C8.896,0 8.831,0.276 8.831,0.732 L8.831,3.044 L5.831,5.96 L2.578,6.268 C1.887,6.405 1.668,6.917 2.167,7.41 L4.781,10.011 L3.83,10.961 L1.05,15.511 C0.93,15.761 1.03,15.862 1.28,15.74 L5.83,12.961 L6.786,12.005 L9.359,14.565 C9.556,14.76 9.754,14.854 9.929,14.854 C10.197,14.854 10.413,14.634 10.497,14.219 L10.83,10.961 L13.746,7.961 L16.082,7.961 C16.788,7.961 16.955,7.785 16.456,7.291 Z M12.312,6.567 L9.396,9.567 L8.911,10.065 L8.84,10.757 L8.797,11.184 L5.589,7.992 L6.018,7.952 L6.72,7.886 L7.225,7.396 L10.225,4.48 L10.547,4.167 L12.616,6.256 L12.312,6.567 Z'></path> </g> </g> </g> </g> </g> </svg>",
- LEAVE_TEAM_SVG: "<svg width='100%' height='100%' viewBox='0 0 164 164' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xml:space='preserve' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round; stroke-miterlimit:1.41421;'> <path d='M26.023,164L26.023,7.035L26.022,0.32L137.658,0.32L137.658,164L124.228,164L124.228, 13.749L39.452,13.749L39.452,164L26.023, 164ZM118.876,164L118.876,18.619L58.137,32.918L58.137,149.701L118.876,164Z'/></svg>",
- SEARCH_ICON_SVG: "<svg width='19px' height='18px' viewBox='0 0 19 18' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <g stroke='inherit' stroke-width='1' fill='none' fill-rule='evenodd'> <g transform='translate(-719.000000, -20.000000)' stroke-width='1.5'> <g transform='translate(0.000000, 1.000000)'> <g transform='translate(63.000000, 10.000000)'> <g transform='translate(657.000000, 10.000000)'> <circle cx='7' cy='7' r='7'></circle> <path d='M12.5,11.5 L16.5,15.5' stroke-linecap='round'></path> </g> </g> </g> </g> </g> </svg>",
- MENTIONS_ICON_SVG: "<svg width='20px' height='20px' viewBox='0 0 20 20' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <g stroke='none' stroke-width='1' fill='inherit' fill-rule='evenodd'> <g transform='translate(-1057.000000, -31.000000)' fill='inherit'> <g> <g transform='translate(1049.000000, 22.000000)'> <path d='M17.4296875,15.8867188 C15.9882812,15.8867188 15.1210938,17.0351562 15.1210938,18.96875 C15.1210938,20.8789062 15.9882812,22.0507812 17.4179688,22.0507812 C18.8945312,22.0507812 19.84375,20.8554688 19.84375,18.96875 C19.84375,17.0820312 18.90625,15.8867188 17.4296875,15.8867188 Z M17.8398438,9.125 C23.3242188,9.125 27.25,12.59375 27.25,17.7734375 C27.25,21.5117188 25.5625,23.9609375 22.7734375,23.9609375 C21.4023438,23.9609375 20.265625,23.1992188 20.078125,22.0390625 L19.9609375,22.0390625 C19.46875,23.2226562 18.4140625,23.8789062 17.0429688,23.8789062 C14.6054687,23.8789062 12.9648438,21.8867188 12.9648438,18.9101562 C12.9648438,16.0625 14.6171875,14.09375 16.9960938,14.09375 C18.25,14.09375 19.3632812,14.7382812 19.8085938,15.7460938 L19.9375,15.7460938 L19.9375,14.328125 L21.9179688,14.328125 L21.9179688,20.984375 C21.9179688,21.7578125 22.328125,22.2851562 23.171875,22.2851562 C24.4726562,22.2851562 25.421875,20.6679688 25.421875,17.8320312 C25.421875,13.5664062 22.2929688,10.7421875 17.7109375,10.7421875 C13.1640625,10.7421875 9.90625,14.140625 9.90625,18.96875 C9.90625,24.1367188 13.3515625,27.0429688 18.109375,27.0429688 C19.5625,27.0429688 21.0507812,26.84375 21.7773438,26.5390625 L21.7773438,28.15625 C20.78125,28.484375 19.4570312,28.671875 18.0273438,28.671875 C12.2382812,28.671875 8.078125,25.109375 8.078125,18.8984375 C8.078125,13.0625 12.0859375,9.125 17.8398438,9.125 Z'></path> </g> </g> </g></g></svg>",
- MENU_ICON_SVG: "<svg width='16px' height='10px' viewBox='0 0 16 10' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <g stroke='none' stroke-width='1' fill='inherit' fill-rule='evenodd'> <g transform='translate(-26.000000, -24.000000)' fill-rule='nonzero' fill='inherit'> <g transform='translate(26.000000, 24.000000)'> <path d='M1.5,0 L0.5,0 C0.224,0 0,0.224 0,0.5 L0,1.5 C0,1.776 0.224,2 0.5,2 L1.5,2 C1.776,2 2,1.776 2,1.5 L2,0.5 C2,0.224 1.776,0 1.5,0 Z'></path> <path d='M15.5,0 L3.5,0 C3.224,0 3,0.224 3,0.5 L3,1.5 C3,1.776 3.224,2 3.5,2 L15.5,2 C15.776,2 16,1.776 16,1.5 L16,0.5 C16,0.224 15.776,0 15.5,0 Z'></path> <path d='M1.5,4 L0.5,4 C0.224,4 0,4.224 0,4.5 L0,5.5 C0,5.776 0.224,6 0.5,6 L1.5,6 C1.776,6 2,5.776 2,5.5 L2,4.5 C2,4.224 1.776,4 1.5,4 Z'></path> <path d='M3.5,6 L11.5,6 C11.776,6 12,5.776 12,5.5 L12,4.5 C12,4.224 11.776,4 11.5,4 L3.5,4 C3.224,4 3,4.224 3,4.5 L3,5.5 C3,5.776 3.224,6 3.5,6 Z'></path> <path d='M1.5,8 L0.5,8 C0.224,8 0,8.224 0,8.5 L0,9.5 C0,9.776 0.224,10 0.5,10 L1.5,10 C1.776,10 2,9.776 2,9.5 L2,8.5 C2,8.224 1.776,8 1.5,8 Z'></path> <path d='M13.5,8 L3.5,8 C3.224,8 3,8.224 3,8.5 L3,9.5 C3,9.776 3.224,10 3.5,10 L13.5,10 C13.776,10 14,9.776 14,9.5 L14,8.5 C14,8.224 13.776,8 13.5,8 Z'></path> </g> </g> </g> </svg>",
- INFO_ICON_SVG: "<svg width='22px' height='22px' viewBox='0 0 22 22' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <g stroke='none' stroke-width='1' fill='inherit' fill-rule='evenodd'> <g transform='translate(-388.000000, -18.000000)' fill='inherit'> <g> <g transform='translate(381.000000, 11.000000)'> <g transform='translate(7.000000, 7.000000)'> <path d='M11,22 C4.92486775,22 0,17.0751322 0,11 C0,4.92486775 4.92486775,0 11,0 C17.0751322,0 22,4.92486775 22,11 C22,17.0751322 17.0751322,22 11,22 Z M11,20.7924685 C16.408231,20.7924685 20.7924685,16.408231 20.7924685,11 C20.7924685,5.59176898 16.408231,1.20753149 11,1.20753149 C5.59176898,1.20753149 1.20753149,5.59176898 1.20753149,11 C1.20753149,16.408231 5.59176898,20.7924685 11,20.7924685 Z M10.1572266,16.0625 L10.1572266,8.69335938 L11.3466797,8.69335938 L11.3466797,16.0625 L10.1572266,16.0625 Z M10.7519531,7.50390625 C10.3417969,7.50390625 10,7.16210938 10,6.75195312 C10,6.33496094 10.3417969,6 10.7519531,6 C11.1689453,6 11.5039062,6.33496094 11.5039062,6.75195312 C11.5039062,7.16210938 11.1689453,7.50390625 10.7519531,7.50390625 Z'></path> </g> </g> </g> </g> </g> </svg>",
- MESSAGE_ICON_SVG: "<svg width='18px' height='16px' viewBox='0 0 18 16' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <g stroke='none' stroke-width='1' fill='inherit' fill-rule='evenodd'> <g transform='translate(-200.000000, -174.000000)' fill='inherit'> <g transform='translate(200.000000, 174.000000)'> <path d='M7.2546625,1.42801356 C10.458475,1.42801356 12.999475,3.24528136 12.999475,5.52023729 C12.9895,8.04188475 10.6062625,9.89326102 7.40245,9.89326102 C7.40245,9.89326102 6.9134125,9.91229831 6.4115125,9.83747119 L5.82535,9.79622373 L5.15335,10.3586169 C4.997425,10.5397356 4.3199125,11.1095322 3.736375,11.4794373 C4.0915375,10.4598847 4.07605,10.1370441 4.07605,10.1370441 L4.1251375,9.49004068 L3.55315,9.19549153 C2.0986375,8.44616271 1.4444875,6.88616271 1.4444875,5.52023729 C1.4444875,3.24528136 4.05085,1.42801356 7.2546625,1.42801356 M7.2546625,0.370386441 C3.465475,0.370386441 0.3944875,2.65829831 0.3944875,5.52023729 C0.3944875,7.3028678 1.2623125,9.20342373 3.0751375,10.1370441 C3.0751375,10.1478847 3.07225,10.1560814 3.07225,10.1679797 C3.07225,10.9426915 2.43175,12.0048136 2.1794875,12.4429356 L2.1805375,12.4429356 C2.1605875,12.4902644 2.148775,12.5420881 2.148775,12.5973492 C2.148775,12.8141627 2.322025,12.9881424 2.5375375,12.9881424 C2.5693,12.9881424 2.6210125,12.9815322 2.6393875,12.9815322 C2.6446375,12.9815322 2.6467375,12.9815322 2.6462125,12.9831186 C3.986275,12.762339 5.9642125,11.2435864 6.2576875,10.8837288 C6.5585125,10.928678 6.761425,10.9358169 7.0136875,10.9358169 C7.120525,10.9358169 7.2347125,10.9342305 7.3696375,10.9342305 C11.1583,10.9342305 14.094625,8.75446102 14.049475,5.52023729 C14.049475,2.65829831 11.0435875,0.370386441 7.2546625,0.370386441'></path> <path d='M17.2055125,9.79172881 C17.2055125,8.35811525 16.6498,7.26532203 15.2624875,6.4451322 C15.228625,6.82614237 15.120475,7.23517966 15.0031375,7.59477288 C15.8998375,8.21903729 16.1555125,8.85995932 16.1555125,9.79172881 C16.1555125,10.9323797 15.62815,11.7597085 14.40175,12.3919051 L13.879375,12.653139 C13.879375,12.653139 13.9337125,14.0082237 14.0140375,14.3511593 C12.9895,13.5946915 12.6374875,12.9630237 12.6374875,12.9630237 L12.08545,13.0486915 C11.86705,13.0809492 11.276425,13.0812136 11.276425,13.0812136 C9.85,13.0812136 8.7929125,12.7388068 7.8909625,12.0278169 C8.135875,12.0124814 6.42805,12.0132746 6.3899875,12.0468542 C7.4326375,13.3297559 9.1373125,14.1388407 11.276425,14.1388407 C11.3927125,14.1388407 11.49115,14.1398983 11.58355,14.1398983 C11.801425,14.1398983 11.9773,14.1338169 12.237175,14.095478 C12.491275,14.4058915 13.914025,15.7728746 15.0724375,15.9629831 C15.0719125,15.9619254 15.073225,15.9619254 15.078475,15.9619254 C15.0939625,15.9619254 15.13885,15.967478 15.16615,15.967478 C15.3522625,15.967478 15.5024125,15.8167661 15.5024125,15.6293017 C15.5024125,15.5817085 15.49165,15.5367593 15.47485,15.4960407 L15.4759,15.4960407 C15.258025,15.117939 14.9159875,14.0129831 14.9159875,13.3435051 C14.9159875,13.3331932 14.9128375,13.3260542 14.9128375,13.3168 C16.4797,12.5095661 17.2055125,11.3321627 17.2055125,9.79172881'></path> </g> </g> </g> </svg>",
- SWITCH_CHANNEL_ICON_SVG: "<svg width='24px' height='24px' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <g stroke='none' stroke-width='1' fill='inherit' fill-rule='evenodd'> <g transform='translate(-32.000000, -982.000000)' fill-rule='nonzero' fill='inherit'> <g> <g transform='translate(0.000000, 961.000000)'> <g transform='translate(32.000000, 21.000000)'> <path d='M21.5,0.5 L2.5,0.5 C1.121,0.5 0,1.622 0,3 L0,21 C0,22.378 1.121,23.5 2.5,23.5 L21.5,23.5 C22.879,23.5 24,22.378 24,21 L24,3 C24,1.622 22.879,0.5 21.5,0.5 Z M2.5,1.5 L21.5,1.5 C22.327,1.5 23,2.173 23,3 L23,4.5 L1,4.5 L1,3 C1,2.173 1.673,1.5 2.5,1.5 Z M21.5,22.5 L2.5,22.5 C1.673,22.5 1,21.827 1,21 L1,5.5 L23,5.5 L23,21 C23,21.827 22.327,22.5 21.5,22.5 Z'></path> <circle cx='2.5' cy='3' r='1'></circle> <circle cx='4.5' cy='3' r='1'></circle> <circle cx='6.5' cy='3' r='1'></circle> <path d='M19.146,16.94 C19.673,16.263 20,15.423 20,14.5 C20,12.294 18.206,10.5 16,10.5 C13.794,10.5 12,12.294 12,14.5 C12,16.706 13.794,18.5 16,18.5 C16.922,18.5 17.762,18.174 18.439,17.647 L21.146,20.354 C21.244,20.451 21.372,20.5 21.5,20.5 C21.628,20.5 21.756,20.451 21.853,20.354 C22.048,20.159 22.048,19.842 21.853,19.647 L19.146,16.94 Z M13,14.5 C13,12.846 14.346,11.5 16,11.5 C17.654,11.5 19,12.846 19,14.5 C19,16.154 17.654,17.5 16,17.5 C14.346,17.5 13,16.154 13,14.5 Z'></path> <path d='M2.5,8.5 L7.5,8.5 C7.776,8.5 8,8.276 8,8 C8,7.724 7.776,7.5 7.5,7.5 L2.5,7.5 C2.224,7.5 2,7.724 2,8 C2,8.276 2.224,8.5 2.5,8.5 Z'></path> <path d='M10.5,8.5 L13.5,8.5 C13.776,8.5 14,8.276 14,8 C14,7.724 13.776,7.5 13.5,7.5 L10.5,7.5 C10.224,7.5 10,7.724 10,8 C10,8.276 10.224,8.5 10.5,8.5 Z'></path> <path d='M21.5,7.5 L16.5,7.5 C16.224,7.5 16,7.724 16,8 C16,8.276 16.224,8.5 16.5,8.5 L21.5,8.5 C21.776,8.5 22,8.276 22,8 C22,7.724 21.776,7.5 21.5,7.5 Z'></path> <path d='M2.5,11.5 L5.5,11.5 C5.776,11.5 6,11.276 6,11 C6,10.724 5.776,10.5 5.5,10.5 L2.5,10.5 C2.224,10.5 2,10.724 2,11 C2,11.276 2.224,11.5 2.5,11.5 Z'></path> <path d='M8.5,11.5 L12.5,11.5 C12.776,11.5 13,11.276 13,11 C13,10.724 12.776,10.5 12.5,10.5 L8.5,10.5 C8.224,10.5 8,10.724 8,11 C8,11.276 8.224,11.5 8.5,11.5 Z'></path> <path d='M10.5,13.5 L7.5,13.5 C7.224,13.5 7,13.724 7,14 C7,14.276 7.224,14.5 7.5,14.5 L10.5,14.5 C10.776,14.5 11,14.276 11,14 C11,13.724 10.776,13.5 10.5,13.5 Z'></path> <path d='M2.5,14.5 L4.5,14.5 C4.776,14.5 5,14.276 5,14 C5,13.724 4.776,13.5 4.5,13.5 L2.5,13.5 C2.224,13.5 2,13.724 2,14 C2,14.276 2.224,14.5 2.5,14.5 Z'></path> <path d='M2.5,17.5 L8.5,17.5 C8.776,17.5 9,17.276 9,17 C9,16.724 8.776,16.5 8.5,16.5 L2.5,16.5 C2.224,16.5 2,16.724 2,17 C2,17.276 2.224,17.5 2.5,17.5 Z'></path> <path d='M10.5,19.5 L2.5,19.5 C2.224,19.5 2,19.724 2,20 C2,20.276 2.224,20.5 2.5,20.5 L10.5,20.5 C10.776,20.5 11,20.276 11,20 C11,19.724 10.776,19.5 10.5,19.5 Z'></path> </g> </g> </g> </g> </g> </svg>",
- GLOBE_ICON_SVG: "<svg width='13px' height='13px' viewBox='0 0 14 14' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <g stroke='none' stroke-width='1' fill='inherit' fill-rule='evenodd'> <g transform='translate(-115.000000, -147.000000)' fill-rule='nonzero' fill='inherit'> <g transform='translate(95.000000, 0.000000)'> <g transform='translate(20.000000, 113.000000)'> <g transform='translate(0.000000, 34.000000)'> <path d='M10.409,0.893375 C9.40275,0.329875 8.24075,0.00875 7,0 C3.13075,0 0,3.140375 0,7 C0,10.521875 2.594375,13.42775 5.97625,13.93 C6.314875,13.974625 6.6535,14 7,14 C8.24075,14 9.40275,13.678875 10.409,13.1145 C12.551875,11.918375 14,9.6285 14,7 C13.99125,4.3715 12.551875,2.090375 10.409,0.893375 Z M11.554375,4.375 L9.431625,4.375 C9.302125,3.5 9.10875,2.736125 8.86725,2.085125 C10.003875,2.519125 10.9515,3.5 11.554375,4.375 Z M6.941375,1.73775 C6.960625,1.736875 6.979875,1.73425 7,1.73425 C7.020125,1.73425 7.039375,1.736875 7.058625,1.73775 C7.340375,2.172625 7.697375,3.5 7.92225,4.375 L6.07775,4.375 C6.302625,3.5 6.659625,2.172625 6.941375,1.73775 Z M1.81475,7.875 C1.7675,7.875 1.73425,7.29925 1.73425,7 C1.73425,6.70075 1.764875,6.125 1.813,6.125 L4.396875,6.125 C4.384625,6.125 4.375,6.7025 4.375,7 C4.375,7.2975 4.384625,7.875 4.396875,7.875 L1.81475,7.875 Z M4.354875,11.54475 C4.346125,11.54475 4.337375,11.54475 4.337375,11.536 C3.548125,11.07575 2.893625,10.5 2.436875,9.625 L4.568375,9.625 C4.697875,10.5 4.890375,11.262125 5.131875,11.91225 C4.8615,11.81075 4.599875,11.692625 4.354875,11.54475 Z M4.568375,4.375 L2.443875,4.375 C3.045875,3.5 3.994375,2.517375 5.131875,2.083375 C4.89125,2.734375 4.697875,3.5 4.568375,4.375 Z M7.0595,12.26225 C7.039375,12.26225 7.020125,12.26575 7,12.26575 C6.979875,12.26575 6.960625,12.26225 6.9405,12.26225 C6.65875,11.8265 6.302625,11.375 6.07775,9.625 L7.921375,9.625 C7.697375,11.375 7.34125,11.8265 7.0595,12.26225 Z M8.11125,7.875 L5.88875,7.875 C5.873875,7.875 5.8625,7.30625 5.8625,7 C5.8625,6.69375 5.873875,6.125 5.88875,6.125 L8.11125,6.125 C8.126125,6.125 8.1375,6.69375 8.1375,7 C8.1375,7.30625 8.126125,7.875 8.11125,7.875 Z M10.409,11.0075 C10.13075,11.242 9.828,11.45025 9.506875,11.631375 C9.30125,11.74075 9.086875,11.839625 8.8655,11.923625 C9.107,11.270875 9.30125,10.5 9.431625,9.625 L11.557875,9.625 C11.25425,10.5 10.8675,10.618125 10.409,11.0075 Z M9.603125,7.875 C9.615375,7.875 9.625,7.2975 9.625,7 C9.625,6.7025 9.615375,6.125 9.603125,6.125 L12.186125,6.125 C12.235125,6.125 12.26575,6.70075 12.26575,7 C12.26575,7.29925 12.233375,7.875 12.18525,7.875 L9.603125,7.875 Z'></path> </g> </g> </g> </g> </g> </svg>",
- LOCK_ICON_SVG: "<svg width='12px' height='13px' viewBox='0 0 13 15' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <g stroke='none' stroke-width='1' fill='inherit' fill-rule='evenodd'> <g transform='translate(-116.000000, -175.000000)' fill-rule='nonzero' fill='inherit'> <g transform='translate(95.000000, 0.000000)'> <g transform='translate(20.000000, 113.000000)'> <g transform='translate(1.000000, 62.000000)'> <path d='M12.0714286,6.5 L11.1428571,6.5 L11.1428571,4.64285714 C11.1428571,2.07814286 9.06471429,0 6.5,0 C3.93528571,0 1.85714286,2.07814286 1.85714286,4.64285714 L1.85714286,6.5 L0.928571429,6.5 C0.415071429,6.5 0,7.00792857 0,7.52142857 L0,13.9285714 C0,14.4420714 0.415071429,14.8571429 0.928571429,14.8571429 L12.0714286,14.8571429 C12.5849286,14.8571429 13,14.4420714 13,13.9285714 L13,7.52142857 C13,7.00792857 12.5849286,6.5 12.0714286,6.5 Z M6.5,1.85714286 C8.03585714,1.85714286 9.28571429,3.107 9.28571429,4.64285714 L9.28571429,6.5 L8.35714286,6.5 L4.64285714,6.5 L3.71428571,6.5 L3.71428571,4.64285714 C3.71428571,3.107 4.96414286,1.85714286 6.5,1.85714286 Z'></path> </g> </g> </g> </g> </g> </svg>",
- THEMES: {
- default: {
- type: 'Mattermost',
- sidebarBg: '#145dbf',
- sidebarText: '#ffffff',
- sidebarUnreadText: '#ffffff',
- sidebarTextHoverBg: '#4578bf',
- sidebarTextActiveBorder: '#579eff',
- sidebarTextActiveColor: '#ffffff',
- sidebarHeaderBg: '#1153ab',
- sidebarHeaderTextColor: '#ffffff',
- onlineIndicator: '#06d6a0',
- awayIndicator: '#ffbc42',
- mentionBj: '#ffffff',
- mentionColor: '#145dbf',
- centerChannelBg: '#ffffff',
- centerChannelColor: '#3d3c40',
- newMessageSeparator: '#ff8800',
- linkColor: '#2389d7',
- buttonBg: '#166de0',
- buttonColor: '#ffffff',
- errorTextColor: '#fd5960',
- mentionHighlightBg: '#ffe577',
- mentionHighlightLink: '#166de0',
- codeTheme: 'github',
- image: mattermostThemeImage
- },
- organization: {
- type: 'Organization',
- sidebarBg: '#2071a7',
- sidebarText: '#ffffff',
- sidebarUnreadText: '#ffffff',
- sidebarTextHoverBg: '#136197',
- sidebarTextActiveBorder: '#7ab0d6',
- sidebarTextActiveColor: '#ffffff',
- sidebarHeaderBg: '#2f81b7',
- sidebarHeaderTextColor: '#ffffff',
- onlineIndicator: '#7dbe00',
- awayIndicator: '#dcbd4e',
- mentionBj: '#fbfbfb',
- mentionColor: '#2071f7',
- centerChannelBg: '#f2f4f8',
- centerChannelColor: '#333333',
- newMessageSeparator: '#ff8800',
- linkColor: '#2f81b7',
- buttonBg: '#1dacfc',
- buttonColor: '#ffffff',
- errorTextColor: '#a94442',
- mentionHighlightBg: '#f3e197',
- mentionHighlightLink: '#2f81b7',
- codeTheme: 'github',
- image: defaultThemeImage
- },
- mattermostDark: {
- type: 'Mattermost Dark',
- sidebarBg: '#1b2c3e',
- sidebarText: '#ffffff',
- sidebarUnreadText: '#ffffff',
- sidebarTextHoverBg: '#4a5664',
- sidebarTextActiveBorder: '#66b9a7',
- sidebarTextActiveColor: '#ffffff',
- sidebarHeaderBg: '#1b2c3e',
- sidebarHeaderTextColor: '#ffffff',
- onlineIndicator: '#65dcc8',
- awayIndicator: '#c1b966',
- mentionBj: '#b74a4a',
- mentionColor: '#ffffff',
- centerChannelBg: '#2f3e4e',
- centerChannelColor: '#dddddd',
- newMessageSeparator: '#5de5da',
- linkColor: '#a4ffeb',
- buttonBg: '#4cbba4',
- buttonColor: '#ffffff',
- errorTextColor: '#ff6461',
- mentionHighlightBg: '#984063',
- mentionHighlightLink: '#a4ffeb',
- codeTheme: 'solarized-dark',
- image: mattermostDarkThemeImage
- },
- windows10: {
- type: 'Windows Dark',
- sidebarBg: '#171717',
- sidebarText: '#ffffff',
- sidebarUnreadText: '#ffffff',
- sidebarTextHoverBg: '#302e30',
- sidebarTextActiveBorder: '#196caf',
- sidebarTextActiveColor: '#ffffff',
- sidebarHeaderBg: '#1f1f1f',
- sidebarHeaderTextColor: '#ffffff',
- onlineIndicator: '#399fff',
- awayIndicator: '#c1b966',
- mentionBj: '#0177e7',
- mentionColor: '#ffffff',
- centerChannelBg: '#1f1f1f',
- centerChannelColor: '#dddddd',
- newMessageSeparator: '#cc992d',
- linkColor: '#0d93ff',
- buttonBg: '#0177e7',
- buttonColor: '#ffffff',
- errorTextColor: '#ff6461',
- mentionHighlightBg: '#784098',
- mentionHighlightLink: '#a4ffeb',
- codeTheme: 'monokai',
- image: windows10ThemeImage
- }
- },
- THEME_ELEMENTS: [
- {
- group: 'sidebarElements',
- id: 'sidebarBg',
- uiName: 'Sidebar BG'
- },
- {
- group: 'sidebarElements',
- id: 'sidebarText',
- uiName: 'Sidebar Text'
- },
- {
- group: 'sidebarElements',
- id: 'sidebarHeaderBg',
- uiName: 'Sidebar Header BG'
- },
- {
- group: 'sidebarElements',
- id: 'sidebarHeaderTextColor',
- uiName: 'Sidebar Header Text'
- },
- {
- group: 'sidebarElements',
- id: 'sidebarUnreadText',
- uiName: 'Sidebar Unread Text'
- },
- {
- group: 'sidebarElements',
- id: 'sidebarTextHoverBg',
- uiName: 'Sidebar Text Hover BG'
- },
- {
- group: 'sidebarElements',
- id: 'sidebarTextActiveBorder',
- uiName: 'Sidebar Text Active Border'
- },
- {
- group: 'sidebarElements',
- id: 'sidebarTextActiveColor',
- uiName: 'Sidebar Text Active Color'
- },
- {
- group: 'sidebarElements',
- id: 'onlineIndicator',
- uiName: 'Online Indicator'
- },
- {
- group: 'sidebarElements',
- id: 'awayIndicator',
- uiName: 'Away Indicator'
- },
- {
- group: 'sidebarElements',
- id: 'mentionBj',
- uiName: 'Mention Jewel BG'
- },
- {
- group: 'sidebarElements',
- id: 'mentionColor',
- uiName: 'Mention Jewel Text'
- },
- {
- group: 'centerChannelElements',
- id: 'centerChannelBg',
- uiName: 'Center Channel BG'
- },
- {
- group: 'centerChannelElements',
- id: 'centerChannelColor',
- uiName: 'Center Channel Text'
- },
- {
- group: 'centerChannelElements',
- id: 'newMessageSeparator',
- uiName: 'New Message Separator'
- },
- {
- group: 'centerChannelElements',
- id: 'errorTextColor',
- uiName: 'Error Text Color'
- },
- {
- group: 'centerChannelElements',
- id: 'mentionHighlightBg',
- uiName: 'Mention Highlight BG'
- },
- {
- group: 'linkAndButtonElements',
- id: 'linkColor',
- uiName: 'Link Color'
- },
- {
- group: 'centerChannelElements',
- id: 'mentionHighlightLink',
- uiName: 'Mention Highlight Link'
- },
- {
- group: 'linkAndButtonElements',
- id: 'buttonBg',
- uiName: 'Button BG'
- },
- {
- group: 'linkAndButtonElements',
- id: 'buttonColor',
- uiName: 'Button Text'
- },
- {
- group: 'centerChannelElements',
- id: 'codeTheme',
- uiName: 'Code Theme',
- themes: [
- {
- id: 'solarized-dark',
- uiName: 'Solarized Dark',
- cssURL: solarizedDarkCSS,
- iconURL: solarizedDarkIcon
- },
- {
- id: 'solarized-light',
- uiName: 'Solarized Light',
- cssURL: solarizedLightCSS,
- iconURL: solarizedLightIcon
- },
- {
- id: 'github',
- uiName: 'GitHub',
- cssURL: githubCSS,
- iconURL: githubIcon
- },
- {
- id: 'monokai',
- uiName: 'Monokai',
- cssURL: monokaiCSS,
- iconURL: monokaiIcon
- }
- ]
- }
- ],
- DEFAULT_CODE_THEME: 'github',
- KeyCodes: {
- BACKSPACE: 8,
- TAB: 9,
- ENTER: 13,
- SHIFT: 16,
- CTRL: 17,
- ALT: 18,
- CAPS_LOCK: 20,
- ESCAPE: 27,
- SPACE: 32,
- PAGE_UP: 33,
- PAGE_DOWN: 34,
- END: 35,
- HOME: 36,
- LEFT: 37,
- UP: 38,
- RIGHT: 39,
- DOWN: 40,
- INSERT: 45,
- DELETE: 46,
- ZERO: 48,
- ONE: 49,
- TWO: 50,
- THREE: 51,
- FOUR: 52,
- FIVE: 53,
- SIX: 54,
- SEVEN: 55,
- EIGHT: 56,
- NINE: 57,
- A: 65,
- B: 66,
- C: 67,
- D: 68,
- E: 69,
- F: 70,
- G: 71,
- H: 72,
- I: 73,
- J: 74,
- K: 75,
- L: 76,
- M: 77,
- N: 78,
- O: 79,
- P: 80,
- Q: 81,
- R: 82,
- S: 83,
- T: 84,
- U: 85,
- V: 86,
- W: 87,
- X: 88,
- Y: 89,
- Z: 90,
- CMD: 91,
- MENU: 93,
- NUMPAD_0: 96,
- NUMPAD_1: 97,
- NUMPAD_2: 98,
- NUMPAD_3: 99,
- NUMPAD_4: 100,
- NUMPAD_5: 101,
- NUMPAD_6: 102,
- NUMPAD_7: 103,
- NUMPAD_8: 104,
- NUMPAD_9: 105,
- MULTIPLY: 106,
- ADD: 107,
- SUBTRACT: 109,
- DECIMAL: 110,
- DIVIDE: 111,
- F1: 112,
- F2: 113,
- F3: 114,
- F4: 115,
- F5: 116,
- F6: 117,
- F7: 118,
- F8: 119,
- F9: 120,
- F10: 121,
- F11: 122,
- F12: 123,
- NUM_LOCK: 144,
- SEMICOLON: 186,
- EQUAL: 187,
- COMMA: 188,
- DASH: 189,
- PERIOD: 190,
- FORWARD_SLASH: 191,
- TILDE: 192,
- OPEN_BRACKET: 219,
- BACK_SLASH: 220,
- CLOSE_BRACKET: 221
- },
- CODE_PREVIEW_MAX_FILE_SIZE: 500000, // 500 KB
- HighlightedLanguages: {
- actionscript: {name: 'ActionScript', extensions: ['as'], aliases: ['as', 'as3']},
- applescript: {name: 'AppleScript', extensions: ['applescript', 'osascript', 'scpt']},
- bash: {name: 'Bash', extensions: ['bash', 'sh', 'zsh']},
- clojure: {name: 'Clojure', extensions: ['clj', 'boot', 'cl2', 'cljc', 'cljs', 'cljs.hl', 'cljscm', 'cljx', 'hic']},
- coffeescript: {name: 'CoffeeScript', extensions: ['coffee', '_coffee', 'cake', 'cjsx', 'cson', 'iced'], aliases: ['coffee', 'coffee-script']},
- cpp: {name: 'C/C++', extensions: ['cpp', 'c', 'cc', 'h', 'c++', 'h++', 'hpp'], aliases: ['c++']},
- cs: {name: 'C#', extensions: ['cs', 'csharp'], aliases: ['c#', 'csharp']},
- css: {name: 'CSS', extensions: ['css']},
- d: {name: 'D', extensions: ['d', 'di'], aliases: ['dlang']},
- dart: {name: 'Dart', extensions: ['dart']},
- delphi: {name: 'Delphi', extensions: ['delphi', 'dpr', 'dfm', 'pas', 'pascal', 'freepascal', 'lazarus', 'lpr', 'lfm']},
- diff: {name: 'Diff', extensions: ['diff', 'patch'], aliases: ['patch', 'udiff']},
- django: {name: 'Django', extensions: ['django', 'jinja']},
- dockerfile: {name: 'Dockerfile', extensions: ['dockerfile', 'docker'], aliases: ['docker']},
- erlang: {name: 'Erlang', extensions: ['erl'], aliases: ['erl']},
- fortran: {name: 'Fortran', extensions: ['f90', 'f95']},
- fsharp: {name: 'F#', extensions: ['fsharp', 'fs']},
- gcode: {name: 'G-Code', extensions: ['gcode', 'nc']},
- go: {name: 'Go', extensions: ['go'], aliases: ['golang']},
- groovy: {name: 'Groovy', extensions: ['groovy']},
- handlebars: {name: 'Handlebars', extensions: ['handlebars', 'hbs', 'html.hbs', 'html.handlebars'], aliases: ['hbs', 'mustache']},
- haskell: {name: 'Haskell', extensions: ['hs'], aliases: ['hs']},
- haxe: {name: 'Haxe', extensions: ['hx']},
- java: {name: 'Java', extensions: ['java', 'jsp']},
- javascript: {name: 'JavaScript', extensions: ['js', 'jsx'], aliases: ['js']},
- json: {name: 'JSON', extensions: ['json']},
- julia: {name: 'Julia', extensions: ['jl'], aliases: ['jl']},
- kotlin: {name: 'Kotlin', extensions: ['kt', 'ktm', 'kts']},
- less: {name: 'Less', extensions: ['less']},
- lisp: {name: 'Lisp', extensions: ['lisp']},
- lua: {name: 'Lua', extensions: ['lua']},
- makefile: {name: 'Makefile', extensions: ['mk', 'mak'], aliases: ['make', 'mf', 'gnumake', 'bsdmake']},
- markdown: {name: 'Markdown', extensions: ['md', 'mkdown', 'mkd'], aliases: ['md', 'mkd']},
- matlab: {name: 'Matlab', extensions: ['matlab', 'm'], aliases: ['m']},
- objectivec: {name: 'Objective C', extensions: ['mm', 'objc', 'obj-c'], aliases: ['objective_c', 'objc']},
- ocaml: {name: 'OCaml', extensions: ['ml']},
- perl: {name: 'Perl', extensions: ['perl', 'pl'], aliases: ['pl']},
- php: {name: 'PHP', extensions: ['php', 'php3', 'php4', 'php5', 'php6'], aliases: ['php3', 'php4', 'php5']},
- powershell: {name: 'PowerShell', extensions: ['ps', 'ps1'], aliases: ['posh']},
- puppet: {name: 'Puppet', extensions: ['pp'], aliases: ['pp']},
- python: {name: 'Python', extensions: ['py', 'gyp'], aliases: ['py']},
- r: {name: 'R', extensions: ['r'], aliases: ['r', 's']},
- ruby: {name: 'Ruby', extensions: ['ruby', 'rb', 'gemspec', 'podspec', 'thor', 'irb'], aliases: ['rb']},
- rust: {name: 'Rust', extensions: ['rs'], aliases: ['rs']},
- scala: {name: 'Scala', extensions: ['scala']},
- scheme: {name: 'Scheme', extensions: ['scm', 'sld']},
- scss: {name: 'SCSS', extensions: ['scss']},
- smalltalk: {name: 'Smalltalk', extensions: ['st'], aliases: ['st', 'squeak']},
- sql: {name: 'SQL', extensions: ['sql']},
- swift: {name: 'Swift', extensions: ['swift']},
- tex: {name: 'TeX', extensions: ['tex'], aliases: ['latex']},
- text: {name: 'Text', extensions: ['txt']},
- vbnet: {name: 'VB.Net', extensions: ['vbnet', 'vb', 'bas'], aliases: ['vb', 'visualbasic']},
- vbscript: {name: 'VBScript', extensions: ['vbs']},
- verilog: {name: 'Verilog', extensions: ['v', 'veo']},
- xml: {name: 'HTML, XML', extensions: ['xml', 'html', 'xhtml', 'rss', 'atom', 'xsl', 'plist']},
- yaml: {name: 'YAML', extensions: ['yaml'], aliases: ['yml']}
- },
- PostsViewJumpTypes: {
- BOTTOM: 1,
- POST: 2,
- SIDEBAR_OPEN: 3
- },
- NotificationPrefs: {
- MENTION: 'mention'
- },
- Integrations: {
- COMMAND: 'commands',
- INCOMING_WEBHOOK: 'incoming_webhooks',
- OUTGOING_WEBHOOK: 'outgoing_webhooks',
- OAUTH_APP: 'oauth2-apps'
- },
- FeatureTogglePrefix: 'feature_enabled_',
- PRE_RELEASE_FEATURES: {
- MARKDOWN_PREVIEW: {
- label: 'markdown_preview', // github issue: https://github.com/mattermost/platform/pull/1389
- description: 'Show markdown preview option in message input box'
- },
- EMBED_PREVIEW: {
- label: 'embed_preview',
- description: 'Show preview snippet of links below message'
- },
- WEBRTC_PREVIEW: {
- label: 'webrtc_preview',
- description: 'Enable WebRTC one on one calls'
- }
- },
- OVERLAY_TIME_DELAY_SMALL: 100,
- OVERLAY_TIME_DELAY: 400,
- WEBRTC_TIME_DELAY: 750,
- WEBRTC_CLEAR_ERROR_DELAY: 15000,
- DEFAULT_MAX_USERS_PER_TEAM: 50,
- MIN_TEAMNAME_LENGTH: 2,
- DEFAULT_MAX_CHANNELS_PER_TEAM: 2000,
- DEFAULT_MAX_NOTIFICATIONS_PER_CHANNEL: 1000,
- MAX_TEAMNAME_LENGTH: 15,
- MAX_TEAMDESCRIPTION_LENGTH: 50,
- MIN_CHANNELNAME_LENGTH: 2,
- MAX_CHANNELNAME_LENGTH: 22,
- MIN_USERNAME_LENGTH: 3,
- MAX_USERNAME_LENGTH: 22,
- MAX_NICKNAME_LENGTH: 22,
- MIN_PASSWORD_LENGTH: 5,
- MAX_PASSWORD_LENGTH: 64,
- MAX_POSITION_LENGTH: 35,
- MIN_TRIGGER_LENGTH: 1,
- MAX_TRIGGER_LENGTH: 128,
- MAX_SITENAME_LENGTH: 30,
- TIME_SINCE_UPDATE_INTERVAL: 30000,
- MIN_HASHTAG_LINK_LENGTH: 3,
- CHANNEL_SCROLL_ADJUSTMENT: 100,
- EMOJI_PATH: '/static/emoji',
- RECENT_EMOJI_KEY: 'recentEmojis',
- DEFAULT_WEBHOOK_LOGO: logoWebhook,
- MHPNS: 'https://push.mattermost.com',
- MTPNS: 'http://push-test.mattermost.com',
- BOT_NAME: 'BOT',
- MAX_PREV_MSGS: 100,
- POST_COLLAPSE_TIMEOUT: 1000 * 60 * 5, // five minutes
- PERMISSIONS_ALL: 'all',
- PERMISSIONS_CHANNEL_ADMIN: 'channel_admin',
- PERMISSIONS_TEAM_ADMIN: 'team_admin',
- PERMISSIONS_SYSTEM_ADMIN: 'system_admin',
- PERMISSIONS_DELETE_POST_ALL: 'all',
- PERMISSIONS_DELETE_POST_TEAM_ADMIN: 'team_admin',
- PERMISSIONS_DELETE_POST_SYSTEM_ADMIN: 'system_admin',
- ALLOW_EDIT_POST_ALWAYS: 'always',
- ALLOW_EDIT_POST_NEVER: 'never',
- ALLOW_EDIT_POST_TIME_LIMIT: 'time_limit',
- DEFAULT_POST_EDIT_TIME_LIMIT: 300,
- MENTION_CHANNELS: 'mention.channels',
- MENTION_MORE_CHANNELS: 'mention.morechannels',
- MENTION_MEMBERS: 'mention.members',
- MENTION_NONMEMBERS: 'mention.nonmembers',
- MENTION_SPECIAL: 'mention.special',
- DEFAULT_NOTIFICATION_DURATION: 5000,
- STATUS_INTERVAL: 60000,
- AUTOCOMPLETE_TIMEOUT: 100,
- ANIMATION_TIMEOUT: 1000,
- SEARCH_TIMEOUT_MILLISECONDS: 100,
- DIAGNOSTICS_SEGMENT_KEY: 'fwb7VPbFeQ7SKp3wHm1RzFUuXZudqVok',
- TEST_ID_COUNT: 0,
- CENTER: 'center',
- RHS: 'rhs',
- RHS_ROOT: 'rhsroot',
- TEAMMATE_NAME_DISPLAY: {
- SHOW_USERNAME: 'username',
- SHOW_NICKNAME_FULLNAME: 'nickname_full_name',
- SHOW_FULLNAME: 'full_name'
- },
- SEARCH_POST: 'searchpost'
-};
-
-export default Constants;
diff --git a/webapp/utils/delayed_action.jsx b/webapp/utils/delayed_action.jsx
deleted file mode 100644
index 3d64df51d..000000000
--- a/webapp/utils/delayed_action.jsx
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-export default class DelayedAction {
- constructor(action) {
- this.action = action;
-
- this.timer = -1;
-
- // bind fire since it doesn't get passed the correct this value with setTimeout
- this.fire = this.fire.bind(this);
- }
-
- fire() {
- this.action();
-
- this.timer = -1;
- }
-
- fireAfter(timeout) {
- if (this.timer >= 0) {
- window.clearTimeout(this.timer);
- }
-
- this.timer = window.setTimeout(this.fire, timeout);
- }
-
- cancel() {
- window.clearTimeout(this.timer);
- }
-}
diff --git a/webapp/utils/emoji.jsx b/webapp/utils/emoji.jsx
deleted file mode 100644
index 36205d127..000000000
--- a/webapp/utils/emoji.jsx
+++ /dev/null
@@ -1,15 +0,0 @@
-// This file is automatically generated via `make emojis`. Do not modify it manually.
-
-/* eslint-disable */
-
-export const Emojis = [{"aliases":["grinning"],"filename":"1f600","category":"people"},{"aliases":["smiley"],"filename":"1f603","category":"people"},{"aliases":["smile"],"filename":"1f604","category":"people"},{"aliases":["grin"],"filename":"1f601","category":"people"},{"aliases":["laughing","satisfied"],"filename":"1f606","category":"people"},{"aliases":["sweat_smile"],"filename":"1f605","category":"people"},{"aliases":["joy"],"filename":"1f602","category":"people"},{"aliases":["rofl"],"filename":"1f923","category":"people"},{"aliases":["relaxed"],"filename":"263a-fe0f","category":"people"},{"aliases":["blush"],"filename":"1f60a","category":"people"},{"aliases":["innocent"],"filename":"1f607","category":"people"},{"aliases":["slightly_smiling_face"],"filename":"1f642","category":"people"},{"aliases":["upside_down_face"],"filename":"1f643","category":"people"},{"aliases":["wink"],"filename":"1f609","category":"people"},{"aliases":["relieved"],"filename":"1f60c","category":"people"},{"aliases":["heart_eyes"],"filename":"1f60d","category":"people"},{"aliases":["kissing_heart"],"filename":"1f618","category":"people"},{"aliases":["kissing"],"filename":"1f617","category":"people"},{"aliases":["kissing_smiling_eyes"],"filename":"1f619","category":"people"},{"aliases":["kissing_closed_eyes"],"filename":"1f61a","category":"people"},{"aliases":["yum"],"filename":"1f60b","category":"people"},{"aliases":["stuck_out_tongue_winking_eye"],"filename":"1f61c","category":"people"},{"aliases":["stuck_out_tongue_closed_eyes"],"filename":"1f61d","category":"people"},{"aliases":["stuck_out_tongue"],"filename":"1f61b","category":"people"},{"aliases":["money_mouth_face"],"filename":"1f911","category":"people"},{"aliases":["hugs"],"filename":"1f917","category":"people"},{"aliases":["nerd_face"],"filename":"1f913","category":"people"},{"aliases":["sunglasses"],"filename":"1f60e","category":"people"},{"aliases":["clown_face"],"filename":"1f921","category":"people"},{"aliases":["cowboy_hat_face"],"filename":"1f920","category":"people"},{"aliases":["smirk"],"filename":"1f60f","category":"people"},{"aliases":["unamused"],"filename":"1f612","category":"people"},{"aliases":["disappointed"],"filename":"1f61e","category":"people"},{"aliases":["pensive"],"filename":"1f614","category":"people"},{"aliases":["worried"],"filename":"1f61f","category":"people"},{"aliases":["confused"],"filename":"1f615","category":"people"},{"aliases":["slightly_frowning_face"],"filename":"1f641","category":"people"},{"aliases":["frowning_face"],"filename":"2639-fe0f","category":"people"},{"aliases":["persevere"],"filename":"1f623","category":"people"},{"aliases":["confounded"],"filename":"1f616","category":"people"},{"aliases":["tired_face"],"filename":"1f62b","category":"people"},{"aliases":["weary"],"filename":"1f629","category":"people"},{"aliases":["triumph"],"filename":"1f624","category":"people"},{"aliases":["angry"],"filename":"1f620","category":"people"},{"aliases":["rage","pout"],"filename":"1f621","category":"people"},{"aliases":["no_mouth"],"filename":"1f636","category":"people"},{"aliases":["neutral_face"],"filename":"1f610","category":"people"},{"aliases":["expressionless"],"filename":"1f611","category":"people"},{"aliases":["hushed"],"filename":"1f62f","category":"people"},{"aliases":["frowning"],"filename":"1f626","category":"people"},{"aliases":["anguished"],"filename":"1f627","category":"people"},{"aliases":["open_mouth"],"filename":"1f62e","category":"people"},{"aliases":["astonished"],"filename":"1f632","category":"people"},{"aliases":["dizzy_face"],"filename":"1f635","category":"people"},{"aliases":["flushed"],"filename":"1f633","category":"people"},{"aliases":["scream"],"filename":"1f631","category":"people"},{"aliases":["fearful"],"filename":"1f628","category":"people"},{"aliases":["cold_sweat"],"filename":"1f630","category":"people"},{"aliases":["cry"],"filename":"1f622","category":"people"},{"aliases":["disappointed_relieved"],"filename":"1f625","category":"people"},{"aliases":["drooling_face"],"filename":"1f924","category":"people"},{"aliases":["sob"],"filename":"1f62d","category":"people"},{"aliases":["sweat"],"filename":"1f613","category":"people"},{"aliases":["sleepy"],"filename":"1f62a","category":"people"},{"aliases":["sleeping"],"filename":"1f634","category":"people"},{"aliases":["roll_eyes"],"filename":"1f644","category":"people"},{"aliases":["thinking"],"filename":"1f914","category":"people"},{"aliases":["lying_face"],"filename":"1f925","category":"people"},{"aliases":["grimacing"],"filename":"1f62c","category":"people"},{"aliases":["zipper_mouth_face"],"filename":"1f910","category":"people"},{"aliases":["nauseated_face"],"filename":"1f922","category":"people"},{"aliases":["sneezing_face"],"filename":"1f927","category":"people"},{"aliases":["mask"],"filename":"1f637","category":"people"},{"aliases":["face_with_thermometer"],"filename":"1f912","category":"people"},{"aliases":["face_with_head_bandage"],"filename":"1f915","category":"people"},{"aliases":["smiling_imp"],"filename":"1f608","category":"people"},{"aliases":["imp"],"filename":"1f47f","category":"people"},{"aliases":["japanese_ogre"],"filename":"1f479","category":"people"},{"aliases":["japanese_goblin"],"filename":"1f47a","category":"people"},{"aliases":["hankey","poop","shit"],"filename":"1f4a9","category":"people"},{"aliases":["ghost"],"filename":"1f47b","category":"people"},{"aliases":["skull"],"filename":"1f480","category":"people"},{"aliases":["skull_and_crossbones"],"filename":"2620-fe0f","category":"people"},{"aliases":["alien"],"filename":"1f47d","category":"people"},{"aliases":["space_invader"],"filename":"1f47e","category":"people"},{"aliases":["robot"],"filename":"1f916","category":"people"},{"aliases":["jack_o_lantern"],"filename":"1f383","category":"people"},{"aliases":["smiley_cat"],"filename":"1f63a","category":"people"},{"aliases":["smile_cat"],"filename":"1f638","category":"people"},{"aliases":["joy_cat"],"filename":"1f639","category":"people"},{"aliases":["heart_eyes_cat"],"filename":"1f63b","category":"people"},{"aliases":["smirk_cat"],"filename":"1f63c","category":"people"},{"aliases":["kissing_cat"],"filename":"1f63d","category":"people"},{"aliases":["scream_cat"],"filename":"1f640","category":"people"},{"aliases":["crying_cat_face"],"filename":"1f63f","category":"people"},{"aliases":["pouting_cat"],"filename":"1f63e","category":"people"},{"aliases":["open_hands"],"filename":"1f450","category":"people"},{"aliases":["raised_hands"],"filename":"1f64c","category":"people"},{"aliases":["clap"],"filename":"1f44f","category":"people"},{"aliases":["pray"],"filename":"1f64f","category":"people"},{"aliases":["handshake"],"filename":"1f91d","category":"people"},{"aliases":["+1","thumbsup"],"filename":"1f44d","category":"people"},{"aliases":["-1","thumbsdown"],"filename":"1f44e","category":"people"},{"aliases":["fist_oncoming","facepunch","punch"],"filename":"1f44a","category":"people"},{"aliases":["fist_raised","fist"],"filename":"270a","category":"people"},{"aliases":["fist_left"],"filename":"1f91b","category":"people"},{"aliases":["fist_right"],"filename":"1f91c","category":"people"},{"aliases":["crossed_fingers"],"filename":"1f91e","category":"people"},{"aliases":["v"],"filename":"270c-fe0f","category":"people"},{"aliases":["metal"],"filename":"1f918","category":"people"},{"aliases":["ok_hand"],"filename":"1f44c","category":"people"},{"aliases":["point_left"],"filename":"1f448","category":"people"},{"aliases":["point_right"],"filename":"1f449","category":"people"},{"aliases":["point_up_2"],"filename":"1f446","category":"people"},{"aliases":["point_down"],"filename":"1f447","category":"people"},{"aliases":["point_up"],"filename":"261d-fe0f","category":"people"},{"aliases":["hand","raised_hand"],"filename":"270b","category":"people"},{"aliases":["raised_back_of_hand"],"filename":"1f91a","category":"people"},{"aliases":["raised_hand_with_fingers_splayed"],"filename":"1f590","category":"people"},{"aliases":["vulcan_salute"],"filename":"1f596","category":"people"},{"aliases":["wave"],"filename":"1f44b","category":"people"},{"aliases":["call_me_hand"],"filename":"1f919","category":"people"},{"aliases":["muscle"],"filename":"1f4aa","category":"people"},{"aliases":["middle_finger","fu"],"filename":"1f595","category":"people"},{"aliases":["writing_hand"],"filename":"270d-fe0f","category":"people"},{"aliases":["selfie"],"filename":"1f933","category":"people"},{"aliases":["nail_care"],"filename":"1f485","category":"people"},{"aliases":["ring"],"filename":"1f48d","category":"people"},{"aliases":["lipstick"],"filename":"1f484","category":"people"},{"aliases":["kiss"],"filename":"1f48b","category":"people"},{"aliases":["lips"],"filename":"1f444","category":"people"},{"aliases":["tongue"],"filename":"1f445","category":"people"},{"aliases":["ear"],"filename":"1f442","category":"people"},{"aliases":["nose"],"filename":"1f443","category":"people"},{"aliases":["footprints"],"filename":"1f463","category":"people"},{"aliases":["eye"],"filename":"1f441","category":"people"},{"aliases":["eyes"],"filename":"1f440","category":"people"},{"aliases":["speaking_head"],"filename":"1f5e3","category":"people"},{"aliases":["bust_in_silhouette"],"filename":"1f464","category":"people"},{"aliases":["busts_in_silhouette"],"filename":"1f465","category":"people"},{"aliases":["baby"],"filename":"1f476","category":"people"},{"aliases":["boy"],"filename":"1f466","category":"people"},{"aliases":["girl"],"filename":"1f467","category":"people"},{"aliases":["man"],"filename":"1f468","category":"people"},{"aliases":["woman"],"filename":"1f469","category":"people"},{"aliases":["blonde_woman"],"filename":"1f471-200d-2640-fe0f","category":"people"},{"aliases":["blonde_man","person_with_blond_hair"],"filename":"1f471","category":"people"},{"aliases":["older_man"],"filename":"1f474","category":"people"},{"aliases":["older_woman"],"filename":"1f475","category":"people"},{"aliases":["man_with_gua_pi_mao"],"filename":"1f472","category":"people"},{"aliases":["woman_with_turban"],"filename":"1f473-200d-2640-fe0f","category":"people"},{"aliases":["man_with_turban"],"filename":"1f473","category":"people"},{"aliases":["policewoman"],"filename":"1f46e-200d-2640-fe0f","category":"people"},{"aliases":["policeman","cop"],"filename":"1f46e","category":"people"},{"aliases":["construction_worker_woman"],"filename":"1f477-200d-2640-fe0f","category":"people"},{"aliases":["construction_worker_man","construction_worker"],"filename":"1f477","category":"people"},{"aliases":["guardswoman"],"filename":"1f482-200d-2640-fe0f","category":"people"},{"aliases":["guardsman"],"filename":"1f482","category":"people"},{"aliases":["female_detective"],"filename":"1f575-fe0f-200d-2640-fe0f","category":"people"},{"aliases":["male_detective","detective"],"filename":"1f575-fe0f","category":"people"},{"aliases":["woman_health_worker"],"filename":"1f469-200d-2695-fe0f","category":"people"},{"aliases":["man_health_worker"],"filename":"1f468-200d-2695-fe0f","category":"people"},{"aliases":["woman_farmer"],"filename":"1f469-200d-1f33e","category":"people"},{"aliases":["man_farmer"],"filename":"1f468-200d-1f33e","category":"people"},{"aliases":["woman_cook"],"filename":"1f469-200d-1f373","category":"people"},{"aliases":["man_cook"],"filename":"1f468-200d-1f373","category":"people"},{"aliases":["woman_student"],"filename":"1f469-200d-1f393","category":"people"},{"aliases":["man_student"],"filename":"1f468-200d-1f393","category":"people"},{"aliases":["woman_singer"],"filename":"1f469-200d-1f3a4","category":"people"},{"aliases":["man_singer"],"filename":"1f468-200d-1f3a4","category":"people"},{"aliases":["woman_teacher"],"filename":"1f469-200d-1f3eb","category":"people"},{"aliases":["man_teacher"],"filename":"1f468-200d-1f3eb","category":"people"},{"aliases":["woman_factory_worker"],"filename":"1f469-200d-1f3ed","category":"people"},{"aliases":["man_factory_worker"],"filename":"1f468-200d-1f3ed","category":"people"},{"aliases":["woman_technologist"],"filename":"1f469-200d-1f4bb","category":"people"},{"aliases":["man_technologist"],"filename":"1f468-200d-1f4bb","category":"people"},{"aliases":["woman_office_worker"],"filename":"1f469-200d-1f4bc","category":"people"},{"aliases":["man_office_worker"],"filename":"1f468-200d-1f4bc","category":"people"},{"aliases":["woman_mechanic"],"filename":"1f469-200d-1f527","category":"people"},{"aliases":["man_mechanic"],"filename":"1f468-200d-1f527","category":"people"},{"aliases":["woman_scientist"],"filename":"1f469-200d-1f52c","category":"people"},{"aliases":["man_scientist"],"filename":"1f468-200d-1f52c","category":"people"},{"aliases":["woman_artist"],"filename":"1f469-200d-1f3a8","category":"people"},{"aliases":["man_artist"],"filename":"1f468-200d-1f3a8","category":"people"},{"aliases":["woman_firefighter"],"filename":"1f469-200d-1f692","category":"people"},{"aliases":["man_firefighter"],"filename":"1f468-200d-1f692","category":"people"},{"aliases":["woman_pilot"],"filename":"1f469-200d-2708-fe0f","category":"people"},{"aliases":["man_pilot"],"filename":"1f468-200d-2708-fe0f","category":"people"},{"aliases":["woman_astronaut"],"filename":"1f469-200d-1f680","category":"people"},{"aliases":["man_astronaut"],"filename":"1f468-200d-1f680","category":"people"},{"aliases":["woman_judge"],"filename":"1f469-200d-2696-fe0f","category":"people"},{"aliases":["man_judge"],"filename":"1f468-200d-2696-fe0f","category":"people"},{"aliases":["mrs_claus"],"filename":"1f936","category":"people"},{"aliases":["santa"],"filename":"1f385","category":"people"},{"aliases":["princess"],"filename":"1f478","category":"people"},{"aliases":["prince"],"filename":"1f934","category":"people"},{"aliases":["bride_with_veil"],"filename":"1f470","category":"people"},{"aliases":["man_in_tuxedo"],"filename":"1f935","category":"people"},{"aliases":["angel"],"filename":"1f47c","category":"people"},{"aliases":["pregnant_woman"],"filename":"1f930","category":"people"},{"aliases":["bowing_woman"],"filename":"1f647-200d-2640-fe0f","category":"people"},{"aliases":["bowing_man","bow"],"filename":"1f647","category":"people"},{"aliases":["tipping_hand_woman","information_desk_person"],"filename":"1f481","category":"people"},{"aliases":["tipping_hand_man"],"filename":"1f481-200d-2642-fe0f","category":"people"},{"aliases":["no_good_woman","no_good","ng_woman"],"filename":"1f645","category":"people"},{"aliases":["no_good_man","ng_man"],"filename":"1f645-200d-2642-fe0f","category":"people"},{"aliases":["ok_woman"],"filename":"1f646","category":"people"},{"aliases":["ok_man"],"filename":"1f646-200d-2642-fe0f","category":"people"},{"aliases":["raising_hand_woman","raising_hand"],"filename":"1f64b","category":"people"},{"aliases":["raising_hand_man"],"filename":"1f64b-200d-2642-fe0f","category":"people"},{"aliases":["woman_facepalming"],"filename":"1f926-200d-2640-fe0f","category":"people"},{"aliases":["man_facepalming"],"filename":"1f926-200d-2642-fe0f","category":"people"},{"aliases":["woman_shrugging"],"filename":"1f937-200d-2640-fe0f","category":"people"},{"aliases":["man_shrugging"],"filename":"1f937-200d-2642-fe0f","category":"people"},{"aliases":["pouting_woman","person_with_pouting_face"],"filename":"1f64e","category":"people"},{"aliases":["pouting_man"],"filename":"1f64e-200d-2642-fe0f","category":"people"},{"aliases":["frowning_woman","person_frowning"],"filename":"1f64d","category":"people"},{"aliases":["frowning_man"],"filename":"1f64d-200d-2642-fe0f","category":"people"},{"aliases":["haircut_woman","haircut"],"filename":"1f487","category":"people"},{"aliases":["haircut_man"],"filename":"1f487-200d-2642-fe0f","category":"people"},{"aliases":["massage_woman","massage"],"filename":"1f486","category":"people"},{"aliases":["massage_man"],"filename":"1f486-200d-2642-fe0f","category":"people"},{"aliases":["business_suit_levitating"],"filename":"1f574","category":"people"},{"aliases":["dancer"],"filename":"1f483","category":"people"},{"aliases":["man_dancing"],"filename":"1f57a","category":"people"},{"aliases":["dancing_women","dancers"],"filename":"1f46f","category":"people"},{"aliases":["dancing_men"],"filename":"1f46f-200d-2642-fe0f","category":"people"},{"aliases":["walking_woman"],"filename":"1f6b6-200d-2640-fe0f","category":"people"},{"aliases":["walking_man","walking"],"filename":"1f6b6","category":"people"},{"aliases":["running_woman"],"filename":"1f3c3-200d-2640-fe0f","category":"people"},{"aliases":["running_man","runner","running"],"filename":"1f3c3","category":"people"},{"aliases":["couple"],"filename":"1f46b","category":"people"},{"aliases":["two_women_holding_hands"],"filename":"1f46d","category":"people"},{"aliases":["two_men_holding_hands"],"filename":"1f46c","category":"people"},{"aliases":["couple_with_heart_woman_man","couple_with_heart"],"filename":"1f491","category":"people"},{"aliases":["couple_with_heart_woman_woman"],"filename":"1f469-200d-2764-fe0f-200d-1f469","category":"people"},{"aliases":["couple_with_heart_man_man"],"filename":"1f468-200d-2764-fe0f-200d-1f468","category":"people"},{"aliases":["couplekiss_man_woman"],"filename":"1f48f","category":"people"},{"aliases":["couplekiss_woman_woman"],"filename":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469","category":"people"},{"aliases":["couplekiss_man_man"],"filename":"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468","category":"people"},{"aliases":["family_man_woman_boy","family"],"filename":"1f46a","category":"people"},{"aliases":["family_man_woman_girl"],"filename":"1f468-200d-1f469-200d-1f467","category":"people"},{"aliases":["family_man_woman_girl_boy"],"filename":"1f468-200d-1f469-200d-1f467-200d-1f466","category":"people"},{"aliases":["family_man_woman_boy_boy"],"filename":"1f468-200d-1f469-200d-1f466-200d-1f466","category":"people"},{"aliases":["family_man_woman_girl_girl"],"filename":"1f468-200d-1f469-200d-1f467-200d-1f467","category":"people"},{"aliases":["family_woman_woman_boy"],"filename":"1f469-200d-1f469-200d-1f466","category":"people"},{"aliases":["family_woman_woman_girl"],"filename":"1f469-200d-1f469-200d-1f467","category":"people"},{"aliases":["family_woman_woman_girl_boy"],"filename":"1f469-200d-1f469-200d-1f467-200d-1f466","category":"people"},{"aliases":["family_woman_woman_boy_boy"],"filename":"1f469-200d-1f469-200d-1f466-200d-1f466","category":"people"},{"aliases":["family_woman_woman_girl_girl"],"filename":"1f469-200d-1f469-200d-1f467-200d-1f467","category":"people"},{"aliases":["family_man_man_boy"],"filename":"1f468-200d-1f468-200d-1f466","category":"people"},{"aliases":["family_man_man_girl"],"filename":"1f468-200d-1f468-200d-1f467","category":"people"},{"aliases":["family_man_man_girl_boy"],"filename":"1f468-200d-1f468-200d-1f467-200d-1f466","category":"people"},{"aliases":["family_man_man_boy_boy"],"filename":"1f468-200d-1f468-200d-1f466-200d-1f466","category":"people"},{"aliases":["family_man_man_girl_girl"],"filename":"1f468-200d-1f468-200d-1f467-200d-1f467","category":"people"},{"aliases":["family_woman_boy"],"filename":"1f469-200d-1f466","category":"people"},{"aliases":["family_woman_girl"],"filename":"1f469-200d-1f467","category":"people"},{"aliases":["family_woman_girl_boy"],"filename":"1f469-200d-1f467-200d-1f466","category":"people"},{"aliases":["family_woman_boy_boy"],"filename":"1f469-200d-1f466-200d-1f466","category":"people"},{"aliases":["family_woman_girl_girl"],"filename":"1f469-200d-1f467-200d-1f467","category":"people"},{"aliases":["family_man_boy"],"filename":"1f468-200d-1f466","category":"people"},{"aliases":["family_man_girl"],"filename":"1f468-200d-1f467","category":"people"},{"aliases":["family_man_girl_boy"],"filename":"1f468-200d-1f467-200d-1f466","category":"people"},{"aliases":["family_man_boy_boy"],"filename":"1f468-200d-1f466-200d-1f466","category":"people"},{"aliases":["family_man_girl_girl"],"filename":"1f468-200d-1f467-200d-1f467","category":"people"},{"aliases":["womans_clothes"],"filename":"1f45a","category":"people"},{"aliases":["shirt","tshirt"],"filename":"1f455","category":"people"},{"aliases":["jeans"],"filename":"1f456","category":"people"},{"aliases":["necktie"],"filename":"1f454","category":"people"},{"aliases":["dress"],"filename":"1f457","category":"people"},{"aliases":["bikini"],"filename":"1f459","category":"people"},{"aliases":["kimono"],"filename":"1f458","category":"people"},{"aliases":["high_heel"],"filename":"1f460","category":"people"},{"aliases":["sandal"],"filename":"1f461","category":"people"},{"aliases":["boot"],"filename":"1f462","category":"people"},{"aliases":["mans_shoe","shoe"],"filename":"1f45e","category":"people"},{"aliases":["athletic_shoe"],"filename":"1f45f","category":"people"},{"aliases":["womans_hat"],"filename":"1f452","category":"people"},{"aliases":["tophat"],"filename":"1f3a9","category":"people"},{"aliases":["mortar_board"],"filename":"1f393","category":"people"},{"aliases":["crown"],"filename":"1f451","category":"people"},{"aliases":["rescue_worker_helmet"],"filename":"26d1","category":"people"},{"aliases":["school_satchel"],"filename":"1f392","category":"people"},{"aliases":["pouch"],"filename":"1f45d","category":"people"},{"aliases":["purse"],"filename":"1f45b","category":"people"},{"aliases":["handbag"],"filename":"1f45c","category":"people"},{"aliases":["briefcase"],"filename":"1f4bc","category":"people"},{"aliases":["eyeglasses"],"filename":"1f453","category":"people"},{"aliases":["dark_sunglasses"],"filename":"1f576","category":"people"},{"aliases":["closed_umbrella"],"filename":"1f302","category":"people"},{"aliases":["open_umbrella"],"filename":"2602-fe0f","category":"people"},{"aliases":["dog"],"filename":"1f436","category":"nature"},{"aliases":["cat"],"filename":"1f431","category":"nature"},{"aliases":["mouse"],"filename":"1f42d","category":"nature"},{"aliases":["hamster"],"filename":"1f439","category":"nature"},{"aliases":["rabbit"],"filename":"1f430","category":"nature"},{"aliases":["fox_face"],"filename":"1f98a","category":"nature"},{"aliases":["bear"],"filename":"1f43b","category":"nature"},{"aliases":["panda_face"],"filename":"1f43c","category":"nature"},{"aliases":["koala"],"filename":"1f428","category":"nature"},{"aliases":["tiger"],"filename":"1f42f","category":"nature"},{"aliases":["lion"],"filename":"1f981","category":"nature"},{"aliases":["cow"],"filename":"1f42e","category":"nature"},{"aliases":["pig"],"filename":"1f437","category":"nature"},{"aliases":["pig_nose"],"filename":"1f43d","category":"nature"},{"aliases":["frog"],"filename":"1f438","category":"nature"},{"aliases":["monkey_face"],"filename":"1f435","category":"nature"},{"aliases":["see_no_evil"],"filename":"1f648","category":"nature"},{"aliases":["hear_no_evil"],"filename":"1f649","category":"nature"},{"aliases":["speak_no_evil"],"filename":"1f64a","category":"nature"},{"aliases":["monkey"],"filename":"1f412","category":"nature"},{"aliases":["chicken"],"filename":"1f414","category":"nature"},{"aliases":["penguin"],"filename":"1f427","category":"nature"},{"aliases":["bird"],"filename":"1f426","category":"nature"},{"aliases":["baby_chick"],"filename":"1f424","category":"nature"},{"aliases":["hatching_chick"],"filename":"1f423","category":"nature"},{"aliases":["hatched_chick"],"filename":"1f425","category":"nature"},{"aliases":["duck"],"filename":"1f986","category":"nature"},{"aliases":["eagle"],"filename":"1f985","category":"nature"},{"aliases":["owl"],"filename":"1f989","category":"nature"},{"aliases":["bat"],"filename":"1f987","category":"nature"},{"aliases":["wolf"],"filename":"1f43a","category":"nature"},{"aliases":["boar"],"filename":"1f417","category":"nature"},{"aliases":["horse"],"filename":"1f434","category":"nature"},{"aliases":["unicorn"],"filename":"1f984","category":"nature"},{"aliases":["bee","honeybee"],"filename":"1f41d","category":"nature"},{"aliases":["bug"],"filename":"1f41b","category":"nature"},{"aliases":["butterfly"],"filename":"1f98b","category":"nature"},{"aliases":["snail"],"filename":"1f40c","category":"nature"},{"aliases":["shell"],"filename":"1f41a","category":"nature"},{"aliases":["beetle"],"filename":"1f41e","category":"nature"},{"aliases":["ant"],"filename":"1f41c","category":"nature"},{"aliases":["spider"],"filename":"1f577","category":"nature"},{"aliases":["spider_web"],"filename":"1f578","category":"nature"},{"aliases":["turtle"],"filename":"1f422","category":"nature"},{"aliases":["snake"],"filename":"1f40d","category":"nature"},{"aliases":["lizard"],"filename":"1f98e","category":"nature"},{"aliases":["scorpion"],"filename":"1f982","category":"nature"},{"aliases":["crab"],"filename":"1f980","category":"nature"},{"aliases":["squid"],"filename":"1f991","category":"nature"},{"aliases":["octopus"],"filename":"1f419","category":"nature"},{"aliases":["shrimp"],"filename":"1f990","category":"nature"},{"aliases":["tropical_fish"],"filename":"1f420","category":"nature"},{"aliases":["fish"],"filename":"1f41f","category":"nature"},{"aliases":["blowfish"],"filename":"1f421","category":"nature"},{"aliases":["dolphin","flipper"],"filename":"1f42c","category":"nature"},{"aliases":["shark"],"filename":"1f988","category":"nature"},{"aliases":["whale"],"filename":"1f433","category":"nature"},{"aliases":["whale2"],"filename":"1f40b","category":"nature"},{"aliases":["crocodile"],"filename":"1f40a","category":"nature"},{"aliases":["leopard"],"filename":"1f406","category":"nature"},{"aliases":["tiger2"],"filename":"1f405","category":"nature"},{"aliases":["water_buffalo"],"filename":"1f403","category":"nature"},{"aliases":["ox"],"filename":"1f402","category":"nature"},{"aliases":["cow2"],"filename":"1f404","category":"nature"},{"aliases":["deer"],"filename":"1f98c","category":"nature"},{"aliases":["dromedary_camel"],"filename":"1f42a","category":"nature"},{"aliases":["camel"],"filename":"1f42b","category":"nature"},{"aliases":["elephant"],"filename":"1f418","category":"nature"},{"aliases":["rhinoceros"],"filename":"1f98f","category":"nature"},{"aliases":["gorilla"],"filename":"1f98d","category":"nature"},{"aliases":["racehorse"],"filename":"1f40e","category":"nature"},{"aliases":["pig2"],"filename":"1f416","category":"nature"},{"aliases":["goat"],"filename":"1f410","category":"nature"},{"aliases":["ram"],"filename":"1f40f","category":"nature"},{"aliases":["sheep"],"filename":"1f411","category":"nature"},{"aliases":["dog2"],"filename":"1f415","category":"nature"},{"aliases":["poodle"],"filename":"1f429","category":"nature"},{"aliases":["cat2"],"filename":"1f408","category":"nature"},{"aliases":["rooster"],"filename":"1f413","category":"nature"},{"aliases":["turkey"],"filename":"1f983","category":"nature"},{"aliases":["dove"],"filename":"1f54a","category":"nature"},{"aliases":["rabbit2"],"filename":"1f407","category":"nature"},{"aliases":["mouse2"],"filename":"1f401","category":"nature"},{"aliases":["rat"],"filename":"1f400","category":"nature"},{"aliases":["chipmunk"],"filename":"1f43f","category":"nature"},{"aliases":["feet","paw_prints"],"filename":"1f43e","category":"nature"},{"aliases":["dragon"],"filename":"1f409","category":"nature"},{"aliases":["dragon_face"],"filename":"1f432","category":"nature"},{"aliases":["cactus"],"filename":"1f335","category":"nature"},{"aliases":["christmas_tree"],"filename":"1f384","category":"nature"},{"aliases":["evergreen_tree"],"filename":"1f332","category":"nature"},{"aliases":["deciduous_tree"],"filename":"1f333","category":"nature"},{"aliases":["palm_tree"],"filename":"1f334","category":"nature"},{"aliases":["seedling"],"filename":"1f331","category":"nature"},{"aliases":["herb"],"filename":"1f33f","category":"nature"},{"aliases":["shamrock"],"filename":"2618-fe0f","category":"nature"},{"aliases":["four_leaf_clover"],"filename":"1f340","category":"nature"},{"aliases":["bamboo"],"filename":"1f38d","category":"nature"},{"aliases":["tanabata_tree"],"filename":"1f38b","category":"nature"},{"aliases":["leaves"],"filename":"1f343","category":"nature"},{"aliases":["fallen_leaf"],"filename":"1f342","category":"nature"},{"aliases":["maple_leaf"],"filename":"1f341","category":"nature"},{"aliases":["mushroom"],"filename":"1f344","category":"nature"},{"aliases":["ear_of_rice"],"filename":"1f33e","category":"nature"},{"aliases":["bouquet"],"filename":"1f490","category":"nature"},{"aliases":["tulip"],"filename":"1f337","category":"nature"},{"aliases":["rose"],"filename":"1f339","category":"nature"},{"aliases":["wilted_flower"],"filename":"1f940","category":"nature"},{"aliases":["sunflower"],"filename":"1f33b","category":"nature"},{"aliases":["blossom"],"filename":"1f33c","category":"nature"},{"aliases":["cherry_blossom"],"filename":"1f338","category":"nature"},{"aliases":["hibiscus"],"filename":"1f33a","category":"nature"},{"aliases":["earth_americas"],"filename":"1f30e","category":"nature"},{"aliases":["earth_africa"],"filename":"1f30d","category":"nature"},{"aliases":["earth_asia"],"filename":"1f30f","category":"nature"},{"aliases":["full_moon"],"filename":"1f315","category":"nature"},{"aliases":["waning_gibbous_moon"],"filename":"1f316","category":"nature"},{"aliases":["last_quarter_moon"],"filename":"1f317","category":"nature"},{"aliases":["waning_crescent_moon"],"filename":"1f318","category":"nature"},{"aliases":["new_moon"],"filename":"1f311","category":"nature"},{"aliases":["waxing_crescent_moon"],"filename":"1f312","category":"nature"},{"aliases":["first_quarter_moon"],"filename":"1f313","category":"nature"},{"aliases":["moon","waxing_gibbous_moon"],"filename":"1f314","category":"nature"},{"aliases":["new_moon_with_face"],"filename":"1f31a","category":"nature"},{"aliases":["full_moon_with_face"],"filename":"1f31d","category":"nature"},{"aliases":["sun_with_face"],"filename":"1f31e","category":"nature"},{"aliases":["first_quarter_moon_with_face"],"filename":"1f31b","category":"nature"},{"aliases":["last_quarter_moon_with_face"],"filename":"1f31c","category":"nature"},{"aliases":["crescent_moon"],"filename":"1f319","category":"nature"},{"aliases":["dizzy"],"filename":"1f4ab","category":"nature"},{"aliases":["star"],"filename":"2b50-fe0f","category":"nature"},{"aliases":["star2"],"filename":"1f31f","category":"nature"},{"aliases":["sparkles"],"filename":"2728","category":"nature"},{"aliases":["zap"],"filename":"26a1-fe0f","category":"nature"},{"aliases":["fire"],"filename":"1f525","category":"nature"},{"aliases":["boom","collision"],"filename":"1f4a5","category":"nature"},{"aliases":["comet"],"filename":"2604-fe0f","category":"nature"},{"aliases":["sunny"],"filename":"2600-fe0f","category":"nature"},{"aliases":["sun_behind_small_cloud"],"filename":"1f324","category":"nature"},{"aliases":["partly_sunny"],"filename":"26c5-fe0f","category":"nature"},{"aliases":["sun_behind_large_cloud"],"filename":"1f325","category":"nature"},{"aliases":["sun_behind_rain_cloud"],"filename":"1f326","category":"nature"},{"aliases":["rainbow"],"filename":"1f308","category":"nature"},{"aliases":["cloud"],"filename":"2601-fe0f","category":"nature"},{"aliases":["cloud_with_rain"],"filename":"1f327","category":"nature"},{"aliases":["cloud_with_lightning_and_rain"],"filename":"26c8","category":"nature"},{"aliases":["cloud_with_lightning"],"filename":"1f329","category":"nature"},{"aliases":["cloud_with_snow"],"filename":"1f328","category":"nature"},{"aliases":["snowman_with_snow"],"filename":"2603-fe0f","category":"nature"},{"aliases":["snowman"],"filename":"26c4-fe0f","category":"nature"},{"aliases":["snowflake"],"filename":"2744-fe0f","category":"nature"},{"aliases":["wind_face"],"filename":"1f32c","category":"nature"},{"aliases":["dash"],"filename":"1f4a8","category":"nature"},{"aliases":["tornado"],"filename":"1f32a","category":"nature"},{"aliases":["fog"],"filename":"1f32b","category":"nature"},{"aliases":["ocean"],"filename":"1f30a","category":"nature"},{"aliases":["droplet"],"filename":"1f4a7","category":"nature"},{"aliases":["sweat_drops"],"filename":"1f4a6","category":"nature"},{"aliases":["umbrella"],"filename":"2614-fe0f","category":"nature"},{"aliases":["green_apple"],"filename":"1f34f","category":"foods"},{"aliases":["apple"],"filename":"1f34e","category":"foods"},{"aliases":["pear"],"filename":"1f350","category":"foods"},{"aliases":["tangerine","orange","mandarin"],"filename":"1f34a","category":"foods"},{"aliases":["lemon"],"filename":"1f34b","category":"foods"},{"aliases":["banana"],"filename":"1f34c","category":"foods"},{"aliases":["watermelon"],"filename":"1f349","category":"foods"},{"aliases":["grapes"],"filename":"1f347","category":"foods"},{"aliases":["strawberry"],"filename":"1f353","category":"foods"},{"aliases":["melon"],"filename":"1f348","category":"foods"},{"aliases":["cherries"],"filename":"1f352","category":"foods"},{"aliases":["peach"],"filename":"1f351","category":"foods"},{"aliases":["pineapple"],"filename":"1f34d","category":"foods"},{"aliases":["kiwi_fruit"],"filename":"1f95d","category":"foods"},{"aliases":["avocado"],"filename":"1f951","category":"foods"},{"aliases":["tomato"],"filename":"1f345","category":"foods"},{"aliases":["eggplant"],"filename":"1f346","category":"foods"},{"aliases":["cucumber"],"filename":"1f952","category":"foods"},{"aliases":["carrot"],"filename":"1f955","category":"foods"},{"aliases":["corn"],"filename":"1f33d","category":"foods"},{"aliases":["hot_pepper"],"filename":"1f336","category":"foods"},{"aliases":["potato"],"filename":"1f954","category":"foods"},{"aliases":["sweet_potato"],"filename":"1f360","category":"foods"},{"aliases":["chestnut"],"filename":"1f330","category":"foods"},{"aliases":["peanuts"],"filename":"1f95c","category":"foods"},{"aliases":["honey_pot"],"filename":"1f36f","category":"foods"},{"aliases":["croissant"],"filename":"1f950","category":"foods"},{"aliases":["bread"],"filename":"1f35e","category":"foods"},{"aliases":["baguette_bread"],"filename":"1f956","category":"foods"},{"aliases":["cheese"],"filename":"1f9c0","category":"foods"},{"aliases":["egg"],"filename":"1f95a","category":"foods"},{"aliases":["fried_egg"],"filename":"1f373","category":"foods"},{"aliases":["bacon"],"filename":"1f953","category":"foods"},{"aliases":["pancakes"],"filename":"1f95e","category":"foods"},{"aliases":["fried_shrimp"],"filename":"1f364","category":"foods"},{"aliases":["poultry_leg"],"filename":"1f357","category":"foods"},{"aliases":["meat_on_bone"],"filename":"1f356","category":"foods"},{"aliases":["pizza"],"filename":"1f355","category":"foods"},{"aliases":["hotdog"],"filename":"1f32d","category":"foods"},{"aliases":["hamburger"],"filename":"1f354","category":"foods"},{"aliases":["fries"],"filename":"1f35f","category":"foods"},{"aliases":["stuffed_flatbread"],"filename":"1f959","category":"foods"},{"aliases":["taco"],"filename":"1f32e","category":"foods"},{"aliases":["burrito"],"filename":"1f32f","category":"foods"},{"aliases":["green_salad"],"filename":"1f957","category":"foods"},{"aliases":["shallow_pan_of_food"],"filename":"1f958","category":"foods"},{"aliases":["spaghetti"],"filename":"1f35d","category":"foods"},{"aliases":["ramen"],"filename":"1f35c","category":"foods"},{"aliases":["stew"],"filename":"1f372","category":"foods"},{"aliases":["fish_cake"],"filename":"1f365","category":"foods"},{"aliases":["sushi"],"filename":"1f363","category":"foods"},{"aliases":["bento"],"filename":"1f371","category":"foods"},{"aliases":["curry"],"filename":"1f35b","category":"foods"},{"aliases":["rice"],"filename":"1f35a","category":"foods"},{"aliases":["rice_ball"],"filename":"1f359","category":"foods"},{"aliases":["rice_cracker"],"filename":"1f358","category":"foods"},{"aliases":["oden"],"filename":"1f362","category":"foods"},{"aliases":["dango"],"filename":"1f361","category":"foods"},{"aliases":["shaved_ice"],"filename":"1f367","category":"foods"},{"aliases":["ice_cream"],"filename":"1f368","category":"foods"},{"aliases":["icecream"],"filename":"1f366","category":"foods"},{"aliases":["cake"],"filename":"1f370","category":"foods"},{"aliases":["birthday"],"filename":"1f382","category":"foods"},{"aliases":["custard"],"filename":"1f36e","category":"foods"},{"aliases":["lollipop"],"filename":"1f36d","category":"foods"},{"aliases":["candy"],"filename":"1f36c","category":"foods"},{"aliases":["chocolate_bar"],"filename":"1f36b","category":"foods"},{"aliases":["popcorn"],"filename":"1f37f","category":"foods"},{"aliases":["doughnut"],"filename":"1f369","category":"foods"},{"aliases":["cookie"],"filename":"1f36a","category":"foods"},{"aliases":["milk_glass"],"filename":"1f95b","category":"foods"},{"aliases":["baby_bottle"],"filename":"1f37c","category":"foods"},{"aliases":["coffee"],"filename":"2615-fe0f","category":"foods"},{"aliases":["tea"],"filename":"1f375","category":"foods"},{"aliases":["sake"],"filename":"1f376","category":"foods"},{"aliases":["beer"],"filename":"1f37a","category":"foods"},{"aliases":["beers"],"filename":"1f37b","category":"foods"},{"aliases":["clinking_glasses"],"filename":"1f942","category":"foods"},{"aliases":["wine_glass"],"filename":"1f377","category":"foods"},{"aliases":["tumbler_glass"],"filename":"1f943","category":"foods"},{"aliases":["cocktail"],"filename":"1f378","category":"foods"},{"aliases":["tropical_drink"],"filename":"1f379","category":"foods"},{"aliases":["champagne"],"filename":"1f37e","category":"foods"},{"aliases":["spoon"],"filename":"1f944","category":"foods"},{"aliases":["fork_and_knife"],"filename":"1f374","category":"foods"},{"aliases":["plate_with_cutlery"],"filename":"1f37d","category":"foods"},{"aliases":["soccer"],"filename":"26bd-fe0f","category":"activity"},{"aliases":["basketball"],"filename":"1f3c0","category":"activity"},{"aliases":["football"],"filename":"1f3c8","category":"activity"},{"aliases":["baseball"],"filename":"26be-fe0f","category":"activity"},{"aliases":["tennis"],"filename":"1f3be","category":"activity"},{"aliases":["volleyball"],"filename":"1f3d0","category":"activity"},{"aliases":["rugby_football"],"filename":"1f3c9","category":"activity"},{"aliases":["8ball"],"filename":"1f3b1","category":"activity"},{"aliases":["ping_pong"],"filename":"1f3d3","category":"activity"},{"aliases":["badminton"],"filename":"1f3f8","category":"activity"},{"aliases":["goal_net"],"filename":"1f945","category":"activity"},{"aliases":["ice_hockey"],"filename":"1f3d2","category":"activity"},{"aliases":["field_hockey"],"filename":"1f3d1","category":"activity"},{"aliases":["cricket"],"filename":"1f3cf","category":"activity"},{"aliases":["golf"],"filename":"26f3-fe0f","category":"activity"},{"aliases":["bow_and_arrow"],"filename":"1f3f9","category":"activity"},{"aliases":["fishing_pole_and_fish"],"filename":"1f3a3","category":"activity"},{"aliases":["boxing_glove"],"filename":"1f94a","category":"activity"},{"aliases":["martial_arts_uniform"],"filename":"1f94b","category":"activity"},{"aliases":["ice_skate"],"filename":"26f8","category":"activity"},{"aliases":["ski"],"filename":"1f3bf","category":"activity"},{"aliases":["skier"],"filename":"26f7","category":"activity"},{"aliases":["snowboarder"],"filename":"1f3c2","category":"activity"},{"aliases":["weight_lifting_woman"],"filename":"1f3cb-fe0f-200d-2640-fe0f","category":"activity"},{"aliases":["weight_lifting_man"],"filename":"1f3cb-fe0f","category":"activity"},{"aliases":["person_fencing"],"filename":"1f93a","category":"activity"},{"aliases":["women_wrestling"],"filename":"1f93c-200d-2640-fe0f","category":"activity"},{"aliases":["men_wrestling"],"filename":"1f93c-200d-2642-fe0f","category":"activity"},{"aliases":["woman_cartwheeling"],"filename":"1f938-200d-2640-fe0f","category":"activity"},{"aliases":["man_cartwheeling"],"filename":"1f938-200d-2642-fe0f","category":"activity"},{"aliases":["basketball_woman"],"filename":"26f9-fe0f-200d-2640-fe0f","category":"activity"},{"aliases":["basketball_man"],"filename":"26f9-fe0f","category":"activity"},{"aliases":["woman_playing_handball"],"filename":"1f93e-200d-2640-fe0f","category":"activity"},{"aliases":["man_playing_handball"],"filename":"1f93e-200d-2642-fe0f","category":"activity"},{"aliases":["golfing_woman"],"filename":"1f3cc-fe0f-200d-2640-fe0f","category":"activity"},{"aliases":["golfing_man"],"filename":"1f3cc-fe0f","category":"activity"},{"aliases":["surfing_woman"],"filename":"1f3c4-200d-2640-fe0f","category":"activity"},{"aliases":["surfing_man","surfer"],"filename":"1f3c4","category":"activity"},{"aliases":["swimming_woman"],"filename":"1f3ca-200d-2640-fe0f","category":"activity"},{"aliases":["swimming_man","swimmer"],"filename":"1f3ca","category":"activity"},{"aliases":["woman_playing_water_polo"],"filename":"1f93d-200d-2640-fe0f","category":"activity"},{"aliases":["man_playing_water_polo"],"filename":"1f93d-200d-2642-fe0f","category":"activity"},{"aliases":["rowing_woman"],"filename":"1f6a3-200d-2640-fe0f","category":"activity"},{"aliases":["rowing_man","rowboat"],"filename":"1f6a3","category":"activity"},{"aliases":["horse_racing"],"filename":"1f3c7","category":"activity"},{"aliases":["biking_woman"],"filename":"1f6b4-200d-2640-fe0f","category":"activity"},{"aliases":["biking_man","bicyclist"],"filename":"1f6b4","category":"activity"},{"aliases":["mountain_biking_woman"],"filename":"1f6b5-200d-2640-fe0f","category":"activity"},{"aliases":["mountain_biking_man","mountain_bicyclist"],"filename":"1f6b5","category":"activity"},{"aliases":["running_shirt_with_sash"],"filename":"1f3bd","category":"activity"},{"aliases":["medal_sports"],"filename":"1f3c5","category":"activity"},{"aliases":["medal_military"],"filename":"1f396","category":"activity"},{"aliases":["1st_place_medal"],"filename":"1f947","category":"activity"},{"aliases":["2nd_place_medal"],"filename":"1f948","category":"activity"},{"aliases":["3rd_place_medal"],"filename":"1f949","category":"activity"},{"aliases":["trophy"],"filename":"1f3c6","category":"activity"},{"aliases":["rosette"],"filename":"1f3f5","category":"activity"},{"aliases":["reminder_ribbon"],"filename":"1f397","category":"activity"},{"aliases":["ticket"],"filename":"1f3ab","category":"activity"},{"aliases":["tickets"],"filename":"1f39f","category":"activity"},{"aliases":["circus_tent"],"filename":"1f3aa","category":"activity"},{"aliases":["woman_juggling"],"filename":"1f939-200d-2640-fe0f","category":"activity"},{"aliases":["man_juggling"],"filename":"1f939-200d-2642-fe0f","category":"activity"},{"aliases":["performing_arts"],"filename":"1f3ad","category":"activity"},{"aliases":["art"],"filename":"1f3a8","category":"activity"},{"aliases":["clapper"],"filename":"1f3ac","category":"activity"},{"aliases":["microphone"],"filename":"1f3a4","category":"activity"},{"aliases":["headphones"],"filename":"1f3a7","category":"activity"},{"aliases":["musical_score"],"filename":"1f3bc","category":"activity"},{"aliases":["musical_keyboard"],"filename":"1f3b9","category":"activity"},{"aliases":["drum"],"filename":"1f941","category":"activity"},{"aliases":["saxophone"],"filename":"1f3b7","category":"activity"},{"aliases":["trumpet"],"filename":"1f3ba","category":"activity"},{"aliases":["guitar"],"filename":"1f3b8","category":"activity"},{"aliases":["violin"],"filename":"1f3bb","category":"activity"},{"aliases":["game_die"],"filename":"1f3b2","category":"activity"},{"aliases":["dart"],"filename":"1f3af","category":"activity"},{"aliases":["bowling"],"filename":"1f3b3","category":"activity"},{"aliases":["video_game"],"filename":"1f3ae","category":"activity"},{"aliases":["slot_machine"],"filename":"1f3b0","category":"activity"},{"aliases":["car","red_car"],"filename":"1f697","category":"places"},{"aliases":["taxi"],"filename":"1f695","category":"places"},{"aliases":["blue_car"],"filename":"1f699","category":"places"},{"aliases":["bus"],"filename":"1f68c","category":"places"},{"aliases":["trolleybus"],"filename":"1f68e","category":"places"},{"aliases":["racing_car"],"filename":"1f3ce","category":"places"},{"aliases":["police_car"],"filename":"1f693","category":"places"},{"aliases":["ambulance"],"filename":"1f691","category":"places"},{"aliases":["fire_engine"],"filename":"1f692","category":"places"},{"aliases":["minibus"],"filename":"1f690","category":"places"},{"aliases":["truck"],"filename":"1f69a","category":"places"},{"aliases":["articulated_lorry"],"filename":"1f69b","category":"places"},{"aliases":["tractor"],"filename":"1f69c","category":"places"},{"aliases":["kick_scooter"],"filename":"1f6f4","category":"places"},{"aliases":["bike"],"filename":"1f6b2","category":"places"},{"aliases":["motor_scooter"],"filename":"1f6f5","category":"places"},{"aliases":["motorcycle"],"filename":"1f3cd","category":"places"},{"aliases":["rotating_light"],"filename":"1f6a8","category":"places"},{"aliases":["oncoming_police_car"],"filename":"1f694","category":"places"},{"aliases":["oncoming_bus"],"filename":"1f68d","category":"places"},{"aliases":["oncoming_automobile"],"filename":"1f698","category":"places"},{"aliases":["oncoming_taxi"],"filename":"1f696","category":"places"},{"aliases":["aerial_tramway"],"filename":"1f6a1","category":"places"},{"aliases":["mountain_cableway"],"filename":"1f6a0","category":"places"},{"aliases":["suspension_railway"],"filename":"1f69f","category":"places"},{"aliases":["railway_car"],"filename":"1f683","category":"places"},{"aliases":["train"],"filename":"1f68b","category":"places"},{"aliases":["mountain_railway"],"filename":"1f69e","category":"places"},{"aliases":["monorail"],"filename":"1f69d","category":"places"},{"aliases":["bullettrain_side"],"filename":"1f684","category":"places"},{"aliases":["bullettrain_front"],"filename":"1f685","category":"places"},{"aliases":["light_rail"],"filename":"1f688","category":"places"},{"aliases":["steam_locomotive"],"filename":"1f682","category":"places"},{"aliases":["train2"],"filename":"1f686","category":"places"},{"aliases":["metro"],"filename":"1f687","category":"places"},{"aliases":["tram"],"filename":"1f68a","category":"places"},{"aliases":["station"],"filename":"1f689","category":"places"},{"aliases":["helicopter"],"filename":"1f681","category":"places"},{"aliases":["small_airplane"],"filename":"1f6e9","category":"places"},{"aliases":["airplane"],"filename":"2708-fe0f","category":"places"},{"aliases":["flight_departure"],"filename":"1f6eb","category":"places"},{"aliases":["flight_arrival"],"filename":"1f6ec","category":"places"},{"aliases":["rocket"],"filename":"1f680","category":"places"},{"aliases":["artificial_satellite"],"filename":"1f6f0","category":"places"},{"aliases":["seat"],"filename":"1f4ba","category":"places"},{"aliases":["canoe"],"filename":"1f6f6","category":"places"},{"aliases":["boat","sailboat"],"filename":"26f5-fe0f","category":"places"},{"aliases":["motor_boat"],"filename":"1f6e5","category":"places"},{"aliases":["speedboat"],"filename":"1f6a4","category":"places"},{"aliases":["passenger_ship"],"filename":"1f6f3","category":"places"},{"aliases":["ferry"],"filename":"26f4","category":"places"},{"aliases":["ship"],"filename":"1f6a2","category":"places"},{"aliases":["anchor"],"filename":"2693-fe0f","category":"places"},{"aliases":["construction"],"filename":"1f6a7","category":"places"},{"aliases":["fuelpump"],"filename":"26fd-fe0f","category":"places"},{"aliases":["busstop"],"filename":"1f68f","category":"places"},{"aliases":["vertical_traffic_light"],"filename":"1f6a6","category":"places"},{"aliases":["traffic_light"],"filename":"1f6a5","category":"places"},{"aliases":["world_map"],"filename":"1f5fa","category":"places"},{"aliases":["moyai"],"filename":"1f5ff","category":"places"},{"aliases":["statue_of_liberty"],"filename":"1f5fd","category":"places"},{"aliases":["fountain"],"filename":"26f2-fe0f","category":"places"},{"aliases":["tokyo_tower"],"filename":"1f5fc","category":"places"},{"aliases":["european_castle"],"filename":"1f3f0","category":"places"},{"aliases":["japanese_castle"],"filename":"1f3ef","category":"places"},{"aliases":["stadium"],"filename":"1f3df","category":"places"},{"aliases":["ferris_wheel"],"filename":"1f3a1","category":"places"},{"aliases":["roller_coaster"],"filename":"1f3a2","category":"places"},{"aliases":["carousel_horse"],"filename":"1f3a0","category":"places"},{"aliases":["parasol_on_ground"],"filename":"26f1","category":"places"},{"aliases":["beach_umbrella"],"filename":"1f3d6","category":"places"},{"aliases":["desert_island"],"filename":"1f3dd","category":"places"},{"aliases":["mountain"],"filename":"26f0","category":"places"},{"aliases":["mountain_snow"],"filename":"1f3d4","category":"places"},{"aliases":["mount_fuji"],"filename":"1f5fb","category":"places"},{"aliases":["volcano"],"filename":"1f30b","category":"places"},{"aliases":["desert"],"filename":"1f3dc","category":"places"},{"aliases":["camping"],"filename":"1f3d5","category":"places"},{"aliases":["tent"],"filename":"26fa-fe0f","category":"places"},{"aliases":["railway_track"],"filename":"1f6e4","category":"places"},{"aliases":["motorway"],"filename":"1f6e3","category":"places"},{"aliases":["building_construction"],"filename":"1f3d7","category":"places"},{"aliases":["factory"],"filename":"1f3ed","category":"places"},{"aliases":["house"],"filename":"1f3e0","category":"places"},{"aliases":["house_with_garden"],"filename":"1f3e1","category":"places"},{"aliases":["houses"],"filename":"1f3d8","category":"places"},{"aliases":["derelict_house"],"filename":"1f3da","category":"places"},{"aliases":["office"],"filename":"1f3e2","category":"places"},{"aliases":["department_store"],"filename":"1f3ec","category":"places"},{"aliases":["post_office"],"filename":"1f3e3","category":"places"},{"aliases":["european_post_office"],"filename":"1f3e4","category":"places"},{"aliases":["hospital"],"filename":"1f3e5","category":"places"},{"aliases":["bank"],"filename":"1f3e6","category":"places"},{"aliases":["hotel"],"filename":"1f3e8","category":"places"},{"aliases":["convenience_store"],"filename":"1f3ea","category":"places"},{"aliases":["school"],"filename":"1f3eb","category":"places"},{"aliases":["love_hotel"],"filename":"1f3e9","category":"places"},{"aliases":["wedding"],"filename":"1f492","category":"places"},{"aliases":["classical_building"],"filename":"1f3db","category":"places"},{"aliases":["church"],"filename":"26ea-fe0f","category":"places"},{"aliases":["mosque"],"filename":"1f54c","category":"places"},{"aliases":["synagogue"],"filename":"1f54d","category":"places"},{"aliases":["kaaba"],"filename":"1f54b","category":"places"},{"aliases":["shinto_shrine"],"filename":"26e9","category":"places"},{"aliases":["japan"],"filename":"1f5fe","category":"places"},{"aliases":["rice_scene"],"filename":"1f391","category":"places"},{"aliases":["national_park"],"filename":"1f3de","category":"places"},{"aliases":["sunrise"],"filename":"1f305","category":"places"},{"aliases":["sunrise_over_mountains"],"filename":"1f304","category":"places"},{"aliases":["stars"],"filename":"1f320","category":"places"},{"aliases":["sparkler"],"filename":"1f387","category":"places"},{"aliases":["fireworks"],"filename":"1f386","category":"places"},{"aliases":["city_sunrise"],"filename":"1f307","category":"places"},{"aliases":["city_sunset"],"filename":"1f306","category":"places"},{"aliases":["cityscape"],"filename":"1f3d9","category":"places"},{"aliases":["night_with_stars"],"filename":"1f303","category":"places"},{"aliases":["milky_way"],"filename":"1f30c","category":"places"},{"aliases":["bridge_at_night"],"filename":"1f309","category":"places"},{"aliases":["foggy"],"filename":"1f301","category":"places"},{"aliases":["watch"],"filename":"231a-fe0f","category":"objects"},{"aliases":["iphone"],"filename":"1f4f1","category":"objects"},{"aliases":["calling"],"filename":"1f4f2","category":"objects"},{"aliases":["computer"],"filename":"1f4bb","category":"objects"},{"aliases":["keyboard"],"filename":"2328-fe0f","category":"objects"},{"aliases":["desktop_computer"],"filename":"1f5a5","category":"objects"},{"aliases":["printer"],"filename":"1f5a8","category":"objects"},{"aliases":["computer_mouse"],"filename":"1f5b1","category":"objects"},{"aliases":["trackball"],"filename":"1f5b2","category":"objects"},{"aliases":["joystick"],"filename":"1f579","category":"objects"},{"aliases":["clamp"],"filename":"1f5dc","category":"objects"},{"aliases":["minidisc"],"filename":"1f4bd","category":"objects"},{"aliases":["floppy_disk"],"filename":"1f4be","category":"objects"},{"aliases":["cd"],"filename":"1f4bf","category":"objects"},{"aliases":["dvd"],"filename":"1f4c0","category":"objects"},{"aliases":["vhs"],"filename":"1f4fc","category":"objects"},{"aliases":["camera"],"filename":"1f4f7","category":"objects"},{"aliases":["camera_flash"],"filename":"1f4f8","category":"objects"},{"aliases":["video_camera"],"filename":"1f4f9","category":"objects"},{"aliases":["movie_camera"],"filename":"1f3a5","category":"objects"},{"aliases":["film_projector"],"filename":"1f4fd","category":"objects"},{"aliases":["film_strip"],"filename":"1f39e","category":"objects"},{"aliases":["telephone_receiver"],"filename":"1f4de","category":"objects"},{"aliases":["phone","telephone"],"filename":"260e-fe0f","category":"objects"},{"aliases":["pager"],"filename":"1f4df","category":"objects"},{"aliases":["fax"],"filename":"1f4e0","category":"objects"},{"aliases":["tv"],"filename":"1f4fa","category":"objects"},{"aliases":["radio"],"filename":"1f4fb","category":"objects"},{"aliases":["studio_microphone"],"filename":"1f399","category":"objects"},{"aliases":["level_slider"],"filename":"1f39a","category":"objects"},{"aliases":["control_knobs"],"filename":"1f39b","category":"objects"},{"aliases":["stopwatch"],"filename":"23f1","category":"objects"},{"aliases":["timer_clock"],"filename":"23f2","category":"objects"},{"aliases":["alarm_clock"],"filename":"23f0","category":"objects"},{"aliases":["mantelpiece_clock"],"filename":"1f570","category":"objects"},{"aliases":["hourglass"],"filename":"231b-fe0f","category":"objects"},{"aliases":["hourglass_flowing_sand"],"filename":"23f3","category":"objects"},{"aliases":["satellite"],"filename":"1f4e1","category":"objects"},{"aliases":["battery"],"filename":"1f50b","category":"objects"},{"aliases":["electric_plug"],"filename":"1f50c","category":"objects"},{"aliases":["bulb"],"filename":"1f4a1","category":"objects"},{"aliases":["flashlight"],"filename":"1f526","category":"objects"},{"aliases":["candle"],"filename":"1f56f","category":"objects"},{"aliases":["wastebasket"],"filename":"1f5d1","category":"objects"},{"aliases":["oil_drum"],"filename":"1f6e2","category":"objects"},{"aliases":["money_with_wings"],"filename":"1f4b8","category":"objects"},{"aliases":["dollar"],"filename":"1f4b5","category":"objects"},{"aliases":["yen"],"filename":"1f4b4","category":"objects"},{"aliases":["euro"],"filename":"1f4b6","category":"objects"},{"aliases":["pound"],"filename":"1f4b7","category":"objects"},{"aliases":["moneybag"],"filename":"1f4b0","category":"objects"},{"aliases":["credit_card"],"filename":"1f4b3","category":"objects"},{"aliases":["gem"],"filename":"1f48e","category":"objects"},{"aliases":["balance_scale"],"filename":"2696-fe0f","category":"objects"},{"aliases":["wrench"],"filename":"1f527","category":"objects"},{"aliases":["hammer"],"filename":"1f528","category":"objects"},{"aliases":["hammer_and_pick"],"filename":"2692","category":"objects"},{"aliases":["hammer_and_wrench"],"filename":"1f6e0","category":"objects"},{"aliases":["pick"],"filename":"26cf","category":"objects"},{"aliases":["nut_and_bolt"],"filename":"1f529","category":"objects"},{"aliases":["gear"],"filename":"2699-fe0f","category":"objects"},{"aliases":["chains"],"filename":"26d3","category":"objects"},{"aliases":["gun"],"filename":"1f52b","category":"objects"},{"aliases":["bomb"],"filename":"1f4a3","category":"objects"},{"aliases":["hocho","knife"],"filename":"1f52a","category":"objects"},{"aliases":["dagger"],"filename":"1f5e1","category":"objects"},{"aliases":["crossed_swords"],"filename":"2694-fe0f","category":"objects"},{"aliases":["shield"],"filename":"1f6e1","category":"objects"},{"aliases":["smoking"],"filename":"1f6ac","category":"objects"},{"aliases":["coffin"],"filename":"26b0-fe0f","category":"objects"},{"aliases":["funeral_urn"],"filename":"26b1-fe0f","category":"objects"},{"aliases":["amphora"],"filename":"1f3fa","category":"objects"},{"aliases":["crystal_ball"],"filename":"1f52e","category":"objects"},{"aliases":["prayer_beads"],"filename":"1f4ff","category":"objects"},{"aliases":["barber"],"filename":"1f488","category":"objects"},{"aliases":["alembic"],"filename":"2697-fe0f","category":"objects"},{"aliases":["telescope"],"filename":"1f52d","category":"objects"},{"aliases":["microscope"],"filename":"1f52c","category":"objects"},{"aliases":["hole"],"filename":"1f573","category":"objects"},{"aliases":["pill"],"filename":"1f48a","category":"objects"},{"aliases":["syringe"],"filename":"1f489","category":"objects"},{"aliases":["thermometer"],"filename":"1f321","category":"objects"},{"aliases":["toilet"],"filename":"1f6bd","category":"objects"},{"aliases":["potable_water"],"filename":"1f6b0","category":"objects"},{"aliases":["shower"],"filename":"1f6bf","category":"objects"},{"aliases":["bathtub"],"filename":"1f6c1","category":"objects"},{"aliases":["bath"],"filename":"1f6c0","category":"objects"},{"aliases":["bellhop_bell"],"filename":"1f6ce","category":"objects"},{"aliases":["key"],"filename":"1f511","category":"objects"},{"aliases":["old_key"],"filename":"1f5dd","category":"objects"},{"aliases":["door"],"filename":"1f6aa","category":"objects"},{"aliases":["couch_and_lamp"],"filename":"1f6cb","category":"objects"},{"aliases":["bed"],"filename":"1f6cf","category":"objects"},{"aliases":["sleeping_bed"],"filename":"1f6cc","category":"objects"},{"aliases":["framed_picture"],"filename":"1f5bc","category":"objects"},{"aliases":["shopping"],"filename":"1f6cd","category":"objects"},{"aliases":["shopping_cart"],"filename":"1f6d2","category":"objects"},{"aliases":["gift"],"filename":"1f381","category":"objects"},{"aliases":["balloon"],"filename":"1f388","category":"objects"},{"aliases":["flags"],"filename":"1f38f","category":"objects"},{"aliases":["ribbon"],"filename":"1f380","category":"objects"},{"aliases":["confetti_ball"],"filename":"1f38a","category":"objects"},{"aliases":["tada"],"filename":"1f389","category":"objects"},{"aliases":["dolls"],"filename":"1f38e","category":"objects"},{"aliases":["izakaya_lantern","lantern"],"filename":"1f3ee","category":"objects"},{"aliases":["wind_chime"],"filename":"1f390","category":"objects"},{"aliases":["email","envelope"],"filename":"2709-fe0f","category":"objects"},{"aliases":["envelope_with_arrow"],"filename":"1f4e9","category":"objects"},{"aliases":["incoming_envelope"],"filename":"1f4e8","category":"objects"},{"aliases":["e-mail"],"filename":"1f4e7","category":"objects"},{"aliases":["love_letter"],"filename":"1f48c","category":"objects"},{"aliases":["inbox_tray"],"filename":"1f4e5","category":"objects"},{"aliases":["outbox_tray"],"filename":"1f4e4","category":"objects"},{"aliases":["package"],"filename":"1f4e6","category":"objects"},{"aliases":["label"],"filename":"1f3f7","category":"objects"},{"aliases":["mailbox_closed"],"filename":"1f4ea","category":"objects"},{"aliases":["mailbox"],"filename":"1f4eb","category":"objects"},{"aliases":["mailbox_with_mail"],"filename":"1f4ec","category":"objects"},{"aliases":["mailbox_with_no_mail"],"filename":"1f4ed","category":"objects"},{"aliases":["postbox"],"filename":"1f4ee","category":"objects"},{"aliases":["postal_horn"],"filename":"1f4ef","category":"objects"},{"aliases":["scroll"],"filename":"1f4dc","category":"objects"},{"aliases":["page_with_curl"],"filename":"1f4c3","category":"objects"},{"aliases":["page_facing_up"],"filename":"1f4c4","category":"objects"},{"aliases":["bookmark_tabs"],"filename":"1f4d1","category":"objects"},{"aliases":["bar_chart"],"filename":"1f4ca","category":"objects"},{"aliases":["chart_with_upwards_trend"],"filename":"1f4c8","category":"objects"},{"aliases":["chart_with_downwards_trend"],"filename":"1f4c9","category":"objects"},{"aliases":["spiral_notepad"],"filename":"1f5d2","category":"objects"},{"aliases":["spiral_calendar"],"filename":"1f5d3","category":"objects"},{"aliases":["calendar"],"filename":"1f4c6","category":"objects"},{"aliases":["date"],"filename":"1f4c5","category":"objects"},{"aliases":["card_index"],"filename":"1f4c7","category":"objects"},{"aliases":["card_file_box"],"filename":"1f5c3","category":"objects"},{"aliases":["ballot_box"],"filename":"1f5f3","category":"objects"},{"aliases":["file_cabinet"],"filename":"1f5c4","category":"objects"},{"aliases":["clipboard"],"filename":"1f4cb","category":"objects"},{"aliases":["file_folder"],"filename":"1f4c1","category":"objects"},{"aliases":["open_file_folder"],"filename":"1f4c2","category":"objects"},{"aliases":["card_index_dividers"],"filename":"1f5c2","category":"objects"},{"aliases":["newspaper_roll"],"filename":"1f5de","category":"objects"},{"aliases":["newspaper"],"filename":"1f4f0","category":"objects"},{"aliases":["notebook"],"filename":"1f4d3","category":"objects"},{"aliases":["notebook_with_decorative_cover"],"filename":"1f4d4","category":"objects"},{"aliases":["ledger"],"filename":"1f4d2","category":"objects"},{"aliases":["closed_book"],"filename":"1f4d5","category":"objects"},{"aliases":["green_book"],"filename":"1f4d7","category":"objects"},{"aliases":["blue_book"],"filename":"1f4d8","category":"objects"},{"aliases":["orange_book"],"filename":"1f4d9","category":"objects"},{"aliases":["books"],"filename":"1f4da","category":"objects"},{"aliases":["book","open_book"],"filename":"1f4d6","category":"objects"},{"aliases":["bookmark"],"filename":"1f516","category":"objects"},{"aliases":["link"],"filename":"1f517","category":"objects"},{"aliases":["paperclip"],"filename":"1f4ce","category":"objects"},{"aliases":["paperclips"],"filename":"1f587","category":"objects"},{"aliases":["triangular_ruler"],"filename":"1f4d0","category":"objects"},{"aliases":["straight_ruler"],"filename":"1f4cf","category":"objects"},{"aliases":["pushpin"],"filename":"1f4cc","category":"objects"},{"aliases":["round_pushpin"],"filename":"1f4cd","category":"objects"},{"aliases":["scissors"],"filename":"2702-fe0f","category":"objects"},{"aliases":["pen"],"filename":"1f58a","category":"objects"},{"aliases":["fountain_pen"],"filename":"1f58b","category":"objects"},{"aliases":["black_nib"],"filename":"2712-fe0f","category":"objects"},{"aliases":["paintbrush"],"filename":"1f58c","category":"objects"},{"aliases":["crayon"],"filename":"1f58d","category":"objects"},{"aliases":["memo","pencil"],"filename":"1f4dd","category":"objects"},{"aliases":["pencil2"],"filename":"270f-fe0f","category":"objects"},{"aliases":["mag"],"filename":"1f50d","category":"objects"},{"aliases":["mag_right"],"filename":"1f50e","category":"objects"},{"aliases":["lock_with_ink_pen"],"filename":"1f50f","category":"objects"},{"aliases":["closed_lock_with_key"],"filename":"1f510","category":"objects"},{"aliases":["lock"],"filename":"1f512","category":"objects"},{"aliases":["unlock"],"filename":"1f513","category":"objects"},{"aliases":["heart"],"filename":"2764-fe0f","category":"symbols"},{"aliases":["yellow_heart"],"filename":"1f49b","category":"symbols"},{"aliases":["green_heart"],"filename":"1f49a","category":"symbols"},{"aliases":["blue_heart"],"filename":"1f499","category":"symbols"},{"aliases":["purple_heart"],"filename":"1f49c","category":"symbols"},{"aliases":["black_heart"],"filename":"1f5a4","category":"symbols"},{"aliases":["broken_heart"],"filename":"1f494","category":"symbols"},{"aliases":["heavy_heart_exclamation"],"filename":"2763-fe0f","category":"symbols"},{"aliases":["two_hearts"],"filename":"1f495","category":"symbols"},{"aliases":["revolving_hearts"],"filename":"1f49e","category":"symbols"},{"aliases":["heartbeat"],"filename":"1f493","category":"symbols"},{"aliases":["heartpulse"],"filename":"1f497","category":"symbols"},{"aliases":["sparkling_heart"],"filename":"1f496","category":"symbols"},{"aliases":["cupid"],"filename":"1f498","category":"symbols"},{"aliases":["gift_heart"],"filename":"1f49d","category":"symbols"},{"aliases":["heart_decoration"],"filename":"1f49f","category":"symbols"},{"aliases":["peace_symbol"],"filename":"262e-fe0f","category":"symbols"},{"aliases":["latin_cross"],"filename":"271d-fe0f","category":"symbols"},{"aliases":["star_and_crescent"],"filename":"262a-fe0f","category":"symbols"},{"aliases":["om"],"filename":"1f549","category":"symbols"},{"aliases":["wheel_of_dharma"],"filename":"2638-fe0f","category":"symbols"},{"aliases":["star_of_david"],"filename":"2721-fe0f","category":"symbols"},{"aliases":["six_pointed_star"],"filename":"1f52f","category":"symbols"},{"aliases":["menorah"],"filename":"1f54e","category":"symbols"},{"aliases":["yin_yang"],"filename":"262f-fe0f","category":"symbols"},{"aliases":["orthodox_cross"],"filename":"2626-fe0f","category":"symbols"},{"aliases":["place_of_worship"],"filename":"1f6d0","category":"symbols"},{"aliases":["ophiuchus"],"filename":"26ce","category":"symbols"},{"aliases":["aries"],"filename":"2648-fe0f","category":"symbols"},{"aliases":["taurus"],"filename":"2649-fe0f","category":"symbols"},{"aliases":["gemini"],"filename":"264a-fe0f","category":"symbols"},{"aliases":["cancer"],"filename":"264b-fe0f","category":"symbols"},{"aliases":["leo"],"filename":"264c-fe0f","category":"symbols"},{"aliases":["virgo"],"filename":"264d-fe0f","category":"symbols"},{"aliases":["libra"],"filename":"264e-fe0f","category":"symbols"},{"aliases":["scorpius"],"filename":"264f-fe0f","category":"symbols"},{"aliases":["sagittarius"],"filename":"2650-fe0f","category":"symbols"},{"aliases":["capricorn"],"filename":"2651-fe0f","category":"symbols"},{"aliases":["aquarius"],"filename":"2652-fe0f","category":"symbols"},{"aliases":["pisces"],"filename":"2653-fe0f","category":"symbols"},{"aliases":["id"],"filename":"1f194","category":"symbols"},{"aliases":["atom_symbol"],"filename":"269b-fe0f","category":"symbols"},{"aliases":["accept"],"filename":"1f251","category":"symbols"},{"aliases":["radioactive"],"filename":"2622-fe0f","category":"symbols"},{"aliases":["biohazard"],"filename":"2623-fe0f","category":"symbols"},{"aliases":["mobile_phone_off"],"filename":"1f4f4","category":"symbols"},{"aliases":["vibration_mode"],"filename":"1f4f3","category":"symbols"},{"aliases":["u6709"],"filename":"1f236","category":"symbols"},{"aliases":["u7121"],"filename":"1f21a-fe0f","category":"symbols"},{"aliases":["u7533"],"filename":"1f238","category":"symbols"},{"aliases":["u55b6"],"filename":"1f23a","category":"symbols"},{"aliases":["u6708"],"filename":"1f237-fe0f","category":"symbols"},{"aliases":["eight_pointed_black_star"],"filename":"2734-fe0f","category":"symbols"},{"aliases":["vs"],"filename":"1f19a","category":"symbols"},{"aliases":["white_flower"],"filename":"1f4ae","category":"symbols"},{"aliases":["ideograph_advantage"],"filename":"1f250","category":"symbols"},{"aliases":["secret"],"filename":"3299-fe0f","category":"symbols"},{"aliases":["congratulations"],"filename":"3297-fe0f","category":"symbols"},{"aliases":["u5408"],"filename":"1f234","category":"symbols"},{"aliases":["u6e80"],"filename":"1f235","category":"symbols"},{"aliases":["u5272"],"filename":"1f239","category":"symbols"},{"aliases":["u7981"],"filename":"1f232","category":"symbols"},{"aliases":["a"],"filename":"1f170-fe0f","category":"symbols"},{"aliases":["b"],"filename":"1f171-fe0f","category":"symbols"},{"aliases":["ab"],"filename":"1f18e","category":"symbols"},{"aliases":["cl"],"filename":"1f191","category":"symbols"},{"aliases":["o2"],"filename":"1f17e-fe0f","category":"symbols"},{"aliases":["sos"],"filename":"1f198","category":"symbols"},{"aliases":["x"],"filename":"274c","category":"symbols"},{"aliases":["o"],"filename":"2b55-fe0f","category":"symbols"},{"aliases":["stop_sign"],"filename":"1f6d1","category":"symbols"},{"aliases":["no_entry"],"filename":"26d4-fe0f","category":"symbols"},{"aliases":["name_badge"],"filename":"1f4db","category":"symbols"},{"aliases":["no_entry_sign"],"filename":"1f6ab","category":"symbols"},{"aliases":["100"],"filename":"1f4af","category":"symbols"},{"aliases":["anger"],"filename":"1f4a2","category":"symbols"},{"aliases":["hotsprings"],"filename":"2668-fe0f","category":"symbols"},{"aliases":["no_pedestrians"],"filename":"1f6b7","category":"symbols"},{"aliases":["do_not_litter"],"filename":"1f6af","category":"symbols"},{"aliases":["no_bicycles"],"filename":"1f6b3","category":"symbols"},{"aliases":["non-potable_water"],"filename":"1f6b1","category":"symbols"},{"aliases":["underage"],"filename":"1f51e","category":"symbols"},{"aliases":["no_mobile_phones"],"filename":"1f4f5","category":"symbols"},{"aliases":["no_smoking"],"filename":"1f6ad","category":"symbols"},{"aliases":["exclamation","heavy_exclamation_mark"],"filename":"2757-fe0f","category":"symbols"},{"aliases":["grey_exclamation"],"filename":"2755","category":"symbols"},{"aliases":["question"],"filename":"2753","category":"symbols"},{"aliases":["grey_question"],"filename":"2754","category":"symbols"},{"aliases":["bangbang"],"filename":"203c-fe0f","category":"symbols"},{"aliases":["interrobang"],"filename":"2049-fe0f","category":"symbols"},{"aliases":["low_brightness"],"filename":"1f505","category":"symbols"},{"aliases":["high_brightness"],"filename":"1f506","category":"symbols"},{"aliases":["part_alternation_mark"],"filename":"303d-fe0f","category":"symbols"},{"aliases":["warning"],"filename":"26a0-fe0f","category":"symbols"},{"aliases":["children_crossing"],"filename":"1f6b8","category":"symbols"},{"aliases":["trident"],"filename":"1f531","category":"symbols"},{"aliases":["fleur_de_lis"],"filename":"269c-fe0f","category":"symbols"},{"aliases":["beginner"],"filename":"1f530","category":"symbols"},{"aliases":["recycle"],"filename":"267b-fe0f","category":"symbols"},{"aliases":["white_check_mark"],"filename":"2705","category":"symbols"},{"aliases":["u6307"],"filename":"1f22f-fe0f","category":"symbols"},{"aliases":["chart"],"filename":"1f4b9","category":"symbols"},{"aliases":["sparkle"],"filename":"2747-fe0f","category":"symbols"},{"aliases":["eight_spoked_asterisk"],"filename":"2733-fe0f","category":"symbols"},{"aliases":["negative_squared_cross_mark"],"filename":"274e","category":"symbols"},{"aliases":["globe_with_meridians"],"filename":"1f310","category":"symbols"},{"aliases":["diamond_shape_with_a_dot_inside"],"filename":"1f4a0","category":"symbols"},{"aliases":["m"],"filename":"24c2-fe0f","category":"symbols"},{"aliases":["cyclone"],"filename":"1f300","category":"symbols"},{"aliases":["zzz"],"filename":"1f4a4","category":"symbols"},{"aliases":["atm"],"filename":"1f3e7","category":"symbols"},{"aliases":["wc"],"filename":"1f6be","category":"symbols"},{"aliases":["wheelchair"],"filename":"267f-fe0f","category":"symbols"},{"aliases":["parking"],"filename":"1f17f-fe0f","category":"symbols"},{"aliases":["u7a7a"],"filename":"1f233","category":"symbols"},{"aliases":["sa"],"filename":"1f202-fe0f","category":"symbols"},{"aliases":["passport_control"],"filename":"1f6c2","category":"symbols"},{"aliases":["customs"],"filename":"1f6c3","category":"symbols"},{"aliases":["baggage_claim"],"filename":"1f6c4","category":"symbols"},{"aliases":["left_luggage"],"filename":"1f6c5","category":"symbols"},{"aliases":["mens"],"filename":"1f6b9","category":"symbols"},{"aliases":["womens"],"filename":"1f6ba","category":"symbols"},{"aliases":["baby_symbol"],"filename":"1f6bc","category":"symbols"},{"aliases":["restroom"],"filename":"1f6bb","category":"symbols"},{"aliases":["put_litter_in_its_place"],"filename":"1f6ae","category":"symbols"},{"aliases":["cinema"],"filename":"1f3a6","category":"symbols"},{"aliases":["signal_strength"],"filename":"1f4f6","category":"symbols"},{"aliases":["koko"],"filename":"1f201","category":"symbols"},{"aliases":["symbols"],"filename":"1f523","category":"symbols"},{"aliases":["information_source"],"filename":"2139-fe0f","category":"symbols"},{"aliases":["abc"],"filename":"1f524","category":"symbols"},{"aliases":["abcd"],"filename":"1f521","category":"symbols"},{"aliases":["capital_abcd"],"filename":"1f520","category":"symbols"},{"aliases":["ng"],"filename":"1f196","category":"symbols"},{"aliases":["ok"],"filename":"1f197","category":"symbols"},{"aliases":["up"],"filename":"1f199","category":"symbols"},{"aliases":["cool"],"filename":"1f192","category":"symbols"},{"aliases":["new"],"filename":"1f195","category":"symbols"},{"aliases":["free"],"filename":"1f193","category":"symbols"},{"aliases":["zero"],"filename":"0030-fe0f-20e3","category":"symbols"},{"aliases":["one"],"filename":"0031-fe0f-20e3","category":"symbols"},{"aliases":["two"],"filename":"0032-fe0f-20e3","category":"symbols"},{"aliases":["three"],"filename":"0033-fe0f-20e3","category":"symbols"},{"aliases":["four"],"filename":"0034-fe0f-20e3","category":"symbols"},{"aliases":["five"],"filename":"0035-fe0f-20e3","category":"symbols"},{"aliases":["six"],"filename":"0036-fe0f-20e3","category":"symbols"},{"aliases":["seven"],"filename":"0037-fe0f-20e3","category":"symbols"},{"aliases":["eight"],"filename":"0038-fe0f-20e3","category":"symbols"},{"aliases":["nine"],"filename":"0039-fe0f-20e3","category":"symbols"},{"aliases":["keycap_ten"],"filename":"1f51f","category":"symbols"},{"aliases":["1234"],"filename":"1f522","category":"symbols"},{"aliases":["hash"],"filename":"0023-fe0f-20e3","category":"symbols"},{"aliases":["asterisk"],"filename":"002a-fe0f-20e3","category":"symbols"},{"aliases":["arrow_forward"],"filename":"25b6-fe0f","category":"symbols"},{"aliases":["pause_button"],"filename":"23f8","category":"symbols"},{"aliases":["play_or_pause_button"],"filename":"23ef","category":"symbols"},{"aliases":["stop_button"],"filename":"23f9","category":"symbols"},{"aliases":["record_button"],"filename":"23fa","category":"symbols"},{"aliases":["next_track_button"],"filename":"23ed","category":"symbols"},{"aliases":["previous_track_button"],"filename":"23ee","category":"symbols"},{"aliases":["fast_forward"],"filename":"23e9","category":"symbols"},{"aliases":["rewind"],"filename":"23ea","category":"symbols"},{"aliases":["arrow_double_up"],"filename":"23eb","category":"symbols"},{"aliases":["arrow_double_down"],"filename":"23ec","category":"symbols"},{"aliases":["arrow_backward"],"filename":"25c0-fe0f","category":"symbols"},{"aliases":["arrow_up_small"],"filename":"1f53c","category":"symbols"},{"aliases":["arrow_down_small"],"filename":"1f53d","category":"symbols"},{"aliases":["arrow_right"],"filename":"27a1-fe0f","category":"symbols"},{"aliases":["arrow_left"],"filename":"2b05-fe0f","category":"symbols"},{"aliases":["arrow_up"],"filename":"2b06-fe0f","category":"symbols"},{"aliases":["arrow_down"],"filename":"2b07-fe0f","category":"symbols"},{"aliases":["arrow_upper_right"],"filename":"2197-fe0f","category":"symbols"},{"aliases":["arrow_lower_right"],"filename":"2198-fe0f","category":"symbols"},{"aliases":["arrow_lower_left"],"filename":"2199-fe0f","category":"symbols"},{"aliases":["arrow_upper_left"],"filename":"2196-fe0f","category":"symbols"},{"aliases":["arrow_up_down"],"filename":"2195-fe0f","category":"symbols"},{"aliases":["left_right_arrow"],"filename":"2194-fe0f","category":"symbols"},{"aliases":["arrow_right_hook"],"filename":"21aa-fe0f","category":"symbols"},{"aliases":["leftwards_arrow_with_hook"],"filename":"21a9-fe0f","category":"symbols"},{"aliases":["arrow_heading_up"],"filename":"2934-fe0f","category":"symbols"},{"aliases":["arrow_heading_down"],"filename":"2935-fe0f","category":"symbols"},{"aliases":["twisted_rightwards_arrows"],"filename":"1f500","category":"symbols"},{"aliases":["repeat"],"filename":"1f501","category":"symbols"},{"aliases":["repeat_one"],"filename":"1f502","category":"symbols"},{"aliases":["arrows_counterclockwise"],"filename":"1f504","category":"symbols"},{"aliases":["arrows_clockwise"],"filename":"1f503","category":"symbols"},{"aliases":["musical_note"],"filename":"1f3b5","category":"symbols"},{"aliases":["notes"],"filename":"1f3b6","category":"symbols"},{"aliases":["heavy_plus_sign"],"filename":"2795","category":"symbols"},{"aliases":["heavy_minus_sign"],"filename":"2796","category":"symbols"},{"aliases":["heavy_division_sign"],"filename":"2797","category":"symbols"},{"aliases":["heavy_multiplication_x"],"filename":"2716-fe0f","category":"symbols"},{"aliases":["heavy_dollar_sign"],"filename":"1f4b2","category":"symbols"},{"aliases":["currency_exchange"],"filename":"1f4b1","category":"symbols"},{"aliases":["tm"],"filename":"2122-fe0f","category":"symbols"},{"aliases":["copyright"],"filename":"00a9-fe0f","category":"symbols"},{"aliases":["registered"],"filename":"00ae-fe0f","category":"symbols"},{"aliases":["wavy_dash"],"filename":"3030-fe0f","category":"symbols"},{"aliases":["curly_loop"],"filename":"27b0","category":"symbols"},{"aliases":["loop"],"filename":"27bf","category":"symbols"},{"aliases":["end"],"filename":"1f51a","category":"symbols"},{"aliases":["back"],"filename":"1f519","category":"symbols"},{"aliases":["on"],"filename":"1f51b","category":"symbols"},{"aliases":["top"],"filename":"1f51d","category":"symbols"},{"aliases":["soon"],"filename":"1f51c","category":"symbols"},{"aliases":["heavy_check_mark"],"filename":"2714-fe0f","category":"symbols"},{"aliases":["ballot_box_with_check"],"filename":"2611-fe0f","category":"symbols"},{"aliases":["radio_button"],"filename":"1f518","category":"symbols"},{"aliases":["white_circle"],"filename":"26aa-fe0f","category":"symbols"},{"aliases":["black_circle"],"filename":"26ab-fe0f","category":"symbols"},{"aliases":["red_circle"],"filename":"1f534","category":"symbols"},{"aliases":["large_blue_circle"],"filename":"1f535","category":"symbols"},{"aliases":["small_red_triangle"],"filename":"1f53a","category":"symbols"},{"aliases":["small_red_triangle_down"],"filename":"1f53b","category":"symbols"},{"aliases":["small_orange_diamond"],"filename":"1f538","category":"symbols"},{"aliases":["small_blue_diamond"],"filename":"1f539","category":"symbols"},{"aliases":["large_orange_diamond"],"filename":"1f536","category":"symbols"},{"aliases":["large_blue_diamond"],"filename":"1f537","category":"symbols"},{"aliases":["white_square_button"],"filename":"1f533","category":"symbols"},{"aliases":["black_square_button"],"filename":"1f532","category":"symbols"},{"aliases":["black_small_square"],"filename":"25aa-fe0f","category":"symbols"},{"aliases":["white_small_square"],"filename":"25ab-fe0f","category":"symbols"},{"aliases":["black_medium_small_square"],"filename":"25fe-fe0f","category":"symbols"},{"aliases":["white_medium_small_square"],"filename":"25fd-fe0f","category":"symbols"},{"aliases":["black_medium_square"],"filename":"25fc-fe0f","category":"symbols"},{"aliases":["white_medium_square"],"filename":"25fb-fe0f","category":"symbols"},{"aliases":["black_large_square"],"filename":"2b1b-fe0f","category":"symbols"},{"aliases":["white_large_square"],"filename":"2b1c-fe0f","category":"symbols"},{"aliases":["speaker"],"filename":"1f508","category":"symbols"},{"aliases":["mute"],"filename":"1f507","category":"symbols"},{"aliases":["sound"],"filename":"1f509","category":"symbols"},{"aliases":["loud_sound"],"filename":"1f50a","category":"symbols"},{"aliases":["bell"],"filename":"1f514","category":"symbols"},{"aliases":["no_bell"],"filename":"1f515","category":"symbols"},{"aliases":["mega"],"filename":"1f4e3","category":"symbols"},{"aliases":["loudspeaker"],"filename":"1f4e2","category":"symbols"},{"aliases":["eye_speech_bubble"],"filename":"1f441-200d-1f5e8","category":"symbols"},{"aliases":["speech_balloon"],"filename":"1f4ac","category":"symbols"},{"aliases":["thought_balloon"],"filename":"1f4ad","category":"symbols"},{"aliases":["right_anger_bubble"],"filename":"1f5ef","category":"symbols"},{"aliases":["spades"],"filename":"2660-fe0f","category":"symbols"},{"aliases":["clubs"],"filename":"2663-fe0f","category":"symbols"},{"aliases":["hearts"],"filename":"2665-fe0f","category":"symbols"},{"aliases":["diamonds"],"filename":"2666-fe0f","category":"symbols"},{"aliases":["black_joker"],"filename":"1f0cf","category":"symbols"},{"aliases":["flower_playing_cards"],"filename":"1f3b4","category":"symbols"},{"aliases":["mahjong"],"filename":"1f004-fe0f","category":"symbols"},{"aliases":["clock1"],"filename":"1f550","category":"symbols"},{"aliases":["clock2"],"filename":"1f551","category":"symbols"},{"aliases":["clock3"],"filename":"1f552","category":"symbols"},{"aliases":["clock4"],"filename":"1f553","category":"symbols"},{"aliases":["clock5"],"filename":"1f554","category":"symbols"},{"aliases":["clock6"],"filename":"1f555","category":"symbols"},{"aliases":["clock7"],"filename":"1f556","category":"symbols"},{"aliases":["clock8"],"filename":"1f557","category":"symbols"},{"aliases":["clock9"],"filename":"1f558","category":"symbols"},{"aliases":["clock10"],"filename":"1f559","category":"symbols"},{"aliases":["clock11"],"filename":"1f55a","category":"symbols"},{"aliases":["clock12"],"filename":"1f55b","category":"symbols"},{"aliases":["clock130"],"filename":"1f55c","category":"symbols"},{"aliases":["clock230"],"filename":"1f55d","category":"symbols"},{"aliases":["clock330"],"filename":"1f55e","category":"symbols"},{"aliases":["clock430"],"filename":"1f55f","category":"symbols"},{"aliases":["clock530"],"filename":"1f560","category":"symbols"},{"aliases":["clock630"],"filename":"1f561","category":"symbols"},{"aliases":["clock730"],"filename":"1f562","category":"symbols"},{"aliases":["clock830"],"filename":"1f563","category":"symbols"},{"aliases":["clock930"],"filename":"1f564","category":"symbols"},{"aliases":["clock1030"],"filename":"1f565","category":"symbols"},{"aliases":["clock1130"],"filename":"1f566","category":"symbols"},{"aliases":["clock1230"],"filename":"1f567","category":"symbols"},{"aliases":["white_flag"],"filename":"1f3f3-fe0f","category":"flags"},{"aliases":["black_flag"],"filename":"1f3f4","category":"flags"},{"aliases":["checkered_flag"],"filename":"1f3c1","category":"flags"},{"aliases":["triangular_flag_on_post"],"filename":"1f6a9","category":"flags"},{"aliases":["rainbow_flag"],"filename":"1f3f3-fe0f-200d-1f308","category":"flags"},{"aliases":["afghanistan"],"filename":"1f1e6-1f1eb","category":"flags"},{"aliases":["aland_islands"],"filename":"1f1e6-1f1fd","category":"flags"},{"aliases":["albania"],"filename":"1f1e6-1f1f1","category":"flags"},{"aliases":["algeria"],"filename":"1f1e9-1f1ff","category":"flags"},{"aliases":["american_samoa"],"filename":"1f1e6-1f1f8","category":"flags"},{"aliases":["andorra"],"filename":"1f1e6-1f1e9","category":"flags"},{"aliases":["angola"],"filename":"1f1e6-1f1f4","category":"flags"},{"aliases":["anguilla"],"filename":"1f1e6-1f1ee","category":"flags"},{"aliases":["antarctica"],"filename":"1f1e6-1f1f6","category":"flags"},{"aliases":["antigua_barbuda"],"filename":"1f1e6-1f1ec","category":"flags"},{"aliases":["argentina"],"filename":"1f1e6-1f1f7","category":"flags"},{"aliases":["armenia"],"filename":"1f1e6-1f1f2","category":"flags"},{"aliases":["aruba"],"filename":"1f1e6-1f1fc","category":"flags"},{"aliases":["australia"],"filename":"1f1e6-1f1fa","category":"flags"},{"aliases":["austria"],"filename":"1f1e6-1f1f9","category":"flags"},{"aliases":["azerbaijan"],"filename":"1f1e6-1f1ff","category":"flags"},{"aliases":["bahamas"],"filename":"1f1e7-1f1f8","category":"flags"},{"aliases":["bahrain"],"filename":"1f1e7-1f1ed","category":"flags"},{"aliases":["bangladesh"],"filename":"1f1e7-1f1e9","category":"flags"},{"aliases":["barbados"],"filename":"1f1e7-1f1e7","category":"flags"},{"aliases":["belarus"],"filename":"1f1e7-1f1fe","category":"flags"},{"aliases":["belgium"],"filename":"1f1e7-1f1ea","category":"flags"},{"aliases":["belize"],"filename":"1f1e7-1f1ff","category":"flags"},{"aliases":["benin"],"filename":"1f1e7-1f1ef","category":"flags"},{"aliases":["bermuda"],"filename":"1f1e7-1f1f2","category":"flags"},{"aliases":["bhutan"],"filename":"1f1e7-1f1f9","category":"flags"},{"aliases":["bolivia"],"filename":"1f1e7-1f1f4","category":"flags"},{"aliases":["caribbean_netherlands"],"filename":"1f1e7-1f1f6","category":"flags"},{"aliases":["bosnia_herzegovina"],"filename":"1f1e7-1f1e6","category":"flags"},{"aliases":["botswana"],"filename":"1f1e7-1f1fc","category":"flags"},{"aliases":["brazil"],"filename":"1f1e7-1f1f7","category":"flags"},{"aliases":["british_indian_ocean_territory"],"filename":"1f1ee-1f1f4","category":"flags"},{"aliases":["british_virgin_islands"],"filename":"1f1fb-1f1ec","category":"flags"},{"aliases":["brunei"],"filename":"1f1e7-1f1f3","category":"flags"},{"aliases":["bulgaria"],"filename":"1f1e7-1f1ec","category":"flags"},{"aliases":["burkina_faso"],"filename":"1f1e7-1f1eb","category":"flags"},{"aliases":["burundi"],"filename":"1f1e7-1f1ee","category":"flags"},{"aliases":["cape_verde"],"filename":"1f1e8-1f1fb","category":"flags"},{"aliases":["cambodia"],"filename":"1f1f0-1f1ed","category":"flags"},{"aliases":["cameroon"],"filename":"1f1e8-1f1f2","category":"flags"},{"aliases":["canada","ca"],"filename":"1f1e8-1f1e6","category":"flags"},{"aliases":["canary_islands"],"filename":"1f1ee-1f1e8","category":"flags"},{"aliases":["cayman_islands"],"filename":"1f1f0-1f1fe","category":"flags"},{"aliases":["central_african_republic"],"filename":"1f1e8-1f1eb","category":"flags"},{"aliases":["chad"],"filename":"1f1f9-1f1e9","category":"flags"},{"aliases":["chile"],"filename":"1f1e8-1f1f1","category":"flags"},{"aliases":["cn"],"filename":"1f1e8-1f1f3","category":"flags"},{"aliases":["christmas_island"],"filename":"1f1e8-1f1fd","category":"flags"},{"aliases":["cocos_islands"],"filename":"1f1e8-1f1e8","category":"flags"},{"aliases":["colombia"],"filename":"1f1e8-1f1f4","category":"flags"},{"aliases":["comoros"],"filename":"1f1f0-1f1f2","category":"flags"},{"aliases":["congo_brazzaville"],"filename":"1f1e8-1f1ec","category":"flags"},{"aliases":["congo_kinshasa"],"filename":"1f1e8-1f1e9","category":"flags"},{"aliases":["cook_islands"],"filename":"1f1e8-1f1f0","category":"flags"},{"aliases":["costa_rica"],"filename":"1f1e8-1f1f7","category":"flags"},{"aliases":["cote_divoire"],"filename":"1f1e8-1f1ee","category":"flags"},{"aliases":["croatia"],"filename":"1f1ed-1f1f7","category":"flags"},{"aliases":["cuba"],"filename":"1f1e8-1f1fa","category":"flags"},{"aliases":["curacao"],"filename":"1f1e8-1f1fc","category":"flags"},{"aliases":["cyprus"],"filename":"1f1e8-1f1fe","category":"flags"},{"aliases":["czech_republic"],"filename":"1f1e8-1f1ff","category":"flags"},{"aliases":["denmark"],"filename":"1f1e9-1f1f0","category":"flags"},{"aliases":["djibouti"],"filename":"1f1e9-1f1ef","category":"flags"},{"aliases":["dominica"],"filename":"1f1e9-1f1f2","category":"flags"},{"aliases":["dominican_republic"],"filename":"1f1e9-1f1f4","category":"flags"},{"aliases":["ecuador"],"filename":"1f1ea-1f1e8","category":"flags"},{"aliases":["egypt"],"filename":"1f1ea-1f1ec","category":"flags"},{"aliases":["el_salvador"],"filename":"1f1f8-1f1fb","category":"flags"},{"aliases":["equatorial_guinea"],"filename":"1f1ec-1f1f6","category":"flags"},{"aliases":["eritrea"],"filename":"1f1ea-1f1f7","category":"flags"},{"aliases":["estonia"],"filename":"1f1ea-1f1ea","category":"flags"},{"aliases":["ethiopia"],"filename":"1f1ea-1f1f9","category":"flags"},{"aliases":["eu","european_union"],"filename":"1f1ea-1f1fa","category":"flags"},{"aliases":["falkland_islands"],"filename":"1f1eb-1f1f0","category":"flags"},{"aliases":["faroe_islands"],"filename":"1f1eb-1f1f4","category":"flags"},{"aliases":["fiji"],"filename":"1f1eb-1f1ef","category":"flags"},{"aliases":["finland"],"filename":"1f1eb-1f1ee","category":"flags"},{"aliases":["fr"],"filename":"1f1eb-1f1f7","category":"flags"},{"aliases":["french_guiana"],"filename":"1f1ec-1f1eb","category":"flags"},{"aliases":["french_polynesia"],"filename":"1f1f5-1f1eb","category":"flags"},{"aliases":["french_southern_territories"],"filename":"1f1f9-1f1eb","category":"flags"},{"aliases":["gabon"],"filename":"1f1ec-1f1e6","category":"flags"},{"aliases":["gambia"],"filename":"1f1ec-1f1f2","category":"flags"},{"aliases":["georgia"],"filename":"1f1ec-1f1ea","category":"flags"},{"aliases":["de"],"filename":"1f1e9-1f1ea","category":"flags"},{"aliases":["ghana"],"filename":"1f1ec-1f1ed","category":"flags"},{"aliases":["gibraltar"],"filename":"1f1ec-1f1ee","category":"flags"},{"aliases":["greece"],"filename":"1f1ec-1f1f7","category":"flags"},{"aliases":["greenland"],"filename":"1f1ec-1f1f1","category":"flags"},{"aliases":["grenada"],"filename":"1f1ec-1f1e9","category":"flags"},{"aliases":["guadeloupe"],"filename":"1f1ec-1f1f5","category":"flags"},{"aliases":["guam"],"filename":"1f1ec-1f1fa","category":"flags"},{"aliases":["guatemala"],"filename":"1f1ec-1f1f9","category":"flags"},{"aliases":["guernsey"],"filename":"1f1ec-1f1ec","category":"flags"},{"aliases":["guinea"],"filename":"1f1ec-1f1f3","category":"flags"},{"aliases":["guinea_bissau"],"filename":"1f1ec-1f1fc","category":"flags"},{"aliases":["guyana"],"filename":"1f1ec-1f1fe","category":"flags"},{"aliases":["haiti"],"filename":"1f1ed-1f1f9","category":"flags"},{"aliases":["honduras"],"filename":"1f1ed-1f1f3","category":"flags"},{"aliases":["hong_kong"],"filename":"1f1ed-1f1f0","category":"flags"},{"aliases":["hungary"],"filename":"1f1ed-1f1fa","category":"flags"},{"aliases":["iceland"],"filename":"1f1ee-1f1f8","category":"flags"},{"aliases":["india"],"filename":"1f1ee-1f1f3","category":"flags"},{"aliases":["indonesia"],"filename":"1f1ee-1f1e9","category":"flags"},{"aliases":["iran"],"filename":"1f1ee-1f1f7","category":"flags"},{"aliases":["iraq"],"filename":"1f1ee-1f1f6","category":"flags"},{"aliases":["ireland"],"filename":"1f1ee-1f1ea","category":"flags"},{"aliases":["isle_of_man"],"filename":"1f1ee-1f1f2","category":"flags"},{"aliases":["israel"],"filename":"1f1ee-1f1f1","category":"flags"},{"aliases":["it"],"filename":"1f1ee-1f1f9","category":"flags"},{"aliases":["jamaica"],"filename":"1f1ef-1f1f2","category":"flags"},{"aliases":["jp"],"filename":"1f1ef-1f1f5","category":"flags"},{"aliases":["crossed_flags"],"filename":"1f38c","category":"flags"},{"aliases":["jersey"],"filename":"1f1ef-1f1ea","category":"flags"},{"aliases":["jordan"],"filename":"1f1ef-1f1f4","category":"flags"},{"aliases":["kazakhstan"],"filename":"1f1f0-1f1ff","category":"flags"},{"aliases":["kenya"],"filename":"1f1f0-1f1ea","category":"flags"},{"aliases":["kiribati"],"filename":"1f1f0-1f1ee","category":"flags"},{"aliases":["kosovo"],"filename":"1f1fd-1f1f0","category":"flags"},{"aliases":["kuwait"],"filename":"1f1f0-1f1fc","category":"flags"},{"aliases":["kyrgyzstan"],"filename":"1f1f0-1f1ec","category":"flags"},{"aliases":["laos"],"filename":"1f1f1-1f1e6","category":"flags"},{"aliases":["latvia"],"filename":"1f1f1-1f1fb","category":"flags"},{"aliases":["lebanon"],"filename":"1f1f1-1f1e7","category":"flags"},{"aliases":["lesotho"],"filename":"1f1f1-1f1f8","category":"flags"},{"aliases":["liberia"],"filename":"1f1f1-1f1f7","category":"flags"},{"aliases":["libya"],"filename":"1f1f1-1f1fe","category":"flags"},{"aliases":["liechtenstein"],"filename":"1f1f1-1f1ee","category":"flags"},{"aliases":["lithuania"],"filename":"1f1f1-1f1f9","category":"flags"},{"aliases":["luxembourg"],"filename":"1f1f1-1f1fa","category":"flags"},{"aliases":["macau"],"filename":"1f1f2-1f1f4","category":"flags"},{"aliases":["macedonia"],"filename":"1f1f2-1f1f0","category":"flags"},{"aliases":["madagascar"],"filename":"1f1f2-1f1ec","category":"flags"},{"aliases":["malawi"],"filename":"1f1f2-1f1fc","category":"flags"},{"aliases":["malaysia"],"filename":"1f1f2-1f1fe","category":"flags"},{"aliases":["maldives"],"filename":"1f1f2-1f1fb","category":"flags"},{"aliases":["mali"],"filename":"1f1f2-1f1f1","category":"flags"},{"aliases":["malta"],"filename":"1f1f2-1f1f9","category":"flags"},{"aliases":["marshall_islands"],"filename":"1f1f2-1f1ed","category":"flags"},{"aliases":["martinique"],"filename":"1f1f2-1f1f6","category":"flags"},{"aliases":["mauritania"],"filename":"1f1f2-1f1f7","category":"flags"},{"aliases":["mauritius"],"filename":"1f1f2-1f1fa","category":"flags"},{"aliases":["mayotte"],"filename":"1f1fe-1f1f9","category":"flags"},{"aliases":["mexico"],"filename":"1f1f2-1f1fd","category":"flags"},{"aliases":["micronesia"],"filename":"1f1eb-1f1f2","category":"flags"},{"aliases":["moldova"],"filename":"1f1f2-1f1e9","category":"flags"},{"aliases":["monaco"],"filename":"1f1f2-1f1e8","category":"flags"},{"aliases":["mongolia"],"filename":"1f1f2-1f1f3","category":"flags"},{"aliases":["montenegro"],"filename":"1f1f2-1f1ea","category":"flags"},{"aliases":["montserrat"],"filename":"1f1f2-1f1f8","category":"flags"},{"aliases":["morocco"],"filename":"1f1f2-1f1e6","category":"flags"},{"aliases":["mozambique"],"filename":"1f1f2-1f1ff","category":"flags"},{"aliases":["myanmar"],"filename":"1f1f2-1f1f2","category":"flags"},{"aliases":["namibia"],"filename":"1f1f3-1f1e6","category":"flags"},{"aliases":["nauru"],"filename":"1f1f3-1f1f7","category":"flags"},{"aliases":["nepal"],"filename":"1f1f3-1f1f5","category":"flags"},{"aliases":["netherlands"],"filename":"1f1f3-1f1f1","category":"flags"},{"aliases":["new_caledonia"],"filename":"1f1f3-1f1e8","category":"flags"},{"aliases":["new_zealand"],"filename":"1f1f3-1f1ff","category":"flags"},{"aliases":["nicaragua"],"filename":"1f1f3-1f1ee","category":"flags"},{"aliases":["niger"],"filename":"1f1f3-1f1ea","category":"flags"},{"aliases":["nigeria"],"filename":"1f1f3-1f1ec","category":"flags"},{"aliases":["niue"],"filename":"1f1f3-1f1fa","category":"flags"},{"aliases":["norfolk_island"],"filename":"1f1f3-1f1eb","category":"flags"},{"aliases":["northern_mariana_islands"],"filename":"1f1f2-1f1f5","category":"flags"},{"aliases":["north_korea"],"filename":"1f1f0-1f1f5","category":"flags"},{"aliases":["norway"],"filename":"1f1f3-1f1f4","category":"flags"},{"aliases":["oman"],"filename":"1f1f4-1f1f2","category":"flags"},{"aliases":["pakistan","pk"],"filename":"1f1f5-1f1f0","category":"flags"},{"aliases":["palau"],"filename":"1f1f5-1f1fc","category":"flags"},{"aliases":["palestinian_territories"],"filename":"1f1f5-1f1f8","category":"flags"},{"aliases":["panama"],"filename":"1f1f5-1f1e6","category":"flags"},{"aliases":["papua_new_guinea"],"filename":"1f1f5-1f1ec","category":"flags"},{"aliases":["paraguay"],"filename":"1f1f5-1f1fe","category":"flags"},{"aliases":["peru"],"filename":"1f1f5-1f1ea","category":"flags"},{"aliases":["philippines"],"filename":"1f1f5-1f1ed","category":"flags"},{"aliases":["pitcairn_islands"],"filename":"1f1f5-1f1f3","category":"flags"},{"aliases":["poland"],"filename":"1f1f5-1f1f1","category":"flags"},{"aliases":["portugal"],"filename":"1f1f5-1f1f9","category":"flags"},{"aliases":["puerto_rico"],"filename":"1f1f5-1f1f7","category":"flags"},{"aliases":["qatar"],"filename":"1f1f6-1f1e6","category":"flags"},{"aliases":["reunion"],"filename":"1f1f7-1f1ea","category":"flags"},{"aliases":["romania"],"filename":"1f1f7-1f1f4","category":"flags"},{"aliases":["ru"],"filename":"1f1f7-1f1fa","category":"flags"},{"aliases":["rwanda"],"filename":"1f1f7-1f1fc","category":"flags"},{"aliases":["st_barthelemy"],"filename":"1f1e7-1f1f1","category":"flags"},{"aliases":["st_helena"],"filename":"1f1f8-1f1ed","category":"flags"},{"aliases":["st_kitts_nevis"],"filename":"1f1f0-1f1f3","category":"flags"},{"aliases":["st_lucia"],"filename":"1f1f1-1f1e8","category":"flags"},{"aliases":["st_pierre_miquelon"],"filename":"1f1f5-1f1f2","category":"flags"},{"aliases":["st_vincent_grenadines"],"filename":"1f1fb-1f1e8","category":"flags"},{"aliases":["samoa"],"filename":"1f1fc-1f1f8","category":"flags"},{"aliases":["san_marino"],"filename":"1f1f8-1f1f2","category":"flags"},{"aliases":["sao_tome_principe"],"filename":"1f1f8-1f1f9","category":"flags"},{"aliases":["saudi_arabia"],"filename":"1f1f8-1f1e6","category":"flags"},{"aliases":["senegal"],"filename":"1f1f8-1f1f3","category":"flags"},{"aliases":["serbia"],"filename":"1f1f7-1f1f8","category":"flags"},{"aliases":["seychelles"],"filename":"1f1f8-1f1e8","category":"flags"},{"aliases":["sierra_leone"],"filename":"1f1f8-1f1f1","category":"flags"},{"aliases":["singapore"],"filename":"1f1f8-1f1ec","category":"flags"},{"aliases":["sint_maarten"],"filename":"1f1f8-1f1fd","category":"flags"},{"aliases":["slovakia"],"filename":"1f1f8-1f1f0","category":"flags"},{"aliases":["slovenia"],"filename":"1f1f8-1f1ee","category":"flags"},{"aliases":["solomon_islands"],"filename":"1f1f8-1f1e7","category":"flags"},{"aliases":["somalia"],"filename":"1f1f8-1f1f4","category":"flags"},{"aliases":["south_africa","za"],"filename":"1f1ff-1f1e6","category":"flags"},{"aliases":["south_georgia_south_sandwich_islands"],"filename":"1f1ec-1f1f8","category":"flags"},{"aliases":["kr"],"filename":"1f1f0-1f1f7","category":"flags"},{"aliases":["south_sudan"],"filename":"1f1f8-1f1f8","category":"flags"},{"aliases":["es"],"filename":"1f1ea-1f1f8","category":"flags"},{"aliases":["sri_lanka"],"filename":"1f1f1-1f1f0","category":"flags"},{"aliases":["sudan"],"filename":"1f1f8-1f1e9","category":"flags"},{"aliases":["suriname"],"filename":"1f1f8-1f1f7","category":"flags"},{"aliases":["swaziland"],"filename":"1f1f8-1f1ff","category":"flags"},{"aliases":["sweden"],"filename":"1f1f8-1f1ea","category":"flags"},{"aliases":["switzerland"],"filename":"1f1e8-1f1ed","category":"flags"},{"aliases":["syria"],"filename":"1f1f8-1f1fe","category":"flags"},{"aliases":["taiwan"],"filename":"1f1f9-1f1fc","category":"flags"},{"aliases":["tajikistan"],"filename":"1f1f9-1f1ef","category":"flags"},{"aliases":["tanzania"],"filename":"1f1f9-1f1ff","category":"flags"},{"aliases":["thailand"],"filename":"1f1f9-1f1ed","category":"flags"},{"aliases":["timor_leste"],"filename":"1f1f9-1f1f1","category":"flags"},{"aliases":["togo"],"filename":"1f1f9-1f1ec","category":"flags"},{"aliases":["tokelau"],"filename":"1f1f9-1f1f0","category":"flags"},{"aliases":["tonga"],"filename":"1f1f9-1f1f4","category":"flags"},{"aliases":["trinidad_tobago"],"filename":"1f1f9-1f1f9","category":"flags"},{"aliases":["tunisia"],"filename":"1f1f9-1f1f3","category":"flags"},{"aliases":["tr"],"filename":"1f1f9-1f1f7","category":"flags"},{"aliases":["turkmenistan"],"filename":"1f1f9-1f1f2","category":"flags"},{"aliases":["turks_caicos_islands"],"filename":"1f1f9-1f1e8","category":"flags"},{"aliases":["tuvalu"],"filename":"1f1f9-1f1fb","category":"flags"},{"aliases":["uganda"],"filename":"1f1fa-1f1ec","category":"flags"},{"aliases":["ukraine"],"filename":"1f1fa-1f1e6","category":"flags"},{"aliases":["united_arab_emirates"],"filename":"1f1e6-1f1ea","category":"flags"},{"aliases":["gb","uk"],"filename":"1f1ec-1f1e7","category":"flags"},{"aliases":["us"],"filename":"1f1fa-1f1f8","category":"flags"},{"aliases":["us_virgin_islands"],"filename":"1f1fb-1f1ee","category":"flags"},{"aliases":["uruguay"],"filename":"1f1fa-1f1fe","category":"flags"},{"aliases":["uzbekistan"],"filename":"1f1fa-1f1ff","category":"flags"},{"aliases":["vanuatu"],"filename":"1f1fb-1f1fa","category":"flags"},{"aliases":["vatican_city"],"filename":"1f1fb-1f1e6","category":"flags"},{"aliases":["venezuela"],"filename":"1f1fb-1f1ea","category":"flags"},{"aliases":["vietnam"],"filename":"1f1fb-1f1f3","category":"flags"},{"aliases":["wallis_futuna"],"filename":"1f1fc-1f1eb","category":"flags"},{"aliases":["western_sahara"],"filename":"1f1ea-1f1ed","category":"flags"},{"aliases":["yemen"],"filename":"1f1fe-1f1ea","category":"flags"},{"aliases":["zambia"],"filename":"1f1ff-1f1f2","category":"flags"},{"aliases":["zimbabwe"],"filename":"1f1ff-1f1fc","category":"flags"},{"aliases":["bowtie"],"filename":"bowtie","category":"custom"},{"aliases":["feelsgood"],"filename":"feelsgood","category":"custom"},{"aliases":["finnadie"],"filename":"finnadie","category":"custom"},{"aliases":["goberserk"],"filename":"goberserk","category":"custom"},{"aliases":["godmode"],"filename":"godmode","category":"custom"},{"aliases":["hurtrealbad"],"filename":"hurtrealbad","category":"custom"},{"aliases":["neckbeard"],"filename":"neckbeard","category":"custom"},{"aliases":["octocat"],"filename":"octocat","category":"custom"},{"aliases":["rage1"],"filename":"rage1","category":"custom"},{"aliases":["rage2"],"filename":"rage2","category":"custom"},{"aliases":["rage3"],"filename":"rage3","category":"custom"},{"aliases":["rage4"],"filename":"rage4","category":"custom"},{"aliases":["shipit","squirrel"],"filename":"shipit","category":"custom"},{"aliases":["suspect"],"filename":"suspect","category":"custom"},{"aliases":["trollface"],"filename":"trollface","category":"custom"},{"aliases":["mattermost"],"filename":"mattermost","category":"custom"}];
-
-export const EmojiIndicesByAlias = new Map([["grinning",0],["smiley",1],["smile",2],["grin",3],["laughing",4],["satisfied",4],["sweat_smile",5],["joy",6],["rofl",7],["relaxed",8],["blush",9],["innocent",10],["slightly_smiling_face",11],["upside_down_face",12],["wink",13],["relieved",14],["heart_eyes",15],["kissing_heart",16],["kissing",17],["kissing_smiling_eyes",18],["kissing_closed_eyes",19],["yum",20],["stuck_out_tongue_winking_eye",21],["stuck_out_tongue_closed_eyes",22],["stuck_out_tongue",23],["money_mouth_face",24],["hugs",25],["nerd_face",26],["sunglasses",27],["clown_face",28],["cowboy_hat_face",29],["smirk",30],["unamused",31],["disappointed",32],["pensive",33],["worried",34],["confused",35],["slightly_frowning_face",36],["frowning_face",37],["persevere",38],["confounded",39],["tired_face",40],["weary",41],["triumph",42],["angry",43],["rage",44],["pout",44],["no_mouth",45],["neutral_face",46],["expressionless",47],["hushed",48],["frowning",49],["anguished",50],["open_mouth",51],["astonished",52],["dizzy_face",53],["flushed",54],["scream",55],["fearful",56],["cold_sweat",57],["cry",58],["disappointed_relieved",59],["drooling_face",60],["sob",61],["sweat",62],["sleepy",63],["sleeping",64],["roll_eyes",65],["thinking",66],["lying_face",67],["grimacing",68],["zipper_mouth_face",69],["nauseated_face",70],["sneezing_face",71],["mask",72],["face_with_thermometer",73],["face_with_head_bandage",74],["smiling_imp",75],["imp",76],["japanese_ogre",77],["japanese_goblin",78],["hankey",79],["poop",79],["shit",79],["ghost",80],["skull",81],["skull_and_crossbones",82],["alien",83],["space_invader",84],["robot",85],["jack_o_lantern",86],["smiley_cat",87],["smile_cat",88],["joy_cat",89],["heart_eyes_cat",90],["smirk_cat",91],["kissing_cat",92],["scream_cat",93],["crying_cat_face",94],["pouting_cat",95],["open_hands",96],["raised_hands",97],["clap",98],["pray",99],["handshake",100],["+1",101],["thumbsup",101],["-1",102],["thumbsdown",102],["fist_oncoming",103],["facepunch",103],["punch",103],["fist_raised",104],["fist",104],["fist_left",105],["fist_right",106],["crossed_fingers",107],["v",108],["metal",109],["ok_hand",110],["point_left",111],["point_right",112],["point_up_2",113],["point_down",114],["point_up",115],["hand",116],["raised_hand",116],["raised_back_of_hand",117],["raised_hand_with_fingers_splayed",118],["vulcan_salute",119],["wave",120],["call_me_hand",121],["muscle",122],["middle_finger",123],["fu",123],["writing_hand",124],["selfie",125],["nail_care",126],["ring",127],["lipstick",128],["kiss",129],["lips",130],["tongue",131],["ear",132],["nose",133],["footprints",134],["eye",135],["eyes",136],["speaking_head",137],["bust_in_silhouette",138],["busts_in_silhouette",139],["baby",140],["boy",141],["girl",142],["man",143],["woman",144],["blonde_woman",145],["blonde_man",146],["person_with_blond_hair",146],["older_man",147],["older_woman",148],["man_with_gua_pi_mao",149],["woman_with_turban",150],["man_with_turban",151],["policewoman",152],["policeman",153],["cop",153],["construction_worker_woman",154],["construction_worker_man",155],["construction_worker",155],["guardswoman",156],["guardsman",157],["female_detective",158],["male_detective",159],["detective",159],["woman_health_worker",160],["man_health_worker",161],["woman_farmer",162],["man_farmer",163],["woman_cook",164],["man_cook",165],["woman_student",166],["man_student",167],["woman_singer",168],["man_singer",169],["woman_teacher",170],["man_teacher",171],["woman_factory_worker",172],["man_factory_worker",173],["woman_technologist",174],["man_technologist",175],["woman_office_worker",176],["man_office_worker",177],["woman_mechanic",178],["man_mechanic",179],["woman_scientist",180],["man_scientist",181],["woman_artist",182],["man_artist",183],["woman_firefighter",184],["man_firefighter",185],["woman_pilot",186],["man_pilot",187],["woman_astronaut",188],["man_astronaut",189],["woman_judge",190],["man_judge",191],["mrs_claus",192],["santa",193],["princess",194],["prince",195],["bride_with_veil",196],["man_in_tuxedo",197],["angel",198],["pregnant_woman",199],["bowing_woman",200],["bowing_man",201],["bow",201],["tipping_hand_woman",202],["information_desk_person",202],["tipping_hand_man",203],["no_good_woman",204],["no_good",204],["ng_woman",204],["no_good_man",205],["ng_man",205],["ok_woman",206],["ok_man",207],["raising_hand_woman",208],["raising_hand",208],["raising_hand_man",209],["woman_facepalming",210],["man_facepalming",211],["woman_shrugging",212],["man_shrugging",213],["pouting_woman",214],["person_with_pouting_face",214],["pouting_man",215],["frowning_woman",216],["person_frowning",216],["frowning_man",217],["haircut_woman",218],["haircut",218],["haircut_man",219],["massage_woman",220],["massage",220],["massage_man",221],["business_suit_levitating",222],["dancer",223],["man_dancing",224],["dancing_women",225],["dancers",225],["dancing_men",226],["walking_woman",227],["walking_man",228],["walking",228],["running_woman",229],["running_man",230],["runner",230],["running",230],["couple",231],["two_women_holding_hands",232],["two_men_holding_hands",233],["couple_with_heart_woman_man",234],["couple_with_heart",234],["couple_with_heart_woman_woman",235],["couple_with_heart_man_man",236],["couplekiss_man_woman",237],["couplekiss_woman_woman",238],["couplekiss_man_man",239],["family_man_woman_boy",240],["family",240],["family_man_woman_girl",241],["family_man_woman_girl_boy",242],["family_man_woman_boy_boy",243],["family_man_woman_girl_girl",244],["family_woman_woman_boy",245],["family_woman_woman_girl",246],["family_woman_woman_girl_boy",247],["family_woman_woman_boy_boy",248],["family_woman_woman_girl_girl",249],["family_man_man_boy",250],["family_man_man_girl",251],["family_man_man_girl_boy",252],["family_man_man_boy_boy",253],["family_man_man_girl_girl",254],["family_woman_boy",255],["family_woman_girl",256],["family_woman_girl_boy",257],["family_woman_boy_boy",258],["family_woman_girl_girl",259],["family_man_boy",260],["family_man_girl",261],["family_man_girl_boy",262],["family_man_boy_boy",263],["family_man_girl_girl",264],["womans_clothes",265],["shirt",266],["tshirt",266],["jeans",267],["necktie",268],["dress",269],["bikini",270],["kimono",271],["high_heel",272],["sandal",273],["boot",274],["mans_shoe",275],["shoe",275],["athletic_shoe",276],["womans_hat",277],["tophat",278],["mortar_board",279],["crown",280],["rescue_worker_helmet",281],["school_satchel",282],["pouch",283],["purse",284],["handbag",285],["briefcase",286],["eyeglasses",287],["dark_sunglasses",288],["closed_umbrella",289],["open_umbrella",290],["dog",291],["cat",292],["mouse",293],["hamster",294],["rabbit",295],["fox_face",296],["bear",297],["panda_face",298],["koala",299],["tiger",300],["lion",301],["cow",302],["pig",303],["pig_nose",304],["frog",305],["monkey_face",306],["see_no_evil",307],["hear_no_evil",308],["speak_no_evil",309],["monkey",310],["chicken",311],["penguin",312],["bird",313],["baby_chick",314],["hatching_chick",315],["hatched_chick",316],["duck",317],["eagle",318],["owl",319],["bat",320],["wolf",321],["boar",322],["horse",323],["unicorn",324],["bee",325],["honeybee",325],["bug",326],["butterfly",327],["snail",328],["shell",329],["beetle",330],["ant",331],["spider",332],["spider_web",333],["turtle",334],["snake",335],["lizard",336],["scorpion",337],["crab",338],["squid",339],["octopus",340],["shrimp",341],["tropical_fish",342],["fish",343],["blowfish",344],["dolphin",345],["flipper",345],["shark",346],["whale",347],["whale2",348],["crocodile",349],["leopard",350],["tiger2",351],["water_buffalo",352],["ox",353],["cow2",354],["deer",355],["dromedary_camel",356],["camel",357],["elephant",358],["rhinoceros",359],["gorilla",360],["racehorse",361],["pig2",362],["goat",363],["ram",364],["sheep",365],["dog2",366],["poodle",367],["cat2",368],["rooster",369],["turkey",370],["dove",371],["rabbit2",372],["mouse2",373],["rat",374],["chipmunk",375],["feet",376],["paw_prints",376],["dragon",377],["dragon_face",378],["cactus",379],["christmas_tree",380],["evergreen_tree",381],["deciduous_tree",382],["palm_tree",383],["seedling",384],["herb",385],["shamrock",386],["four_leaf_clover",387],["bamboo",388],["tanabata_tree",389],["leaves",390],["fallen_leaf",391],["maple_leaf",392],["mushroom",393],["ear_of_rice",394],["bouquet",395],["tulip",396],["rose",397],["wilted_flower",398],["sunflower",399],["blossom",400],["cherry_blossom",401],["hibiscus",402],["earth_americas",403],["earth_africa",404],["earth_asia",405],["full_moon",406],["waning_gibbous_moon",407],["last_quarter_moon",408],["waning_crescent_moon",409],["new_moon",410],["waxing_crescent_moon",411],["first_quarter_moon",412],["moon",413],["waxing_gibbous_moon",413],["new_moon_with_face",414],["full_moon_with_face",415],["sun_with_face",416],["first_quarter_moon_with_face",417],["last_quarter_moon_with_face",418],["crescent_moon",419],["dizzy",420],["star",421],["star2",422],["sparkles",423],["zap",424],["fire",425],["boom",426],["collision",426],["comet",427],["sunny",428],["sun_behind_small_cloud",429],["partly_sunny",430],["sun_behind_large_cloud",431],["sun_behind_rain_cloud",432],["rainbow",433],["cloud",434],["cloud_with_rain",435],["cloud_with_lightning_and_rain",436],["cloud_with_lightning",437],["cloud_with_snow",438],["snowman_with_snow",439],["snowman",440],["snowflake",441],["wind_face",442],["dash",443],["tornado",444],["fog",445],["ocean",446],["droplet",447],["sweat_drops",448],["umbrella",449],["green_apple",450],["apple",451],["pear",452],["tangerine",453],["orange",453],["mandarin",453],["lemon",454],["banana",455],["watermelon",456],["grapes",457],["strawberry",458],["melon",459],["cherries",460],["peach",461],["pineapple",462],["kiwi_fruit",463],["avocado",464],["tomato",465],["eggplant",466],["cucumber",467],["carrot",468],["corn",469],["hot_pepper",470],["potato",471],["sweet_potato",472],["chestnut",473],["peanuts",474],["honey_pot",475],["croissant",476],["bread",477],["baguette_bread",478],["cheese",479],["egg",480],["fried_egg",481],["bacon",482],["pancakes",483],["fried_shrimp",484],["poultry_leg",485],["meat_on_bone",486],["pizza",487],["hotdog",488],["hamburger",489],["fries",490],["stuffed_flatbread",491],["taco",492],["burrito",493],["green_salad",494],["shallow_pan_of_food",495],["spaghetti",496],["ramen",497],["stew",498],["fish_cake",499],["sushi",500],["bento",501],["curry",502],["rice",503],["rice_ball",504],["rice_cracker",505],["oden",506],["dango",507],["shaved_ice",508],["ice_cream",509],["icecream",510],["cake",511],["birthday",512],["custard",513],["lollipop",514],["candy",515],["chocolate_bar",516],["popcorn",517],["doughnut",518],["cookie",519],["milk_glass",520],["baby_bottle",521],["coffee",522],["tea",523],["sake",524],["beer",525],["beers",526],["clinking_glasses",527],["wine_glass",528],["tumbler_glass",529],["cocktail",530],["tropical_drink",531],["champagne",532],["spoon",533],["fork_and_knife",534],["plate_with_cutlery",535],["soccer",536],["basketball",537],["football",538],["baseball",539],["tennis",540],["volleyball",541],["rugby_football",542],["8ball",543],["ping_pong",544],["badminton",545],["goal_net",546],["ice_hockey",547],["field_hockey",548],["cricket",549],["golf",550],["bow_and_arrow",551],["fishing_pole_and_fish",552],["boxing_glove",553],["martial_arts_uniform",554],["ice_skate",555],["ski",556],["skier",557],["snowboarder",558],["weight_lifting_woman",559],["weight_lifting_man",560],["person_fencing",561],["women_wrestling",562],["men_wrestling",563],["woman_cartwheeling",564],["man_cartwheeling",565],["basketball_woman",566],["basketball_man",567],["woman_playing_handball",568],["man_playing_handball",569],["golfing_woman",570],["golfing_man",571],["surfing_woman",572],["surfing_man",573],["surfer",573],["swimming_woman",574],["swimming_man",575],["swimmer",575],["woman_playing_water_polo",576],["man_playing_water_polo",577],["rowing_woman",578],["rowing_man",579],["rowboat",579],["horse_racing",580],["biking_woman",581],["biking_man",582],["bicyclist",582],["mountain_biking_woman",583],["mountain_biking_man",584],["mountain_bicyclist",584],["running_shirt_with_sash",585],["medal_sports",586],["medal_military",587],["1st_place_medal",588],["2nd_place_medal",589],["3rd_place_medal",590],["trophy",591],["rosette",592],["reminder_ribbon",593],["ticket",594],["tickets",595],["circus_tent",596],["woman_juggling",597],["man_juggling",598],["performing_arts",599],["art",600],["clapper",601],["microphone",602],["headphones",603],["musical_score",604],["musical_keyboard",605],["drum",606],["saxophone",607],["trumpet",608],["guitar",609],["violin",610],["game_die",611],["dart",612],["bowling",613],["video_game",614],["slot_machine",615],["car",616],["red_car",616],["taxi",617],["blue_car",618],["bus",619],["trolleybus",620],["racing_car",621],["police_car",622],["ambulance",623],["fire_engine",624],["minibus",625],["truck",626],["articulated_lorry",627],["tractor",628],["kick_scooter",629],["bike",630],["motor_scooter",631],["motorcycle",632],["rotating_light",633],["oncoming_police_car",634],["oncoming_bus",635],["oncoming_automobile",636],["oncoming_taxi",637],["aerial_tramway",638],["mountain_cableway",639],["suspension_railway",640],["railway_car",641],["train",642],["mountain_railway",643],["monorail",644],["bullettrain_side",645],["bullettrain_front",646],["light_rail",647],["steam_locomotive",648],["train2",649],["metro",650],["tram",651],["station",652],["helicopter",653],["small_airplane",654],["airplane",655],["flight_departure",656],["flight_arrival",657],["rocket",658],["artificial_satellite",659],["seat",660],["canoe",661],["boat",662],["sailboat",662],["motor_boat",663],["speedboat",664],["passenger_ship",665],["ferry",666],["ship",667],["anchor",668],["construction",669],["fuelpump",670],["busstop",671],["vertical_traffic_light",672],["traffic_light",673],["world_map",674],["moyai",675],["statue_of_liberty",676],["fountain",677],["tokyo_tower",678],["european_castle",679],["japanese_castle",680],["stadium",681],["ferris_wheel",682],["roller_coaster",683],["carousel_horse",684],["parasol_on_ground",685],["beach_umbrella",686],["desert_island",687],["mountain",688],["mountain_snow",689],["mount_fuji",690],["volcano",691],["desert",692],["camping",693],["tent",694],["railway_track",695],["motorway",696],["building_construction",697],["factory",698],["house",699],["house_with_garden",700],["houses",701],["derelict_house",702],["office",703],["department_store",704],["post_office",705],["european_post_office",706],["hospital",707],["bank",708],["hotel",709],["convenience_store",710],["school",711],["love_hotel",712],["wedding",713],["classical_building",714],["church",715],["mosque",716],["synagogue",717],["kaaba",718],["shinto_shrine",719],["japan",720],["rice_scene",721],["national_park",722],["sunrise",723],["sunrise_over_mountains",724],["stars",725],["sparkler",726],["fireworks",727],["city_sunrise",728],["city_sunset",729],["cityscape",730],["night_with_stars",731],["milky_way",732],["bridge_at_night",733],["foggy",734],["watch",735],["iphone",736],["calling",737],["computer",738],["keyboard",739],["desktop_computer",740],["printer",741],["computer_mouse",742],["trackball",743],["joystick",744],["clamp",745],["minidisc",746],["floppy_disk",747],["cd",748],["dvd",749],["vhs",750],["camera",751],["camera_flash",752],["video_camera",753],["movie_camera",754],["film_projector",755],["film_strip",756],["telephone_receiver",757],["phone",758],["telephone",758],["pager",759],["fax",760],["tv",761],["radio",762],["studio_microphone",763],["level_slider",764],["control_knobs",765],["stopwatch",766],["timer_clock",767],["alarm_clock",768],["mantelpiece_clock",769],["hourglass",770],["hourglass_flowing_sand",771],["satellite",772],["battery",773],["electric_plug",774],["bulb",775],["flashlight",776],["candle",777],["wastebasket",778],["oil_drum",779],["money_with_wings",780],["dollar",781],["yen",782],["euro",783],["pound",784],["moneybag",785],["credit_card",786],["gem",787],["balance_scale",788],["wrench",789],["hammer",790],["hammer_and_pick",791],["hammer_and_wrench",792],["pick",793],["nut_and_bolt",794],["gear",795],["chains",796],["gun",797],["bomb",798],["hocho",799],["knife",799],["dagger",800],["crossed_swords",801],["shield",802],["smoking",803],["coffin",804],["funeral_urn",805],["amphora",806],["crystal_ball",807],["prayer_beads",808],["barber",809],["alembic",810],["telescope",811],["microscope",812],["hole",813],["pill",814],["syringe",815],["thermometer",816],["toilet",817],["potable_water",818],["shower",819],["bathtub",820],["bath",821],["bellhop_bell",822],["key",823],["old_key",824],["door",825],["couch_and_lamp",826],["bed",827],["sleeping_bed",828],["framed_picture",829],["shopping",830],["shopping_cart",831],["gift",832],["balloon",833],["flags",834],["ribbon",835],["confetti_ball",836],["tada",837],["dolls",838],["izakaya_lantern",839],["lantern",839],["wind_chime",840],["email",841],["envelope",841],["envelope_with_arrow",842],["incoming_envelope",843],["e-mail",844],["love_letter",845],["inbox_tray",846],["outbox_tray",847],["package",848],["label",849],["mailbox_closed",850],["mailbox",851],["mailbox_with_mail",852],["mailbox_with_no_mail",853],["postbox",854],["postal_horn",855],["scroll",856],["page_with_curl",857],["page_facing_up",858],["bookmark_tabs",859],["bar_chart",860],["chart_with_upwards_trend",861],["chart_with_downwards_trend",862],["spiral_notepad",863],["spiral_calendar",864],["calendar",865],["date",866],["card_index",867],["card_file_box",868],["ballot_box",869],["file_cabinet",870],["clipboard",871],["file_folder",872],["open_file_folder",873],["card_index_dividers",874],["newspaper_roll",875],["newspaper",876],["notebook",877],["notebook_with_decorative_cover",878],["ledger",879],["closed_book",880],["green_book",881],["blue_book",882],["orange_book",883],["books",884],["book",885],["open_book",885],["bookmark",886],["link",887],["paperclip",888],["paperclips",889],["triangular_ruler",890],["straight_ruler",891],["pushpin",892],["round_pushpin",893],["scissors",894],["pen",895],["fountain_pen",896],["black_nib",897],["paintbrush",898],["crayon",899],["memo",900],["pencil",900],["pencil2",901],["mag",902],["mag_right",903],["lock_with_ink_pen",904],["closed_lock_with_key",905],["lock",906],["unlock",907],["heart",908],["yellow_heart",909],["green_heart",910],["blue_heart",911],["purple_heart",912],["black_heart",913],["broken_heart",914],["heavy_heart_exclamation",915],["two_hearts",916],["revolving_hearts",917],["heartbeat",918],["heartpulse",919],["sparkling_heart",920],["cupid",921],["gift_heart",922],["heart_decoration",923],["peace_symbol",924],["latin_cross",925],["star_and_crescent",926],["om",927],["wheel_of_dharma",928],["star_of_david",929],["six_pointed_star",930],["menorah",931],["yin_yang",932],["orthodox_cross",933],["place_of_worship",934],["ophiuchus",935],["aries",936],["taurus",937],["gemini",938],["cancer",939],["leo",940],["virgo",941],["libra",942],["scorpius",943],["sagittarius",944],["capricorn",945],["aquarius",946],["pisces",947],["id",948],["atom_symbol",949],["accept",950],["radioactive",951],["biohazard",952],["mobile_phone_off",953],["vibration_mode",954],["u6709",955],["u7121",956],["u7533",957],["u55b6",958],["u6708",959],["eight_pointed_black_star",960],["vs",961],["white_flower",962],["ideograph_advantage",963],["secret",964],["congratulations",965],["u5408",966],["u6e80",967],["u5272",968],["u7981",969],["a",970],["b",971],["ab",972],["cl",973],["o2",974],["sos",975],["x",976],["o",977],["stop_sign",978],["no_entry",979],["name_badge",980],["no_entry_sign",981],["100",982],["anger",983],["hotsprings",984],["no_pedestrians",985],["do_not_litter",986],["no_bicycles",987],["non-potable_water",988],["underage",989],["no_mobile_phones",990],["no_smoking",991],["exclamation",992],["heavy_exclamation_mark",992],["grey_exclamation",993],["question",994],["grey_question",995],["bangbang",996],["interrobang",997],["low_brightness",998],["high_brightness",999],["part_alternation_mark",1000],["warning",1001],["children_crossing",1002],["trident",1003],["fleur_de_lis",1004],["beginner",1005],["recycle",1006],["white_check_mark",1007],["u6307",1008],["chart",1009],["sparkle",1010],["eight_spoked_asterisk",1011],["negative_squared_cross_mark",1012],["globe_with_meridians",1013],["diamond_shape_with_a_dot_inside",1014],["m",1015],["cyclone",1016],["zzz",1017],["atm",1018],["wc",1019],["wheelchair",1020],["parking",1021],["u7a7a",1022],["sa",1023],["passport_control",1024],["customs",1025],["baggage_claim",1026],["left_luggage",1027],["mens",1028],["womens",1029],["baby_symbol",1030],["restroom",1031],["put_litter_in_its_place",1032],["cinema",1033],["signal_strength",1034],["koko",1035],["symbols",1036],["information_source",1037],["abc",1038],["abcd",1039],["capital_abcd",1040],["ng",1041],["ok",1042],["up",1043],["cool",1044],["new",1045],["free",1046],["zero",1047],["one",1048],["two",1049],["three",1050],["four",1051],["five",1052],["six",1053],["seven",1054],["eight",1055],["nine",1056],["keycap_ten",1057],["1234",1058],["hash",1059],["asterisk",1060],["arrow_forward",1061],["pause_button",1062],["play_or_pause_button",1063],["stop_button",1064],["record_button",1065],["next_track_button",1066],["previous_track_button",1067],["fast_forward",1068],["rewind",1069],["arrow_double_up",1070],["arrow_double_down",1071],["arrow_backward",1072],["arrow_up_small",1073],["arrow_down_small",1074],["arrow_right",1075],["arrow_left",1076],["arrow_up",1077],["arrow_down",1078],["arrow_upper_right",1079],["arrow_lower_right",1080],["arrow_lower_left",1081],["arrow_upper_left",1082],["arrow_up_down",1083],["left_right_arrow",1084],["arrow_right_hook",1085],["leftwards_arrow_with_hook",1086],["arrow_heading_up",1087],["arrow_heading_down",1088],["twisted_rightwards_arrows",1089],["repeat",1090],["repeat_one",1091],["arrows_counterclockwise",1092],["arrows_clockwise",1093],["musical_note",1094],["notes",1095],["heavy_plus_sign",1096],["heavy_minus_sign",1097],["heavy_division_sign",1098],["heavy_multiplication_x",1099],["heavy_dollar_sign",1100],["currency_exchange",1101],["tm",1102],["copyright",1103],["registered",1104],["wavy_dash",1105],["curly_loop",1106],["loop",1107],["end",1108],["back",1109],["on",1110],["top",1111],["soon",1112],["heavy_check_mark",1113],["ballot_box_with_check",1114],["radio_button",1115],["white_circle",1116],["black_circle",1117],["red_circle",1118],["large_blue_circle",1119],["small_red_triangle",1120],["small_red_triangle_down",1121],["small_orange_diamond",1122],["small_blue_diamond",1123],["large_orange_diamond",1124],["large_blue_diamond",1125],["white_square_button",1126],["black_square_button",1127],["black_small_square",1128],["white_small_square",1129],["black_medium_small_square",1130],["white_medium_small_square",1131],["black_medium_square",1132],["white_medium_square",1133],["black_large_square",1134],["white_large_square",1135],["speaker",1136],["mute",1137],["sound",1138],["loud_sound",1139],["bell",1140],["no_bell",1141],["mega",1142],["loudspeaker",1143],["eye_speech_bubble",1144],["speech_balloon",1145],["thought_balloon",1146],["right_anger_bubble",1147],["spades",1148],["clubs",1149],["hearts",1150],["diamonds",1151],["black_joker",1152],["flower_playing_cards",1153],["mahjong",1154],["clock1",1155],["clock2",1156],["clock3",1157],["clock4",1158],["clock5",1159],["clock6",1160],["clock7",1161],["clock8",1162],["clock9",1163],["clock10",1164],["clock11",1165],["clock12",1166],["clock130",1167],["clock230",1168],["clock330",1169],["clock430",1170],["clock530",1171],["clock630",1172],["clock730",1173],["clock830",1174],["clock930",1175],["clock1030",1176],["clock1130",1177],["clock1230",1178],["white_flag",1179],["black_flag",1180],["checkered_flag",1181],["triangular_flag_on_post",1182],["rainbow_flag",1183],["afghanistan",1184],["aland_islands",1185],["albania",1186],["algeria",1187],["american_samoa",1188],["andorra",1189],["angola",1190],["anguilla",1191],["antarctica",1192],["antigua_barbuda",1193],["argentina",1194],["armenia",1195],["aruba",1196],["australia",1197],["austria",1198],["azerbaijan",1199],["bahamas",1200],["bahrain",1201],["bangladesh",1202],["barbados",1203],["belarus",1204],["belgium",1205],["belize",1206],["benin",1207],["bermuda",1208],["bhutan",1209],["bolivia",1210],["caribbean_netherlands",1211],["bosnia_herzegovina",1212],["botswana",1213],["brazil",1214],["british_indian_ocean_territory",1215],["british_virgin_islands",1216],["brunei",1217],["bulgaria",1218],["burkina_faso",1219],["burundi",1220],["cape_verde",1221],["cambodia",1222],["cameroon",1223],["canada",1224],["ca",1224],["canary_islands",1225],["cayman_islands",1226],["central_african_republic",1227],["chad",1228],["chile",1229],["cn",1230],["christmas_island",1231],["cocos_islands",1232],["colombia",1233],["comoros",1234],["congo_brazzaville",1235],["congo_kinshasa",1236],["cook_islands",1237],["costa_rica",1238],["cote_divoire",1239],["croatia",1240],["cuba",1241],["curacao",1242],["cyprus",1243],["czech_republic",1244],["denmark",1245],["djibouti",1246],["dominica",1247],["dominican_republic",1248],["ecuador",1249],["egypt",1250],["el_salvador",1251],["equatorial_guinea",1252],["eritrea",1253],["estonia",1254],["ethiopia",1255],["eu",1256],["european_union",1256],["falkland_islands",1257],["faroe_islands",1258],["fiji",1259],["finland",1260],["fr",1261],["french_guiana",1262],["french_polynesia",1263],["french_southern_territories",1264],["gabon",1265],["gambia",1266],["georgia",1267],["de",1268],["ghana",1269],["gibraltar",1270],["greece",1271],["greenland",1272],["grenada",1273],["guadeloupe",1274],["guam",1275],["guatemala",1276],["guernsey",1277],["guinea",1278],["guinea_bissau",1279],["guyana",1280],["haiti",1281],["honduras",1282],["hong_kong",1283],["hungary",1284],["iceland",1285],["india",1286],["indonesia",1287],["iran",1288],["iraq",1289],["ireland",1290],["isle_of_man",1291],["israel",1292],["it",1293],["jamaica",1294],["jp",1295],["crossed_flags",1296],["jersey",1297],["jordan",1298],["kazakhstan",1299],["kenya",1300],["kiribati",1301],["kosovo",1302],["kuwait",1303],["kyrgyzstan",1304],["laos",1305],["latvia",1306],["lebanon",1307],["lesotho",1308],["liberia",1309],["libya",1310],["liechtenstein",1311],["lithuania",1312],["luxembourg",1313],["macau",1314],["macedonia",1315],["madagascar",1316],["malawi",1317],["malaysia",1318],["maldives",1319],["mali",1320],["malta",1321],["marshall_islands",1322],["martinique",1323],["mauritania",1324],["mauritius",1325],["mayotte",1326],["mexico",1327],["micronesia",1328],["moldova",1329],["monaco",1330],["mongolia",1331],["montenegro",1332],["montserrat",1333],["morocco",1334],["mozambique",1335],["myanmar",1336],["namibia",1337],["nauru",1338],["nepal",1339],["netherlands",1340],["new_caledonia",1341],["new_zealand",1342],["nicaragua",1343],["niger",1344],["nigeria",1345],["niue",1346],["norfolk_island",1347],["northern_mariana_islands",1348],["north_korea",1349],["norway",1350],["oman",1351],["pakistan",1352],["pk",1352],["palau",1353],["palestinian_territories",1354],["panama",1355],["papua_new_guinea",1356],["paraguay",1357],["peru",1358],["philippines",1359],["pitcairn_islands",1360],["poland",1361],["portugal",1362],["puerto_rico",1363],["qatar",1364],["reunion",1365],["romania",1366],["ru",1367],["rwanda",1368],["st_barthelemy",1369],["st_helena",1370],["st_kitts_nevis",1371],["st_lucia",1372],["st_pierre_miquelon",1373],["st_vincent_grenadines",1374],["samoa",1375],["san_marino",1376],["sao_tome_principe",1377],["saudi_arabia",1378],["senegal",1379],["serbia",1380],["seychelles",1381],["sierra_leone",1382],["singapore",1383],["sint_maarten",1384],["slovakia",1385],["slovenia",1386],["solomon_islands",1387],["somalia",1388],["south_africa",1389],["za",1389],["south_georgia_south_sandwich_islands",1390],["kr",1391],["south_sudan",1392],["es",1393],["sri_lanka",1394],["sudan",1395],["suriname",1396],["swaziland",1397],["sweden",1398],["switzerland",1399],["syria",1400],["taiwan",1401],["tajikistan",1402],["tanzania",1403],["thailand",1404],["timor_leste",1405],["togo",1406],["tokelau",1407],["tonga",1408],["trinidad_tobago",1409],["tunisia",1410],["tr",1411],["turkmenistan",1412],["turks_caicos_islands",1413],["tuvalu",1414],["uganda",1415],["ukraine",1416],["united_arab_emirates",1417],["gb",1418],["uk",1418],["us",1419],["us_virgin_islands",1420],["uruguay",1421],["uzbekistan",1422],["vanuatu",1423],["vatican_city",1424],["venezuela",1425],["vietnam",1426],["wallis_futuna",1427],["western_sahara",1428],["yemen",1429],["zambia",1430],["zimbabwe",1431],["bowtie",1432],["feelsgood",1433],["finnadie",1434],["goberserk",1435],["godmode",1436],["hurtrealbad",1437],["neckbeard",1438],["octocat",1439],["rage1",1440],["rage2",1441],["rage3",1442],["rage4",1443],["shipit",1444],["squirrel",1444],["suspect",1445],["trollface",1446],["mattermost",1447]]);
-
-export const EmojiIndicesByUnicode = new Map([["1f600",0],["1f600-fe0f",0],["1f603",1],["1f603-fe0f",1],["1f604",2],["1f604-fe0f",2],["1f601",3],["1f601-fe0f",3],["1f606",4],["1f606-fe0f",4],["1f605",5],["1f605-fe0f",5],["1f602",6],["1f602-fe0f",6],["1f923",7],["1f923-fe0f",7],["263a-fe0f",8],["1f60a",9],["1f60a-fe0f",9],["1f607",10],["1f607-fe0f",10],["1f642",11],["1f642-fe0f",11],["1f643",12],["1f643-fe0f",12],["1f609",13],["1f609-fe0f",13],["1f60c",14],["1f60c-fe0f",14],["1f60d",15],["1f60d-fe0f",15],["1f618",16],["1f618-fe0f",16],["1f617",17],["1f617-fe0f",17],["1f619",18],["1f619-fe0f",18],["1f61a",19],["1f61a-fe0f",19],["1f60b",20],["1f60b-fe0f",20],["1f61c",21],["1f61c-fe0f",21],["1f61d",22],["1f61d-fe0f",22],["1f61b",23],["1f61b-fe0f",23],["1f911",24],["1f911-fe0f",24],["1f917",25],["1f917-fe0f",25],["1f913",26],["1f913-fe0f",26],["1f60e",27],["1f60e-fe0f",27],["1f921",28],["1f921-fe0f",28],["1f920",29],["1f920-fe0f",29],["1f60f",30],["1f60f-fe0f",30],["1f612",31],["1f612-fe0f",31],["1f61e",32],["1f61e-fe0f",32],["1f614",33],["1f614-fe0f",33],["1f61f",34],["1f61f-fe0f",34],["1f615",35],["1f615-fe0f",35],["1f641",36],["1f641-fe0f",36],["2639-fe0f",37],["1f623",38],["1f623-fe0f",38],["1f616",39],["1f616-fe0f",39],["1f62b",40],["1f62b-fe0f",40],["1f629",41],["1f629-fe0f",41],["1f624",42],["1f624-fe0f",42],["1f620",43],["1f620-fe0f",43],["1f621",44],["1f621-fe0f",44],["1f636",45],["1f636-fe0f",45],["1f610",46],["1f610-fe0f",46],["1f611",47],["1f611-fe0f",47],["1f62f",48],["1f62f-fe0f",48],["1f626",49],["1f626-fe0f",49],["1f627",50],["1f627-fe0f",50],["1f62e",51],["1f62e-fe0f",51],["1f632",52],["1f632-fe0f",52],["1f635",53],["1f635-fe0f",53],["1f633",54],["1f633-fe0f",54],["1f631",55],["1f631-fe0f",55],["1f628",56],["1f628-fe0f",56],["1f630",57],["1f630-fe0f",57],["1f622",58],["1f622-fe0f",58],["1f625",59],["1f625-fe0f",59],["1f924",60],["1f924-fe0f",60],["1f62d",61],["1f62d-fe0f",61],["1f613",62],["1f613-fe0f",62],["1f62a",63],["1f62a-fe0f",63],["1f634",64],["1f634-fe0f",64],["1f644",65],["1f644-fe0f",65],["1f914",66],["1f914-fe0f",66],["1f925",67],["1f925-fe0f",67],["1f62c",68],["1f62c-fe0f",68],["1f910",69],["1f910-fe0f",69],["1f922",70],["1f922-fe0f",70],["1f927",71],["1f927-fe0f",71],["1f637",72],["1f637-fe0f",72],["1f912",73],["1f912-fe0f",73],["1f915",74],["1f915-fe0f",74],["1f608",75],["1f608-fe0f",75],["1f47f",76],["1f47f-fe0f",76],["1f479",77],["1f479-fe0f",77],["1f47a",78],["1f47a-fe0f",78],["1f4a9",79],["1f4a9-fe0f",79],["1f47b",80],["1f47b-fe0f",80],["1f480",81],["1f480-fe0f",81],["2620-fe0f",82],["1f47d",83],["1f47d-fe0f",83],["1f47e",84],["1f47e-fe0f",84],["1f916",85],["1f916-fe0f",85],["1f383",86],["1f383-fe0f",86],["1f63a",87],["1f63a-fe0f",87],["1f638",88],["1f638-fe0f",88],["1f639",89],["1f639-fe0f",89],["1f63b",90],["1f63b-fe0f",90],["1f63c",91],["1f63c-fe0f",91],["1f63d",92],["1f63d-fe0f",92],["1f640",93],["1f640-fe0f",93],["1f63f",94],["1f63f-fe0f",94],["1f63e",95],["1f63e-fe0f",95],["1f450",96],["1f450-fe0f",96],["1f64c",97],["1f64c-fe0f",97],["1f44f",98],["1f44f-fe0f",98],["1f64f",99],["1f64f-fe0f",99],["1f91d",100],["1f91d-fe0f",100],["1f44d",101],["1f44d-fe0f",101],["1f44e",102],["1f44e-fe0f",102],["1f44a",103],["1f44a-fe0f",103],["270a",104],["270a-fe0f",104],["1f91b",105],["1f91b-fe0f",105],["1f91c",106],["1f91c-fe0f",106],["1f91e",107],["1f91e-fe0f",107],["270c-fe0f",108],["1f918",109],["1f918-fe0f",109],["1f44c",110],["1f44c-fe0f",110],["1f448",111],["1f448-fe0f",111],["1f449",112],["1f449-fe0f",112],["1f446",113],["1f446-fe0f",113],["1f447",114],["1f447-fe0f",114],["261d-fe0f",115],["270b",116],["270b-fe0f",116],["1f91a",117],["1f91a-fe0f",117],["1f590",118],["1f590-fe0f",118],["1f596",119],["1f596-fe0f",119],["1f44b",120],["1f44b-fe0f",120],["1f919",121],["1f919-fe0f",121],["1f4aa",122],["1f4aa-fe0f",122],["1f595",123],["1f595-fe0f",123],["270d-fe0f",124],["1f933",125],["1f933-fe0f",125],["1f485",126],["1f485-fe0f",126],["1f48d",127],["1f48d-fe0f",127],["1f484",128],["1f484-fe0f",128],["1f48b",129],["1f48b-fe0f",129],["1f444",130],["1f444-fe0f",130],["1f445",131],["1f445-fe0f",131],["1f442",132],["1f442-fe0f",132],["1f443",133],["1f443-fe0f",133],["1f463",134],["1f463-fe0f",134],["1f441",135],["1f441-fe0f",135],["1f440",136],["1f440-fe0f",136],["1f5e3",137],["1f5e3-fe0f",137],["1f464",138],["1f464-fe0f",138],["1f465",139],["1f465-fe0f",139],["1f476",140],["1f476-fe0f",140],["1f466",141],["1f466-fe0f",141],["1f467",142],["1f467-fe0f",142],["1f468",143],["1f468-fe0f",143],["1f469",144],["1f469-fe0f",144],["1f471-200d-2640-fe0f",145],["1f471",146],["1f471-fe0f",146],["1f471-200d-2642-fe0f",146],["1f474",147],["1f474-fe0f",147],["1f475",148],["1f475-fe0f",148],["1f472",149],["1f472-fe0f",149],["1f473-200d-2640-fe0f",150],["1f473",151],["1f473-fe0f",151],["1f473-200d-2642-fe0f",151],["1f46e-200d-2640-fe0f",152],["1f46e",153],["1f46e-fe0f",153],["1f46e-200d-2642-fe0f",153],["1f477-200d-2640-fe0f",154],["1f477",155],["1f477-fe0f",155],["1f477-200d-2642-fe0f",155],["1f482-200d-2640-fe0f",156],["1f482",157],["1f482-fe0f",157],["1f482-200d-2642-fe0f",157],["1f575-fe0f-200d-2640-fe0f",158],["1f575-200d-2640-fe0f-fe0f",158],["1f575-fe0f",159],["1f575-fe0f-200d-2642-fe0f",159],["1f469-200d-2695-fe0f",160],["1f468-200d-2695-fe0f",161],["1f469-200d-1f33e",162],["1f469-200d-1f33e-fe0f",162],["1f468-200d-1f33e",163],["1f468-200d-1f33e-fe0f",163],["1f469-200d-1f373",164],["1f469-200d-1f373-fe0f",164],["1f468-200d-1f373",165],["1f468-200d-1f373-fe0f",165],["1f469-200d-1f393",166],["1f469-200d-1f393-fe0f",166],["1f468-200d-1f393",167],["1f468-200d-1f393-fe0f",167],["1f469-200d-1f3a4",168],["1f469-200d-1f3a4-fe0f",168],["1f468-200d-1f3a4",169],["1f468-200d-1f3a4-fe0f",169],["1f469-200d-1f3eb",170],["1f469-200d-1f3eb-fe0f",170],["1f468-200d-1f3eb",171],["1f468-200d-1f3eb-fe0f",171],["1f469-200d-1f3ed",172],["1f469-200d-1f3ed-fe0f",172],["1f468-200d-1f3ed",173],["1f468-200d-1f3ed-fe0f",173],["1f469-200d-1f4bb",174],["1f469-200d-1f4bb-fe0f",174],["1f468-200d-1f4bb",175],["1f468-200d-1f4bb-fe0f",175],["1f469-200d-1f4bc",176],["1f469-200d-1f4bc-fe0f",176],["1f468-200d-1f4bc",177],["1f468-200d-1f4bc-fe0f",177],["1f469-200d-1f527",178],["1f469-200d-1f527-fe0f",178],["1f468-200d-1f527",179],["1f468-200d-1f527-fe0f",179],["1f469-200d-1f52c",180],["1f469-200d-1f52c-fe0f",180],["1f468-200d-1f52c",181],["1f468-200d-1f52c-fe0f",181],["1f469-200d-1f3a8",182],["1f469-200d-1f3a8-fe0f",182],["1f468-200d-1f3a8",183],["1f468-200d-1f3a8-fe0f",183],["1f469-200d-1f692",184],["1f469-200d-1f692-fe0f",184],["1f468-200d-1f692",185],["1f468-200d-1f692-fe0f",185],["1f469-200d-2708-fe0f",186],["1f468-200d-2708-fe0f",187],["1f469-200d-1f680",188],["1f469-200d-1f680-fe0f",188],["1f468-200d-1f680",189],["1f468-200d-1f680-fe0f",189],["1f469-200d-2696-fe0f",190],["1f468-200d-2696-fe0f",191],["1f936",192],["1f936-fe0f",192],["1f385",193],["1f385-fe0f",193],["1f478",194],["1f478-fe0f",194],["1f934",195],["1f934-fe0f",195],["1f470",196],["1f470-fe0f",196],["1f935",197],["1f935-fe0f",197],["1f47c",198],["1f47c-fe0f",198],["1f930",199],["1f930-fe0f",199],["1f647-200d-2640-fe0f",200],["1f647",201],["1f647-fe0f",201],["1f647-200d-2642-fe0f",201],["1f481",202],["1f481-fe0f",202],["1f481-200d-2640-fe0f",202],["1f481-200d-2642-fe0f",203],["1f645",204],["1f645-fe0f",204],["1f645-200d-2640-fe0f",204],["1f645-200d-2642-fe0f",205],["1f646",206],["1f646-fe0f",206],["1f646-200d-2640-fe0f",206],["1f646-200d-2642-fe0f",207],["1f64b",208],["1f64b-fe0f",208],["1f64b-200d-2640-fe0f",208],["1f64b-200d-2642-fe0f",209],["1f926-200d-2640-fe0f",210],["1f926-200d-2642-fe0f",211],["1f937-200d-2640-fe0f",212],["1f937-200d-2642-fe0f",213],["1f64e",214],["1f64e-fe0f",214],["1f64e-200d-2640-fe0f",214],["1f64e-200d-2642-fe0f",215],["1f64d",216],["1f64d-fe0f",216],["1f64d-200d-2640-fe0f",216],["1f64d-200d-2642-fe0f",217],["1f487",218],["1f487-fe0f",218],["1f487-200d-2640-fe0f",218],["1f487-200d-2642-fe0f",219],["1f486",220],["1f486-fe0f",220],["1f486-200d-2640-fe0f",220],["1f486-200d-2642-fe0f",221],["1f574",222],["1f574-fe0f",222],["1f483",223],["1f483-fe0f",223],["1f57a",224],["1f57a-fe0f",224],["1f46f",225],["1f46f-fe0f",225],["1f46f-200d-2640-fe0f",225],["1f46f-200d-2642-fe0f",226],["1f6b6-200d-2640-fe0f",227],["1f6b6",228],["1f6b6-fe0f",228],["1f6b6-200d-2642-fe0f",228],["1f3c3-200d-2640-fe0f",229],["1f3c3",230],["1f3c3-fe0f",230],["1f3c3-200d-2642-fe0f",230],["1f46b",231],["1f46b-fe0f",231],["1f46d",232],["1f46d-fe0f",232],["1f46c",233],["1f46c-fe0f",233],["1f491",234],["1f491-fe0f",234],["1f469-200d-2764-fe0f-200d-1f469",235],["1f469-200d-2764-200d-1f469-fe0f",235],["1f468-200d-2764-fe0f-200d-1f468",236],["1f468-200d-2764-200d-1f468-fe0f",236],["1f48f",237],["1f48f-fe0f",237],["1f469-200d-2764-fe0f-200d-1f48b-200d-1f469",238],["1f469-200d-2764-200d-1f48b-200d-1f469-fe0f",238],["1f468-200d-2764-fe0f-200d-1f48b-200d-1f468",239],["1f468-200d-2764-200d-1f48b-200d-1f468-fe0f",239],["1f46a",240],["1f46a-fe0f",240],["1f468-200d-1f469-200d-1f467",241],["1f468-200d-1f469-200d-1f467-fe0f",241],["1f468-200d-1f469-200d-1f467-200d-1f466",242],["1f468-200d-1f469-200d-1f467-200d-1f466-fe0f",242],["1f468-200d-1f469-200d-1f466-200d-1f466",243],["1f468-200d-1f469-200d-1f466-200d-1f466-fe0f",243],["1f468-200d-1f469-200d-1f467-200d-1f467",244],["1f468-200d-1f469-200d-1f467-200d-1f467-fe0f",244],["1f469-200d-1f469-200d-1f466",245],["1f469-200d-1f469-200d-1f466-fe0f",245],["1f469-200d-1f469-200d-1f467",246],["1f469-200d-1f469-200d-1f467-fe0f",246],["1f469-200d-1f469-200d-1f467-200d-1f466",247],["1f469-200d-1f469-200d-1f467-200d-1f466-fe0f",247],["1f469-200d-1f469-200d-1f466-200d-1f466",248],["1f469-200d-1f469-200d-1f466-200d-1f466-fe0f",248],["1f469-200d-1f469-200d-1f467-200d-1f467",249],["1f469-200d-1f469-200d-1f467-200d-1f467-fe0f",249],["1f468-200d-1f468-200d-1f466",250],["1f468-200d-1f468-200d-1f466-fe0f",250],["1f468-200d-1f468-200d-1f467",251],["1f468-200d-1f468-200d-1f467-fe0f",251],["1f468-200d-1f468-200d-1f467-200d-1f466",252],["1f468-200d-1f468-200d-1f467-200d-1f466-fe0f",252],["1f468-200d-1f468-200d-1f466-200d-1f466",253],["1f468-200d-1f468-200d-1f466-200d-1f466-fe0f",253],["1f468-200d-1f468-200d-1f467-200d-1f467",254],["1f468-200d-1f468-200d-1f467-200d-1f467-fe0f",254],["1f469-200d-1f466",255],["1f469-200d-1f466-fe0f",255],["1f469-200d-1f467",256],["1f469-200d-1f467-fe0f",256],["1f469-200d-1f467-200d-1f466",257],["1f469-200d-1f467-200d-1f466-fe0f",257],["1f469-200d-1f466-200d-1f466",258],["1f469-200d-1f466-200d-1f466-fe0f",258],["1f469-200d-1f467-200d-1f467",259],["1f469-200d-1f467-200d-1f467-fe0f",259],["1f468-200d-1f466",260],["1f468-200d-1f466-fe0f",260],["1f468-200d-1f467",261],["1f468-200d-1f467-fe0f",261],["1f468-200d-1f467-200d-1f466",262],["1f468-200d-1f467-200d-1f466-fe0f",262],["1f468-200d-1f466-200d-1f466",263],["1f468-200d-1f466-200d-1f466-fe0f",263],["1f468-200d-1f467-200d-1f467",264],["1f468-200d-1f467-200d-1f467-fe0f",264],["1f45a",265],["1f45a-fe0f",265],["1f455",266],["1f455-fe0f",266],["1f456",267],["1f456-fe0f",267],["1f454",268],["1f454-fe0f",268],["1f457",269],["1f457-fe0f",269],["1f459",270],["1f459-fe0f",270],["1f458",271],["1f458-fe0f",271],["1f460",272],["1f460-fe0f",272],["1f461",273],["1f461-fe0f",273],["1f462",274],["1f462-fe0f",274],["1f45e",275],["1f45e-fe0f",275],["1f45f",276],["1f45f-fe0f",276],["1f452",277],["1f452-fe0f",277],["1f3a9",278],["1f3a9-fe0f",278],["1f393",279],["1f393-fe0f",279],["1f451",280],["1f451-fe0f",280],["26d1",281],["26d1-fe0f",281],["1f392",282],["1f392-fe0f",282],["1f45d",283],["1f45d-fe0f",283],["1f45b",284],["1f45b-fe0f",284],["1f45c",285],["1f45c-fe0f",285],["1f4bc",286],["1f4bc-fe0f",286],["1f453",287],["1f453-fe0f",287],["1f576",288],["1f576-fe0f",288],["1f302",289],["1f302-fe0f",289],["2602-fe0f",290],["1f436",291],["1f436-fe0f",291],["1f431",292],["1f431-fe0f",292],["1f42d",293],["1f42d-fe0f",293],["1f439",294],["1f439-fe0f",294],["1f430",295],["1f430-fe0f",295],["1f98a",296],["1f98a-fe0f",296],["1f43b",297],["1f43b-fe0f",297],["1f43c",298],["1f43c-fe0f",298],["1f428",299],["1f428-fe0f",299],["1f42f",300],["1f42f-fe0f",300],["1f981",301],["1f981-fe0f",301],["1f42e",302],["1f42e-fe0f",302],["1f437",303],["1f437-fe0f",303],["1f43d",304],["1f43d-fe0f",304],["1f438",305],["1f438-fe0f",305],["1f435",306],["1f435-fe0f",306],["1f648",307],["1f648-fe0f",307],["1f649",308],["1f649-fe0f",308],["1f64a",309],["1f64a-fe0f",309],["1f412",310],["1f412-fe0f",310],["1f414",311],["1f414-fe0f",311],["1f427",312],["1f427-fe0f",312],["1f426",313],["1f426-fe0f",313],["1f424",314],["1f424-fe0f",314],["1f423",315],["1f423-fe0f",315],["1f425",316],["1f425-fe0f",316],["1f986",317],["1f986-fe0f",317],["1f985",318],["1f985-fe0f",318],["1f989",319],["1f989-fe0f",319],["1f987",320],["1f987-fe0f",320],["1f43a",321],["1f43a-fe0f",321],["1f417",322],["1f417-fe0f",322],["1f434",323],["1f434-fe0f",323],["1f984",324],["1f984-fe0f",324],["1f41d",325],["1f41d-fe0f",325],["1f41b",326],["1f41b-fe0f",326],["1f98b",327],["1f98b-fe0f",327],["1f40c",328],["1f40c-fe0f",328],["1f41a",329],["1f41a-fe0f",329],["1f41e",330],["1f41e-fe0f",330],["1f41c",331],["1f41c-fe0f",331],["1f577",332],["1f577-fe0f",332],["1f578",333],["1f578-fe0f",333],["1f422",334],["1f422-fe0f",334],["1f40d",335],["1f40d-fe0f",335],["1f98e",336],["1f98e-fe0f",336],["1f982",337],["1f982-fe0f",337],["1f980",338],["1f980-fe0f",338],["1f991",339],["1f991-fe0f",339],["1f419",340],["1f419-fe0f",340],["1f990",341],["1f990-fe0f",341],["1f420",342],["1f420-fe0f",342],["1f41f",343],["1f41f-fe0f",343],["1f421",344],["1f421-fe0f",344],["1f42c",345],["1f42c-fe0f",345],["1f988",346],["1f988-fe0f",346],["1f433",347],["1f433-fe0f",347],["1f40b",348],["1f40b-fe0f",348],["1f40a",349],["1f40a-fe0f",349],["1f406",350],["1f406-fe0f",350],["1f405",351],["1f405-fe0f",351],["1f403",352],["1f403-fe0f",352],["1f402",353],["1f402-fe0f",353],["1f404",354],["1f404-fe0f",354],["1f98c",355],["1f98c-fe0f",355],["1f42a",356],["1f42a-fe0f",356],["1f42b",357],["1f42b-fe0f",357],["1f418",358],["1f418-fe0f",358],["1f98f",359],["1f98f-fe0f",359],["1f98d",360],["1f98d-fe0f",360],["1f40e",361],["1f40e-fe0f",361],["1f416",362],["1f416-fe0f",362],["1f410",363],["1f410-fe0f",363],["1f40f",364],["1f40f-fe0f",364],["1f411",365],["1f411-fe0f",365],["1f415",366],["1f415-fe0f",366],["1f429",367],["1f429-fe0f",367],["1f408",368],["1f408-fe0f",368],["1f413",369],["1f413-fe0f",369],["1f983",370],["1f983-fe0f",370],["1f54a",371],["1f54a-fe0f",371],["1f407",372],["1f407-fe0f",372],["1f401",373],["1f401-fe0f",373],["1f400",374],["1f400-fe0f",374],["1f43f",375],["1f43f-fe0f",375],["1f43e",376],["1f43e-fe0f",376],["1f409",377],["1f409-fe0f",377],["1f432",378],["1f432-fe0f",378],["1f335",379],["1f335-fe0f",379],["1f384",380],["1f384-fe0f",380],["1f332",381],["1f332-fe0f",381],["1f333",382],["1f333-fe0f",382],["1f334",383],["1f334-fe0f",383],["1f331",384],["1f331-fe0f",384],["1f33f",385],["1f33f-fe0f",385],["2618-fe0f",386],["1f340",387],["1f340-fe0f",387],["1f38d",388],["1f38d-fe0f",388],["1f38b",389],["1f38b-fe0f",389],["1f343",390],["1f343-fe0f",390],["1f342",391],["1f342-fe0f",391],["1f341",392],["1f341-fe0f",392],["1f344",393],["1f344-fe0f",393],["1f33e",394],["1f33e-fe0f",394],["1f490",395],["1f490-fe0f",395],["1f337",396],["1f337-fe0f",396],["1f339",397],["1f339-fe0f",397],["1f940",398],["1f940-fe0f",398],["1f33b",399],["1f33b-fe0f",399],["1f33c",400],["1f33c-fe0f",400],["1f338",401],["1f338-fe0f",401],["1f33a",402],["1f33a-fe0f",402],["1f30e",403],["1f30e-fe0f",403],["1f30d",404],["1f30d-fe0f",404],["1f30f",405],["1f30f-fe0f",405],["1f315",406],["1f315-fe0f",406],["1f316",407],["1f316-fe0f",407],["1f317",408],["1f317-fe0f",408],["1f318",409],["1f318-fe0f",409],["1f311",410],["1f311-fe0f",410],["1f312",411],["1f312-fe0f",411],["1f313",412],["1f313-fe0f",412],["1f314",413],["1f314-fe0f",413],["1f31a",414],["1f31a-fe0f",414],["1f31d",415],["1f31d-fe0f",415],["1f31e",416],["1f31e-fe0f",416],["1f31b",417],["1f31b-fe0f",417],["1f31c",418],["1f31c-fe0f",418],["1f319",419],["1f319-fe0f",419],["1f4ab",420],["1f4ab-fe0f",420],["2b50-fe0f",421],["1f31f",422],["1f31f-fe0f",422],["2728",423],["2728-fe0f",423],["26a1-fe0f",424],["1f525",425],["1f525-fe0f",425],["1f4a5",426],["1f4a5-fe0f",426],["2604-fe0f",427],["2600-fe0f",428],["1f324",429],["1f324-fe0f",429],["26c5-fe0f",430],["1f325",431],["1f325-fe0f",431],["1f326",432],["1f326-fe0f",432],["1f308",433],["1f308-fe0f",433],["2601-fe0f",434],["1f327",435],["1f327-fe0f",435],["26c8",436],["26c8-fe0f",436],["1f329",437],["1f329-fe0f",437],["1f328",438],["1f328-fe0f",438],["2603-fe0f",439],["26c4-fe0f",440],["2744-fe0f",441],["1f32c",442],["1f32c-fe0f",442],["1f4a8",443],["1f4a8-fe0f",443],["1f32a",444],["1f32a-fe0f",444],["1f32b",445],["1f32b-fe0f",445],["1f30a",446],["1f30a-fe0f",446],["1f4a7",447],["1f4a7-fe0f",447],["1f4a6",448],["1f4a6-fe0f",448],["2614-fe0f",449],["1f34f",450],["1f34f-fe0f",450],["1f34e",451],["1f34e-fe0f",451],["1f350",452],["1f350-fe0f",452],["1f34a",453],["1f34a-fe0f",453],["1f34b",454],["1f34b-fe0f",454],["1f34c",455],["1f34c-fe0f",455],["1f349",456],["1f349-fe0f",456],["1f347",457],["1f347-fe0f",457],["1f353",458],["1f353-fe0f",458],["1f348",459],["1f348-fe0f",459],["1f352",460],["1f352-fe0f",460],["1f351",461],["1f351-fe0f",461],["1f34d",462],["1f34d-fe0f",462],["1f95d",463],["1f95d-fe0f",463],["1f951",464],["1f951-fe0f",464],["1f345",465],["1f345-fe0f",465],["1f346",466],["1f346-fe0f",466],["1f952",467],["1f952-fe0f",467],["1f955",468],["1f955-fe0f",468],["1f33d",469],["1f33d-fe0f",469],["1f336",470],["1f336-fe0f",470],["1f954",471],["1f954-fe0f",471],["1f360",472],["1f360-fe0f",472],["1f330",473],["1f330-fe0f",473],["1f95c",474],["1f95c-fe0f",474],["1f36f",475],["1f36f-fe0f",475],["1f950",476],["1f950-fe0f",476],["1f35e",477],["1f35e-fe0f",477],["1f956",478],["1f956-fe0f",478],["1f9c0",479],["1f9c0-fe0f",479],["1f95a",480],["1f95a-fe0f",480],["1f373",481],["1f373-fe0f",481],["1f953",482],["1f953-fe0f",482],["1f95e",483],["1f95e-fe0f",483],["1f364",484],["1f364-fe0f",484],["1f357",485],["1f357-fe0f",485],["1f356",486],["1f356-fe0f",486],["1f355",487],["1f355-fe0f",487],["1f32d",488],["1f32d-fe0f",488],["1f354",489],["1f354-fe0f",489],["1f35f",490],["1f35f-fe0f",490],["1f959",491],["1f959-fe0f",491],["1f32e",492],["1f32e-fe0f",492],["1f32f",493],["1f32f-fe0f",493],["1f957",494],["1f957-fe0f",494],["1f958",495],["1f958-fe0f",495],["1f35d",496],["1f35d-fe0f",496],["1f35c",497],["1f35c-fe0f",497],["1f372",498],["1f372-fe0f",498],["1f365",499],["1f365-fe0f",499],["1f363",500],["1f363-fe0f",500],["1f371",501],["1f371-fe0f",501],["1f35b",502],["1f35b-fe0f",502],["1f35a",503],["1f35a-fe0f",503],["1f359",504],["1f359-fe0f",504],["1f358",505],["1f358-fe0f",505],["1f362",506],["1f362-fe0f",506],["1f361",507],["1f361-fe0f",507],["1f367",508],["1f367-fe0f",508],["1f368",509],["1f368-fe0f",509],["1f366",510],["1f366-fe0f",510],["1f370",511],["1f370-fe0f",511],["1f382",512],["1f382-fe0f",512],["1f36e",513],["1f36e-fe0f",513],["1f36d",514],["1f36d-fe0f",514],["1f36c",515],["1f36c-fe0f",515],["1f36b",516],["1f36b-fe0f",516],["1f37f",517],["1f37f-fe0f",517],["1f369",518],["1f369-fe0f",518],["1f36a",519],["1f36a-fe0f",519],["1f95b",520],["1f95b-fe0f",520],["1f37c",521],["1f37c-fe0f",521],["2615-fe0f",522],["1f375",523],["1f375-fe0f",523],["1f376",524],["1f376-fe0f",524],["1f37a",525],["1f37a-fe0f",525],["1f37b",526],["1f37b-fe0f",526],["1f942",527],["1f942-fe0f",527],["1f377",528],["1f377-fe0f",528],["1f943",529],["1f943-fe0f",529],["1f378",530],["1f378-fe0f",530],["1f379",531],["1f379-fe0f",531],["1f37e",532],["1f37e-fe0f",532],["1f944",533],["1f944-fe0f",533],["1f374",534],["1f374-fe0f",534],["1f37d",535],["1f37d-fe0f",535],["26bd-fe0f",536],["1f3c0",537],["1f3c0-fe0f",537],["1f3c8",538],["1f3c8-fe0f",538],["26be-fe0f",539],["1f3be",540],["1f3be-fe0f",540],["1f3d0",541],["1f3d0-fe0f",541],["1f3c9",542],["1f3c9-fe0f",542],["1f3b1",543],["1f3b1-fe0f",543],["1f3d3",544],["1f3d3-fe0f",544],["1f3f8",545],["1f3f8-fe0f",545],["1f945",546],["1f945-fe0f",546],["1f3d2",547],["1f3d2-fe0f",547],["1f3d1",548],["1f3d1-fe0f",548],["1f3cf",549],["1f3cf-fe0f",549],["26f3-fe0f",550],["1f3f9",551],["1f3f9-fe0f",551],["1f3a3",552],["1f3a3-fe0f",552],["1f94a",553],["1f94a-fe0f",553],["1f94b",554],["1f94b-fe0f",554],["26f8",555],["26f8-fe0f",555],["1f3bf",556],["1f3bf-fe0f",556],["26f7",557],["26f7-fe0f",557],["1f3c2",558],["1f3c2-fe0f",558],["1f3cb-fe0f-200d-2640-fe0f",559],["1f3cb-200d-2640-fe0f-fe0f",559],["1f3cb-fe0f",560],["1f3cb-fe0f-200d-2642-fe0f",560],["1f93a",561],["1f93a-fe0f",561],["1f93c-200d-2640-fe0f",562],["1f93c-200d-2642-fe0f",563],["1f938-200d-2640-fe0f",564],["1f938-200d-2642-fe0f",565],["26f9-fe0f-200d-2640-fe0f",566],["26f9-200d-2640-fe0f-fe0f",566],["26f9-fe0f",567],["26f9-fe0f-200d-2642-fe0f",567],["1f93e-200d-2640-fe0f",568],["1f93e-200d-2642-fe0f",569],["1f3cc-fe0f-200d-2640-fe0f",570],["1f3cc-200d-2640-fe0f-fe0f",570],["1f3cc-fe0f",571],["1f3cc-fe0f-200d-2642-fe0f",571],["1f3c4-200d-2640-fe0f",572],["1f3c4",573],["1f3c4-fe0f",573],["1f3c4-200d-2642-fe0f",573],["1f3ca-200d-2640-fe0f",574],["1f3ca",575],["1f3ca-fe0f",575],["1f3ca-200d-2642-fe0f",575],["1f93d-200d-2640-fe0f",576],["1f93d-200d-2642-fe0f",577],["1f6a3-200d-2640-fe0f",578],["1f6a3",579],["1f6a3-fe0f",579],["1f6a3-200d-2642-fe0f",579],["1f3c7",580],["1f3c7-fe0f",580],["1f6b4-200d-2640-fe0f",581],["1f6b4",582],["1f6b4-fe0f",582],["1f6b4-200d-2642-fe0f",582],["1f6b5-200d-2640-fe0f",583],["1f6b5",584],["1f6b5-fe0f",584],["1f6b5-200d-2642-fe0f",584],["1f3bd",585],["1f3bd-fe0f",585],["1f3c5",586],["1f3c5-fe0f",586],["1f396",587],["1f396-fe0f",587],["1f947",588],["1f947-fe0f",588],["1f948",589],["1f948-fe0f",589],["1f949",590],["1f949-fe0f",590],["1f3c6",591],["1f3c6-fe0f",591],["1f3f5",592],["1f3f5-fe0f",592],["1f397",593],["1f397-fe0f",593],["1f3ab",594],["1f3ab-fe0f",594],["1f39f",595],["1f39f-fe0f",595],["1f3aa",596],["1f3aa-fe0f",596],["1f939-200d-2640-fe0f",597],["1f939-200d-2642-fe0f",598],["1f3ad",599],["1f3ad-fe0f",599],["1f3a8",600],["1f3a8-fe0f",600],["1f3ac",601],["1f3ac-fe0f",601],["1f3a4",602],["1f3a4-fe0f",602],["1f3a7",603],["1f3a7-fe0f",603],["1f3bc",604],["1f3bc-fe0f",604],["1f3b9",605],["1f3b9-fe0f",605],["1f941",606],["1f941-fe0f",606],["1f3b7",607],["1f3b7-fe0f",607],["1f3ba",608],["1f3ba-fe0f",608],["1f3b8",609],["1f3b8-fe0f",609],["1f3bb",610],["1f3bb-fe0f",610],["1f3b2",611],["1f3b2-fe0f",611],["1f3af",612],["1f3af-fe0f",612],["1f3b3",613],["1f3b3-fe0f",613],["1f3ae",614],["1f3ae-fe0f",614],["1f3b0",615],["1f3b0-fe0f",615],["1f697",616],["1f697-fe0f",616],["1f695",617],["1f695-fe0f",617],["1f699",618],["1f699-fe0f",618],["1f68c",619],["1f68c-fe0f",619],["1f68e",620],["1f68e-fe0f",620],["1f3ce",621],["1f3ce-fe0f",621],["1f693",622],["1f693-fe0f",622],["1f691",623],["1f691-fe0f",623],["1f692",624],["1f692-fe0f",624],["1f690",625],["1f690-fe0f",625],["1f69a",626],["1f69a-fe0f",626],["1f69b",627],["1f69b-fe0f",627],["1f69c",628],["1f69c-fe0f",628],["1f6f4",629],["1f6f4-fe0f",629],["1f6b2",630],["1f6b2-fe0f",630],["1f6f5",631],["1f6f5-fe0f",631],["1f3cd",632],["1f3cd-fe0f",632],["1f6a8",633],["1f6a8-fe0f",633],["1f694",634],["1f694-fe0f",634],["1f68d",635],["1f68d-fe0f",635],["1f698",636],["1f698-fe0f",636],["1f696",637],["1f696-fe0f",637],["1f6a1",638],["1f6a1-fe0f",638],["1f6a0",639],["1f6a0-fe0f",639],["1f69f",640],["1f69f-fe0f",640],["1f683",641],["1f683-fe0f",641],["1f68b",642],["1f68b-fe0f",642],["1f69e",643],["1f69e-fe0f",643],["1f69d",644],["1f69d-fe0f",644],["1f684",645],["1f684-fe0f",645],["1f685",646],["1f685-fe0f",646],["1f688",647],["1f688-fe0f",647],["1f682",648],["1f682-fe0f",648],["1f686",649],["1f686-fe0f",649],["1f687",650],["1f687-fe0f",650],["1f68a",651],["1f68a-fe0f",651],["1f689",652],["1f689-fe0f",652],["1f681",653],["1f681-fe0f",653],["1f6e9",654],["1f6e9-fe0f",654],["2708-fe0f",655],["1f6eb",656],["1f6eb-fe0f",656],["1f6ec",657],["1f6ec-fe0f",657],["1f680",658],["1f680-fe0f",658],["1f6f0",659],["1f6f0-fe0f",659],["1f4ba",660],["1f4ba-fe0f",660],["1f6f6",661],["1f6f6-fe0f",661],["26f5-fe0f",662],["1f6e5",663],["1f6e5-fe0f",663],["1f6a4",664],["1f6a4-fe0f",664],["1f6f3",665],["1f6f3-fe0f",665],["26f4",666],["26f4-fe0f",666],["1f6a2",667],["1f6a2-fe0f",667],["2693-fe0f",668],["1f6a7",669],["1f6a7-fe0f",669],["26fd-fe0f",670],["1f68f",671],["1f68f-fe0f",671],["1f6a6",672],["1f6a6-fe0f",672],["1f6a5",673],["1f6a5-fe0f",673],["1f5fa",674],["1f5fa-fe0f",674],["1f5ff",675],["1f5ff-fe0f",675],["1f5fd",676],["1f5fd-fe0f",676],["26f2-fe0f",677],["1f5fc",678],["1f5fc-fe0f",678],["1f3f0",679],["1f3f0-fe0f",679],["1f3ef",680],["1f3ef-fe0f",680],["1f3df",681],["1f3df-fe0f",681],["1f3a1",682],["1f3a1-fe0f",682],["1f3a2",683],["1f3a2-fe0f",683],["1f3a0",684],["1f3a0-fe0f",684],["26f1",685],["26f1-fe0f",685],["1f3d6",686],["1f3d6-fe0f",686],["1f3dd",687],["1f3dd-fe0f",687],["26f0",688],["26f0-fe0f",688],["1f3d4",689],["1f3d4-fe0f",689],["1f5fb",690],["1f5fb-fe0f",690],["1f30b",691],["1f30b-fe0f",691],["1f3dc",692],["1f3dc-fe0f",692],["1f3d5",693],["1f3d5-fe0f",693],["26fa-fe0f",694],["1f6e4",695],["1f6e4-fe0f",695],["1f6e3",696],["1f6e3-fe0f",696],["1f3d7",697],["1f3d7-fe0f",697],["1f3ed",698],["1f3ed-fe0f",698],["1f3e0",699],["1f3e0-fe0f",699],["1f3e1",700],["1f3e1-fe0f",700],["1f3d8",701],["1f3d8-fe0f",701],["1f3da",702],["1f3da-fe0f",702],["1f3e2",703],["1f3e2-fe0f",703],["1f3ec",704],["1f3ec-fe0f",704],["1f3e3",705],["1f3e3-fe0f",705],["1f3e4",706],["1f3e4-fe0f",706],["1f3e5",707],["1f3e5-fe0f",707],["1f3e6",708],["1f3e6-fe0f",708],["1f3e8",709],["1f3e8-fe0f",709],["1f3ea",710],["1f3ea-fe0f",710],["1f3eb",711],["1f3eb-fe0f",711],["1f3e9",712],["1f3e9-fe0f",712],["1f492",713],["1f492-fe0f",713],["1f3db",714],["1f3db-fe0f",714],["26ea-fe0f",715],["1f54c",716],["1f54c-fe0f",716],["1f54d",717],["1f54d-fe0f",717],["1f54b",718],["1f54b-fe0f",718],["26e9",719],["26e9-fe0f",719],["1f5fe",720],["1f5fe-fe0f",720],["1f391",721],["1f391-fe0f",721],["1f3de",722],["1f3de-fe0f",722],["1f305",723],["1f305-fe0f",723],["1f304",724],["1f304-fe0f",724],["1f320",725],["1f320-fe0f",725],["1f387",726],["1f387-fe0f",726],["1f386",727],["1f386-fe0f",727],["1f307",728],["1f307-fe0f",728],["1f306",729],["1f306-fe0f",729],["1f3d9",730],["1f3d9-fe0f",730],["1f303",731],["1f303-fe0f",731],["1f30c",732],["1f30c-fe0f",732],["1f309",733],["1f309-fe0f",733],["1f301",734],["1f301-fe0f",734],["231a-fe0f",735],["1f4f1",736],["1f4f1-fe0f",736],["1f4f2",737],["1f4f2-fe0f",737],["1f4bb",738],["1f4bb-fe0f",738],["2328-fe0f",739],["1f5a5",740],["1f5a5-fe0f",740],["1f5a8",741],["1f5a8-fe0f",741],["1f5b1",742],["1f5b1-fe0f",742],["1f5b2",743],["1f5b2-fe0f",743],["1f579",744],["1f579-fe0f",744],["1f5dc",745],["1f5dc-fe0f",745],["1f4bd",746],["1f4bd-fe0f",746],["1f4be",747],["1f4be-fe0f",747],["1f4bf",748],["1f4bf-fe0f",748],["1f4c0",749],["1f4c0-fe0f",749],["1f4fc",750],["1f4fc-fe0f",750],["1f4f7",751],["1f4f7-fe0f",751],["1f4f8",752],["1f4f8-fe0f",752],["1f4f9",753],["1f4f9-fe0f",753],["1f3a5",754],["1f3a5-fe0f",754],["1f4fd",755],["1f4fd-fe0f",755],["1f39e",756],["1f39e-fe0f",756],["1f4de",757],["1f4de-fe0f",757],["260e-fe0f",758],["1f4df",759],["1f4df-fe0f",759],["1f4e0",760],["1f4e0-fe0f",760],["1f4fa",761],["1f4fa-fe0f",761],["1f4fb",762],["1f4fb-fe0f",762],["1f399",763],["1f399-fe0f",763],["1f39a",764],["1f39a-fe0f",764],["1f39b",765],["1f39b-fe0f",765],["23f1",766],["23f1-fe0f",766],["23f2",767],["23f2-fe0f",767],["23f0",768],["23f0-fe0f",768],["1f570",769],["1f570-fe0f",769],["231b-fe0f",770],["23f3",771],["23f3-fe0f",771],["1f4e1",772],["1f4e1-fe0f",772],["1f50b",773],["1f50b-fe0f",773],["1f50c",774],["1f50c-fe0f",774],["1f4a1",775],["1f4a1-fe0f",775],["1f526",776],["1f526-fe0f",776],["1f56f",777],["1f56f-fe0f",777],["1f5d1",778],["1f5d1-fe0f",778],["1f6e2",779],["1f6e2-fe0f",779],["1f4b8",780],["1f4b8-fe0f",780],["1f4b5",781],["1f4b5-fe0f",781],["1f4b4",782],["1f4b4-fe0f",782],["1f4b6",783],["1f4b6-fe0f",783],["1f4b7",784],["1f4b7-fe0f",784],["1f4b0",785],["1f4b0-fe0f",785],["1f4b3",786],["1f4b3-fe0f",786],["1f48e",787],["1f48e-fe0f",787],["2696-fe0f",788],["1f527",789],["1f527-fe0f",789],["1f528",790],["1f528-fe0f",790],["2692",791],["2692-fe0f",791],["1f6e0",792],["1f6e0-fe0f",792],["26cf",793],["26cf-fe0f",793],["1f529",794],["1f529-fe0f",794],["2699-fe0f",795],["26d3",796],["26d3-fe0f",796],["1f52b",797],["1f52b-fe0f",797],["1f4a3",798],["1f4a3-fe0f",798],["1f52a",799],["1f52a-fe0f",799],["1f5e1",800],["1f5e1-fe0f",800],["2694-fe0f",801],["1f6e1",802],["1f6e1-fe0f",802],["1f6ac",803],["1f6ac-fe0f",803],["26b0-fe0f",804],["26b1-fe0f",805],["1f3fa",806],["1f3fa-fe0f",806],["1f52e",807],["1f52e-fe0f",807],["1f4ff",808],["1f4ff-fe0f",808],["1f488",809],["1f488-fe0f",809],["2697-fe0f",810],["1f52d",811],["1f52d-fe0f",811],["1f52c",812],["1f52c-fe0f",812],["1f573",813],["1f573-fe0f",813],["1f48a",814],["1f48a-fe0f",814],["1f489",815],["1f489-fe0f",815],["1f321",816],["1f321-fe0f",816],["1f6bd",817],["1f6bd-fe0f",817],["1f6b0",818],["1f6b0-fe0f",818],["1f6bf",819],["1f6bf-fe0f",819],["1f6c1",820],["1f6c1-fe0f",820],["1f6c0",821],["1f6c0-fe0f",821],["1f6ce",822],["1f6ce-fe0f",822],["1f511",823],["1f511-fe0f",823],["1f5dd",824],["1f5dd-fe0f",824],["1f6aa",825],["1f6aa-fe0f",825],["1f6cb",826],["1f6cb-fe0f",826],["1f6cf",827],["1f6cf-fe0f",827],["1f6cc",828],["1f6cc-fe0f",828],["1f5bc",829],["1f5bc-fe0f",829],["1f6cd",830],["1f6cd-fe0f",830],["1f6d2",831],["1f6d2-fe0f",831],["1f381",832],["1f381-fe0f",832],["1f388",833],["1f388-fe0f",833],["1f38f",834],["1f38f-fe0f",834],["1f380",835],["1f380-fe0f",835],["1f38a",836],["1f38a-fe0f",836],["1f389",837],["1f389-fe0f",837],["1f38e",838],["1f38e-fe0f",838],["1f3ee",839],["1f3ee-fe0f",839],["1f390",840],["1f390-fe0f",840],["2709-fe0f",841],["1f4e9",842],["1f4e9-fe0f",842],["1f4e8",843],["1f4e8-fe0f",843],["1f4e7",844],["1f4e7-fe0f",844],["1f48c",845],["1f48c-fe0f",845],["1f4e5",846],["1f4e5-fe0f",846],["1f4e4",847],["1f4e4-fe0f",847],["1f4e6",848],["1f4e6-fe0f",848],["1f3f7",849],["1f3f7-fe0f",849],["1f4ea",850],["1f4ea-fe0f",850],["1f4eb",851],["1f4eb-fe0f",851],["1f4ec",852],["1f4ec-fe0f",852],["1f4ed",853],["1f4ed-fe0f",853],["1f4ee",854],["1f4ee-fe0f",854],["1f4ef",855],["1f4ef-fe0f",855],["1f4dc",856],["1f4dc-fe0f",856],["1f4c3",857],["1f4c3-fe0f",857],["1f4c4",858],["1f4c4-fe0f",858],["1f4d1",859],["1f4d1-fe0f",859],["1f4ca",860],["1f4ca-fe0f",860],["1f4c8",861],["1f4c8-fe0f",861],["1f4c9",862],["1f4c9-fe0f",862],["1f5d2",863],["1f5d2-fe0f",863],["1f5d3",864],["1f5d3-fe0f",864],["1f4c6",865],["1f4c6-fe0f",865],["1f4c5",866],["1f4c5-fe0f",866],["1f4c7",867],["1f4c7-fe0f",867],["1f5c3",868],["1f5c3-fe0f",868],["1f5f3",869],["1f5f3-fe0f",869],["1f5c4",870],["1f5c4-fe0f",870],["1f4cb",871],["1f4cb-fe0f",871],["1f4c1",872],["1f4c1-fe0f",872],["1f4c2",873],["1f4c2-fe0f",873],["1f5c2",874],["1f5c2-fe0f",874],["1f5de",875],["1f5de-fe0f",875],["1f4f0",876],["1f4f0-fe0f",876],["1f4d3",877],["1f4d3-fe0f",877],["1f4d4",878],["1f4d4-fe0f",878],["1f4d2",879],["1f4d2-fe0f",879],["1f4d5",880],["1f4d5-fe0f",880],["1f4d7",881],["1f4d7-fe0f",881],["1f4d8",882],["1f4d8-fe0f",882],["1f4d9",883],["1f4d9-fe0f",883],["1f4da",884],["1f4da-fe0f",884],["1f4d6",885],["1f4d6-fe0f",885],["1f516",886],["1f516-fe0f",886],["1f517",887],["1f517-fe0f",887],["1f4ce",888],["1f4ce-fe0f",888],["1f587",889],["1f587-fe0f",889],["1f4d0",890],["1f4d0-fe0f",890],["1f4cf",891],["1f4cf-fe0f",891],["1f4cc",892],["1f4cc-fe0f",892],["1f4cd",893],["1f4cd-fe0f",893],["2702-fe0f",894],["1f58a",895],["1f58a-fe0f",895],["1f58b",896],["1f58b-fe0f",896],["2712-fe0f",897],["1f58c",898],["1f58c-fe0f",898],["1f58d",899],["1f58d-fe0f",899],["1f4dd",900],["1f4dd-fe0f",900],["270f-fe0f",901],["1f50d",902],["1f50d-fe0f",902],["1f50e",903],["1f50e-fe0f",903],["1f50f",904],["1f50f-fe0f",904],["1f510",905],["1f510-fe0f",905],["1f512",906],["1f512-fe0f",906],["1f513",907],["1f513-fe0f",907],["2764-fe0f",908],["1f49b",909],["1f49b-fe0f",909],["1f49a",910],["1f49a-fe0f",910],["1f499",911],["1f499-fe0f",911],["1f49c",912],["1f49c-fe0f",912],["1f5a4",913],["1f5a4-fe0f",913],["1f494",914],["1f494-fe0f",914],["2763-fe0f",915],["1f495",916],["1f495-fe0f",916],["1f49e",917],["1f49e-fe0f",917],["1f493",918],["1f493-fe0f",918],["1f497",919],["1f497-fe0f",919],["1f496",920],["1f496-fe0f",920],["1f498",921],["1f498-fe0f",921],["1f49d",922],["1f49d-fe0f",922],["1f49f",923],["1f49f-fe0f",923],["262e-fe0f",924],["271d-fe0f",925],["262a-fe0f",926],["1f549",927],["1f549-fe0f",927],["2638-fe0f",928],["2721-fe0f",929],["1f52f",930],["1f52f-fe0f",930],["1f54e",931],["1f54e-fe0f",931],["262f-fe0f",932],["2626-fe0f",933],["1f6d0",934],["1f6d0-fe0f",934],["26ce",935],["26ce-fe0f",935],["2648-fe0f",936],["2649-fe0f",937],["264a-fe0f",938],["264b-fe0f",939],["264c-fe0f",940],["264d-fe0f",941],["264e-fe0f",942],["264f-fe0f",943],["2650-fe0f",944],["2651-fe0f",945],["2652-fe0f",946],["2653-fe0f",947],["1f194",948],["1f194-fe0f",948],["269b-fe0f",949],["1f251",950],["1f251-fe0f",950],["2622-fe0f",951],["2623-fe0f",952],["1f4f4",953],["1f4f4-fe0f",953],["1f4f3",954],["1f4f3-fe0f",954],["1f236",955],["1f236-fe0f",955],["1f21a-fe0f",956],["1f238",957],["1f238-fe0f",957],["1f23a",958],["1f23a-fe0f",958],["1f237-fe0f",959],["2734-fe0f",960],["1f19a",961],["1f19a-fe0f",961],["1f4ae",962],["1f4ae-fe0f",962],["1f250",963],["1f250-fe0f",963],["3299-fe0f",964],["3297-fe0f",965],["1f234",966],["1f234-fe0f",966],["1f235",967],["1f235-fe0f",967],["1f239",968],["1f239-fe0f",968],["1f232",969],["1f232-fe0f",969],["1f170-fe0f",970],["1f171-fe0f",971],["1f18e",972],["1f18e-fe0f",972],["1f191",973],["1f191-fe0f",973],["1f17e-fe0f",974],["1f198",975],["1f198-fe0f",975],["274c",976],["274c-fe0f",976],["2b55-fe0f",977],["1f6d1",978],["1f6d1-fe0f",978],["26d4-fe0f",979],["1f4db",980],["1f4db-fe0f",980],["1f6ab",981],["1f6ab-fe0f",981],["1f4af",982],["1f4af-fe0f",982],["1f4a2",983],["1f4a2-fe0f",983],["2668-fe0f",984],["1f6b7",985],["1f6b7-fe0f",985],["1f6af",986],["1f6af-fe0f",986],["1f6b3",987],["1f6b3-fe0f",987],["1f6b1",988],["1f6b1-fe0f",988],["1f51e",989],["1f51e-fe0f",989],["1f4f5",990],["1f4f5-fe0f",990],["1f6ad",991],["1f6ad-fe0f",991],["2757-fe0f",992],["2755",993],["2755-fe0f",993],["2753",994],["2753-fe0f",994],["2754",995],["2754-fe0f",995],["203c-fe0f",996],["2049-fe0f",997],["1f505",998],["1f505-fe0f",998],["1f506",999],["1f506-fe0f",999],["303d-fe0f",1000],["26a0-fe0f",1001],["1f6b8",1002],["1f6b8-fe0f",1002],["1f531",1003],["1f531-fe0f",1003],["269c-fe0f",1004],["1f530",1005],["1f530-fe0f",1005],["267b-fe0f",1006],["2705",1007],["2705-fe0f",1007],["1f22f-fe0f",1008],["1f4b9",1009],["1f4b9-fe0f",1009],["2747-fe0f",1010],["2733-fe0f",1011],["274e",1012],["274e-fe0f",1012],["1f310",1013],["1f310-fe0f",1013],["1f4a0",1014],["1f4a0-fe0f",1014],["24c2-fe0f",1015],["1f300",1016],["1f300-fe0f",1016],["1f4a4",1017],["1f4a4-fe0f",1017],["1f3e7",1018],["1f3e7-fe0f",1018],["1f6be",1019],["1f6be-fe0f",1019],["267f-fe0f",1020],["1f17f-fe0f",1021],["1f233",1022],["1f233-fe0f",1022],["1f202-fe0f",1023],["1f6c2",1024],["1f6c2-fe0f",1024],["1f6c3",1025],["1f6c3-fe0f",1025],["1f6c4",1026],["1f6c4-fe0f",1026],["1f6c5",1027],["1f6c5-fe0f",1027],["1f6b9",1028],["1f6b9-fe0f",1028],["1f6ba",1029],["1f6ba-fe0f",1029],["1f6bc",1030],["1f6bc-fe0f",1030],["1f6bb",1031],["1f6bb-fe0f",1031],["1f6ae",1032],["1f6ae-fe0f",1032],["1f3a6",1033],["1f3a6-fe0f",1033],["1f4f6",1034],["1f4f6-fe0f",1034],["1f201",1035],["1f201-fe0f",1035],["1f523",1036],["1f523-fe0f",1036],["2139-fe0f",1037],["1f524",1038],["1f524-fe0f",1038],["1f521",1039],["1f521-fe0f",1039],["1f520",1040],["1f520-fe0f",1040],["1f196",1041],["1f196-fe0f",1041],["1f197",1042],["1f197-fe0f",1042],["1f199",1043],["1f199-fe0f",1043],["1f192",1044],["1f192-fe0f",1044],["1f195",1045],["1f195-fe0f",1045],["1f193",1046],["1f193-fe0f",1046],["0030-fe0f-20e3",1047],["0030-20e3-fe0f",1047],["0031-fe0f-20e3",1048],["0031-20e3-fe0f",1048],["0032-fe0f-20e3",1049],["0032-20e3-fe0f",1049],["0033-fe0f-20e3",1050],["0033-20e3-fe0f",1050],["0034-fe0f-20e3",1051],["0034-20e3-fe0f",1051],["0035-fe0f-20e3",1052],["0035-20e3-fe0f",1052],["0036-fe0f-20e3",1053],["0036-20e3-fe0f",1053],["0037-fe0f-20e3",1054],["0037-20e3-fe0f",1054],["0038-fe0f-20e3",1055],["0038-20e3-fe0f",1055],["0039-fe0f-20e3",1056],["0039-20e3-fe0f",1056],["1f51f",1057],["1f51f-fe0f",1057],["1f522",1058],["1f522-fe0f",1058],["0023-fe0f-20e3",1059],["0023-20e3-fe0f",1059],["002a-fe0f-20e3",1060],["002a-20e3-fe0f",1060],["25b6-fe0f",1061],["23f8",1062],["23f8-fe0f",1062],["23ef",1063],["23ef-fe0f",1063],["23f9",1064],["23f9-fe0f",1064],["23fa",1065],["23fa-fe0f",1065],["23ed",1066],["23ed-fe0f",1066],["23ee",1067],["23ee-fe0f",1067],["23e9",1068],["23e9-fe0f",1068],["23ea",1069],["23ea-fe0f",1069],["23eb",1070],["23eb-fe0f",1070],["23ec",1071],["23ec-fe0f",1071],["25c0-fe0f",1072],["1f53c",1073],["1f53c-fe0f",1073],["1f53d",1074],["1f53d-fe0f",1074],["27a1-fe0f",1075],["2b05-fe0f",1076],["2b06-fe0f",1077],["2b07-fe0f",1078],["2197-fe0f",1079],["2198-fe0f",1080],["2199-fe0f",1081],["2196-fe0f",1082],["2195-fe0f",1083],["2194-fe0f",1084],["21aa-fe0f",1085],["21a9-fe0f",1086],["2934-fe0f",1087],["2935-fe0f",1088],["1f500",1089],["1f500-fe0f",1089],["1f501",1090],["1f501-fe0f",1090],["1f502",1091],["1f502-fe0f",1091],["1f504",1092],["1f504-fe0f",1092],["1f503",1093],["1f503-fe0f",1093],["1f3b5",1094],["1f3b5-fe0f",1094],["1f3b6",1095],["1f3b6-fe0f",1095],["2795",1096],["2795-fe0f",1096],["2796",1097],["2796-fe0f",1097],["2797",1098],["2797-fe0f",1098],["2716-fe0f",1099],["1f4b2",1100],["1f4b2-fe0f",1100],["1f4b1",1101],["1f4b1-fe0f",1101],["2122-fe0f",1102],["00a9-fe0f",1103],["00ae-fe0f",1104],["3030-fe0f",1105],["27b0",1106],["27b0-fe0f",1106],["27bf",1107],["27bf-fe0f",1107],["1f51a",1108],["1f51a-fe0f",1108],["1f519",1109],["1f519-fe0f",1109],["1f51b",1110],["1f51b-fe0f",1110],["1f51d",1111],["1f51d-fe0f",1111],["1f51c",1112],["1f51c-fe0f",1112],["2714-fe0f",1113],["2611-fe0f",1114],["1f518",1115],["1f518-fe0f",1115],["26aa-fe0f",1116],["26ab-fe0f",1117],["1f534",1118],["1f534-fe0f",1118],["1f535",1119],["1f535-fe0f",1119],["1f53a",1120],["1f53a-fe0f",1120],["1f53b",1121],["1f53b-fe0f",1121],["1f538",1122],["1f538-fe0f",1122],["1f539",1123],["1f539-fe0f",1123],["1f536",1124],["1f536-fe0f",1124],["1f537",1125],["1f537-fe0f",1125],["1f533",1126],["1f533-fe0f",1126],["1f532",1127],["1f532-fe0f",1127],["25aa-fe0f",1128],["25ab-fe0f",1129],["25fe-fe0f",1130],["25fd-fe0f",1131],["25fc-fe0f",1132],["25fb-fe0f",1133],["2b1b-fe0f",1134],["2b1c-fe0f",1135],["1f508",1136],["1f508-fe0f",1136],["1f507",1137],["1f507-fe0f",1137],["1f509",1138],["1f509-fe0f",1138],["1f50a",1139],["1f50a-fe0f",1139],["1f514",1140],["1f514-fe0f",1140],["1f515",1141],["1f515-fe0f",1141],["1f4e3",1142],["1f4e3-fe0f",1142],["1f4e2",1143],["1f4e2-fe0f",1143],["1f441-200d-1f5e8",1144],["1f441-200d-1f5e8-fe0f",1144],["1f4ac",1145],["1f4ac-fe0f",1145],["1f4ad",1146],["1f4ad-fe0f",1146],["1f5ef",1147],["1f5ef-fe0f",1147],["2660-fe0f",1148],["2663-fe0f",1149],["2665-fe0f",1150],["2666-fe0f",1151],["1f0cf",1152],["1f0cf-fe0f",1152],["1f3b4",1153],["1f3b4-fe0f",1153],["1f004-fe0f",1154],["1f550",1155],["1f550-fe0f",1155],["1f551",1156],["1f551-fe0f",1156],["1f552",1157],["1f552-fe0f",1157],["1f553",1158],["1f553-fe0f",1158],["1f554",1159],["1f554-fe0f",1159],["1f555",1160],["1f555-fe0f",1160],["1f556",1161],["1f556-fe0f",1161],["1f557",1162],["1f557-fe0f",1162],["1f558",1163],["1f558-fe0f",1163],["1f559",1164],["1f559-fe0f",1164],["1f55a",1165],["1f55a-fe0f",1165],["1f55b",1166],["1f55b-fe0f",1166],["1f55c",1167],["1f55c-fe0f",1167],["1f55d",1168],["1f55d-fe0f",1168],["1f55e",1169],["1f55e-fe0f",1169],["1f55f",1170],["1f55f-fe0f",1170],["1f560",1171],["1f560-fe0f",1171],["1f561",1172],["1f561-fe0f",1172],["1f562",1173],["1f562-fe0f",1173],["1f563",1174],["1f563-fe0f",1174],["1f564",1175],["1f564-fe0f",1175],["1f565",1176],["1f565-fe0f",1176],["1f566",1177],["1f566-fe0f",1177],["1f567",1178],["1f567-fe0f",1178],["1f3f3-fe0f",1179],["1f3f4",1180],["1f3f4-fe0f",1180],["1f3c1",1181],["1f3c1-fe0f",1181],["1f6a9",1182],["1f6a9-fe0f",1182],["1f3f3-fe0f-200d-1f308",1183],["1f3f3-200d-1f308-fe0f",1183],["1f1e6-1f1eb",1184],["1f1e6-1f1eb-fe0f",1184],["1f1e6-1f1fd",1185],["1f1e6-1f1fd-fe0f",1185],["1f1e6-1f1f1",1186],["1f1e6-1f1f1-fe0f",1186],["1f1e9-1f1ff",1187],["1f1e9-1f1ff-fe0f",1187],["1f1e6-1f1f8",1188],["1f1e6-1f1f8-fe0f",1188],["1f1e6-1f1e9",1189],["1f1e6-1f1e9-fe0f",1189],["1f1e6-1f1f4",1190],["1f1e6-1f1f4-fe0f",1190],["1f1e6-1f1ee",1191],["1f1e6-1f1ee-fe0f",1191],["1f1e6-1f1f6",1192],["1f1e6-1f1f6-fe0f",1192],["1f1e6-1f1ec",1193],["1f1e6-1f1ec-fe0f",1193],["1f1e6-1f1f7",1194],["1f1e6-1f1f7-fe0f",1194],["1f1e6-1f1f2",1195],["1f1e6-1f1f2-fe0f",1195],["1f1e6-1f1fc",1196],["1f1e6-1f1fc-fe0f",1196],["1f1e6-1f1fa",1197],["1f1e6-1f1fa-fe0f",1197],["1f1e6-1f1f9",1198],["1f1e6-1f1f9-fe0f",1198],["1f1e6-1f1ff",1199],["1f1e6-1f1ff-fe0f",1199],["1f1e7-1f1f8",1200],["1f1e7-1f1f8-fe0f",1200],["1f1e7-1f1ed",1201],["1f1e7-1f1ed-fe0f",1201],["1f1e7-1f1e9",1202],["1f1e7-1f1e9-fe0f",1202],["1f1e7-1f1e7",1203],["1f1e7-1f1e7-fe0f",1203],["1f1e7-1f1fe",1204],["1f1e7-1f1fe-fe0f",1204],["1f1e7-1f1ea",1205],["1f1e7-1f1ea-fe0f",1205],["1f1e7-1f1ff",1206],["1f1e7-1f1ff-fe0f",1206],["1f1e7-1f1ef",1207],["1f1e7-1f1ef-fe0f",1207],["1f1e7-1f1f2",1208],["1f1e7-1f1f2-fe0f",1208],["1f1e7-1f1f9",1209],["1f1e7-1f1f9-fe0f",1209],["1f1e7-1f1f4",1210],["1f1e7-1f1f4-fe0f",1210],["1f1e7-1f1f6",1211],["1f1e7-1f1f6-fe0f",1211],["1f1e7-1f1e6",1212],["1f1e7-1f1e6-fe0f",1212],["1f1e7-1f1fc",1213],["1f1e7-1f1fc-fe0f",1213],["1f1e7-1f1f7",1214],["1f1e7-1f1f7-fe0f",1214],["1f1ee-1f1f4",1215],["1f1ee-1f1f4-fe0f",1215],["1f1fb-1f1ec",1216],["1f1fb-1f1ec-fe0f",1216],["1f1e7-1f1f3",1217],["1f1e7-1f1f3-fe0f",1217],["1f1e7-1f1ec",1218],["1f1e7-1f1ec-fe0f",1218],["1f1e7-1f1eb",1219],["1f1e7-1f1eb-fe0f",1219],["1f1e7-1f1ee",1220],["1f1e7-1f1ee-fe0f",1220],["1f1e8-1f1fb",1221],["1f1e8-1f1fb-fe0f",1221],["1f1f0-1f1ed",1222],["1f1f0-1f1ed-fe0f",1222],["1f1e8-1f1f2",1223],["1f1e8-1f1f2-fe0f",1223],["1f1e8-1f1e6",1224],["1f1e8-1f1e6-fe0f",1224],["1f1ee-1f1e8",1225],["1f1ee-1f1e8-fe0f",1225],["1f1f0-1f1fe",1226],["1f1f0-1f1fe-fe0f",1226],["1f1e8-1f1eb",1227],["1f1e8-1f1eb-fe0f",1227],["1f1f9-1f1e9",1228],["1f1f9-1f1e9-fe0f",1228],["1f1e8-1f1f1",1229],["1f1e8-1f1f1-fe0f",1229],["1f1e8-1f1f3",1230],["1f1e8-1f1f3-fe0f",1230],["1f1e8-1f1fd",1231],["1f1e8-1f1fd-fe0f",1231],["1f1e8-1f1e8",1232],["1f1e8-1f1e8-fe0f",1232],["1f1e8-1f1f4",1233],["1f1e8-1f1f4-fe0f",1233],["1f1f0-1f1f2",1234],["1f1f0-1f1f2-fe0f",1234],["1f1e8-1f1ec",1235],["1f1e8-1f1ec-fe0f",1235],["1f1e8-1f1e9",1236],["1f1e8-1f1e9-fe0f",1236],["1f1e8-1f1f0",1237],["1f1e8-1f1f0-fe0f",1237],["1f1e8-1f1f7",1238],["1f1e8-1f1f7-fe0f",1238],["1f1e8-1f1ee",1239],["1f1e8-1f1ee-fe0f",1239],["1f1ed-1f1f7",1240],["1f1ed-1f1f7-fe0f",1240],["1f1e8-1f1fa",1241],["1f1e8-1f1fa-fe0f",1241],["1f1e8-1f1fc",1242],["1f1e8-1f1fc-fe0f",1242],["1f1e8-1f1fe",1243],["1f1e8-1f1fe-fe0f",1243],["1f1e8-1f1ff",1244],["1f1e8-1f1ff-fe0f",1244],["1f1e9-1f1f0",1245],["1f1e9-1f1f0-fe0f",1245],["1f1e9-1f1ef",1246],["1f1e9-1f1ef-fe0f",1246],["1f1e9-1f1f2",1247],["1f1e9-1f1f2-fe0f",1247],["1f1e9-1f1f4",1248],["1f1e9-1f1f4-fe0f",1248],["1f1ea-1f1e8",1249],["1f1ea-1f1e8-fe0f",1249],["1f1ea-1f1ec",1250],["1f1ea-1f1ec-fe0f",1250],["1f1f8-1f1fb",1251],["1f1f8-1f1fb-fe0f",1251],["1f1ec-1f1f6",1252],["1f1ec-1f1f6-fe0f",1252],["1f1ea-1f1f7",1253],["1f1ea-1f1f7-fe0f",1253],["1f1ea-1f1ea",1254],["1f1ea-1f1ea-fe0f",1254],["1f1ea-1f1f9",1255],["1f1ea-1f1f9-fe0f",1255],["1f1ea-1f1fa",1256],["1f1ea-1f1fa-fe0f",1256],["1f1eb-1f1f0",1257],["1f1eb-1f1f0-fe0f",1257],["1f1eb-1f1f4",1258],["1f1eb-1f1f4-fe0f",1258],["1f1eb-1f1ef",1259],["1f1eb-1f1ef-fe0f",1259],["1f1eb-1f1ee",1260],["1f1eb-1f1ee-fe0f",1260],["1f1eb-1f1f7",1261],["1f1eb-1f1f7-fe0f",1261],["1f1ec-1f1eb",1262],["1f1ec-1f1eb-fe0f",1262],["1f1f5-1f1eb",1263],["1f1f5-1f1eb-fe0f",1263],["1f1f9-1f1eb",1264],["1f1f9-1f1eb-fe0f",1264],["1f1ec-1f1e6",1265],["1f1ec-1f1e6-fe0f",1265],["1f1ec-1f1f2",1266],["1f1ec-1f1f2-fe0f",1266],["1f1ec-1f1ea",1267],["1f1ec-1f1ea-fe0f",1267],["1f1e9-1f1ea",1268],["1f1e9-1f1ea-fe0f",1268],["1f1ec-1f1ed",1269],["1f1ec-1f1ed-fe0f",1269],["1f1ec-1f1ee",1270],["1f1ec-1f1ee-fe0f",1270],["1f1ec-1f1f7",1271],["1f1ec-1f1f7-fe0f",1271],["1f1ec-1f1f1",1272],["1f1ec-1f1f1-fe0f",1272],["1f1ec-1f1e9",1273],["1f1ec-1f1e9-fe0f",1273],["1f1ec-1f1f5",1274],["1f1ec-1f1f5-fe0f",1274],["1f1ec-1f1fa",1275],["1f1ec-1f1fa-fe0f",1275],["1f1ec-1f1f9",1276],["1f1ec-1f1f9-fe0f",1276],["1f1ec-1f1ec",1277],["1f1ec-1f1ec-fe0f",1277],["1f1ec-1f1f3",1278],["1f1ec-1f1f3-fe0f",1278],["1f1ec-1f1fc",1279],["1f1ec-1f1fc-fe0f",1279],["1f1ec-1f1fe",1280],["1f1ec-1f1fe-fe0f",1280],["1f1ed-1f1f9",1281],["1f1ed-1f1f9-fe0f",1281],["1f1ed-1f1f3",1282],["1f1ed-1f1f3-fe0f",1282],["1f1ed-1f1f0",1283],["1f1ed-1f1f0-fe0f",1283],["1f1ed-1f1fa",1284],["1f1ed-1f1fa-fe0f",1284],["1f1ee-1f1f8",1285],["1f1ee-1f1f8-fe0f",1285],["1f1ee-1f1f3",1286],["1f1ee-1f1f3-fe0f",1286],["1f1ee-1f1e9",1287],["1f1ee-1f1e9-fe0f",1287],["1f1ee-1f1f7",1288],["1f1ee-1f1f7-fe0f",1288],["1f1ee-1f1f6",1289],["1f1ee-1f1f6-fe0f",1289],["1f1ee-1f1ea",1290],["1f1ee-1f1ea-fe0f",1290],["1f1ee-1f1f2",1291],["1f1ee-1f1f2-fe0f",1291],["1f1ee-1f1f1",1292],["1f1ee-1f1f1-fe0f",1292],["1f1ee-1f1f9",1293],["1f1ee-1f1f9-fe0f",1293],["1f1ef-1f1f2",1294],["1f1ef-1f1f2-fe0f",1294],["1f1ef-1f1f5",1295],["1f1ef-1f1f5-fe0f",1295],["1f38c",1296],["1f38c-fe0f",1296],["1f1ef-1f1ea",1297],["1f1ef-1f1ea-fe0f",1297],["1f1ef-1f1f4",1298],["1f1ef-1f1f4-fe0f",1298],["1f1f0-1f1ff",1299],["1f1f0-1f1ff-fe0f",1299],["1f1f0-1f1ea",1300],["1f1f0-1f1ea-fe0f",1300],["1f1f0-1f1ee",1301],["1f1f0-1f1ee-fe0f",1301],["1f1fd-1f1f0",1302],["1f1fd-1f1f0-fe0f",1302],["1f1f0-1f1fc",1303],["1f1f0-1f1fc-fe0f",1303],["1f1f0-1f1ec",1304],["1f1f0-1f1ec-fe0f",1304],["1f1f1-1f1e6",1305],["1f1f1-1f1e6-fe0f",1305],["1f1f1-1f1fb",1306],["1f1f1-1f1fb-fe0f",1306],["1f1f1-1f1e7",1307],["1f1f1-1f1e7-fe0f",1307],["1f1f1-1f1f8",1308],["1f1f1-1f1f8-fe0f",1308],["1f1f1-1f1f7",1309],["1f1f1-1f1f7-fe0f",1309],["1f1f1-1f1fe",1310],["1f1f1-1f1fe-fe0f",1310],["1f1f1-1f1ee",1311],["1f1f1-1f1ee-fe0f",1311],["1f1f1-1f1f9",1312],["1f1f1-1f1f9-fe0f",1312],["1f1f1-1f1fa",1313],["1f1f1-1f1fa-fe0f",1313],["1f1f2-1f1f4",1314],["1f1f2-1f1f4-fe0f",1314],["1f1f2-1f1f0",1315],["1f1f2-1f1f0-fe0f",1315],["1f1f2-1f1ec",1316],["1f1f2-1f1ec-fe0f",1316],["1f1f2-1f1fc",1317],["1f1f2-1f1fc-fe0f",1317],["1f1f2-1f1fe",1318],["1f1f2-1f1fe-fe0f",1318],["1f1f2-1f1fb",1319],["1f1f2-1f1fb-fe0f",1319],["1f1f2-1f1f1",1320],["1f1f2-1f1f1-fe0f",1320],["1f1f2-1f1f9",1321],["1f1f2-1f1f9-fe0f",1321],["1f1f2-1f1ed",1322],["1f1f2-1f1ed-fe0f",1322],["1f1f2-1f1f6",1323],["1f1f2-1f1f6-fe0f",1323],["1f1f2-1f1f7",1324],["1f1f2-1f1f7-fe0f",1324],["1f1f2-1f1fa",1325],["1f1f2-1f1fa-fe0f",1325],["1f1fe-1f1f9",1326],["1f1fe-1f1f9-fe0f",1326],["1f1f2-1f1fd",1327],["1f1f2-1f1fd-fe0f",1327],["1f1eb-1f1f2",1328],["1f1eb-1f1f2-fe0f",1328],["1f1f2-1f1e9",1329],["1f1f2-1f1e9-fe0f",1329],["1f1f2-1f1e8",1330],["1f1f2-1f1e8-fe0f",1330],["1f1f2-1f1f3",1331],["1f1f2-1f1f3-fe0f",1331],["1f1f2-1f1ea",1332],["1f1f2-1f1ea-fe0f",1332],["1f1f2-1f1f8",1333],["1f1f2-1f1f8-fe0f",1333],["1f1f2-1f1e6",1334],["1f1f2-1f1e6-fe0f",1334],["1f1f2-1f1ff",1335],["1f1f2-1f1ff-fe0f",1335],["1f1f2-1f1f2",1336],["1f1f2-1f1f2-fe0f",1336],["1f1f3-1f1e6",1337],["1f1f3-1f1e6-fe0f",1337],["1f1f3-1f1f7",1338],["1f1f3-1f1f7-fe0f",1338],["1f1f3-1f1f5",1339],["1f1f3-1f1f5-fe0f",1339],["1f1f3-1f1f1",1340],["1f1f3-1f1f1-fe0f",1340],["1f1f3-1f1e8",1341],["1f1f3-1f1e8-fe0f",1341],["1f1f3-1f1ff",1342],["1f1f3-1f1ff-fe0f",1342],["1f1f3-1f1ee",1343],["1f1f3-1f1ee-fe0f",1343],["1f1f3-1f1ea",1344],["1f1f3-1f1ea-fe0f",1344],["1f1f3-1f1ec",1345],["1f1f3-1f1ec-fe0f",1345],["1f1f3-1f1fa",1346],["1f1f3-1f1fa-fe0f",1346],["1f1f3-1f1eb",1347],["1f1f3-1f1eb-fe0f",1347],["1f1f2-1f1f5",1348],["1f1f2-1f1f5-fe0f",1348],["1f1f0-1f1f5",1349],["1f1f0-1f1f5-fe0f",1349],["1f1f3-1f1f4",1350],["1f1f3-1f1f4-fe0f",1350],["1f1f4-1f1f2",1351],["1f1f4-1f1f2-fe0f",1351],["1f1f5-1f1f0",1352],["1f1f5-1f1f0-fe0f",1352],["1f1f5-1f1fc",1353],["1f1f5-1f1fc-fe0f",1353],["1f1f5-1f1f8",1354],["1f1f5-1f1f8-fe0f",1354],["1f1f5-1f1e6",1355],["1f1f5-1f1e6-fe0f",1355],["1f1f5-1f1ec",1356],["1f1f5-1f1ec-fe0f",1356],["1f1f5-1f1fe",1357],["1f1f5-1f1fe-fe0f",1357],["1f1f5-1f1ea",1358],["1f1f5-1f1ea-fe0f",1358],["1f1f5-1f1ed",1359],["1f1f5-1f1ed-fe0f",1359],["1f1f5-1f1f3",1360],["1f1f5-1f1f3-fe0f",1360],["1f1f5-1f1f1",1361],["1f1f5-1f1f1-fe0f",1361],["1f1f5-1f1f9",1362],["1f1f5-1f1f9-fe0f",1362],["1f1f5-1f1f7",1363],["1f1f5-1f1f7-fe0f",1363],["1f1f6-1f1e6",1364],["1f1f6-1f1e6-fe0f",1364],["1f1f7-1f1ea",1365],["1f1f7-1f1ea-fe0f",1365],["1f1f7-1f1f4",1366],["1f1f7-1f1f4-fe0f",1366],["1f1f7-1f1fa",1367],["1f1f7-1f1fa-fe0f",1367],["1f1f7-1f1fc",1368],["1f1f7-1f1fc-fe0f",1368],["1f1e7-1f1f1",1369],["1f1e7-1f1f1-fe0f",1369],["1f1f8-1f1ed",1370],["1f1f8-1f1ed-fe0f",1370],["1f1f0-1f1f3",1371],["1f1f0-1f1f3-fe0f",1371],["1f1f1-1f1e8",1372],["1f1f1-1f1e8-fe0f",1372],["1f1f5-1f1f2",1373],["1f1f5-1f1f2-fe0f",1373],["1f1fb-1f1e8",1374],["1f1fb-1f1e8-fe0f",1374],["1f1fc-1f1f8",1375],["1f1fc-1f1f8-fe0f",1375],["1f1f8-1f1f2",1376],["1f1f8-1f1f2-fe0f",1376],["1f1f8-1f1f9",1377],["1f1f8-1f1f9-fe0f",1377],["1f1f8-1f1e6",1378],["1f1f8-1f1e6-fe0f",1378],["1f1f8-1f1f3",1379],["1f1f8-1f1f3-fe0f",1379],["1f1f7-1f1f8",1380],["1f1f7-1f1f8-fe0f",1380],["1f1f8-1f1e8",1381],["1f1f8-1f1e8-fe0f",1381],["1f1f8-1f1f1",1382],["1f1f8-1f1f1-fe0f",1382],["1f1f8-1f1ec",1383],["1f1f8-1f1ec-fe0f",1383],["1f1f8-1f1fd",1384],["1f1f8-1f1fd-fe0f",1384],["1f1f8-1f1f0",1385],["1f1f8-1f1f0-fe0f",1385],["1f1f8-1f1ee",1386],["1f1f8-1f1ee-fe0f",1386],["1f1f8-1f1e7",1387],["1f1f8-1f1e7-fe0f",1387],["1f1f8-1f1f4",1388],["1f1f8-1f1f4-fe0f",1388],["1f1ff-1f1e6",1389],["1f1ff-1f1e6-fe0f",1389],["1f1ec-1f1f8",1390],["1f1ec-1f1f8-fe0f",1390],["1f1f0-1f1f7",1391],["1f1f0-1f1f7-fe0f",1391],["1f1f8-1f1f8",1392],["1f1f8-1f1f8-fe0f",1392],["1f1ea-1f1f8",1393],["1f1ea-1f1f8-fe0f",1393],["1f1f1-1f1f0",1394],["1f1f1-1f1f0-fe0f",1394],["1f1f8-1f1e9",1395],["1f1f8-1f1e9-fe0f",1395],["1f1f8-1f1f7",1396],["1f1f8-1f1f7-fe0f",1396],["1f1f8-1f1ff",1397],["1f1f8-1f1ff-fe0f",1397],["1f1f8-1f1ea",1398],["1f1f8-1f1ea-fe0f",1398],["1f1e8-1f1ed",1399],["1f1e8-1f1ed-fe0f",1399],["1f1f8-1f1fe",1400],["1f1f8-1f1fe-fe0f",1400],["1f1f9-1f1fc",1401],["1f1f9-1f1fc-fe0f",1401],["1f1f9-1f1ef",1402],["1f1f9-1f1ef-fe0f",1402],["1f1f9-1f1ff",1403],["1f1f9-1f1ff-fe0f",1403],["1f1f9-1f1ed",1404],["1f1f9-1f1ed-fe0f",1404],["1f1f9-1f1f1",1405],["1f1f9-1f1f1-fe0f",1405],["1f1f9-1f1ec",1406],["1f1f9-1f1ec-fe0f",1406],["1f1f9-1f1f0",1407],["1f1f9-1f1f0-fe0f",1407],["1f1f9-1f1f4",1408],["1f1f9-1f1f4-fe0f",1408],["1f1f9-1f1f9",1409],["1f1f9-1f1f9-fe0f",1409],["1f1f9-1f1f3",1410],["1f1f9-1f1f3-fe0f",1410],["1f1f9-1f1f7",1411],["1f1f9-1f1f7-fe0f",1411],["1f1f9-1f1f2",1412],["1f1f9-1f1f2-fe0f",1412],["1f1f9-1f1e8",1413],["1f1f9-1f1e8-fe0f",1413],["1f1f9-1f1fb",1414],["1f1f9-1f1fb-fe0f",1414],["1f1fa-1f1ec",1415],["1f1fa-1f1ec-fe0f",1415],["1f1fa-1f1e6",1416],["1f1fa-1f1e6-fe0f",1416],["1f1e6-1f1ea",1417],["1f1e6-1f1ea-fe0f",1417],["1f1ec-1f1e7",1418],["1f1ec-1f1e7-fe0f",1418],["1f1fa-1f1f8",1419],["1f1fa-1f1f8-fe0f",1419],["1f1fb-1f1ee",1420],["1f1fb-1f1ee-fe0f",1420],["1f1fa-1f1fe",1421],["1f1fa-1f1fe-fe0f",1421],["1f1fa-1f1ff",1422],["1f1fa-1f1ff-fe0f",1422],["1f1fb-1f1fa",1423],["1f1fb-1f1fa-fe0f",1423],["1f1fb-1f1e6",1424],["1f1fb-1f1e6-fe0f",1424],["1f1fb-1f1ea",1425],["1f1fb-1f1ea-fe0f",1425],["1f1fb-1f1f3",1426],["1f1fb-1f1f3-fe0f",1426],["1f1fc-1f1eb",1427],["1f1fc-1f1eb-fe0f",1427],["1f1ea-1f1ed",1428],["1f1ea-1f1ed-fe0f",1428],["1f1fe-1f1ea",1429],["1f1fe-1f1ea-fe0f",1429],["1f1ff-1f1f2",1430],["1f1ff-1f1f2-fe0f",1430],["1f1ff-1f1fc",1431],["1f1ff-1f1fc-fe0f",1431]]);
-
-export const CategoryNames = ["people","nature","foods","activity","places","objects","symbols","flags","custom"];
-
-export const EmojiIndicesByCategory = new Map([["people",[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290]],["nature",[291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449]],["foods",[450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535]],["activity",[536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615]],["places",[616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734]],["objects",[735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907]],["symbols",[908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178]],["flags",[1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431]],["custom",[1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447]]]);
-
-/* eslint-enable */ \ No newline at end of file
diff --git a/webapp/utils/emoticons.jsx b/webapp/utils/emoticons.jsx
deleted file mode 100644
index 8a10e254e..000000000
--- a/webapp/utils/emoticons.jsx
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-import EmojiStore from 'stores/emoji_store.jsx';
-
-export const emoticonPatterns = {
- slightly_smiling_face: /(^|\s)(:-?\))(?=$|\s)/g, // :)
- wink: /(^|\s)(;-?\))(?=$|\s)/g, // ;)
- open_mouth: /(^|\s)(:o)(?=$|\s)/gi, // :o
- scream: /(^|\s)(:-o)(?=$|\s)/gi, // :-o
- smirk: /(^|\s)(:-?])(?=$|\s)/g, // :]
- smile: /(^|\s)(:-?d)(?=$|\s)/gi, // :D
- stuck_out_tongue_closed_eyes: /(^|\s)(x-d)(?=$|\s)/gi, // x-d
- stuck_out_tongue: /(^|\s)(:-?p)(?=$|\s)/gi, // :p
- rage: /(^|\s)(:-?[[@])(?=$|\s)/g, // :@
- slightly_frowning_face: /(^|\s)(:-?\()(?=$|\s)/g, // :(
- cry: /(^|\s)(:['’]-?\(|:&#x27;\(|:&#39;\()(?=$|\s)/g, // :`(
- confused: /(^|\s)(:-?\/)(?=$|\s)/g, // :/
- confounded: /(^|\s)(:-?s)(?=$|\s)/gi, // :s
- neutral_face: /(^|\s)(:-?\|)(?=$|\s)/g, // :|
- flushed: /(^|\s)(:-?\$)(?=$|\s)/g, // :$
- mask: /(^|\s)(:-x)(?=$|\s)/gi, // :-x
- heart: /(^|\s)(<3|&lt;3)(?=$|\s)/g, // <3
- broken_heart: /(^|\s)(<\/3|&lt;&#x2F;3)(?=$|\s)/g, // </3
- thumbsup: /(^|\s)(:\+1:)(?=$|\s)/g, // :+1:
- thumbsdown: /(^|\s)(:-1:)(?=$|\s)/g // :-1:
-};
-
-export const EMOJI_PATTERN = /(:([a-zA-Z0-9_-]+):)/g;
-
-export function handleEmoticons(text, tokens, emojis) {
- let output = text;
-
- function replaceEmoticonWithToken(fullMatch, prefix, matchText, name) {
- const index = tokens.size;
- const alias = `$MM_EMOTICON${index}`;
-
- if (emojis.has(name)) {
- const path = EmojiStore.getEmojiImageUrl(emojis.get(name));
-
- // we have an image path so we found a matching emoticon
- tokens.set(alias, {
- value: `<span alt="${matchText}" class="emoticon" title="${matchText}" style="background-image:url(${path})"></span>`,
- originalText: fullMatch
- });
-
- return prefix + alias;
- }
-
- return fullMatch;
- }
-
- // match named emoticons like :goat:
- output = output.replace(EMOJI_PATTERN, (fullMatch, matchText, name) => replaceEmoticonWithToken(fullMatch, '', matchText, name));
-
- // match text smilies like :D
- for (const name of Object.keys(emoticonPatterns)) {
- const pattern = emoticonPatterns[name];
-
- // this might look a bit funny, but since the name isn't contained in the actual match
- // like with the named emoticons, we need to add it in manually
- output = output.replace(pattern, (fullMatch, prefix, matchText) => replaceEmoticonWithToken(fullMatch, prefix, matchText, name));
- }
-
- return output;
-}
diff --git a/webapp/utils/event_types.jsx b/webapp/utils/event_types.jsx
deleted file mode 100644
index 1d43f4290..000000000
--- a/webapp/utils/event_types.jsx
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-import keyMirror from 'key-mirror';
-
-export default keyMirror({
- POST_LIST_SCROLL_CHANGE: null
-});
diff --git a/webapp/utils/file_utils.jsx b/webapp/utils/file_utils.jsx
deleted file mode 100644
index 42feb11be..000000000
--- a/webapp/utils/file_utils.jsx
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-import * as UserAgent from 'utils/user_agent';
-
-export function canUploadFiles() {
- if (window.mm_config.EnableFileAttachments === 'false') {
- return false;
- }
-
- if (UserAgent.isMobileApp() && window.mm_license.IsLicensed === 'true' && window.mm_license.Compliance === 'true') {
- return window.mm_config.EnableMobileFileUpload !== 'false';
- }
-
- return true;
-}
-
-export function canDownloadFiles() {
- if (UserAgent.isMobileApp() && window.mm_license.IsLicensed === 'true' && window.mm_license.Compliance === 'true') {
- return window.mm_config.EnableMobileFileDownload !== 'false';
- }
-
- return true;
-}
diff --git a/webapp/utils/global_event_emitter.jsx b/webapp/utils/global_event_emitter.jsx
deleted file mode 100644
index 0d231d2a2..000000000
--- a/webapp/utils/global_event_emitter.jsx
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-import AppDispatcher from 'dispatcher/app_dispatcher.jsx';
-import EventEmitter from 'events';
-
-import EventTypes from 'utils/event_types.jsx';
-
-class GlobalEventEmitterClass extends EventEmitter {
- constructor() {
- super();
- this.dispatchToken = AppDispatcher.register(this.handleEventPayload);
- }
-
- handleEventPayload = (payload) => {
- const {type, value, ...args} = payload.action; //eslint-disable-line no-use-before-define
-
- switch (type) {
- case EventTypes.POST_LIST_SCROLL_CHANGE:
- this.emit(type, value, args);
- break;
- }
- }
-}
-
-const GlobalEventEmitter = new GlobalEventEmitterClass();
-export default GlobalEventEmitter;
diff --git a/webapp/utils/latinise.jsx b/webapp/utils/latinise.jsx
deleted file mode 100644
index 5c0059ff1..000000000
--- a/webapp/utils/latinise.jsx
+++ /dev/null
@@ -1,1003 +0,0 @@
-// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-// Credit to http://semplicewebsites.com/removing-accents-javascript
-
-var latinMap = {
- Á: 'A', // LATIN CAPITAL LETTER A WITH ACUTE
- Ă: 'A', // LATIN CAPITAL LETTER A WITH BREVE
- Ắ: 'A', // LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
- Ặ: 'A', // LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
- Ằ: 'A', // LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
- Ẳ: 'A', // LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
- Ẵ: 'A', // LATIN CAPITAL LETTER A WITH BREVE AND TILDE
- Ǎ: 'A', // LATIN CAPITAL LETTER A WITH CARON
- Â: 'A', // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
- Ấ: 'A', // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
- Ậ: 'A', // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
- Ầ: 'A', // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
- Ẩ: 'A', // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
- Ẫ: 'A', // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
- Ä: 'A', // LATIN CAPITAL LETTER A WITH DIAERESIS
- Ǟ: 'A', // LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
- Ȧ: 'A', // LATIN CAPITAL LETTER A WITH DOT ABOVE
- Ǡ: 'A', // LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
- Ạ: 'A', // LATIN CAPITAL LETTER A WITH DOT BELOW
- Ȁ: 'A', // LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
- À: 'A', // LATIN CAPITAL LETTER A WITH GRAVE
- Ả: 'A', // LATIN CAPITAL LETTER A WITH HOOK ABOVE
- Ȃ: 'A', // LATIN CAPITAL LETTER A WITH INVERTED BREVE
- Ā: 'A', // LATIN CAPITAL LETTER A WITH MACRON
- Ą: 'A', // LATIN CAPITAL LETTER A WITH OGONEK
- Å: 'A', // LATIN CAPITAL LETTER A WITH RING ABOVE
- Ǻ: 'A', // LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
- Ḁ: 'A', // LATIN CAPITAL LETTER A WITH RING BELOW
- Ⱥ: 'A', // LATIN CAPITAL LETTER A WITH STROKE
- Ã: 'A', // LATIN CAPITAL LETTER A WITH TILDE
- Ꜳ: 'AA', // LATIN CAPITAL LETTER AA
- Æ: 'AE', // LATIN CAPITAL LETTER AE
- Ǽ: 'AE', // LATIN CAPITAL LETTER AE WITH ACUTE
- Ǣ: 'AE', // LATIN CAPITAL LETTER AE WITH MACRON
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER AFRICAN D' (Ɖ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER ALPHA' (Ɑ)
- Ꜵ: 'AO', // LATIN CAPITAL LETTER AO
- Ꜷ: 'AU', // LATIN CAPITAL LETTER AU
- Ꜹ: 'AV', // LATIN CAPITAL LETTER AV
- Ꜻ: 'AV', // LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
- Ꜽ: 'AY', // LATIN CAPITAL LETTER AY
- Ḃ: 'B', // LATIN CAPITAL LETTER B WITH DOT ABOVE
- Ḅ: 'B', // LATIN CAPITAL LETTER B WITH DOT BELOW
- Ɓ: 'B', // LATIN CAPITAL LETTER B WITH HOOK
- Ḇ: 'B', // LATIN CAPITAL LETTER B WITH LINE BELOW
- Ƀ: 'B', // LATIN CAPITAL LETTER B WITH STROKE
- Ƃ: 'B', // LATIN CAPITAL LETTER B WITH TOPBAR
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER BROKEN L' (Ꝇ)
- Ć: 'C', // LATIN CAPITAL LETTER C WITH ACUTE
- Č: 'C', // LATIN CAPITAL LETTER C WITH CARON
- Ç: 'C', // LATIN CAPITAL LETTER C WITH CEDILLA
- Ḉ: 'C', // LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
- Ĉ: 'C', // LATIN CAPITAL LETTER C WITH CIRCUMFLEX
- Ċ: 'C', // LATIN CAPITAL LETTER C WITH DOT ABOVE
- Ƈ: 'C', // LATIN CAPITAL LETTER C WITH HOOK
- Ȼ: 'C', // LATIN CAPITAL LETTER C WITH STROKE
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER CON' (Ꝯ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER CUATRILLO' (Ꜭ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER CUATRILLO WITH COMMA' (Ꜯ)
- Ď: 'D', // LATIN CAPITAL LETTER D WITH CARON
- Ḑ: 'D', // LATIN CAPITAL LETTER D WITH CEDILLA
- Ḓ: 'D', // LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
- Ḋ: 'D', // LATIN CAPITAL LETTER D WITH DOT ABOVE
- Ḍ: 'D', // LATIN CAPITAL LETTER D WITH DOT BELOW
- Ɗ: 'D', // LATIN CAPITAL LETTER D WITH HOOK
- Ḏ: 'D', // LATIN CAPITAL LETTER D WITH LINE BELOW
- Dz: 'D', // LATIN CAPITAL LETTER D WITH SMALL LETTER Z
- Dž: 'D', // LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
- Đ: 'D', // LATIN CAPITAL LETTER D WITH STROKE
- Ƌ: 'D', // LATIN CAPITAL LETTER D WITH TOPBAR
- DZ: 'DZ', // LATIN CAPITAL LETTER DZ
- DŽ: 'DZ', // LATIN CAPITAL LETTER DZ WITH CARON
- É: 'E', // LATIN CAPITAL LETTER E WITH ACUTE
- Ĕ: 'E', // LATIN CAPITAL LETTER E WITH BREVE
- Ě: 'E', // LATIN CAPITAL LETTER E WITH CARON
- Ȩ: 'E', // LATIN CAPITAL LETTER E WITH CEDILLA
- Ḝ: 'E', // LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
- Ê: 'E', // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
- Ế: 'E', // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
- Ệ: 'E', // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
- Ề: 'E', // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
- Ể: 'E', // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
- Ễ: 'E', // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
- Ḙ: 'E', // LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
- Ë: 'E', // LATIN CAPITAL LETTER E WITH DIAERESIS
- Ė: 'E', // LATIN CAPITAL LETTER E WITH DOT ABOVE
- Ẹ: 'E', // LATIN CAPITAL LETTER E WITH DOT BELOW
- Ȅ: 'E', // LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
- È: 'E', // LATIN CAPITAL LETTER E WITH GRAVE
- Ẻ: 'E', // LATIN CAPITAL LETTER E WITH HOOK ABOVE
- Ȇ: 'E', // LATIN CAPITAL LETTER E WITH INVERTED BREVE
- Ē: 'E', // LATIN CAPITAL LETTER E WITH MACRON
- Ḗ: 'E', // LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
- Ḕ: 'E', // LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
- Ę: 'E', // LATIN CAPITAL LETTER E WITH OGONEK
- Ɇ: 'E', // LATIN CAPITAL LETTER E WITH STROKE
- Ẽ: 'E', // LATIN CAPITAL LETTER E WITH TILDE
- Ḛ: 'E', // LATIN CAPITAL LETTER E WITH TILDE BELOW
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER EGYPTOLOGICAL AIN' (Ꜥ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF' (Ꜣ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER ENG' (Ŋ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER ESH' (Ʃ)
- Ꝫ: 'ET', // LATIN CAPITAL LETTER ET
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER ETH' (Ð)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER EZH' (Ʒ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER EZH REVERSED' (Ƹ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER EZH WITH CARON' (Ǯ)
- Ḟ: 'F', // LATIN CAPITAL LETTER F WITH DOT ABOVE
- Ƒ: 'F', // LATIN CAPITAL LETTER F WITH HOOK
- Ǵ: 'G', // LATIN CAPITAL LETTER G WITH ACUTE
- Ğ: 'G', // LATIN CAPITAL LETTER G WITH BREVE
- Ǧ: 'G', // LATIN CAPITAL LETTER G WITH CARON
- Ģ: 'G', // LATIN CAPITAL LETTER G WITH CEDILLA
- Ĝ: 'G', // LATIN CAPITAL LETTER G WITH CIRCUMFLEX
- Ġ: 'G', // LATIN CAPITAL LETTER G WITH DOT ABOVE
- Ɠ: 'G', // LATIN CAPITAL LETTER G WITH HOOK
- Ḡ: 'G', // LATIN CAPITAL LETTER G WITH MACRON
- Ǥ: 'G', // LATIN CAPITAL LETTER G WITH STROKE
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER GAMMA' (Ɣ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER GLOTTAL STOP' (Ɂ)
- Ḫ: 'H', // LATIN CAPITAL LETTER H WITH BREVE BELOW
- Ȟ: 'H', // LATIN CAPITAL LETTER H WITH CARON
- Ḩ: 'H', // LATIN CAPITAL LETTER H WITH CEDILLA
- Ĥ: 'H', // LATIN CAPITAL LETTER H WITH CIRCUMFLEX
- Ⱨ: 'H', // LATIN CAPITAL LETTER H WITH DESCENDER
- Ḧ: 'H', // LATIN CAPITAL LETTER H WITH DIAERESIS
- Ḣ: 'H', // LATIN CAPITAL LETTER H WITH DOT ABOVE
- Ḥ: 'H', // LATIN CAPITAL LETTER H WITH DOT BELOW
- Ħ: 'H', // LATIN CAPITAL LETTER H WITH STROKE
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER HALF H' (Ⱶ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER HENG' (Ꜧ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER HWAIR' (Ƕ)
- Í: 'I', // LATIN CAPITAL LETTER I WITH ACUTE
- Ĭ: 'I', // LATIN CAPITAL LETTER I WITH BREVE
- Ǐ: 'I', // LATIN CAPITAL LETTER I WITH CARON
- Î: 'I', // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
- Ï: 'I', // LATIN CAPITAL LETTER I WITH DIAERESIS
- Ḯ: 'I', // LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
- İ: 'I', // LATIN CAPITAL LETTER I WITH DOT ABOVE
- Ị: 'I', // LATIN CAPITAL LETTER I WITH DOT BELOW
- Ȉ: 'I', // LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
- Ì: 'I', // LATIN CAPITAL LETTER I WITH GRAVE
- Ỉ: 'I', // LATIN CAPITAL LETTER I WITH HOOK ABOVE
- Ȋ: 'I', // LATIN CAPITAL LETTER I WITH INVERTED BREVE
- Ī: 'I', // LATIN CAPITAL LETTER I WITH MACRON
- Į: 'I', // LATIN CAPITAL LETTER I WITH OGONEK
- Ɨ: 'I', // LATIN CAPITAL LETTER I WITH STROKE
- Ĩ: 'I', // LATIN CAPITAL LETTER I WITH TILDE
- Ḭ: 'I', // LATIN CAPITAL LETTER I WITH TILDE BELOW
- Ꝺ: 'D', // LATIN CAPITAL LETTER INSULAR D
- Ꝼ: 'F', // LATIN CAPITAL LETTER INSULAR F
- Ᵹ: 'G', // LATIN CAPITAL LETTER INSULAR G
- Ꞃ: 'R', // LATIN CAPITAL LETTER INSULAR R
- Ꞅ: 'S', // LATIN CAPITAL LETTER INSULAR S
- Ꞇ: 'T', // LATIN CAPITAL LETTER INSULAR T
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER IOTA' (Ɩ)
- Ꝭ: 'IS', // LATIN CAPITAL LETTER IS
- Ĵ: 'J', // LATIN CAPITAL LETTER J WITH CIRCUMFLEX
- Ɉ: 'J', // LATIN CAPITAL LETTER J WITH STROKE
- Ḱ: 'K', // LATIN CAPITAL LETTER K WITH ACUTE
- Ǩ: 'K', // LATIN CAPITAL LETTER K WITH CARON
- Ķ: 'K', // LATIN CAPITAL LETTER K WITH CEDILLA
- Ⱪ: 'K', // LATIN CAPITAL LETTER K WITH DESCENDER
- Ꝃ: 'K', // LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
- Ḳ: 'K', // LATIN CAPITAL LETTER K WITH DOT BELOW
- Ƙ: 'K', // LATIN CAPITAL LETTER K WITH HOOK
- Ḵ: 'K', // LATIN CAPITAL LETTER K WITH LINE BELOW
- Ꝁ: 'K', // LATIN CAPITAL LETTER K WITH STROKE
- Ꝅ: 'K', // LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
- Ĺ: 'L', // LATIN CAPITAL LETTER L WITH ACUTE
- Ƚ: 'L', // LATIN CAPITAL LETTER L WITH BAR
- Ľ: 'L', // LATIN CAPITAL LETTER L WITH CARON
- Ļ: 'L', // LATIN CAPITAL LETTER L WITH CEDILLA
- Ḽ: 'L', // LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
- Ḷ: 'L', // LATIN CAPITAL LETTER L WITH DOT BELOW
- Ḹ: 'L', // LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
- Ⱡ: 'L', // LATIN CAPITAL LETTER L WITH DOUBLE BAR
- Ꝉ: 'L', // LATIN CAPITAL LETTER L WITH HIGH STROKE
- Ḻ: 'L', // LATIN CAPITAL LETTER L WITH LINE BELOW
- Ŀ: 'L', // LATIN CAPITAL LETTER L WITH MIDDLE DOT
- Ɫ: 'L', // LATIN CAPITAL LETTER L WITH MIDDLE TILDE
- Lj: 'L', // LATIN CAPITAL LETTER L WITH SMALL LETTER J
- Ł: 'L', // LATIN CAPITAL LETTER L WITH STROKE
- LJ: 'LJ', // LATIN CAPITAL LETTER LJ
- Ḿ: 'M', // LATIN CAPITAL LETTER M WITH ACUTE
- Ṁ: 'M', // LATIN CAPITAL LETTER M WITH DOT ABOVE
- Ṃ: 'M', // LATIN CAPITAL LETTER M WITH DOT BELOW
- Ɱ: 'M', // LATIN CAPITAL LETTER M WITH HOOK
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER MIDDLE-WELSH LL' (Ỻ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER MIDDLE-WELSH V' (Ỽ)
- Ń: 'N', // LATIN CAPITAL LETTER N WITH ACUTE
- Ň: 'N', // LATIN CAPITAL LETTER N WITH CARON
- Ņ: 'N', // LATIN CAPITAL LETTER N WITH CEDILLA
- Ṋ: 'N', // LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
- Ṅ: 'N', // LATIN CAPITAL LETTER N WITH DOT ABOVE
- Ṇ: 'N', // LATIN CAPITAL LETTER N WITH DOT BELOW
- Ǹ: 'N', // LATIN CAPITAL LETTER N WITH GRAVE
- Ɲ: 'N', // LATIN CAPITAL LETTER N WITH LEFT HOOK
- Ṉ: 'N', // LATIN CAPITAL LETTER N WITH LINE BELOW
- Ƞ: 'N', // LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
- Nj: 'N', // LATIN CAPITAL LETTER N WITH SMALL LETTER J
- Ñ: 'N', // LATIN CAPITAL LETTER N WITH TILDE
- NJ: 'NJ', // LATIN CAPITAL LETTER NJ
- Ó: 'O', // LATIN CAPITAL LETTER O WITH ACUTE
- Ŏ: 'O', // LATIN CAPITAL LETTER O WITH BREVE
- Ǒ: 'O', // LATIN CAPITAL LETTER O WITH CARON
- Ô: 'O', // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
- Ố: 'O', // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
- Ộ: 'O', // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
- Ồ: 'O', // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
- Ổ: 'O', // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
- Ỗ: 'O', // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
- Ö: 'O', // LATIN CAPITAL LETTER O WITH DIAERESIS
- Ȫ: 'O', // LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
- Ȯ: 'O', // LATIN CAPITAL LETTER O WITH DOT ABOVE
- Ȱ: 'O', // LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
- Ọ: 'O', // LATIN CAPITAL LETTER O WITH DOT BELOW
- Ő: 'O', // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
- Ȍ: 'O', // LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
- Ò: 'O', // LATIN CAPITAL LETTER O WITH GRAVE
- Ỏ: 'O', // LATIN CAPITAL LETTER O WITH HOOK ABOVE
- Ơ: 'O', // LATIN CAPITAL LETTER O WITH HORN
- Ớ: 'O', // LATIN CAPITAL LETTER O WITH HORN AND ACUTE
- Ợ: 'O', // LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
- Ờ: 'O', // LATIN CAPITAL LETTER O WITH HORN AND GRAVE
- Ở: 'O', // LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
- Ỡ: 'O', // LATIN CAPITAL LETTER O WITH HORN AND TILDE
- Ȏ: 'O', // LATIN CAPITAL LETTER O WITH INVERTED BREVE
- Ꝋ: 'O', // LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
- Ꝍ: 'O', // LATIN CAPITAL LETTER O WITH LOOP
- Ō: 'O', // LATIN CAPITAL LETTER O WITH MACRON
- Ṓ: 'O', // LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
- Ṑ: 'O', // LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
- Ɵ: 'O', // LATIN CAPITAL LETTER O WITH MIDDLE TILDE
- Ǫ: 'O', // LATIN CAPITAL LETTER O WITH OGONEK
- Ǭ: 'O', // LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
- Ø: 'O', // LATIN CAPITAL LETTER O WITH STROKE
- Ǿ: 'O', // LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
- Õ: 'O', // LATIN CAPITAL LETTER O WITH TILDE
- Ṍ: 'O', // LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
- Ṏ: 'O', // LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
- Ȭ: 'O', // LATIN CAPITAL LETTER O WITH TILDE AND MACRON
- Ƣ: 'OI', // LATIN CAPITAL LETTER OI
- Ꝏ: 'OO', // LATIN CAPITAL LETTER OO
- Ɛ: 'E', // LATIN CAPITAL LETTER OPEN E
- Ɔ: 'O', // LATIN CAPITAL LETTER OPEN O
- Ȣ: 'OU', // LATIN CAPITAL LETTER OU
- Ṕ: 'P', // LATIN CAPITAL LETTER P WITH ACUTE
- Ṗ: 'P', // LATIN CAPITAL LETTER P WITH DOT ABOVE
- Ꝓ: 'P', // LATIN CAPITAL LETTER P WITH FLOURISH
- Ƥ: 'P', // LATIN CAPITAL LETTER P WITH HOOK
- Ꝕ: 'P', // LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
- Ᵽ: 'P', // LATIN CAPITAL LETTER P WITH STROKE
- Ꝑ: 'P', // LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
- Ꝙ: 'Q', // LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
- Ꝗ: 'Q', // LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER R ROTUNDA' (Ꝛ)
- Ŕ: 'R', // LATIN CAPITAL LETTER R WITH ACUTE
- Ř: 'R', // LATIN CAPITAL LETTER R WITH CARON
- Ŗ: 'R', // LATIN CAPITAL LETTER R WITH CEDILLA
- Ṙ: 'R', // LATIN CAPITAL LETTER R WITH DOT ABOVE
- Ṛ: 'R', // LATIN CAPITAL LETTER R WITH DOT BELOW
- Ṝ: 'R', // LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
- Ȑ: 'R', // LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
- Ȓ: 'R', // LATIN CAPITAL LETTER R WITH INVERTED BREVE
- Ṟ: 'R', // LATIN CAPITAL LETTER R WITH LINE BELOW
- Ɍ: 'R', // LATIN CAPITAL LETTER R WITH STROKE
- Ɽ: 'R', // LATIN CAPITAL LETTER R WITH TAIL
- Ꜿ: 'C', // LATIN CAPITAL LETTER REVERSED C WITH DOT
- Ǝ: 'E', // LATIN CAPITAL LETTER REVERSED E
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER RUM ROTUNDA' (Ꝝ)
- Ś: 'S', // LATIN CAPITAL LETTER S WITH ACUTE
- Ṥ: 'S', // LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
- Š: 'S', // LATIN CAPITAL LETTER S WITH CARON
- Ṧ: 'S', // LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
- Ş: 'S', // LATIN CAPITAL LETTER S WITH CEDILLA
- Ŝ: 'S', // LATIN CAPITAL LETTER S WITH CIRCUMFLEX
- Ș: 'S', // LATIN CAPITAL LETTER S WITH COMMA BELOW
- Ṡ: 'S', // LATIN CAPITAL LETTER S WITH DOT ABOVE
- Ṣ: 'S', // LATIN CAPITAL LETTER S WITH DOT BELOW
- Ṩ: 'S', // LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER SALTILLO' (Ꞌ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER SCHWA' (Ə)
- ẞ: 'SS', // LATIN CAPITAL LETTER SHARP S
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL' (Ɋ)
- Ť: 'T', // LATIN CAPITAL LETTER T WITH CARON
- Ţ: 'T', // LATIN CAPITAL LETTER T WITH CEDILLA
- Ṱ: 'T', // LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
- Ț: 'T', // LATIN CAPITAL LETTER T WITH COMMA BELOW
- Ⱦ: 'T', // LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
- Ṫ: 'T', // LATIN CAPITAL LETTER T WITH DOT ABOVE
- Ṭ: 'T', // LATIN CAPITAL LETTER T WITH DOT BELOW
- Ƭ: 'T', // LATIN CAPITAL LETTER T WITH HOOK
- Ṯ: 'T', // LATIN CAPITAL LETTER T WITH LINE BELOW
- Ʈ: 'T', // LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
- Ŧ: 'T', // LATIN CAPITAL LETTER T WITH STROKE
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER THORN' (Þ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER THORN WITH STROKE' (Ꝥ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER' (Ꝧ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER TONE FIVE' (Ƽ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER TONE SIX' (Ƅ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER TONE TWO' (Ƨ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER TRESILLO' (Ꜫ)
- Ɐ: 'A', // LATIN CAPITAL LETTER TURNED A
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER TURNED INSULAR G' (Ꝿ)
- Ꞁ: 'L', // LATIN CAPITAL LETTER TURNED L
- Ɯ: 'M', // LATIN CAPITAL LETTER TURNED M
- Ʌ: 'V', // LATIN CAPITAL LETTER TURNED V
- Ꜩ: 'TZ', // LATIN CAPITAL LETTER TZ
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER U BAR' (Ʉ)
- Ú: 'U', // LATIN CAPITAL LETTER U WITH ACUTE
- Ŭ: 'U', // LATIN CAPITAL LETTER U WITH BREVE
- Ǔ: 'U', // LATIN CAPITAL LETTER U WITH CARON
- Û: 'U', // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
- Ṷ: 'U', // LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
- Ü: 'U', // LATIN CAPITAL LETTER U WITH DIAERESIS
- Ǘ: 'U', // LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
- Ǚ: 'U', // LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
- Ǜ: 'U', // LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
- Ǖ: 'U', // LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
- Ṳ: 'U', // LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
- Ụ: 'U', // LATIN CAPITAL LETTER U WITH DOT BELOW
- Ű: 'U', // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
- Ȕ: 'U', // LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
- Ù: 'U', // LATIN CAPITAL LETTER U WITH GRAVE
- Ủ: 'U', // LATIN CAPITAL LETTER U WITH HOOK ABOVE
- Ư: 'U', // LATIN CAPITAL LETTER U WITH HORN
- Ứ: 'U', // LATIN CAPITAL LETTER U WITH HORN AND ACUTE
- Ự: 'U', // LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
- Ừ: 'U', // LATIN CAPITAL LETTER U WITH HORN AND GRAVE
- Ử: 'U', // LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
- Ữ: 'U', // LATIN CAPITAL LETTER U WITH HORN AND TILDE
- Ȗ: 'U', // LATIN CAPITAL LETTER U WITH INVERTED BREVE
- Ū: 'U', // LATIN CAPITAL LETTER U WITH MACRON
- Ṻ: 'U', // LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
- Ų: 'U', // LATIN CAPITAL LETTER U WITH OGONEK
- Ů: 'U', // LATIN CAPITAL LETTER U WITH RING ABOVE
- Ũ: 'U', // LATIN CAPITAL LETTER U WITH TILDE
- Ṹ: 'U', // LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
- Ṵ: 'U', // LATIN CAPITAL LETTER U WITH TILDE BELOW
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER UPSILON' (Ʊ)
- Ꝟ: 'V', // LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
- Ṿ: 'V', // LATIN CAPITAL LETTER V WITH DOT BELOW
- Ʋ: 'V', // LATIN CAPITAL LETTER V WITH HOOK
- Ṽ: 'V', // LATIN CAPITAL LETTER V WITH TILDE
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER VEND' (Ꝩ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER VISIGOTHIC Z' (Ꝣ)
- Ꝡ: 'VY', // LATIN CAPITAL LETTER VY
- Ẃ: 'W', // LATIN CAPITAL LETTER W WITH ACUTE
- Ŵ: 'W', // LATIN CAPITAL LETTER W WITH CIRCUMFLEX
- Ẅ: 'W', // LATIN CAPITAL LETTER W WITH DIAERESIS
- Ẇ: 'W', // LATIN CAPITAL LETTER W WITH DOT ABOVE
- Ẉ: 'W', // LATIN CAPITAL LETTER W WITH DOT BELOW
- Ẁ: 'W', // LATIN CAPITAL LETTER W WITH GRAVE
- Ⱳ: 'W', // LATIN CAPITAL LETTER W WITH HOOK
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER WYNN' (Ƿ)
- Ẍ: 'X', // LATIN CAPITAL LETTER X WITH DIAERESIS
- Ẋ: 'X', // LATIN CAPITAL LETTER X WITH DOT ABOVE
- Ý: 'Y', // LATIN CAPITAL LETTER Y WITH ACUTE
- Ŷ: 'Y', // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
- Ÿ: 'Y', // LATIN CAPITAL LETTER Y WITH DIAERESIS
- Ẏ: 'Y', // LATIN CAPITAL LETTER Y WITH DOT ABOVE
- Ỵ: 'Y', // LATIN CAPITAL LETTER Y WITH DOT BELOW
- Ỳ: 'Y', // LATIN CAPITAL LETTER Y WITH GRAVE
- Ƴ: 'Y', // LATIN CAPITAL LETTER Y WITH HOOK
- Ỷ: 'Y', // LATIN CAPITAL LETTER Y WITH HOOK ABOVE
- Ỿ: 'Y', // LATIN CAPITAL LETTER Y WITH LOOP
- Ȳ: 'Y', // LATIN CAPITAL LETTER Y WITH MACRON
- Ɏ: 'Y', // LATIN CAPITAL LETTER Y WITH STROKE
- Ỹ: 'Y', // LATIN CAPITAL LETTER Y WITH TILDE
- // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER YOGH' (Ȝ)
- Ź: 'Z', // LATIN CAPITAL LETTER Z WITH ACUTE
- Ž: 'Z', // LATIN CAPITAL LETTER Z WITH CARON
- Ẑ: 'Z', // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
- Ⱬ: 'Z', // LATIN CAPITAL LETTER Z WITH DESCENDER
- Ż: 'Z', // LATIN CAPITAL LETTER Z WITH DOT ABOVE
- Ẓ: 'Z', // LATIN CAPITAL LETTER Z WITH DOT BELOW
- Ȥ: 'Z', // LATIN CAPITAL LETTER Z WITH HOOK
- Ẕ: 'Z', // LATIN CAPITAL LETTER Z WITH LINE BELOW
- Ƶ: 'Z', // LATIN CAPITAL LETTER Z WITH STROKE
- IJ: 'IJ', // LATIN CAPITAL LIGATURE IJ
- Œ: 'OE', // LATIN CAPITAL LIGATURE OE
- // CANNOT FIND APPROXIMATION FOR 'LATIN CROSS' (✝)
- // CANNOT FIND APPROXIMATION FOR 'LATIN EPIGRAPHIC LETTER ARCHAIC M' (ꟿ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN EPIGRAPHIC LETTER I LONGA' (ꟾ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN EPIGRAPHIC LETTER INVERTED M' (ꟽ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN EPIGRAPHIC LETTER REVERSED F' (ꟻ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN EPIGRAPHIC LETTER REVERSED P' (ꟼ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER AIN' (ᴥ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER ALVEOLAR CLICK' (ǂ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER BIDENTAL PERCUSSIVE' (ʭ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER BILABIAL CLICK' (ʘ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER BILABIAL PERCUSSIVE' (ʬ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER DENTAL CLICK' (ǀ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER GLOTTAL STOP' (ʔ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER GLOTTAL STOP WITH STROKE' (ʡ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER INVERTED GLOTTAL STOP' (ʖ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE' (ƾ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER LATERAL CLICK' (ǁ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER PHARYNGEAL VOICED FRICATIVE' (ʕ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER RETROFLEX CLICK' (ǃ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER REVERSED ESH LOOP' (ƪ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE' (ʢ)
- ᴀ: 'A', // LATIN LETTER SMALL CAPITAL A
- ᴁ: 'AE', // LATIN LETTER SMALL CAPITAL AE
- ʙ: 'B', // LATIN LETTER SMALL CAPITAL B
- ᴃ: 'B', // LATIN LETTER SMALL CAPITAL BARRED B
- ᴄ: 'C', // LATIN LETTER SMALL CAPITAL C
- ᴅ: 'D', // LATIN LETTER SMALL CAPITAL D
- ᴇ: 'E', // LATIN LETTER SMALL CAPITAL E
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER SMALL CAPITAL ETH' (ᴆ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER SMALL CAPITAL EZH' (ᴣ)
- ꜰ: 'F', // LATIN LETTER SMALL CAPITAL F
- ɢ: 'G', // LATIN LETTER SMALL CAPITAL G
- ʛ: 'G', // LATIN LETTER SMALL CAPITAL G WITH HOOK
- ʜ: 'H', // LATIN LETTER SMALL CAPITAL H
- ɪ: 'I', // LATIN LETTER SMALL CAPITAL I
- ʁ: 'R', // LATIN LETTER SMALL CAPITAL INVERTED R
- ᴊ: 'J', // LATIN LETTER SMALL CAPITAL J
- ᴋ: 'K', // LATIN LETTER SMALL CAPITAL K
- ʟ: 'L', // LATIN LETTER SMALL CAPITAL L
- ᴌ: 'L', // LATIN LETTER SMALL CAPITAL L WITH STROKE
- ᴍ: 'M', // LATIN LETTER SMALL CAPITAL M
- ɴ: 'N', // LATIN LETTER SMALL CAPITAL N
- ᴏ: 'O', // LATIN LETTER SMALL CAPITAL O
- ɶ: 'OE', // LATIN LETTER SMALL CAPITAL OE
- ᴐ: 'O', // LATIN LETTER SMALL CAPITAL OPEN O
- ᴕ: 'OU', // LATIN LETTER SMALL CAPITAL OU
- ᴘ: 'P', // LATIN LETTER SMALL CAPITAL P
- ʀ: 'R', // LATIN LETTER SMALL CAPITAL R
- ᴎ: 'N', // LATIN LETTER SMALL CAPITAL REVERSED N
- ᴙ: 'R', // LATIN LETTER SMALL CAPITAL REVERSED R
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER SMALL CAPITAL RUM' (ꝶ)
- ꜱ: 'S', // LATIN LETTER SMALL CAPITAL S
- ᴛ: 'T', // LATIN LETTER SMALL CAPITAL T
- ⱻ: 'E', // LATIN LETTER SMALL CAPITAL TURNED E
- ᴚ: 'R', // LATIN LETTER SMALL CAPITAL TURNED R
- ᴜ: 'U', // LATIN LETTER SMALL CAPITAL U
- ᴠ: 'V', // LATIN LETTER SMALL CAPITAL V
- ᴡ: 'W', // LATIN LETTER SMALL CAPITAL W
- ʏ: 'Y', // LATIN LETTER SMALL CAPITAL Y
- ᴢ: 'Z', // LATIN LETTER SMALL CAPITAL Z
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER STRETCHED C' (ʗ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER TWO WITH STROKE' (ƻ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER VOICED LARYNGEAL SPIRANT' (ᴤ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER WYNN' (ƿ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER YR' (Ʀ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL CAPITAL LETTER I WITH STROKE' (ᵻ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL CAPITAL LETTER U WITH STROKE' (ᵾ)
- á: 'a', // LATIN SMALL LETTER A WITH ACUTE
- ă: 'a', // LATIN SMALL LETTER A WITH BREVE
- ắ: 'a', // LATIN SMALL LETTER A WITH BREVE AND ACUTE
- ặ: 'a', // LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
- ằ: 'a', // LATIN SMALL LETTER A WITH BREVE AND GRAVE
- ẳ: 'a', // LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
- ẵ: 'a', // LATIN SMALL LETTER A WITH BREVE AND TILDE
- ǎ: 'a', // LATIN SMALL LETTER A WITH CARON
- â: 'a', // LATIN SMALL LETTER A WITH CIRCUMFLEX
- ấ: 'a', // LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
- ậ: 'a', // LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
- ầ: 'a', // LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
- ẩ: 'a', // LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
- ẫ: 'a', // LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
- ä: 'a', // LATIN SMALL LETTER A WITH DIAERESIS
- ǟ: 'a', // LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
- ȧ: 'a', // LATIN SMALL LETTER A WITH DOT ABOVE
- ǡ: 'a', // LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
- ạ: 'a', // LATIN SMALL LETTER A WITH DOT BELOW
- ȁ: 'a', // LATIN SMALL LETTER A WITH DOUBLE GRAVE
- à: 'a', // LATIN SMALL LETTER A WITH GRAVE
- ả: 'a', // LATIN SMALL LETTER A WITH HOOK ABOVE
- ȃ: 'a', // LATIN SMALL LETTER A WITH INVERTED BREVE
- ā: 'a', // LATIN SMALL LETTER A WITH MACRON
- ą: 'a', // LATIN SMALL LETTER A WITH OGONEK
- ᶏ: 'a', // LATIN SMALL LETTER A WITH RETROFLEX HOOK
- ẚ: 'a', // LATIN SMALL LETTER A WITH RIGHT HALF RING
- å: 'a', // LATIN SMALL LETTER A WITH RING ABOVE
- ǻ: 'a', // LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
- ḁ: 'a', // LATIN SMALL LETTER A WITH RING BELOW
- ⱥ: 'a', // LATIN SMALL LETTER A WITH STROKE
- ã: 'a', // LATIN SMALL LETTER A WITH TILDE
- ꜳ: 'aa', // LATIN SMALL LETTER AA
- æ: 'ae', // LATIN SMALL LETTER AE
- ǽ: 'ae', // LATIN SMALL LETTER AE WITH ACUTE
- ǣ: 'ae', // LATIN SMALL LETTER AE WITH MACRON
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ALPHA' (ɑ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK' (ᶐ)
- ꜵ: 'ao', // LATIN SMALL LETTER AO
- ꜷ: 'au', // LATIN SMALL LETTER AU
- ꜹ: 'av', // LATIN SMALL LETTER AV
- ꜻ: 'av', // LATIN SMALL LETTER AV WITH HORIZONTAL BAR
- ꜽ: 'ay', // LATIN SMALL LETTER AY
- ḃ: 'b', // LATIN SMALL LETTER B WITH DOT ABOVE
- ḅ: 'b', // LATIN SMALL LETTER B WITH DOT BELOW
- ɓ: 'b', // LATIN SMALL LETTER B WITH HOOK
- ḇ: 'b', // LATIN SMALL LETTER B WITH LINE BELOW
- ᵬ: 'b', // LATIN SMALL LETTER B WITH MIDDLE TILDE
- ᶀ: 'b', // LATIN SMALL LETTER B WITH PALATAL HOOK
- ƀ: 'b', // LATIN SMALL LETTER B WITH STROKE
- ƃ: 'b', // LATIN SMALL LETTER B WITH TOPBAR
- ɵ: 'o', // LATIN SMALL LETTER BARRED O
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER BOTTOM HALF O' (ᴗ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER BROKEN L' (ꝇ)
- ć: 'c', // LATIN SMALL LETTER C WITH ACUTE
- č: 'c', // LATIN SMALL LETTER C WITH CARON
- ç: 'c', // LATIN SMALL LETTER C WITH CEDILLA
- ḉ: 'c', // LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
- ĉ: 'c', // LATIN SMALL LETTER C WITH CIRCUMFLEX
- ɕ: 'c', // LATIN SMALL LETTER C WITH CURL
- ċ: 'c', // LATIN SMALL LETTER C WITH DOT ABOVE
- ƈ: 'c', // LATIN SMALL LETTER C WITH HOOK
- ȼ: 'c', // LATIN SMALL LETTER C WITH STROKE
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER CLOSED OMEGA' (ɷ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER CLOSED OPEN E' (ʚ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER CLOSED REVERSED OPEN E' (ɞ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER CON' (ꝯ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER CUATRILLO' (ꜭ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER CUATRILLO WITH COMMA' (ꜯ)
- ď: 'd', // LATIN SMALL LETTER D WITH CARON
- ḑ: 'd', // LATIN SMALL LETTER D WITH CEDILLA
- ḓ: 'd', // LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
- ȡ: 'd', // LATIN SMALL LETTER D WITH CURL
- ḋ: 'd', // LATIN SMALL LETTER D WITH DOT ABOVE
- ḍ: 'd', // LATIN SMALL LETTER D WITH DOT BELOW
- ɗ: 'd', // LATIN SMALL LETTER D WITH HOOK
- ᶑ: 'd', // LATIN SMALL LETTER D WITH HOOK AND TAIL
- ḏ: 'd', // LATIN SMALL LETTER D WITH LINE BELOW
- ᵭ: 'd', // LATIN SMALL LETTER D WITH MIDDLE TILDE
- ᶁ: 'd', // LATIN SMALL LETTER D WITH PALATAL HOOK
- đ: 'd', // LATIN SMALL LETTER D WITH STROKE
- ɖ: 'd', // LATIN SMALL LETTER D WITH TAIL
- ƌ: 'd', // LATIN SMALL LETTER D WITH TOPBAR
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER DB DIGRAPH' (ȸ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER DELTA' (ẟ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER DEZH DIGRAPH' (ʤ)
- ı: 'i', // LATIN SMALL LETTER DOTLESS I
- ȷ: 'j', // LATIN SMALL LETTER DOTLESS J
- ɟ: 'j', // LATIN SMALL LETTER DOTLESS J WITH STROKE
- ʄ: 'j', // LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER DUM' (ꝱ)
- dz: 'dz', // LATIN SMALL LETTER DZ
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER DZ DIGRAPH' (ʣ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER DZ DIGRAPH WITH CURL' (ʥ)
- dž: 'dz', // LATIN SMALL LETTER DZ WITH CARON
- é: 'e', // LATIN SMALL LETTER E WITH ACUTE
- ĕ: 'e', // LATIN SMALL LETTER E WITH BREVE
- ě: 'e', // LATIN SMALL LETTER E WITH CARON
- ȩ: 'e', // LATIN SMALL LETTER E WITH CEDILLA
- ḝ: 'e', // LATIN SMALL LETTER E WITH CEDILLA AND BREVE
- ê: 'e', // LATIN SMALL LETTER E WITH CIRCUMFLEX
- ế: 'e', // LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
- ệ: 'e', // LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
- ề: 'e', // LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
- ể: 'e', // LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
- ễ: 'e', // LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
- ḙ: 'e', // LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
- ë: 'e', // LATIN SMALL LETTER E WITH DIAERESIS
- ė: 'e', // LATIN SMALL LETTER E WITH DOT ABOVE
- ẹ: 'e', // LATIN SMALL LETTER E WITH DOT BELOW
- ȅ: 'e', // LATIN SMALL LETTER E WITH DOUBLE GRAVE
- è: 'e', // LATIN SMALL LETTER E WITH GRAVE
- ẻ: 'e', // LATIN SMALL LETTER E WITH HOOK ABOVE
- ȇ: 'e', // LATIN SMALL LETTER E WITH INVERTED BREVE
- ē: 'e', // LATIN SMALL LETTER E WITH MACRON
- ḗ: 'e', // LATIN SMALL LETTER E WITH MACRON AND ACUTE
- ḕ: 'e', // LATIN SMALL LETTER E WITH MACRON AND GRAVE
- ⱸ: 'e', // LATIN SMALL LETTER E WITH NOTCH
- ę: 'e', // LATIN SMALL LETTER E WITH OGONEK
- ᶒ: 'e', // LATIN SMALL LETTER E WITH RETROFLEX HOOK
- ɇ: 'e', // LATIN SMALL LETTER E WITH STROKE
- ẽ: 'e', // LATIN SMALL LETTER E WITH TILDE
- ḛ: 'e', // LATIN SMALL LETTER E WITH TILDE BELOW
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EGYPTOLOGICAL AIN' (ꜥ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EGYPTOLOGICAL ALEF' (ꜣ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ENG' (ŋ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ESH' (ʃ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ESH WITH CURL' (ʆ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ESH WITH PALATAL HOOK' (ᶋ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ESH WITH RETROFLEX HOOK' (ᶘ)
- ꝫ: 'et', // LATIN SMALL LETTER ET
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ETH' (ð)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EZH' (ʒ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EZH REVERSED' (ƹ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EZH WITH CARON' (ǯ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EZH WITH CURL' (ʓ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EZH WITH RETROFLEX HOOK' (ᶚ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EZH WITH TAIL' (ƺ)
- ḟ: 'f', // LATIN SMALL LETTER F WITH DOT ABOVE
- ƒ: 'f', // LATIN SMALL LETTER F WITH HOOK
- ᵮ: 'f', // LATIN SMALL LETTER F WITH MIDDLE TILDE
- ᶂ: 'f', // LATIN SMALL LETTER F WITH PALATAL HOOK
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER FENG DIGRAPH' (ʩ)
- ǵ: 'g', // LATIN SMALL LETTER G WITH ACUTE
- ğ: 'g', // LATIN SMALL LETTER G WITH BREVE
- ǧ: 'g', // LATIN SMALL LETTER G WITH CARON
- ģ: 'g', // LATIN SMALL LETTER G WITH CEDILLA
- ĝ: 'g', // LATIN SMALL LETTER G WITH CIRCUMFLEX
- ġ: 'g', // LATIN SMALL LETTER G WITH DOT ABOVE
- ɠ: 'g', // LATIN SMALL LETTER G WITH HOOK
- ḡ: 'g', // LATIN SMALL LETTER G WITH MACRON
- ᶃ: 'g', // LATIN SMALL LETTER G WITH PALATAL HOOK
- ǥ: 'g', // LATIN SMALL LETTER G WITH STROKE
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER GAMMA' (ɣ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER GLOTTAL STOP' (ɂ)
- ḫ: 'h', // LATIN SMALL LETTER H WITH BREVE BELOW
- ȟ: 'h', // LATIN SMALL LETTER H WITH CARON
- ḩ: 'h', // LATIN SMALL LETTER H WITH CEDILLA
- ĥ: 'h', // LATIN SMALL LETTER H WITH CIRCUMFLEX
- ⱨ: 'h', // LATIN SMALL LETTER H WITH DESCENDER
- ḧ: 'h', // LATIN SMALL LETTER H WITH DIAERESIS
- ḣ: 'h', // LATIN SMALL LETTER H WITH DOT ABOVE
- ḥ: 'h', // LATIN SMALL LETTER H WITH DOT BELOW
- ɦ: 'h', // LATIN SMALL LETTER H WITH HOOK
- ẖ: 'h', // LATIN SMALL LETTER H WITH LINE BELOW
- ħ: 'h', // LATIN SMALL LETTER H WITH STROKE
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER HALF H' (ⱶ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER HENG' (ꜧ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER HENG WITH HOOK' (ɧ)
- ƕ: 'hv', // LATIN SMALL LETTER HV
- í: 'i', // LATIN SMALL LETTER I WITH ACUTE
- ĭ: 'i', // LATIN SMALL LETTER I WITH BREVE
- ǐ: 'i', // LATIN SMALL LETTER I WITH CARON
- î: 'i', // LATIN SMALL LETTER I WITH CIRCUMFLEX
- ï: 'i', // LATIN SMALL LETTER I WITH DIAERESIS
- ḯ: 'i', // LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
- ị: 'i', // LATIN SMALL LETTER I WITH DOT BELOW
- ȉ: 'i', // LATIN SMALL LETTER I WITH DOUBLE GRAVE
- ì: 'i', // LATIN SMALL LETTER I WITH GRAVE
- ỉ: 'i', // LATIN SMALL LETTER I WITH HOOK ABOVE
- ȋ: 'i', // LATIN SMALL LETTER I WITH INVERTED BREVE
- ī: 'i', // LATIN SMALL LETTER I WITH MACRON
- į: 'i', // LATIN SMALL LETTER I WITH OGONEK
- ᶖ: 'i', // LATIN SMALL LETTER I WITH RETROFLEX HOOK
- ɨ: 'i', // LATIN SMALL LETTER I WITH STROKE
- ĩ: 'i', // LATIN SMALL LETTER I WITH TILDE
- ḭ: 'i', // LATIN SMALL LETTER I WITH TILDE BELOW
- ꝺ: 'd', // LATIN SMALL LETTER INSULAR D
- ꝼ: 'f', // LATIN SMALL LETTER INSULAR F
- ᵹ: 'g', // LATIN SMALL LETTER INSULAR G
- ꞃ: 'r', // LATIN SMALL LETTER INSULAR R
- ꞅ: 's', // LATIN SMALL LETTER INSULAR S
- ꞇ: 't', // LATIN SMALL LETTER INSULAR T
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER IOTA' (ɩ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER IOTA WITH STROKE' (ᵼ)
- ꝭ: 'is', // LATIN SMALL LETTER IS
- ǰ: 'j', // LATIN SMALL LETTER J WITH CARON
- ĵ: 'j', // LATIN SMALL LETTER J WITH CIRCUMFLEX
- ʝ: 'j', // LATIN SMALL LETTER J WITH CROSSED-TAIL
- ɉ: 'j', // LATIN SMALL LETTER J WITH STROKE
- ḱ: 'k', // LATIN SMALL LETTER K WITH ACUTE
- ǩ: 'k', // LATIN SMALL LETTER K WITH CARON
- ķ: 'k', // LATIN SMALL LETTER K WITH CEDILLA
- ⱪ: 'k', // LATIN SMALL LETTER K WITH DESCENDER
- ꝃ: 'k', // LATIN SMALL LETTER K WITH DIAGONAL STROKE
- ḳ: 'k', // LATIN SMALL LETTER K WITH DOT BELOW
- ƙ: 'k', // LATIN SMALL LETTER K WITH HOOK
- ḵ: 'k', // LATIN SMALL LETTER K WITH LINE BELOW
- ᶄ: 'k', // LATIN SMALL LETTER K WITH PALATAL HOOK
- ꝁ: 'k', // LATIN SMALL LETTER K WITH STROKE
- ꝅ: 'k', // LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER KRA' (ĸ)
- ĺ: 'l', // LATIN SMALL LETTER L WITH ACUTE
- ƚ: 'l', // LATIN SMALL LETTER L WITH BAR
- ɬ: 'l', // LATIN SMALL LETTER L WITH BELT
- ľ: 'l', // LATIN SMALL LETTER L WITH CARON
- ļ: 'l', // LATIN SMALL LETTER L WITH CEDILLA
- ḽ: 'l', // LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
- ȴ: 'l', // LATIN SMALL LETTER L WITH CURL
- ḷ: 'l', // LATIN SMALL LETTER L WITH DOT BELOW
- ḹ: 'l', // LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
- ⱡ: 'l', // LATIN SMALL LETTER L WITH DOUBLE BAR
- ꝉ: 'l', // LATIN SMALL LETTER L WITH HIGH STROKE
- ḻ: 'l', // LATIN SMALL LETTER L WITH LINE BELOW
- ŀ: 'l', // LATIN SMALL LETTER L WITH MIDDLE DOT
- ɫ: 'l', // LATIN SMALL LETTER L WITH MIDDLE TILDE
- ᶅ: 'l', // LATIN SMALL LETTER L WITH PALATAL HOOK
- ɭ: 'l', // LATIN SMALL LETTER L WITH RETROFLEX HOOK
- ł: 'l', // LATIN SMALL LETTER L WITH STROKE
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER LAMBDA WITH STROKE' (ƛ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER LEZH' (ɮ)
- lj: 'lj', // LATIN SMALL LETTER LJ
- ſ: 's', // LATIN SMALL LETTER LONG S
- ẜ: 's', // LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE
- ẛ: 's', // LATIN SMALL LETTER LONG S WITH DOT ABOVE
- ẝ: 's', // LATIN SMALL LETTER LONG S WITH HIGH STROKE
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER LS DIGRAPH' (ʪ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER LUM' (ꝲ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER LZ DIGRAPH' (ʫ)
- ḿ: 'm', // LATIN SMALL LETTER M WITH ACUTE
- ṁ: 'm', // LATIN SMALL LETTER M WITH DOT ABOVE
- ṃ: 'm', // LATIN SMALL LETTER M WITH DOT BELOW
- ɱ: 'm', // LATIN SMALL LETTER M WITH HOOK
- ᵯ: 'm', // LATIN SMALL LETTER M WITH MIDDLE TILDE
- ᶆ: 'm', // LATIN SMALL LETTER M WITH PALATAL HOOK
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER MIDDLE-WELSH LL' (ỻ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER MIDDLE-WELSH V' (ỽ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER MUM' (ꝳ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER N PRECEDED BY APOSTROPHE' (ʼn)
- ń: 'n', // LATIN SMALL LETTER N WITH ACUTE
- ň: 'n', // LATIN SMALL LETTER N WITH CARON
- ņ: 'n', // LATIN SMALL LETTER N WITH CEDILLA
- ṋ: 'n', // LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
- ȵ: 'n', // LATIN SMALL LETTER N WITH CURL
- ṅ: 'n', // LATIN SMALL LETTER N WITH DOT ABOVE
- ṇ: 'n', // LATIN SMALL LETTER N WITH DOT BELOW
- ǹ: 'n', // LATIN SMALL LETTER N WITH GRAVE
- ɲ: 'n', // LATIN SMALL LETTER N WITH LEFT HOOK
- ṉ: 'n', // LATIN SMALL LETTER N WITH LINE BELOW
- ƞ: 'n', // LATIN SMALL LETTER N WITH LONG RIGHT LEG
- ᵰ: 'n', // LATIN SMALL LETTER N WITH MIDDLE TILDE
- ᶇ: 'n', // LATIN SMALL LETTER N WITH PALATAL HOOK
- ɳ: 'n', // LATIN SMALL LETTER N WITH RETROFLEX HOOK
- ñ: 'n', // LATIN SMALL LETTER N WITH TILDE
- nj: 'nj', // LATIN SMALL LETTER NJ
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER NUM' (ꝴ)
- ó: 'o', // LATIN SMALL LETTER O WITH ACUTE
- ŏ: 'o', // LATIN SMALL LETTER O WITH BREVE
- ǒ: 'o', // LATIN SMALL LETTER O WITH CARON
- ô: 'o', // LATIN SMALL LETTER O WITH CIRCUMFLEX
- ố: 'o', // LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
- ộ: 'o', // LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
- ồ: 'o', // LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
- ổ: 'o', // LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
- ỗ: 'o', // LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
- ö: 'o', // LATIN SMALL LETTER O WITH DIAERESIS
- ȫ: 'o', // LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
- ȯ: 'o', // LATIN SMALL LETTER O WITH DOT ABOVE
- ȱ: 'o', // LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
- ọ: 'o', // LATIN SMALL LETTER O WITH DOT BELOW
- ő: 'o', // LATIN SMALL LETTER O WITH DOUBLE ACUTE
- ȍ: 'o', // LATIN SMALL LETTER O WITH DOUBLE GRAVE
- ò: 'o', // LATIN SMALL LETTER O WITH GRAVE
- ỏ: 'o', // LATIN SMALL LETTER O WITH HOOK ABOVE
- ơ: 'o', // LATIN SMALL LETTER O WITH HORN
- ớ: 'o', // LATIN SMALL LETTER O WITH HORN AND ACUTE
- ợ: 'o', // LATIN SMALL LETTER O WITH HORN AND DOT BELOW
- ờ: 'o', // LATIN SMALL LETTER O WITH HORN AND GRAVE
- ở: 'o', // LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
- ỡ: 'o', // LATIN SMALL LETTER O WITH HORN AND TILDE
- ȏ: 'o', // LATIN SMALL LETTER O WITH INVERTED BREVE
- ꝋ: 'o', // LATIN SMALL LETTER O WITH LONG STROKE OVERLAY
- ꝍ: 'o', // LATIN SMALL LETTER O WITH LOOP
- ⱺ: 'o', // LATIN SMALL LETTER O WITH LOW RING INSIDE
- ō: 'o', // LATIN SMALL LETTER O WITH MACRON
- ṓ: 'o', // LATIN SMALL LETTER O WITH MACRON AND ACUTE
- ṑ: 'o', // LATIN SMALL LETTER O WITH MACRON AND GRAVE
- ǫ: 'o', // LATIN SMALL LETTER O WITH OGONEK
- ǭ: 'o', // LATIN SMALL LETTER O WITH OGONEK AND MACRON
- ø: 'o', // LATIN SMALL LETTER O WITH STROKE
- ǿ: 'o', // LATIN SMALL LETTER O WITH STROKE AND ACUTE
- õ: 'o', // LATIN SMALL LETTER O WITH TILDE
- ṍ: 'o', // LATIN SMALL LETTER O WITH TILDE AND ACUTE
- ṏ: 'o', // LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
- ȭ: 'o', // LATIN SMALL LETTER O WITH TILDE AND MACRON
- ƣ: 'oi', // LATIN SMALL LETTER OI
- ꝏ: 'oo', // LATIN SMALL LETTER OO
- ɛ: 'e', // LATIN SMALL LETTER OPEN E
- ᶓ: 'e', // LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK
- ɔ: 'o', // LATIN SMALL LETTER OPEN O
- ᶗ: 'o', // LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK
- ȣ: 'ou', // LATIN SMALL LETTER OU
- ṕ: 'p', // LATIN SMALL LETTER P WITH ACUTE
- ṗ: 'p', // LATIN SMALL LETTER P WITH DOT ABOVE
- ꝓ: 'p', // LATIN SMALL LETTER P WITH FLOURISH
- ƥ: 'p', // LATIN SMALL LETTER P WITH HOOK
- ᵱ: 'p', // LATIN SMALL LETTER P WITH MIDDLE TILDE
- ᶈ: 'p', // LATIN SMALL LETTER P WITH PALATAL HOOK
- ꝕ: 'p', // LATIN SMALL LETTER P WITH SQUIRREL TAIL
- ᵽ: 'p', // LATIN SMALL LETTER P WITH STROKE
- ꝑ: 'p', // LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER PHI' (ɸ)
- ꝙ: 'q', // LATIN SMALL LETTER Q WITH DIAGONAL STROKE
- ʠ: 'q', // LATIN SMALL LETTER Q WITH HOOK
- ɋ: 'q', // LATIN SMALL LETTER Q WITH HOOK TAIL
- ꝗ: 'q', // LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER QP DIGRAPH' (ȹ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER R ROTUNDA' (ꝛ)
- ŕ: 'r', // LATIN SMALL LETTER R WITH ACUTE
- ř: 'r', // LATIN SMALL LETTER R WITH CARON
- ŗ: 'r', // LATIN SMALL LETTER R WITH CEDILLA
- ṙ: 'r', // LATIN SMALL LETTER R WITH DOT ABOVE
- ṛ: 'r', // LATIN SMALL LETTER R WITH DOT BELOW
- ṝ: 'r', // LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
- ȑ: 'r', // LATIN SMALL LETTER R WITH DOUBLE GRAVE
- ɾ: 'r', // LATIN SMALL LETTER R WITH FISHHOOK
- ᵳ: 'r', // LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE
- ȓ: 'r', // LATIN SMALL LETTER R WITH INVERTED BREVE
- ṟ: 'r', // LATIN SMALL LETTER R WITH LINE BELOW
- ɼ: 'r', // LATIN SMALL LETTER R WITH LONG LEG
- ᵲ: 'r', // LATIN SMALL LETTER R WITH MIDDLE TILDE
- ᶉ: 'r', // LATIN SMALL LETTER R WITH PALATAL HOOK
- ɍ: 'r', // LATIN SMALL LETTER R WITH STROKE
- ɽ: 'r', // LATIN SMALL LETTER R WITH TAIL
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER RAMS HORN' (ɤ)
- ↄ: 'c', // LATIN SMALL LETTER REVERSED C
- ꜿ: 'c', // LATIN SMALL LETTER REVERSED C WITH DOT
- ɘ: 'e', // LATIN SMALL LETTER REVERSED E
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER REVERSED OPEN E' (ɜ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER REVERSED OPEN E WITH HOOK' (ɝ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK' (ᶔ)
- ɿ: 'r', // LATIN SMALL LETTER REVERSED R WITH FISHHOOK
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER RUM' (ꝵ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER RUM ROTUNDA' (ꝝ)
- ś: 's', // LATIN SMALL LETTER S WITH ACUTE
- ṥ: 's', // LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
- š: 's', // LATIN SMALL LETTER S WITH CARON
- ṧ: 's', // LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
- ş: 's', // LATIN SMALL LETTER S WITH CEDILLA
- ŝ: 's', // LATIN SMALL LETTER S WITH CIRCUMFLEX
- ș: 's', // LATIN SMALL LETTER S WITH COMMA BELOW
- ṡ: 's', // LATIN SMALL LETTER S WITH DOT ABOVE
- ṣ: 's', // LATIN SMALL LETTER S WITH DOT BELOW
- ṩ: 's', // LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
- ʂ: 's', // LATIN SMALL LETTER S WITH HOOK
- ᵴ: 's', // LATIN SMALL LETTER S WITH MIDDLE TILDE
- ᶊ: 's', // LATIN SMALL LETTER S WITH PALATAL HOOK
- ȿ: 's', // LATIN SMALL LETTER S WITH SWASH TAIL
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SALTILLO' (ꞌ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SCHWA' (ə)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SCHWA WITH HOOK' (ɚ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK' (ᶕ)
- ɡ: 'g', // LATIN SMALL LETTER SCRIPT G
- ß: 'ss', // LATIN SMALL LETTER SHARP S
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SIDEWAYS DIAERESIZED U' (ᴞ)
- ᴑ: 'o', // LATIN SMALL LETTER SIDEWAYS O
- ᴓ: 'o', // LATIN SMALL LETTER SIDEWAYS O WITH STROKE
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SIDEWAYS OPEN O' (ᴒ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SIDEWAYS TURNED M' (ᴟ)
- ᴝ: 'u', // LATIN SMALL LETTER SIDEWAYS U
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SQUAT REVERSED ESH' (ʅ)
- ť: 't', // LATIN SMALL LETTER T WITH CARON
- ţ: 't', // LATIN SMALL LETTER T WITH CEDILLA
- ṱ: 't', // LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
- ț: 't', // LATIN SMALL LETTER T WITH COMMA BELOW
- ȶ: 't', // LATIN SMALL LETTER T WITH CURL
- ẗ: 't', // LATIN SMALL LETTER T WITH DIAERESIS
- ⱦ: 't', // LATIN SMALL LETTER T WITH DIAGONAL STROKE
- ṫ: 't', // LATIN SMALL LETTER T WITH DOT ABOVE
- ṭ: 't', // LATIN SMALL LETTER T WITH DOT BELOW
- ƭ: 't', // LATIN SMALL LETTER T WITH HOOK
- ṯ: 't', // LATIN SMALL LETTER T WITH LINE BELOW
- ᵵ: 't', // LATIN SMALL LETTER T WITH MIDDLE TILDE
- ƫ: 't', // LATIN SMALL LETTER T WITH PALATAL HOOK
- ʈ: 't', // LATIN SMALL LETTER T WITH RETROFLEX HOOK
- ŧ: 't', // LATIN SMALL LETTER T WITH STROKE
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TAILLESS PHI' (ⱷ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TC DIGRAPH WITH CURL' (ʨ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TESH DIGRAPH' (ʧ)
- ᵺ: 'th', // LATIN SMALL LETTER TH WITH STRIKETHROUGH
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER THORN' (þ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER THORN WITH STROKE' (ꝥ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER' (ꝧ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TONE FIVE' (ƽ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TONE SIX' (ƅ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TONE TWO' (ƨ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TOP HALF O' (ᴖ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TRESILLO' (ꜫ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TS DIGRAPH' (ʦ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TUM' (ꝷ)
- ɐ: 'a', // LATIN SMALL LETTER TURNED A
- ᴂ: 'ae', // LATIN SMALL LETTER TURNED AE
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TURNED ALPHA' (ɒ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TURNED DELTA' (ƍ)
- ǝ: 'e', // LATIN SMALL LETTER TURNED E
- ᵷ: 'g', // LATIN SMALL LETTER TURNED G
- ɥ: 'h', // LATIN SMALL LETTER TURNED H
- ʮ: 'h', // LATIN SMALL LETTER TURNED H WITH FISHHOOK
- ʯ: 'h', // LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
- ᴉ: 'i', // LATIN SMALL LETTER TURNED I
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TURNED INSULAR G' (ꝿ)
- ʞ: 'k', // LATIN SMALL LETTER TURNED K
- ꞁ: 'l', // LATIN SMALL LETTER TURNED L
- ɯ: 'm', // LATIN SMALL LETTER TURNED M
- ɰ: 'm', // LATIN SMALL LETTER TURNED M WITH LONG LEG
- ᴔ: 'oe', // LATIN SMALL LETTER TURNED OE
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TURNED OPEN E' (ᴈ)
- ɹ: 'r', // LATIN SMALL LETTER TURNED R
- ɻ: 'r', // LATIN SMALL LETTER TURNED R WITH HOOK
- ɺ: 'r', // LATIN SMALL LETTER TURNED R WITH LONG LEG
- ⱹ: 'r', // LATIN SMALL LETTER TURNED R WITH TAIL
- ʇ: 't', // LATIN SMALL LETTER TURNED T
- ʌ: 'v', // LATIN SMALL LETTER TURNED V
- ʍ: 'w', // LATIN SMALL LETTER TURNED W
- ʎ: 'y', // LATIN SMALL LETTER TURNED Y
- ꜩ: 'tz', // LATIN SMALL LETTER TZ
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER U BAR' (ʉ)
- ú: 'u', // LATIN SMALL LETTER U WITH ACUTE
- ŭ: 'u', // LATIN SMALL LETTER U WITH BREVE
- ǔ: 'u', // LATIN SMALL LETTER U WITH CARON
- û: 'u', // LATIN SMALL LETTER U WITH CIRCUMFLEX
- ṷ: 'u', // LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
- ü: 'u', // LATIN SMALL LETTER U WITH DIAERESIS
- ǘ: 'u', // LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
- ǚ: 'u', // LATIN SMALL LETTER U WITH DIAERESIS AND CARON
- ǜ: 'u', // LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
- ǖ: 'u', // LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
- ṳ: 'u', // LATIN SMALL LETTER U WITH DIAERESIS BELOW
- ụ: 'u', // LATIN SMALL LETTER U WITH DOT BELOW
- ű: 'u', // LATIN SMALL LETTER U WITH DOUBLE ACUTE
- ȕ: 'u', // LATIN SMALL LETTER U WITH DOUBLE GRAVE
- ù: 'u', // LATIN SMALL LETTER U WITH GRAVE
- ủ: 'u', // LATIN SMALL LETTER U WITH HOOK ABOVE
- ư: 'u', // LATIN SMALL LETTER U WITH HORN
- ứ: 'u', // LATIN SMALL LETTER U WITH HORN AND ACUTE
- ự: 'u', // LATIN SMALL LETTER U WITH HORN AND DOT BELOW
- ừ: 'u', // LATIN SMALL LETTER U WITH HORN AND GRAVE
- ử: 'u', // LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
- ữ: 'u', // LATIN SMALL LETTER U WITH HORN AND TILDE
- ȗ: 'u', // LATIN SMALL LETTER U WITH INVERTED BREVE
- ū: 'u', // LATIN SMALL LETTER U WITH MACRON
- ṻ: 'u', // LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
- ų: 'u', // LATIN SMALL LETTER U WITH OGONEK
- ᶙ: 'u', // LATIN SMALL LETTER U WITH RETROFLEX HOOK
- ů: 'u', // LATIN SMALL LETTER U WITH RING ABOVE
- ũ: 'u', // LATIN SMALL LETTER U WITH TILDE
- ṹ: 'u', // LATIN SMALL LETTER U WITH TILDE AND ACUTE
- ṵ: 'u', // LATIN SMALL LETTER U WITH TILDE BELOW
- ᵫ: 'ue', // LATIN SMALL LETTER UE
- ꝸ: 'um', // LATIN SMALL LETTER UM
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER UPSILON' (ʊ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER UPSILON WITH STROKE' (ᵿ)
- ⱴ: 'v', // LATIN SMALL LETTER V WITH CURL
- ꝟ: 'v', // LATIN SMALL LETTER V WITH DIAGONAL STROKE
- ṿ: 'v', // LATIN SMALL LETTER V WITH DOT BELOW
- ʋ: 'v', // LATIN SMALL LETTER V WITH HOOK
- ᶌ: 'v', // LATIN SMALL LETTER V WITH PALATAL HOOK
- ⱱ: 'v', // LATIN SMALL LETTER V WITH RIGHT HOOK
- ṽ: 'v', // LATIN SMALL LETTER V WITH TILDE
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER VEND' (ꝩ)
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER VISIGOTHIC Z' (ꝣ)
- ꝡ: 'vy', // LATIN SMALL LETTER VY
- ẃ: 'w', // LATIN SMALL LETTER W WITH ACUTE
- ŵ: 'w', // LATIN SMALL LETTER W WITH CIRCUMFLEX
- ẅ: 'w', // LATIN SMALL LETTER W WITH DIAERESIS
- ẇ: 'w', // LATIN SMALL LETTER W WITH DOT ABOVE
- ẉ: 'w', // LATIN SMALL LETTER W WITH DOT BELOW
- ẁ: 'w', // LATIN SMALL LETTER W WITH GRAVE
- ⱳ: 'w', // LATIN SMALL LETTER W WITH HOOK
- ẘ: 'w', // LATIN SMALL LETTER W WITH RING ABOVE
- ẍ: 'x', // LATIN SMALL LETTER X WITH DIAERESIS
- ẋ: 'x', // LATIN SMALL LETTER X WITH DOT ABOVE
- ᶍ: 'x', // LATIN SMALL LETTER X WITH PALATAL HOOK
- ý: 'y', // LATIN SMALL LETTER Y WITH ACUTE
- ŷ: 'y', // LATIN SMALL LETTER Y WITH CIRCUMFLEX
- ÿ: 'y', // LATIN SMALL LETTER Y WITH DIAERESIS
- ẏ: 'y', // LATIN SMALL LETTER Y WITH DOT ABOVE
- ỵ: 'y', // LATIN SMALL LETTER Y WITH DOT BELOW
- ỳ: 'y', // LATIN SMALL LETTER Y WITH GRAVE
- ƴ: 'y', // LATIN SMALL LETTER Y WITH HOOK
- ỷ: 'y', // LATIN SMALL LETTER Y WITH HOOK ABOVE
- ỿ: 'y', // LATIN SMALL LETTER Y WITH LOOP
- ȳ: 'y', // LATIN SMALL LETTER Y WITH MACRON
- ẙ: 'y', // LATIN SMALL LETTER Y WITH RING ABOVE
- ɏ: 'y', // LATIN SMALL LETTER Y WITH STROKE
- ỹ: 'y', // LATIN SMALL LETTER Y WITH TILDE
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER YOGH' (ȝ)
- ź: 'z', // LATIN SMALL LETTER Z WITH ACUTE
- ž: 'z', // LATIN SMALL LETTER Z WITH CARON
- ẑ: 'z', // LATIN SMALL LETTER Z WITH CIRCUMFLEX
- ʑ: 'z', // LATIN SMALL LETTER Z WITH CURL
- ⱬ: 'z', // LATIN SMALL LETTER Z WITH DESCENDER
- ż: 'z', // LATIN SMALL LETTER Z WITH DOT ABOVE
- ẓ: 'z', // LATIN SMALL LETTER Z WITH DOT BELOW
- ȥ: 'z', // LATIN SMALL LETTER Z WITH HOOK
- ẕ: 'z', // LATIN SMALL LETTER Z WITH LINE BELOW
- ᵶ: 'z', // LATIN SMALL LETTER Z WITH MIDDLE TILDE
- ᶎ: 'z', // LATIN SMALL LETTER Z WITH PALATAL HOOK
- ʐ: 'z', // LATIN SMALL LETTER Z WITH RETROFLEX HOOK
- ƶ: 'z', // LATIN SMALL LETTER Z WITH STROKE
- ɀ: 'z', // LATIN SMALL LETTER Z WITH SWASH TAIL
- ff: 'ff', // LATIN SMALL LIGATURE FF
- ffi: 'ffi', // LATIN SMALL LIGATURE FFI
- ffl: 'ffl', // LATIN SMALL LIGATURE FFL
- fi: 'fi', // LATIN SMALL LIGATURE FI
- fl: 'fl', // LATIN SMALL LIGATURE FL
- ij: 'ij', // LATIN SMALL LIGATURE IJ
- // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LIGATURE LONG S T' (ſt)
- œ: 'oe', // LATIN SMALL LIGATURE OE
- st: 'st', // LATIN SMALL LIGATURE ST
- ₐ: 'a', // LATIN SUBSCRIPT SMALL LETTER A
- ₑ: 'e', // LATIN SUBSCRIPT SMALL LETTER E
- ᵢ: 'i', // LATIN SUBSCRIPT SMALL LETTER I
- ⱼ: 'j', // LATIN SUBSCRIPT SMALL LETTER J
- ₒ: 'o', // LATIN SUBSCRIPT SMALL LETTER O
- ᵣ: 'r', // LATIN SUBSCRIPT SMALL LETTER R
- // CANNOT FIND APPROXIMATION FOR 'LATIN SUBSCRIPT SMALL LETTER SCHWA' (ₔ)
- ᵤ: 'u', // LATIN SUBSCRIPT SMALL LETTER U
- ᵥ: 'v', // LATIN SUBSCRIPT SMALL LETTER V
- ₓ: 'x' // LATIN SUBSCRIPT SMALL LETTER X
-};
-
-export function map(x) {
- return latinMap[x] || x;
-}
-
-export function latinise(input) {
- return input.replace(/[^A-Za-z0-9]/g, map);
-}
diff --git a/webapp/utils/license_utils.jsx b/webapp/utils/license_utils.jsx
deleted file mode 100644
index a44cfb9d4..000000000
--- a/webapp/utils/license_utils.jsx
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-import LocalizationStore from 'stores/localization_store.jsx';
-
-const LICENSE_EXPIRY_NOTIFICATION = 1000 * 60 * 60 * 24 * 60; // 60 days
-const LICENSE_GRACE_PERIOD = 1000 * 60 * 60 * 24 * 15; // 15 days
-
-export function isLicenseExpiring() {
- if (window.mm_license.IsLicensed !== 'true') {
- return false;
- }
-
- const timeDiff = parseInt(global.window.mm_license.ExpiresAt, 10) - Date.now();
- return timeDiff <= LICENSE_EXPIRY_NOTIFICATION;
-}
-
-export function isLicenseExpired() {
- if (window.mm_license.IsLicensed !== 'true') {
- return false;
- }
-
- const timeDiff = parseInt(global.window.mm_license.ExpiresAt, 10) - Date.now();
- return timeDiff < 0;
-}
-
-export function isLicensePastGracePeriod() {
- if (window.mm_license.IsLicensed !== 'true') {
- return false;
- }
-
- const timeDiff = Date.now() - parseInt(global.window.mm_license.ExpiresAt, 10);
- return timeDiff > LICENSE_GRACE_PERIOD;
-}
-
-export function displayExpiryDate() {
- const date = new Date(parseInt(global.window.mm_license.ExpiresAt, 10));
- return date.toLocaleString(LocalizationStore.getLocale(), {year: 'numeric', month: 'long', day: 'numeric'});
-}
diff --git a/webapp/utils/markdown.jsx b/webapp/utils/markdown.jsx
deleted file mode 100644
index 5918b1581..000000000
--- a/webapp/utils/markdown.jsx
+++ /dev/null
@@ -1,270 +0,0 @@
-// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-import * as TextFormatting from './text_formatting.jsx';
-import * as SyntaxHighlighting from './syntax_highlighting.jsx';
-
-import marked from 'marked';
-import katex from 'katex';
-
-class MattermostMarkdownRenderer extends marked.Renderer {
- constructor(options, formattingOptions = {}) {
- super(options);
-
- this.heading = this.heading.bind(this);
- this.paragraph = this.paragraph.bind(this);
- this.text = this.text.bind(this);
-
- this.formattingOptions = formattingOptions;
- }
-
- code(code, language) {
- let usedLanguage = language || '';
- usedLanguage = usedLanguage.toLowerCase();
-
- if (usedLanguage === 'tex' || usedLanguage === 'latex') {
- try {
- const html = katex.renderToString(code, {throwOnError: false, displayMode: true});
-
- return '<div class="post-body--code tex">' + html + '</div>';
- } catch (e) {
- // fall through if latex parsing fails and handle below
- }
- }
-
- // treat html as xml to prevent injection attacks
- if (usedLanguage === 'html') {
- usedLanguage = 'xml';
- }
-
- let className = 'post-code';
- if (!usedLanguage) {
- className += ' post-code--wrap';
- }
-
- let header = '';
- if (SyntaxHighlighting.canHighlight(usedLanguage)) {
- header = (
- '<span class="post-code__language">' +
- SyntaxHighlighting.getLanguageName(usedLanguage) +
- '</span>'
- );
- }
-
- // if we have to apply syntax highlighting AND highlighting of search terms, create two copies
- // of the code block, one with syntax highlighting applied and another with invisible text, but
- // search term highlighting and overlap them
- const content = SyntaxHighlighting.highlight(usedLanguage, code);
- let searchedContent = '';
-
- if (this.formattingOptions.searchPatterns) {
- const tokens = new Map();
-
- let searched = TextFormatting.sanitizeHtml(code);
- searched = TextFormatting.highlightSearchTerms(searched, tokens, this.formattingOptions.searchPatterns);
-
- if (tokens.size > 0) {
- searched = TextFormatting.replaceTokens(searched, tokens);
-
- searchedContent = (
- '<div class="post-code__search-highlighting">' +
- searched +
- '</div>'
- );
- }
- }
-
- return (
- '<div class="' + className + '">' +
- header +
- '<code class="hljs">' +
- searchedContent +
- content +
- '</code>' +
- '</div>'
- );
- }
-
- codespan(text) {
- let output = text;
-
- if (this.formattingOptions.searchPatterns) {
- const tokens = new Map();
- output = TextFormatting.highlightSearchTerms(output, tokens, this.formattingOptions.searchPatterns);
- output = TextFormatting.replaceTokens(output, tokens);
- }
-
- return (
- '<span class="codespan__pre-wrap">' +
- '<code>' +
- output +
- '</code>' +
- '</span>'
- );
- }
-
- br() {
- if (this.formattingOptions.singleline) {
- return ' ';
- }
-
- return super.br();
- }
-
- image(href, title, text) {
- let src = href;
- let dimensions = [];
- const parts = href.split(' ');
- if (parts.length > 1) {
- const lastPart = parts.pop();
- src = parts.join(' ');
- if (lastPart[0] === '=') {
- dimensions = lastPart.substr(1).split('x');
- if (dimensions.length === 2 && dimensions[1] === '') {
- dimensions[1] = 'auto';
- }
- }
- }
- let out = '<img src="' + src + '" alt="' + text + '"';
- if (title) {
- out += ' title="' + title + '"';
- }
- if (dimensions.length > 0) {
- out += ' width="' + dimensions[0] + '"';
- }
- if (dimensions.length > 1) {
- out += ' height="' + dimensions[1] + '"';
- }
- out += ' class="markdown-inline-img"';
- out += this.options.xhtml ? '/>' : '>';
- return out;
- }
-
- heading(text, level) {
- return `<h${level} class="markdown__heading">${text}</h${level}>`;
- }
-
- link(href, title, text) {
- let outHref = href;
-
- if (this.formattingOptions.linkFilter && !this.formattingOptions.linkFilter(outHref)) {
- return text;
- }
-
- try {
- let unescaped = unescape(href);
- try {
- unescaped = decodeURIComponent(unescaped);
- } catch (e) {
- unescaped = global.unescape(unescaped);
- }
- unescaped = unescaped.replace(/[^\w:]/g, '').toLowerCase();
-
- if (unescaped.indexOf('javascript:') === 0 || unescaped.indexOf('vbscript:') === 0 || unescaped.indexOf('data:') === 0) { // eslint-disable-line no-script-url
- return text;
- }
- } catch (e) {
- return text;
- }
-
- if (!(/[a-z+.-]+:/i).test(outHref)) {
- outHref = `http://${outHref}`;
- }
-
- let output = '<a class="theme markdown__link';
-
- if (this.formattingOptions.searchPatterns) {
- for (const pattern of this.formattingOptions.searchPatterns) {
- if (pattern.pattern.test(href)) {
- output += ' search-highlight';
- break;
- }
- }
- }
-
- output += '" href="' + outHref + '" rel="noreferrer"';
-
- // special case for team invite links, channel links, and permalinks that are inside the app
- let internalLink = false;
- if (this.formattingOptions.siteURL) {
- const pattern = new RegExp('^' + TextFormatting.escapeRegex(this.formattingOptions.siteURL) + '\\/(?:signup_user_complete|[^\\/]+\\/(?:pl|channels))\\/');
-
- internalLink = pattern.test(outHref);
- }
-
- if (internalLink) {
- output += ' data-link="' + outHref.substring(this.formattingOptions.siteURL) + '"';
- } else {
- output += ' target="_blank"';
- }
-
- if (title) {
- output += ' title="' + title + '"';
- }
-
- // remove any links added to the text by hashtag or mention parsing since they'll break this link
- output += '>' + text.replace(/<\/?a[^>]*>/g, '') + '</a>';
-
- return output;
- }
-
- paragraph(text) {
- if (this.formattingOptions.singleline) {
- return `<p class="markdown__paragraph-inline">${text}</p>`;
- }
-
- return super.paragraph(text);
- }
-
- table(header, body) {
- return `<div class="table-responsive"><table class="markdown__table"><thead>${header}</thead><tbody>${body}</tbody></table></div>`;
- }
-
- listitem(text, bullet) {
- const taskListReg = /^\[([ |xX])] /;
- const isTaskList = taskListReg.exec(text);
-
- if (isTaskList) {
- return `<li class="list-item--task-list">${'<input type="checkbox" disabled="disabled" ' + (isTaskList[1] === ' ' ? '' : 'checked="checked" ') + '/> '}${text.replace(taskListReg, '')}</li>`;
- }
-
- if (/^\d+.$/.test(bullet)) {
- // this is a numbered list item so override the numbering
- return `<li value="${parseInt(bullet, 10)}">${text}</li>`;
- }
-
- return `<li>${text}</li>`;
- }
-
- text(txt) {
- return TextFormatting.doFormatText(txt, this.formattingOptions);
- }
-}
-
-export function format(text, options = {}) {
- const markdownOptions = {
- renderer: new MattermostMarkdownRenderer(null, options),
- sanitize: true,
- gfm: true,
- tables: true,
- mangle: false
- };
-
- return marked(text, markdownOptions);
-}
-
-// Marked helper functions that should probably just be exported
-
-function unescape(html) {
- return html.replace(/&([#\w]+);/g, (_, m) => {
- const n = m.toLowerCase();
- if (n === 'colon') {
- return ':';
- } else if (n.charAt(0) === '#') {
- return n.charAt(1) === 'x' ?
- String.fromCharCode(parseInt(n.substring(2), 16)) :
- String.fromCharCode(Number(n.substring(1)));
- }
- return '';
- });
-}
diff --git a/webapp/utils/post_utils.jsx b/webapp/utils/post_utils.jsx
deleted file mode 100644
index 670dfbaaf..000000000
--- a/webapp/utils/post_utils.jsx
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-import Constants from 'utils/constants.jsx';
-import * as Utils from 'utils/utils.jsx';
-
-import TeamStore from 'stores/team_store.jsx';
-import UserStore from 'stores/user_store.jsx';
-import ChannelStore from 'stores/channel_store.jsx';
-
-export function isSystemMessage(post) {
- return Boolean(post.type && (post.type.lastIndexOf(Constants.SYSTEM_MESSAGE_PREFIX) === 0));
-}
-
-export function isFromWebhook(post) {
- return post.props && post.props.from_webhook === 'true';
-}
-
-export function isPostOwner(post) {
- return UserStore.getCurrentId() === post.user_id;
-}
-
-export function isComment(post) {
- if ('root_id' in post) {
- return post.root_id !== '' && post.root_id != null;
- }
- return false;
-}
-
-export function isEdited(post) {
- return post.edit_at > 0;
-}
-
-export function getProfilePicSrcForPost(post, user) {
- let src = '';
- if (user && user.id === post.user_id) {
- src = Utils.imageURLForUser(user);
- } else {
- src = Utils.imageURLForUser(post.user_id);
- }
-
- if (post.props && post.props.from_webhook && !post.props.use_user_icon && global.window.mm_config.EnablePostIconOverride === 'true') {
- if (post.props.override_icon_url) {
- src = post.props.override_icon_url;
- } else {
- src = Constants.DEFAULT_WEBHOOK_LOGO;
- }
- } else if (isSystemMessage(post)) {
- src = Constants.SYSTEM_MESSAGE_PROFILE_IMAGE;
- }
-
- return src;
-}
-
-export function canDeletePost(post) {
- const isOwner = isPostOwner(post);
- const isSystemAdmin = UserStore.isSystemAdminForCurrentUser();
- const isTeamAdmin = TeamStore.isTeamAdminForCurrentTeam() || isSystemAdmin;
- const isChannelAdmin = ChannelStore.isChannelAdminForCurrentChannel() || isTeamAdmin;
- const isAdmin = isChannelAdmin || isTeamAdmin || isSystemAdmin;
-
- if (global.window.mm_license.IsLicensed === 'true') {
- return (global.window.mm_config.RestrictPostDelete === Constants.PERMISSIONS_DELETE_POST_ALL && (isOwner || isChannelAdmin)) ||
- (global.window.mm_config.RestrictPostDelete === Constants.PERMISSIONS_DELETE_POST_TEAM_ADMIN && isTeamAdmin) ||
- (global.window.mm_config.RestrictPostDelete === Constants.PERMISSIONS_DELETE_POST_SYSTEM_ADMIN && isSystemAdmin);
- }
-
- return isOwner || isAdmin;
-}
-
-export function canEditPost(post, editDisableAction) {
- const isOwner = isPostOwner(post);
- let canEdit = isOwner && !isSystemMessage(post);
-
- if (canEdit && global.window.mm_license.IsLicensed === 'true') {
- if (global.window.mm_config.AllowEditPost === Constants.ALLOW_EDIT_POST_NEVER) {
- canEdit = false;
- } else if (global.window.mm_config.AllowEditPost === Constants.ALLOW_EDIT_POST_TIME_LIMIT) {
- const timeLeft = (post.create_at + (global.window.mm_config.PostEditTimeLimit * 1000)) - Utils.getTimestamp();
- if (timeLeft > 0) {
- editDisableAction.fireAfter(timeLeft + 1000);
- } else {
- canEdit = false;
- }
- }
- }
- return canEdit;
-}
-
-export function shouldShowDotMenu(post) {
- if (Utils.isMobile()) {
- return true;
- }
-
- if (!isSystemMessage(post)) {
- return true;
- }
-
- if (canDeletePost(post)) {
- return true;
- }
-
- if (canEditPost(post)) {
- return true;
- }
-
- return false;
-}
-
-export function containsAtMention(text, key) {
- if (!text || !key) {
- return false;
- }
-
- // This doesn't work for at mentions containing periods or hyphens
- return new RegExp(`\\B${key}\\b`, 'i').test(removeCode(text));
-}
-
-// Returns a given text string with all Markdown code replaced with whitespace.
-export function removeCode(text) {
- // These patterns should match the ones in app/notification.go, except JavaScript doesn't
- // support \z for the end of the text in multiline mode, so we use $(?![\r\n])
- const codeBlockPattern = /^[^\S\n]*[`~]{3}.*$[\s\S]+?(^[^\S\n]*[`~]{3}$|$(?![\r\n]))/m;
- const inlineCodePattern = /`+(?:.+?|.*?\n(.*?\S.*?\n)*.*?)`+/m;
-
- return text.replace(codeBlockPattern, '').replace(inlineCodePattern, ' ');
-}
diff --git a/webapp/utils/syntax_highlighting.jsx b/webapp/utils/syntax_highlighting.jsx
deleted file mode 100644
index 0fb10638f..000000000
--- a/webapp/utils/syntax_highlighting.jsx
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-import * as TextFormatting from './text_formatting.jsx';
-import Constants from './constants.jsx';
-
-import hlJS from 'highlight.js/lib/highlight.js';
-
-import hljsActionscript from 'highlight.js/lib/languages/actionscript.js';
-import hljsApplescript from 'highlight.js/lib/languages/applescript.js';
-import hljsBash from 'highlight.js/lib/languages/bash.js';
-import hljsClojure from 'highlight.js/lib/languages/clojure.js';
-import hljsCoffeescript from 'highlight.js/lib/languages/coffeescript.js';
-import hljsCpp from 'highlight.js/lib/languages/cpp.js';
-import hljsCs from 'highlight.js/lib/languages/cs.js';
-import hljsCss from 'highlight.js/lib/languages/css.js';
-import hljsD from 'highlight.js/lib/languages/d.js';
-import hljsDart from 'highlight.js/lib/languages/dart.js';
-import hljsDelphi from 'highlight.js/lib/languages/delphi.js';
-import hljsDiff from 'highlight.js/lib/languages/diff.js';
-import hljsDjango from 'highlight.js/lib/languages/django.js';
-import hljsDockerfile from 'highlight.js/lib/languages/dockerfile.js';
-import hljsErlang from 'highlight.js/lib/languages/erlang.js';
-import hljsFortran from 'highlight.js/lib/languages/fortran.js';
-import hljsFsharp from 'highlight.js/lib/languages/fsharp.js';
-import hljsGcode from 'highlight.js/lib/languages/gcode.js';
-import hljsGo from 'highlight.js/lib/languages/go.js';
-import hljsGroovy from 'highlight.js/lib/languages/groovy.js';
-import hljsHandlebars from 'highlight.js/lib/languages/handlebars.js';
-import hljsHaskell from 'highlight.js/lib/languages/haskell.js';
-import hljsHaxe from 'highlight.js/lib/languages/haxe.js';
-import hljsJava from 'highlight.js/lib/languages/java.js';
-import hljsJavascript from 'highlight.js/lib/languages/javascript.js';
-import hljsJson from 'highlight.js/lib/languages/json.js';
-import hljsJulia from 'highlight.js/lib/languages/julia.js';
-import hljsKotlin from 'highlight.js/lib/languages/kotlin.js';
-import hljsLess from 'highlight.js/lib/languages/less.js';
-import hljsLisp from 'highlight.js/lib/languages/lisp.js';
-import hljsLua from 'highlight.js/lib/languages/lua.js';
-import hljsMakefile from 'highlight.js/lib/languages/makefile.js';
-import hljsMarkdown from 'highlight.js/lib/languages/markdown.js';
-import hljsMatlab from 'highlight.js/lib/languages/matlab.js';
-import hljsObjectivec from 'highlight.js/lib/languages/objectivec.js';
-import hljsOcaml from 'highlight.js/lib/languages/ocaml.js';
-import hljsPerl from 'highlight.js/lib/languages/perl.js';
-import hljsPhp from 'highlight.js/lib/languages/php.js';
-import hljsPowershell from 'highlight.js/lib/languages/powershell.js';
-import hljsPuppet from 'highlight.js/lib/languages/puppet.js';
-import hljsPython from 'highlight.js/lib/languages/python.js';
-import hljsR from 'highlight.js/lib/languages/r.js';
-import hljsRuby from 'highlight.js/lib/languages/ruby.js';
-import hljsRust from 'highlight.js/lib/languages/rust.js';
-import hljsScala from 'highlight.js/lib/languages/scala.js';
-import hljsScheme from 'highlight.js/lib/languages/scheme.js';
-import hljsScss from 'highlight.js/lib/languages/scss.js';
-import hljsSmalltalk from 'highlight.js/lib/languages/smalltalk.js';
-import hljsSql from 'highlight.js/lib/languages/sql.js';
-import hljsSwift from 'highlight.js/lib/languages/swift.js';
-import hljsTex from 'highlight.js/lib/languages/tex.js';
-import hljsVbnet from 'highlight.js/lib/languages/vbnet.js';
-import hljsVbscript from 'highlight.js/lib/languages/vbscript.js';
-import hljsVerilog from 'highlight.js/lib/languages/verilog.js';
-import hljsXml from 'highlight.js/lib/languages/xml.js';
-import hljsYaml from 'highlight.js/lib/languages/yaml.js';
-
-hlJS.registerLanguage('actionscript', hljsActionscript);
-hlJS.registerLanguage('applescript', hljsApplescript);
-hlJS.registerLanguage('bash', hljsBash);
-hlJS.registerLanguage('clojure', hljsClojure);
-hlJS.registerLanguage('coffeescript', hljsCoffeescript);
-hlJS.registerLanguage('cpp', hljsCpp);
-hlJS.registerLanguage('cs', hljsCs);
-hlJS.registerLanguage('css', hljsCss);
-hlJS.registerLanguage('d', hljsD);
-hlJS.registerLanguage('dart', hljsDart);
-hlJS.registerLanguage('delphi', hljsDelphi);
-hlJS.registerLanguage('diff', hljsDiff);
-hlJS.registerLanguage('django', hljsDjango);
-hlJS.registerLanguage('dockerfile', hljsDockerfile);
-hlJS.registerLanguage('erlang', hljsErlang);
-hlJS.registerLanguage('fortran', hljsFortran);
-hlJS.registerLanguage('fsharp', hljsFsharp);
-hlJS.registerLanguage('gcode', hljsGcode);
-hlJS.registerLanguage('go', hljsGo);
-hlJS.registerLanguage('groovy', hljsGroovy);
-hlJS.registerLanguage('handlebars', hljsHandlebars);
-hlJS.registerLanguage('haskell', hljsHaskell);
-hlJS.registerLanguage('haxe', hljsHaxe);
-hlJS.registerLanguage('java', hljsJava);
-hlJS.registerLanguage('javascript', hljsJavascript);
-hlJS.registerLanguage('json', hljsJson);
-hlJS.registerLanguage('julia', hljsJulia);
-hlJS.registerLanguage('kotlin', hljsKotlin);
-hlJS.registerLanguage('less', hljsLess);
-hlJS.registerLanguage('lisp', hljsLisp);
-hlJS.registerLanguage('lua', hljsLua);
-hlJS.registerLanguage('makefile', hljsMakefile);
-hlJS.registerLanguage('markdown', hljsMarkdown);
-hlJS.registerLanguage('matlab', hljsMatlab);
-hlJS.registerLanguage('objectivec', hljsObjectivec);
-hlJS.registerLanguage('ocaml', hljsOcaml);
-hlJS.registerLanguage('perl', hljsPerl);
-hlJS.registerLanguage('php', hljsPhp);
-hlJS.registerLanguage('powershell', hljsPowershell);
-hlJS.registerLanguage('puppet', hljsPuppet);
-hlJS.registerLanguage('python', hljsPython);
-hlJS.registerLanguage('r', hljsR);
-hlJS.registerLanguage('ruby', hljsRuby);
-hlJS.registerLanguage('rust', hljsRust);
-hlJS.registerLanguage('scala', hljsScala);
-hlJS.registerLanguage('scheme', hljsScheme);
-hlJS.registerLanguage('scss', hljsScss);
-hlJS.registerLanguage('smalltalk', hljsSmalltalk);
-hlJS.registerLanguage('sql', hljsSql);
-hlJS.registerLanguage('swift', hljsSwift);
-hlJS.registerLanguage('tex', hljsTex);
-hlJS.registerLanguage('vbnet', hljsVbnet);
-hlJS.registerLanguage('vbscript', hljsVbscript);
-hlJS.registerLanguage('verilog', hljsVerilog);
-hlJS.registerLanguage('xml', hljsXml);
-hlJS.registerLanguage('yaml', hljsYaml);
-
-const HighlightedLanguages = Constants.HighlightedLanguages;
-
-export function highlight(lang, code) {
- const language = getLanguageFromNameOrAlias(lang);
-
- if (language) {
- try {
- return hlJS.highlight(language, code).value;
- } catch (e) {
- // fall through if highlighting fails and handle below
- }
- }
-
- return TextFormatting.sanitizeHtml(code);
-}
-
-export function getLanguageFromFileExtension(extension) {
- for (var key in HighlightedLanguages) {
- if (HighlightedLanguages[key].extensions.find((x) => x === extension)) {
- return key;
- }
- }
-
- return null;
-}
-
-export function canHighlight(language) {
- return Boolean(getLanguageFromNameOrAlias(language));
-}
-
-export function getLanguageName(language) {
- if (canHighlight(language)) {
- return HighlightedLanguages[getLanguageFromNameOrAlias(language)].name;
- }
-
- return '';
-}
-
-function getLanguageFromNameOrAlias(name) {
- const langName = name.toLowerCase();
- if (HighlightedLanguages[langName]) {
- return langName;
- }
-
- return Object.keys(HighlightedLanguages).find((key) => {
- const aliases = HighlightedLanguages[key].aliases;
- return aliases && aliases.find((a) => a === langName);
- });
-}
diff --git a/webapp/utils/team_utils.jsx b/webapp/utils/team_utils.jsx
deleted file mode 100644
index 7cd788388..000000000
--- a/webapp/utils/team_utils.jsx
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-import LocalizationStore from 'stores/localization_store.jsx';
-
-export function convertTeamMapToList(teamMap) {
- const teams = [];
-
- for (const id in teamMap) {
- if (teamMap.hasOwnProperty(id)) {
- teams.push(teamMap[id]);
- }
- }
-
- return teams.sort(sortTeamsByDisplayName);
-}
-
-// Use when sorting multiple teams by their `display_name` field
-export function sortTeamsByDisplayName(a, b) {
- const locale = LocalizationStore.getLocale();
-
- if (a.display_name !== b.display_name) {
- return a.display_name.localeCompare(b.display_name, locale, {numeric: true});
- }
-
- return a.name.localeCompare(b.name, locale, {numeric: true});
-}
diff --git a/webapp/utils/text_formatting.jsx b/webapp/utils/text_formatting.jsx
deleted file mode 100644
index e34b8fdbb..000000000
--- a/webapp/utils/text_formatting.jsx
+++ /dev/null
@@ -1,504 +0,0 @@
-// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-import Autolinker from 'autolinker';
-import Constants from './constants.jsx';
-import EmojiStore from 'stores/emoji_store.jsx';
-import * as Emoticons from './emoticons.jsx';
-import * as Markdown from './markdown.jsx';
-import twemoji from 'twemoji';
-import XRegExp from 'xregexp';
-
-const punctuation = XRegExp.cache('[^\\pL\\d]');
-
-// pattern to detect the existance of a Chinese, Japanese, or Korean character in a string
-// http://stackoverflow.com/questions/15033196/using-javascript-to-check-whether-a-string-contains-japanese-characters-includi
-const cjkPattern = /[\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf\uac00-\ud7a3]/;
-
-// Performs formatting of user posts including highlighting mentions and search terms and converting urls, hashtags,
-// @mentions and ~channels to links by taking a user's message and returning a string of formatted html. Also takes
-// a number of options as part of the second parameter:
-// - searchTerm - If specified, this word is highlighted in the resulting html. Defaults to nothing.
-// - mentionHighlight - Specifies whether or not to highlight mentions of the current user. Defaults to true.
-// - mentionKeys - A list of mention keys for the current user to highlight.
-// - singleline - Specifies whether or not to remove newlines. Defaults to false.
-// - emoticons - Enables emoticon parsing. Defaults to true.
-// - markdown - Enables markdown parsing. Defaults to true.
-// - siteURL - The origin of this Mattermost instance. If provided, links to channels and posts will be replaced with internal
-// links that can be handled by a special click handler.
-// - atMentions - Whether or not to render at mentions into spans with a data-mention attribute. Defaults to false.
-// - channelNamesMap - An object mapping channel display names to channels. If provided, ~channel mentions will be replaced with
-// links to the relevant channel.
-// - team - The current team.
-export function formatText(text, inputOptions) {
- if (!text || typeof text !== 'string') {
- return '';
- }
-
- let output = text;
-
- const options = Object.assign({}, inputOptions);
- options.searchPatterns = parseSearchTerms(options.searchTerm).map(convertSearchTermToRegex);
-
- if (!('markdown' in options) || options.markdown) {
- // the markdown renderer will call doFormatText as necessary
- output = Markdown.format(output, options);
- } else {
- output = sanitizeHtml(output);
- output = doFormatText(output, options);
- }
-
- // replace newlines with spaces if necessary
- if (options.singleline) {
- output = replaceNewlines(output);
- }
-
- return output;
-}
-
-// Performs most of the actual formatting work for formatText. Not intended to be called normally.
-export function doFormatText(text, options) {
- let output = text;
-
- const tokens = new Map();
-
- // replace important words and phrases with tokens
- if (options.atMentions) {
- output = autolinkAtMentions(output, tokens);
- }
-
- if (options.channelNamesMap) {
- output = autolinkChannelMentions(output, tokens, options.channelNamesMap, options.team);
- }
-
- output = autolinkEmails(output, tokens);
- output = autolinkHashtags(output, tokens);
-
- if (!('emoticons' in options) || options.emoticon) {
- output = Emoticons.handleEmoticons(output, tokens, options.emojis || EmojiStore.getEmojis());
- }
-
- if (options.searchPatterns) {
- output = highlightSearchTerms(output, tokens, options.searchPatterns);
- }
-
- if (!('mentionHighlight' in options) || options.mentionHighlight) {
- output = highlightCurrentMentions(output, tokens, options.mentionKeys);
- }
-
- if (!('emoticons' in options) || options.emoticon) {
- output = twemoji.parse(output, {
- className: 'emoticon',
- callback: (icon) => {
- if (!EmojiStore.hasUnicode(icon)) {
- // just leave the unicode characters and hope the browser can handle it
- return null;
- }
-
- return EmojiStore.getEmojiImageUrl(EmojiStore.getUnicode(icon));
- }
- });
- }
-
- // reinsert tokens with formatted versions of the important words and phrases
- output = replaceTokens(output, tokens);
-
- return output;
-}
-
-export function sanitizeHtml(text) {
- let output = text;
-
- // normal string.replace only does a single occurrance so use a regex instead
- output = output.replace(/&/g, '&amp;');
- output = output.replace(/</g, '&lt;');
- output = output.replace(/>/g, '&gt;');
- output = output.replace(/'/g, '&apos;');
- output = output.replace(/"/g, '&quot;');
-
- return output;
-}
-
-// Convert emails into tokens
-function autolinkEmails(text, tokens) {
- function replaceEmailWithToken(match) {
- const linkText = match.getMatchedText();
- let url = linkText;
-
- if (match.getType() === 'email') {
- url = `mailto:${url}`;
- }
-
- const index = tokens.size;
- const alias = `$MM_EMAIL${index}`;
-
- tokens.set(alias, {
- value: `<a class="theme" href="${url}">${linkText}</a>`,
- originalText: linkText
- });
-
- return alias;
- }
-
- // we can't just use a static autolinker because we need to set replaceFn
- const autolinker = new Autolinker({
- urls: false,
- email: true,
- phone: false,
- mention: false,
- hashtag: false,
- replaceFn: replaceEmailWithToken
- });
-
- return autolinker.link(text);
-}
-
-export function autolinkAtMentions(text, tokens) {
- function replaceAtMentionWithToken(fullMatch, username) {
- const index = tokens.size;
- const alias = `$MM_ATMENTION${index}`;
-
- tokens.set(alias, {
- value: `<span data-mention="${username}">@${username}</span>`,
- originalText: fullMatch
- });
-
- return alias;
- }
-
- let output = text;
- output = output.replace(/\B@([a-z0-9.\-_]*)/gi, replaceAtMentionWithToken);
-
- return output;
-}
-
-function autolinkChannelMentions(text, tokens, channelNamesMap, team) {
- function channelMentionExists(c) {
- return Boolean(channelNamesMap[c]);
- }
- function addToken(channelName, mention, displayName) {
- const index = tokens.size;
- const alias = `$MM_CHANNELMENTION${index}`;
- let href = '#';
- if (team) {
- href = '/' + team.name + '/channels/' + channelName;
- }
-
- tokens.set(alias, {
- value: `<a class="mention-link" href="${href}" data-channel-mention="${channelName}">~${displayName}</a>`,
- originalText: mention
- });
- return alias;
- }
-
- function replaceChannelMentionWithToken(fullMatch, spacer, mention, channelName) {
- let channelNameLower = channelName.toLowerCase();
-
- if (channelMentionExists(channelNameLower)) {
- // Exact match
- const alias = addToken(channelNameLower, mention, escapeHtml(channelNamesMap[channelNameLower].display_name));
- return spacer + alias;
- }
-
- // Not an exact match, attempt to truncate any punctuation to see if we can find a channel
- const originalChannelName = channelNameLower;
-
- for (let c = channelNameLower.length; c > 0; c--) {
- if (punctuation.test(channelNameLower[c - 1])) {
- channelNameLower = channelNameLower.substring(0, c - 1);
-
- if (channelMentionExists(channelNameLower)) {
- const suffix = originalChannelName.substr(c - 1);
- const alias = addToken(channelNameLower, '~' + channelNameLower,
- escapeHtml(channelNamesMap[channelNameLower].display_name));
- return spacer + alias + suffix;
- }
- } else {
- // If the last character is not punctuation, no point in going any further
- break;
- }
- }
-
- return fullMatch;
- }
-
- let output = text;
- output = output.replace(/(^|\s)(~([a-z0-9.\-_]*))/gi, replaceChannelMentionWithToken);
-
- return output;
-}
-
-export function escapeRegex(text) {
- return text.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
-}
-
-const htmlEntities = {
- '&': '&amp;',
- '<': '&lt;',
- '>': '&gt;',
- '"': '&quot;',
- "'": '&#039;'
-};
-
-export function escapeHtml(text) {
- return text.replace(/[&<>"']/g, (match) => htmlEntities[match]);
-}
-
-function highlightCurrentMentions(text, tokens, mentionKeys = []) {
- let output = text;
-
- // look for any existing tokens which are self mentions and should be highlighted
- var newTokens = new Map();
- for (const [alias, token] of tokens) {
- if (mentionKeys.indexOf(token.originalText) !== -1) {
- const index = tokens.size + newTokens.size;
- const newAlias = `$MM_SELFMENTION${index}`;
-
- newTokens.set(newAlias, {
- value: `<span class='mention--highlight'>${alias}</span>`,
- originalText: token.originalText
- });
- output = output.replace(alias, newAlias);
- }
- }
-
- // the new tokens are stashed in a separate map since we can't add objects to a map during iteration
- for (const newToken of newTokens) {
- tokens.set(newToken[0], newToken[1]);
- }
-
- // look for self mentions in the text
- function replaceCurrentMentionWithToken(fullMatch, prefix, mention) {
- const index = tokens.size;
- const alias = `$MM_SELFMENTION${index}`;
-
- tokens.set(alias, {
- value: `<span class='mention--highlight'>${mention}</span>`,
- originalText: mention
- });
-
- return prefix + alias;
- }
-
- for (const mention of mentionKeys) {
- if (!mention) {
- continue;
- }
-
- output = output.replace(new RegExp(`(^|\\W)(${escapeRegex(mention)})\\b`, 'gi'), replaceCurrentMentionWithToken);
- }
-
- return output;
-}
-
-function autolinkHashtags(text, tokens) {
- let output = text;
-
- var newTokens = new Map();
- for (const [alias, token] of tokens) {
- if (token.originalText.lastIndexOf('#', 0) === 0) {
- const index = tokens.size + newTokens.size;
- const newAlias = `$MM_HASHTAG${index}`;
-
- newTokens.set(newAlias, {
- value: `<a class='mention-link' href='#' data-hashtag='${token.originalText}'>${token.originalText}</a>`,
- originalText: token.originalText,
- hashtag: token.originalText.substring(1)
- });
-
- output = output.replace(alias, newAlias);
- }
- }
-
- // the new tokens are stashed in a separate map since we can't add objects to a map during iteration
- for (const newToken of newTokens) {
- tokens.set(newToken[0], newToken[1]);
- }
-
- // look for hashtags in the text
- function replaceHashtagWithToken(fullMatch, prefix, originalText) {
- const index = tokens.size;
- const alias = `$MM_HASHTAG${index}`;
-
- if (text.length < Constants.MIN_HASHTAG_LINK_LENGTH + 1) {
- // too short to be a hashtag
- return fullMatch;
- }
-
- tokens.set(alias, {
- value: `<a class='mention-link' href='#' data-hashtag='${originalText}'>${originalText}</a>`,
- originalText,
- hashtag: originalText.substring(1)
- });
-
- return prefix + alias;
- }
-
- return output.replace(XRegExp.cache('(^|\\W)(#\\pL[\\pL\\d\\-_.]*[\\pL\\d])', 'g'), replaceHashtagWithToken);
-}
-
-const puncStart = XRegExp.cache('^[^\\pL\\d\\s#]+');
-const puncEnd = XRegExp.cache('[^\\pL\\d\\s]+$');
-
-function parseSearchTerms(searchTerm) {
- let terms = [];
-
- let termString = searchTerm;
-
- while (termString) {
- let captured;
-
- // check for a quoted string
- captured = (/^"(.*?)"/).exec(termString);
- if (captured) {
- termString = termString.substring(captured[0].length);
- terms.push(captured[1]);
- continue;
- }
-
- // check for a search flag (and don't add it to terms)
- captured = (/^(?:in|from|channel): ?\S+/).exec(termString);
- if (captured) {
- termString = termString.substring(captured[0].length);
- continue;
- }
-
- // capture at mentions differently from the server so we can highlight them with the preceeding at sign
- captured = (/^@\w+\b/).exec(termString);
- if (captured) {
- termString = termString.substring(captured[0].length);
-
- terms.push(captured[0]);
- continue;
- }
-
- // capture any plain text up until the next quote or search flag
- captured = (/^.+?(?=\bin:|\bfrom:|\bchannel:|"|$)/).exec(termString);
- if (captured) {
- termString = termString.substring(captured[0].length);
-
- // break the text up into words based on how the server splits them in SqlPostStore.SearchPosts and then discard empty terms
- terms.push(...captured[0].split(/[ <>+()~@]/).filter((term) => Boolean(term)));
- continue;
- }
-
- // we should never reach this point since at least one of the regexes should match something in the remaining text
- throw new Error('Infinite loop in search term parsing: "' + termString + '"');
- }
-
- // remove punctuation from each term
- terms = terms.map((term) => {
- term.replace(puncStart, '');
- if (term.charAt(term.length - 1) !== '*') {
- term.replace(puncEnd, '');
- }
- return term;
- });
-
- return terms;
-}
-
-function convertSearchTermToRegex(term) {
- let pattern;
-
- if (cjkPattern.test(term)) {
- // term contains Chinese, Japanese, or Korean characters so don't mark word boundaries
- pattern = '()(' + escapeRegex(term.replace(/\*/g, '')) + ')';
- } else if (term.endsWith('*')) {
- pattern = '\\b()(' + escapeRegex(term.substring(0, term.length - 1)) + ')';
- } else if (term.startsWith('@') || term.startsWith('#')) {
- // needs special handling of the first boundary because a word boundary doesn't work before a symbol
- pattern = '(\\W|^)(' + escapeRegex(term) + ')\\b';
- } else {
- pattern = '\\b()(' + escapeRegex(term) + ')\\b';
- }
-
- return {
- pattern: new RegExp(pattern, 'gi'),
- term
- };
-}
-
-export function highlightSearchTerms(text, tokens, searchPatterns) {
- if (!searchPatterns || searchPatterns.length === 0) {
- return text;
- }
-
- let output = text;
-
- function replaceSearchTermWithToken(match, prefix, word) {
- const index = tokens.size;
- const alias = `$MM_SEARCHTERM${index}`;
-
- tokens.set(alias, {
- value: `<span class='search-highlight'>${word}</span>`,
- originalText: word
- });
-
- return prefix + alias;
- }
-
- for (const pattern of searchPatterns) {
- // highlight existing tokens matching search terms
- var newTokens = new Map();
- for (const [alias, token] of tokens) {
- if (pattern.pattern.test(token.originalText)) {
- // If it's a Hashtag, skip it unless the search term is an exact match.
- let originalText = token.originalText;
- if (originalText.startsWith('#')) {
- originalText = originalText.substr(1);
- }
- let term = pattern.term;
- if (term.startsWith('#')) {
- term = term.substr(1);
- }
-
- if (alias.startsWith('$MM_HASHTAG') && originalText !== term) {
- continue;
- }
-
- const index = tokens.size + newTokens.size;
- const newAlias = `$MM_SEARCHTERM${index}`;
-
- newTokens.set(newAlias, {
- value: `<span class='search-highlight'>${alias}</span>`,
- originalText: token.originalText
- });
-
- output = output.replace(alias, newAlias);
- }
-
- // The pattern regexes are global, so calling pattern.pattern.test() above alters their
- // state. Reset lastIndex to 0 between calls to test() to ensure it returns the
- // same result every time it is called with the same value of token.originalText.
- pattern.pattern.lastIndex = 0;
- }
-
- // the new tokens are stashed in a separate map since we can't add objects to a map during iteration
- for (const newToken of newTokens) {
- tokens.set(newToken[0], newToken[1]);
- }
-
- output = output.replace(pattern.pattern, replaceSearchTermWithToken);
- }
-
- return output;
-}
-
-export function replaceTokens(text, tokens) {
- let output = text;
-
- // iterate backwards through the map so that we do replacement in the opposite order that we added tokens
- const aliases = [...tokens.keys()];
- for (let i = aliases.length - 1; i >= 0; i--) {
- const alias = aliases[i];
- const token = tokens.get(alias);
- output = output.replace(alias, token.value);
- }
-
- return output;
-}
-
-function replaceNewlines(text) {
- return text.replace(/\n/g, ' ');
-}
diff --git a/webapp/utils/url.jsx b/webapp/utils/url.jsx
deleted file mode 100644
index f1edf58c1..000000000
--- a/webapp/utils/url.jsx
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-import {latinise} from 'utils/latinise.jsx';
-
-export function cleanUpUrlable(input) {
- var cleaned = latinise(input);
- cleaned = cleaned.trim().replace(/-/g, ' ').replace(/[^\w\s]/gi, '').toLowerCase().replace(/\s/g, '-');
- cleaned = cleaned.replace(/-{2,}/, '-');
- cleaned = cleaned.replace(/^-+/, '');
- cleaned = cleaned.replace(/-+$/, '');
- return cleaned;
-}
-
-export function getShortenedURL(url = '', getLength = 27) {
- if (url.length > 35) {
- const subLength = getLength - 14;
- return url.substring(0, 10) + '...' + url.substring(url.length - subLength, url.length) + '/';
- }
- return url + '/';
-}
-
-export function getSiteURL() {
- if (window.location.origin) {
- return window.location.origin;
- }
-
- return window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : '');
-}
diff --git a/webapp/utils/user_agent.jsx b/webapp/utils/user_agent.jsx
deleted file mode 100644
index c16d61d45..000000000
--- a/webapp/utils/user_agent.jsx
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-/*
-Example User Agents
---------------------
-
-Chrome:
- Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
-
-Firefox:
- Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0
-
-IE11:
- Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
-
-Edge:
- Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586
-
-Desktop App:
- Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Mattermost/1.2.1 Chrome/49.0.2623.75 Electron/0.37.8 Safari/537.36
- Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586
- Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Mattermost/3.4.1 Chrome/53.0.2785.113 Electron/1.4.2 Safari/537.36
- Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Mattermost/3.4.1 Chrome/51.0.2704.106 Electron/1.2.8 Safari/537.36
-
-Android Chrome:
- Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19
-
-Android App:
- Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Build/KLP) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30
- Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/_BuildID_) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36
- Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36
-
-iOS Safari:
- Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543 Safari/419.3
-
-iOS Android:
- Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3
-
-iOS App:
- Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69
-*/
-
-const userAgent = window.navigator.userAgent;
-
-export function isChrome() {
- return userAgent.indexOf('Chrome') > -1;
-}
-
-export function isSafari() {
- return userAgent.indexOf('Safari') !== -1 && userAgent.indexOf('Chrome') === -1;
-}
-
-export function isIosSafari() {
- return userAgent.indexOf('iPhone') !== -1 && userAgent.indexOf('Safari') !== -1 && navigator.userAgent.indexOf('CriOS') === -1;
-}
-
-export function isIosChrome() {
- return userAgent.indexOf('CriOS') !== -1;
-}
-
-export function isIosWeb() {
- return isIosSafari() || isIosChrome();
-}
-
-export function isIos() {
- return userAgent.indexOf('iPhone') !== -1 || userAgent.indexOf('iPad') !== -1;
-}
-
-export function isAndroid() {
- return userAgent.indexOf('Android') !== -1;
-}
-
-export function isAndroidChrome() {
- return userAgent.indexOf('Android') !== -1 && userAgent.indexOf('Chrome') !== -1 && userAgent.indexOf('Version') === -1;
-}
-
-export function isAndroidWeb() {
- return isAndroidChrome();
-}
-
-// Returns true if and only if the user is using a Mattermost mobile app. This will return false if the user is using the
-// web browser on a mobile device.
-export function isMobileApp() {
- return isMobile() && !isIosWeb() && !isAndroidWeb();
-}
-
-// Returns true if and only if the user is using Mattermost from either the mobile app or the web browser on a mobile device.
-export function isMobile() {
- return isIos() || isAndroid();
-}
-
-export function isFirefox() {
- return userAgent.indexOf('Firefox') !== -1;
-}
-
-export function isInternetExplorer() {
- return userAgent.indexOf('Trident') !== -1;
-}
-
-export function isEdge() {
- return userAgent.indexOf('Edge') !== -1;
-}
-
-export function isDesktopApp() {
- return userAgent.indexOf('Mattermost') !== -1 && userAgent.indexOf('Electron') !== -1;
-}
-
-export function isWindowsApp() {
- return isDesktopApp() && userAgent.indexOf('Windows') !== -1;
-}
-
-export function isMacApp() {
- return isDesktopApp() && userAgent.indexOf('Macintosh') !== -1;
-}
diff --git a/webapp/utils/utils.jsx b/webapp/utils/utils.jsx
deleted file mode 100644
index 9bfd22e07..000000000
--- a/webapp/utils/utils.jsx
+++ /dev/null
@@ -1,1441 +0,0 @@
-// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
-// See License.txt for license information.
-
-import $ from 'jquery';
-import AppDispatcher from '../dispatcher/app_dispatcher.jsx';
-import ChannelStore from 'stores/channel_store.jsx';
-import UserStore from 'stores/user_store.jsx';
-import LocalizationStore from 'stores/localization_store.jsx';
-import PreferenceStore from 'stores/preference_store.jsx';
-import TeamStore from 'stores/team_store.jsx';
-import Constants from 'utils/constants.jsx';
-var ActionTypes = Constants.ActionTypes;
-import * as UserAgent from 'utils/user_agent.jsx';
-import {Posts} from 'mattermost-redux/constants';
-import {Client4} from 'mattermost-redux/client';
-
-import {browserHistory} from 'react-router/es6';
-import {FormattedMessage} from 'react-intl';
-
-import icon50 from 'images/icon50x50.png';
-import bing from 'images/bing.mp3';
-
-import React from 'react';
-
-export function isEmail(email) {
- // writing a regex to match all valid email addresses is really, really hard (see http://stackoverflow.com/a/201378)
- // so we just do a simple check and rely on a verification email to tell if it's a real address
- return (/^.+@.+$/).test(email);
-}
-
-export function isMac() {
- return navigator.platform.toUpperCase().indexOf('MAC') >= 0;
-}
-
-export function createSafeId(prop) {
- if (prop === null) {
- return null;
- }
-
- var str = '';
-
- if (prop.props && prop.props.defaultMessage) {
- str = prop.props.defaultMessage;
- } else {
- str = prop.toString();
- }
-
- return str.replace(new RegExp(' ', 'g'), '_');
-}
-
-export function cmdOrCtrlPressed(e, allowAlt = false) {
- if (allowAlt) {
- return (isMac() && e.metaKey) || (!isMac() && e.ctrlKey);
- }
- return (isMac() && e.metaKey) || (!isMac() && e.ctrlKey && !e.altKey);
-}
-
-export function isInRole(roles, inRole) {
- var parts = roles.split(' ');
- for (var i = 0; i < parts.length; i++) {
- if (parts[i] === inRole) {
- return true;
- }
- }
-
- return false;
-}
-
-export function isChannelAdmin(roles) {
- if (global.mm_license.IsLicensed !== 'true') {
- return false;
- }
-
- if (isInRole(roles, 'channel_admin')) {
- return true;
- }
-
- return false;
-}
-
-export function isAdmin(roles) {
- if (isInRole(roles, 'team_admin')) {
- return true;
- }
-
- if (isInRole(roles, 'system_admin')) {
- return true;
- }
-
- return false;
-}
-
-export function isSystemAdmin(roles) {
- if (isInRole(roles, 'system_admin')) {
- return true;
- }
-
- return false;
-}
-
-export function getCookie(name) {
- var value = '; ' + document.cookie;
- var parts = value.split('; ' + name + '=');
- if (parts.length === 2) {
- return parts.pop().split(';').shift();
- }
- return '';
-}
-
-var requestedNotificationPermission = false;
-
-export function notifyMe(title, body, channel, teamId, duration, silent) {
- if (!('Notification' in window)) {
- return;
- }
-
- let notificationDuration = Constants.DEFAULT_NOTIFICATION_DURATION;
- if (duration != null) {
- notificationDuration = duration;
- }
-
- if (Notification.permission === 'granted' || (Notification.permission === 'default' && !requestedNotificationPermission)) {
- requestedNotificationPermission = true;
-
- if (typeof Notification.requestPermission === 'function') {
- Notification.requestPermission((permission) => {
- if (permission === 'granted') {
- try {
- var notification = new Notification(title, {body, tag: body, icon: icon50, requireInteraction: notificationDuration === 0, silent});
- notification.onclick = () => {
- window.focus();
- if (channel && (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL)) {
- browserHistory.push(TeamStore.getCurrentTeamUrl() + '/channels/' + channel.name);
- } else if (channel) {
- browserHistory.push(TeamStore.getTeamUrl(teamId) + '/channels/' + channel.name);
- } else if (teamId) {
- browserHistory.push(TeamStore.getTeamUrl(teamId) + '/channels/town-square');
- } else {
- browserHistory.push(TeamStore.getCurrentTeamUrl() + '/channels/town-square');
- }
- };
-
- if (notificationDuration > 0) {
- setTimeout(() => {
- notification.close();
- }, notificationDuration);
- }
- } catch (e) {
- console.error(e); //eslint-disable-line no-console
- }
- }
- });
- }
- }
-}
-
-var canDing = true;
-
-export function ding() {
- if (hasSoundOptions() && canDing) {
- var audio = new Audio(bing);
- audio.play();
- canDing = false;
- setTimeout(() => {
- canDing = true;
- }, 3000);
- }
-}
-
-export function hasSoundOptions() {
- return (!(UserAgent.isFirefox()) && !(UserAgent.isEdge()));
-}
-
-export function getDateForUnixTicks(ticks) {
- return new Date(ticks);
-}
-
-export function displayDate(ticks) {
- var d = new Date(ticks);
- var monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
-
- return monthNames[d.getMonth()] + ' ' + d.getDate() + ', ' + d.getFullYear();
-}
-
-export function displayTime(ticks, utc) {
- const d = new Date(ticks);
- let hours;
- let minutes;
- let ampm = '';
- let timezone = '';
-
- if (utc) {
- hours = d.getUTCHours();
- minutes = d.getUTCMinutes();
- timezone = ' UTC';
- } else {
- hours = d.getHours();
- minutes = d.getMinutes();
- }
-
- if (minutes <= 9) {
- minutes = '0' + minutes;
- }
-
- const useMilitaryTime = PreferenceStore.getBool(Constants.Preferences.CATEGORY_DISPLAY_SETTINGS, 'use_military_time');
- if (!useMilitaryTime) {
- ampm = ' AM';
- if (hours >= 12) {
- ampm = ' PM';
- }
-
- hours %= 12;
- if (!hours) {
- hours = '12';
- }
- }
-
- return hours + ':' + minutes + ampm + timezone;
-}
-
-// returns Unix timestamp in milliseconds
-export function getTimestamp() {
- return Date.now();
-}
-
-// extracts links not styled by Markdown
-export function extractFirstLink(text) {
- const pattern = /(^|[\s\n]|<br\/?>)((?:https?|ftp):\/\/[-A-Z0-9+\u0026\u2019@#/%?=()~_|!:,.;]*[-A-Z0-9+\u0026@#/%=~()_|])/i;
- let inText = text;
-
- // strip out code blocks
- inText = inText.replace(/`[^`]*`/g, '');
-
- // strip out inline markdown images
- inText = inText.replace(/!\[[^\]]*]\([^)]*\)/g, '');
-
- const match = pattern.exec(inText);
- if (match) {
- return match[0].trim();
- }
-
- return '';
-}
-
-// Taken from http://stackoverflow.com/questions/1068834/object-comparison-in-javascript and modified slightly
-export function areObjectsEqual(x, y) {
- let p;
- const leftChain = [];
- const rightChain = [];
-
- // Remember that NaN === NaN returns false
- // and isNaN(undefined) returns true
- if (isNaN(x) && isNaN(y) && typeof x === 'number' && typeof y === 'number') {
- return true;
- }
-
- // Compare primitives and functions.
- // Check if both arguments link to the same object.
- // Especially useful on step when comparing prototypes
- if (x === y) {
- return true;
- }
-
- // Works in case when functions are created in constructor.
- // Comparing dates is a common scenario. Another built-ins?
- // We can even handle functions passed across iframes
- if ((typeof x === 'function' && typeof y === 'function') ||
- (x instanceof Date && y instanceof Date) ||
- (x instanceof RegExp && y instanceof RegExp) ||
- (x instanceof String && y instanceof String) ||
- (x instanceof Number && y instanceof Number)) {
- return x.toString() === y.toString();
- }
-
- if (x instanceof Map && y instanceof Map) {
- return areMapsEqual(x, y);
- }
-
- // At last checking prototypes as good a we can
- if (!(x instanceof Object && y instanceof Object)) {
- return false;
- }
-
- if (x.isPrototypeOf(y) || y.isPrototypeOf(x)) {
- return false;
- }
-
- if (x.constructor !== y.constructor) {
- return false;
- }
-
- if (x.prototype !== y.prototype) {
- return false;
- }
-
- // Check for infinitive linking loops
- if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1) {
- return false;
- }
-
- // Quick checking of one object beeing a subset of another.
- for (p in y) {
- if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
- return false;
- } else if (typeof y[p] !== typeof x[p]) {
- return false;
- }
- }
-
- for (p in x) {
- if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
- return false;
- } else if (typeof y[p] !== typeof x[p]) {
- return false;
- }
-
- switch (typeof (x[p])) {
- case 'object':
- case 'function':
-
- leftChain.push(x);
- rightChain.push(y);
-
- if (!areObjectsEqual(x[p], y[p])) {
- return false;
- }
-
- leftChain.pop();
- rightChain.pop();
- break;
-
- default:
- if (x[p] !== y[p]) {
- return false;
- }
- break;
- }
- }
-
- return true;
-}
-
-export function areMapsEqual(a, b) {
- if (a.size !== b.size) {
- return false;
- }
-
- for (const [key, value] of a) {
- if (!b.has(key)) {
- return false;
- }
-
- if (!areObjectsEqual(value, b.get(key))) {
- return false;
- }
- }
-
- return true;
-}
-
-export function replaceHtmlEntities(text) {
- var tagsToReplace = {
- '&amp;': '&',
- '&lt;': '<',
- '&gt;': '>'
- };
- var newtext = text;
- for (var tag in tagsToReplace) {
- if (Reflect.apply({}.hasOwnProperty, this, [tagsToReplace, tag])) {
- var regex = new RegExp(tag, 'g');
- newtext = newtext.replace(regex, tagsToReplace[tag]);
- }
- }
- return newtext;
-}
-
-export function insertHtmlEntities(text) {
- var tagsToReplace = {
- '&': '&amp;',
- '<': '&lt;',
- '>': '&gt;'
- };
- var newtext = text;
- for (var tag in tagsToReplace) {
- if (Reflect.apply({}.hasOwnProperty, this, [tagsToReplace, tag])) {
- var regex = new RegExp(tag, 'g');
- newtext = newtext.replace(regex, tagsToReplace[tag]);
- }
- }
- return newtext;
-}
-
-export function getFileType(extin) {
- var ext = extin.toLowerCase();
- if (Constants.IMAGE_TYPES.indexOf(ext) > -1) {
- return 'image';
- }
-
- if (Constants.AUDIO_TYPES.indexOf(ext) > -1) {
- return 'audio';
- }
-
- if (Constants.VIDEO_TYPES.indexOf(ext) > -1) {
- return 'video';
- }
-
- if (Constants.SPREADSHEET_TYPES.indexOf(ext) > -1) {
- return 'spreadsheet';
- }
-
- if (Constants.CODE_TYPES.indexOf(ext) > -1) {
- return 'code';
- }
-
- if (Constants.WORD_TYPES.indexOf(ext) > -1) {
- return 'word';
- }
-
- if (Constants.PRESENTATION_TYPES.indexOf(ext) > -1) {
- return 'presentation';
- }
-
- if (Constants.PDF_TYPES.indexOf(ext) > -1) {
- return 'pdf';
- }
-
- if (Constants.PATCH_TYPES.indexOf(ext) > -1) {
- return 'patch';
- }
-
- if (Constants.SVG_TYPES.indexOf(ext) > -1) {
- return 'svg';
- }
-
- return 'other';
-}
-
-export function getFileIconPath(fileInfo) {
- const fileType = getFileType(fileInfo.extension);
-
- var icon;
- if (fileType in Constants.ICON_FROM_TYPE) {
- icon = Constants.ICON_FROM_TYPE[fileType];
- } else {
- icon = Constants.ICON_FROM_TYPE.other;
- }
-
- return icon;
-}
-
-export function getIconClassName(fileTypeIn) {
- var fileType = fileTypeIn.toLowerCase();
-
- if (fileType in Constants.ICON_NAME_FROM_TYPE) {
- return Constants.ICON_NAME_FROM_TYPE[fileType];
- }
-
- return 'generic';
-}
-
-export function splitFileLocation(fileLocation) {
- var fileSplit = fileLocation.split('.');
-
- var ext = '';
- if (fileSplit.length > 1) {
- ext = fileSplit[fileSplit.length - 1];
- fileSplit.splice(fileSplit.length - 1, 1);
- }
-
- var filePath = fileSplit.join('.');
- var filename = filePath.split('/')[filePath.split('/').length - 1];
-
- return {ext, name: filename, path: filePath};
-}
-
-export function sortFilesByName(files) {
- const locale = LocalizationStore.getLocale();
- return Array.from(files).sort((a, b) => a.name.localeCompare(b.name, locale, {numeric: true}));
-}
-
-export function toTitleCase(str) {
- function doTitleCase(txt) {
- return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
- }
- return str.replace(/\w\S*/g, doTitleCase);
-}
-
-export function isHexColor(value) {
- return value && (/^#[0-9a-f]{3}([0-9a-f]{3})?$/i).test(value);
-}
-
-export function applyTheme(theme) {
- if (theme.sidebarBg) {
- changeCss('.app__body .sidebar--left .sidebar__switcher, .sidebar--left, .sidebar--left .sidebar__divider .sidebar__divider__text, .app__body .modal .settings-modal .settings-table .settings-links, .app__body .sidebar--menu', 'background:' + theme.sidebarBg);
- changeCss('body.app__body', 'scrollbar-face-color:' + theme.sidebarBg);
- changeCss('@media(max-width: 768px){.app__body .modal .settings-modal:not(.settings-modal--tabless):not(.display--content) .modal-content', 'background:' + theme.sidebarBg);
- }
-
- if (theme.sidebarText) {
- changeCss('.app__body .ps-container > .ps-scrollbar-y-rail > .ps-scrollbar-y', 'background:' + theme.sidebarText);
- changeCss('.app__body .ps-container:hover .ps-scrollbar-y-rail:hover, .app__body .sidebar__switcher button:hover', 'background:' + changeOpacity(theme.sidebarText, 0.15));
- changeCss('.app__body .sidebar--left .nav-pills__container li > h4, .app__body .sidebar--left .nav-pills__container li > a, .app__body .sidebar--right, .app__body .modal .settings-modal .nav-pills>li a', 'color:' + changeOpacity(theme.sidebarText, 0.6));
- changeCss('@media(max-width: 768px){.app__body .modal .settings-modal .settings-table .nav>li>a, .app__body .sidebar--menu', 'color:' + changeOpacity(theme.sidebarText, 0.8));
- changeCss('.app__body .sidebar--left .add-channel-btn', 'color:' + changeOpacity(theme.sidebarText, 0.8));
- changeCss('.sidebar--left .add-channel-btn:hover, .sidebar--left .add-channel-btn:focus', 'color:' + theme.sidebarText);
- changeCss('.sidebar--left .status .offline--icon, .app__body .sidebar--menu svg, .app__body .sidebar-item .icon', 'fill:' + theme.sidebarText);
- changeCss('.sidebar--left .status.status--group', 'background:' + changeOpacity(theme.sidebarText, 0.3));
- changeCss('@media(max-width: 768px){.app__body .modal .settings-modal .settings-table .nav>li>a, .app__body .sidebar--menu .divider', 'border-color:' + changeOpacity(theme.sidebarText, 0.2));
- changeCss('.app__body .sidebar--left .sidebar__switcher', 'border-color:' + changeOpacity(theme.sidebarText, 0.2));
- changeCss('@media(max-width: 768px){.sidebar--left .add-channel-btn:hover, .sidebar--left .add-channel-btn:focus', 'color:' + changeOpacity(theme.sidebarText, 0.6));
- changeCss('@media(max-width: 768px){.app__body .search__icon svg', 'stroke:' + theme.sidebarText);
- changeCss('.app__body .sidebar--left .sidebar__switcher button', 'color:' + theme.sidebarText);
- changeCss('.app__body .sidebar--left .sidebar__switcher button svg', 'fill:' + theme.sidebarText);
- changeCss('.app__body .sidebar__switcher button', 'background:' + changeOpacity(theme.sidebarText, 0.08));
- }
-
- if (theme.sidebarUnreadText) {
- changeCss('.sidebar--left .nav-pills__container li>a.unread-title', 'color:' + theme.sidebarUnreadText + '!important;');
- }
-
- if (theme.sidebarTextHoverBg) {
- changeCss('.sidebar--left .nav-pills__container li > a:hover, .app__body .modal .settings-modal .nav-pills>li:hover a', 'background:' + theme.sidebarTextHoverBg);
- }
-
- if (theme.sidebarTextActiveBorder) {
- changeCss('.sidebar--left .nav li.active a:before, .app__body .modal .settings-modal .nav-pills>li.active a:before', 'background:' + theme.sidebarTextActiveBorder);
- changeCss('.sidebar--left .sidebar__divider:before', 'background:' + changeOpacity(theme.sidebarTextActiveBorder, 0.5));
- changeCss('.sidebar--left .sidebar__divider', 'color:' + theme.sidebarTextActiveBorder);
- changeCss('.multi-teams .team-sidebar .team-wrapper .team-container.active:before', 'background:' + theme.sidebarTextActiveBorder);
- changeCss('.multi-teams .team-sidebar .team-wrapper .team-container.unread:before', 'background:' + theme.sidebarTextActiveBorder);
- }
-
- if (theme.sidebarTextActiveColor) {
- changeCss('.sidebar--left .nav-pills__container li.active a, .sidebar--left .nav-pills__container li.active a:hover, .sidebar--left .nav-pills__container li.active a:focus, .app__body .modal .settings-modal .nav-pills>li.active a, .app__body .modal .settings-modal .nav-pills>li.active a:hover, .app__body .modal .settings-modal .nav-pills>li.active a:active', 'color:' + theme.sidebarTextActiveColor);
- changeCss('.sidebar--left .nav li.active a, .sidebar--left .nav li.active a:hover, .sidebar--left .nav li.active a:focus', 'background:' + changeOpacity(theme.sidebarTextActiveColor, 0.1));
- changeCss('@media(max-width: 768px){.app__body .modal .settings-modal .nav-pills > li.active a', 'color:' + changeOpacity(theme.sidebarText, 0.8));
- }
-
- if (theme.sidebarHeaderBg) {
- changeCss('.app__body .status-wrapper .status_dropdown__toggle .status, .sidebar--left .team__header, .app__body .sidebar--menu .team__header, .app__body .post-list__timestamp > div', 'background:' + theme.sidebarHeaderBg);
- changeCss('.app__body .modal .modal-header', 'background:' + theme.sidebarHeaderBg);
- changeCss('.app__body .multi-teams .team-sidebar, .app__body #navbar .navbar-default', 'background:' + theme.sidebarHeaderBg);
- changeCss('@media(max-width: 768px){.app__body .search-bar__container', 'background:' + theme.sidebarHeaderBg);
- changeCss('.app__body .attachment .attachment__container', 'border-left-color:' + theme.sidebarHeaderBg);
- }
-
- if (theme.sidebarHeaderTextColor) {
- changeCss('.app__body .status-wrapper .status_dropdown__toggle .status-edit, .multi-teams .team-sidebar .team-wrapper .team-container .team-btn, .sidebar--left .team__header .header__info, .app__body .sidebar--menu .team__header .header__info, .app__body .post-list__timestamp > div', 'color:' + theme.sidebarHeaderTextColor);
- changeCss('.app__body .icon--sidebarHeaderTextColor svg, .app__body .sidebar--left .status-wrapper .status_dropdown__toggle .offline--icon, .app__body .sidebar-header-dropdown__icon svg', 'fill:' + theme.sidebarHeaderTextColor);
- changeCss('.sidebar--left .team__header .user__name, .app__body .sidebar--menu .team__header .user__name', 'color:' + changeOpacity(theme.sidebarHeaderTextColor, 0.8));
- changeCss('.sidebar--left .team__header:hover .user__name, .app__body .sidebar--menu .team__header:hover .user__name', 'color:' + theme.sidebarHeaderTextColor);
- changeCss('.app__body .modal .modal-header .modal-title, .app__body .modal .modal-header .modal-title .name, .app__body .modal .modal-header button.close', 'color:' + theme.sidebarHeaderTextColor);
- changeCss('.app__body #navbar .navbar-default .navbar-brand .dropdown-toggle', 'color:' + theme.sidebarHeaderTextColor);
- changeCss('.app__body #navbar .navbar-default .navbar-toggle .icon-bar', 'background:' + theme.sidebarHeaderTextColor);
- changeCss('.app__body .post-list__timestamp > div', 'border-color:' + changeOpacity(theme.sidebarHeaderTextColor, 0.5));
- changeCss('@media(max-width: 768px){.app__body .search-bar__container', 'color:' + theme.sidebarHeaderTextColor);
- changeCss('@media(max-width: 768px){.app__body .search-bar__container .search__form', 'background:' + theme.sidebarHeaderTextColor);
- changeCss('.app__body .navbar-right__icon', 'background:' + changeOpacity(theme.sidebarHeaderTextColor, 0.2));
- changeCss('.app__body .navbar-right__icon svg', 'fill:' + theme.sidebarHeaderTextColor);
- changeCss('.app__body .navbar-right__icon svg', 'stroke:' + theme.sidebarHeaderTextColor);
- }
-
- if (theme.onlineIndicator) {
- changeCss('.app__body .status.status--online', 'color:' + theme.onlineIndicator);
- changeCss('.app__body .status .online--icon', 'fill:' + theme.onlineIndicator);
- }
-
- if (theme.awayIndicator) {
- changeCss('.app__body .status.status--away', 'color:' + theme.awayIndicator);
- changeCss('.app__body .status .away--icon', 'fill:' + theme.awayIndicator);
- }
-
- if (theme.mentionBj) {
- changeCss('.sidebar--left .nav-pills__unread-indicator', 'background:' + theme.mentionBj);
- changeCss('.app__body .sidebar--left .badge', 'background:' + theme.mentionBj);
- changeCss('.multi-teams .team-sidebar .badge', 'background:' + theme.mentionBj);
- }
-
- if (theme.mentionColor) {
- changeCss('.sidebar--left .nav-pills__unread-indicator svg', 'fill:' + theme.mentionColor);
- changeCss('.app__body .sidebar--left .nav-pills__unread-indicator', 'color:' + theme.mentionColor);
- changeCss('.app__body .sidebar--left .badge', 'color:' + theme.mentionColor);
- changeCss('.app__body .multi-teams .team-sidebar .badge', 'color:' + theme.mentionColor);
- }
-
- if (theme.centerChannelBg) {
- changeCss('@media(min-width: 768px){.app__body .post:hover .post__header .col__reply, .app__body .post.post--hovered .post__header .col__reply', 'background:' + theme.centerChannelBg);
- changeCss('@media(max-width: 320px){.tutorial-steps__container', 'background:' + theme.centerChannelBg);
- changeCss('.app__body .channel-header__info .channel-header__description:before, .app__body .status-wrapper .status_dropdown__toggle .status .icon__container:after, .app__body .app__content, .app__body .markdown__table, .app__body .markdown__table tbody tr, .app__body .suggestion-list__content, .app__body .modal .modal-content, .app__body .modal .modal-footer, .app__body .post.post--compact .post-image__column, .app__body .suggestion-list__divider > span, .app__body .status-wrapper .status, .app__body .alert.alert-transparent', 'background:' + theme.centerChannelBg);
- changeCss('#post-list .post-list-holder-by-time, .app__body .post .dropdown-menu a', 'background:' + theme.centerChannelBg);
- changeCss('#post-create', 'background:' + theme.centerChannelBg);
- changeCss('.app__body .date-separator .separator__text, .app__body .new-separator .separator__text', 'background:' + theme.centerChannelBg);
- changeCss('.app__body .post-image__details, .app__body .search-help-popover .search-autocomplete__divider span', 'background:' + theme.centerChannelBg);
- changeCss('.app__body .sidebar--right, .app__body .dropdown-menu, .app__body .popover, .app__body .tip-overlay', 'background:' + theme.centerChannelBg);
- changeCss('.app__body .popover.bottom>.arrow:after', 'border-bottom-color:' + theme.centerChannelBg);
- changeCss('.app__body .popover.right>.arrow:after, .app__body .tip-overlay.tip-overlay--sidebar .arrow, .app__body .tip-overlay.tip-overlay--header .arrow', 'border-right-color:' + theme.centerChannelBg);
- changeCss('.app__body .popover.left>.arrow:after', 'border-left-color:' + theme.centerChannelBg);
- changeCss('.app__body .popover.top>.arrow:after, .app__body .tip-overlay.tip-overlay--chat .arrow', 'border-top-color:' + theme.centerChannelBg);
- changeCss('@media(min-width: 768px){.app__body .form-control', 'background:' + theme.centerChannelBg);
- changeCss('@media(min-width: 768px){.app__body .sidebar--right.sidebar--right--expanded .sidebar-right-container', 'background:' + theme.centerChannelBg);
- changeCss('.app__body .attachment__content, .app__body .attachment-actions button', 'background:' + theme.centerChannelBg);
- changeCss('body.app__body', 'scrollbar-face-color:' + theme.centerChannelBg);
- changeCss('body.app__body', 'scrollbar-track-color:' + theme.centerChannelBg);
- changeCss('.app__body .shortcut-key, .app__body .post-list__new-messages-below', 'color:' + theme.centerChannelBg);
- changeCss('.app__body .emoji-picker, .app__body .emoji-picker__search', 'background:' + theme.centerChannelBg);
- changeCss('.app__body .nav-tabs, .app__body .nav-tabs > li.active > a', 'background:' + theme.centerChannelBg);
- }
-
- if (theme.centerChannelColor) {
- changeCss('.app__body .mentions__name .status.status--group, .app__body .multi-select__note', 'background:' + changeOpacity(theme.centerChannelColor, 0.12));
- changeCss('.app__body .member-list__popover .more-modal__body, .app__body .alert.alert-transparent, .app__body .channel-header .channel-header__icon, .app__body .search-bar__container .search__form', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.12));
- changeCss('.app__body .post-list__arrows, .app__body .post .flag-icon__container', 'fill:' + changeOpacity(theme.centerChannelColor, 0.3));
- changeCss('@media(min-width: 768px){.app__body .search__icon svg', 'stroke:' + changeOpacity(theme.centerChannelColor, 0.4));
- changeCss('.app__body .channel-header__icon svg', 'fill:' + changeOpacity(theme.centerChannelColor, 0.4));
- changeCss('.app__body .modal .status .offline--icon, .app__body .channel-header__links .icon, .app__body .sidebar--right .sidebar--right__subheader .usage__icon, .app__body .more-modal__header svg, .app__body .icon--body', 'fill:' + theme.centerChannelColor);
- changeCss('@media(min-width: 768px){.app__body .post:hover .post__header .col__reply, .app__body .post.post--hovered .post__header .col__reply', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
- changeCss('.app__body .modal .shortcuts-modal .subsection, .app__body .sidebar--right .sidebar--right__header, .app__body .channel-header, .app__body .nav-tabs > li > a:hover, .app__body .nav-tabs, .app__body .nav-tabs > li.active > a, .app__body .nav-tabs, .app__body .nav-tabs > li.active > a:focus, .app__body .nav-tabs, .app__body .nav-tabs > li.active > a:hover, .app__body .post .dropdown-menu a, .sidebar--left, .app__body .suggestion-list__content .command', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
- changeCss('.app__body .post.post--system .post__body, .app__body .modal .channel-switch-modal .modal-header .close', 'color:' + changeOpacity(theme.centerChannelColor, 0.6));
- changeCss('.app__body .nav-tabs, .app__body .nav-tabs > li.active > a, pp__body .input-group-addon, .app__body .app__content, .app__body .post-create__container .post-create-body .btn-file, .app__body .post-create__container .post-create-footer .msg-typing, .app__body .suggestion-list__content .command, .app__body .modal .modal-content, .app__body .dropdown-menu, .app__body .popover, .app__body .mentions__name, .app__body .tip-overlay, .app__body .form-control[disabled], .app__body .form-control[readonly], .app__body fieldset[disabled] .form-control', 'color:' + theme.centerChannelColor);
- changeCss('.app__body .post .post__link', 'color:' + changeOpacity(theme.centerChannelColor, 0.65));
- changeCss('.app__body #archive-link-home, .video-div .video-thumbnail__error', 'background:' + changeOpacity(theme.centerChannelColor, 0.15));
- changeCss('.app__body #post-create', 'color:' + theme.centerChannelColor);
- changeCss('.app__body .mentions--top, .app__body .suggestion-list', 'box-shadow:' + changeOpacity(theme.centerChannelColor, 0.2) + ' 1px -3px 12px');
- changeCss('.app__body .mentions--top, .app__body .suggestion-list', '-webkit-box-shadow:' + changeOpacity(theme.centerChannelColor, 0.2) + ' 1px -3px 12px');
- changeCss('.app__body .mentions--top, .app__body .suggestion-list', '-moz-box-shadow:' + changeOpacity(theme.centerChannelColor, 0.2) + ' 1px -3px 12px');
- changeCss('.app__body .dropdown-menu, .app__body .popover ', 'box-shadow: 0 17px 50px 0 ' + changeOpacity(theme.centerChannelColor, 0.1) + ', 0 12px 15px 0 ' + changeOpacity(theme.centerChannelColor, 0.1));
- changeCss('.app__body .dropdown-menu, .app__body .popover ', '-moz-box-shadow: 0 17px 50px 0 ' + changeOpacity(theme.centerChannelColor, 0.1) + ', 0 12px 15px 0 ' + changeOpacity(theme.centerChannelColor, 0.1));
- changeCss('.app__body .dropdown-menu, .app__body .popover ', '-webkit-box-shadow: 0 17px 50px 0 ' + changeOpacity(theme.centerChannelColor, 0.1) + ', 0 12px 15px 0 ' + changeOpacity(theme.centerChannelColor, 0.1));
- changeCss('.app__body .shortcut-key, .app__body .post__body hr, .app__body .loading-screen .loading__content .round, .app__body .tutorial__circles .circle', 'background:' + theme.centerChannelColor);
- changeCss('.app__body .channel-header .heading', 'color:' + theme.centerChannelColor);
- changeCss('.app__body .markdown__table tbody tr:nth-child(2n)', 'background:' + changeOpacity(theme.centerChannelColor, 0.07));
- changeCss('.app__body .channel-header__info .header-dropdown__icon', 'color:' + changeOpacity(theme.centerChannelColor, 0.8));
- changeCss('.app__body .post-create__container .post-create-body .send-button.disabled i, .app__body .channel-header #member_popover', 'color:' + changeOpacity(theme.centerChannelColor, 0.4));
- changeCss('.app__body .channel-header .pinned-posts-button svg', 'fill:' + changeOpacity(theme.centerChannelColor, 0.6));
- changeCss('.app__body .custom-textarea, .app__body .custom-textarea:focus, .app__body .file-preview, .app__body .post-image__details, .app__body .sidebar--right .sidebar-right__body, .app__body .markdown__table th, .app__body .markdown__table td, .app__body .suggestion-list__content, .app__body .modal .modal-content, .app__body .modal .settings-modal .settings-table .settings-content .divider-light, .app__body .webhooks__container, .app__body .dropdown-menu, .app__body .modal .modal-header', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
- changeCss('.app__body .popover.bottom>.arrow', 'border-bottom-color:' + changeOpacity(theme.centerChannelColor, 0.25));
- changeCss('.app__body .search-help-popover .search-autocomplete__divider span, .app__body .suggestion-list__divider > span', 'color:' + changeOpacity(theme.centerChannelColor, 0.7));
- changeCss('.app__body .popover.right>.arrow', 'border-right-color:' + changeOpacity(theme.centerChannelColor, 0.25));
- changeCss('.app__body .popover.left>.arrow', 'border-left-color:' + changeOpacity(theme.centerChannelColor, 0.25));
- changeCss('.app__body .popover.top>.arrow', 'border-top-color:' + changeOpacity(theme.centerChannelColor, 0.25));
- changeCss('.app__body .suggestion-list__content .command, .app__body .popover .popover-title', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
- changeCss('.app__body .suggestion-list__content .command, .app__body .popover .popover__row', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
- changeCss('.app__body .suggestion-list__divider:before, .app__body .dropdown-menu .divider, .app__body .search-help-popover .search-autocomplete__divider:before', 'background:' + theme.centerChannelColor);
- changeCss('.app__body .custom-textarea', 'color:' + theme.centerChannelColor);
- changeCss('.app__body .post-image__column', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
- changeCss('.app__body .post-image__details', 'color:' + theme.centerChannelColor);
- changeCss('.app__body .post-image__column a, .app__body .post-image__column a:hover, .app__body .post-image__column a:focus', 'color:' + theme.centerChannelColor);
- changeCss('@media(min-width: 768px){.app__body .search-bar__container .search__form .search-bar, .app__body .form-control', 'color:' + theme.centerChannelColor);
- changeCss('.app__body .input-group-addon, .app__body .form-control, .app__body .post-create__container .post-body__actions > span, .app__body .post-create__container .post-body__actions > a', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.1));
- changeCss('@media(min-width: 768px){.app__body .post-list__table .post-list__content .dropdown-menu a:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.1));
- changeCss('.app__body .form-control:focus', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
- changeCss('.app__body .attachment .attachment__content, .app__body .attachment-actions button', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.3));
- changeCss('.app__body .attachment-actions button:focus, .app__body .attachment-actions button:hover', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.5));
- changeCss('.app__body .attachment-actions button:focus, .app__body .attachment-actions button:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.03));
- changeCss('.app__body .input-group-addon, .app__body .channel-intro .channel-intro__content, .app__body .webhooks__container', 'background:' + changeOpacity(theme.centerChannelColor, 0.05));
- changeCss('.app__body .date-separator .separator__text', 'color:' + theme.centerChannelColor);
- changeCss('.app__body .date-separator .separator__hr, .app__body .modal-footer, .app__body .modal .custom-textarea', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
- changeCss('.app__body .search-item-container, .app__body .post-right__container .post.post--root', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.1));
- changeCss('.app__body .modal .custom-textarea:focus', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.3));
- changeCss('.app__body .channel-intro, .app__body .modal .settings-modal .settings-table .settings-content .divider-dark, .app__body hr, .app__body .modal .settings-modal .settings-table .settings-links, .app__body .modal .settings-modal .settings-table .settings-content .appearance-section .theme-elements__header, .app__body .user-settings .authorized-app:not(:last-child)', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
- changeCss('.app__body .post.current--user .post__body, .app__body .post.post--comment.other--root.current--user .post-comment, .app__body pre, .app__body .post-right__container .post.post--root', 'background:' + changeOpacity(theme.centerChannelColor, 0.05));
- changeCss('.app__body .post.post--comment.other--root.current--user .post-comment, .app__body .more-modal__list .more-modal__row, .app__body .member-div:first-child, .app__body .member-div, .app__body .access-history__table .access__report, .app__body .activity-log__table', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.1));
- changeCss('@media(max-width: 1800px){.app__body .inner-wrap.move--left .post.post--comment.same--root', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.07));
- changeCss('.app__body .post.post--hovered', 'background:' + changeOpacity(theme.centerChannelColor, 0.08));
- changeCss('.app__body .attachment__body__wrap.btn-close', 'background:' + changeOpacity(theme.centerChannelColor, 0.08));
- changeCss('.app__body .attachment__body__wrap.btn-close', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
- changeCss('@media(min-width: 768px){.app__body .post:hover, .app__body .more-modal__list .more-modal__row:hover, .app__body .modal .settings-modal .settings-table .settings-content .section-min:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.08));
- changeCss('.app__body .more-modal__row.more-modal__row--selected, .app__body .date-separator.hovered--before:after, .app__body .date-separator.hovered--after:before, .app__body .new-separator.hovered--after:before, .app__body .new-separator.hovered--before:after', 'background:' + changeOpacity(theme.centerChannelColor, 0.07));
- changeCss('@media(min-width: 768px){.app__body .suggestion-list__content .command:hover, .app__body .mentions__name:hover, .app__body .dropdown-menu>li>a:focus, .app__body .dropdown-menu>li>a:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.15));
- changeCss('.app__body .suggestion--selected, .app__body .emoticon-suggestion:hover, .app__body .bot-indicator', 'background:' + changeOpacity(theme.centerChannelColor, 0.15));
- changeCss('code, .app__body .form-control[disabled], .app__body .form-control[readonly], .app__body fieldset[disabled] .form-control', 'background:' + changeOpacity(theme.centerChannelColor, 0.1));
- changeCss('@media(min-width: 960px){.app__body .post.current--user:hover .post__body ', 'background: none;');
- changeCss('.app__body .sidebar--right', 'color:' + theme.centerChannelColor);
- changeCss('.app__body .search-help-popover .search-autocomplete__item:hover, .app__body .modal .settings-modal .settings-table .settings-content .appearance-section .theme-elements__body', 'background:' + changeOpacity(theme.centerChannelColor, 0.05));
- changeCss('.app__body .search-help-popover .search-autocomplete__item.selected', 'background:' + changeOpacity(theme.centerChannelColor, 0.15));
- if (!UserAgent.isFirefox() && !UserAgent.isInternetExplorer() && !UserAgent.isEdge()) {
- changeCss('body.app__body ::-webkit-scrollbar-thumb', 'background:' + changeOpacity(theme.centerChannelColor, 0.4));
- }
- changeCss('body', 'scrollbar-arrow-color:' + theme.centerChannelColor);
- changeCss('.app__body .post-create__container .post-create-body .btn-file svg, .app__body .post.post--compact .post-image__column .post-image__details svg, .app__body .modal .about-modal .about-modal__logo svg, .app__body .post .post__img svg, .app__body .post-body__actions svg', 'fill:' + theme.centerChannelColor);
- changeCss('.app__body .scrollbar--horizontal, .app__body .scrollbar--vertical', 'background:' + changeOpacity(theme.centerChannelColor, 0.5));
- changeCss('.app__body .post-list__new-messages-below', 'background:' + changeColor(theme.centerChannelColor, 0.5));
- changeCss('.app__body .post.post--comment .post__body', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
- changeCss('@media(min-width: 768px){.app__body .post.post--compact.same--root.post--comment .post__content', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
- changeCss('.app__body .post.post--comment.current--user .post__body', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
- changeCss('.app__body .channel-header__info .status .offline--icon', 'fill:' + theme.centerChannelColor);
- changeCss('.app__body .navbar .status .offline--icon', 'fill:' + theme.centerChannelColor);
- changeCss('.app__body .post-reaction:not(.post-reaction--current-user)', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.25));
- changeCss('.app__body .post-reaction:not(.post-reaction--current-user)', 'color:' + changeOpacity(theme.centerChannelColor, 0.7));
- changeCss('.app__body .emoji-picker', 'color:' + theme.centerChannelColor);
- changeCss('.app__body .emoji-picker', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2));
- changeCss('.app__body .emoji-picker__preview, .app__body .emoji-picker__items, .app__body .emoji-picker__search-container', 'border-top-color:' + changeOpacity(theme.centerChannelColor, 0.2));
- changeCss('.app__body .emoji-picker__items', 'background-color:' + changeOpacity(theme.centerChannelColor, 0.05));
- changeCss('.emoji-picker__category .fa:hover', 'color:' + changeOpacity(theme.centerChannelColor, 0.8));
- changeCss('.app__body .emoji-picker__category, .app__body .emoji-picker__category:focus, .app__body .emoji-picker__category:hover', 'color:' + changeOpacity(theme.centerChannelColor, 0.3));
- changeCss('.app__body .emoji-picker__category--selected, .app__body .emoji-picker__category--selected:focus, .app__body .emoji-picker__category--selected:hover', 'color:' + theme.centerChannelColor);
- changeCss('.app__body .emoji-picker__item-wrapper:hover', 'background-color:' + changeOpacity(theme.centerChannelColor, 0.8));
- changeCss('.app__body .emojisprite:hover', 'background-color:' + changeOpacity(theme.centerChannelColor, 0.8));
- changeCss('.app__body .icon__postcontent_picker:hover', 'color:' + changeOpacity(theme.centerChannelColor, 0.8));
- changeCss('.app__body .popover', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.07));
- }
-
- if (theme.newMessageSeparator) {
- changeCss('.app__body .new-separator .separator__text', 'color:' + theme.newMessageSeparator);
- changeCss('.app__body .new-separator .separator__hr', 'border-color:' + changeOpacity(theme.newMessageSeparator, 0.5));
- }
-
- if (theme.linkColor) {
- changeCss('.app__body .channel-header__links > a.active, .app__body a, .app__body a:focus, .app__body a:hover, .app__body .btn, .app__body .btn:focus, .app__body .btn:hover', 'color:' + theme.linkColor);
- changeCss('.app__body .attachment .attachment__container', 'border-left-color:' + changeOpacity(theme.linkColor, 0.5));
- changeCss('.app__body .member-list__popover .more-modal__list .more-modal__row:hover', 'background:' + changeOpacity(theme.linkColor, 0.08));
- changeCss('.app__body .channel-header__links .icon:hover, .app__body .channel-header__links > a.active .icon, .app__body .post .flag-icon__container.visible, .app__body .post .reacticon__container, .app__body .post .comment-icon__container, .app__body .post .post__reply', 'fill:' + theme.linkColor);
- changeCss('@media(min-width: 768px){.app__body .search__form.focused .search__icon svg', 'stroke:' + theme.linkColor);
- changeCss('.app__body .channel-header__links .icon:hover, .app__body .post .flag-icon__container.visible, .app__body .post .comment-icon__container, .app__body .post .post__reply', 'fill:' + theme.linkColor);
- changeCss('.app__body .channel-header .channel-header__icon:hover #member_popover, .app__body .channel-header .channel-header__icon.active #member_popover', 'color:' + theme.linkColor);
- changeCss('.app__body .channel-header .pinned-posts-button:hover svg', 'fill:' + changeOpacity(theme.linkColor, 0.6));
- changeCss('.app__body .member-list__popover .more-modal__actions svg, .app__body .channel-header .channel-header__icon:hover svg, .app__body .channel-header .channel-header__icon.active svg', 'fill:' + theme.linkColor);
- changeCss('.app__body .post-reaction.post-reaction--current-user', 'background:' + changeOpacity(theme.linkColor, 0.1));
- changeCss('.app__body .post-reaction.post-reaction--current-user', 'border-color:' + changeOpacity(theme.linkColor, 0.4));
- changeCss('.app__body .member-list__popover .more-modal__list .more-modal__row:hover, .app__body .channel-header .channel-header__icon:hover, .app__body .channel-header .channel-header__icon.active, .app__body .search-bar__container .search__form.focused', 'border-color:' + theme.linkColor);
- changeCss('.app__body .post-reaction.post-reaction--current-user', 'color:' + theme.linkColor);
- changeCss('.app__body .channel-header__title.open .heading, .app__body .channel-header__info .channel-header__title.open .header-dropdown__icon', 'color:' + theme.linkColor);
- changeCss('.app__body .channel-header .dropdown-toggle:hover .heading, .app__body .channel-header .dropdown-toggle:hover .header-dropdown__icon', 'color:' + theme.linkColor);
- }
-
- if (theme.buttonBg) {
- changeCss('.app__body .new-messages__button div, .app__body .btn.btn-primary, .app__body .tutorial__circles .circle.active, .app__body .post__pinned-badge', 'background:' + theme.buttonBg);
- changeCss('.app__body .btn.btn-primary:hover, .app__body .btn.btn-primary:active, .app__body .btn.btn-primary:focus', 'background:' + changeColor(theme.buttonBg, -0.15));
- }
-
- if (theme.buttonColor) {
- changeCss('.app__body .new-messages__button div, .app__body .btn.btn-primary, .app__body .post__pinned-badge', 'color:' + theme.buttonColor);
- changeCss('.app__body .new-messages__button svg', 'fill:' + theme.buttonColor);
- }
-
- if (theme.errorTextColor) {
- changeCss('.app__body .has-error .help-block, .app__body .has-error .control-label, .app__body .has-error .radio, .app__body .has-error .checkbox, .app__body .has-error .radio-inline, .app__body .has-error .checkbox-inline, .app__body .has-error.radio label, .app__body .has-error.checkbox label, .app__body .has-error.radio-inline label, .app__body .has-error.checkbox-inline label', 'color:' + theme.errorTextColor);
- }
-
- if (theme.mentionHighlightBg) {
- changeCss('.app__body .mention--highlight, .app__body .search-highlight', 'background:' + theme.mentionHighlightBg);
- changeCss('.app__body .post.post--comment .post__body.mention-comment', 'border-color:' + theme.mentionHighlightBg);
- changeCss('.app__body .post.post--highlight', 'background:' + changeOpacity(theme.mentionHighlightBg, 0.5));
- }
-
- if (theme.mentionHighlightLink) {
- changeCss('.app__body .mention--highlight .mention-link, .app__body .mention--highlight, .app__body .search-highlight', 'color:' + theme.mentionHighlightLink);
- }
-
- if (!theme.codeTheme) {
- theme.codeTheme = Constants.DEFAULT_CODE_THEME;
- }
- updateCodeTheme(theme.codeTheme);
-}
-
-export function resetTheme() {
- applyTheme(Constants.THEMES.default);
-}
-
-export function changeCss(className, classValue) {
- let styleEl = document.querySelector('style[data-class="' + className + '"]');
- if (!styleEl) {
- styleEl = document.createElement('style');
- styleEl.setAttribute('data-class', className);
-
- // Append style element to head
- document.head.appendChild(styleEl);
- }
-
- // Grab style sheet
- const styleSheet = styleEl.sheet;
- const rules = styleSheet.cssRules || styleSheet.rules;
- const style = classValue.substr(0, classValue.indexOf(':'));
- const value = classValue.substr(classValue.indexOf(':') + 1);
-
- for (let i = 0; i < rules.length; i++) {
- if (rules[i].selectorText === className) {
- rules[i].style[style] = value;
- return;
- }
- }
-
- let mediaQuery = '';
- if (className.indexOf('@media') >= 0) {
- mediaQuery = '}';
- }
- styleSheet.insertRule(className + '{' + classValue + '}' + mediaQuery, styleSheet.cssRules.length);
-}
-
-export function updateCodeTheme(userTheme) {
- let cssPath = '';
- Constants.THEME_ELEMENTS.forEach((element) => {
- if (element.id === 'codeTheme') {
- element.themes.forEach((theme) => {
- if (userTheme === theme.id) {
- cssPath = theme.cssURL;
- }
- });
- }
- });
- const $link = $('link.code_theme');
- if (cssPath !== $link.attr('href')) {
- changeCss('code.hljs', 'visibility: hidden');
- var xmlHTTP = new XMLHttpRequest();
- xmlHTTP.open('GET', cssPath, true);
- xmlHTTP.onload = function onLoad() {
- $link.attr('href', cssPath);
- if (UserAgent.isFirefox()) {
- $link.one('load', () => {
- changeCss('code.hljs', 'visibility: visible');
- });
- } else {
- changeCss('code.hljs', 'visibility: visible');
- }
- };
- xmlHTTP.send();
- }
-}
-
-export function placeCaretAtEnd(el) {
- el.focus();
- el.selectionStart = el.value.length;
- el.selectionEnd = el.value.length;
-}
-
-export function getCaretPosition(el) {
- if (el.selectionStart) {
- return el.selectionStart;
- } else if (document.selection) {
- el.focus();
-
- var r = document.selection.createRange();
- if (r == null) {
- return 0;
- }
-
- var re = el.createTextRange();
- var rc = re.duplicate();
- re.moveToBookmark(r.getBookmark());
- rc.setEndPoint('EndToStart', re);
-
- return rc.text.length;
- }
- return 0;
-}
-
-export function setSelectionRange(input, selectionStart, selectionEnd) {
- if (input.setSelectionRange) {
- input.focus();
- input.setSelectionRange(selectionStart, selectionEnd);
- } else if (input.createTextRange) {
- var range = input.createTextRange();
- range.collapse(true);
- range.moveEnd('character', selectionEnd);
- range.moveStart('character', selectionStart);
- range.select();
- }
-}
-
-export function setCaretPosition(input, pos) {
- setSelectionRange(input, pos, pos);
-}
-
-export function getSelectedText(input) {
- var selectedText;
- if (typeof document.selection !== 'undefined') {
- input.focus();
- var sel = document.selection.createRange();
- selectedText = sel.text;
- } else if (typeof input.selectionStart !== 'undefined') {
- var startPos = input.selectionStart;
- var endPos = input.selectionEnd;
- selectedText = input.value.substring(startPos, endPos);
- }
-
- return selectedText;
-}
-
-export function isValidUsername(name) {
- var error = '';
- if (!name) {
- error = 'This field is required';
- } else if (name.length < Constants.MIN_USERNAME_LENGTH || name.length > Constants.MAX_USERNAME_LENGTH) {
- error = 'Must be between ' + Constants.MIN_USERNAME_LENGTH + ' and ' + Constants.MAX_USERNAME_LENGTH + ' characters';
- } else if (!(/^[a-z0-9.\-_]+$/).test(name)) {
- error = "Must contain only letters, numbers, and the symbols '.', '-', and '_'.";
- } else if (!(/[a-z]/).test(name.charAt(0))) { //eslint-disable-line no-negated-condition
- error = 'First character must be a letter.';
- } else {
- for (var i = 0; i < Constants.RESERVED_USERNAMES.length; i++) {
- if (name === Constants.RESERVED_USERNAMES[i]) {
- error = 'Cannot use a reserved word as a username.';
- break;
- }
- }
- }
-
- return error;
-}
-
-export function isMobile() {
- return window.innerWidth <= Constants.MOBILE_SCREEN_WIDTH;
-}
-
-export function getDirectTeammate(channelId) {
- var userIds = ChannelStore.get(channelId).name.split('__');
- var curUserId = UserStore.getCurrentId();
- var teammate = {};
-
- if (userIds.length !== 2 || userIds.indexOf(curUserId) === -1) {
- return teammate;
- }
-
- for (var idx in userIds) {
- if (userIds[idx] !== curUserId) {
- teammate = UserStore.getProfile(userIds[idx]);
- break;
- }
- }
-
- return teammate;
-}
-
-export function loadImage(url, onLoad, onProgress) {
- const request = new XMLHttpRequest();
-
- request.open('GET', url, true);
- request.responseType = 'arraybuffer';
- request.onload = onLoad;
- request.onprogress = (e) => {
- if (onProgress) {
- const completedPercentage = Math.round((e.loaded / e.total) * 100);
-
- onProgress(completedPercentage);
- }
- };
-
- request.send();
-}
-
-export function changeColor(colourIn, amt) {
- var hex = colourIn;
- var lum = amt;
-
- // validate hex string
- hex = String(hex).replace(/[^0-9a-f]/gi, '');
- if (hex.length < 6) {
- hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
- }
- lum = lum || 0;
-
- // convert to decimal and change luminosity
- var rgb = '#';
- var c;
- var i;
- for (i = 0; i < 3; i++) {
- c = parseInt(hex.substr(i * 2, 2), 16);
- c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16);
- rgb += ('00' + c).substr(c.length);
- }
-
- return rgb;
-}
-
-export function changeOpacity(oldColor, opacity) {
- var color = oldColor;
- if (color[0] === '#') {
- color = color.slice(1);
- }
-
- if (color.length === 3) {
- const tempColor = color;
- color = '';
-
- color += tempColor[0] + tempColor[0];
- color += tempColor[1] + tempColor[1];
- color += tempColor[2] + tempColor[2];
- }
-
- var r = parseInt(color.substring(0, 2), 16);
- var g = parseInt(color.substring(2, 4), 16);
- var b = parseInt(color.substring(4, 6), 16);
-
- return 'rgba(' + r + ',' + g + ',' + b + ',' + opacity + ')';
-}
-
-export function getFullName(user) {
- if (user.first_name && user.last_name) {
- return user.first_name + ' ' + user.last_name;
- } else if (user.first_name) {
- return user.first_name;
- } else if (user.last_name) {
- return user.last_name;
- }
-
- return '';
-}
-
-export function getDisplayName(user) {
- if (user.nickname && user.nickname.trim().length > 0) {
- return user.nickname;
- }
- var fullName = getFullName(user);
-
- if (fullName) {
- return fullName;
- }
-
- return user.username;
-}
-
-/**
- * Gets the display name of the user with the specified id, respecting the TeammateNameDisplay configuration setting
- */
-export function displayUsername(userId) {
- return displayUsernameForUser(UserStore.getProfile(userId));
-}
-
-/**
- * Gets the display name of the specified user, respecting the TeammateNameDisplay configuration setting
- */
-export function displayUsernameForUser(user) {
- if (user) {
- const nameFormat = global.window.mm_config.TeammateNameDisplay;
- let name = user.username;
- if (nameFormat === Constants.TEAMMATE_NAME_DISPLAY.SHOW_NICKNAME_FULLNAME && user.nickname && user.nickname !== '') {
- name = user.nickname;
- } else if ((user.first_name || user.last_name) && (nameFormat === Constants.TEAMMATE_NAME_DISPLAY.SHOW_NICKNAME_FULLNAME || nameFormat === Constants.TEAMMATE_NAME_DISPLAY.SHOW_FULLNAME)) {
- name = getFullName(user);
- }
-
- return name;
- }
-
- return '';
-}
-
-/**
- * Gets the entire name, including username, full name, and nickname, of the user with the specified id
- */
-export function displayEntireName(userId) {
- return displayEntireNameForUser(UserStore.getProfile(userId));
-}
-
-/**
- * Gets the entire name, including username, full name, and nickname, of the specified user
- */
-export function displayEntireNameForUser(user) {
- if (!user) {
- return '';
- }
-
- let displayName = user.username;
- const fullName = getFullName(user);
-
- if (fullName && user.nickname) {
- displayName += ` - ${fullName} (${user.nickname})`;
- } else if (fullName) {
- displayName += ` - ${fullName}`;
- } else if (user.nickname) {
- displayName += ` - ${user.nickname}`;
- }
-
- return displayName;
-}
-
-export function imageURLForUser(userIdOrObject) {
- if (typeof userIdOrObject == 'string') {
- const profile = UserStore.getProfile(userIdOrObject);
- if (profile) {
- return imageURLForUser(profile);
- }
- return Client4.getUsersRoute() + '/' + userIdOrObject + '/image?_=' + Date.now();
- }
- return Client4.getUsersRoute() + '/' + userIdOrObject.id + '/image?_=' + (userIdOrObject.last_picture_update || 0);
-}
-
-// Converts a file size in bytes into a human-readable string of the form '123MB'.
-export function fileSizeToString(bytes) {
- // it's unlikely that we'll have files bigger than this
- if (bytes > 1024 * 1024 * 1024 * 1024) {
- return Math.floor(bytes / (1024 * 1024 * 1024 * 1024)) + 'TB';
- } else if (bytes > 1024 * 1024 * 1024) {
- return Math.floor(bytes / (1024 * 1024 * 1024)) + 'GB';
- } else if (bytes > 1024 * 1024) {
- return Math.floor(bytes / (1024 * 1024)) + 'MB';
- } else if (bytes > 1024) {
- return Math.floor(bytes / 1024) + 'KB';
- }
-
- return bytes + 'B';
-}
-
-// Gets the websocket port to use. Configurable on the server.
-export function getWebsocketPort(protocol) {
- if ((/^wss:/).test(protocol)) { // wss://
- return ':' + global.window.mm_config.WebsocketSecurePort;
- }
- if ((/^ws:/).test(protocol)) {
- return ':' + global.window.mm_config.WebsocketPort;
- }
- return '';
-}
-
-// Generates a RFC-4122 version 4 compliant globally unique identifier.
-export function generateId() {
- // implementation taken from http://stackoverflow.com/a/2117523
- var id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
-
- id = id.replace(/[xy]/g, (c) => {
- var r = Math.floor(Math.random() * 16);
-
- var v;
- if (c === 'x') {
- v = r;
- } else {
- v = (r & 0x3) | 0x8;
- }
-
- return v.toString(16);
- });
-
- return id;
-}
-
-export function getDirectChannelName(id, otherId) {
- let handle;
-
- if (otherId > id) {
- handle = id + '__' + otherId;
- } else {
- handle = otherId + '__' + id;
- }
-
- return handle;
-}
-
-// Used to get the id of the other user from a DM channel
-export function getUserIdFromChannelName(channel) {
- return getUserIdFromChannelId(channel.name);
-}
-
-// Used to get the id of the other user from a DM channel id (id1_id2)
-export function getUserIdFromChannelId(channelId) {
- var ids = channelId.split('__');
- var otherUserId = '';
- if (ids[0] === UserStore.getCurrentId()) {
- otherUserId = ids[1];
- } else {
- otherUserId = ids[0];
- }
-
- return otherUserId;
-}
-
-// Returns true if the given channel is a direct channel between the current user and the given one
-export function isDirectChannelForUser(otherUserId, channel) {
- return channel.type === Constants.DM_CHANNEL && getUserIdFromChannelName(channel) === otherUserId;
-}
-
-export function importSlack(file, success, error) {
- Client4.importTeam(TeamStore.getCurrent().id, file, 'slack').then(success).catch(error);
-}
-
-export function windowWidth() {
- return $(window).width();
-}
-
-export function windowHeight() {
- return $(window).height();
-}
-
-export function getChannelTerm(channelType) {
- let channelTerm = 'Channel';
- if (channelType === Constants.PRIVATE_CHANNEL) {
- channelTerm = 'Group';
- }
-
- return channelTerm;
-}
-
-export function getPostTerm(post) {
- let postTerm = 'Post';
- if (post.root_id) {
- postTerm = 'Comment';
- }
-
- return postTerm;
-}
-
-export function isFeatureEnabled(feature) {
- return PreferenceStore.getBool(Constants.Preferences.CATEGORY_ADVANCED_SETTINGS, Constants.FeatureTogglePrefix + feature.label);
-}
-
-export function fillArray(value, length) {
- const arr = [];
-
- for (let i = 0; i < length; i++) {
- arr.push(value);
- }
-
- return arr;
-}
-
-// Checks if a data transfer contains files not text, folders, etc..
-// Slightly modified from http://stackoverflow.com/questions/6848043/how-do-i-detect-a-file-is-being-dragged-rather-than-a-draggable-element-on-my-pa
-export function isFileTransfer(files) {
- if (UserAgent.isInternetExplorer() || UserAgent.isEdge()) {
- return files.types != null && files.types.contains('Files');
- }
-
- return files.types != null && (files.types.indexOf ? files.types.indexOf('Files') !== -1 : files.types.contains('application/x-moz-file'));
-}
-
-export function clearFileInput(elm) {
- // clear file input for all modern browsers
- try {
- elm.value = '';
- if (elm.value) {
- elm.type = 'text';
- elm.type = 'file';
- }
- } catch (e) {
- // Do nothing
- }
-}
-
-export function isPostEphemeral(post) {
- return post.type === Constants.PostTypes.EPHEMERAL || post.state === Posts.POST_DELETED;
-}
-
-export function getRootId(post) {
- return post.root_id === '' ? post.id : post.root_id;
-}
-
-export function localizeMessage(id, defaultMessage) {
- const translations = LocalizationStore.getTranslations();
- if (translations) {
- const value = translations[id];
- if (value) {
- return value;
- }
- }
-
- if (defaultMessage) {
- return defaultMessage;
- }
-
- return id;
-}
-
-export function mod(a, b) {
- return ((a % b) + b) % b;
-}
-
-export function canCreateCustomEmoji(user) {
- if (global.window.mm_license.IsLicensed !== 'true') {
- return true;
- }
-
- if (isSystemAdmin(user.roles)) {
- return true;
- }
-
- // already checked for system admin for both these cases
- if (window.mm_config.RestrictCustomEmojiCreation === 'system_admin') {
- return false;
- } else if (window.mm_config.RestrictCustomEmojiCreation === 'admin') {
- // check whether the user is an admin on any of their teams
- if (TeamStore.isTeamAdminForAnyTeam()) {
- return true;
- }
-
- return false;
- }
-
- return true;
-}
-
-export function isValidPassword(password) {
- let errorMsg = '';
- let errorId = 'user.settings.security.passwordError';
- let error = false;
- let minimumLength = Constants.MIN_PASSWORD_LENGTH;
-
- if (global.window.mm_config.BuildEnterpriseReady === 'true' && global.window.mm_license.IsLicensed === 'true' && global.window.mm_license.PasswordRequirements === 'true') {
- if (password.length < parseInt(global.window.mm_config.PasswordMinimumLength, 10) || password.length > Constants.MAX_PASSWORD_LENGTH) {
- error = true;
- }
-
- if (global.window.mm_config.PasswordRequireLowercase === 'true') {
- if (!password.match(/[a-z]/)) {
- error = true;
- }
-
- errorId += 'Lowercase';
- }
-
- if (global.window.mm_config.PasswordRequireUppercase === 'true') {
- if (!password.match(/[0-9]/)) {
- error = true;
- }
-
- errorId += 'Uppercase';
- }
-
- if (global.window.mm_config.PasswordRequireNumber === 'true') {
- if (!password.match(/[A-Z]/)) {
- error = true;
- }
-
- errorId += 'Number';
- }
-
- if (global.window.mm_config.PasswordRequireSymbol === 'true') {
- if (!password.match(/[ !"\\#$%&'()*+,-./:;<=>?@[\]^_`|~]/)) {
- error = true;
- }
-
- errorId += 'Symbol';
- }
-
- minimumLength = global.window.mm_config.PasswordMinimumLength;
- } else if (password.length < Constants.MIN_PASSWORD_LENGTH || password.length > Constants.MAX_PASSWORD_LENGTH) {
- error = true;
- }
-
- if (error) {
- errorMsg = (
- <FormattedMessage
- id={errorId}
- default='Your password must contain between {min} and {max} characters.'
- values={{
- min: minimumLength,
- max: Constants.MAX_PASSWORD_LENGTH
- }}
- />
- );
- }
-
- return errorMsg;
-}
-
-export function handleFormattedTextClick(e) {
- const hashtagAttribute = e.target.getAttributeNode('data-hashtag');
- const linkAttribute = e.target.getAttributeNode('data-link');
- const channelMentionAttribute = e.target.getAttributeNode('data-channel-mention');
-
- if (hashtagAttribute) {
- e.preventDefault();
-
- searchForTerm(hashtagAttribute.value);
- } else if (linkAttribute) {
- const MIDDLE_MOUSE_BUTTON = 1;
-
- if (!(e.button === MIDDLE_MOUSE_BUTTON || e.altKey || e.ctrlKey || e.metaKey || e.shiftKey)) {
- e.preventDefault();
-
- browserHistory.push(linkAttribute.value);
- }
- } else if (channelMentionAttribute) {
- e.preventDefault();
- browserHistory.push('/' + TeamStore.getCurrent().name + '/channels/' + channelMentionAttribute.value);
- }
-}
-
-// This should eventually be removed once everywhere else calls the action
-function searchForTerm(term) {
- AppDispatcher.handleServerAction({
- type: ActionTypes.RECEIVED_SEARCH_TERM,
- term,
- do_search: true
- });
-}
-
-export function isEmptyObject(object) {
- if (!object) {
- return true;
- }
-
- if (Object.keys(object).length === 0) {
- return true;
- }
-
- return false;
-}
-
-export function updateWindowDimensions(component) {
- component.setState({width: window.innerWidth, height: window.innerHeight});
-}
-
-export function removePrefixFromLocalStorage(prefix) {
- const keys = [];
- for (let i = 0; i < localStorage.length; i++) {
- if (localStorage.key(i).startsWith(prefix)) {
- keys.push(localStorage.key(i));
- }
- }
-
- for (let i = 0; i < keys.length; i++) {
- localStorage.removeItem(keys[i]);
- }
-}
-
-export function getEmailInterval(isEmailEnabled) {
- const {
- INTERVAL_NEVER,
- INTERVAL_IMMEDIATE,
- INTERVAL_FIFTEEN_MINUTES,
- INTERVAL_HOUR,
- CATEGORY_NOTIFICATIONS,
- EMAIL_INTERVAL
- } = Constants.Preferences;
-
- if (!isEmailEnabled) {
- return INTERVAL_NEVER;
- }
-
- const validValuesWithEmailBatching = [INTERVAL_IMMEDIATE, INTERVAL_FIFTEEN_MINUTES, INTERVAL_HOUR];
- const validValuesWithoutEmailBatching = [INTERVAL_IMMEDIATE];
-
- let emailInterval;
-
- if (global.mm_config.EnableEmailBatching === 'true') {
- // when email batching is enabled, the default interval is 15 minutes
- emailInterval = PreferenceStore.getInt(CATEGORY_NOTIFICATIONS, EMAIL_INTERVAL, INTERVAL_FIFTEEN_MINUTES);
-
- if (validValuesWithEmailBatching.indexOf(emailInterval) === -1) {
- emailInterval = INTERVAL_FIFTEEN_MINUTES;
- }
- } else {
- // otherwise, the default interval is immediately
- emailInterval = PreferenceStore.getInt(CATEGORY_NOTIFICATIONS, EMAIL_INTERVAL, INTERVAL_IMMEDIATE);
-
- if (validValuesWithoutEmailBatching.indexOf(emailInterval) === -1) {
- emailInterval = INTERVAL_IMMEDIATE;
- }
- }
-
- return emailInterval;
-}