var completer = window.EmojiCompleter = {

    getCompletions: function(editor, session, pos, prefix, callback) {
        var func = null;
        if (!completer.debouncedGetEmoji) {
            func = debounce(completer.getEmoji, 110);
            completer.debouncedGetEmoji = func;            
        } else
            func = completer.getEmoji;
        
        // don't block UI thread
        setTimeout(function () { callback(null, func(prefix, pos)); }, 1);
    },

    debouncedGetEmoji: null,

    getEmoji: function getEmoji(prefix, pos) {
        
        if (prefix.length === 0)
            return [];

        prefix = te.getCurrentLine().substr(pos.column - prefix.length - 1);
        if (prefix[0] != ':')
            return [];

        var items = completer.getEmojiList(prefix);
        var list = [];
        for (var i = 0; i < items.length; i++) {
            var item = items[i];
            list.push({ caption: item.key, value: item.key.substr(1), score: 300, meta: item.value });
        }
        
        return list;
    },
    getEmojiList: function getEmojiList(partial) {
        partial = partial.replace(":", "");
        
        return completer.emojis.filter(function(val) {
            return (val.key.indexOf(partial) > -1);
        });
    },
    emojis: [
        { key: ":100:", value: "💯" },
        { key: ":1234:", value: "🔢" },
        { key: ":smile:", value: "😄" },
        { key: ":smiley:", value: "😃" },
        { key: ":grinning:", value: "😀" },
        { key: ":blush:", value: "😊" },
        { key: ":relaxed:", value: "☺️" },
        { key: ":wink:", value: "😉" },
        { key: ":heart_eyes:", value: "😍" },
        { key: ":kissing_heart:", value: "😘" },
        { key: ":kissing_closed_eyes:", value: "😚" },
        { key: ":kissing:", value: "😗" },
        { key: ":kissing_smiling_eyes:", value: "😙" },
        { key: ":stuck_out_tongue_winking_eye:", value: "😜" },
        { key: ":stuck_out_tongue_closed_eyes:", value: "😝" },
        { key: ":stuck_out_tongue:", value: "😛" },
        { key: ":flushed:", value: "😳" },
        { key: ":grin:", value: "😁" },
        { key: ":pensive:", value: "😔" },
        { key: ":relieved:", value: "😌" },
        { key: ":unamused:", value: "😒" },
        { key: ":disappointed:", value: "😞" },
        { key: ":persevere:", value: "😣" },
        { key: ":cry:", value: "😢" },
        { key: ":joy:", value: "😂" },
        { key: ":sob:", value: "😭" },
        { key: ":sleepy:", value: "😪" },
        { key: ":disappointed_relieved:", value: "😥" },
        { key: ":cold_sweat:", value: "😰" },
        { key: ":sweat_smile:", value: "😅" },
        { key: ":sweat:", value: "😓" },
        { key: ":weary:", value: "😩" },
        { key: ":tired_face:", value: "😫" },
        { key: ":fearful:", value: "😨" },
        { key: ":scream:", value: "😱" },
        { key: ":angry:", value: "😠" },
        { key: ":rage:", value: "😡" },
        { key: ":triumph:", value: "😤" },
        { key: ":confounded:", value: "😖" },
        { key: ":laughing:", value: "😆" },
        { key: ":satisfied:", value: "😆" },
        { key: ":yum:", value: "😋" },
        { key: ":mask:", value: "😷" },
        { key: ":sunglasses:", value: "😎" },
        { key: ":sleeping:", value: "😴" },
        { key: ":dizzy_face:", value: "😵" },
        { key: ":astonished:", value: "😲" },
        { key: ":worried:", value: "😟" },
        { key: ":frowning:", value: "😦" },
        { key: ":anguished:", value: "😧" },
        { key: ":smiling_imp:", value: "😈" },
        { key: ":imp:", value: "👿" },
        { key: ":open_mouth:", value: "😮" },
        { key: ":grimacing:", value: "😬" },
        { key: ":neutral_face:", value: "😐" },
        { key: ":confused:", value: "😕" },
        { key: ":hushed:", value: "😯" },
        { key: ":no_mouth:", value: "😶" },
        { key: ":innocent:", value: "😇" },
        { key: ":smirk:", value: "😏" },
        { key: ":expressionless:", value: "😑" },
        { key: ":man_with_gua_pi_mao:", value: "👲" },
        { key: ":man_with_turban:", value: "👳" },
        { key: ":cop:", value: "👮" },
        { key: ":construction_worker:", value: "👷" },
        { key: ":guardsman:", value: "💂" },
        { key: ":baby:", value: "👶" },
        { key: ":boy:", value: "👦" },
        { key: ":girl:", value: "👧" },
        { key: ":man:", value: "👨" },
        { key: ":woman:", value: "👩" },
        { key: ":older_man:", value: "👴" },
        { key: ":older_woman:", value: "👵" },
        { key: ":person_with_blond_hair:", value: "👱" },
        { key: ":angel:", value: "👼" },
        { key: ":princess:", value: "👸" },
        { key: ":smiley_cat:", value: "😺" },
        { key: ":smile_cat:", value: "😸" },
        { key: ":heart_eyes_cat:", value: "😻" },
        { key: ":kissing_cat:", value: "😽" },
        { key: ":smirk_cat:", value: "😼" },
        { key: ":scream_cat:", value: "🙀" },
        { key: ":crying_cat_face:", value: "😿" },
        { key: ":joy_cat:", value: "😹" },
        { key: ":pouting_cat:", value: "😾" },
        { key: ":japanese_ogre:", value: "👹" },
        { key: ":japanese_goblin:", value: "👺" },
        { key: ":see_no_evil:", value: "🙈" },
        { key: ":hear_no_evil:", value: "🙉" },
        { key: ":speak_no_evil:", value: "🙊" },
        { key: ":skull:", value: "💀" },
        { key: ":alien:", value: "👽" },
        { key: ":hankey:", value: "💩" },
        { key: ":poop:", value: "💩" },
        { key: ":shit:", value: "💩" },
        { key: ":fire:", value: "🔥" },
        { key: ":sparkles:", value: "✨" },
        { key: ":star2:", value: "🌟" },
        { key: ":dizzy:", value: "💫" },
        { key: ":boom:", value: "💥" },
        { key: ":collision:", value: "💥" },
        { key: ":anger:", value: "💢" },
        { key: ":sweat_drops:", value: "💦" },
        { key: ":droplet:", value: "💧" },
        { key: ":zzz:", value: "💤" },
        { key: ":dash:", value: "💨" },
        { key: ":ear:", value: "👂" },
        { key: ":eyes:", value: "👀" },
        { key: ":nose:", value: "👃" },
        { key: ":tongue:", value: "👅" },
        { key: ":lips:", value: "👄" },
        { key: ":+1:", value: "👍" },
        { key: ":thumbsup:", value: "👍" },
        { key: ":-1:", value: "👎" },
        { key: ":thumbsdown:", value: "👎" },
        { key: ":ok_hand:", value: "👌" },
        { key: ":facepunch:", value: "👊" },
        { key: ":punch:", value: "👊" },
        { key: ":fist:", value: "✊" },
        { key: ":v:", value: "✌️" },
        { key: ":wave:", value: "👋" },
        { key: ":hand:", value: "✋" },
        { key: ":raised_hand:", value: "✋" },
        { key: ":open_hands:", value: "👐" },
        { key: ":point_up_2:", value: "👆" },
        { key: ":point_down:", value: "👇" },
        { key: ":point_right:", value: "👉" },
        { key: ":point_left:", value: "👈" },
        { key: ":raised_hands:", value: "🙌" },
        { key: ":pray:", value: "🙏" },
        { key: ":point_up:", value: "☝️" },
        { key: ":clap:", value: "👏" },
        { key: ":muscle:", value: "💪" },
        { key: ":walking:", value: "🚶" },
        { key: ":runner:", value: "🏃" },
        { key: ":running:", value: "🏃" },
        { key: ":dancer:", value: "💃" },
        { key: ":couple:", value: "👫" },
        { key: ":family:", value: "👪" },
        { key: ":two_men_holding_hands:", value: "👬" },
        { key: ":two_women_holding_hands:", value: "👭" },
        { key: ":couplekiss:", value: "💏" },
        { key: ":couple_with_heart:", value: "💑" },
        { key: ":dancers:", value: "👯" },
        { key: ":ok_woman:", value: "🙆" },
        { key: ":no_good:", value: "🙅" },
        { key: ":information_desk_person:", value: "💁" },
        { key: ":raising_hand:", value: "🙋" },
        { key: ":massage:", value: "💆" },
        { key: ":haircut:", value: "💇" },
        { key: ":nail_care:", value: "💅" },
        { key: ":bride_with_veil:", value: "👰" },
        { key: ":person_with_pouting_face:", value: "🙎" },
        { key: ":person_frowning:", value: "🙍" },
        { key: ":bow:", value: "🙇" },
        { key: ":tophat:", value: "🎩" },
        { key: ":crown:", value: "👑" },
        { key: ":womans_hat:", value: "👒" },
        { key: ":athletic_shoe:", value: "👟" },
        { key: ":mans_shoe:", value: "👞" },
        { key: ":shoe:", value: "👞" },
        { key: ":sandal:", value: "👡" },
        { key: ":high_heel:", value: "👠" },
        { key: ":boot:", value: "👢" },
        { key: ":shirt:", value: "👕" },
        { key: ":tshirt:", value: "👕" },
        { key: ":necktie:", value: "👔" },
        { key: ":womans_clothes:", value: "👚" },
        { key: ":dress:", value: "👗" },
        { key: ":running_shirt_with_sash:", value: "🎽" },
        { key: ":jeans:", value: "👖" },
        { key: ":kimono:", value: "👘" },
        { key: ":bikini:", value: "👙" },
        { key: ":briefcase:", value: "💼" },
        { key: ":handbag:", value: "👜" },
        { key: ":pouch:", value: "👝" },
        { key: ":purse:", value: "👛" },
        { key: ":eyeglasses:", value: "👓" },
        { key: ":ribbon:", value: "🎀" },
        { key: ":closed_umbrella:", value: "🌂" },
        { key: ":lipstick:", value: "💄" },
        { key: ":yellow_heart:", value: "💛" },
        { key: ":blue_heart:", value: "💙" },
        { key: ":purple_heart:", value: "💜" },
        { key: ":green_heart:", value: "💚" },
        { key: ":heart:", value: "❤️" },
        { key: ":broken_heart:", value: "💔" },
        { key: ":heartpulse:", value: "💗" },
        { key: ":heartbeat:", value: "💓" },
        { key: ":two_hearts:", value: "💕" },
        { key: ":sparkling_heart:", value: "💖" },
        { key: ":revolving_hearts:", value: "💞" },
        { key: ":cupid:", value: "💘" },
        { key: ":love_letter:", value: "💌" },
        { key: ":kiss:", value: "💋" },
        { key: ":ring:", value: "💍" },
        { key: ":gem:", value: "💎" },
        { key: ":bust_in_silhouette:", value: "👤" },
        { key: ":busts_in_silhouette:", value: "👥" },
        { key: ":speech_balloon:", value: "💬" },
        { key: ":footprints:", value: "👣" },
        { key: ":thought_balloon:", value: "💭" },
        { key: ":dog:", value: "🐶" },
        { key: ":wolf:", value: "🐺" },
        { key: ":cat:", value: "🐱" },
        { key: ":mouse:", value: "🐭" },
        { key: ":hamster:", value: "🐹" },
        { key: ":rabbit:", value: "🐰" },
        { key: ":frog:", value: "🐸" },
        { key: ":tiger:", value: "🐯" },
        { key: ":koala:", value: "🐨" },
        { key: ":bear:", value: "🐻" },
        { key: ":pig:", value: "🐷" },
        { key: ":pig_nose:", value: "🐽" },
        { key: ":cow:", value: "🐮" },
        { key: ":boar:", value: "🐗" },
        { key: ":monkey_face:", value: "🐵" },
        { key: ":monkey:", value: "🐒" },
        { key: ":horse:", value: "🐴" },
        { key: ":sheep:", value: "🐑" },
        { key: ":elephant:", value: "🐘" },
        { key: ":panda_face:", value: "🐼" },
        { key: ":penguin:", value: "🐧" },
        { key: ":bird:", value: "🐦" },
        { key: ":baby_chick:", value: "🐤" },
        { key: ":hatched_chick:", value: "🐥" },
        { key: ":hatching_chick:", value: "🐣" },
        { key: ":chicken:", value: "🐔" },
        { key: ":snake:", value: "🐍" },
        { key: ":turtle:", value: "🐢" },
        { key: ":bug:", value: "🐛" },
        { key: ":bee:", value: "🐝" },
        { key: ":honeybee:", value: "🐝" },
        { key: ":ant:", value: "🐜" },
        { key: ":beetle:", value: "🐞" },
        { key: ":snail:", value: "🐌" },
        { key: ":octopus:", value: "🐙" },
        { key: ":shell:", value: "🐚" },
        { key: ":tropical_fish:", value: "🐠" },
        { key: ":fish:", value: "🐟" },
        { key: ":dolphin:", value: "🐬" },
        { key: ":flipper:", value: "🐬" },
        { key: ":whale:", value: "🐳" },
        { key: ":whale2:", value: "🐋" },
        { key: ":cow2:", value: "🐄" },
        { key: ":ram:", value: "🐏" },
        { key: ":rat:", value: "🐀" },
        { key: ":water_buffalo:", value: "🐃" },
        { key: ":tiger2:", value: "🐅" },
        { key: ":rabbit2:", value: "🐇" },
        { key: ":dragon:", value: "🐉" },
        { key: ":racehorse:", value: "🐎" },
        { key: ":goat:", value: "🐐" },
        { key: ":rooster:", value: "🐓" },
        { key: ":dog2:", value: "🐕" },
        { key: ":pig2:", value: "🐖" },
        { key: ":mouse2:", value: "🐁" },
        { key: ":ox:", value: "🐂" },
        { key: ":dragon_face:", value: "🐲" },
        { key: ":blowfish:", value: "🐡" },
        { key: ":crocodile:", value: "🐊" },
        { key: ":camel:", value: "🐫" },
        { key: ":dromedary_camel:", value: "🐪" },
        { key: ":leopard:", value: "🐆" },
        { key: ":cat2:", value: "🐈" },
        { key: ":poodle:", value: "🐩" },
        { key: ":feet:", value: "🐾" },
        { key: ":paw_prints:", value: "🐾" },
        { key: ":bouquet:", value: "💐" },
        { key: ":cherry_blossom:", value: "🌸" },
        { key: ":tulip:", value: "🌷" },
        { key: ":four_leaf_clover:", value: "🍀" },
        { key: ":rose:", value: "🌹" },
        { key: ":sunflower:", value: "🌻" },
        { key: ":hibiscus:", value: "🌺" },
        { key: ":maple_leaf:", value: "🍁" },
        { key: ":leaves:", value: "🍃" },
        { key: ":fallen_leaf:", value: "🍂" },
        { key: ":herb:", value: "🌿" },
        { key: ":ear_of_rice:", value: "🌾" },
        { key: ":mushroom:", value: "🍄" },
        { key: ":cactus:", value: "🌵" },
        { key: ":palm_tree:", value: "🌴" },
        { key: ":evergreen_tree:", value: "🌲" },
        { key: ":deciduous_tree:", value: "🌳" },
        { key: ":chestnut:", value: "🌰" },
        { key: ":seedling:", value: "🌱" },
        { key: ":blossom:", value: "🌼" },
        { key: ":globe_with_meridians:", value: "🌐" },
        { key: ":sun_with_face:", value: "🌞" },
        { key: ":full_moon_with_face:", value: "🌝" },
        { key: ":new_moon_with_face:", value: "🌚" },
        { key: ":new_moon:", value: "🌑" },
        { key: ":waxing_crescent_moon:", value: "🌒" },
        { key: ":first_quarter_moon:", value: "🌓" },
        { key: ":moon:", value: "🌔" },
        { key: ":waxing_gibbous_moon:", value: "🌔" },
        { key: ":full_moon:", value: "🌕" },
        { key: ":waning_gibbous_moon:", value: "🌖" },
        { key: ":last_quarter_moon:", value: "🌗" },
        { key: ":waning_crescent_moon:", value: "🌘" },
        { key: ":last_quarter_moon_with_face:", value: "🌜" },
        { key: ":first_quarter_moon_with_face:", value: "🌛" },
        { key: ":crescent_moon:", value: "🌙" },
        { key: ":earth_africa:", value: "🌍" },
        { key: ":earth_americas:", value: "🌎" },
        { key: ":earth_asia:", value: "🌏" },
        { key: ":volcano:", value: "🌋" },
        { key: ":milky_way:", value: "🌌" },
        { key: ":stars:", value: "🌠" },
        { key: ":star:", value: "⭐" },
        { key: ":sunny:", value: "☀️" },
        { key: ":partly_sunny:", value: "⛅" },
        { key: ":cloud:", value: "☁️" },
        { key: ":zap:", value: "⚡" },
        { key: ":umbrella:", value: "☔" },
        { key: ":snowflake:", value: "❄️" },
        { key: ":snowman:", value: "⛄" },
        { key: ":cyclone:", value: "🌀" },
        { key: ":foggy:", value: "🌁" },
        { key: ":rainbow:", value: "🌈" },
        { key: ":ocean:", value: "🌊" },
        { key: ":bamboo:", value: "🎍" },
        { key: ":gift_heart:", value: "💝" },
        { key: ":dolls:", value: "🎎" },
        { key: ":school_satchel:", value: "🎒" },
        { key: ":mortar_board:", value: "🎓" },
        { key: ":flags:", value: "🎏" },
        { key: ":fireworks:", value: "🎆" },
        { key: ":sparkler:", value: "🎇" },
        { key: ":wind_chime:", value: "🎐" },
        { key: ":rice_scene:", value: "🎑" },
        { key: ":jack_o_lantern:", value: "🎃" },
        { key: ":ghost:", value: "👻" },
        { key: ":santa:", value: "🎅" },
        { key: ":christmas_tree:", value: "🎄" },
        { key: ":gift:", value: "🎁" },
        { key: ":tanabata_tree:", value: "🎋" },
        { key: ":tada:", value: "🎉" },
        { key: ":confetti_ball:", value: "🎊" },
        { key: ":balloon:", value: "🎈" },
        { key: ":crossed_flags:", value: "🎌" },
        { key: ":crystal_ball:", value: "🔮" },
        { key: ":movie_camera:", value: "🎥" },
        { key: ":camera:", value: "📷" },
        { key: ":video_camera:", value: "📹" },
        { key: ":vhs:", value: "📼" },
        { key: ":cd:", value: "💿" },
        { key: ":dvd:", value: "📀" },
        { key: ":minidisc:", value: "💽" },
        { key: ":floppy_disk:", value: "💾" },
        { key: ":computer:", value: "💻" },
        { key: ":iphone:", value: "📱" },
        { key: ":phone:", value: "☎️" },
        { key: ":telephone:", value: "☎️" },
        { key: ":telephone_receiver:", value: "📞" },
        { key: ":pager:", value: "📟" },
        { key: ":fax:", value: "📠" },
        { key: ":satellite:", value: "📡" },
        { key: ":tv:", value: "📺" },
        { key: ":radio:", value: "📻" },
        { key: ":loud_sound:", value: "🔊" },
        { key: ":sound:", value: "🔉" },
        { key: ":speaker:", value: "🔈" },
        { key: ":mute:", value: "🔇" },
        { key: ":bell:", value: "🔔" },
        { key: ":no_bell:", value: "🔕" },
        { key: ":loudspeaker:", value: "📢" },
        { key: ":mega:", value: "📣" },
        { key: ":hourglass_flowing_sand:", value: "⏳" },
        { key: ":hourglass:", value: "⌛" },
        { key: ":alarm_clock:", value: "⏰" },
        { key: ":watch:", value: "⌚" },
        { key: ":unlock:", value: "🔓" },
        { key: ":lock:", value: "🔒" },
        { key: ":lock_with_ink_pen:", value: "🔏" },
        { key: ":closed_lock_with_key:", value: "🔐" },
        { key: ":key:", value: "🔑" },
        { key: ":mag_right:", value: "🔎" },
        { key: ":bulb:", value: "💡" },
        { key: ":flashlight:", value: "🔦" },
        { key: ":high_brightness:", value: "🔆" },
        { key: ":low_brightness:", value: "🔅" },
        { key: ":electric_plug:", value: "🔌" },
        { key: ":battery:", value: "🔋" },
        { key: ":mag:", value: "🔍" },
        { key: ":bathtub:", value: "🛁" },
        { key: ":bath:", value: "🛀" },
        { key: ":shower:", value: "🚿" },
        { key: ":toilet:", value: "🚽" },
        { key: ":wrench:", value: "🔧" },
        { key: ":nut_and_bolt:", value: "🔩" },
        { key: ":hammer:", value: "🔨" },
        { key: ":door:", value: "🚪" },
        { key: ":smoking:", value: "🚬" },
        { key: ":bomb:", value: "💣" },
        { key: ":gun:", value: "🔫" },
        { key: ":hocho:", value: "🔪" },
        { key: ":knife:", value: "🔪" },
        { key: ":pill:", value: "💊" },
        { key: ":syringe:", value: "💉" },
        { key: ":moneybag:", value: "💰" },
        { key: ":yen:", value: "💴" },
        { key: ":dollar:", value: "💵" },
        { key: ":pound:", value: "💷" },
        { key: ":euro:", value: "💶" },
        { key: ":credit_card:", value: "💳" },
        { key: ":money_with_wings:", value: "💸" },
        { key: ":calling:", value: "📲" },
        { key: ":e-mail:", value: "📧" },
        { key: ":inbox_tray:", value: "📥" },
        { key: ":outbox_tray:", value: "📤" },
        { key: ":email:", value: "✉️" },
        { key: ":envelope:", value: "✉️" },
        { key: ":envelope_with_arrow:", value: "📩" },
        { key: ":incoming_envelope:", value: "📨" },
        { key: ":postal_horn:", value: "📯" },
        { key: ":mailbox:", value: "📫" },
        { key: ":mailbox_closed:", value: "📪" },
        { key: ":mailbox_with_mail:", value: "📬" },
        { key: ":mailbox_with_no_mail:", value: "📭" },
        { key: ":postbox:", value: "📮" },
        { key: ":package:", value: "📦" },
        { key: ":memo:", value: "📝" },
        { key: ":pencil:", value: "📝" },
        { key: ":page_facing_up:", value: "📄" },
        { key: ":page_with_curl:", value: "📃" },
        { key: ":bookmark_tabs:", value: "📑" },
        { key: ":bar_chart:", value: "📊" },
        { key: ":chart_with_upwards_trend:", value: "📈" },
        { key: ":chart_with_downwards_trend:", value: "📉" },
        { key: ":scroll:", value: "📜" },
        { key: ":clipboard:", value: "📋" },
        { key: ":date:", value: "📅" },
        { key: ":calendar:", value: "📆" },
        { key: ":card_index:", value: "📇" },
        { key: ":file_folder:", value: "📁" },
        { key: ":open_file_folder:", value: "📂" },
        { key: ":scissors:", value: "✂️" },
        { key: ":pushpin:", value: "📌" },
        { key: ":paperclip:", value: "📎" },
        { key: ":black_nib:", value: "✒️" },
        { key: ":pencil2:", value: "✏️" },
        { key: ":straight_ruler:", value: "📏" },
        { key: ":triangular_ruler:", value: "📐" },
        { key: ":closed_book:", value: "📕" },
        { key: ":green_book:", value: "📗" },
        { key: ":blue_book:", value: "📘" },
        { key: ":orange_book:", value: "📙" },
        { key: ":notebook:", value: "📓" },
        { key: ":notebook_with_decorative_cover:", value: "📔" },
        { key: ":ledger:", value: "📒" },
        { key: ":books:", value: "📚" },
        { key: ":book:", value: "📖" },
        { key: ":open_book:", value: "📖" },
        { key: ":bookmark:", value: "🔖" },
        { key: ":name_badge:", value: "📛" },
        { key: ":microscope:", value: "🔬" },
        { key: ":telescope:", value: "🔭" },
        { key: ":newspaper:", value: "📰" },
        { key: ":art:", value: "🎨" },
        { key: ":clapper:", value: "🎬" },
        { key: ":microphone:", value: "🎤" },
        { key: ":headphones:", value: "🎧" },
        { key: ":musical_score:", value: "🎼" },
        { key: ":musical_note:", value: "🎵" },
        { key: ":notes:", value: "🎶" },
        { key: ":musical_keyboard:", value: "🎹" },
        { key: ":violin:", value: "🎻" },
        { key: ":trumpet:", value: "🎺" },
        { key: ":saxophone:", value: "🎷" },
        { key: ":guitar:", value: "🎸" },
        { key: ":space_invader:", value: "👾" },
        { key: ":video_game:", value: "🎮" },
        { key: ":black_joker:", value: "🃏" },
        { key: ":flower_playing_cards:", value: "🎴" },
        { key: ":mahjong:", value: "🀄" },
        { key: ":game_die:", value: "🎲" },
        { key: ":dart:", value: "🎯" },
        { key: ":football:", value: "🏈" },
        { key: ":basketball:", value: "🏀" },
        { key: ":soccer:", value: "⚽" },
        { key: ":baseball:", value: "⚾️" },
        { key: ":tennis:", value: "🎾" },
        { key: ":8ball:", value: "🎱" },
        { key: ":rugby_football:", value: "🏉" },
        { key: ":bowling:", value: "🎳" },
        { key: ":golf:", value: "⛳" },
        { key: ":mountain_bicyclist:", value: "🚵" },
        { key: ":bicyclist:", value: "🚴" },
        { key: ":checkered_flag:", value: "🏁" },
        { key: ":horse_racing:", value: "🏇" },
        { key: ":trophy:", value: "🏆" },
        { key: ":ski:", value: "🎿" },
        { key: ":snowboarder:", value: "🏂" },
        { key: ":swimmer:", value: "🏊" },
        { key: ":surfer:", value: "🏄" },
        { key: ":fishing_pole_and_fish:", value: "🎣" },
        { key: ":coffee:", value: "☕" },
        { key: ":tea:", value: "🍵" },
        { key: ":sake:", value: "🍶" },
        { key: ":baby_bottle:", value: "🍼" },
        { key: ":beer:", value: "🍺" },
        { key: ":beers:", value: "🍻" },
        { key: ":cocktail:", value: "🍸" },
        { key: ":tropical_drink:", value: "🍹" },
        { key: ":wine_glass:", value: "🍷" },
        { key: ":fork_and_knife:", value: "🍴" },
        { key: ":pizza:", value: "🍕" },
        { key: ":hamburger:", value: "🍔" },
        { key: ":fries:", value: "🍟" },
        { key: ":poultry_leg:", value: "🍗" },
        { key: ":meat_on_bone:", value: "🍖" },
        { key: ":spaghetti:", value: "🍝" },
        { key: ":curry:", value: "🍛" },
        { key: ":fried_shrimp:", value: "🍤" },
        { key: ":bento:", value: "🍱" },
        { key: ":sushi:", value: "🍣" },
        { key: ":fish_cake:", value: "🍥" },
        { key: ":rice_ball:", value: "🍙" },
        { key: ":rice_cracker:", value: "🍘" },
        { key: ":rice:", value: "🍚" },
        { key: ":ramen:", value: "🍜" },
        { key: ":stew:", value: "🍲" },
        { key: ":oden:", value: "🍢" },
        { key: ":dango:", value: "🍡" },
        { key: ":egg:", value: "🍳" },
        { key: ":bread:", value: "🍞" },
        { key: ":doughnut:", value: "🍩" },
        { key: ":custard:", value: "🍮" },
        { key: ":icecream:", value: "🍦" },
        { key: ":ice_cream:", value: "🍨" },
        { key: ":shaved_ice:", value: "🍧" },
        { key: ":birthday:", value: "🎂" },
        { key: ":cake:", value: "🍰" },
        { key: ":cookie:", value: "🍪" },
        { key: ":chocolate_bar:", value: "🍫" },
        { key: ":candy:", value: "🍬" },
        { key: ":lollipop:", value: "🍭" },
        { key: ":honey_pot:", value: "🍯" },
        { key: ":apple:", value: "🍎" },
        { key: ":green_apple:", value: "🍏" },
        { key: ":tangerine:", value: "🍊" },
        { key: ":lemon:", value: "🍋" },
        { key: ":cherries:", value: "🍒" },
        { key: ":grapes:", value: "🍇" },
        { key: ":watermelon:", value: "🍉" },
        { key: ":strawberry:", value: "🍓" },
        { key: ":peach:", value: "🍑" },
        { key: ":melon:", value: "🍈" },
        { key: ":banana:", value: "🍌" },
        { key: ":pear:", value: "🍐" },
        { key: ":pineapple:", value: "🍍" },
        { key: ":sweet_potato:", value: "🍠" },
        { key: ":eggplant:", value: "🍆" },
        { key: ":tomato:", value: "🍅" },
        { key: ":corn:", value: "🌽" },
        { key: ":house:", value: "🏠" },
        { key: ":house_with_garden:", value: "🏡" },
        { key: ":school:", value: "🏫" },
        { key: ":office:", value: "🏢" },
        { key: ":post_office:", value: "🏣" },
        { key: ":hospital:", value: "🏥" },
        { key: ":bank:", value: "🏦" },
        { key: ":convenience_store:", value: "🏪" },
        { key: ":love_hotel:", value: "🏩" },
        { key: ":hotel:", value: "🏨" },
        { key: ":wedding:", value: "💒" },
        { key: ":church:", value: "⛪" },
        { key: ":department_store:", value: "🏬" },
        { key: ":european_post_office:", value: "🏤" },
        { key: ":city_sunrise:", value: "🌇" },
        { key: ":city_sunset:", value: "🌆" },
        { key: ":japanese_castle:", value: "🏯" },
        { key: ":european_castle:", value: "🏰" },
        { key: ":tent:", value: "⛺" },
        { key: ":factory:", value: "🏭" },
        { key: ":tokyo_tower:", value: "🗼" },
        { key: ":japan:", value: "🗾" },
        { key: ":mount_fuji:", value: "🗻" },
        { key: ":sunrise_over_mountains:", value: "🌄" },
        { key: ":sunrise:", value: "🌅" },
        { key: ":night_with_stars:", value: "🌃" },
        { key: ":statue_of_liberty:", value: "🗽" },
        { key: ":bridge_at_night:", value: "🌉" },
        { key: ":carousel_horse:", value: "🎠" },
        { key: ":ferris_wheel:", value: "🎡" },
        { key: ":fountain:", value: "⛲" },
        { key: ":roller_coaster:", value: "🎢" },
        { key: ":ship:", value: "🚢" },
        { key: ":boat:", value: "⛵" },
        { key: ":sailboat:", value: "⛵" },
        { key: ":speedboat:", value: "🚤" },
        { key: ":rowboat:", value: "🚣" },
        { key: ":anchor:", value: "⚓" },
        { key: ":rocket:", value: "🚀" },
        { key: ":airplane:", value: "✈️" },
        { key: ":seat:", value: "💺" },
        { key: ":helicopter:", value: "🚁" },
        { key: ":steam_locomotive:", value: "🚂" },
        { key: ":tram:", value: "🚊" },
        { key: ":station:", value: "🚉" },
        { key: ":mountain_railway:", value: "🚞" },
        { key: ":train2:", value: "🚆" },
        { key: ":bullettrain_side:", value: "🚄" },
        { key: ":bullettrain_front:", value: "🚅" },
        { key: ":light_rail:", value: "🚈" },
        { key: ":metro:", value: "🚇" },
        { key: ":monorail:", value: "🚝" },
        { key: ":train:", value: "🚋" },
        { key: ":railway_car:", value: "🚃" },
        { key: ":trolleybus:", value: "🚎" },
        { key: ":bus:", value: "🚌" },
        { key: ":oncoming_bus:", value: "🚍" },
        { key: ":blue_car:", value: "🚙" },
        { key: ":oncoming_automobile:", value: "🚘" },
        { key: ":car:", value: "🚗" },
        { key: ":red_car:", value: "🚗" },
        { key: ":taxi:", value: "🚕" },
        { key: ":oncoming_taxi:", value: "🚖" },
        { key: ":articulated_lorry:", value: "🚛" },
        { key: ":truck:", value: "🚚" },
        { key: ":rotating_light:", value: "🚨" },
        { key: ":police_car:", value: "🚓" },
        { key: ":oncoming_police_car:", value: "🚔" },
        { key: ":fire_engine:", value: "🚒" },
        { key: ":ambulance:", value: "🚑" },
        { key: ":minibus:", value: "🚐" },
        { key: ":bike:", value: "🚲" },
        { key: ":aerial_tramway:", value: "🚡" },
        { key: ":suspension_railway:", value: "🚟" },
        { key: ":mountain_cableway:", value: "🚠" },
        { key: ":tractor:", value: "🚜" },
        { key: ":barber:", value: "💈" },
        { key: ":busstop:", value: "🚏" },
        { key: ":ticket:", value: "🎫" },
        { key: ":vertical_traffic_light:", value: "🚦" },
        { key: ":traffic_light:", value: "🚥" },
        { key: ":warning:", value: "⚠️" },
        { key: ":construction:", value: "🚧" },
        { key: ":beginner:", value: "🔰" },
        { key: ":fuelpump:", value: "⛽" },
        { key: ":izakaya_lantern:", value: "🏮" },
        { key: ":lantern:", value: "🏮" },
        { key: ":slot_machine:", value: "🎰" },
        { key: ":hotsprings:", value: "♨️" },
        { key: ":moyai:", value: "🗿" },
        { key: ":circus_tent:", value: "🎪" },
        { key: ":performing_arts:", value: "🎭" },
        { key: ":round_pushpin:", value: "📍" },
        { key: ":triangular_flag_on_post:", value: "🚩" },
        { key: ":jp:", value: "🇯🇵" },
        { key: ":kr:", value: "🇰🇷" },
        { key: ":de:", value: "🇩🇪" },
        { key: ":cn:", value: "🇨🇳" },
        { key: ":us:", value: "🇺🇸" },
        { key: ":fr:", value: "🇫🇷" },
        { key: ":es:", value: "🇪🇸" },
        { key: ":it:", value: "🇮🇹" },
        { key: ":ru:", value: "🇷🇺" },
        { key: ":gb:", value: "🇬🇧" },
        { key: ":uk:", value: "🇬🇧" },
        { key: ":one:", value: "1️⃣" },
        { key: ":two:", value: "2️⃣" },
        { key: ":three:", value: "3️⃣" },
        { key: ":four:", value: "4️⃣" },
        { key: ":five:", value: "5️⃣" },
        { key: ":six:", value: "6️⃣" },
        { key: ":seven:", value: "7️⃣" },
        { key: ":eight:", value: "8️⃣" },
        { key: ":nine:", value: "9️⃣" },
        { key: ":zero:", value: "0️⃣" },
        { key: ":keycap_ten:", value: "🔟" },
        { key: ":hash:", value: "#️⃣" },
        { key: ":symbols:", value: "🔣" },
        { key: ":arrow_up:", value: "⬆️" },
        { key: ":arrow_down:", value: "⬇️" },
        { key: ":arrow_left:", value: "⬅️" },
        { key: ":arrow_right:", value: "➡️" },
        { key: ":capital_abcd:", value: "🔠" },
        { key: ":abcd:", value: "🔡" },
        { key: ":abc:", value: "🔤" },
        { key: ":arrow_upper_right:", value: "↗️" },
        { key: ":arrow_upper_left:", value: "↖️" },
        { key: ":arrow_lower_right:", value: "↘️" },
        { key: ":arrow_lower_left:", value: "↙️" },
        { key: ":left_right_arrow:", value: "↔️" },
        { key: ":arrow_up_down:", value: "↕️" },
        { key: ":arrows_counterclockwise:", value: "🔄" },
        { key: ":arrow_backward:", value: "◀️" },
        { key: ":arrow_forward:", value: "▶️" },
        { key: ":arrow_up_small:", value: "🔼" },
        { key: ":arrow_down_small:", value: "🔽" },
        { key: ":leftwards_arrow_with_hook:", value: "↩️" },
        { key: ":arrow_right_hook:", value: "↪️" },
        { key: ":information_source:", value: "ℹ️" },
        { key: ":rewind:", value: "⏪" },
        { key: ":fast_forward:", value: "⏩" },
        { key: ":arrow_double_up:", value: "⏫" },
        { key: ":arrow_double_down:", value: "⏬" },
        { key: ":arrow_heading_down:", value: "⤵️" },
        { key: ":arrow_heading_up:", value: "⤴️" },
        { key: ":ok:", value: "🆗" },
        { key: ":twisted_rightwards_arrows:", value: "🔀" },
        { key: ":repeat:", value: "🔁" },
        { key: ":repeat_one:", value: "🔂" },
        { key: ":new:", value: "🆕" },
        { key: ":up:", value: "🆙" },
        { key: ":cool:", value: "🆒" },
        { key: ":free:", value: "🆓" },
        { key: ":ng:", value: "🆖" },
        { key: ":signal_strength:", value: "📶" },
        { key: ":cinema:", value: "🎦" },
        { key: ":koko:", value: "🈁" },
        { key: ":u6307:", value: "🈯" },
        { key: ":u7a7a:", value: "🈳" },
        { key: ":u6e80:", value: "🈵" },
        { key: ":u5408:", value: "🈴" },
        { key: ":u7981:", value: "🈲" },
        { key: ":ideograph_advantage:", value: "🉐" },
        { key: ":u5272:", value: "🈹" },
        { key: ":u55b6:", value: "🈺" },
        { key: ":u6709:", value: "🈶" },
        { key: ":u7121:", value: "🈚" },
        { key: ":restroom:", value: "🚻" },
        { key: ":mens:", value: "🚹" },
        { key: ":womens:", value: "🚺" },
        { key: ":baby_symbol:", value: "🚼" },
        { key: ":wc:", value: "🚾" },
        { key: ":potable_water:", value: "🚰" },
        { key: ":put_litter_in_its_place:", value: "🚮" },
        { key: ":parking:", value: "🅿️" },
        { key: ":wheelchair:", value: "♿" },
        { key: ":no_smoking:", value: "🚭" },
        { key: ":u6708:", value: "🈷️" },
        { key: ":u7533:", value: "🈸" },
        { key: ":sa:", value: "🈂️" },
        { key: ":m:", value: "Ⓜ️" },
        { key: ":passport_control:", value: "🛂" },
        { key: ":baggage_claim:", value: "🛄" },
        { key: ":left_luggage:", value: "🛅" },
        { key: ":customs:", value: "🛃" },
        { key: ":accept:", value: "🉑" },
        { key: ":secret:", value: "㊙️" },
        { key: ":congratulations:", value: "㊗️" },
        { key: ":cl:", value: "🆑" },
        { key: ":sos:", value: "🆘" },
        { key: ":id:", value: "🆔" },
        { key: ":no_entry_sign:", value: "🚫" },
        { key: ":underage:", value: "🔞" },
        { key: ":no_mobile_phones:", value: "📵" },
        { key: ":do_not_litter:", value: "🚯" },
        { key: ":non-potable_water:", value: "🚱" },
        { key: ":no_bicycles:", value: "🚳" },
        { key: ":no_pedestrians:", value: "🚷" },
        { key: ":children_crossing:", value: "🚸" },
        { key: ":no_entry:", value: "⛔" },
        { key: ":eight_spoked_asterisk:", value: "✳️" },
        { key: ":sparkle:", value: "❇️" },
        { key: ":negative_squared_cross_mark:", value: "❎" },
        { key: ":white_check_mark:", value: "✅" },
        { key: ":eight_pointed_black_star:", value: "✴️" },
        { key: ":heart_decoration:", value: "💟" },
        { key: ":vs:", value: "🆚" },
        { key: ":vibration_mode:", value: "📳" },
        { key: ":mobile_phone_off:", value: "📴" },
        { key: ":a:", value: "🅰️" },
        { key: ":b:", value: "🅱️" },
        { key: ":ab:", value: "🆎" },
        { key: ":o2:", value: "🅾️" },
        { key: ":diamond_shape_with_a_dot_inside:", value: "💠" },
        { key: ":loop:", value: "➿" },
        { key: ":recycle:", value: "♻️" },
        { key: ":aries:", value: "♈" },
        { key: ":taurus:", value: "♉" },
        { key: ":gemini:", value: "♊" },
        { key: ":cancer:", value: "♋" },
        { key: ":leo:", value: "♌" },
        { key: ":virgo:", value: "♍" },
        { key: ":libra:", value: "♎" },
        { key: ":scorpius:", value: "♏" },
        { key: ":sagittarius:", value: "♐" },
        { key: ":capricorn:", value: "♑" },
        { key: ":aquarius:", value: "♒" },
        { key: ":pisces:", value: "♓" },
        { key: ":ophiuchus:", value: "⛎" },
        { key: ":six_pointed_star:", value: "🔯" },
        { key: ":atm:", value: "🏧" },
        { key: ":chart:", value: "💹" },
        { key: ":heavy_dollar_sign:", value: "💲" },
        { key: ":currency_exchange:", value: "💱" },
        { key: ":copyright:", value: "©️" },
        { key: ":registered:", value: "®️" },
        { key: ":tm:", value: "™️" },
        { key: ":x:", value: "❌" },
        { key: ":bangbang:", value: "‼️" },
        { key: ":interrobang:", value: "⁉️" },
        { key: ":exclamation:", value: "❗" },
        { key: ":heavy_exclamation_mark:", value: "❗" },
        { key: ":question:", value: "❓" },
        { key: ":grey_exclamation:", value: "❕" },
        { key: ":grey_question:", value: "❔" },
        { key: ":o:", value: "⭕" },
        { key: ":top:", value: "🔝" },
        { key: ":end:", value: "🔚" },
        { key: ":back:", value: "🔙" },
        { key: ":on:", value: "🔛" },
        { key: ":soon:", value: "🔜" },
        { key: ":arrows_clockwise:", value: "🔃" },
        { key: ":clock12:", value: "🕛" },
        { key: ":clock1230:", value: "🕧" },
        { key: ":clock1:", value: "🕐" },
        { key: ":clock130:", value: "🕜" },
        { key: ":clock2:", value: "🕑" },
        { key: ":clock230:", value: "🕝" },
        { key: ":clock3:", value: "🕒" },
        { key: ":clock330:", value: "🕞" },
        { key: ":clock4:", value: "🕓" },
        { key: ":clock430:", value: "🕟" },
        { key: ":clock5:", value: "🕔" },
        { key: ":clock530:", value: "🕠" },
        { key: ":clock6:", value: "🕕" },
        { key: ":clock7:", value: "🕖" },
        { key: ":clock8:", value: "🕗" },
        { key: ":clock9:", value: "🕘" },
        { key: ":clock10:", value: "🕙" },
        { key: ":clock11:", value: "🕚" },
        { key: ":clock630:", value: "🕡" },
        { key: ":clock730:", value: "🕢" },
        { key: ":clock830:", value: "🕣" },
        { key: ":clock930:", value: "🕤" },
        { key: ":clock1030:", value: "🕥" },
        { key: ":clock1130:", value: "🕦" },
        { key: ":heavy_multiplication_x:", value: "✖️" },
        { key: ":heavy_plus_sign:", value: "➕" },
        { key: ":heavy_minus_sign:", value: "➖" },
        { key: ":heavy_division_sign:", value: "➗" },
        { key: ":spades:", value: "♠️" },
        { key: ":hearts:", value: "♥️" },
        { key: ":clubs:", value: "♣️" },
        { key: ":diamonds:", value: "♦️" },
        { key: ":white_flower:", value: "💮" },
        { key: ":heavy_check_mark:", value: "✔️" },
        { key: ":ballot_box_with_check:", value: "☑️" },
        { key: ":radio_button:", value: "🔘" },
        { key: ":link:", value: "🔗" },
        { key: ":curly_loop:", value: "➰" },
        { key: ":wavy_dash:", value: "〰️" },
        { key: ":part_alternation_mark:", value: "〽️" },
        { key: ":trident:", value: "🔱" },
        { key: ":black_medium_square:", value: "◼️" },
        { key: ":white_medium_square:", value: "◻️" },
        { key: ":black_medium_small_square:", value: "◾" },
        { key: ":white_medium_small_square:", value: "◽" },
        { key: ":black_small_square:", value: "▪️" },
        { key: ":white_small_square:", value: "▫️" },
        { key: ":small_red_triangle:", value: "🔺" },
        { key: ":black_square_button:", value: "🔲" },
        { key: ":white_square_button:", value: "🔳" },
        { key: ":black_circle:", value: "⚫" },
        { key: ":white_circle:", value: "⚪" },
        { key: ":red_circle:", value: "🔴" },
        { key: ":large_blue_circle:", value: "🔵" },
        { key: ":small_red_triangle_down:", value: "🔻" },
        { key: ":white_large_square:", value: "⬜" },
        { key: ":black_large_square:", value: "⬛" },
        { key: ":large_orange_diamond:", value: "🔶" },
        { key: ":large_blue_diamond:", value: "🔷" },
        { key: ":small_orange_diamond:", value: "🔸" },
        { key: ":small_blue_diamond:", value: "🔹" }
    ]
};

function debounce(func, wait, immediate) {
    var timeout;
    return function () {
        var context = this, args = arguments;
        var later = function () {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow)
            func.apply(context, args);
    };
};