KG_Chat_Application

Enhance the chat abilities

// ==UserScript==
// @name         KG_Chat_Application
// @namespace    klavogonki
// @version      3.5.9
// @description  Enhance the chat abilities
// @author       Patcher
// @match        *://klavogonki.ru/*
// @exclude      *://klavogonki.ru/g/?gmid=*
// @exclude      *://klavogonki.ru/chatlogs/*
// @exclude      *://klavogonki.ru/storage/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=klavogonki.ru
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(()=>{"use strict";var e={56:(e,t,n)=>{e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},72:e=>{var t=[];function n(e){for(var n=-1,r=0;r<t.length;r++)if(t[r].identifier===e){n=r;break}return n}function r(e,r){for(var a={},i=[],s=0;s<e.length;s++){var c=e[s],l=r.base?c[0]+r.base:c[0],d=a[l]||0,u="".concat(l," ").concat(d);a[l]=d+1;var p=n(u),m={css:c[1],media:c[2],sourceMap:c[3],supports:c[4],layer:c[5]};if(-1!==p)t[p].references++,t[p].updater(m);else{var h=o(m,r);r.byIndex=s,t.splice(s,0,{identifier:u,updater:h,references:1})}i.push(u)}return i}function o(e,t){var n=t.domAPI(t);n.update(e);return function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap&&t.supports===e.supports&&t.layer===e.layer)return;n.update(e=t)}else n.remove()}}e.exports=function(e,o){var a=r(e=e||[],o=o||{});return function(e){e=e||[];for(var i=0;i<a.length;i++){var s=n(a[i]);t[s].references--}for(var c=r(e,o),l=0;l<a.length;l++){var d=n(a[l]);0===t[d].references&&(t[d].updater(),t.splice(d,1))}a=c}}},113:e=>{e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},314:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",r=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),r&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),r&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,r,o,a){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(r)for(var s=0;s<this.length;s++){var c=this[s][0];null!=c&&(i[c]=!0)}for(var l=0;l<e.length;l++){var d=[].concat(e[l]);r&&i[d[0]]||(void 0!==a&&(void 0===d[5]||(d[1]="@layer".concat(d[5].length>0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=a),n&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=n):d[2]=n),o&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=o):d[4]="".concat(o)),t.push(d))}},t}},416:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,'.update-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.5);z-index:1200}.update-popup{position:fixed;top:50%;left:50%;transform:translate(-50%, -50%);background:#1e1e1e;padding:1em;border:1px solid #333 !important;border-radius:.4em !important;box-shadow:0 2px 8px rgba(0,0,0,.15) !important;color:#cdb398 !important;font-family:"Gill Sans","Gill Sans MT",Calibri,"Trebuchet MS",sans-serif;z-index:1250;max-width:400px;min-width:300px}.update-popup .update-header{margin-top:0 !important;font-size:1.5em !important;text-align:center !important;color:orange !important}.update-popup .update-script{margin:1rem 0 !important;text-align:center !important;font-size:1.2em !important;color:#4285f4 !important}.update-popup p{margin:.5rem 0;text-align:center}.update-popup p .version{font-weight:bold;color:orange !important}.update-popup .button-container{display:flex;justify-content:center;margin-top:15px}.update-popup .button-container button{padding:5px 10px !important;width:100% !important;border-radius:.2em !important;cursor:pointer !important;font-size:1rem !important;border:none !important;transition:background-color .15s !important}.update-popup .button-container button.update-later{margin-right:10px;background:#f1f1f1;border:1px solid #ccc !important}.update-popup .button-container button.update-skip{margin-right:10px;background:#fc0;color:#333}.update-popup .button-container button.update-now{background:#4285f4;color:#fff}.update-popup .button-container button:hover{opacity:.9}',""]);const s=i},540:e=>{e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},550:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,"@import url(https://fonts.googleapis.com/css2?family=Noto+Color+Emoji&display=swap);"]),i.push([e.id,"@import url(https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap);"]),i.push([e.id,"@import url(https://fonts.googleapis.com/css2?family=Iansui&family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap);"]),i.push([e.id,'#app-chat-container{border-radius:.4em .4em 0 0 !important;position:fixed;bottom:0;left:0;height:300px;background:#1e1e1e !important;border:1px solid #333 !important;display:flex;font-family:sans-serif;color:#cdb398 !important;z-index:999;min-width:320px !important;box-sizing:border-box;max-width:100vw;overflow:hidden;transition:opacity .3s ease,transform .4s cubic-bezier(0.68, -0.55, 0.265, 1.55)}#app-chat-container a{color:#82b32a !important;transition:color .15s !important}#app-chat-container a:hover{color:#95cc30 !important}#app-chat-container img{text-align:unset !important;position:unset !important;padding:unset;margin:unset;display:unset;max-width:unset}#app-chat-container .break-content{display:inline-flex !important;flex-basis:100% !important;margin:0 !important;white-space:pre-wrap !important;flex-wrap:wrap !important}#app-chat-container.maximized{position:fixed;z-index:1010}#app-chat-container:not(.visible-chat):not(.hidden-chat):not(.maximized):not(.floating-chat){display:none;opacity:0}#app-chat-container.visible-chat{transform:translateY(0) !important}#app-chat-container.hidden-chat{opacity:1;transform:translateY(calc(100% - 25px)) !important}#app-chat-container.floating-chat{border-radius:.4em !important}#app-chat-container .font-size-control{position:absolute !important;top:0 !important;left:0 !important;display:flex !important;align-items:center !important;justify-content:center !important;height:25px !important;padding:0 10px !important;gap:5px !important;z-index:6 !important}#app-chat-container .font-size-control .font-size-slider{width:80px !important;height:4px !important;-webkit-appearance:none !important;appearance:none !important;background:#333 !important;outline:none !important;border-radius:2px !important;transition:opacity .2s !important}#app-chat-container .font-size-control .font-size-slider::-webkit-slider-thumb{-webkit-appearance:none !important;appearance:none !important;width:10px !important;height:10px !important;border-radius:50% !important;background:#cdb398 !important;cursor:pointer !important}#app-chat-container .font-size-control .font-size-slider::-moz-range-thumb{width:10px !important;height:10px !important;border-radius:50% !important;background:#cdb398 !important;cursor:pointer !important;border:none !important}#app-chat-container .resize-handle{position:absolute !important;background:rgba(0,0,0,0) !important;z-index:1000 !important}#app-chat-container .resize-handle.top{top:-3px !important;left:0 !important;right:0 !important;height:6px !important;cursor:ns-resize !important}#app-chat-container .resize-handle.left{left:-3px !important;top:0 !important;bottom:0 !important;width:6px !important;cursor:ew-resize !important}#app-chat-container .resize-handle.right{right:-3px !important;top:0 !important;bottom:0 !important;width:6px !important;cursor:ew-resize !important}#app-chat-container .chat-wrapper{display:flex !important;flex-direction:row !important;flex:1 !important;min-width:320px !important;overflow:hidden !important}#app-chat-container .chat-content{margin-top:25px;background:#1e1e1e !important;display:flex !important;flex-direction:column !important;flex:1 !important;overflow:hidden !important}#app-chat-container .messages-panel{flex:1 !important;overflow-y:auto !important;overflow-x:hidden !important;padding:1em !important;display:flex;flex-direction:column !important;gap:.2em !important;scrollbar-width:thin !important;scrollbar-color:#333 #1e1e1e !important}#app-chat-container .messages-panel.keyboard-active{transition:margin-bottom .3s ease !important}#app-chat-container .messages-panel::-webkit-scrollbar,#app-chat-container .messages-panel .user-list-container::-webkit-scrollbar{width:8px !important}#app-chat-container .messages-panel::-webkit-scrollbar-thumb,#app-chat-container .messages-panel .user-list-container::-webkit-scrollbar-thumb{background-color:#333 !important}#app-chat-container .messages-panel::-webkit-scrollbar-thumb:hover,#app-chat-container .messages-panel .user-list-container::-webkit-scrollbar-thumb:hover{background-color:#444 !important}#app-chat-container .messages-panel::-webkit-scrollbar-track,#app-chat-container .messages-panel .user-list-container::-webkit-scrollbar-track{background-color:#1e1e1e !important}#app-chat-container .input-container{display:flex !important;width:100%;align-items:center !important;padding:1em !important;gap:.5em !important;border-top:1px solid #333 !important;background-color:#1e1e1e !important}#app-chat-container #message-input{outline:none !important;flex:1 !important;background:#2a2a2a !important;color:#cdb398 !important;padding:.5em !important;border-radius:.2em !important;min-width:0 !important;border:none !important;position:relative;font-family:inherit !important;line-height:normal !important;transition:font-size .2s ease !important}#app-chat-container #message-input.private-mode{background-color:rgba(255,107,107,.2196078431) !important;color:#ff6b6b !important;caret-color:#ff6b6b !important}#app-chat-container #message-input.private-mode::placeholder{color:rgba(255,107,107,.6)}#app-chat-container .length-field-popup{position:absolute !important;display:flex !important;font-size:12px !important;font-weight:bold !important;font-family:"Montserrat",Iansui,sans-serif !important;bottom:60px;transition:left 100ms ease-out !important;height:20px !important;align-items:center !important;justify-content:center !important;padding:2px 4px;opacity:0;border:none !important;z-index:101 !important}#app-chat-container .user-list-container{margin-top:25px;width:fit-content !important;min-width:180px !important;max-width:fit-content !important;overflow-y:auto !important;overflow-x:hidden !important;padding:1em !important;background:#1e1e1e !important;border-left:1px solid #333 !important;scrollbar-width:thin !important;scrollbar-color:#333 #1e1e1e !important}#app-chat-container .reveal-userlist-btn{position:absolute !important;top:50% !important;right:-1px !important;transform:translateY(-50%) !important;z-index:1000 !important;display:flex;align-items:center !important;justify-content:center !important;padding:.4em !important;background:#222 !important;font-size:18px !important;font-family:"Noto Color Emoji",sans-serif !important;font-weight:bold !important;border:1px solid #333 !important;border-radius:.4em 0 0 .4em !important;cursor:pointer !important;transition:background .2s ease,opacity .2s ease !important}#app-chat-container .reveal-userlist-btn:hover{background:#333 !important}#app-chat-container .hidden-userlist{display:flex}#app-chat-container .shown-userlist{display:none}#app-chat-container .message{padding:.2em .4em !important;display:flex;flex-direction:row;border-radius:.2em !important;width:100%;max-width:100% !important;word-break:break-word !important}#app-chat-container .message .pending-emoji{margin-left:.5em !important}#app-chat-container .message .message-text{display:inline-flex !important;flex-wrap:wrap !important}#app-chat-container .message .message-text .emoji-adjuster{font-family:"Noto Color Emoji",sans-serif !important;font-size:1.25em !important;display:inline-flex !important}#app-chat-container .message .message-text .mention{display:inline-flex !important;font-family:Montserrat !important;font-weight:500 !important;letter-spacing:.05em !important}#app-chat-container .message .message-text .md-heading{font-family:"Montserrat",sans-serif !important;margin:0 !important;padding:0 !important;color:#bf9d70 !important}#app-chat-container .message .message-text .md-heading.md-h1{font-size:1.8em !important;font-weight:bold !important}#app-chat-container .message .message-text .md-heading.md-h2{font-size:1.6em !important;font-weight:bold !important}#app-chat-container .message .message-text .md-heading.md-h3{font-size:1.4em !important;font-weight:bold !important}#app-chat-container .message .message-text .md-heading.md-h4{font-size:1.2em !important;font-weight:bold !important}#app-chat-container .message .message-text .md-heading.md-h5{font-size:1.1em !important;font-weight:bold !important}#app-chat-container .message .message-text .md-heading.md-h6{font-size:1em !important;font-weight:bold !important}#app-chat-container .message .message-text code,#app-chat-container .message .message-text .md-code{display:inline-flex !important;font-size:1em !important;font-family:"Consolas",monospace !important;background-color:#2a2a2a !important;border:1px solid #333 !important;border-radius:.2em !important;padding:.1em .2em !important;color:#82b32a !important;filter:none !important;white-space:break-spaces !important}#app-chat-container .message .message-text .md-bold{font-weight:bold !important;color:#cdb398 !important}#app-chat-container .message .message-text .md-italic{font-style:italic !important;color:#cdb398 !important}#app-chat-container .message .message-text .md-strikethrough{text-decoration:line-through !important;color:#cdb398 !important}#app-chat-container .message.banned{background-color:rgba(138,43,226,.1254901961) !important;border:1px solid rgba(138,43,226,.1882352941) !important;border-left:3px solid #8a2be2 !important;width:fit-content !important}#app-chat-container .message.banned .time{color:#8a2be2 !important}#app-chat-container .message.banned .username,#app-chat-container .message.banned .message-text{color:#b875f7 !important}#app-chat-container .message.system{background-color:rgba(255,165,0,.1254901961) !important;border:1px solid rgba(255,166,0,.1882352941) !important;border-left:3px solid orange !important;width:fit-content !important;align-items:center !important}#app-chat-container .message.system .time{margin-right:unset !important;color:rgba(255,165,0,.3764705882) !important}#app-chat-container .message.system .username{display:none !important}#app-chat-container .message.system .message-text{color:orange !important}#app-chat-container .message.private-message{width:fit-content !important}#app-chat-container .message.private-message.sent{background:rgba(0,255,0,.1254901961) !important;border:1px solid rgba(0,255,0,.1882352941) !important;border-left:3px solid lime !important}#app-chat-container .message.private-message.sent .time{color:rgba(0,255,0,.3764705882) !important}#app-chat-container .message.private-message.sent .username,#app-chat-container .message.private-message.sent .message-text{color:lime !important}#app-chat-container .message.private-message.received{background-color:rgba(255,77,77,.1254901961) !important;border:1px solid rgba(255,77,77,.1882352941) !important;border-left:3px solid #ff4d4d !important}#app-chat-container .message.private-message.received .time{color:rgba(255,77,77,.3764705882) !important}#app-chat-container .message.private-message.received .username,#app-chat-container .message.private-message.received .message-text{color:#ff4d4d !important}#app-chat-container .message-info{margin-right:1em !important;white-space:nowrap !important;height:fit-content !important}#app-chat-container .message-info .time{font-size:.9em !important;margin-right:1em !important;color:#666 !important}#app-chat-container .message-info .username{font-size:1em !important}#app-chat-container .username,#app-chat-container .time{cursor:pointer !important;transition:opacity .2s ease !important}#app-chat-container .username:hover,#app-chat-container .time:hover{opacity:.7 !important}#app-chat-container .user-item{display:flex !important;align-items:center !important;padding:.2em !important;margin-bottom:.2em !important;border-radius:.2em !important;max-width:100% !important;text-overflow:ellipsis !important}#app-chat-container .user-item .user-avatar{display:flex !important;justify-content:center !important;align-items:center !important;width:24px !important;height:24px !important;font-size:18px !important;border-radius:.1em !important;margin-right:1em !important;text-align:center !important;line-height:24px !important;flex-shrink:0 !important}#app-chat-container .user-item .user-avatar.image-avatar{cursor:pointer !important;transform-origin:left !important;transition:transform .15s ease-out !important}#app-chat-container .user-item .user-avatar.image-avatar:hover{transform:scale(2) !important}#app-chat-container .user-item .user-avatar.svg-avatar{font-family:"Noto Color Emoji",sans-serif !important}#app-chat-container .user-item .user-info{flex:1 !important;min-width:0 !important;overflow:hidden !important;text-overflow:ellipsis !important;white-space:nowrap !important}#app-chat-container .user-item .role,#app-chat-container .user-item .traffic-icon{font-family:"Noto Color Emoji",sans-serif !important}#app-chat-container .header-button{position:absolute !important;top:0 !important;width:25px !important;height:25px !important;z-index:5 !important}#app-chat-container .button{display:flex !important;align-items:center !important;justify-content:center !important;cursor:pointer !important;background-color:rgba(0,0,0,0) !important;border:none !important;outline:none !important;margin:0 !important;padding:0 !important;transition:all .15s ease-out}#app-chat-container .button:hover{filter:brightness(1.2) !important}#app-chat-container .emoji-trigger,#app-chat-container .private-mode-exit,#app-chat-container .send-button{font-family:"Noto Color Emoji",sans-serif !important;height:28px !important;width:28px !important;font-size:1.5em !important}#app-chat-container .chat-toggle-button{right:0 !important}#app-chat-container .chat-maximize-button{right:25px !important}#app-chat-container .chat-help-button{color:#82b32a !important;right:50px !important}#app-chat-container .chat-drag-area{border-radius:.4em .4em 0 0 !important;position:absolute !important;top:0 !important;left:0 !important;right:0 !important;height:25px !important;cursor:move !important;background-color:rgba(22,22,22,.8) !important}#app-chat-container .image-container .processed-image{margin-right:.5em !important}#app-chat-container .image-container .clickable-thumbnail{display:flex !important;align-items:center;opacity:1;transition:opacity .15s ease-in-out;border:none !important;max-width:150px !important;max-height:150px !important;cursor:pointer;background-color:rgba(0,0,0,0);margin:.5em .5em 0 0 !important;overflow:hidden !important;border-radius:.2em !important;box-shadow:0 0 2px rgba(0,0,0,.5) !important}#app-chat-container .image-container .clickable-thumbnail:hover{opacity:.8}#app-chat-container .image-container .clickable-thumbnail img{max-height:100% !important;max-width:100% !important;background-color:rgba(0,0,0,0);object-fit:contain}#app-chat-container .video-wrapper{display:flex;flex-direction:column}#app-chat-container .video-wrapper .processed-video{margin-bottom:.2em !important}#app-chat-container .video-wrapper .youtube-info{display:flex !important;flex-direction:column !important;margin-bottom:.2em !important;font-family:"Montserrat",sans-serif !important;font-size:.9em !important;color:#8ede87 !important;font-weight:500 !important;white-space:break-spaces !important}#app-chat-container .video-container,#app-chat-container .youtube-thumb{border-radius:.4em !important;display:flex;border:none;height:200px !important;width:356px !important}#app-chat-container .youtube-thumb{cursor:pointer !important;object-fit:cover !important}#app-chat-container .youtube-thumb:hover{filter:brightness(0.8);transition:filter .3s ease}.dimming-element{position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.5019607843);z-index:1010 !important;opacity:0;transition:opacity .3s ease}.scaled-thumbnail{top:50%;left:50%;transform-origin:center center;transform:translate(-50%, -50%) scale(1);position:fixed;opacity:0;z-index:1015 !important;max-height:90vh;max-width:90vw;cursor:pointer;border-radius:.6em !important;box-shadow:0 0 2px rgba(0,0,0,.5) !important}.delete-btn{z-index:1020 !important;padding:8px 16px;background-color:hsl(0,50%,20%);color:hsl(0,60%,70%);border:1px solid hsl(0,50%,35%);transition:all .3s;cursor:pointer;filter:brightness(1);border-radius:.2em !important}.delete-btn:hover{filter:brightness(1.5)}.toggle-button{font:bold .9em "Montserrat",sans-serif;position:absolute;top:0;right:2em;padding:8px 16px;transition:filter .3s;border-radius:0 0 .2em .2em !important;border-top:none;min-width:4em}.toggle-button.toggle-hidden{background:linear-gradient(to top, hsl(0, 50%, 20%), hsl(0, 50%, 25%));color:hsl(0,60%,70%);border-left:1px solid hsl(0,50%,35%);border-right:1px solid hsl(0,50%,35%);border-bottom:1px solid hsl(0,50%,35%)}.toggle-button.toggle-shown{background:linear-gradient(to top, hsl(30, 50%, 20%), hsl(30, 50%, 25%));color:hsl(30,60%,70%);border-left:1px solid hsl(30,50%,35%);border-right:1px solid hsl(30,50%,35%);border-bottom:1px solid hsl(30,50%,35%)}.toggle-button:hover{filter:brightness(1.5)}.toggle-button-hidden{background-color:hsl(0,20%,10%);color:hsl(0,50%,50%);border:1px solid hsl(0,50%,50%)}.toggle-button-show{background-color:hsl(90,20%,10%);color:hsl(90,50%,50%);border:1px solid hsl(90,50%,50%)}.toggle-button-hide{background-color:hsl(50,20%,10%);color:hsl(50,50%,50%);border:1px solid hsl(50,50%,50%)}.selected-message{background-clip:padding-box !important}.selected-message.message-mode{background-color:hsla(0,50%,50%,.2) !important;box-shadow:inset 0px 0px 0px 1px hsla(0,50%,50%,.4) !important}.selected-message.username-mode{background-color:hsla(145,50%,30%,.2) !important;box-shadow:inset 0px 0px 0px 1px hsla(145,50%,50%,.4) !important}.selected-message.time-mode{background-color:hsla(200,50%,30%,.2) !important;box-shadow:inset 0px 0px 0px 1px hsla(200,50%,50%,.4) !important}.shown-message{background-color:hsla(30,60%,30%,.2) !important;box-shadow:inset 0px 0px 0px 1px hsla(30,60%,50%,.4) !important;background-clip:padding-box !important}.hidden-message{display:none !important}.new-messages-separator{display:flex;align-items:center;height:1em !important}.new-messages-separator .separator-line{flex-grow:1 !important;border:none !important;border-top:1px solid rgba(255,132,0,.568627451) !important;margin:0 !important}.new-messages-separator .separator-icon{background-color:rgba(255,132,0,.2509803922) !important;border-radius:.2em !important;padding:.2em .4em !important;font-family:"Noto Color Emoji" !important}.bounce-in{animation:bounceIn 500ms forwards}.bounce-out{animation:bounceOut 500ms forwards}@keyframes bounceIn{0%{transform:translateY(0);opacity:0}50%{transform:translateY(-10px);opacity:1}100%{transform:translateY(0);opacity:1}}@keyframes bounceOut{0%{transform:translateY(0);opacity:1}50%{transform:translateY(-10px);opacity:1}100%{transform:translateY(0);opacity:0}}@media(max-width: 780px){#app-chat-container .chat-wrapper{width:100% !important;border-right:none !important}}@media screen and (max-width: 768px),(hover: none),(pointer: coarse){body{background-color:#1e1e1e !important}#app-chat-container{height:100% !important;width:100vw !important;position:fixed !important;top:0 !important;bottom:0 !important;left:0 !important;right:0 !important;min-width:100vw !important;border:none !important;border-radius:0 !important;overflow:hidden !important}#app-chat-container .resize-handle,#app-chat-container .header-button,#app-chat-container #send-button{display:none !important}body>*:not(#app-chat-container):not(.dimming-element):not(.scaled-thumbnail):not(.delete-btn):not(.toggle-button):not(.update-overlay):not(.update-popup):not(.chat-username-color-picker):not(.help-panel):not(.ignored-users-panel){display:none !important}}',""]);const s=i},601:e=>{e.exports=function(e){return e[1]}},631:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,'.ignored-users-panel{opacity:0;position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);height:fit-content;max-height:70vh;max-width:360px;min-height:50px;min-width:220px;width:fit-content;background:#1e1e1e;border:1px solid #333 !important;padding:1em;border-radius:.4em !important;box-shadow:0 2px 8px rgba(0,0,0,.15) !important;font-family:"Gill Sans","Gill Sans MT",Calibri,"Trebuchet MS",sans-serif;overflow-y:auto;overflow-x:hidden;z-index:1100}.ignored-users-panel h2{font-size:1.2em;margin:0;text-align:center;color:orange;border-bottom:1px dashed #444;padding-bottom:.6em}.ignored-users-panel .ignored-users-input-container{display:flex;position:absolute;top:0;left:0;right:0}.ignored-users-panel .ignored-users-input-container .ignored-users-input{flex:1;padding:.6em;border:none !important;border-radius:.4em 0 0 0 !important;background-color:#111;color:#cdb398;caret-color:#cdb398;outline:none !important}.ignored-users-panel .ignored-users-input-container .ignored-users-add-btn{padding:.6em;background-color:#2e6c30 !important;color:#90ee90 !important;border:none !important;outline:none !important;border-radius:0 .4em 0 0 !important;cursor:pointer;transition:background-color .3s ease}.ignored-users-panel .ignored-users-input-container .ignored-users-add-btn:hover{background-color:#38833c !important}.ignored-users-panel .ignored-users-list{margin-top:2em}.ignored-users-panel .ignored-user-entry{display:flex;align-items:center;justify-content:space-between;padding:.3em;border-bottom:1px dashed #444 !important}.ignored-users-panel .ignored-user-entry:last-child{border-bottom:none}.ignored-users-panel .ignored-user-entry .user-label{flex:1;color:#cdb398 !important}.ignored-users-panel .ignored-user-entry .remove-btn{cursor:pointer;padding:.6em;background-color:#b34a2a !important;border:none;border-radius:.2em !important;filter:brightness(1);transition:filter .3s ease,background-color .3s ease}.ignored-users-panel .ignored-user-entry .remove-btn svg{stroke:#eebc90 !important}.ignored-users-panel .ignored-user-entry .remove-btn:hover{filter:brightness(1.2)}.input-error{background-color:#8d2c2c !important;color:#ff7d7d !important;caret-color:#ff7d7d !important;transition:background-color .5s ease}',""]);const s=i},659:e=>{var t={};e.exports=function(e,n){var r=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(n)}},802:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,".shake-effect{animation:shake 500ms cubic-bezier(0.36, 0.07, 0.19, 0.97) both}@keyframes shake{0%{transform:translateX(0)}10%{transform:translateX(-4px)}20%{transform:translateX(6px)}30%{transform:translateX(-8px)}40%{transform:translateX(8px)}50%{transform:translateX(-6px)}60%{transform:translateX(5px)}70%{transform:translateX(-3px)}80%{transform:translateX(2px)}90%{transform:translateX(-1px)}100%{transform:translateX(0)}}",""]);const s=i},825:e=>{e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var r="";n.supports&&(r+="@supports (".concat(n.supports,") {")),n.media&&(r+="@media ".concat(n.media," {"));var o=void 0!==n.layer;o&&(r+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),r+=n.css,o&&(r+="}"),n.media&&(r+="}"),n.supports&&(r+="}");var a=n.sourceMap;a&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),t.styleTagTransform(r,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},860:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,'.help-panel{opacity:0;position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);height:fit-content;max-height:70vh !important;min-width:350px !important;width:fit-content;overflow-y:auto;scrollbar-width:none;background:#1e1e1e;border:1px solid #333 !important;padding:1em;border-radius:.4em !important;box-shadow:0 2px 8px rgba(0,0,0,.15) !important;color:#cdb398 !important;font-family:"Gill Sans","Gill Sans MT",Calibri,"Trebuchet MS",sans-serif;z-index:1100}.help-panel .help-header{margin-top:0;font-size:1.5em;text-align:center;color:orange !important}.help-panel .help-subheader{margin:.8em 0 .3em 1em;font-size:1.1em;color:#fc0 !important;font-weight:normal;text-align:left}.help-panel .help-section-header{margin-top:0 !important;margin-bottom:1.5em !important;font-size:1.5em !important;text-align:center;color:orange !important}.help-panel .help-section-subheader{margin:.8em 0 1.2em 1em;font-size:.9em;color:#00ff58 !important;font-weight:normal;text-align:left}.help-panel .help-list{list-style-type:none;padding-left:0}.help-panel .help-list .help-list-item{display:flex;align-items:center;flex-direction:row;padding:.3em;border-bottom:1px dashed #444 !important}.help-panel .help-list .help-list-item:last-child{border-bottom:none}.help-panel .help-list .help-list-item .help-hotkey{white-space:nowrap !important;width:fit-content;display:flex;color:#7ed4ff !important;font-family:monospace;background-color:rgba(126,212,255,.1019607843) !important;border:1px solid rgba(126,212,255,.4) !important;border-left:3px solid rgba(126,212,255,.4) !important;border-radius:0 .2em .2em 0 !important;padding:2px 4px;margin-right:1em}@media(max-width: 768px){.help-panel{top:2em !important;transform:translate(-50%, 0) !important;max-height:80vh !important}.help-panel .help-section-header{margin-bottom:1em !important;font-size:1em !important}.help-panel .help-section-subheader{margin:.5em 0 1em 1em !important;font-size:.8em !important}.help-panel .help-hotkey{margin-right:0 !important;margin-bottom:.5em !important}.help-panel .help-list-item{font-size:.9em !important;flex-direction:column !important;align-items:flex-start !important}}',""]);const s=i},957:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,'.emoji-panel{opacity:0;transition:opacity .3s ease;position:absolute !important;top:50%;left:50%;transform:translate(-50%, -50%);background:#1e1e1e !important;border:1px solid #333 !important;border-radius:.4em !important;width:380px;height:580px;display:flex;flex-direction:column;box-shadow:0 2px 8px rgba(0,0,0,.15) !important;z-index:1010}.emoji-panel .emoji-search-container{padding:1em !important;border:none !important}.emoji-panel .emoji-search-container .emoji-search{width:100%;padding:8px;border-radius:4px;background:#2a2a2a !important;border:none !important;border-radius:.2em !important;color:#cdb398 !important;caret-color:#cdb398 !important;font-size:.9em !important}.emoji-panel .emoji-search-container .emoji-search:focus{outline:none;border-color:#666}.emoji-panel .emoji-categories{position:sticky !important;top:0 !important;display:grid !important;grid-template-columns:repeat(auto-fill, minmax(32px, 1fr)) !important;padding:8px !important;border-bottom:1px solid #333 !important;gap:8px !important;justify-content:center !important;align-items:center !important;overflow-x:auto !important;scrollbar-width:thin !important}.emoji-panel .emoji-categories .emoji-category-btn{font-family:"Noto Color Emoji" !important;position:relative !important;background:none !important;border:none !important;padding:4px !important;cursor:pointer !important;font-size:1.5em !important;transition:background-color .2s;width:100% !important;height:100% !important;display:flex !important;align-items:center !important;justify-content:center !important;aspect-ratio:1 !important;border-bottom:3px solid rgba(0,0,0,0) !important}.emoji-panel .emoji-categories .emoji-category-btn.active{opacity:1;border-bottom:3px solid #daa520 !important}.emoji-panel .emoji-categories .emoji-category-btn:hover{background-color:#333}.emoji-panel .emoji-categories::-webkit-scrollbar{width:6px;height:6px}.emoji-panel .emoji-categories::-webkit-scrollbar-track{background:#1e1e1e}.emoji-panel .emoji-categories::-webkit-scrollbar-thumb{background:#444;border-radius:3px}.emoji-panel .emoji-categories::-webkit-scrollbar-thumb:hover{background:#555}.emoji-panel .emoji-container{flex:1;overflow-y:auto;overflow-x:hidden !important;display:grid !important;gap:8px !important;width:100% !important;max-width:100% !important;scrollbar-width:none !important}.emoji-panel .emoji-container .emoji-category-section{margin-bottom:10px}.emoji-panel .emoji-container .emoji-category-section .emoji-category-header{padding:8px !important;color:#cdb398 !important;font-size:.9em !important;position:sticky !important;top:0px !important;background:#1e1e1e !important;z-index:1 !important;border-bottom:1px solid #333 !important;width:100% !important;box-sizing:border-box !important;margin:0 !important}.emoji-panel .emoji-container .emoji-category-section .emoji-list{display:grid;grid-template-columns:repeat(auto-fill, minmax(32px, 1fr)) !important;padding:8px !important;gap:8px;align-content:start}.emoji-panel .emoji-container .emoji-category-section .emoji-list .emoji-btn{font-family:"Noto Color Emoji" !important;background:none;border:none;padding:4px !important;cursor:pointer;font-size:1.5em !important;transition:background-color .2s;width:100% !important;height:100% !important;display:flex !important;align-items:center !important;justify-content:center !important;aspect-ratio:1 !important}.emoji-panel .emoji-container .emoji-category-section .emoji-list .emoji-btn:hover{background-color:#333}.emoji-panel .emoji-container::-webkit-scrollbar{width:6px;height:6px}.emoji-panel .emoji-container::-webkit-scrollbar-track{background:#1e1e1e}.emoji-panel .emoji-container::-webkit-scrollbar-thumb{background:#444;border-radius:3px}.emoji-panel .emoji-container::-webkit-scrollbar-thumb:hover{background:#555}.emoji-panel .emoji-footer{border-top:1px solid #333 !important;display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:5px}.emoji-panel .emoji-footer .emoji-info-panel{height:40px !important;padding:8px !important;display:flex !important;align-items:center !important;gap:8px !important;color:#cdb398 !important;font-size:.9em !important;background:#1e1e1e !important}.emoji-panel .emoji-footer .emoji-info-panel .emoji-info-icon{font-family:"Noto Color Emoji" !important;font-size:1.5em !important}.emoji-panel .emoji-footer .emoji-info-panel .emoji-info-keywords{color:#888 !important;font-style:italic !important}.emoji-panel .emoji-footer .emoji-language-select{border-radius:.4em !important;padding:5px 10px;font-size:14px;background-color:#2a2a2a !important;border:1px solid #444 !important;color:#cdb398 !important;cursor:pointer;transition:border-color .3s ease}.emoji-panel .emoji-footer .emoji-language-select:focus{outline:none;border-color:#daa520 !important}.emoji-panel .emoji-footer .emoji-language-select:hover{border-color:#666 !important}.emoji-panel .emoji-footer .emoji-language-select option{font-size:14px;background-color:#2a2a2a !important;color:#cdb398 !important}',""]);const s=i},999:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,'.chat-username-color-picker{opacity:0;position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);height:fit-content;max-height:70vh !important;max-width:360px !important;width:fit-content;scrollbar-width:none;background:#1e1e1e;border:1px solid #333 !important;padding:1em;border-radius:.4em !important;box-shadow:0 2px 8px rgba(0,0,0,.15) !important;font-family:"Gill Sans","Gill Sans MT",Calibri,"Trebuchet MS",sans-serif;overflow-y:auto;overflow-x:hidden;z-index:1100}.chat-username-color-picker h2{font-size:1.2em !important;margin:0 !important;text-align:center !important;color:orange !important;border-bottom:1px dashed #444 !important;padding-bottom:.6em !important}.chat-username-color-picker .saved-username-colors,.chat-username-color-picker .generated-username-colors{margin-top:1em}.chat-username-color-picker .saved-username-colors h3,.chat-username-color-picker .generated-username-colors h3{font-size:1em !important;margin:.5em 0 !important;text-align:center !important;color:#00ff58 !important;border-bottom:1px dashed #444 !important;padding-bottom:.3em !important}.chat-username-color-picker .saved-username-colors h3 .counter,.chat-username-color-picker .generated-username-colors h3 .counter{font-size:.8em !important;color:orange !important;margin-left:.5em !important}.chat-username-color-picker .generated-username-colors .username-entry.disabled-entry{pointer-events:none;opacity:.2}.chat-username-color-picker .username-entry{display:flex;align-items:center;justify-content:space-between;padding:.3em;border-bottom:1px dashed #444 !important}.chat-username-color-picker .username-entry:last-child{border-bottom:none}.chat-username-color-picker .username-entry .user-label{flex:1}.chat-username-color-picker .username-entry .color-box{cursor:pointer !important;border-radius:.2em !important;margin-left:1em;padding:.6em;font-size:.8em;font-family:monospace}.chat-username-color-picker .username-entry input[type=color]{display:none !important}.chat-username-color-picker .remove-btn{cursor:pointer;display:flex;align-items:center;justify-content:center;width:25px;height:25px;border-radius:.2em !important;margin-left:8px}.chat-username-color-picker .custom-color-input{display:flex;align-items:center;background-color:#1e1e1e !important;position:absolute;left:0 !important;top:0 !important;right:0 !important}.chat-username-color-picker .custom-color-input .hex-input{padding:.6em !important;border-radius:.4em 0 0 0 !important;background-color:#111 !important;color:#cdb398 !important;caret-color:#cdb398 !important;width:100% !important;border:none !important;outline:none !important}.chat-username-color-picker .custom-color-input .confirm-btn{transition:background-color .3s ease !important;padding:.6em !important;background-color:#2e6c30 !important;color:#90ee90 !important;border:none !important;outline:none !important;border-radius:0 .4em 0 0 !important;cursor:pointer}.chat-username-color-picker .custom-color-input .confirm-btn:hover{background-color:#38833c !important}',""]);const s=i}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var a=t[r]={id:r,exports:{}};return e[r](a,a.exports,n),a.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.nc=void 0;var r=n(72),o=n.n(r),a=n(825),i=n.n(a),s=n(659),c=n.n(s),l=n(56),d=n.n(l),u=n(540),p=n.n(u),m=n(113),h=n.n(m),g=n(550),f={};f.styleTagTransform=h(),f.setAttributes=d(),f.insert=c().bind(null,"head"),f.domAPI=i(),f.insertStyleElement=p();o()(g.A,f);g.A&&g.A.locals&&g.A.locals;var y=n(957),b={};b.styleTagTransform=h(),b.setAttributes=d(),b.insert=c().bind(null,"head"),b.domAPI=i(),b.insertStyleElement=p();o()(y.A,b);y.A&&y.A.locals&&y.A.locals;var v=n(860),w={};w.styleTagTransform=h(),w.setAttributes=d(),w.insert=c().bind(null,"head"),w.domAPI=i(),w.insertStyleElement=p();o()(v.A,w);v.A&&v.A.locals&&v.A.locals;var x=n(416),k={};k.styleTagTransform=h(),k.setAttributes=d(),k.insert=c().bind(null,"head"),k.domAPI=i(),k.insertStyleElement=p();o()(x.A,k);x.A&&x.A.locals&&x.A.locals;var E=n(999),S={};S.styleTagTransform=h(),S.setAttributes=d(),S.insert=c().bind(null,"head"),S.domAPI=i(),S.insertStyleElement=p();o()(E.A,S);E.A&&E.A.locals&&E.A.locals;var C=n(631),L={};L.styleTagTransform=h(),L.setAttributes=d(),L.insert=c().bind(null,"head"),L.domAPI=i(),L.insertStyleElement=p();o()(C.A,L);C.A&&C.A.locals&&C.A.locals;var j=n(802),I={};I.styleTagTransform=h(),I.setAttributes=d(),I.insert=c().bind(null,"head"),I.domAPI=i(),I.insertStyleElement=p();o()(j.A,I);j.A&&j.A.locals&&j.A.locals;const M="https://klavogonki.ru",A=`${M}/xmpp-httpbind/`,$=3e3,T={chat:{online:"Chat connection established. ✓",offline:"Chat connection lost. Reconnecting..."},network:{online:"Network connection restored. ✓",offline:"Network connection lost."}},N=["😀","😁","😂","🤣","😃","😄","😅","😆","😉","😊","😋","😎","😏","😐","😑","😒","😓","😔","😕","😖","😗","😘","😙","😚","😜","😝","😛","🤑","🤗","🤔","🤐","🤨","😣","😥","😮","🤯","😳","😱","😨","😰","😢","🤪","😵","😲","🤤","😷","🤒","🤕","🤢","🤧","😇","🥳","🥺","😬","😴","😌","🤥","🥴","🥵","🥶","🤧","🤭","🤫","😠","😡","😳","😞","😟","😕","🐱","😺","😸","😹","😻","😼","😽","🙀","😿","😾","🐶","🐭","🐹","🐰","🦊","🐻","🐼","🐨","🐯","🦁","🐮","🐷","🐸","🐵","🙈","🙉","🙊","🐔","🦄"],z=["klavogonki.ru","youtube.com","youtu.be","imgur.com","pikabu.ru","userapi.com","ibb.co","yaplakal.com","freepik.com"],P="#1e1e1e";let B={};function H(){Object.entries(B).forEach((([e,t])=>{document.removeEventListener(e,t)}))}const q=["jpg","jpeg","png","gif","webp"],R="📷",D="🖥️",_="💀️️",U=.2,O=10,J=.1;let F=0,K=!1,X=[],Y=null;const W=e=>{const t=(e=>{try{return e.match(/\.([^?#.]+)(?:[?#]|$)/i)?.[1]?.toLowerCase()||""}catch(e){return console.error("Error extracting extension:",e.message),""}})(e);return{allowed:q.includes(t),extension:t}},V=(e,t)=>{const n=document.createElement("img");n.src=e,n.classList.add("scaled-thumbnail"),document.body.appendChild(n),F=t;let r=1,o=!1,a=0,i=0,s=0,c=0;let l=document.querySelector(".dimming-element");if(l||(l=document.createElement("div"),l.classList.add("dimming-element"),document.body.appendChild(l)),pt()){let e=0,t=0,o=0,a=0;const i=e=>{e.preventDefault()},l=i=>{i.preventDefault();const l=i.touches.length;if(2===l){const o=i.touches[0],a=i.touches[1],l=Math.hypot(o.clientX-a.clientX,o.clientY-a.clientY);if(2===e){r*=l/t,r=Math.max(U,Math.min(r,O)),n.style.transform=`translate(-50%, -50%) translate(${s}px, ${c}px) scale(${r})`}t=l}else if(1===l){const t=i.touches[0],l=t.clientX,d=t.clientY;if(1===e){s+=l-o,c+=d-a,n.style.transform=`translate(-50%, -50%) translate(${s}px, ${c}px) scale(${r})`}o=l,a=d}e=l},d=t=>{0===t.touches.length&&(e=0)};n.addEventListener("touchstart",i,{passive:!1}),n.addEventListener("touchmove",l,{passive:!1}),n.addEventListener("touchend",d)}const d=e=>{He(e,"hide","0"),!document.querySelector(".popup-panel")&&l&&He(l,"hide","0"),H()};return B.click=e=>{n.contains(e.target)||(n.remove(),H())},B.keydown=e=>{"Escape"===e.code||"Space"===e.code?(e.preventDefault(),d(n)):"ArrowLeft"===e.code?G(-1):"ArrowRight"===e.code&&G(1)},B.wheel=e=>{const t=e.deltaY<0?1:-1;r+=t*J*r,r=Math.max(U,Math.min(r,O)),n.style.transform=`translate(-50%, -50%) translate(${s}px, ${c}px) scale(${r})`},B.mousemove=e=>{if(o){if(e.ctrlKey){const t=e.clientY-i,n=t<0?1:-1,o=Math.abs(t)*J*.05;r+=n*o*r,r=Math.max(U,Math.min(r,O))}else{const t=(e.clientX-a)/r*5,n=(e.clientY-i)/r*5;s+=t,c+=n}n.style.transform=`translate(-50%, -50%) translate(${s}px, ${c}px) scale(${r})`,a=e.clientX,i=e.clientY}},B.mousedown=e=>{const{button:t,clientX:r,clientY:s,target:c,ctrlKey:l}=e;(0!==t&&2!==t||c===n)&&(0===t?G(-1):2===t?(e.preventDefault(),l?(navigator.clipboard.writeText(c.src).catch(console.error),d(n)):G(1)):1===t&&(o=!0,a=r,i=s,e.preventDefault()))},B.mouseup=e=>{1===e.button&&(o=!1)},B.contextmenu=e=>e.preventDefault(),Object.entries(B).forEach((([e,t])=>{document.addEventListener(e,t)})),He(l,"show","1"),l.addEventListener("click",(()=>{d(n)})),n},G=e=>{const t=F+e;t>=0&&t<X.length&&!K&&(K=!0,Y&&(Y.src=X[t].imgSrc),setTimeout((()=>K=!1),50),F=t)};function Q(){const e=document.getElementById("messages-panel");if(!e)return;const t=()=>{X=[],e.querySelectorAll(".clickable-thumbnail").forEach(((e,t)=>{const n=e.querySelector("img");n&&e.dataset.sourceLink&&X.push({link:e.dataset.sourceLink,imgSrc:n.src,index:t})}))},n=e.querySelectorAll("a:not(.skipped):not(.processed-image)");function r(e,n){let r=e.parentElement;r.classList.contains("image-container")||(r=document.createElement("div"),r.classList.add("image-container"),e.parentNode.insertBefore(r,e),r.appendChild(e));const o=document.createElement("div");o.classList.add("clickable-thumbnail"),o.dataset.sourceLink=e.href;const a=document.createElement("img");a.src=e.href,a.onload=()=>{o.appendChild(a),r.appendChild(o),Je(600)},a.onerror=()=>{console.error("Failed to load image:",e.href),e.classList.add("skipped")},n?e.querySelector(".clickable-thumbnail")||e.addEventListener("click",(()=>{e.querySelector(".clickable-thumbnail")||(o.appendChild(a),r.appendChild(o))})):(o.appendChild(a),r.appendChild(o)),o.addEventListener("click",(n=>{n.stopPropagation(),t();const r=X.findIndex((t=>t.link===e.href||t.imgSrc===a.src));Y=V(a.src,r>=0?r:0),He(Y,"show","1");const o=document.querySelector(".dimming-element");o&&He(o,"show","1")}))}n.length&&n.forEach((e=>{if(!e.href||!e.href.startsWith("http"))return;const{allowed:t,extension:n}=W(e.href);if(!t)return;e.classList.add("media");const{isTrusted:o,domain:a}=qe(e.href);e.title=Re(e.href)?De(e.href):e.href,o?function(e,t,n){e.textContent=`${R} ${t.toUpperCase()} ${D} ${n}`,e.classList.add("processed-image"),r(e,!1)}(e,n,a):function(e,t,n){e.classList.add("skipped"),e.textContent=`${R} ${t.toUpperCase()} ${D} ${n} ${_} Untrusted`,e.addEventListener("click",(t=>{e.classList.contains("processed-image")||(t.preventDefault(),e.classList.remove("skipped"),e.classList.add("processed-image"),r(e,!0))}))}(e,n,a)}))}const Z="📺",ee="📹",te="🎬️",ne="🖥️",re="💀️️",oe=["mp4","webm","ogg","mov","avi"];let ae=null,ie=null;async function se(e,t,n,r){e.hidden=!0,t.hidden=!0;const o=await async function(e){const t=`https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=${e}&format=json`;try{const e=await fetch(t),n=await e.json();return{title:n.title||"Title not found",channel:n.author_name||"Channel not found"}}catch(e){return console.error("Error fetching YouTube metadata:",e),{title:"Error",channel:"Error"}}}(n),a=document.createElement("span");a.classList.add("channel-name"),a.textContent=`${Z} ${o.channel}`;const i=document.createElement("span");i.classList.add("video-title"),i.textContent=`${ee} ${o.title}`;const s=new Image;s.src=`https://img.youtube.com/vi/${n}/hqdefault.jpg`,s.alt=r,s.classList.add("youtube-thumb"),s.addEventListener("load",(()=>{e.replaceChildren(a,i),t.replaceChildren(s),e.hidden=!1,t.hidden=!1,Je(600)})),s.addEventListener("error",(()=>{console.error("Error loading YouTube thumbnail for videoId:",n)}))}function ce(){const e=document.getElementById("messages-panel");if(!e)return;const t=e.querySelectorAll("a:not(.skipped):not(.processed-video)");async function n(e,t,n,r){const{youtubeMatch:o,videoType:a,videoId:i}=r,s=(e=>{const t=e.match(/\.([^?#.]+)(?:[?#]|$)/i)?.[1]?.toLowerCase()||"";return{allowed:oe.includes(t),extension:t}})(t);if(!o&&!s.allowed)return;e.classList.add("processed-video");const c=document.createElement("div");if(c.classList.add("video-wrapper"),e.textContent=`${te} ${a} ${ne} ${n}`,e.title=Re(t)?De(t):t,e.style.display="inline-flex",o){const t=document.createElement("div");t.classList.add("youtube-info");const n=document.createElement("div");n.classList.add("youtube-placeholder"),n.dataset.videoId=i,n.dataset.videoType=a,e.parentNode.insertBefore(c,e),c.append(e,t,n),await se(t,n,i,a),n.addEventListener("click",(()=>{if(ie&&ie!==n){const e=ie.dataset.videoId,t=ie.dataset.videoType;se(ie.previousElementSibling,ie,e,t)}ie=n;const e=(ae||(ae=document.createElement("iframe"),ae.classList.add("video-container"),ae.allowFullscreen=!0),ae);e.hidden=!0,e.src=`https://www.youtube.com/embed/${i}?autoplay=1`,n.replaceChildren(e),e.addEventListener("load",(()=>{e.hidden=!1}))}))}else{const n=document.createElement("video");n.classList.add("video-container"),n.src=t,n.controls=!0,n.hidden=!0,n.addEventListener("loadeddata",(()=>{n.hidden=!1,Je(600)})),n.addEventListener("error",(()=>{console.error("Error loading video source:",t),c.replaceChildren(e)})),e.parentNode.insertBefore(c,e),c.append(e,n)}}t.length&&t.forEach((e=>{const t=e.href;if(!t)return;const r=function(e){const t=e.match(/(?:shorts\/|live\/|watch\?v=|youtu\.be\/)([a-zA-Z0-9_-]{11})/i);if(t)return{youtubeMatch:!0,videoId:t[1],videoType:e.includes("shorts/")?"Shorts":e.includes("live/")?"Live":e.includes("watch?v=")?"Watch":e.includes("youtu.be/")?"Share":"YouTube"};const n=e.split(".").pop().toLowerCase();return!!oe.includes(n)&&{youtubeMatch:!1,videoType:`Video (${n.toUpperCase()})`}}(t);if(!r)return;e.classList.add("media");const{isTrusted:o,domain:a}=qe(t);if(!o)return e.classList.add("skipped"),e.textContent=`${te} ${r.videoType} ${ne} ${a} ${re} Untrusted`,void e.addEventListener("click",(o=>{e.classList.contains("processed-video")||(o.preventDefault(),e.classList.remove("skipped"),n(e,t,a,r))}));n(e,t,a,r)}))}const le="http://www.w3.org/2000/svg",de="#82B32A",ue="#B34A2A",pe=`\n  <svg xmlns="${le}" \n      width="24" \n      height="24" \n      viewBox="0 0 250 250">\n    <path fill="#096AD9" d="M22.32 98.04l-19.04 -87.15c-0.75,-3.46 0.48,-6.84 3.29,-9 2.81,-2.17 6.39,-2.49 9.55,-0.87l225.95 116.02c3.07,1.57 4.87,4.52 4.87,7.96 0,3.44 -1.8,6.39 -4.87,7.96l-225.95 116.02c-3.16,1.62 -6.74,1.3 -9.55,-0.87 -2.81,-2.16 -4.04,-5.54 -3.29,-9l19.04 -87.15c0.79,-3.62 3.53,-6.26 7.18,-6.91l102.6 -18.19c0.91,-0.16 1.56,-0.94 1.56,-1.86 0,-0.92 -0.65,-1.7 -1.56,-1.86l-102.6 -18.19c-3.65,-0.65 -6.39,-3.29 -7.18,-6.91z"/>\n  </svg>\n`,me=`\n  <svg xmlns="${le}" \n       width="15" \n       height="15" \n       viewBox="0 0 250 250" \n       style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd">\n      <path fill="${de}" d="M46.62 0l156.76 0c25.64,0 46.62,20.98 46.62,46.62l0 156.75c0,25.65 -20.98,46.63 -46.62,46.63l-156.76 0c-25.64,0 -46.62,-20.98 -46.62,-46.63l0 -156.75c0,-25.64 20.98,-46.62 46.62,-46.62zm45.71 70.24l32.67 32.67 32.67 -32.67c2.73,-2.73 7.18,-2.73 9.91,0l12.18 12.18c2.73,2.73 2.73,7.18 0,9.91l-32.67 32.67 32.67 32.66c2.73,2.74 2.73,7.19 0,9.92l-12.18 12.18c-2.73,2.73 -7.18,2.73 -9.91,0l-32.67 -32.67 -32.67 32.67c-2.73,2.73 -7.18,2.73 -9.91,0l-12.18 -12.18c-2.73,-2.73 -2.73,-7.18 0,-9.92l32.67 -32.66 -32.67 -32.67c-2.73,-2.73 -2.73,-7.18 0,-9.91l12.18 -12.18c2.73,-2.73 7.18,-2.73 9.91,0z"/>\n  </svg>\n`,he=`\n  <svg xmlns="${le}" \n       width="15" \n       height="15" \n       viewBox="0 0 250 250" \n       style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd">\n      <path fill="${ue}" d="M46.62 0l156.76 0c25.64,0 46.62,20.98 46.62,46.62l0 156.75c0,25.65 -20.98,46.63 -46.62,46.63l-156.76 0c-25.64,0 -46.62,-20.98 -46.62,-46.63l0 -156.75c0,-25.64 20.98,-46.62 46.62,-46.62zm15.5 135.79l57.92 -57.93c2.73,-2.73 7.19,-2.72 9.92,0.01l57.92 57.92c2.73,2.73 2.73,7.18 0,9.91l-12.18 12.18c-2.73,2.73 -7.18,2.73 -9.92,0l-35.82 -35.83c-2.73,-2.73 -7.19,-2.73 -9.92,0l-35.82 35.83c-2.74,2.73 -7.19,2.73 -9.92,0l-12.18 -12.18c-2.73,-2.73 -2.73,-7.18 0,-9.91z"/>\n  </svg>\n`,ge=`\n  <svg xmlns="${le}" \n       width="15" \n       height="15" \n       viewBox="0 0 250 250"\n       style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd">\n    <path fill="${de}" d="M46.62 0l156.76 0c25.64,0 46.62,20.98 46.62,46.62l0 156.75c0,25.65 -20.98,46.63 -46.62,46.63l-156.76 0c-25.64,0 -46.62,-20.98 -46.62,-46.63l0 -156.75c0,-25.64 20.98,-46.62 46.62,-46.62zm109.99 181.69l-75.07 0c-7.3,0 -13.23,-5.92 -13.23,-13.22l0 -75.08c0,-2.35 1.92,-4.28 4.28,-4.28l17.9 0c2.35,0 4.27,1.93 4.27,4.28l0 32.81c0,1.77 1.01,3.28 2.64,3.96 1.63,0.67 3.42,0.33 4.66,-0.93l59.68 -59.68c1.67,-1.65 4.38,-1.65 6.05,0l12.66 12.66c1.66,1.67 1.66,4.38 0,6.05l-59.68 59.68c-1.26,1.24 -1.6,3.03 -0.93,4.66 0.68,1.63 2.19,2.64 3.96,2.64l32.81 0c2.35,0 4.28,1.92 4.28,4.28l0 17.9c0,2.36 -1.93,4.28 -4.28,4.28z"/>\n  </svg>\n`,fe=`\n  <svg xmlns="${le}" \n       width="15" \n       height="15" \n       viewBox="0 0 250 250"\n       style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd">\n    <path fill="${ue}" d="M46.62 0l156.76 0c25.64,0 46.62,20.98 46.62,46.62l0 156.75c0,25.65 -20.98,46.63 -46.62,46.63l-156.76 0c-25.64,0 -46.62,-20.98 -46.62,-46.63l0 -156.75c0,-25.64 20.98,-46.62 46.62,-46.62zm46.77 68.31l75.07 0c7.3,0 13.23,5.92 13.23,13.22l0 75.08c0,2.35 -1.92,4.28 -4.28,4.28l-17.9 0c-2.35,0 -4.27,-1.93 -4.27,-4.28l0 -32.81c0,-1.77 -1.01,-3.28 -2.64,-3.96 -1.63,-0.67 -3.42,-0.33 -4.66,0.93l-59.68 59.68c-1.67,1.65 -4.38,1.65 -6.05,0l-12.66 -12.66c-1.66,-1.67 -1.66,-4.38 0,-6.05l59.68 -59.68c1.26,-1.24 1.6,-3.03 0.93,-4.66 -0.68,-1.63 -2.19,-2.64 -3.96,-2.64l-32.81 0c-2.35,0 -4.28,-1.92 -4.28,-4.27l0 -17.9c0,-2.36 1.93,-4.28 4.28,-4.28z"/>\n  </svg>\n`,ye=`\n  <svg xmlns="${le}" \n       width="15" \n       height="15" \n       viewBox="0 0 250 250"\n       style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd">\n    <path fill="${de}" d="M46.59 0l156.82 0c25.65,0 46.59,20.94 46.59,46.59l0 156.82c0,25.65 -20.94,46.59 -46.59,46.59l-156.82 0c-25.65,0 -46.59,-20.94 -46.59,-46.59l0 -156.82c0,-25.65 20.94,-46.59 46.59,-46.59zm130.96 87.85c0,6.57 -1.03,12.72 -3.08,18.06 -2.05,5.34 -4.93,9.85 -8.42,13.75 -3.69,3.9 -8,7.39 -13.13,10.47 -4.11,2.46 -8.83,4.93 -13.96,6.98 -1.64,0.82 -2.87,2.46 -2.87,4.51l0 15.19c0,2.67 -2.06,4.72 -4.73,4.72l-25.04 0c-2.66,0 -4.92,-2.05 -4.92,-4.72l0 -25.65c0,-2.26 1.44,-3.9 3.49,-4.52 2.87,-1.02 5.95,-2.05 9.23,-3.28 4.52,-1.85 8.62,-3.9 12.11,-6.57 3.9,-2.67 6.78,-5.75 9.24,-9.24 2.46,-3.49 3.49,-7.59 3.49,-12.31 0,-6.78 -2.05,-11.7 -6.36,-14.78 -4.31,-2.88 -10.06,-4.52 -17.65,-4.52 -5.75,0 -11.7,1.24 -18.07,3.7 -5.33,2.05 -9.85,4.31 -13.13,6.36 -1.03,0.62 -2.26,0.62 -3.29,0 -1.02,-0.62 -1.64,-1.64 -1.64,-2.87l0 -23.2c0,-2.05 1.23,-3.9 3.08,-4.51 4.1,-1.44 9.44,-3.08 15.8,-4.52 8.42,-2.05 17.24,-3.07 26.89,-3.07 8.42,0 16.01,1.02 22.58,3.07 6.36,2.06 12.11,4.72 16.62,8.42 4.52,3.49 7.8,7.8 10.27,12.72 2.26,4.73 3.49,10.06 3.49,15.81l0 0zm-46.19 114.12l-25.04 0c-2.67,0 -4.92,-2.05 -4.92,-4.72l0 -17.24c0,-2.67 2.25,-4.72 4.92,-4.72l25.04 0c2.67,0 4.72,2.05 4.72,4.72l0 17.24c0,2.67 -2.05,4.72 -4.72,4.72z"/>\n  </svg>\n`;function be(e){e.classList.add("shake-effect"),setTimeout((()=>{e.classList.remove("shake-effect")}),500)}const ve={smileys:["😀","😃","😄","😆","😁","😅","😂","🤣","🥲","☺️","😊","😇","🙂","🙃","😉","😌","😍","🥰","😙","😚","😗","😘","😋","🥸","😵‍💫","😛","😝","😜","🤪","😎","🤓","🧐","🤨","🤩","🥳","😏","😒","😞","😔","😟","😕","🙁","☹️","😣","😖","😫","😩","🥺","😢","😭","😤","😠","😡","🤬","🤯","😳","🥵","🥶","😱","😨","😰","😥","😓","🤗","🤔","🤭","🤫","🤥","😶","😐","😑","😬","🙄","😯","😦","😧","😮","😲","🥱","😴","🤤","😪","😵","🤐","🥴","🤢","🤮","🤧","😷","🤒","🤕","🤑","🤠","😈","👿","👹","👺","🤡","💩","👻","💀","☠️","👽","👾","🤖","🎃","😺","😸","😹","😻","😼","😽","🙀","😿","😾","👋","🤚","🖐️","✋","🖖","👌","🤌","🤏","✌️","🤞","🤟","🤘","🤙","👈","👉","👆","🖕","👇","☝️","👍","👎","✊","👊","🤛","🤜","👏","🙌","👐","🤲","🤝","🙏","✍️","💅","🤳","💪","🦾","🦿","🦵","🦶","👂","🦻","👃","🧠","🫀","🫁","🦷","🦴","👀","👁️","👅","👄","👶","🧒","👦","👧","🧑","👱","👨","🧔","👩","🧓","👴","👵","🙍","🙎","🙅","🙆","💁","🙋","🧏","🙇","🤦","🤷","👮","🕵️","💂","🥷","👷","🤴","👸","👳","👲","🧕","🤵","👰","🤰","🤱","👼","🎅","🤶","🦸","🦹","🧙","🧚","🧛","🧜"],nature:["🐵","🐒","🦍","🦧","🐶","🐕","🦮","🐕‍🦺","🐩","🐺","🦊","🦝","🐱","🐈","🐈‍⬛","🦁","🐯","🐅","🐆","🐴","🐎","🦄","🦓","🦌","🦬","🐮","🐂","🐃","🐄","🐷","🐖","🐗","🐽","🐏","🐑","🐐","🐪","🐫","🦙","🦒","🐘","🦏","🦛","🐭","🐁","🐀","🐹","🐰","🐇","🦫","🦘","🦡","🐿️","🦔","🦦","🦥","🐼","🦨","🦘","🦡","🦃","🐔","🐓","🐣","🐤","🐥","🐦","🐧","🕊️","🦅","🦆","🦢","🦉","🦤","🪶","🦩","🦚","🦜","🐸","🐊","🐢","🦎","🐍","🐲","🐉","🦕","🦖","🐳","🐋","🐬","🦭","🐟","🐠","🐡","🦈","🐙","🐚","🪸","🐌","🦋","🐛","🐜","🐝","🪲","🐞","🦗","🪳","🕷️","🕸️","🦂","🦟","🪰","🪱","🌸","💮","🏵️","🌹","🥀","🌺","🌻","🌼","🌷","🌱","🪴","🌲","🌳","🌴","🌵","🌾","🌿","☘️","🍀","🍁","🍂","🍃"],food:["🍎","🍐","🍊","🍋","🍌","🍉","🍇","🍓","🫐","🍈","🍒","🍑","🥭","🍍","🥥","🥝","🍅","🍆","🥑","🥦","🥬","🥒","🌶️","🫑","🥕","🧄","🧅","🥔","🍠","🥐","🥯","🍞","🥖","🥨","🧀","🥚","🍳","🥓","🥩","🍗","🍖","🦴","🌭","🍔","🍟","🍕","🫓","🥪","🥙","🧆","🌮","🌯","🫔","🥗","🥘","🫕","🥫","🍝","🍜","🍲","🍛","🍣","🍱","🥟","🦪","🍤","🍙","🍚","🍘","🍥","🥠","🥮","🍢","🍡","🍧","🍨","🍦","🥧","🧁","🍰","🎂","🍮","🍭","🍬","🍫","🍿","🍩","🍪","🫖","☕","🍵","🧃","🥤","🧋","🍶","🍺","🍻","🥂","🍷","🥃","🍸","🍹","🧉","🍾"],activities:["⚽","🏀","🏈","⚾","🥎","🎾","🏐","🏉","🥏","🎱","🪀","🏓","🏸","🏒","🏑","🥍","🏏","⛳","🪁","🎣","🤿","🎽","🛹","🛼","🛷","⛸️","🥌","⛷️","🏂","🪂","🏋️","🤼","🤸","⛹️","🤾","🏌️","🏇","🧘","🏄","🏊","🤽","🚣","🧗","🚴","🚵","🎪","🎭","🎨","🎬","🎤","🎧","🎼","🎹","🥁","🎷","🎺","🎸","🎻","🎲","🎯","🎳","🎮","🎰","🧩","🎪","🎫","🎟️"],travel:["🚗","🚕","🚙","🚌","🚎","🏎️","🚓","🚑","🚒","🚐","🛻","🚚","🚛","🚜","🛵","🏍️","🛺","🚲","🛴","✈️","🛩️","🛫","🛬","🚁","🚀","🛸","🛶","⛵","🚤","🛥️","🛳️","⛴️","🚢","🏰","🏯","🏟️","🏖️","🏝️","🏜️","🌋","⛰️","🏔️","🗻","🏕️","🏭","🏢","🏬","🏣","🏤","🏥","🏦","🏨","🏪","🏫","🏩","💒","⛪","🕌","🕍","🛕","⛩️","🏛️"],objects:["📱","💻","⌨️","🖥️","🖨️","🖱️","🖲️","🕹️","🗜️","💽","💾","💿","📀","📼","📷","📸","📹","🎥","📞","☎️","📟","📠","📺","📻","🎙️","🎚️","🎛️","📡","🔋","🔌","💡","🔦","🕯️","🧯","🛢️","💸","💵","💴","💶","💷","🪙","💰","💳","💎","⚖️","🪜","🧰","🔧","🔨","⚒️","🛠️","⛏️","✏️","🖊️","🖋️","✒️","🖌️","🖍️","📝","📚","📖","🔖","📑","🗒️","📄","📰","🗞️","📁","📂","🗂️","🕐","🕑","🕒","🕓","🕔","🕕","🕖","🕗","🕘","🕙","🕚","🕛","🕰️","⏰","⏱️","⏲️","⌚"],symbols:["❤️","🧡","💛","💚","💙","💜","🤎","🖤","🤍","💔","❣️","💕","💞","💓","💗","💖","💘","💝","💟","☮️","✝️","☪️","🕉️","☸️","✡️","🔯","🕎","☯️","☦️","🛐","⛎","⚠️","🚸","⛔","🚫","☢️","☣️","➕","➖","➗","✖️","♾️","💲","💱","⬆️","↗️","➡️","↘️","⬇️","↙️","⬅️","↖️","↕️","↔️","↩️","↪️","⤴️","⤵️","🔃","🔄","🔆","📶","🎦","🔅","♻️","✅","❌","❎","➰","➿","〽️","✳️","✴️","❇️","©️","®️","™️"],flags:["🏁","🚩","🎌","🏴","🏳️","🏳️‍🌈","🏳️‍⚧️","🏴‍☠️","🇺🇸","🇬🇧","🇯🇵","🇰🇷","🇩🇪","🇨🇳","🇧🇷","🇮🇳","🇫🇷","🇪🇸","🇮🇹","🇷🇺","🇨🇦","🇦🇺","🇳🇿","🇲🇽","🇦🇷","🇵🇰","🇪🇬","🇸🇪","🇳🇴","🇳🇱","🇨🇭","🇹🇷","🇮🇩","🇸🇬","🇮🇱","🇵🇹","🇵🇱","🇹🇭"]},we={"😀":{en:["grinning","face","smile","happy","joy"],ru:["улыбающийся","лицо","улыбка","счастливый","радость"]},"😃":{en:["smiley","face","happy","joy","laugh"],ru:["улыбчивый","лицо","счастливый","радость","смех"]},"😄":{en:["laughing","face","happy","joy","grin"],ru:["смеющийся","лицо","счастливый","радость","ухмылка"]},"😆":{en:["grinning face","laugh"],ru:["улыбка","смех"]},"😁":{en:["beaming","face","grin","smile","happy"],ru:["сияющий","лицо","улыбка","счастье","радость"]},"😅":{en:["sweat","nervous","face","laugh","relief"],ru:["пот","нервный","лицо","смех","облегчение"]},"😂":{en:["tears","joy","face","laugh","happy"],ru:["слёзы","радость","лицо","смех","счастье"]},"🤣":{en:["rolling","floor","laugh","funny","amused"],ru:["катающийся","пол","смех","смешной","развлечённый"]},"🥲":{en:["smiling","tear","bittersweet","nostalgic","happy"],ru:["улыбающийся","слеза","горько-сладкий","ностальгический","счастливый"]},"☺️":{en:["smile","blush","content","peaceful"],ru:["улыбка","румянец","довольный","спокойный"]},"😊":{en:["smiling","happy","blushing","content"],ru:["улыбающийся","счастливый","румянец","довольный"]},"😇":{en:["angel","halo","innocent","saint","pure"],ru:["ангел","ореол","невинный","святой","чистый"]},"🙂":{en:["slight","smile","face","mild"],ru:["слегка","улыбка","лицо","умеренный"]},"🙃":{en:["upside-down","silly","quirky","funny"],ru:["перевернутый","глупый","странный","смешной"]},"😉":{en:["wink","flirt","playful","smile"],ru:["подмигивание","флирт","игривый","улыбка"]},"😌":{en:["relieved","calm","content","satisfied"],ru:["облегчённый","спокойный","довольный","удовлетворённый"]},"😍":{en:["heart","love","smiling","eyes","adore"],ru:["сердце","любовь","улыбающийся","глаза","обожать"]},"🥰":{en:["love","hearts","affection","adoration","cuddle"],ru:["любовь","сердца","нежность","обожание","обниматься"]},"😙":{en:["kiss","love","affection","flirt"],ru:["поцелуй","любовь","нежность","флирт"]},"😗":{en:["kiss","face","smile","affection"],ru:["поцелуй","лицо","улыбка","нежность"]},"😚":{en:["kiss","closed eyes","affection","love"],ru:["поцелуй","закрытые глаза","нежность","любовь"]},"😘":{en:["kiss","love","affection","flirt"],ru:["поцелуй","любовь","нежность","флирт"]},"😋":{en:["yum","delicious","tasty","savor","lick"],ru:["ням","вкусно","аппетитно","наслаждаться","лизать"]},"🥸":{en:["disguise","glasses","funny","sneaky","face"],ru:["маскировка","очки","смешной","хитрый","лицо"]},"😵‍💫":{en:["dizzy","spiral eyes","confused","hypnotized","disoriented"],ru:["головокружение","спиральные глаза","запутанный","загипнотизированный","дезориентированный"]},"😛":{en:["tongue","playful","cheeky","silly"],ru:["язык","игривый","нахальный","глупый"]},"😝":{en:["tongue","silly","wacky","fun"],ru:["язык","глупый","безумный","весёлый"]},"😜":{en:["tongue","wink","playful","fun"],ru:["язык","подмигивание","игривый","весёлый"]},"🤪":{en:["crazy","wacky","zany","quirky"],ru:["сумасшедший","безумный","чудаковатый","странный"]},"😎":{en:["cool","sunglasses","confident","chill"],ru:["крутой","очки","уверенный","расслабленный"]},"🤓":{en:["nerd","geek","glasses","studious"],ru:["ботан","задрот","очки","учёный"]},"🧐":{en:["monocle","investigative","curious","thoughtful"],ru:["одноглазый","расследовательский","любопытный","задумчивый"]},"🤨":{en:["skeptical","doubtful","uncertain","raised eyebrow"],ru:["скептический","сомневающийся","неуверенный","поднятая бровь"]},"🤩":{en:["starstruck","amazed","excited","admire"],ru:["восхищённый","поражённый","взволнованный","обожать"]},"🥳":{en:["party","celebrate","birthday","festive"],ru:["вечеринка","праздновать","день рождения","праздничный"]},"😏":{en:["smirk","sly","mischievous","confident"],ru:["ухмылка","хитрый","озорной","уверенный"]},"😒":{en:["unamused","displeased","bored","sigh"],ru:["неудовлетворённый","недовольный","скучный","вздох"]},"😞":{en:["disappointed","sad","down","somber"],ru:["разочарованный","грустный","унылый","мрачный"]},"😔":{en:["pensive","sad","reflective","mournful"],ru:["задумчивый","грустный","рефлексивный","скорбный"]},"😟":{en:["worried","concerned","anxious","upset"],ru:["обеспокоенный","тревожный","беспокойный","расстроенный"]},"😕":{en:["confused","perplexed","uncertain","baffled"],ru:["смущённый","озадаченный","неуверенный","в замешательстве"]},"🙁":{en:["frowning","sad","disappointed","downcast"],ru:["хмурый","грустный","разочарованный","угнетённый"]},"☹️":{en:["frowning","sad","unhappy","mournful"],ru:["хмурый","грустный","несчастный","скорбный"]},"😣":{en:["strained","persevering","tired","discomfort"],ru:["напряжённый","терпеливый","уставший","дискомфорт"]},"😖":{en:["confounded","annoyed","distressed","exasperated"],ru:["озадаченный","раздражённый","огорчённый","изнурённый"]},"😫":{en:["tired","exhausted","weary","worn out"],ru:["усталый","измученный","изнурённый","измотанный"]},"😩":{en:["weary","tired","exhausted","overwhelmed"],ru:["изнурённый","уставший","измученный","перегруженный"]},"🥺":{en:["pleading","begging","cute","vulnerable"],ru:["умоляющий","просьба","милый","уязвимый"]},"😢":{en:["cry","sad","tear","sorrow"],ru:["плакать","грустный","слеза","печаль"]},"😭":{en:["crying","tearful","sad","heartbroken"],ru:["плачущий","со слезами","грустный","с разбитым сердцем"]},"😤":{en:["triumphant","exasperated","proud","angry"],ru:["триумфальный","раздражённый","гордый","сердитый"]},"😠":{en:["angry","mad","annoyed","irate"],ru:["сердитый","злой","раздражённый","яростный"]},"😡":{en:["pouting","mad","furious","irate"],ru:["надувшийся","злой","яростный","взбешённый"]},"🤬":{en:["cursing","swearing","angry","foul language"],ru:["ругательства","мат","сердитый","неприличный"]},"🤯":{en:["mind blown","shocked","amazed","stunned"],ru:["взрыв мозга","шокированный","поражённый","ошеломлённый"]},"😳":{en:["flushed","embarrassed","shocked","awkward"],ru:["покрасневший","смущённый","шокированный","неловкий"]},"🥵":{en:["hot","overheated","sweaty","exhausted"],ru:["горячий","перегретый","потный","изнурённый"]},"🥶":{en:["cold","freezing","chilly","frozen"],ru:["холодный","замерзающий","прохладный","замороженный"]},"😱":{en:["screaming","horror","shock","fear"],ru:["кричащий","ужас","шок","страх"]},"😨":{en:["fearful","scared","anxious","nervous"],ru:["боязливый","испуганный","тревожный","нервный"]},"😰":{en:["anxious","nervous","sweating","scared"],ru:["тревожный","нервный","потеющий","испуганный"]},"😥":{en:["disappointed","sad","pensive","teary"],ru:["разочарованный","грустный","задумчивый","со слезами"]},"😓":{en:["cold sweat","nervous","anxious","tired"],ru:["холодный пот","нервный","тревожный","усталый"]},"🤗":{en:["hug","embrace","caring","love"],ru:["объятие","принимать","заботливый","любовь"]},"🤔":{en:["thinking","pondering","curious","confused"],ru:["думающий","размышляющий","любопытный","смущённый"]},"🤭":{en:["guilty","shy","embarrassed","oops"],ru:["виноватый","застенчивый","смущённый","упс"]},"🤫":{en:["quiet","secret","hush","shh"],ru:["тихий","секрет","тишина","ш-ш"]},"🤥":{en:["lying","fib","deceitful","dishonest"],ru:["врущий","ложь","обманчивый","нечестный"]},"😶":{en:["speechless","mute","quiet","blank"],ru:["безмолвный","немой","тихий","пустой"]},"😐":{en:["neutral","expressionless","indifferent","flat"],ru:["нейтральный","без выражения","безразличный","плоский"]},"😑":{en:["deadpan","expressionless","blank","unemotional"],ru:["без эмоций","без выражения","пустой","неэмоциональный"]},"😬":{en:["grimace","awkward","nervous","tense"],ru:["гримаса","неловко","нервный","напряжённый"]},"🙄":{en:["eye roll","sarcastic","disdain","bored"],ru:["закатывание глаз","саркастичный","пренебрежительный","скучный"]},"😯":{en:["hushed","surprised","shocked","amazed"],ru:["тихий","удивлённый","шокированный","поражённый"]},"😦":{en:["frowning","dismayed","shocked","surprised"],ru:["хмурый","огорчённый","шокированный","удивлённый"]},"😧":{en:["astonished","stunned","surprised","speechless"],ru:["изумлённый","ошеломлённый","удивлённый","безмолвный"]},"😮":{en:["open mouth","surprised","shocked","amazed"],ru:["открытый рот","удивлённый","шокированный","поражённый"]},"😲":{en:["astonished","stunned","shocked","in awe"],ru:["изумлённый","ошеломлённый","шокированный","в благоговении"]},"🥱":{en:["yawning","sleepy","tired","bored"],ru:["зевота","сонный","усталый","скучный"]},"😴":{en:["sleeping","tired","napping","dozing"],ru:["спящий","усталый","дремлющий","засыпающий"]},"🤤":{en:["drooling","desire","craving","hungry"],ru:["слюнявый","желание","тяга","голодный"]},"😪":{en:["sleepy","drowsy","tired","nodding"],ru:["сонный","вялый","усталый","кивающий"]},"😵":{en:["dizzy","knocked out","stunned","confused"],ru:["головокружительный","вырубленный","ошеломлённый","сбитый с толку"]},"🤐":{en:["zipper-mouth","secretive","quiet","mute"],ru:["закрытый рот","секретный","тихий","немой"]},"🥴":{en:["woozy","tipsy","dizzy","unsteady"],ru:["ошеломлённый","подошедший","головокружительный","неустойчивый"]},"🤢":{en:["nauseated","sick","disgusted","vomit"],ru:["тошнотворный","больной","отвратительный","рвота"]},"🤮":{en:["vomiting","nauseous","sick","disgust"],ru:["рвота","тошнотворный","больной","отвратительный"]},"🤧":{en:["sneezing","ill","sick","allergy"],ru:["чихание","болен","больной","аллергия"]},"😷":{en:["mask","sick","ill","health"],ru:["маска","больной","нездоровый","здоровье"]},"🤒":{en:["fever","sick","ill","unwell"],ru:["лихорадка","больной","нездоровый","неважно"]},"🤕":{en:["injured","hurt","bandaged","pain"],ru:["раненый","повреждённый","забинтованный","боль"]},"🤑":{en:["money","rich","greedy","cash"],ru:["деньги","богатый","жадный","наличные"]},"🤠":{en:["cowboy","hat","western","fun"],ru:["ковбой","шляпа","вестерн","веселье"]},"😈":{en:["devil","mischievous","naughty","sinister"],ru:["дьявол","озорной","непослушный","зловещий"]},"👿":{en:["angry","devil","evil","fiendish"],ru:["сердитый","дьявол","злой","зловещий"]},"👹":{en:["ogre","demon","monster","scary"],ru:["огр","демон","монстр","страшный"]},"👺":{en:["goblin","troll","spooky","creepy"],ru:["гоблин","тролль","жуткий","страшный"]},"🤡":{en:["clown","silly","funny","circus"],ru:["клоун","глупый","смешной","цирк"]},"💩":{en:["poop","crap","feces","funny"],ru:["какашка","дерьмо","фекалии","смешной"]},"👻":{en:["ghost","spirit","haunted","scary"],ru:["призрак","дух","обитающий","страшный"]},"💀":{en:["skull","death","creepy","spooky"],ru:["череп","смерть","жуткий","страшный"]},"☠️":{en:["skull","danger","death","poison"],ru:["череп","опасность","смерть","яд"]},"👽":{en:["alien","extraterrestrial","space","ufo"],ru:["инопланетянин","внеземной","космос","НЛО"]},"👾":{en:["alien","monster","video game","retro"],ru:["инопланетянин","монстр","видеоигра","ретро"]},"🤖":{en:["robot","machine","tech","android"],ru:["робот","машина","технология","андроид"]},"🎃":{en:["pumpkin","halloween","spooky","festive"],ru:["тыква","Хэллоуин","жуткий","праздничный"]},"😺":{en:["smiling","cat","happy","playful"],ru:["улыбающийся","кот","счастливый","игривый"]},"😸":{en:["grinning","cat","joyful","cheerful"],ru:["широко улыбающийся","кот","радостный","весёлый"]},"😹":{en:["tearful","joy","cat","laughing"],ru:["со слезами","радость","кот","смеющийся"]},"😻":{en:["heart","cat","love","adorable"],ru:["сердце","кот","любовь","милый"]},"😼":{en:["smirking","cat","mischievous","sly"],ru:["ухмыляющийся","кот","озорной","хитрый"]},"😽":{en:["kissing","cat","affection","cute"],ru:["целующий","кот","нежность","милый"]},"🙀":{en:["surprised","cat","scared","shocked"],ru:["испуганный","кот","испуганный","шокированный"]},"😿":{en:["crying","cat","sad","tearful"],ru:["плачущий","кот","грустный","со слезами"]},"😾":{en:["angry","cat","annoyed","displeased"],ru:["сердитый","кот","раздражённый","недовольный"]},"👋":{en:["wave","hello","goodbye","greeting"],ru:["махание","привет","прощание","приветствие"]},"🤚":{en:["raised hand","stop","palm"],ru:["поднятая рука","стой","ладонь"]},"🖐️":{en:["hand","high five","greeting"],ru:["рука","дай пять","приветствие"]},"✋":{en:["stop","palm","high five"],ru:["стой","ладонь","дай пять"]},"🖖":{en:["vulcan salute","live long","sci-fi"],ru:["салют Вулканцев","живи долго","научная фантастика"]},"👌":{en:["okay","perfect","good"],ru:["ок","идеально","хорошо"]},"🤌":{en:["pinched","precise","delicious"],ru:["сжатый","точный","вкусный"]},"🤏":{en:["small","tiny","minuscule"],ru:["маленький","крошечный","микроскопический"]},"✌️":{en:["peace","victory","v sign"],ru:["мир","победа","знак победы"]},"🤞":{en:["fingers crossed","hope","luck"],ru:["скрещенные пальцы","надежда","удача"]},"🤟":{en:["I love you","rock on","sign language"],ru:["я тебя люблю","рок он","язык жестов"]},"🤘":{en:["rock","metal","horns"],ru:["рок","металл","рога"]},"🤙":{en:["call me","hang loose","shaka"],ru:["позвони мне","расслабься","шак"]},"👈":{en:["point left","direction","arrow"],ru:["указание влево","направление","стрелка"]},"👉":{en:["point right","direction","arrow"],ru:["указание вправо","направление","стрелка"]},"👆":{en:["point up","direction","up"],ru:["указание вверх","направление","вверх"]},"🖕":{en:["middle finger","offensive","rude"],ru:["средний палец","оскорбительный","грубый"]},"👇":{en:["point down","direction","down"],ru:["указание вниз","направление","вниз"]},"☝️":{en:["point up","number one","important"],ru:["указание вверх","номер один","важный"]},"👍":{en:["thumbs up","good","approve"],ru:["палец вверх","хорошо","одобрить"]},"👎":{en:["thumbs down","bad","disapprove"],ru:["палец вниз","плохо","не одобрять"]},"✊":{en:["fist","power","solidarity"],ru:["кулак","сила","солидарность"]},"👊":{en:["punch","fist bump","hit"],ru:["удар","кулачок","ударить"]},"🤛":{en:["left fist","punch","strike"],ru:["левая рука","удар","нанести удар"]},"🤜":{en:["right fist","punch","strike"],ru:["правая рука","удар","нанести удар"]},"👏":{en:["clap","applause","bravo"],ru:["хлопки","аплодисменты","браво"]},"🙌":{en:["celebrate","praise","hooray"],ru:["торжествовать","хвалить","ура"]},"👐":{en:["open hands","embrace","welcome"],ru:["раскрытые руки","объятие","добро пожаловать"]},"🤲":{en:["palms","offering","receive"],ru:["ладони","предложение","получать"]},"🤝":{en:["handshake","agreement","cooperation"],ru:["рукопожатие","соглашение","сотрудничество"]},"🙏":{en:["pray","thanks","please"],ru:["молиться","спасибо","пожалуйста"]},"✍️":{en:["writing","pen","signature"],ru:["письмо","ручка","подпись"]},"💅":{en:["nail polish","beauty","manicure"],ru:["лак для ногтей","красота","маникюр"]},"🤳":{en:["selfie","photo","camera"],ru:["селфи","фото","камера"]},"💪":{en:["flex","strong","muscle"],ru:["сгибать","сильный","мышцы"]},"🦾":{en:["mechanical arm","robotic","cyborg"],ru:["механическая рука","роботизированный","киборг"]},"🦿":{en:["mechanical leg","prosthetic","robotic"],ru:["механическая нога","протез","роботизированный"]},"🦵":{en:["leg","limb","lower body"],ru:["нога","конечность","нижняя часть тела"]},"🦶":{en:["foot","toes","step"],ru:["нога","пальцы ноги","шаг"]},"👂":{en:["ear","listening","sound"],ru:["ухо","слушание","звук"]},"🦻":{en:["hearing aid","listening","assistive"],ru:["слуховой аппарат","слушание","помощь"]},"👃":{en:["nose","smell","scent"],ru:["нос","запах","аромат"]},"🧠":{en:["brain","intelligence","mind"],ru:["мозг","интеллект","ум"]},"🫀":{en:["heart (organ)","anatomy","biology"],ru:["сердце (орган)","анатомия","биология"]},"🫁":{en:["lungs","breath","organ"],ru:["легкие","дыхание","орган"]},"🦷":{en:["tooth","dental","smile"],ru:["зуб","стоматология","улыбка"]},"🦴":{en:["bone","skeleton","hard"],ru:["кость","скелет","твердый"]},"👀":{en:["eyes","look","see"],ru:["глаза","смотреть","видеть"]},"👁️":{en:["eye","vision","watch"],ru:["глаз","зрение","наблюдать"]},"👅":{en:["tongue","taste","lick"],ru:["язык","вкус","лизать"]},"👄":{en:["lips","kiss","mouth"],ru:["губы","поцелуй","рот"]},"👶":{en:["baby","infant","cute"],ru:["младенец","ребенок","милый"]},"🧒":{en:["child","kid","youth"],ru:["ребенок","малыш","юный"]},"👦":{en:["boy","child","kid"],ru:["мальчик","ребенок","малыш"]},"👧":{en:["girl","child","kid"],ru:["девочка","ребенок","малышка"]},"🧑":{en:["person","human","individual"],ru:["человек","личность","индивид"]},"👱":{en:["blonde","person","light hair"],ru:["блондин","человек","светлые волосы"]},"👨":{en:["man","male","guy"],ru:["мужчина","мужской","парень"]},"🧔":{en:["bearded","man","facial hair"],ru:["бородатый","мужчина","борода"]},"👩":{en:["woman","female","lady"],ru:["женщина","женский","дама"]},"🧓":{en:["elderly","senior","aged"],ru:["пожилой","старший","в преклонном возрасте"]},"👴":{en:["old man","elderly","senior"],ru:["старик","пожилой","старший"]},"👵":{en:["old woman","elderly","senior"],ru:["старуха","пожилая","старшая"]},"🙍":{en:["frowning","sad","displeased"],ru:["хмурый","грустный","недовольный"]},"🙎":{en:["pouting","angry","displeased"],ru:["надувшийся","сердитый","недовольный"]},"🙅":{en:["no","prohibited","refusal"],ru:["нет","запрещено","отказ"]},"🙆":{en:["ok","acceptable","okay"],ru:["ок","приемлемо","хорошо"]},"💁":{en:["information","help","assistance"],ru:["информация","помощь","поддержка"]},"🙋":{en:["raising hand","question","volunteer"],ru:["поднимающая руку","вопрос","доброволец"]},"🧏":{en:["deaf","listening","silent"],ru:["глухой","слушающий","безмолвный"]},"🙇":{en:["bowing","apologetic","respect"],ru:["наклон","извиняющийся","уважение"]},"🤦":{en:["facepalm","disbelief","oops"],ru:["лицо ладонь","недоверие","упс"]},"🤷":{en:["shrug","uncertain","indifferent"],ru:["пожимание плечами","неуверенный","безразличный"]},"👮":{en:["police","officer","law"],ru:["полицейский","офицер","закон"]},"🕵️":{en:["detective","spy","investigate"],ru:["детектив","шпион","расследование"]},"💂":{en:["guard","soldier","military"],ru:["страж","солдат","военный"]},"🥷":{en:["ninja","stealth","assassin"],ru:["ниндзя","скрытность","ассассин"]},"👷":{en:["construction","worker","helmet"],ru:["строитель","рабочий","шлем"]},"🤴":{en:["prince","royalty","king"],ru:["принц","королевская семья","король"]},"👸":{en:["princess","royalty","queen"],ru:["принцесса","королевская семья","королева"]},"👳":{en:["turban","cultural","tradition"],ru:["тюрбан","культура","традиция"]},"👲":{en:["man with cap","cultural","traditional"],ru:["мужчина в кепке","культура","традиционный"]},"🧕":{en:["woman with headscarf","cultural","modest"],ru:["женщина в платке","культурная","скромная"]},"🤵":{en:["tuxedo","groom","formal"],ru:["смокинг","жених","официальный"]},"👰":{en:["bride","wedding","formal"],ru:["невеста","свадьба","официальный"]},"🤰":{en:["pregnant","expecting","mother"],ru:["беременная","ожидающая","мать"]},"🤱":{en:["nursing","mother","baby"],ru:["кормящая","мать","ребенок"]},"👼":{en:["angel","cherub","divine"],ru:["ангел","херувим","божественный"]},"🎅":{en:["santa","christmas","jolly"],ru:["Санта","Рождество","радостный"]},"🤶":{en:["mrs claus","christmas","holiday"],ru:["миссис Клаус","Рождество","праздник"]},"🦸":{en:["superhero","power","hero"],ru:["супергерой","сила","герой"]},"🦹":{en:["villain","bad","criminal"],ru:["злодей","плохой","преступник"]},"🧙":{en:["wizard","magic","sorcery"],ru:["волшебник","магия","колдовство"]},"🧚":{en:["fairy","magic","mystical"],ru:["фея","магия","мистический"]},"🧛":{en:["vampire","dracula","undead"],ru:["вампир","Дракула","нежить"]},"🧜":{en:["mermaid","mythical","ocean"],ru:["русалка","мифическая","океан"]},"🐵":{en:["monkey","ape","funny","mammal"],ru:["обезьяна","примат","смешной","млекопитающее"]},"🐒":{en:["monkey","primate","curious"],ru:["обезьяна","примат","любопытный"]},"🦍":{en:["gorilla","ape","strong","wild"],ru:["горилла","обезьяна","сильный","дикий"]},"🦧":{en:["orangutan","ape","wild","mammal"],ru:["орангутан","обезьяна","дикий","млекопитающее"]},"🐶":{en:["dog","puppy","pet","mammal"],ru:["собака","щенок","домашний питомец","млекопитающее"]},"🐕":{en:["dog","canine","pet"],ru:["собака","псовой","домашний питомец"]},"🦮":{en:["guide dog","service","assistance"],ru:["собака-поводырь","служебная","помощь"]},"🐕‍🦺":{en:["service dog","working","assistance"],ru:["служебная собака","рабочая","помощь"]},"🐩":{en:["poodle","dog","pet","fancy"],ru:["пудель","собака","домашний питомец","элегантный"]},"🐺":{en:["wolf","wild","howl"],ru:["волк","дикий","воет"]},"🦊":{en:["fox","cunning","wild"],ru:["лиса","хитрая","дикая"]},"🦝":{en:["raccoon","mischievous","wild"],ru:["енот","озорной","дикий"]},"🐱":{en:["cat","pet","feline"],ru:["кот","домашний питомец","кошачий"]},"🐈":{en:["cat","feline","pet"],ru:["кот","кошачий","домашний питомец"]},"🐈‍⬛":{en:["black cat","mysterious","feline"],ru:["чёрный кот","загадочный","кошачий"]},"🦁":{en:["lion","king","wild","courage"],ru:["лев","король","дикий","отвага"]},"🐯":{en:["tiger","wild","stripes","fierce"],ru:["тигр","дикий","полосатый","свирепый"]},"🐅":{en:["tiger","stripes","wild"],ru:["тигр","полосатый","дикий"]},"🐆":{en:["leopard","spots","wild","fast"],ru:["леопард","пятна","дикий","быстрый"]},"🐴":{en:["horse","ride","equine"],ru:["лошадь","езда","конный"]},"🐎":{en:["horse","racing","equine"],ru:["лошадь","гонки","конный"]},"🦄":{en:["unicorn","magical","fantasy"],ru:["единорог","волшебный","фэнтези"]},"🦓":{en:["zebra","stripes","wild"],ru:["зебра","полосатая","дикая"]},"🦌":{en:["deer","antlers","forest"],ru:["олень","рога","лес"]},"🦬":{en:["bison","buffalo","wild"],ru:["бизон","буйвол","дикий"]},"🐮":{en:["cow","farm","bovine"],ru:["корова","ферма","коровий"]},"🐂":{en:["ox","bull","bovine"],ru:["вол","бык","коровий"]},"🐃":{en:["water buffalo","bovine","farm"],ru:["водный буйвол","коровий","ферма"]},"🐄":{en:["cow","bovine","farm"],ru:["корова","коровий","ферма"]},"🐷":{en:["pig","farm","oink"],ru:["свинья","ферма","хрюк"]},"🐖":{en:["pig","swine","farm"],ru:["свинья","свинное животное","ферма"]},"🐗":{en:["boar","wild","pig"],ru:["кабан","дикий","свинья"]},"🐽":{en:["pig nose","snout"],ru:["свинной нос","хоботок"]},"🐏":{en:["ram","sheep","male"],ru:["баран","овца","самец"]},"🐑":{en:["sheep","wool","farm"],ru:["овца","шерсть","ферма"]},"🐐":{en:["goat","farm","bleat"],ru:["коза","ферма","блеет"]},"🐪":{en:["camel","desert","hump"],ru:["верблюд","пустыня","горб"]},"🐫":{en:["camel","two-hump","desert"],ru:["двугорбый верблюд","двугорбый","пустыня"]},"🦙":{en:["llama","alpaca","cute"],ru:["лама","альпака","милый"]},"🦒":{en:["giraffe","tall","spots"],ru:["жираф","высокий","пятна"]},"🐘":{en:["elephant","trunk","large"],ru:["слон","хобот","большой"]},"🦏":{en:["rhinoceros","horn","tough"],ru:["носорог","рог","жесткий"]},"🦛":{en:["hippopotamus","water","large"],ru:["бегемот","вода","большой"]},"🦃":{en:["turkey","bird","thanksgiving"],ru:["индейка","птица","День благодарения"]},"🐔":{en:["chicken","rooster","hen"],ru:["курица","петух","курица (самка)"]},"🐓":{en:["rooster","chicken","bird"],ru:["петух","курица","птица"]},"🐣":{en:["hatching chick","baby","bird"],ru:["вылупляющийся цыплёнок","малыш","птица"]},"🐤":{en:["chick","small","bird"],ru:["цыплёнок","маленький","птица"]},"🐥":{en:["baby chicken","cute","bird"],ru:["цыплёнок","милый","птица"]},"🐦":{en:["bird","tweet","wing"],ru:["птица","чирик","крыло"]},"🐧":{en:["penguin","cold","bird"],ru:["пингвин","холодный","птица"]},"🕊️":{en:["dove","peace","bird"],ru:["голубь","мир","птица"]},"🦅":{en:["eagle","wild","bird"],ru:["орёл","дикий","птица"]},"🦆":{en:["duck","water","bird"],ru:["утка","вода","птица"]},"🦢":{en:["swan","graceful","bird"],ru:["лебедь","грациозный","птица"]},"🦉":{en:["owl","wise","night","bird"],ru:["сова","мудрая","ночная","птица"]},"🦤":{en:["dodo","extinct","bird"],ru:["додо","вымершая","птица"]},"🪶":{en:["feather","light","bird"],ru:["перо","лёгкое","птица"]},"🦩":{en:["flamingo","pink","bird"],ru:["фламинго","розовый","птица"]},"🦚":{en:["peacock","colorful","bird"],ru:["павлин","яркий","птица"]},"🦜":{en:["parrot","talkative","colorful"],ru:["попугай","болтливый","яркий"]},"🐸":{en:["frog","amphibian","green"],ru:["лягушка","амфибия","зелёная"]},"🐊":{en:["crocodile","reptile","danger"],ru:["крокодил","рептилия","опасность"]},"🐢":{en:["turtle","slow","reptile"],ru:["черепаха","медленная","рептилия"]},"🦎":{en:["lizard","reptile","scaly"],ru:["ящерица","рептилия","чешуйчатая"]},"🐍":{en:["snake","reptile","slither"],ru:["змея","рептилия","ползать"]},"🐲":{en:["dragon face","mythical","dragon"],ru:["лицо дракона","мифический","дракон"]},"🐉":{en:["dragon","mythical","fire"],ru:["дракон","мифический","огонь"]},"🦕":{en:["dinosaur","sauropod","prehistoric"],ru:["динозавр","зауропод","доисторический"]},"🦖":{en:["dinosaur","T-Rex","prehistoric"],ru:["динозавр","Ти-Рекс","доисторический"]},"🐳":{en:["whale","ocean","large"],ru:["кит","океан","большой"]},"🐋":{en:["whale","ocean","big"],ru:["кит","океан","огромный"]},"🐬":{en:["dolphin","ocean","friendly"],ru:["дельфин","океан","дружелюбный"]},"🦭":{en:["seal","marine","cute"],ru:["тюлень","морской","милый"]},"🐟":{en:["fish","ocean","swim"],ru:["рыба","океан","плавать"]},"🐠":{en:["tropical fish","ocean","colorful"],ru:["тропическая рыба","океан","яркая"]},"🐡":{en:["blowfish","puffer","ocean"],ru:["рыба-иглобрюх","фугу","океан"]},"🦈":{en:["shark","ocean","dangerous"],ru:["акула","океан","опасная"]},"🐙":{en:["octopus","marine","tentacles"],ru:["осьминог","морской","щупальца"]},"🐚":{en:["shell","beach","ocean"],ru:["ракушка","пляж","океан"]},"🪸":{en:["coral","reef","ocean"],ru:["коралл","риф","океан"]},"🐌":{en:["snail","slow","mollusk"],ru:["улитка","медленная","моллюск"]},"🦋":{en:["butterfly","insect","colorful"],ru:["бабочка","насекомое","яркая"]},"🐛":{en:["caterpillar","insect","larva"],ru:["гусеница","насекомое","личинка"]},"🐜":{en:["ant","small","insect"],ru:["муравей","маленький","насекомое"]},"🐝":{en:["bee","insect","honey"],ru:["пчела","насекомое","мёд"]},"🪲":{en:["beetle","insect","bug"],ru:["жук","насекомое","баг"]},"🐞":{en:["ladybug","insect","lucky"],ru:["божья коровка","насекомое","счастливая"]},"🦗":{en:["cricket","insect","chirp"],ru:["сверчок","насекомое","щебет"]},"🪳":{en:["cockroach","insect","pest"],ru:["таракан","насекомое","вредитель"]},"🕷️":{en:["spider","arachnid","insect"],ru:["паук","паукообразное","насекомое"]},"🕸️":{en:["web","spider","trap"],ru:["паутина","паук","ловушка"]},"🦂":{en:["scorpion","insect","venom"],ru:["скорпион","насекомое","яд"]},"🦟":{en:["mosquito","insect","bite"],ru:["комар","насекомое","укус"]},"🪰":{en:["fly","insect","buzz"],ru:["муха","насекомое","жужжание"]},"🪱":{en:["worm","earth","invertebrate"],ru:["червь","земля","беспозвоночное"]},"🌸":{en:["cherry blossom","flower","spring"],ru:["сакура","цветок","весна"]},"💮":{en:["white flower","flower","symbol"],ru:["белый цветок","цветок","символ"]},"🏵️":{en:["rosette","flower","decorative"],ru:["розетка","цветок","декоративный"]},"🌹":{en:["rose","flower","love","romance"],ru:["роза","цветок","любовь","романтика"]},"🥀":{en:["wilted flower","sad","decay"],ru:["увядший цветок","грусть","разложение"]},"🌺":{en:["hibiscus","flower","tropical"],ru:["гибискус","цветок","тропический"]},"🌻":{en:["sunflower","flower","summer"],ru:["подсолнух","цветок","лето"]},"🌼":{en:["blossom","flower","spring"],ru:["цветение","цветок","весна"]},"🌷":{en:["tulip","flower","spring"],ru:["тюльпан","цветок","весна"]},"🌱":{en:["seedling","plant","growth"],ru:["сеянец","растение","рост"]},"🪴":{en:["potted plant","indoor","green"],ru:["растение в горшке","в помещении","зелёное"]},"🌲":{en:["evergreen","tree","forest"],ru:["вечнозелёное","дерево","лес"]},"🌳":{en:["tree","nature","shade"],ru:["дерево","природа","тень"]},"🌴":{en:["palm tree","tropical","beach"],ru:["пальма","тропический","пляж"]},"🌵":{en:["cactus","desert","succulent"],ru:["кактус","пустыня","суккулент"]},"🌾":{en:["sheaf","grain","farm"],ru:["сноп","зерно","ферма"]},"🌿":{en:["herb","plant","leaf"],ru:["трава","растение","лист"]},"☘️":{en:["shamrock","luck","clover"],ru:["клевер","удача","трилистник"]},"🍀":{en:["four-leaf clover","luck","green"],ru:["клевер с четырьмя листьями","удача","зелёный"]},"🍁":{en:["maple leaf","autumn","fall"],ru:["кленовый лист","осень","осенний"]},"🍂":{en:["fallen leaf","autumn","nature"],ru:["опавший лист","осень","природа"]},"🍃":{en:["leaf","wind","nature"],ru:["лист","ветер","природа"]},"🍎":{en:["apple","red","fruit","healthy"],ru:["яблоко","красное","фрукт","полезное"]},"🍐":{en:["pear","fruit","green","juicy"],ru:["груша","фрукт","зелёная","сочная"]},"🍊":{en:["orange","fruit","citrus","vitamin C"],ru:["апельсин","фрукт","цитрус","витамин C"]},"🍋":{en:["lemon","citrus","sour","yellow"],ru:["лимон","цитрус","кислый","жёлтый"]},"🍌":{en:["banana","fruit","yellow","tropical"],ru:["банан","фрукт","жёлтый","тропический"]},"🍉":{en:["watermelon","fruit","summer","refreshing"],ru:["арбуз","фрукт","лето","освежающий"]},"🍇":{en:["grapes","fruit","purple","vine"],ru:["виноград","фрукт","фиолетовый","виноградная лоза"]},"🍓":{en:["strawberry","fruit","red","sweet"],ru:["клубника","фрукт","красная","сладкая"]},"🫐":{en:["blueberry","fruit","blue","healthy"],ru:["черника","фрукт","синяя","полезная"]},"🍈":{en:["melon","fruit","sweet","green"],ru:["дыня","фрукт","сладкая","зелёная"]},"🍒":{en:["cherry","fruit","red","sweet"],ru:["вишня","фрукт","красная","сладкая"]},"🍑":{en:["peach","fruit","fuzzy","sweet"],ru:["персик","фрукт","шероховатый","сладкий"]},"🥭":{en:["mango","fruit","tropical","yellow"],ru:["манго","фрукт","тропический","жёлтый"]},"🍍":{en:["pineapple","fruit","tropical","spiky"],ru:["ананас","фрукт","тропический","колючий"]},"🥥":{en:["coconut","tropical","fruit","white"],ru:["кокос","тропический","фрукт","белый"]},"🥝":{en:["kiwi","fruit","green","tart"],ru:["киви","фрукт","зелёный","кисловатый"]},"🍅":{en:["tomato","vegetable","red","juicy"],ru:["помидор","овощ","красный","сочный"]},"🍆":{en:["eggplant","vegetable","purple","aubergine"],ru:["баклажан","овощ","фиолетовый","баклажан"]},"🥑":{en:["avocado","vegetable","green","healthy"],ru:["авокадо","овощ","зелёный","полезный"]},"🥦":{en:["broccoli","vegetable","green","healthy"],ru:["брокколи","овощ","зелёный","полезный"]},"🥬":{en:["leafy greens","vegetable","lettuce","healthy"],ru:["листья салата","овощ","салат","полезный"]},"🥒":{en:["cucumber","vegetable","green","fresh"],ru:["огурец","овощ","зелёный","свежий"]},"🌶️":{en:["chili pepper","spicy","red","hot"],ru:["чили","острый","красный","горячий"]},"🫑":{en:["bell pepper","vegetable","colorful","sweet"],ru:["болгарский перец","овощ","разноцветный","сладкий"]},"🥕":{en:["carrot","vegetable","orange","crunchy"],ru:["морковь","овощ","оранжевая","хрустящая"]},"🧄":{en:["garlic","vegetable","aromatic","flavorful"],ru:["чеснок","овощ","ароматный","вкусный"]},"🧅":{en:["onion","vegetable","strong","flavor"],ru:["лук","овощ","сильный","вкус"]},"🥔":{en:["potato","vegetable","starchy","brown"],ru:["картофель","овощ","крахмалистый","коричневый"]},"🍠":{en:["sweet potato","vegetable","orange","starchy"],ru:["батат","овощ","оранжевый","крахмалистый"]},"🥐":{en:["croissant","bread","pastry","flaky"],ru:["круассан","хлеб","выпечка","слоёный"]},"🥯":{en:["bagel","bread","round","chewy"],ru:["бейгл","хлеб","круглый","жевательный"]},"🍞":{en:["bread","baked","loaf","toast"],ru:["хлеб","выпеченный","буханка","тост"]},"🥖":{en:["baguette","bread","French","long"],ru:["багет","хлеб","французский","длинный"]},"🥨":{en:["pretzel","snack","salted","twisted"],ru:["претцель","закуска","солёный","скрученный"]},"🧀":{en:["cheese","dairy","yellow","savory"],ru:["сыр","молочный продукт","жёлтый","пикантный"]},"🥚":{en:["egg","protein","breakfast"],ru:["яйцо","белок","завтрак"]},"🍳":{en:["fried egg","breakfast","cooked"],ru:["жареное яйцо","завтрак","приготовленное"]},"🥓":{en:["bacon","meat","crispy","breakfast"],ru:["бекон","мясо","хрустящий","завтрак"]},"🥩":{en:["steak","meat","protein","beef"],ru:["стейк","мясо","белок","говядина"]},"🍗":{en:["chicken leg","meat","drumstick","grilled"],ru:["куриная ножка","мясо","барабанная палочка","гриль"]},"🍖":{en:["meat on bone","barbecue","protein"],ru:["мясо на кости","барбекю","белок"]},"🦴":{en:["bone","meat","dog","skeleton"],ru:["кость","мясо","собака","скелет"]},"🌭":{en:["hot dog","fast food","sausage"],ru:["хот-дог","фастфуд","колбаска"]},"🍔":{en:["burger","fast food","beef","cheese"],ru:["бургер","фастфуд","говядина","сыр"]},"🍟":{en:["french fries","fast food","crispy","potato"],ru:["картофель фри","фастфуд","хрустящий","картофель"]},"🍕":{en:["pizza","cheese","fast food","Italian"],ru:["пицца","сыр","фастфуд","итальянская"]},"🫓":{en:["flatbread","bread","soft"],ru:["лепёшка","хлеб","мягкая"]},"🥪":{en:["sandwich","bread","meal"],ru:["бутерброд","хлеб","приём пищи"]},"🥙":{en:["pita","bread","stuffed","Greek"],ru:["пита","хлеб","фаршированная","греческая"]},"🧆":{en:["falafel","vegetarian","fried"],ru:["фалафель","вегетарианский","жареный"]},"🌮":{en:["taco","Mexican","spicy"],ru:["тако","мексиканская","острая"]},"🌯":{en:["burrito","Mexican","stuffed"],ru:["буррито","мексиканская","фаршированная"]},"🫔":{en:["tamale","Mexican","corn"],ru:["тамале","мексиканская","кукурузная"]},"🥗":{en:["salad","healthy","vegetable"],ru:["салат","здоровый","овощной"]},"🥘":{en:["paella","stew","seafood"],ru:["паэлья","тушёное блюдо","морепродукты"]},"🫕":{en:["fondue","melted","cheese"],ru:["фондю","расплавленный","сыр"]},"🥫":{en:["canned food","storage","preserved"],ru:["консервы","хранение","сохранённое"]},"🍝":{en:["spaghetti","pasta","Italian"],ru:["спагетти","паста","итальянская"]},"🍜":{en:["ramen","noodles","Asian"],ru:["рамен","лапша","азиатская"]},"🍲":{en:["hotpot","stew","broth"],ru:["хотпот","тушёное блюдо","бульон"]},"🍛":{en:["curry","spicy","rice"],ru:["карри","острая","рис"]},"🍣":{en:["sushi","Japanese","fish"],ru:["суши","японская","рыба"]},"🍱":{en:["bento box","Japanese","meal"],ru:["бенто","японская","еда"]},"🥟":{en:["dumpling","Asian","stuffed"],ru:["пельмени","азиатские","фаршированные"]},"🦪":{en:["oyster","seafood","shellfish"],ru:["устрица","морепродукт","раковина"]},"🍤":{en:["shrimp tempura","fried","seafood"],ru:["креветка темпура","жареная","морепродукт"]},"🍙":{en:["rice ball","Japanese","onigiri"],ru:["рисовый шар","японская","онигири"]},"🍚":{en:["cooked rice","staple","Asian"],ru:["варёный рис","основа","азиатская"]},"🍘":{en:["rice cracker","snack","Japanese"],ru:["рисовый крекер","закуска","японская"]},"🍥":{en:["fish cake","Japanese","swirl"],ru:["рыбный пирожок","японская","спираль"]},"🥠":{en:["fortune cookie","Chinese","paper"],ru:["печенье с предсказанием","китайское","бумажное"]},"🥮":{en:["mooncake","Chinese","festival"],ru:["лунное печенье","китайское","фестиваль"]},"🍢":{en:["skewered snack","street food"],ru:["шампур","уличная еда"]},"🍡":{en:["dango","Japanese","mochi"],ru:["данго","японское","мочи"]},"🍧":{en:["shaved ice","dessert","cold"],ru:["измельчённый лёд","десерт","холодный"]},"🍨":{en:["ice cream","cold","sweet"],ru:["мороженое","холодное","сладкое"]},"🍦":{en:["soft serve","dessert","cold"],ru:["мягкое мороженое","десерт","холодное"]},"🥧":{en:["pie","dessert","baked"],ru:["пирог","десерт","выпеченный"]},"🧁":{en:["cupcake","sweet","frosting"],ru:["капкейк","сладкий","с глазурью"]},"🍰":{en:["cake","dessert","slice"],ru:["торт","десерт","кусок"]},"🎂":{en:["birthday cake","celebration","sweet"],ru:["торт ко дню рождения","празднование","сладкий"]},"🍮":{en:["flan","custard","dessert"],ru:["флан","кастард","десерт"]},"🍭":{en:["lollipop","candy","sweet"],ru:["леденец","конфета","сладкий"]},"🍬":{en:["candy","sweet","sugar"],ru:["конфета","сладость","сахар"]},"🍫":{en:["chocolate","sweet","cocoa"],ru:["шоколад","сладкий","какао"]},"🍿":{en:["popcorn","snack","buttery"],ru:["попкорн","закуска","масляный"]},"🍩":{en:["doughnut","sweet","fried"],ru:["пончик","сладкий","жареный"]},"🍪":{en:["cookie","sweet","baked"],ru:["печенье","сладкое","выпеченное"]},"🫖":{en:["teapot","tea","hot"],ru:["чайник","чай","горячий"]},"☕":{en:["coffee","hot drink","caffeine"],ru:["кофе","горячий напиток","кофеин"]},"🍵":{en:["green tea","hot","Japanese"],ru:["зелёный чай","горячий","японский"]},"🧃":{en:["juice","drink","fruit"],ru:["сок","напиток","фруктовый"]},"🥤":{en:["soft drink","straw","fast food"],ru:["безалкогольный напиток","с трубочкой","фастфуд"]},"🧋":{en:["bubble tea","milk tea","boba"],ru:["бабл-ти","молочный чай","боба"]},"🍶":{en:["sake","Japanese","rice wine"],ru:["саке","японский","рисовое вино"]},"🍺":{en:["beer","drink","alcohol"],ru:["пиво","напиток","алкоголь"]},"🍻":{en:["cheers","beer","drinking"],ru:["ура","пиво","выпивка"]},"🥂":{en:["champagne","celebration","toast"],ru:["шампанское","празднование","тост"]},"🍷":{en:["wine","drink","red"],ru:["вино","напиток","красное"]},"🥃":{en:["whiskey","liquor","alcohol"],ru:["виски","ликёр","алкоголь"]},"🍸":{en:["cocktail","martini","drink"],ru:["коктейль","мартини","напиток"]},"🍹":{en:["tropical drink","cocktail","summer"],ru:["тропический напиток","коктейль","лето"]},"🧉":{en:["mate","South American","tea"],ru:["мате","южноамериканский","чай"]},"🍾":{en:["champagne bottle","celebration","party"],ru:["бутылка шампанского","празднование","вечеринка"]},"⚽":{en:["soccer","football","sports","ball"],ru:["футбол","футбол","спорт","мяч"]},"🏀":{en:["basketball","sports","hoop","dunk"],ru:["баскетбол","спорт","кольцо","данк"]},"🏈":{en:["American football","sports","rugby"],ru:["американский футбол","спорт","регби"]},"⚾":{en:["baseball","sports","bat"],ru:["бейсбол","спорт","бита"]},"🥎":{en:["softball","sports","ball"],ru:["софтбол","спорт","мяч"]},"🎾":{en:["tennis","sports","racket"],ru:["теннис","спорт","ракетка"]},"🏐":{en:["volleyball","sports","beach"],ru:["волейбол","спорт","пляж"]},"🏉":{en:["rugby","sports","oval ball"],ru:["регби","спорт","овальный мяч"]},"🥏":{en:["frisbee","throw","flying disc"],ru:["фрисби","бросок","летающий диск"]},"🎱":{en:["billiards","8 ball","pool"],ru:["бильярд","восьмёрка","пул"]},"🪀":{en:["yo-yo","toy","string"],ru:["йо-йо","игрушка","верёвка"]},"🏓":{en:["ping pong","table tennis","sports"],ru:["пинг-понг","настольный теннис","спорт"]},"🏸":{en:["badminton","racket","sports"],ru:["бадминтон","ракетка","спорт"]},"🏒":{en:["hockey","ice hockey","sports"],ru:["хоккей","хоккей на льду","спорт"]},"🏑":{en:["field hockey","sports","stick"],ru:["хоккей на траве","спорт","клюшка"]},"🥍":{en:["lacrosse","sports","net"],ru:["лакросс","спорт","сеть"]},"🏏":{en:["cricket","bat","sports"],ru:["крикет","бита","спорт"]},"⛳":{en:["golf","sports","hole in one"],ru:["гольф","спорт","луночка"]},"🪁":{en:["kite","flying","wind"],ru:["змей","летать","ветер"]},"🎣":{en:["fishing","hook","water"],ru:["рыбалка","крючок","вода"]},"🤿":{en:["diving","underwater","snorkel"],ru:["дайвинг","под водой","снорклинг"]},"🎽":{en:["running","jersey","athlete"],ru:["бег","майка","спортсмен"]},"🛹":{en:["skateboard","sports","extreme"],ru:["скейтборд","спорт","экстрим"]},"🛼":{en:["roller skate","sports","wheels"],ru:["роликовые коньки","спорт","колёса"]},"🛷":{en:["sled","winter","snow"],ru:["санки","зима","снег"]},"⛸️":{en:["ice skate","winter","sports"],ru:["коньки","зима","спорт"]},"🥌":{en:["curling","winter","stone"],ru:["керлинг","зима","камень"]},"⛷️":{en:["skiing","winter","snow"],ru:["лыжи","зима","снег"]},"🏂":{en:["snowboarding","sports","snow"],ru:["сноуборд","спорт","снег"]},"🪂":{en:["parachute","skydiving","air"],ru:["парашют","скайдайвинг","воздух"]},"🏋️":{en:["weightlifting","gym","strong"],ru:["тяжёлая атлетика","спортзал","сильный"]},"🤼":{en:["wrestling","fight","grapple"],ru:["борьба","драка","схватка"]},"🤸":{en:["gymnastics","acrobatics","flip"],ru:["гимнастика","акробатика","сальто"]},"⛹️":{en:["basketball","dribbling","sports"],ru:["баскетбол","дриблинг","спорт"]},"🤾":{en:["handball","sports","throw"],ru:["гандбол","спорт","бросок"]},"🏌️":{en:["golf","swing","sports"],ru:["гольф","мах","спорт"]},"🏇":{en:["horse racing","sports","jockey"],ru:["конные скачки","спорт","жокей"]},"🧘":{en:["meditation","yoga","zen"],ru:["медитация","йога","дзен"]},"🏄":{en:["surfing","wave","water"],ru:["серфинг","волна","вода"]},"🏊":{en:["swimming","water","pool"],ru:["плавание","вода","бассейн"]},"🤽":{en:["water polo","sports","swimming"],ru:["водное поло","спорт","плавание"]},"🚣":{en:["rowing","boat","water"],ru:["гребля","лодка","вода"]},"🧗":{en:["rock climbing","sports","mountain"],ru:["скалолазание","спорт","гора"]},"🚴":{en:["cycling","bike","sports"],ru:["велоспорт","велосипед","спорт"]},"🚵":{en:["mountain biking","sports","outdoor"],ru:["маунтинбайк","спорт","на свежем воздухе"]},"🎪":{en:["circus","tent","performance"],ru:["цирк","палатка","выступление"]},"🎭":{en:["theater","drama","acting"],ru:["театр","драма","актерство"]},"🎨":{en:["painting","art","colors"],ru:["живопись","искусство","цвета"]},"🎬":{en:["film","clapperboard","movie"],ru:["фильм","хлопушка","кино"]},"🎤":{en:["microphone","singing","music"],ru:["микрофон","пение","музыка"]},"🎧":{en:["headphones","music","listening"],ru:["наушники","музыка","прослушивание"]},"🎼":{en:["music","sheet","notes"],ru:["музыка","ноты","сценарий"]},"🎹":{en:["piano","keyboard","music"],ru:["пианино","клавиатура","музыка"]},"🥁":{en:["drums","music","percussion"],ru:["барабаны","музыка","ударные"]},"🎷":{en:["saxophone","jazz","music"],ru:["саксофон","джаз","музыка"]},"🎺":{en:["trumpet","brass","music"],ru:["труба","латунь","музыка"]},"🎸":{en:["guitar","music","rock"],ru:["гитара","музыка","рок"]},"🎻":{en:["violin","music","strings"],ru:["скрипка","музыка","струны"]},"🎲":{en:["dice","game","board game"],ru:["кубики","игра","настольная игра"]},"🎯":{en:["dart","target","game"],ru:["дротик","цель","игра"]},"🎳":{en:["bowling","sports","pins"],ru:["боулинг","спорт","кегли"]},"🎮":{en:["video game","console","gaming"],ru:["видеоигра","консоль","игры"]},"🎰":{en:["slot machine","casino","gambling"],ru:["игровой автомат","казино","азартные игры"]},"🧩":{en:["puzzle","pieces","brain teaser"],ru:["головоломка","кусочки","разминка для мозга"]},"🎫":{en:["ticket","event","entry"],ru:["билет","событие","вход"]},"🎟️":{en:["admission","ticket","event"],ru:["входной билет","билет","событие"]},"🚗":{en:["car","automobile","vehicle","transport"],ru:["автомобиль","машина","транспортное средство","транспорт"]},"🚕":{en:["taxi","cab","transport","vehicle"],ru:["такси","маршрутка","транспорт","транспортное средство"]},"🚙":{en:["suv","vehicle","transport"],ru:["внедорожник","транспортное средство","транспорт"]},"🚌":{en:["bus","public transport","commute"],ru:["автобус","общественный транспорт","коммьют"]},"🚎":{en:["trolleybus","public transport","electric"],ru:["троллейбус","общественный транспорт","электрический"]},"🏎️":{en:["race car","sports car","fast","speed"],ru:["гоночный автомобиль","спортивный автомобиль","быстрый","скорость"]},"🚓":{en:["police car","law enforcement","vehicle"],ru:["полицейская машина","правоохранительные органы","транспортное средство"]},"🚑":{en:["ambulance","emergency","hospital"],ru:["скорая помощь","чрезвычайная ситуация","больница"]},"🚒":{en:["fire truck","firefighter","emergency"],ru:["пожарная машина","пожарный","чрезвычайная ситуация"]},"🚐":{en:["van","minibus","transport"],ru:["фургон","маршрутка","транспорт"]},"🛻":{en:["pickup truck","off-road","vehicle"],ru:["пикап","для бездорожья","транспортное средство"]},"🚚":{en:["delivery truck","freight","cargo"],ru:["грузовик","доставка","груз"]},"🚛":{en:["truck","semi-trailer","transport"],ru:["грузовик","самосвал","транспорт"]},"🚜":{en:["tractor","farming","agriculture"],ru:["трактор","сельское хозяйство","агрономия"]},"🛵":{en:["scooter","motorbike","moped"],ru:["скутер","мотоцикл","мопед"]},"🏍️":{en:["motorcycle","bike","racing"],ru:["мотоцикл","байк","гоночный"]},"🛺":{en:["rickshaw","auto rickshaw","transport"],ru:["рикша","авто-рикша","транспорт"]},"🚲":{en:["bicycle","bike","pedal","cycling"],ru:["велосипед","байк","педаль","велоспорт"]},"🛴":{en:["kick scooter","scooter","ride"],ru:["самокат","скутер","поездка"]},"✈️":{en:["airplane","flight","travel","sky"],ru:["самолёт","рейс","путешествие","небо"]},"🛩️":{en:["small airplane","aviation","sky"],ru:["малый самолёт","авиация","небо"]},"🛫":{en:["departure","takeoff","airport"],ru:["вылет","взлёт","аэропорт"]},"🛬":{en:["landing","arrival","airport"],ru:["посадка","прибытие","аэропорт"]},"🚁":{en:["helicopter","aviation","air"],ru:["вертолёт","авиация","воздух"]},"🚀":{en:["rocket","space","launch","NASA"],ru:["ракета","космос","запуск","НАСА"]},"🛸":{en:["UFO","alien","spaceship","extraterrestrial"],ru:["НЛО","инопланетянин","космический корабль","внеземной"]},"🛶":{en:["canoe","boat","paddle","water"],ru:["каноэ","лодка","весло","вода"]},"⛵":{en:["sailboat","yacht","sea"],ru:["парусник","яхта","море"]},"🚤":{en:["motorboat","speedboat","ocean"],ru:["моторная лодка","скоростной катер","океан"]},"🛥️":{en:["yacht","luxury","boat"],ru:["яхта","роскошь","лодка"]},"🛳️":{en:["cruise ship","ocean","voyage"],ru:["круизный лайнер","океан","путешествие"]},"⛴️":{en:["ferry","boat","transport"],ru:["паром","лодка","транспорт"]},"🚢":{en:["ship","ocean","voyage"],ru:["корабль","океан","путешествие"]},"🏰":{en:["castle","fortress","history"],ru:["замок","крепость","история"]},"🏯":{en:["Japanese castle","Asia","samurai"],ru:["японский замок","Азия","самурай"]},"🏟️":{en:["stadium","sports","arena"],ru:["стадион","спорт","арена"]},"🏖️":{en:["beach","sun","vacation"],ru:["пляж","солнце","отпуск"]},"🏝️":{en:["island","tropical","vacation"],ru:["остров","тропический","отпуск"]},"🏜️":{en:["desert","sand","dry"],ru:["пустыня","песок","сухой"]},"🌋":{en:["volcano","eruption","lava"],ru:["вулкан","извержение","лава"]},"⛰️":{en:["mountain","hiking","nature"],ru:["гора","поход","природа"]},"🏔️":{en:["snowy mountain","climbing","cold"],ru:["снежная гора","скалолазание","холод"]},"🗻":{en:["Mount Fuji","Japan","scenic"],ru:["гора Фудзи","Япония","живописный"]},"🏕️":{en:["camping","tent","outdoors"],ru:["кемпинг","палатка","на природе"]},"🏭":{en:["factory","industry","building"],ru:["фабрика","индустрия","здание"]},"🏢":{en:["office building","corporate","city"],ru:["офисное здание","корпоративный","город"]},"🏬":{en:["shopping mall","retail","stores"],ru:["торговый центр","розничная торговля","магазины"]},"🏣":{en:["post office","mail","building"],ru:["почтовое отделение","почта","здание"]},"🏤":{en:["post office","mail","postal service"],ru:["почтовое отделение","почта","почтовая служба"]},"🏥":{en:["hospital","healthcare","emergency"],ru:["больница","здравоохранение","чрезвычайная ситуация"]},"🏦":{en:["bank","money","finance"],ru:["банк","деньги","финансы"]},"🏨":{en:["hotel","accommodation","stay"],ru:["отель","размещение","проживание"]},"🏪":{en:["convenience store","shopping","24/7"],ru:["магазин","шоппинг","круглосуточно"]},"🏫":{en:["school","education","learning"],ru:["школа","образование","обучение"]},"🏩":{en:["love hotel","romantic","Japan"],ru:["любовный отель","романтический","Япония"]},"💒":{en:["wedding","church","marriage"],ru:["свадьба","церковь","брак"]},"⛪":{en:["church","Christianity","religion"],ru:["церковь","христианство","религия"]},"🕌":{en:["mosque","Islam","prayer"],ru:["мечеть","ислам","молитва"]},"🕍":{en:["synagogue","Judaism","religion"],ru:["синагога","иудаизм","религия"]},"🛕":{en:["hindu temple","spiritual","India"],ru:["индуистский храм","духовный","Индия"]},"⛩️":{en:["shrine","torii","Japan"],ru:["святилище","тории","Япония"]},"🏛️":{en:["government building","politics","history"],ru:["правительственное здание","политика","история"]},"📱":{en:["smartphone","mobile","phone"],ru:["смартфон","мобильный","телефон"]},"💻":{en:["laptop","computer","technology"],ru:["ноутбук","компьютер","технология"]},"⌨️":{en:["keyboard","typing","computer"],ru:["клавиатура","набор текста","компьютер"]},"🖥️":{en:["desktop","monitor","screen"],ru:["настольный компьютер","монитор","экран"]},"🖨️":{en:["printer","print","office"],ru:["принтер","печать","офис"]},"🖱️":{en:["mouse","computer","click"],ru:["мышь","компьютер","клик"]},"🖲️":{en:["trackball","navigation","input"],ru:["трекбол","навигация","ввод"]},"🕹️":{en:["joystick","gaming","console"],ru:["джойстик","игры","консоль"]},"🗜️":{en:["clamp","tool","hardware"],ru:["зажим","инструмент","аппаратное обеспечение"]},"💽":{en:["mini disc","storage","media"],ru:["мини-диск","хранение","медиа"]},"💾":{en:["floppy disk","save","data"],ru:["флоппи-диск","сохранить","данные"]},"💿":{en:["CD","compact disc","music"],ru:["CD","компакт-диск","музыка"]},"📀":{en:["DVD","video","disc"],ru:["DVD","видео","диск"]},"📼":{en:["VHS","video cassette","retro"],ru:["VHS","видеокассета","ретро"]},"📷":{en:["camera","photo","photography"],ru:["камера","фото","фотография"]},"📸":{en:["camera flash","photography","snapshot"],ru:["вспышка камеры","фотография","снимок"]},"📹":{en:["video camera","recording","film"],ru:["видеокамера","запись","фильм"]},"🎥":{en:["movie camera","film","cinema"],ru:["кино-камера","фильм","кино"]},"📞":{en:["telephone","call","communication"],ru:["телефон","звонок","коммуникация"]},"☎️":{en:["phone","landline","call"],ru:["телефон","стационарный","звонок"]},"📟":{en:["pager","message","communication"],ru:["пейджер","сообщение","коммуникация"]},"📠":{en:["fax machine","office","document"],ru:["факс","офис","документ"]},"📺":{en:["TV","television","screen"],ru:["телевизор","теле","экран"]},"📻":{en:["radio","broadcast","audio"],ru:["радио","трансляция","аудио"]},"🎙️":{en:["microphone","recording","podcast"],ru:["микрофон","запись","подкаст"]},"🎚️":{en:["control knob","audio","volume"],ru:["ручка управления","аудио","громкость"]},"🎛️":{en:["sliders","equalizer","settings"],ru:["ползунки","эквалайзер","настройки"]},"📡":{en:["satellite dish","broadcast","signal"],ru:["спутниковая антенна","трансляция","сигнал"]},"🔋":{en:["battery","power","energy"],ru:["батарея","мощность","энергия"]},"🔌":{en:["plug","electricity","charging"],ru:["штекер","электричество","зарядка"]},"💡":{en:["light bulb","idea","illumination"],ru:["лампочка","идея","освещение"]},"🔦":{en:["flashlight","torch","light"],ru:["фонарик","фонарь","свет"]},"🕯️":{en:["candle","light","fire"],ru:["свеча","свет","огонь"]},"🧯":{en:["fire extinguisher","safety","fire"],ru:["огнетушитель","безопасность","огонь"]},"🛢️":{en:["barrel","oil","fuel"],ru:["бочка","масло","топливо"]},"💸":{en:["money with wings","cash","spending"],ru:["деньги с крыльями","наличные","расходы"]},"💵":{en:["dollar bills","money","USD"],ru:["долларовые банкноты","деньги","USD"]},"💴":{en:["yen","money","Japan"],ru:["иена","деньги","Япония"]},"💶":{en:["euro","money","currency"],ru:["евро","деньги","валюта"]},"💷":{en:["pound","money","UK"],ru:["фунт","деньги","Великобритания"]},"🪙":{en:["coin","currency","money"],ru:["монета","валюта","деньги"]},"💰":{en:["money bag","wealth","rich"],ru:["мешок с деньгами","богатство","богатый"]},"💳":{en:["credit card","banking","payment"],ru:["кредитная карта","банковское дело","оплата"]},"💎":{en:["gem","diamond","valuable"],ru:["драгоценный камень","бриллиант","ценный"]},"⚖️":{en:["balance scale","justice","law"],ru:["весы","справедливость","закон"]},"🪜":{en:["ladder","climb","height"],ru:["лестница","лазить","высота"]},"🧰":{en:["toolbox","tools","repair"],ru:["ящик с инструментами","инструменты","ремонт"]},"🔧":{en:["wrench","repair","tools"],ru:["гаечный ключ","ремонт","инструменты"]},"🔨":{en:["hammer","build","fix"],ru:["молоток","строить","чинить"]},"⚒️":{en:["hammer and pick","construction","work"],ru:["молот и кирка","строительство","работа"]},"🛠️":{en:["tools","fix","maintenance"],ru:["инструменты","чинить","обслуживание"]},"⛏️":{en:["pickaxe","mining","digging"],ru:["кирка","горное дело","копать"]},"✏️":{en:["pencil","writing","notes"],ru:["карандаш","написание","заметки"]},"🖊️":{en:["pen","writing","signature"],ru:["ручка","написание","подпись"]},"🖋️":{en:["fountain pen","calligraphy","writing"],ru:["перьевая ручка","каллиграфия","написание"]},"✒️":{en:["nib","ink","writing"],ru:["остриё","чернила","написание"]},"🖌️":{en:["paintbrush","art","painting"],ru:["кисть","искусство","живопись"]},"🖍️":{en:["crayon","drawing","color"],ru:["мелки","рисование","цвет"]},"📝":{en:["memo","notes","document"],ru:["заметка","записи","документ"]},"📚":{en:["books","reading","library"],ru:["книги","чтение","библиотека"]},"📖":{en:["open book","reading","story"],ru:["открытая книга","чтение","история"]},"🔖":{en:["bookmark","reading","save"],ru:["закладка","чтение","сохранить"]},"📑":{en:["bookmark tabs","pages","notes"],ru:["закладки","страницы","заметки"]},"🗒️":{en:["spiral notepad","notes","journal"],ru:["спиральный блокнот","записи","журнал"]},"📄":{en:["document","paper","page"],ru:["документ","бумага","страница"]},"📰":{en:["newspaper","news","journalism"],ru:["газета","новости","журналистика"]},"🗞️":{en:["rolled newspaper","press","print"],ru:["свернутая газета","пресса","печатное издание"]},"📁":{en:["file folder","documents","storage"],ru:["папка","документы","хранение"]},"📂":{en:["open folder","organization","files"],ru:["открытая папка","организация","файлы"]},"🗂️":{en:["card index","catalog","records"],ru:["карточный индекс","каталог","записи"]},"🕐":{en:["1 o'clock","clock face","time"],ru:["час","циферблат","время"]},"🕑":{en:["2 o'clock","clock face","time"],ru:["два часа","циферблат","время"]},"🕒":{en:["3 o'clock","clock face","time"],ru:["три часа","циферблат","время"]},"🕓":{en:["4 o'clock","clock face","time"],ru:["четыре часа","циферблат","время"]},"🕔":{en:["5 o'clock","clock face","time"],ru:["пять часов","циферблат","время"]},"🕕":{en:["6 o'clock","clock face","time"],ru:["шесть часов","циферблат","время"]},"🕖":{en:["7 o'clock","clock face","time"],ru:["семь часов","циферблат","время"]},"🕗":{en:["8 o'clock","clock face","time"],ru:["восемь часов","циферблат","время"]},"🕘":{en:["9 o'clock","clock face","time"],ru:["девять часов","циферблат","время"]},"🕙":{en:["10 o'clock","clock face","time"],ru:["десять часов","циферблат","время"]},"🕚":{en:["11 o'clock","clock face","time"],ru:["одиннадцать часов","циферблат","время"]},"🕛":{en:["12 o'clock","clock face","time"],ru:["двенадцать часов","циферблат","время"]},"🕰️":{en:["mantel clock","clock","time"],ru:["настенные часы","часы","время"]},"⏰":{en:["alarm clock","wake up","time"],ru:["будильник","пробуждение","время"]},"⏱️":{en:["stopwatch","timer","time"],ru:["секундомер","таймер","время"]},"⏲️":{en:["kitchen timer","timer","time"],ru:["кухонный таймер","таймер","время"]},"⌚":{en:["watch","smartwatch","time"],ru:["часы","умные часы","время"]},"❤️":{en:["heart","love","affection"],ru:["сердце","любовь","нежность"]},"🧡":{en:["orange heart","warmth","care"],ru:["оранжевое сердце","теплота","забота"]},"💛":{en:["yellow heart","friendship","happiness"],ru:["жёлтое сердце","дружба","счастье"]},"💚":{en:["green heart","envy","nature","eco"],ru:["зелёное сердце","зависть","природа","эко"]},"💙":{en:["blue heart","loyalty","trust"],ru:["синее сердце","верность","доверие"]},"💜":{en:["purple heart","compassion","admiration"],ru:["фиолетовое сердце","сострадание","восхищение"]},"🤎":{en:["brown heart","earth","stability"],ru:["коричневое сердце","земля","устойчивость"]},"🖤":{en:["black heart","mourning","dark"],ru:["чёрное сердце","скорбь","тёмный"]},"🤍":{en:["white heart","pure","peace"],ru:["белое сердце","чистый","мир"]},"💔":{en:["broken heart","sad","heartbreak"],ru:["разбитое сердце","грусть","сердечная боль"]},"❣️":{en:["heart exclamation","love","emotion"],ru:["сердечный восклицательный знак","любовь","эмоция"]},"💕":{en:["two hearts","romance","affection"],ru:["два сердца","романтика","нежность"]},"💞":{en:["revolving hearts","love","relationship"],ru:["вращающиеся сердца","любовь","отношения"]},"💓":{en:["beating heart","emotion","passion"],ru:["бьющееся сердце","эмоция","страсть"]},"💗":{en:["growing heart","love","expanding"],ru:["растущее сердце","любовь","расширяющееся"]},"💖":{en:["sparkling heart","admiration","shine"],ru:["блестящее сердце","восхищение","сияние"]},"💘":{en:["heart with arrow","love","romance"],ru:["сердце со стрелой","любовь","романтика"]},"💝":{en:["heart with ribbon","gift","affection"],ru:["сердце с лентой","подарок","нежность"]},"💟":{en:["heart decoration","symbol","love"],ru:["украшение сердца","символ","любовь"]},"☮️":{en:["peace","pacifism","symbol"],ru:["мир","пацифизм","символ"]},"✝️":{en:["cross","christianity","religion"],ru:["крест","христианство","религия"]},"☪️":{en:["star and crescent","islam","faith"],ru:["звезда и полумесяц","ислам","вера"]},"🕉️":{en:["om","hinduism","spiritual"],ru:["ом","индуизм","духовный"]},"☸️":{en:["dharma wheel","buddhism","karma"],ru:["колесо дхармы","буддизм","карма"]},"✡️":{en:["star of david","judaism","faith"],ru:["звезда Давида","иудаизм","вера"]},"🔯":{en:["hexagram","mystic","spiritual"],ru:["шестиконечная звезда","мистический","духовный"]},"🕎":{en:["menorah","hanukkah","jewish"],ru:["менора","Ханука","еврейский"]},"☯️":{en:["yin yang","balance","harmony"],ru:["инь-ян","баланс","гармония"]},"☦️":{en:["orthodox cross","christianity","faith"],ru:["православный крест","христианство","вера"]},"🛐":{en:["place of worship","religion","faith"],ru:["место поклонения","религия","вера"]},"⛎":{en:["ophiuchus","zodiac","astrology"],ru:["змееносец","зодиак","астрология"]},"⚠️":{en:["warning","caution","alert"],ru:["предупреждение","осторожность","тревога"]},"🚸":{en:["children crossing","school","pedestrian"],ru:["дети на переходе","школа","пешеход"]},"⛔":{en:["no entry","prohibited","restricted"],ru:["вход запрещён","запрещено","ограничено"]},"🚫":{en:["prohibited","no","forbidden"],ru:["запрещено","нет","запрещено"]},"☢️":{en:["radioactive","hazard","danger"],ru:["радиоактивный","опасность","угроза"]},"☣️":{en:["biohazard","toxic","warning"],ru:["биологическая опасность","ядовитый","предупреждение"]},"➕":{en:["plus","addition","math"],ru:["плюс","сложение","математика"]},"➖":{en:["minus","subtraction","math"],ru:["минус","вычитание","математика"]},"➗":{en:["division","divide","math"],ru:["деление","делить","математика"]},"✖️":{en:["multiplication","times","math"],ru:["умножение","раз","математика"]},"♾️":{en:["infinity","limitless","math"],ru:["бесконечность","безграничный","математика"]},"💲":{en:["dollar","money","currency"],ru:["доллар","деньги","валюта"]},"💱":{en:["currency exchange","finance","money"],ru:["обмен валюты","финансы","деньги"]},"⬆️":{en:["up arrow","increase","direction"],ru:["стрелка вверх","увеличение","направление"]},"↗️":{en:["up-right arrow","growth","move"],ru:["стрелка вверх-вправо","рост","движение"]},"➡️":{en:["right arrow","next","forward"],ru:["стрелка вправо","далее","вперёд"]},"↘️":{en:["down-right arrow","decrease","move"],ru:["стрелка вниз-вправо","уменьшение","движение"]},"⬇️":{en:["down arrow","lower","decline"],ru:["стрелка вниз","понижение","снижение"]},"↙️":{en:["down-left arrow","falling","move"],ru:["стрелка вниз-влево","падение","движение"]},"⬅️":{en:["left arrow","back","previous"],ru:["стрелка влево","назад","предыдущий"]},"↖️":{en:["up-left arrow","direction","move"],ru:["стрелка вверх-влево","направление","движение"]},"↕️":{en:["vertical arrows","up down","change"],ru:["вертикальные стрелки","вверх вниз","изменение"]},"↔️":{en:["horizontal arrows","left right","switch"],ru:["горизонтальные стрелки","влево вправо","переключение"]},"↩️":{en:["back arrow","undo","return"],ru:["стрелка назад","отмена","возврат"]},"↪️":{en:["right curved arrow","redirect","turn"],ru:["изогнутая стрелка вправо","перенаправление","поворот"]},"⤴️":{en:["up-right arrow","diagonal","move"],ru:["диагональная стрелка вверх-вправо","диагональ","движение"]},"⤵️":{en:["down-right arrow","diagonal","move"],ru:["диагональная стрелка вниз-вправо","диагональ","движение"]},"🔃":{en:["repeat","cycle","refresh"],ru:["повтор","цикл","обновление"]},"🔄":{en:["counterclockwise arrows","reload","sync"],ru:["стрелки против часовой стрелки","перезагрузка","синхронизация"]},"🔆":{en:["bright","high brightness","sun"],ru:["яркий","высокая яркость","солнце"]},"📶":{en:["signal","network","connection"],ru:["сигнал","сеть","соединение"]},"🎦":{en:["cinema","movies","entertainment"],ru:["кино","фильмы","развлечения"]},"🔅":{en:["dim","low brightness","light"],ru:["тусклый","низкая яркость","свет"]},"♻️":{en:["recycle","eco","sustainability"],ru:["переработка","эко","устойчивость"]},"✅":{en:["check mark","yes","approved"],ru:["галочка","да","одобрено"]},"❌":{en:["cross mark","no","wrong"],ru:["крестик","нет","неправильно"]},"❎":{en:["negative cross","decline","cancel"],ru:["отрицательный крест","отказ","отмена"]},"➰":{en:["curly loop","infinity","twist"],ru:["извилистая петля","бесконечность","скрутка"]},"➿":{en:["double curly loop","loop","repeat"],ru:["двойная извилистая петля","петля","повтор"]},"〽️":{en:["part alternation","music","symbol"],ru:["знак чередования","музыка","символ"]},"✳️":{en:["eight-spoked asterisk","star","highlight"],ru:["восьмиконечная астериска","звезда","акцент"]},"✴️":{en:["eight-pointed star","shine","special"],ru:["восьмиконечная звезда","сияние","особый"]},"❇️":{en:["sparkle","highlight","shine"],ru:["сверкание","акцент","сияние"]},"©️":{en:["copyright","legal","rights"],ru:["авторское право","юридический","права"]},"®️":{en:["registered","trademark","brand"],ru:["зарегистрировано","торговая марка","бренд"]},"™️":{en:["trademark","brand","symbol"],ru:["торговая марка","бренд","символ"]},"🏁":{en:["checkered flag","finish line","racing"],ru:["шашечный флаг","финишная черта","гонки"]},"🚩":{en:["triangular flag","mark","warning"],ru:["треугольный флаг","метка","предупреждение"]},"🎌":{en:["crossed flags","celebration","Japan"],ru:["перекрещённые флаги","празднование","Япония"]},"🏴":{en:["black flag","protest","symbol"],ru:["чёрный флаг","протест","символ"]},"🏳️":{en:["white flag","surrender","peace"],ru:["белый флаг","капитуляция","мир"]},"🏳️‍🌈":{en:["rainbow flag","LGBTQ+","pride"],ru:["радужный флаг","ЛГБТК+","гордость"]},"🏳️‍⚧️":{en:["transgender flag","trans","pride"],ru:["трансгендерный флаг","транс","гордость"]},"🏴‍☠️":{en:["pirate flag","skull","danger"],ru:["пиратский флаг","череп","опасность"]},"🇺🇸":{en:["United States","USA","America"],ru:["Соединённые Штаты","США","Америка"]},"🇬🇧":{en:["United Kingdom","UK","Britain"],ru:["Соединённое Королевство","Великобритания","Британия"]},"🇯🇵":{en:["Japan","Japanese","Asia"],ru:["Япония","японский","Азия"]},"🇰🇷":{en:["South Korea","Korea","Asian"],ru:["Южная Корея","Корея","азиатский"]},"🇩🇪":{en:["Germany","Deutschland","Europe"],ru:["Германия","Германия","Европа"]},"🇨🇳":{en:["China","Chinese","Asia"],ru:["Китай","китайский","Азия"]},"🇧🇷":{en:["Brazil","Brasil","South America"],ru:["Бразилия","Бразилия","Южная Америка"]},"🇮🇳":{en:["India","Indian","Asia"],ru:["Индия","индийский","Азия"]},"🇫🇷":{en:["France","French","Europe"],ru:["Франция","французский","Европа"]},"🇪🇸":{en:["Spain","Spanish","Europe"],ru:["Испания","испанский","Европа"]},"🇮🇹":{en:["Italy","Italian","Europe"],ru:["Италия","итальянский","Европа"]},"🇷🇺":{en:["Russia","Russian","Europe"],ru:["Россия","русский","Европа"]},"🇨🇦":{en:["Canada","Canadian","North America"],ru:["Канада","канадский","Северная Америка"]},"🇦🇺":{en:["Australia","Aussie","Oceania"],ru:["Австралия","австралиец","Океания"]},"🇳🇿":{en:["New Zealand","Kiwi","Oceania"],ru:["Новая Зеландия","киви","Океания"]},"🇲🇽":{en:["Mexico","Mexican","Latin America"],ru:["Мексика","мексиканский","Латинская Америка"]},"🇦🇷":{en:["Argentina","Argentinian","South America"],ru:["Аргентина","аргентинский","Южная Америка"]},"🇵🇰":{en:["Pakistan","Pakistani","Asia"],ru:["Пакистан","пакистанский","Азия"]},"🇪🇬":{en:["Egypt","Egyptian","Africa"],ru:["Египет","египетский","Африка"]},"🇸🇪":{en:["Sweden","Swedish","Europe"],ru:["Швеция","шведский","Европа"]},"🇳🇴":{en:["Norway","Norwegian","Europe"],ru:["Норвегия","норвежский","Европа"]},"🇳🇱":{en:["Netherlands","Dutch","Europe"],ru:["Нидерланды","голландский","Европа"]},"🇨🇭":{en:["Switzerland","Swiss","Europe"],ru:["Швейцария","швейцарский","Европа"]},"🇹🇷":{en:["Turkey","Turkish","Eurasia"],ru:["Турция","турецкий","Евразия"]},"🇮🇩":{en:["Indonesia","Indonesian","Asia"],ru:["Индонезия","индонезийский","Азия"]},"🇸🇬":{en:["Singapore","Singaporean","Asia"],ru:["Сингапур","сингапурский","Азия"]},"🇮🇱":{en:["Israel","Israeli","Middle East"],ru:["Израиль","израильский","Ближний Восток"]},"🇵🇹":{en:["Portugal","Portuguese","Europe"],ru:["Португалия","португальский","Европа"]},"🇵🇱":{en:["Poland","Polish","Europe"],ru:["Польша","польский","Европа"]},"🇹🇭":{en:["Thailand","Thai","Asia"],ru:["Таиланд","тайский","Азия"]}},xe={hslToHex(e,t,n){t/=100,n/=100;const r=(1-Math.abs(2*n-1))*t,o=r*(1-Math.abs(e/60%2-1)),a=n-r/2;let i,s,c;return e<60?(i=r,s=o,c=0):e<120?(i=o,s=r,c=0):e<180?(i=0,s=r,c=o):e<240?(i=0,s=o,c=r):e<300?(i=o,s=0,c=r):(i=r,s=0,c=o),i=Math.round(255*(i+a)),s=Math.round(255*(s+a)),c=Math.round(255*(c+a)),"#"+((1<<24)+(i<<16)+(s<<8)+c).toString(16).slice(1)},hexToHSL(e){3===(e=e.replace(/^#/,"")).length&&(e=e.split("").map((e=>e+e)).join(""));const t=parseInt(e.substring(0,2),16)/255,n=parseInt(e.substring(2,4),16)/255,r=parseInt(e.substring(4,6),16)/255,o=Math.max(t,n,r),a=Math.min(t,n,r);let i=0,s=0;const c=(o+a)/2;if(o!==a){const e=o-a;s=c>.5?e/(2-o-a):e/(o+a),i=o===t?60*((n-r)/e+(n<r?6:0)):o===n?60*((r-t)/e+2):60*((t-n)/e+4)}return{h:Math.round(i),s:100*s,l:100*c}},hexToHue(e){return this.hexToHSL(e).h},getLuminance(e){e=e.replace("#","");const t=parseInt(e.slice(0,2),16)/255,n=parseInt(e.slice(2,4),16)/255,r=parseInt(e.slice(4,6),16)/255,o=e=>e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4);return.2126*o(t)+.7152*o(n)+.0722*o(r)},contrastRatio(e,t){const n=this.getLuminance(e),r=this.getLuminance(t);return(Math.max(n,r)+.05)/(Math.min(n,r)+.05)}};function ke(e){const t=e.storageKey||"usernameColors";let n;try{const e=sessionStorage.getItem(t);n=e?JSON.parse(e):{}}catch(e){n={}}const r=e.hueRanges||[{min:0,max:360}],o=r.reduce(((e,t)=>e+(t.max-t.min)),0),a=Boolean(e.saturation),i=Boolean(e.lightness),s=e.minSaturation||40,c=e.maxSaturation||90,l=e.minLightness||55,d=e.maxLightness||80,u=c-s,p=new Set(Object.values(n)),m=new Set;function h(){let e=Math.floor(Math.random()*o);for(let t of r){const n=t.max-t.min;if(e<n)return t.min+e;e-=n}return r[0].min}return Object.values(n).forEach((e=>{try{m.add(xe.hexToHue(e))}catch(e){}})),{getColor(r){if(!r){const t=a?parseInt(e.saturation,10):50;let n=i?parseInt(e.lightness,10):50;return xe.hslToHex(0,t,n)}const c=r.trim().toLowerCase();let g={};try{const e=localStorage.getItem(t);g=e?JSON.parse(e):{}}catch(e){}if(g[c])return g[c];if(n[c])return n[c];let f=null,y=0;for(;!f&&y<10;){let t;if(m.size>=o)t=h();else do{t=h()}while(m.has(t)&&m.size<o);const n=a?parseInt(e.saturation,10):Math.floor(Math.random()*u)+s;let r;if(i)r=parseInt(e.lightness,10),t>=210&&t<280&&r<65&&(r=65);else{let e=l;t>=210&&t<280&&(e=Math.max(l,65));const n=d-e;r=Math.floor(Math.random()*n)+e}const c=xe.hslToHex(t,n,r);if(!p.has(c)){f=c,m.add(t);break}y++}if(!f){const t=h(),n=a?parseInt(e.saturation,10):Math.floor(Math.random()*u)+s;let r;if(i)r=parseInt(e.lightness,10),t>=210&&t<280&&r<65&&(r=65);else{let e=l;t>=210&&t<280&&(e=Math.max(l,65));const n=d-e;r=Math.floor(Math.random()*n)+e}f=xe.hslToHex(t,n,r)}return n[c]=f,p.add(f),this.saveColors(),f},saveTimeout:null,saveColors(){this.saveTimeout&&clearTimeout(this.saveTimeout),this.saveTimeout=setTimeout((()=>{try{sessionStorage.setItem(t,JSON.stringify(n))}catch(e){}}),500)}}}const Ee=ke({storageKey:"usernameColors",minSaturation:40,maxSaturation:90,minLightness:55,maxLightness:80}),Se=ke({storageKey:"mentionColors",saturation:"80",lightness:"60"});let Ce=null;function Le(){let e;do{e=N[Math.floor(Math.random()*N.length)]}while(e===Ce);return Ce=e,e}function je(){const e=document.querySelector("#app-chat-container .chat-wrapper");if(!e)return;const t=document.querySelector("#app-chat-container"),n=e.offsetWidth<=780,r=e.offsetWidth<=380,o=document.querySelector("#app-chat-container .user-list-container"),a=document.querySelectorAll("#app-chat-container .message.system");let i=!1;const s=pt();if(o)if(n||s){o.style.position="absolute",o.style.height="100%",o.style.top="0",o.style.right="0",o.style.transition="transform 0.3s ease",o.style.zIndex="1001",o.style.transform="translateX(100%)",a&&a.length>0&&a.forEach((e=>{e.style.setProperty("align-items","start","important")}));let c=document.querySelector("#app-chat-container .reveal-userlist-btn");if(!c){function l(e){o.contains(e.target)||e.target===c||(o.style.transform="translateX(100%)",c.classList.remove("shown-userlist"),c.classList.add("hidden-userlist"),i=!1,document.removeEventListener("click",l,!0))}c=document.createElement("button"),c.className="reveal-userlist-btn hidden-userlist",c.textContent="📋",t.appendChild(c),c.addEventListener("click",(e=>{e.stopPropagation(),i||(o.style.transform="translateX(0)",c.classList.remove("hidden-userlist"),c.classList.add("shown-userlist"),i=!0,setTimeout((()=>{document.addEventListener("click",l,!0)}),10))}))}}else{o.style.position="",o.style.height="",o.style.top="",o.style.right="",o.style.transform="",o.style.zIndex="",a&&a.length>0&&a.forEach((e=>{e.style.removeProperty("align-items")}));const d=document.querySelector("#app-chat-container .reveal-userlist-btn");d&&d.remove()}document.querySelectorAll("#app-chat-container .message").forEach((e=>{const t=e.querySelector(".message-text");e.style.flexDirection=n?"column":"row",e.style.marginBottom=n?"0.8em":"0",t.style.marginTop=n?"0.2em":"0"}));document.querySelectorAll("#app-chat-container .video-container, #app-chat-container .youtube-thumb").forEach((e=>e.style.maxWidth=r?"100%":""))}function Ie(){const e=document.getElementById("app-chat-container"),t=document.querySelector(".chat-toggle-button");if(!e||!t)return;const n=Me(),r=window.innerWidth,o=window.innerHeight,a=getComputedStyle(document.documentElement),i=parseInt(a.getPropertyValue("--min-chat-width"))||250,s=parseInt(a.getPropertyValue("--min-chat-height"))||200;e.style.width=Math.min(r,Math.max(i,n.width))+"px",e.style.height=Math.min(o,Math.max(s,n.height))+"px",e.style.left=Ne(n.left,0,r-e.offsetWidth)+"px",n.floating?(e.style.top=Ne(n.top,0,o-e.offsetHeight)+"px",e.style.bottom="",e.classList.add("floating-chat"),e.style.display=n.isVisible?"flex":"none",e.style.opacity=n.isVisible?"1":"0",t.innerHTML=n.isVisible?me:he):(e.style.bottom="0",e.style.top="",e.classList.remove("floating-chat"),e.classList.remove("visible-chat","hidden-chat"),e.classList.add(n.isVisible?"visible-chat":"hidden-chat"),t.innerHTML=n.isVisible?me:he),je()}function Me(){const e=localStorage.getItem("chatState"),t={height:300,width:Math.min(window.innerWidth,600),left:0,floating:!1,top:window.innerHeight-300,isVisible:!0,fontSizeMultiplier:1};return e?{...t,...JSON.parse(e)}:t}function Ae(e){const t=document.getElementById("app-chat-container"),n=document.getElementById("message-input");if(!t)return;t.style.fontSize=`${e}em`,n&&(n.style.fontSize="1em");Te({...Me(),fontSizeMultiplier:e})}function $e(){Ae(Me().fontSizeMultiplier)}function Te(e){localStorage.setItem("chatState",JSON.stringify(e))}function Ne(e,t,n){return Math.min(Math.max(e,t),n)}function ze(e){return"string"!=typeof e?e:e.replace(/^\d+#/,"")}function Pe(e){if(!e)return null;const t=e.split("/");if(t.length<2)return null;return t[1].split("#")[0]}function Be(e){return e?e.includes("#")?e.split("#")[1]:e.replace(/^\d+#/,""):"Unknown"}function He(e,t,n){e&&(e.offsetHeight,e.style.transition="opacity 0.3s ease",e.style.opacity="show"===t?n:"0","hide"===t&&e.addEventListener("transitionend",(()=>{"0"===e.style.opacity&&e.parentNode&&e.parentNode.removeChild(e)}),{once:!0}))}const qe=e=>{try{const{hostname:t}=new URL(e),n=t.toLowerCase().split(".").slice(-2).join(".");return{isTrusted:z.includes(n),domain:n}}catch(t){return console.error("Error in isTrustedDomain:",t.message),{isTrusted:!1,domain:e}}};function Re(e){return/^https?:\/\//.test(e)&&/%[0-9A-Fa-f]{2}/.test(e)}function De(e){const[t]=e.split("#");return decodeURIComponent(t).replace(/ /g,"_")}const _e="https://github.com/VimiummuimiV/KG_Chat_Application/raw/refs/heads/main/src/sounds/notification-pluck-on.mp3";function Ue(e){const t=new Audio(e);t.volume=1,t.play()}function Oe(){const e=document.getElementById("messages-panel");if(!e)return;const t=localStorage.getItem("klavoauth");let n="";try{if(t){const e=JSON.parse(t);e&&e.username&&(n=Be(e.username))}}catch(e){console.error("Error parsing auth data:",e)}if(!n)return;const r=[n],o=new WeakSet;e.querySelectorAll(".message-text:not(.processed-for-mention)").forEach((e=>{const t=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:e=>{if(o.has(e))return NodeFilter.FILTER_SKIP;return e.parentElement.closest(".mention, .time, .username")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT}}),n=[];let a;for(;a=t.nextNode();)n.push(a);n.length>0&&(n.forEach((e=>{o.has(e)||(!function(e,t){const n=/(@?[\wа-яА-ЯёЁ'-]+)|[\s]+|[^@\s\wа-яА-ЯёЁ'-]+/gu,r=e.textContent.match(n)||[],o=document.createDocumentFragment();r.forEach((e=>{if(t.some((t=>0===t.localeCompare(e,void 0,{sensitivity:"accent"})))){const t=document.createElement("span");t.className="mention",e.split("").forEach((e=>{const n=document.createElement("span");n.style.color=Se.getColor(e),n.textContent=e,t.appendChild(n)})),o.appendChild(t)}else o.appendChild(document.createTextNode(e))})),e.parentNode.replaceChild(o,e)}(e,r),o.add(e))})),e.classList.add("processed-for-mention"))}))}function Je(e){const t=document.getElementById("messages-panel");if(!t)return;t.scrollHeight-t.scrollTop-t.clientHeight<=e&&(t.scrollTop=t.scrollHeight)}function Fe(e,t={}){const n=document.querySelector(".chat-drag-area");if(!n)return;const r=n.querySelector(".chat-dynamic-alert");r&&r.parentNode===n&&n.removeChild(r);const o={type:"info",duration:3e3,...t},a={info:"#2196F3",warning:"#FF9800",error:"#F44336",success:"#4CAF50"},i=document.createElement("div");i.className="chat-dynamic-alert",i.innerHTML=e,i.style.cssText=`\n    position: absolute;\n    white-space: nowrap;\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n    color: ${a[o.type]||a.info};\n    padding: 5px 10px;\n    border-radius: 3px;\n    z-index: 1000;\n    font-family: "Montserrat", sans-serif;\n    font-size: 10px;\n    font-weight: 500;\n    opacity: 0;\n  `,n.appendChild(i),requestAnimationFrame((()=>{i.style.transition="all 0.3s cubic-bezier(0.68, -0.55, 0.27, 1.55)",i.style.opacity="1",i.style.transform="translate(-50%, -50%)",setTimeout((()=>{i.style.transition="transform 0.05s ease-in-out",[{x:5,delay:0},{x:-7,delay:50},{x:9,delay:100},{x:-6,delay:150},{x:4,delay:200},{x:-3,delay:250},{x:0,delay:300}].forEach((e=>{setTimeout((()=>{i.style.transform=`translate(calc(-50% + ${e.x}px), -50%)`}),e.delay)}))}),300),setTimeout((()=>{i.style.transition="opacity 0.3s ease-in-out",i.style.opacity="0",setTimeout((()=>{i&&i.parentNode===n&&n.removeChild(i)}),300)}),o.duration)}))}function Ke(){const e=document.getElementById("app-chat-container"),t=document.getElementById("message-input");return!(!t||!e||"none"===e.style.display)&&(t.focus(),!0)}async function Xe(e){const t=`https://klavogonki.ru/api/profile/search-users?query=${encodeURIComponent(e)}`;try{const n=await async function(e){const t=await fetch(e);if(!t.ok)throw new Error(`Failed to fetch ${e}`);return t.json()}(t);if(!n.all?.length)throw new Error(`User ${e} not found.`);const r=n.all.find((t=>t.login===e));if(!r)throw new Error(`Exact match for user ${e} not found.`);return r.id}catch(t){return Fe(`Could not find user "${e}"`,{type:"error",duration:5e3}),null}}const Ye={isPrivateMode:!1,targetUsername:null,targetId:null,fullJid:null,async setPrivateTarget(e){if(!e)return this.exitPrivateMode(),!1;try{const t=await Xe(e);return!!t&&(this.isPrivateMode=!0,this.targetUsername=e,this.targetId=t,this.fullJid=`${t}#${e}@jabber.klavogonki.ru/web`,!0)}catch(e){return console.error("Error setting private target:",e),!1}},exitPrivateMode(){this.isPrivateMode=!1,this.targetUsername=null,this.targetId=null,this.fullJid=null}};let We=null;function Ve(e){"Escape"===e.key&&Ye.isPrivateMode&&Qe()}async function Ge(e){if(!e)return;const t=e.value,n=/^\/pm\s+([\wа-яА-ЯёЁ\-\.\_\+]+)\s/,r=t.match(n);if(r){const o=r[1];await Ye.setPrivateTarget(o)?(!function(e){const t=document.getElementById("message-input");Ye.isPrivateMode&&Ye.targetUsername!==e&&Qe();if(t.classList.contains("private-mode")&&Ye.targetUsername===e)Ye.targetUsername===e&&(t.placeholder=`️PM to ➡ ${e}`,Fe(`Private chat with ${e} activated`,{type:"warning",duration:3e3}));else{t.classList.add("private-mode"),t.placeholder=`PM to ➡ ${e}`;let n=document.querySelector(".private-mode-exit");if(!n){n=document.createElement("span"),n.className="button private-mode-exit",n.addEventListener("click",(()=>{Qe(),t.focus()}));t.parentElement.insertBefore(n,t.nextSibling)}n.innerHTML="🔒",n.title="Exit private mode",n.addEventListener("mouseenter",(()=>{n.innerHTML="🔓"})),n.addEventListener("mouseleave",(()=>{n.innerHTML="🔒"})),Fe(`Private chat with ${e} activated`,{type:"warning",duration:3e3}),Ye.isPrivateMode=!0,Ye.targetUsername=e,We||(We=Ve,document.addEventListener("keydown",We))}}(o),e.value=t.replace(n,"")):(Fe(`Could not find user "${o}"`,{type:"error",duration:3e3}),Qe())}else/^\/exit\s*$/.test(t)&&(Qe(),e.value="")}function Qe(){const e=document.getElementById("message-input");if(e.classList.contains("private-mode")){e.classList.remove("private-mode"),e.placeholder="";const t=document.querySelector(".private-mode-exit");t&&t.remove(),Ye.exitPrivateMode(),Fe("Exited private chat mode",{type:"success",duration:3e3}),We&&(document.removeEventListener("keydown",We),We=null)}}function Ze(e){return new Promise((t=>setTimeout(t,e)))}let et=null,tt=null,nt=null;const rt=document.createElement("canvas").getContext("2d");let ot,at=!1,it=0;function st(e){let t=e>it?`${e} ➡`:e<it?`⬅ ${e}`:`${e}`;nt.textContent=t,function(e){if(!nt)return void console.error("lengthPopup is not defined");let t,n=100,r=50;0===e?(t=200,n=20,r=50):t=e<=90?120:e<=100?120-(e-90)/10*60:e<=190?60:e<=200?60-(e-190)/10*20:e<=250?40:e<=300?40-(e-250)/50*40:0;const o=`hsl(${t}, ${n}%, ${r}%)`,a=`hsl(${t}, ${n}%, ${Math.max(r-(e>250?35:30),8)}%)`,i=`hsla(${t}, ${n}%, ${r}%, 0.1)`;nt.style.setProperty("color",o,"important"),nt.style.setProperty("background-color",a,"important"),nt.style.setProperty("border",`1px solid ${i}`,"important"),nt.style.setProperty("border-radius","0.4em","important")}(e),it=e}function ct(e){at!==e&&(nt.classList.toggle("bounce-in",e),nt.classList.toggle("bounce-out",!e),at=e,e||setTimeout((()=>nt.classList.remove("bounce-out")),500))}function lt(){clearTimeout(ot),st(et.value.length),function(e){if(!et)return void console.error("chatField is not set.");const t=getComputedStyle(et);rt.font=`${t.fontWeight} ${t.fontSize} ${t.fontFamily}`;const n=rt.measureText(e).width,r=et.offsetLeft+n+5,o=et.offsetLeft+et.offsetWidth-nt.offsetWidth;nt.style.left=`${Math.min(r,o)}px`}(et.value),ct(!0),ot=setTimeout((()=>ct(!1)),1e3)}function dt(e){"Enter"===e.key&&(st(0),Object.assign(nt.style,{left:"0px",color:"hsl(200, 20%, 50%)"}),ct(!0),ot=setTimeout((()=>ct(!1)),1e3))}function ut(e){return e.replace(/\n/g,"").replace(/\s+/g," ").replace(/>\s+</g,"><").trim()}function pt(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||"ontouchstart"in window}function mt(){const e=document.getElementById("app-chat-container"),t=document.querySelector(".chat-toggle-button");if(!e)return;if(e.classList.contains("maximized"))return void Fe("Chat is currently maximized",{type:"warning",duration:1e3});const n=JSON.parse(localStorage.getItem("chatState"))||{};if(n.floating||!1){const r="0"===e.style.opacity;e.style.opacity=r?"1":"0",setTimeout((()=>{e.style.display=r?"flex":"none",t.innerHTML=r?me:he,t.title=r?"Hide chat":"Show chat",Te({...n,isVisible:r}),r&&Ke()}),300)}else{const r=!e.classList.contains("visible-chat");e.classList.remove("visible-chat","hidden-chat"),e.classList.add(r?"visible-chat":"hidden-chat"),t.innerHTML=r?me:he,t.title=r?"Hide chat":"Show chat",Te({...n,isVisible:r}),r&&Ke()}}let ht=null;function gt(){const e=document.getElementById("app-chat-container"),t=document.querySelector(".chat-maximize-button");if(e)if(e.classList.contains("maximized")){const n=document.getElementById("messages-panel"),r=n.scrollHeight-n.scrollTop-n.clientHeight<=300;if(e.maximizeResizeHandler&&(window.removeEventListener("resize",e.maximizeResizeHandler),delete e.maximizeResizeHandler),ht){if(e.style.width=`${ht.width}px`,e.style.height=`${ht.height}px`,e.style.left=`${ht.left}px`,e.style.maxWidth="",e.style.minWidth="",e.style.position="fixed",e.style.right="",e.style.margin="",e.style.transform="",e.style.top="auto",ht.floating){const t=window.innerHeight,n=ht.top;n+ht.height<=t?e.style.top=`${n}px`:(e.style.bottom="0",e.style.top="auto")}else e.style.bottom="0",e.style.top="";Te({...Me(),width:ht.width,height:ht.height,left:ht.left,top:ht.top,floating:ht.floating,isVisible:ht.isVisible})}e.classList.remove("maximized"),t.classList.remove("maximized"),t.innerHTML=fe,t.title="Expand chat",requestAnimationFrame((()=>{je(),r&&(n.scrollTop=n.scrollHeight),Ke(),$e()}))}else{const n=!e.classList.contains("visible-chat")&&!e.classList.contains("hidden-chat");ht=Me();const r=()=>`${Math.floor(.9*window.innerHeight)}px`;e.style.cssText=`\n      width: 100vw !important;\n      height: ${r()} !important;\n      max-width: 100vw !important;\n      min-width: 100vw !important;\n      position: fixed !important;\n      bottom: 0 !important;\n      left: 0 !important;\n      right: 0 !important;\n      top: auto !important;\n      margin: 0 !important;\n      transform: none !important;\n    `,n&&e.classList.remove("visible-chat","hidden-chat"),e.classList.add("maximized"),t.classList.add("maximized"),t.innerHTML=ge,t.title="Collapse chat";const o=()=>{e.style.height=r(),e.style.bottom="0",e.style.top="auto"};window.addEventListener("resize",o),e.maximizeResizeHandler=o,je(),Ke(),$e()}}function ft(e){const t=e.querySelector(".new-messages-separator");t&&t.remove()}const yt=(e,t)=>{let n;return function(...r){clearTimeout(n),n=setTimeout((()=>e.apply(this,r)),t)}};function bt(){return window.getSelection().toString().length>0}class vt{constructor({username:e,password:t,bindUrl:n,delay:r=100}){this.username=e,this.password=t,this.bindUrl=n,this.delay=r,this.sid=null,this.rid=Math.floor(Date.now()/1e3)}nextRid(){return++this.rid}async sendRequest(e){const t=await fetch(this.bindUrl,{method:"POST",headers:{"Content-Type":"text/xml; charset=UTF-8","User-Agent":"Mozilla/5.0"},body:e});if(!t.ok)throw new Error(`HTTP error! status: ${t.status}`);return await t.text()}async sendRequestWithRetry(e,t=5){let n,r=this.delay;for(let o=1;o<=t;o++)try{return await this.sendRequest(e)}catch(e){if(n=e,!e.message.includes("429"))throw e;{const e=r*Math.pow(2,o);console.log(`⏱️ Rate limited (attempt ${o}/${t}). Waiting ${e}ms...`),await Ze(e)}}throw new Error(`Max retries reached. Last error: ${n.message}`)}async connect(){console.log("🌐 Step 1: Connecting to XMPP server...");const e=`<body xmlns='http://jabber.org/protocol/httpbind'\n               rid='${this.nextRid()}'\n               to='jabber.klavogonki.ru'\n               xml:lang='en'\n               wait='60'\n               hold='1'\n               ver='1.6'\n               xmpp:version='1.0'\n               xmlns:xmpp='urn:xmpp:xbosh'/>`,t=await this.sendRequestWithRetry(e);this.sid=t.match(/sid=['"]([^'"]+)['"]/)[1],console.log(`🔑 Step 2: Session ID received: ${this.sid}`),await Ze(this.delay),console.log("🔐 Step 3: Authenticating...");const n=function(e){const t=(new TextEncoder).encode(e);return btoa(String.fromCharCode(...t))}("\0"+this.username+"\0"+this.password),r=`<body rid='${this.nextRid()}' sid='${this.sid}'\n               xmlns='http://jabber.org/protocol/httpbind'>\n          <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>${n}</auth>\n        </body>`;if(!(await this.sendRequestWithRetry(r)).includes("<success"))throw new Error("❌ Authentication failed");console.log("✅ Step 4: Authentication successful!"),await Ze(this.delay),console.log("🔄 Step 5: Restarting stream...");const o=`<body rid='${this.nextRid()}' sid='${this.sid}'\n               xmlns='http://jabber.org/protocol/httpbind'\n               to='jabber.klavogonki.ru'\n               xmpp:restart='true'\n               xmlns:xmpp='urn:xmpp:xbosh'/>`;await this.sendRequestWithRetry(o),await Ze(this.delay),console.log("📦 Step 6: Binding resource...");const a=`<body rid='${this.nextRid()}' sid='${this.sid}'\n               xmlns='http://jabber.org/protocol/httpbind'>\n          <iq type='set' id='bind_1' xmlns='jabber:client'>\n            <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>\n              <resource>web</resource>\n            </bind>\n          </iq>\n        </body>`;await this.sendRequestWithRetry(a),await Ze(this.delay),console.log("🔌 Step 7: Establishing session...");const i=`<body rid='${this.nextRid()}' sid='${this.sid}'\n               xmlns='http://jabber.org/protocol/httpbind'>\n          <iq type='set' id='session_1' xmlns='jabber:client'>\n            <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>\n          </iq>\n        </body>`;return await this.sendRequestWithRetry(i),await Ze(this.delay),{sid:this.sid,rid:this.rid}}}const wt=()=>{try{const e=localStorage.getItem("ignored");return e?JSON.parse(e):[]}catch(e){return console.error("Error parsing ignored users data:",e),[]}},xt=e=>{try{return localStorage.setItem("ignored",JSON.stringify(e)),!0}catch(e){return console.error("Error saving ignored users data:",e),!1}},kt=(e,t,n={})=>{const r=document.createElement(e);return t&&(r.className=t),Object.entries(n).forEach((([e,t])=>{"text"===e?r.textContent=t:r.setAttribute(e,t)})),r},Et=()=>{const e=document.querySelector(".ignored-users-panel");if(e)return e;const t=wt(),n=kt("div","ignored-users-panel",{html:"<h2>Ignored Users</h2>"}),r=kt("div","ignored-users-list");n.appendChild(r);const o=kt("div","ignored-users-input-container"),a=kt("input","ignored-users-input",{type:"search",placeholder:"Enter username to ignore"}),i=kt("button","ignored-users-add-btn",{text:"Add"}),s=async()=>{const e=a.value.trim();if(e&&!t.includes(e)){if(!await Xe(e))return Fe(`Could not find user "${e}"`,{type:"error",duration:2e3}),a.classList.add("input-error"),void setTimeout((()=>a.classList.remove("input-error")),500);if(t.push(e),xt(t),Fe(`Added "${e}" to the ignore list`,{type:"success",duration:2e3}),!r.querySelector(`.user-label[text="${e}"]`)){const t=c(e);r.appendChild(t)}a.value="",(e=>{if(!e||"string"!=typeof e)return void console.warn("Invalid username provided to purgeUserFromChat");const t=document.querySelector(".messages-panel"),n=document.getElementById("user-list");t&&t.querySelectorAll(".message").forEach((t=>{const n=t.querySelector(".username")?.textContent;n===e&&t.remove()}));n&&n.querySelectorAll(".user-item").forEach((t=>{const n=t.querySelector(".username-clickable")?.textContent;n===e&&t.remove()}))})(e)}};i.addEventListener("click",s),a.addEventListener("keypress",(e=>{"Enter"===e.key&&s()})),o.append(a,i),n.insertBefore(o,r);const c=e=>{const n=kt("div","ignored-user-entry"),r=kt("div","user-label",{text:e}),o=kt("button","remove-btn"),a=document.createElementNS("http://www.w3.org/2000/svg","svg");return a.setAttribute("viewBox","0 0 24 24"),a.setAttribute("width","12"),a.setAttribute("height","12"),a.setAttribute("fill","none"),a.setAttribute("stroke","currentColor"),a.setAttribute("stroke-width","2"),a.setAttribute("stroke-linecap","round"),a.setAttribute("stroke-linejoin","round"),a.classList.add("remove-icon"),["M18 6L6 18","M6 6L18 18"].forEach((e=>{const t=document.createElementNS("http://www.w3.org/2000/svg","path");t.setAttribute("d",e),a.appendChild(t)})),o.appendChild(a),o.addEventListener("click",(()=>{const r=t.filter((t=>t!==e));xt(r),t.splice(t.indexOf(e),1),n.remove()})),n.append(r,o),n};t.forEach((e=>{const t=c(e);r.appendChild(t)})),document.body.appendChild(n),He(n,"show",1);const l=e=>{"Escape"===e.key&&(He(n,"hide",0),document.removeEventListener("keydown",l))};a.focus(),document.addEventListener("keydown",l);const d=e=>{n.contains(e.target)||(He(n,"hide",0),document.removeEventListener("click",d,!0),document.removeEventListener("keydown",l))};return document.addEventListener("click",d,!0),n},St=()=>`rand=${Date.now()}`;class Ct{constructor(e="user-list"){this.container=document.getElementById(e),this.activeUsers=new Map,this.isFirstLoad=!0,this.avatarCache=this.loadAvatarCache(),this.cacheDate=(new Date).toDateString(),this.changes=!1,this.pendingUserJIDs=new Set,this.updatedUserJIDs=new Set,this.updateUITimeout=null,this.roleIcons={visitor:"🚫",participant:"",moderator:"⚔️️"},this.rolePriority={moderator:1,participant:2,visitor:3},this.setupEventListeners()}loadAvatarCache(){try{const e=localStorage.getItem("userAvatarCache");if(e){const t=JSON.parse(e);return t.date===(new Date).toDateString()?(console.log("🗃️ Loaded avatar cache from localStorage"),t.avatars||{}):(console.log("🗃️ Avatar cache expired (new day), creating fresh cache"),{})}}catch(e){console.error("Error loading avatar cache:",e)}return{}}saveAvatarCache(){try{localStorage.setItem("userAvatarCache",JSON.stringify({date:this.cacheDate,avatars:this.avatarCache}))}catch(e){console.error("Error saving avatar cache:",e)}}updateAvatarCache(e,t,n,r){const o=this.avatarCache[e];if(!o||o.hasAvatar!==t){this.avatarCache[e]={hasAvatar:t,...t?{avatarUrl:n}:{emoji:n}};const o=t?"🖼️":"😊",a=t?"avatar":"emoji";return console.log(`${o} Set ${a} for [${r}] (${e}):`,n),this.saveAvatarCache(),!0}return!1}setupEventListeners(){this.container.addEventListener("click",(e=>{if(e.target.classList.contains("username-clickable")){const t=e.target.getAttribute("data-user-id");if(t)if(e.ctrlKey){const t=e.target.textContent.trim(),n=document.getElementById("message-input");n.value=`/pm ${t} `,Ge(n),n.focus()}else{const e=`https://klavogonki.ru/u/#/${t.split("/")[1].split("#")[0]}/`;window.location.href=e}}if(e.target.closest(".game-indicator")){const t=e.target.closest(".game-indicator").getAttribute("data-game-id");t&&(e.stopPropagation(),window.location.href=`https://klavogonki.ru/g/?gmid=${t}`)}}))}async updatePresence(e){const t=(new DOMParser).parseFromString(e,"text/xml").getElementsByTagName("presence");if(e.includes('<presence id="initialChatLoad"'))return console.log("🔄 Initial room join detected, requesting full roster"),void this.requestFullRoster();this.changes=!1,this.updatedUserJIDs.clear();for(let e=0;e<t.length;e++){const n=t[e],r=n.getAttribute("from"),o=n.getAttribute("type");if(!r||!r.includes("[email protected]/"))continue;const a=r.split("/").pop();if(!a)continue;if("клавобот"===a.toLowerCase()||r.toLowerCase().includes("#клавобот"))continue;if("unavailable"===o){if(this.activeUsers.has(r)){const e=this.activeUsers.get(r);Pe(r),Be(e.login);this.isFirstLoad,this.activeUsers.delete(r),this.changes=!0}continue}const i=this.activeUsers.get(r)||{},s=Pe(r),c=this.avatarCache[s];let l={jid:r,login:a,color:P,usernameColor:Ee.getColor(Be(a)),role:"participant",gameId:null,avatar:null};const d=n.getElementsByTagName("x");let u=!1;Array.from(d).forEach((e=>{const t=e.getAttribute("xmlns");if("klavogonki:userdata"===t){const t=e.getElementsByTagName("user")[0];if(t){const e=t.getElementsByTagName("login")[0];e&&e.textContent&&(l.login=e.textContent,l.usernameColor=Ee.getColor(Be(l.login)));const n=t.getElementsByTagName("avatar")[0];n&&n.textContent&&(l.avatar=n.textContent,u=!0);const r=t.getElementsByTagName("moderator")[0];r&&"1"===r.textContent&&(l.role="moderator")}const n=e.getElementsByTagName("game_id")[0];n&&n.textContent&&(l.gameId=n.textContent)}if("http://jabber.org/protocol/muc#user"===t){const t=e.getElementsByTagName("item")[0];if(t){const e=t.getAttribute("role");e&&"moderator"!==l.role&&(l.role=e)}}})),!u&&i&&i.avatar&&(l.avatar=i.avatar),!l.avatar&&c&&c.hasAvatar&&(l.avatar=c.avatarUrl);Be(l.login);this.activeUsers.has(r)?JSON.stringify(i)!==JSON.stringify(l)&&(this.activeUsers.set(r,l),this.changes=!0,this.updatedUserJIDs.add(r)):(this.isFirstLoad,this.activeUsers.set(r,l),this.changes=!0,this.pendingUserJIDs.add(r))}this.changes&&(this.isFirstLoad?(this.updateUI(),this.pendingUserJIDs.clear()):(this.updateUITimeout&&clearTimeout(this.updateUITimeout),this.updateUITimeout=setTimeout((()=>{this.updateUI(),this.updateUITimeout=null,this.pendingUserJIDs.clear()}),300)))}updateUI(){const e=wt(),t=new Map;this.container.querySelectorAll(".user-item").forEach((e=>{t.set(e.getAttribute("data-jid"),e)}));const n=Array.from(this.activeUsers.values()).filter((t=>{const n=Be(t.login);return!e.includes(n)})).sort(((e,t)=>{const n=this.rolePriority[e.role]-this.rolePriority[t.role];return 0!==n?n:Be(e.login).localeCompare(Be(t.login))})),r=document.createDocumentFragment();n.forEach((e=>{let n=t.get(e.jid);const o=Pe(e.jid),a=Be(e.login);if(n){if(!n.querySelector(".avatar-container")){const t=document.createElement("span");t.className="avatar-container",this.setUserAvatar(t,e,o,a),n.insertBefore(t,n.firstChild)}t.delete(e.jid);const r=n.querySelector(".role"),i=this.roleIcons[e.role];r&&r.textContent!==i&&(r.textContent=i,r.classList.contains(e.role)||(r.className=`role ${e.role}`));const s=n.querySelector(".username");s&&s.style.color!==e.usernameColor&&(s.style.color=e.usernameColor)}else{n=document.createElement("div"),n.classList.add("user-item"),n.setAttribute("data-jid",e.jid);const t=this.roleIcons[e.role],r=document.createElement("span");r.className="avatar-container",this.setUserAvatar(r,e,o,a);const i=document.createElement("div");i.className="user-info",i.innerHTML=`\n          <div class="username" style="color: ${e.usernameColor}">\n            <span class="username-clickable" data-user-id="${e.jid}">${a}</span>\n            <span class="role ${e.role}">${t}</span>\n          </div>\n        `,n.appendChild(r),n.appendChild(i)}this.updateGameIndicator(n,e),r.appendChild(n)})),this.container.innerHTML="",this.container.appendChild(r),t.forEach((e=>{e&&e.parentNode&&e.remove()})),this.isFirstLoad||this.pendingUserJIDs.forEach((e=>{const t=this.container.querySelector(`.user-item[data-jid="${e}"]`);t&&t.parentNode&&be(t)})),this.isFirstLoad&&(this.isFirstLoad=!1)}setUserAvatar(e,t,n,r){const o=this.avatarCache[n];if(t.avatar){const t=o?.avatarUrl||`${M}/storage/avatars/${n}_big.png?${St()}`,a=document.createElement("img");a.className="user-avatar image-avatar",a.src=t,a.alt=`${r}'s avatar`,a.addEventListener("error",(()=>{const t=o?.emoji||Le();e.innerHTML="";const a=document.createElement("span");a.className="user-avatar svg-avatar",a.textContent=t,e.appendChild(a),this.updateAvatarCache(n,!1,t,r)})),a.addEventListener("load",(()=>{this.updateAvatarCache(n,!0,t,r)})),e.appendChild(a)}else if(o)if(o.hasAvatar){const t=document.createElement("img");t.className="user-avatar image-avatar",t.src=o.avatarUrl,t.alt=`${r}'s avatar`,t.addEventListener("error",(()=>{const t=Le();e.innerHTML="";const o=document.createElement("span");o.className="user-avatar svg-avatar",o.textContent=t,e.appendChild(o),this.updateAvatarCache(n,!1,t,r)})),e.appendChild(t)}else{const t=document.createElement("span");t.className="user-avatar svg-avatar",t.textContent=o.emoji,e.appendChild(t)}else{const t=`${M}/storage/avatars/${n}_big.png?${St()}`,o=document.createElement("img");o.className="user-avatar image-avatar",o.src=t,o.alt=`${r}'s avatar`,o.addEventListener("error",(()=>{const t=Le();e.innerHTML="";const o=document.createElement("span");o.className="user-avatar svg-avatar",o.textContent=t,e.appendChild(o),this.updateAvatarCache(n,!1,t,r)})),o.addEventListener("load",(()=>{this.updateAvatarCache(n,!0,t,r)})),e.appendChild(o)}}updateGameIndicator(e,t){let n=e.querySelector(".game-indicator");if(t.gameId){if(!n||n.getAttribute("data-game-id")!==t.gameId){const r=`<span class="game-indicator" title="${t.gameId}" data-game-id="${t.gameId}">\n                                    <span class="traffic-icon">🚦</span>\n                                  </span>`;if(n)n.outerHTML=r;else{e.querySelector(".username").insertAdjacentHTML("beforeend",r)}}}else n&&n.parentNode&&n.remove()}async requestFullRoster(){console.log("📑 Would request full roster here (using existing data for now)"),this.updateUI()}}class Lt{constructor(){this.selected=new Set,this.isDragging=!1,this.toggleBtn=null,this.longPressTimer=null,this.longPressDuration=500,this.touchStartX=0,this.touchStartY=0,this.isMobile=pt(),this.init()}init(){this.attachEvents(),this.updateDeletedMessages(),this.renderToggle()}attachEvents(){document.addEventListener("mousedown",(e=>{const t=e.target.closest(".messages-panel .message");t&&2===e.button&&t&&this.handleSelection(e.target,t,e.ctrlKey)})),document.addEventListener("mouseup",(()=>this.isDragging=!1)),document.addEventListener("mousemove",(e=>{if(!this.isDragging)return;const t=e.target.closest(".messages-panel .message");t&&this.toggleSelect(t,!0,"message-mode")})),document.addEventListener("contextmenu",(e=>{const t=e.target.closest(".messages-panel .message");t&&(bt()||(e.preventDefault(),this.showDeleteButton(e,t)))})),this.isMobile&&(document.addEventListener("touchstart",(e=>{const t=e.target.closest(".messages-panel .message");t&&(this.touchStartX=e.touches[0].clientX,this.touchStartY=e.touches[0].clientY,this.longPressTimer=setTimeout((()=>{this.handleSelection(e.target,t,!1),this.showDeleteButton({clientX:this.touchStartX,clientY:this.touchStartY,preventDefault:()=>{}},t),navigator.vibrate&&navigator.vibrate(50)}),this.longPressDuration))})),document.addEventListener("touchmove",(e=>{this.isDragging&&e.preventDefault();const t=e.touches[0].clientX,n=e.touches[0].clientY,r=Math.abs(t-this.touchStartX),o=Math.abs(n-this.touchStartY);(r>10||o>10)&&this.longPressTimer&&(clearTimeout(this.longPressTimer),this.longPressTimer=null)}),{passive:!1}),document.addEventListener("touchend",(()=>{this.longPressTimer&&(clearTimeout(this.longPressTimer),this.longPressTimer=null)})))}handleSelection(e,t,n){if(bt())return;const r=e.closest(".time"),o=e.closest(".username");r?this.handleTimeSelection(t,n):o?this.handleUsernameSelection(o):(this.isDragging=!0,this.toggleSelect(t,!0,"message-mode"))}handleTimeSelection(e,t){const n=Array.from(document.querySelectorAll(".messages-panel .message")),r=n.indexOf(e);if(-1!==r)if(t)n.slice(r).forEach((e=>{this.toggleSelect(e,!0,"time-mode"),e.classList.add("time-mode")}));else{const t=e.querySelector(".username");if(!t)return;const o=t.textContent.trim();n.slice(r).forEach((e=>{const t=e.querySelector(".username");t&&t.textContent.trim()===o&&(this.toggleSelect(e,!0,"time-mode"),e.classList.add("time-mode"))}))}}handleUsernameSelection(e){const t=e.textContent.trim();document.querySelectorAll(".messages-panel .message").forEach((e=>{const n=e.querySelector(".username");n&&n.textContent.trim()===t&&(this.toggleSelect(e,!0,"username-mode"),e.classList.add("username-mode"))}))}toggleSelect(e,t,n="message-mode"){if(!e)return;e.classList.toggle("selected-message",t),t?"message-mode"===n&&e.classList.add("message-mode"):e.classList.remove("username-mode","time-mode","message-mode");const r=jt(e);t?this.selected.add(r):this.selected.delete(r)}showDeleteButton(e,t){if(bt())return;const n=document.querySelector(".delete-btn");n&&n.remove();const r=document.createElement("button");r.className="delete-btn",this.isMobile&&r.classList.add("mobile-delete-btn"),r.textContent="Delete",r.addEventListener("touchstart",(e=>{e.stopPropagation()})),document.body.append(r);const{offsetWidth:o,offsetHeight:a}=r;if(r.remove(),Object.assign(r.style,{position:"fixed",top:e.clientY-a/2+"px",left:e.clientX-o/2+"px"}),r.onclick=()=>this.deleteSelectedMessages(r),this.isMobile){const e=t=>{r.contains(t.target)||(this.clearSelection(),r.remove(),document.removeEventListener("touchstart",e))};document.addEventListener("touchstart",e),r.outsideTapHandler=e}let i;r.addEventListener("mouseenter",(()=>{i&&clearTimeout(i)})),r.addEventListener("mouseleave",(()=>{i=setTimeout((()=>{r.remove(),this.clearSelection()}),1e3)})),document.body.append(r)}deleteSelectedMessages(e){document.querySelectorAll(".selected-message").forEach((e=>{e&&(e.classList.remove("selected-message","username-mode","time-mode","message-mode"),0===e.classList.length&&e.removeAttribute("class"))})),this.storeDeleted([...this.selected]),e.remove(),this.isMobile&&e.outsideTapHandler&&document.removeEventListener("touchstart",e.outsideTapHandler),this.selected.clear(),this.updateDeletedMessages(),this.renderToggle()}clearSelection(){document.querySelectorAll(".selected-message").forEach((e=>{e&&(e.classList.remove("selected-message","username-mode","time-mode","message-mode"),0===e.classList.length&&e.removeAttribute("class"))})),this.selected.clear()}storeDeleted(e){const t=new Set(JSON.parse(localStorage.getItem("deletedChatMessagesContent")||"[]"));e.forEach((e=>t.add(e))),localStorage.setItem("deletedChatMessagesContent",JSON.stringify([...t]))}updateDeletedMessages(){const e=new Set(JSON.parse(localStorage.getItem("deletedChatMessagesContent")||"[]")),t=document.querySelectorAll(".messages-panel .message");0!==t.length&&(t.forEach((t=>{if(!t)return;const n=jt(t);t.classList.remove("shown-message"),t.classList.toggle("hidden-message",e.has(n))})),localStorage.setItem("deletedChatMessagesContent",JSON.stringify([...e])))}renderToggle(){if(!(JSON.parse(localStorage.getItem("deletedChatMessagesContent")||"[]").length>0))return void(this.toggleBtn&&(this.toggleBtn.remove(),this.toggleBtn=null));const e=document.querySelector(".messages-panel");if(e&&!this.toggleBtn){if(this.toggleBtn=document.createElement("button"),this.toggleBtn.className="toggle-button toggle-hidden",this.toggleBtn.textContent="Show",this.toggleBtn.onclick=e=>{if(e.ctrlKey)return void this.restoreAllMessages();const t="Show"===this.toggleBtn.textContent,n=JSON.parse(localStorage.getItem("deletedChatMessagesContent")||"[]");document.querySelectorAll(".messages-panel .message").forEach((e=>{if(!e)return;const r=jt(e);n.includes(r)&&(e.classList.toggle("hidden-message",!t),e.classList.toggle("shown-message",t))})),t?(this.toggleBtn.textContent="Hide",this.toggleBtn.classList.remove("toggle-hidden"),this.toggleBtn.classList.add("toggle-shown")):(this.toggleBtn.textContent="Show",this.toggleBtn.classList.remove("toggle-shown"),this.toggleBtn.classList.add("toggle-hidden"))},this.isMobile){let e,t=!1;this.toggleBtn.addEventListener("touchstart",(n=>{this.touchStartX=n.touches[0].clientX,this.touchStartY=n.touches[0].clientY,t=!1,e=setTimeout((()=>{t=!0,this.restoreAllMessages(),navigator.vibrate&&navigator.vibrate(50)}),this.longPressDuration)})),this.toggleBtn.addEventListener("touchmove",(t=>{const n=t.touches[0].clientX,r=t.touches[0].clientY,o=Math.abs(n-this.touchStartX),a=Math.abs(r-this.touchStartY);(o>10||a>10)&&clearTimeout(e)})),this.toggleBtn.addEventListener("touchend",(()=>{clearTimeout(e),t&&this.toggleBtn.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation()}),{once:!0})}))}e.append(this.toggleBtn)}}restoreAllMessages(){document.querySelectorAll(".messages-panel .message").forEach((e=>{e&&e.classList.remove("hidden-message","shown-message")})),localStorage.setItem("deletedChatMessagesContent",JSON.stringify([])),this.selected.clear(),this.updateDeletedMessages(),this.renderToggle()}}function jt(e){if(!e)return"";if(e.dataset.messageId)return e.dataset.messageId;let t=Array.from(e.childNodes).map((e=>e?e.nodeType===Node.TEXT_NODE||e.classList?.contains("username")?e.textContent.trim():"A"===e.tagName?e.href:"IMG"===e.tagName?e.title.trim():"IFRAME"===e.tagName?e.src.trim():"":"")).join("");return t||(t="msg-"+Math.random().toString(36).substring(2,7)),e.dataset.messageId=t,t}const It=e=>e=(e=(e=(e=(e=(e=(e=(e=(e=(e=e.replace(/^######\s+(.*)$/gim,'<h6 class="md-heading md-h6">$1</h6>')).replace(/^#####\s+(.*)$/gim,'<h5 class="md-heading md-h5">$1</h5>')).replace(/^####\s+(.*)$/gim,'<h4 class="md-heading md-h4">$1</h4>')).replace(/^###\s+(.*)$/gim,'<h3 class="md-heading md-h3">$1</h3>')).replace(/^##\s+(.*)$/gim,'<h2 class="md-heading md-h2">$1</h2>')).replace(/^#\s+(.*)$/gim,'<h1 class="md-heading md-h1">$1</h1>')).replace(/`([^`]+)`/g,'<code class="md-code">$1</code>')).replace(/\*\*(.+?)\*\*/g,'<strong class="md-bold">$1</strong>')).replace(/__(.+?)__/g,'<em class="md-italic">$1</em>')).replace(/~~(.+?)~~/g,'<del class="md-strikethrough">$1</del>');class Mt{constructor(e="messages-panel",t=""){this.panel=document.getElementById(e),this.messageMap=new Map,this.renderedMessageIds=new Set,this.currentUsername=t,this.maxMessages=30,this.defaultMessagesCount=20,this.initialLoadComplete=!1,this.chatRemover=new Lt,this.messageInput=document.getElementById("message-input"),this.newSeparatorAdded=!1,this._delegatedClickAttached=!1,document.addEventListener("visibilitychange",(()=>{document.hidden&&(ft(this.panel),this.newSeparatorAdded=!1)})),this.messageInput&&this.messageInput.addEventListener("focus",(()=>{this.newSeparatorAdded&&(ft(this.panel),this.newSeparatorAdded=!1)}))}generateUniqueId(e,t,n,r){const o=t||(new Date).toLocaleTimeString("en-GB",{hour12:!1});return"private"===e?`private-${Math.random().toString(36).slice(2)}`:`${o}-${n}-${r}`}addMessage(e){return this.messageMap.set(e.id,e),this.trimMessages(),!0}trimMessages(){for(;this.messageMap.size>this.maxMessages;){const e=this.messageMap.keys().next().value;this.messageMap.delete(e),this.renderedMessageIds.delete(e)}}processMessages(e){if("string"!=typeof e||!e)return;const t=wt(),n=(new DOMParser).parseFromString(e,"text/xml").getElementsByTagName("message");let r=!1;Array.from(n).forEach((e=>{const n=e.getElementsByTagName("body")[0];if(!n||!n.textContent)return;const o=n.textContent.trim();if("This room is not anonymous"===o)return;const a=/^([^,\s]+),/.exec(o);if(a&&t.includes(a[1]))return;const i=e.getAttribute("from"),s=ze(i&&i.split("#")[1]?.split("@")[0]||"unknown");if(t.includes(s))return;const c=e.getAttribute("to"),l="chat"===e.getAttribute("type");let d=null;l&&c&&(d=ze(c.split("#")[1]?.split("@")[0]||c));let u=null;const p=e.getElementsByTagName("delay")[0];if(p&&p.getAttribute("stamp")){const e=p.getAttribute("stamp");try{u=new Date(e).toLocaleTimeString("en-GB",{hour12:!1})}catch(e){console.error("Error parsing timestamp:",e)}}if(u||(u=(new Date).toLocaleTimeString("en-GB",{hour12:!1})),s===this.currentUsername&&this.initialLoadComplete)return;if(!Array.from(this.messageMap.values()).some((e=>e.from===s&&e.text===o))){const e={id:this.generateUniqueId(l?"private":"public",u,s,o),from:s,text:o,isPrivate:l,recipient:d,pending:!1,timestamp:u};this.addMessage(e)&&(r=!0)}})),r&&this.updatePanel()}addSentMessage(e,t={}){const n=t.isPrivate||!1,r=(new Date).toLocaleTimeString("en-GB",{hour12:!1}),o=this.generateUniqueId(n?"private":"public",r,this.currentUsername,e),a={id:o,from:this.currentUsername,text:e,isPrivate:n,recipient:t.recipient||null,pending:t.pending||!1,timestamp:r};return this.addMessage(a)&&this.updatePanel(),o}updatePendingStatus(e,t){const n=this.messageMap.get(e);n&&(n.pending=t,this.updatePanel())}updatePanel(){if(!this.panel)return;const e=new Set(Array.from(this.panel.querySelectorAll(".message")).map((e=>e.getAttribute("data-message-id"))));this.renderedMessageIds=e;const t=document.createDocumentFragment();let n=!1;if(this.messageMap.forEach(((e,r)=>{if(!this.renderedMessageIds.has(r)){const o=e.timestamp||(new Date).toLocaleTimeString("en-GB",{hour12:!1}),a=ze(e.from),i=Ee.getColor(a),s=document.createElement("div");s.className="message",s.setAttribute("data-message-id",r),"Клавобот"===e.from&&(s.classList.add("banned"),this.initialLoadComplete&&Ue("https://github.com/VimiummuimiV/KG_Chat_Application/raw/refs/heads/main/src/sounds/mario-game-over.mp3")),e.isPrivate&&e.from!==this.currentUsername&&document.hidden&&Ue(_e),e.isPrivate&&(s.classList.add("private-message"),s.classList.add(e.from===this.currentUsername?"sent":"received"),e.recipient&&s.setAttribute("data-recipient",e.recipient)),e.text.startsWith("/me ")&&(s.classList.add("system"),e.text=`${e.from} ${e.text.substring(e.text.indexOf(" ")+1)}`),e.isSystem&&s.classList.add("system");const c=document.createElement("div");c.className="message-info";let l=e.from;e.isPrivate&&(l=e.from===this.currentUsername&&e.recipient?`→ ${e.recipient}`:`${e.from} →`),c.innerHTML=`\n          <span class="time">${o}</span>\n          <span class="username" style="color: ${i}">${l}</span>\n        `;const d=document.createElement("div");if(d.className="message-text",d.innerHTML=(e=>{e=It(e);let t=0,n=[];e=(e=e.replace(/(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~|!:,.;()_]*[-A-Z0-9+&@#\/%=~|()_])/gi,(e=>(n.push(e),`___URL${t++}___`)))).replace(/:(\w+):/g,((e,t)=>`<img src="https://klavogonki.ru/img/smilies/${t}.gif" alt="${t}" />`)).replace(/(\p{Emoji_Presentation}|\p{Emoji}\uFE0F)/gu,'<span class="emoji-adjuster">$&</span>'),n.forEach(((t,n)=>{if(Re(t)){const r=De(t);e=e.replace(`___URL${n}___`,`<a class="processed-link decoded-link" href="${t}" target="_blank">${r}</a>`)}else e=e.replace(`___URL${n}___`,`<a class="processed-link" href="${t}" target="_blank">${t}</a>`)}));const r=/<a [^>]+>.*?<\/a>/gi,o=e.split(r),a=e.match(r)||[];let i="";return o.forEach(((e,t)=>{e.trim()&&(i+=`<p class="message-piece break-content">${e}</p>`),t<a.length&&(i+=a[t])})),i})(e.text),s.appendChild(c),s.appendChild(d),e.pending){const e=document.createElement("span");e.className="pending-emoji",e.textContent="⏱️",s.appendChild(e)}t.appendChild(s),this.renderedMessageIds.add(r),this.currentUsername&&e.text.includes(this.currentUsername)&&(n=!0)}})),document.hidden&&this.initialLoadComplete&&t.childNodes.length>0&&!this.newSeparatorAdded){const e=function(){const e=document.createElement("div");e.className="new-messages-separator";const t=document.createElement("hr");t.className="separator-line";const n=document.createElement("div");return n.className="separator-icon",n.textContent="🔥",e.appendChild(t),e.appendChild(n),e}();t.insertBefore(e,t.firstChild),this.newSeparatorAdded=!0}this.panel.appendChild(t),this.addDelegatedClickListeners(),Oe(this.currentUsername),this.initialLoadComplete&&n&&Ue(_e),requestAnimationFrame((()=>{!this.initialLoadComplete&&this.messageMap.size>=this.defaultMessagesCount&&(this.panel.scrollTop=this.panel.scrollHeight,this.initialLoadComplete=!0)})),this.chatRemover&&(this.chatRemover.updateDeletedMessages(),this.chatRemover.renderToggle())}addDelegatedClickListeners(){if(!this.panel._delegatedClickAttached){let e=0,t="";this.panel.addEventListener("click",(async n=>{const r=n.target.closest(".username");if(r&&this.panel.contains(r)){let o=r.textContent.trim();if(o.includes("→")&&(o=o.startsWith("→")?o.replace("→","").trim():o.split("→")[0].trim()),n.shiftKey){let e={};const t=sessionStorage.getItem("usernameIds");if(t)try{e=JSON.parse(t)}catch(t){console.error("Error parsing stored username IDs:",t),e={}}let n=e[o];if(n||(n=await Xe(o),n&&(e[o]=n,sessionStorage.setItem("usernameIds",JSON.stringify(e)))),n){const e=`https://klavogonki.ru/u/#/${n}/`;window.location.href=e}return}if(n.ctrlKey)this.messageInput.value=`/pm ${o} `,Ge(this.messageInput);else{const n=Date.now();if(n-e<300&&t===o)this.messageInput.value=`${o}, `;else{const e=`${o}, `;this.messageInput.value.includes(e)||(this.messageInput.value+=e)}e=n,t=o}this.messageInput.focus()}const o=n.target.closest(".time");if(o&&this.panel.contains(o)){const e=function(e){const t=180- -(new Date).getTimezoneOffset(),[n,r,o]=e.split(":").map(Number);let a=60*n+r+t;a=(a%1440+1440)%1440;const i=a%60;return`${Math.floor(a/60).toString().padStart(2,"0")}:${i.toString().padStart(2,"0")}:${o.toString().padStart(2,"0")}`}(o.textContent.trim()),t=`https://klavogonki.ru/chatlogs/${new Intl.DateTimeFormat("en-CA").format(new Date)}.html#${e}`;window.open(t,"_blank")}})),this.panel._delegatedClickAttached=!0}}getChatHistory(){return Array.from(this.messageMap.values())}refreshMessages(e=!1,t="chat"){const n="connection-status",r=e?T[t].online:T[t].offline;this.messageMap.delete(n),this.renderedMessageIds.delete(n);const o={id:n,from:"System",text:r,isPrivate:!1,recipient:null,isSystem:!0,pending:!1,timestamp:(new Date).toLocaleTimeString("en-GB",{hour12:!1})};this.messageMap.set(n,o),this.updateConnectionStatusInUI(o)}updateConnectionStatusInUI(e){this.panel.querySelectorAll(".pending-emoji").forEach((e=>e.remove()));const t=this.panel.querySelector(`[data-message-id="${e.id}"]`);t&&t.remove(),this.updatePanel()}}class At{constructor(e={}){this.container=null,this.options={container:e.container||document.body,helpButton:e.helpButton,onDestroy:e.onDestroy},At.instance=this}init(){return this.createPanel(),this.bindEvents(),this}createPanel(){this.container=document.createElement("div"),this.container.className="help-panel",this.content=document.createElement("div"),this.content.className="help-content",this.updatePanelContent(),this.container.appendChild(this.content),document.body.appendChild(this.container),He(this.container,"show","1")}updatePanelContent(){const e={en:{heading:"Chat Commands & Hotkeys",sections:[{title:"Chat Commands",items:[{key:"/help",desc:"Show this help panel"},{key:"/me message",desc:"Send an action message"},{key:"/pm username",desc:"Activate private chat mode with the specified user"},{key:"/exit",desc:"Exit private chat mode"},{key:"/reset",desc:"Reset the chat data"},{key:"/colors",desc:"Show the username color panel"},{key:"/import colors",desc:"Import user colors from a json file"},{key:"/export colors",desc:"Export user colors to a json file"},{key:"/ignored",desc:"Show the ignored users panel"}]},{title:"Chat Hotkeys",items:[{key:"Ctrl + Space",desc:"Hide/Show the chat"},{key:"Shift + Ctrl + Space",desc:"Expand/Collapse the chat"},{key:"Ctrl + Click",desc:"Activate private chat mode with the clicked user"},{key:"Shift + Click",desc:"Open the user profile by nickname in the message"}]},{heading:"Emoji Panel Actions & Hotkeys",subSections:[{title:"Emoji Panel Actions",items:[{key:"Click an emoji",desc:"Insert the emoji"},{key:"Click outside panel",desc:"Closes the panel (emoji or help)"}]},{title:"Emoji Panel Hotkeys",items:[{key:"Ctrl + ;",desc:"Open the Emoji Panel"},{key:"Enter",desc:"Insert the emoji"},{key:"Ctrl + Enter",desc:"Insert the emoji keeping the panel open"},{key:"Ctrl + Click",desc:"Insert the emoji keeping the panel open"},{key:"Shift + Click",desc:"Remove emoji from recent list (in recent category)"},{key:"q",desc:"Hide the Emoji Panel (single press when search is not focused)"},{key:"qq",desc:"Hide the Emoji Panel (double press 'q' when search is focused)"},{key:"Esc",desc:"Close the panel (emoji or help)"}]}]},{heading:"Image Manipulations",subSections:[{title:"Open/Close",items:[{key:"(LMB) Click",desc:"Open the image"},{key:"Ctrl + (RMB)",desc:"Close the image and copy the link"},{key:"Space or ESC",desc:"Close the image"}]},{title:"Movement and Scaling",items:[{key:"Hold (MMB)",desc:"Drag the expanded image"},{key:"Scroll (MMB)",desc:"Zoom in/out the image"},{key:"Ctrl + (MMB)",desc:"Scale the image. Move the cursor up or down."}]},{title:"Navigation",items:[{key:"Arrow keys (< >)",desc:"Switch between images"},{key:"(LMB), (RMB)",desc:"Switch between images"}]}]},{heading:"Markdown Formatting",items:[{key:"# Heading",desc:"Headings: use # for h1, ## for h2, up to ###### for h6"},{key:"`code`",desc:"Inline code"},{key:"**text**",desc:"Bold text"},{key:"__text__",desc:"Italic text"},{key:"~~text~~",desc:"Strikethrough text"}]},{heading:"Delete / Show / Restore Messages",subSections:[{title:"Deletion",items:[{key:"(RMB) + Message",desc:"Delete message"},{key:"(RMB) + Nickname",desc:"Delete user's messages"},{key:"(RMB) + Time",desc:"Delete his messages from the selected time"},{key:"Ctrl + (RMB) + Time",desc:"Delete all messages from the selected time"}]},{title:"Show / Restore",items:[{key:"(LMB) + Toggle",desc:"Show/Hide messages"},{key:"Ctrl + (LMB) + Toggle",desc:"Restore hidden messages"}]}]}]},ru:{heading:"Команды чата и горячие клавиши",sections:[{title:"Команды чата",items:[{key:"/help",desc:"Показать панель помощи"},{key:"/me сообщение",desc:"Отправить сообщение действия"},{key:"/pm username",desc:"Активировать приватный чат для указанного пользователя"},{key:"/exit",desc:"Выйти из приватного чата"},{key:"/reset",desc:"Сбросить данные чата"},{key:"/colors",desc:"Показать панель цветов имен пользователей"},{key:"/import colors",desc:"Импортировать цвета пользователей из json файла"},{key:"/export colors",desc:"Экспортировать цвета пользователей в json файл"},{key:"/ignored",desc:"Показать панель игнорируемых пользователей"}]},{title:"Горячие клавиши чата",items:[{key:"Ctrl + Space",desc:"Скрыть/Показать чат"},{key:"Shift + Ctrl + Space",desc:"Развернуть/Свернуть чат"},{key:"Ctrl + Click",desc:"Активировать приватный чат для выбранного пользователя"},{key:"Shift + Click",desc:"Открыть профиль пользователя по никнейму в сообщении"}]},{heading:"Действия и горячие клавиши панели эмодзи",subSections:[{title:"Действия панели эмодзи",items:[{key:"Click an emoji",desc:"Вставить эмодзи"},{key:"Click outside panel",desc:"Закрыть панель (эмодзи или помощь)"}]},{title:"Горячие клавиши панели эмодзи",items:[{key:"Ctrl + ;",desc:"Открыть панель эмодзи"},{key:"Enter",desc:"Вставить эмодзи"},{key:"Ctrl + Enter",desc:"Вставить эмодзи, оставив панель открытой"},{key:"Ctrl + Click",desc:"Вставить эмодзи, оставив панель открытой"},{key:"Shift + Click",desc:'Удалить эмодзи из списка "Недавно использованные"'},{key:"q",desc:"Скрыть панель эмодзи (одиночный нажим, когда поиск не в фокусе)"},{key:"qq",desc:"Скрыть панель эмодзи (дважды нажмите 'q', когда поиск в фокусе)"},{key:"Esc",desc:"Закрыть (эмодзи или помощь)"}]}]},{heading:"Манипуляции с изображением",subSections:[{title:"Открытие/Закрытие",items:[{key:"(ЛКМ) Клик",desc:"Открыть изображение"},{key:"Ctrl + (ПКМ)",desc:"Закрыть изображение и скопировать ссылку"},{key:"Space или ESC",desc:"Закрыть изображение"}]},{title:"Перемещение и масштабирование",items:[{key:"Зажатая (СКМ)",desc:"Перемещайте развернутое изображение"},{key:"Прокрутка (СКМ)",desc:"Увеличивайте/уменьшайте изображение"},{key:"Ctrl + (СКМ)",desc:"Масштабируйте изображение. Курсор вверх или вниз."}]},{title:"Навигация",items:[{key:"Стрелки (< >)",desc:"Переключение между изображениями"},{key:"(ЛКМ), (ПКМ)",desc:"Переключение между изображениями"}]}]},{heading:"Форматирование Markdown",items:[{key:"# Заголовок",desc:"Заголовки: используйте # для h1, ## для h2, до ###### для h6"},{key:"`код`",desc:"Встроенный код"},{key:"**текст**",desc:"Жирный текст"},{key:"__текст__",desc:"Курсивный текст"},{key:"~~текст~~",desc:"Зачёркнутый текст"}]},{heading:"Удаление / Показ / Восстановление сообщений",subSections:[{title:"Удаление",items:[{key:"(ПКМ) + Сообщение",desc:"Удалить сообщение"},{key:"(ПКМ) + Никнейм",desc:"Удалить сообщения пользователя"},{key:"(ПКМ) + Время",desc:"Удалить его сообщения с выбранного времени"},{key:"Ctrl + (ПКМ) + Время",desc:"Удалить все сообщения с выбранного времени"}]},{title:"Показ / Восстановление",items:[{key:"(ЛКМ) + Toggle",desc:"Показать/Скрыть сообщения"},{key:"Ctrl + (ЛКМ) + Toggle",desc:"Восстановить скрытые сообщения"}]}]}]}}[localStorage.getItem("emojiPanelLanguage")||"en"];let t=`<h5 class="help-section-header">${e.heading}</h5>`;e.sections.forEach((e=>{e.title?t+=`<h6 class="help-section-subheader">${e.title}</h6>`:e.heading&&(t+=`<h5 class="help-section-header">${e.heading}</h5>`),e.items&&(t+='<ul class="help-list">',e.items.forEach((e=>{t+=`<li class="help-list-item"><strong class="help-hotkey">${e.key}</strong> ${e.desc}</li>`})),t+="</ul>"),e.subSections&&e.subSections.forEach((e=>{t+=`<h6 class="help-section-subheader">${e.title}</h6>`,t+='<ul class="help-list">',e.items.forEach((e=>{t+=`<li class="help-list-item"><strong class="help-hotkey">${e.key}</strong> ${e.desc}</li>`})),t+="</ul>"}))})),this.content.innerHTML=t}bindEvents(){this._clickOutsideHandler=e=>{this.options.helpButton&&(e.target===this.options.helpButton||this.options.helpButton.contains(e.target))||this.container&&!this.container.contains(e.target)&&(this.remove(),Fe("Help panel has been closed.",{type:"warning",duration:2e3}))},document.addEventListener("click",this._clickOutsideHandler,!0),this._escHandler=e=>{"Escape"===e.key&&(this.remove(),Fe("Help panel has been closed.",{type:"warning",duration:2e3}))},document.addEventListener("keydown",this._escHandler,!0),this._stopPropagationHandler=e=>{e.stopPropagation()},this.container.addEventListener("click",this._stopPropagationHandler)}remove(){this._clickOutsideHandler&&(document.removeEventListener("click",this._clickOutsideHandler,!0),this._clickOutsideHandler=null),this._escHandler&&(document.removeEventListener("keydown",this._escHandler,!0),this._escHandler=null),this.container&&(this.container.removeEventListener("click",this._stopPropagationHandler),this._stopPropagationHandler=null),this.container&&(He(this.container,"hide","0"),this.container=null),"function"==typeof this.options.onDestroy&&this.options.onDestroy(),At.instance=null}show(){this.container?this.updatePanelContent():this.init(),document.body.contains(this.container)||(document.body.appendChild(this.container),He(this.container,"show","1"),Fe("Help panel is now visible."))}toggle(){this.container&&document.body.contains(this.container)?this.remove():this.show()}}At.instance=null;(()=>{let e=!1;return function(){e||(document.addEventListener("keydown",(e=>{e.ctrlKey&&"Semicolon"===e.code&&(e.preventDefault(),document.querySelector(".emoji-panel")||new $t({onEmojiSelect:e=>{const t=document.getElementById("message-input");t&&(t.value+=e,t.dispatchEvent(new Event("input",{bubbles:!0})),t.focus())}}).show())})),e=!0)}})()();class $t{static instance=null;constructor(e={}){if($t.instance)return $t.instance;$t.instance=this,this.options={onEmojiSelect:e.onEmojiSelect||(()=>{}),container:e.container||document.getElementById("messages-panel")||document.body,position:e.position||"bottom",onDestroy:e.onDestroy,emojiButton:e.emojiButton},this.container=null,this.searchInput=null,this.emojiContainer=null,this.categoryNav=null,this.infoPanel=null,this.infoIcon=null,this.infoKeywords=null,this.languageSelect=null,this.categories={recent:{icon:"🕒"},smileys:{icon:"😊"},nature:{icon:"🦊"},food:{icon:"🍔"},activities:{icon:"⚽"},travel:{icon:"✈️"},objects:{icon:"💡"},symbols:{icon:"💕"},flags:{icon:"🎌"}},this.categoryLabels={en:{recent:"Recently Used",smileys:"Smileys & People",nature:"Animals & Nature",food:"Food & Drink",activities:"Activities",travel:"Travel & Places",objects:"Objects",symbols:"Symbols",flags:"Flags"},ru:{recent:"Недавно использованные",smileys:"Смайлы и люди",nature:"Животные и природа",food:"Еда и напитки",activities:"Активности",travel:"Путешествия и места",objects:"Объекты",symbols:"Символы",flags:"Флаги"}},this.uiLabels={en:{searchResults:"Search Results"},ru:{searchResults:"Результаты поиска"}},this.emojiData=ve,this.emojiKeywords=we,this.recentEmojis=this.loadRecentEmojis(),this.batchSize=50,this.loadedIndices={},this.categorySections={},this.currentLanguage=localStorage.getItem("emojiPanelLanguage")||"en"}init(){return this.createPanel(),this.bindEvents(),this.loadAllEmojis(),this}createPanel(){if(document.querySelector(".emoji-panel"))return;this.container=document.createElement("div"),this.container.className="emoji-panel";const e=document.createElement("div");e.className="emoji-search-container",this.searchInput=document.createElement("input"),this.searchInput.type="search",this.searchInput.className="emoji-search",e.appendChild(this.searchInput),this.categoryNav=document.createElement("div"),this.categoryNav.className="emoji-categories",Object.entries(this.categories).forEach((([e,t])=>{const n=document.createElement("button");n.className="emoji-category-btn",n.dataset.category=e,n.innerHTML=t.icon,n.title=this.getLocalizedCategoryName(e),this.categoryNav.appendChild(n)})),this.emojiContainer=document.createElement("div"),this.emojiContainer.className="emoji-container",this.infoPanel=document.createElement("div"),this.infoPanel.className="emoji-info-panel",this.infoIcon=document.createElement("span"),this.infoIcon.className="emoji-info-icon",this.infoKeywords=document.createElement("span"),this.infoKeywords.className="emoji-info-keywords",this.infoPanel.appendChild(this.infoIcon),this.infoPanel.appendChild(this.infoKeywords),this.languageSelect=document.createElement("select"),this.languageSelect.className="emoji-language-select",this.languageSelect.innerHTML='\n      <option value="en">EN</option>\n      <option value="ru">RU</option>\n    ',this.languageSelect.value=this.currentLanguage;const t=document.createElement("div");t.className="emoji-footer",t.appendChild(this.infoPanel),t.appendChild(this.languageSelect),this.container.appendChild(e),this.container.appendChild(this.categoryNav),this.container.appendChild(this.emojiContainer),this.container.appendChild(t),this.options.container.appendChild(this.container),He(this.container,"show","1"),pt()||this.searchInput.focus()}loadAllEmojis(){this.emojiContainer&&(this.emojiContainer.innerHTML="",this.loadedIndices={},this.categorySections={},Object.keys(this.categories).forEach((e=>{const t=document.createElement("div");t.className="emoji-category-section",t.id=`emoji-section-${e}`;const n=document.createElement("div");n.className="emoji-category-header",n.textContent=this.getLocalizedCategoryName(e),t.appendChild(n);const r=document.createElement("div");r.className="emoji-list",t.appendChild(r),this.emojiContainer.appendChild(t),this.loadedIndices[e]=0,this.categorySections[e]={section:t,emojiList:r,header:n},this.loadMoreEmojisForCategory(e)})))}loadMoreEmojisForCategory(e){const t="recent"===e?this.recentEmojis:this.emojiData[e]||[],n=this.loadedIndices[e],r=t.slice(n,n+this.batchSize);if(!r.length)return;const o=this.categorySections[e].emojiList;r.forEach((t=>{const n=document.createElement("button");n.className="emoji-btn",n.textContent=t,n.addEventListener("mouseenter",(()=>this.updateInfoPanel(t))),n.addEventListener("mouseleave",(()=>this.clearInfoPanel())),n.addEventListener("click",(n=>{n.stopPropagation(),n.shiftKey&&"recent"===e?(n.preventDefault(),this.removeFromRecent(t)):(this.addToRecent(t),this.options.onEmojiSelect(t),n.ctrlKey?this.searchInput.focus():this.destroy())})),o.appendChild(n)})),this.loadedIndices[e]+=r.length}searchEmojis(e){if(!this.emojiContainer)return;this.emojiContainer.innerHTML="";const t=document.createElement("div");t.className="emoji-category-section";const n=document.createElement("div");n.className="emoji-category-header",n.textContent=this.uiLabels[this.currentLanguage].searchResults,t.appendChild(n);const r=document.createElement("div");r.className="emoji-list",t.appendChild(r);const o=[];Object.keys(this.emojiData).forEach((t=>{(this.emojiData[t]||[]).forEach((t=>{const n=this.emojiKeywords[t]||{},r=Object.values(n).flat();(t.includes(e)||r.some((t=>t.toLowerCase().includes(e))))&&o.push(t)}))})),o.forEach((e=>{const t=document.createElement("button");t.className="emoji-btn",t.textContent=e,t.addEventListener("mouseenter",(()=>this.updateInfoPanel(e))),t.addEventListener("mouseleave",(()=>this.clearInfoPanel())),t.addEventListener("click",(t=>{t.stopPropagation(),this.addToRecent(e),this.options.onEmojiSelect(e),t.ctrlKey?this.searchInput.focus():this.destroy()})),r.appendChild(t)})),this.emojiContainer.appendChild(t)}bindEvents(){this._documentClickHandler=e=>{this.container.contains(e.target)||this.destroy()},document.addEventListener("click",this._documentClickHandler),this._emojiKeydownHandler=e=>{"Escape"===e.key&&this.destroy()},document.addEventListener("keydown",this._emojiKeydownHandler),this._qKeydownHandler=e=>{if("KeyQ"===e.code)if(document.activeElement===this.searchInput){const t=Date.now();this._lastQPressTime&&t-this._lastQPressTime<500?(e.preventDefault(),this.destroy(),this._lastQPressTime=0):this._lastQPressTime=t}else e.preventDefault(),this.destroy()},document.addEventListener("keydown",this._qKeydownHandler),this.searchInput.addEventListener("input",(e=>{const t=e.target.value.trim().toLowerCase();t?(this.searchEmojis(t),this.emojiContainer.classList.add("search-active")):(this.loadAllEmojis(),this.emojiContainer.classList.remove("search-active"))})),this.searchInput.addEventListener("keydown",(e=>{if("Enter"===e.key){if(e.preventDefault(),!this.searchInput||!this.emojiContainer)return;if(this.emojiContainer.classList.contains("search-active")){const t=this.emojiContainer?.querySelector(".emoji-btn");if(t){const n=new MouseEvent("click",{bubbles:!0,cancelable:!0,ctrlKey:e.ctrlKey});t.dispatchEvent(n),this.emojiContainer&&(this.emojiContainer.classList.remove("search-active"),this.loadAllEmojis()),this.searchInput&&(this.searchInput.value=""),e.ctrlKey?this.searchInput&&this.searchInput.focus():this.destroy()}}}})),this.categoryNav.addEventListener("click",(e=>{const t=e.target.closest(".emoji-category-btn");if(t){const n=t.dataset.category,r=document.getElementById(`emoji-section-${n}`);r&&this.emojiContainer&&(this.emojiContainer.style.scrollBehavior="smooth",this.emojiContainer.scrollTop=r.offsetTop-this.emojiContainer.offsetTop,e.preventDefault(),e.stopPropagation())}})),this.emojiContainer.addEventListener("scroll",(()=>this.handleScroll())),this.languageSelect.addEventListener("change",(e=>{this.currentLanguage=e.target.value,localStorage.setItem("emojiPanelLanguage",this.currentLanguage);const t=this.infoIcon.textContent;t&&this.updateInfoPanel(t),this.updateCategoryLabels(),this.searchInput.value.trim()&&this.searchEmojis(this.searchInput.value.trim().toLowerCase())})),this.container.addEventListener("click",(e=>{e.stopPropagation()}))}handleScroll(){Object.keys(this.categorySections).forEach((e=>{const{section:t}=this.categorySections[e],n=t.getBoundingClientRect(),r=this.emojiContainer.getBoundingClientRect();n.bottom<r.bottom+100&&this.loadMoreEmojisForCategory(e)}));let e=null,t=1/0;Object.keys(this.categorySections).forEach((n=>{const r=this.categorySections[n].header.getBoundingClientRect(),o=this.emojiContainer.getBoundingClientRect(),a=Math.abs(r.top-o.top);r.top<=o.top+10&&a<t&&(t=a,e=n)})),e&&this.highlightCategory(e)}updateCategoryLabels(){Object.keys(this.categories).forEach((e=>{const t=this.getLocalizedCategoryName(e),n=this.categoryNav.querySelector(`[data-category="${e}"]`);n&&(n.title=t),this.categorySections[e]&&this.categorySections[e].header&&(this.categorySections[e].header.textContent=t)}))}updateInfoPanel(e){if(!this.infoIcon||!this.infoKeywords)return;this.infoIcon.textContent=e;const t=(this.emojiKeywords[e]||{})[this.currentLanguage]||[];this.infoKeywords.textContent=t.join(", ")}clearInfoPanel(){this.infoIcon&&this.infoKeywords&&(this.infoIcon.textContent="",this.infoKeywords.textContent="")}addToRecent(e){if(this.recentEmojis=[e,...this.recentEmojis.filter((t=>t!==e))].slice(0,25),this.saveRecentEmojis(),this.categorySections.recent){this.categorySections.recent.emojiList.innerHTML="",this.loadedIndices.recent=0,this.loadMoreEmojisForCategory("recent")}}removeFromRecent(e){if(this.recentEmojis=this.recentEmojis.filter((t=>t!==e)),this.saveRecentEmojis(),this.categorySections.recent){this.categorySections.recent.emojiList.innerHTML="",this.loadedIndices.recent=0,this.loadMoreEmojisForCategory("recent")}}loadRecentEmojis(){try{return JSON.parse(localStorage.getItem("recentEmojis"))||[]}catch{return[]}}saveRecentEmojis(){try{localStorage.setItem("recentEmojis",JSON.stringify(this.recentEmojis))}catch(e){console.error("Failed to save recent emojis:",e)}}highlightCategory(e){this.categoryNav.querySelectorAll(".emoji-category-btn").forEach((t=>{t.classList.toggle("active",t.dataset.category===e)}))}show(){this.createPanel(),this.bindEvents(),this.loadAllEmojis()}destroy(){document.removeEventListener("keydown",this._emojiKeydownHandler),document.removeEventListener("keydown",this._qKeydownHandler),document.removeEventListener("click",this._documentClickHandler),this.container&&He(this.container,"hide","0"),this.container=null,this.searchInput=null,this.emojiContainer=null,this.categoryNav=null,this.infoPanel=null,this.infoIcon=null,this.infoKeywords=null,this.languageSelect=null,$t.instance=null,this.options.emojiButton&&(this.options.emojiButton.title="Open emoji picker"),"function"==typeof this.options.onDestroy&&this.options.onDestroy()}toggle(){document.querySelector(".emoji-panel")?this.destroy():this.show()}getLocalizedCategoryName(e){return this.categoryLabels[this.currentLanguage][e]||e}}function Tt(){const e=document.createElement("div");e.id="app-chat-container",["top","left","right"].forEach((t=>{const n=document.createElement("div");n.className=`resize-handle ${t}`,e.appendChild(n)}));const t=document.createElement("div");t.className="chat-wrapper";const n=document.createElement("div");n.className="chat-content";const r=document.createElement("div");r.id="messages-panel",r.className="messages-panel";const o=document.createElement("div");o.className="input-container";const a=document.createElement("button");var i,s;a.className="emoji-trigger button",a.innerHTML="🙂",a.classList.add("emoji-button"),a.title="Open emoji picker",a.addEventListener("mouseover",(()=>{a.innerHTML="🙃"})),a.addEventListener("mouseout",(()=>{a.innerHTML="🙂"})),function(e,t){const n=Object.keys(we),r=setInterval((()=>{const t=n[Math.floor(Math.random()*n.length)];e.innerHTML=t,be(e),setTimeout((()=>{e.innerHTML="🙂"}),1500)}),t);e.randomEmojiIntervalId=r}(a,((i=3e5)>(s=6e5)&&([i,s]=[s,i]),Math.floor(Math.random()*(s-i+1))+i));let c=null;a.addEventListener("click",(e=>{e.stopPropagation(),c&&document.querySelector(".emoji-panel")?c.destroy():(c=new $t({container:r,position:"bottom",emojiButton:a,onEmojiSelect:e=>{const t=document.getElementById("message-input");if(t){const n=t.selectionStart,r=t.value.substring(0,n),o=t.value.substring(t.selectionEnd);t.value=r+e+o;const a=n+e.length;t.setSelectionRange(a,a),t.focus()}},onDestroy:()=>{a.title="Open emoji picker",c=null}}),c.init(),a.title="Close emoji picker")}));const l=document.createElement("input");l.type="text",l.id="message-input",l.maxLength=300,l.autocomplete="off";const d=document.createElement("button");d.id="send-button",d.className="button send-button",d.innerHTML=pe,o.appendChild(a),o.appendChild(l),o.appendChild(d),n.appendChild(r),n.appendChild(o);const u=document.createElement("div");u.className="user-list-container";const p=document.createElement("div");p.id="user-list",u.appendChild(p),t.appendChild(n),t.appendChild(u),e.appendChild(t);const m=document.createElement("button");m.className="button header-button chat-maximize-button",m.innerHTML=fe,m.title="Expand chat",m.addEventListener("click",gt),e.appendChild(m);const h=document.createElement("button");h.className="button header-button chat-help-button",h.innerHTML=ye,h.title="Show chat help";let g=null;h.addEventListener("click",(e=>{if(console.log("Help button clicked."),e.stopPropagation(),g&&document.querySelector(".help-panel"))return g.remove(),h.title="Show chat help",g=null,void Fe("Help panel has been closed.",{type:"warning",duration:2e3});console.log("Help panel does not exist. Creating help panel..."),g=new At({helpButton:h,onDestroy:()=>{h.title="Show chat help",g=null}}),g.init(),g.show(),Fe('Help panel has been opened. Press "?" or "ESC" key, or click outside to close.',{type:"success",duration:2e3}),h.title="Hide chat help"})),e.appendChild(h);const f=document.createElement("button");f.className="button header-button chat-toggle-button";const y=!1!==(JSON.parse(localStorage.getItem("chatState"))||{}).isVisible;f.title=y?"Hide chat":"Show chat",f.addEventListener("click",mt),e.appendChild(f);const b=document.createElement("div");b.className="chat-drag-area",b.addEventListener("dblclick",mt),e.appendChild(b),document.body.appendChild(e),Ie(),function(){if(!document.getElementById("app-chat-container"))return;const e=Me(),t=document.createElement("div");t.className="font-size-control";const n=document.createElement("input");n.type="range",n.min="0.8",n.max="1.5",n.step="0.1",n.value=e.fontSizeMultiplier,n.className="font-size-slider",n.addEventListener("mousedown",(e=>{e.stopPropagation()})),n.addEventListener("input",(e=>{Ae(parseFloat(e.target.value))})),t.appendChild(n);const r=document.querySelector(".chat-drag-area");r&&r.appendChild(t)}(),$e(),requestAnimationFrame((()=>{l&&(l.value=""),tt=r,nt=document.createElement("div"),nt.className="length-field-popup",tt.appendChild(nt),et=l,et?nt&&(et.addEventListener("input",lt),et.addEventListener("keydown",dt)):console.error("chatField is null"),function(e,t,n,r,o){if(pt()){const a=document.createElement("style");a.classList.add("global-mobile-styles"),a.textContent="\n      html, body {\n        overflow: hidden !important;\n        height: 0 !important;\n      }\n\n      #app-chat-container .emoji-panel {\n        transform: translate(-50%, 0%) !important;\n        height: 60vh !important;\n        top: 1em !important;\n        left: 50% !important;\n        right: unset !important;\n      }\n\n      #app-chat-container .user-list-container {\n        top: 1em !important;\n        height: fit-content !important;\n        max-height: 70vh !important;\n        border-top: 1px solid #333 !important;\n        border-bottom: 1px solid #333 !important;\n        border-radius: 0.5em 0 0 0.5em !important;\n      }\n\n      #app-chat-container .toggle-button {\n        border: none !important;\n        top: 0 !important;\n        right: 0 !important;\n        border-radius: 0.2em !important;\n        margin: 1em !important;\n        box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1) !important;\n      }\n    ",document.head.appendChild(a),window.visualViewport&&window.visualViewport.addEventListener("resize",(()=>{const a=window.innerHeight-window.visualViewport.height-window.visualViewport.offsetTop;e.style.setProperty("height",`calc(100% - ${a}px)`,"important");const i=e.getBoundingClientRect().height<100;n.style.display=i?"none":"",t.style.margin=i?"0":"",t.style.marginTop=i?"0":"",o.style.position=i?"absolute":"",o.style.bottom=i?"0":"",r.style.display=i?"none":"";const s=document.querySelector(".reveal-userlist-btn");s&&(s.style.display=i?"none":""),n.scrollTop=n.scrollHeight}))}}(e,n,r,b,o)}))}function Nt(){localStorage.removeItem("klavoauth"),localStorage.removeItem("chatUsernameColor"),setTimeout((()=>{window.location.href="https://klavogonki.ru/gamelist/"}),500)}const zt={get username(){const e=localStorage.getItem("klavoauth");return e?JSON.parse(e).username:""},get password(){const e=localStorage.getItem("klavoauth");return e?JSON.parse(e).password:""}};function Pt(){const e="KG_Chat_App_Version",t="https://update.greasyfork.org/scripts/529368/KG_Chat_Application.meta.js?rand="+Date.now();localStorage.getItem(e)||localStorage.setItem(e,"0.0.0");const n=localStorage.getItem(e);fetch(t).then((e=>e.text())).then((t=>{const r=t.match(/@version\s+v?([\d.]+)/i);if(!r)throw new Error("Version not found in meta file");const o=r[1].trim();(function(e,t){const n=e.split(".").map(Number),r=t.split(".").map(Number),o=Math.max(n.length,r.length);for(let e=0;e<o;e++){const t=n[e]||0,o=r[e]||0;if(t>o)return 1;if(t<o)return-1}return 0})(o,n)>0&&function(e,t,n,r){const o=document.createElement("div");o.className="update-overlay";const a=document.createElement("div");a.className="update-popup",a.innerHTML=`\n      <h2 class="update-header">Update Available</h2>\n      <h2 class="update-script">KG_Chat_Application</h2>\n      <p>A new version <span class="version">${e}</span> is available.</p>\n      <p>You are currently using version <span class="version">${t}</span>.</p>\n      <div class="button-container">\n        <button id="update-later" class="update-later">Later</button>\n        <button id="update-skip" class="update-skip">Skip</button>\n        <button id="update-now" class="update-now">Update Now</button>\n      </div>\n  `,document.body.append(o,a),document.getElementById("update-later").addEventListener("click",(()=>{o.remove(),a.remove()})),document.getElementById("update-skip").addEventListener("click",(()=>{r&&r(),o.remove(),a.remove()})),document.getElementById("update-now").addEventListener("click",(()=>{r&&r(),window.open(n,"_blank"),o.remove(),a.remove()}))}(o,n,"https://update.greasyfork.org/scripts/529368/KG_Chat_Application.user.js",(()=>{localStorage.setItem(e,o)}))})).catch((e=>console.error("Update check failed:",e)))}const Bt="usernameColors",Ht=e=>{try{const t=e.getItem(Bt);return t?JSON.parse(t):{}}catch(t){return console.error(`Error parsing ${e===sessionStorage?"sessionStorage":"localStorage"} data:`,t),{}}},qt=(e,t)=>{try{return e.setItem(Bt,JSON.stringify(t)),!0}catch(t){return console.error(`Error saving data to ${e===sessionStorage?"sessionStorage":"localStorage"}:`,t),!1}},Rt=()=>Ht(sessionStorage),Dt=(e,t)=>{const n=Ht(localStorage);return n[e]=t,qt(localStorage,n)},_t=e=>{const t=Ht(localStorage);return e in t&&(delete t[e],qt(localStorage,t))},Ut=e=>e in Ht(localStorage),Ot=(e,t,n={})=>{const r=document.createElement(e);return t&&(r.className=t),Object.entries(n).forEach((([e,t])=>{"text"===e?r.textContent=t:"html"===e?r.innerHTML=t:r.setAttribute(e,t)})),r};function Jt(e,t){const n=Math.round(255*t).toString(16).padStart(2,"0");return 7===e.length?e+n:e.slice(0,7)+n}const Ft=(e,t,n)=>{e.style.color=n,Object.assign(t.style,{backgroundColor:Jt(n,.4),color:n}),t.textContent=n},Kt=()=>{const e=document.querySelector(".chat-username-color-picker");if(e)return e;const t=Rt();let n=null,r=null,o=null;const a=Ot("div","chat-username-color-picker",{html:"<h2>Username Colors</h2>"}),i=Ot("div","generated-username-colors",{html:'<h3>Generated Colors <span class="counter">0</span></h3>'}),s=()=>{if(!n){n=Ot("div","saved-username-colors",{html:'<h3>Saved Colors <span class="counter">0</span></h3>'});const e=a.querySelector("h2");e.nextSibling?a.insertBefore(n,e.nextSibling):a.appendChild(n)}};function c(){if(i){const e=i.querySelectorAll(".username-entry").length,t=i.querySelector("h3 .counter");t&&(t.textContent=e)}if(n){const e=n.querySelectorAll(".username-entry").length,t=n.querySelector("h3 .counter");t&&(t.textContent=e)}}const l=()=>{i.querySelectorAll(".username-entry").forEach((e=>{const t=e.querySelector(".user-label").textContent;e.classList.toggle("disabled-entry",Ut(t))})),c()},d=(e,r,o=!1)=>{const a=Ot("div","username-entry"),i=Ot("div","user-label",{text:e}),c=Ot("div","color-box");Ft(i,c,r);const d=Ot("input",null,{type:"color",value:r});if(a._colorInput=d,a.append(i,c,d),o){const t=Xt(a,e,r,(()=>{a.remove(),l(),n&&!n.querySelector(".username-entry")&&(n.remove(),n=null)}));a._removeBtn=t}const p=yt((()=>{const r=d.value;Ft(i,c,r),o?(Dt(e,r),a._removeBtn&&a.contains(a._removeBtn)?Object.assign(a._removeBtn.style,{backgroundColor:Jt(r,.4),color:r}):a._removeBtn=Xt(a,e,r,(()=>{a.remove(),l(),n&&!n.querySelector(".username-entry")&&(n.remove(),n=null)}))):(t[e]=r,qt(sessionStorage,t),Dt(e,r),s(),u(),l())}),1e3);return d.addEventListener("input",p),a},u=()=>{if(!n)return;const e=Ht(localStorage);n.innerHTML='<h3>Saved Colors <span class="counter">0</span></h3>',Object.entries(e).forEach((([e,t])=>{const r=d(e,t,!0);n.appendChild(r)})),n.querySelector(".username-entry")||(n.remove(),n=null),c()};Object.entries(t).forEach((([e,t])=>{const n=d(e,t);i.appendChild(n)})),c(),s(),u(),l(),a.appendChild(i),document.body.appendChild(a),He(a,"show",1);const p=e=>{"Escape"===e.key&&(He(a,"hide",0),document.removeEventListener("keydown",p))};document.addEventListener("keydown",p);const m=e=>{a.contains(e.target)||(He(a,"hide",0),document.removeEventListener("click",m,!0),document.removeEventListener("keydown",p))};function h(){clearTimeout(r),o&&(o._isLongPress=!1,o=null)}return document.addEventListener("click",m,!0),a.addEventListener("click",(e=>{const t=e.target.closest(".remove-btn");if(t){const e=t.closest(".username-entry");if(!e)return;const r=e.querySelector(".user-label").textContent;return _t(r),e.remove(),l(),void(n&&!n.querySelector(".username-entry")&&(n.remove(),n=null))}const r=e.target.closest(".color-box");if(r){const e=r.closest(".username-entry");if(!e||e.classList.contains("disabled-entry")||e._customInputActive)return;e._colorInput&&e._colorInput.click()}})),a.addEventListener("pointerdown",(e=>{const t=e.target.closest(".color-box");if(!t)return;const n=t.closest(".username-entry");n&&!n.classList.contains("disabled-entry")&&(r=setTimeout((()=>{n._isLongPress=!0,function(e){if(e.querySelector(".custom-color-input"))return;e._customInputActive=!0;const t=Ot("div","custom-color-input"),n=Ot("input","hex-input",{type:"text",placeholder:"Enter hex color"}),r=Ot("button","confirm-btn",{text:"Confirm"});t.append(n,r),e.appendChild(t),n.focus();const o=()=>{const r=n.value.trim();/^#[0-9A-Fa-f]{6}$/.test(r)?(e._colorInput&&(e._colorInput.value=r,e._colorInput.dispatchEvent(new Event("input",{bubbles:!0}))),e.removeChild(t),e._customInputActive=!1):alert("Invalid hex color")};r.addEventListener("click",(e=>{e.stopPropagation(),o()})),n.addEventListener("keypress",(e=>{"Enter"===e.key&&(e.stopPropagation(),o())})),t.addEventListener("click",(e=>e.stopPropagation()))}(n)}),500),o=n)})),a.addEventListener("pointerup",h),a.addEventListener("pointerleave",h),a.addEventListener("pointercancel",h),a},Xt=(e,t,n,r)=>{let o=e.querySelector(".remove-btn");return o&&e.removeChild(o),o=Ot("div","remove-btn"),o.appendChild((()=>{const e=document.createElementNS("http://www.w3.org/2000/svg","svg");return e.setAttribute("viewBox","0 0 24 24"),e.setAttribute("width","12"),e.setAttribute("height","12"),e.setAttribute("fill","none"),e.setAttribute("stroke","currentColor"),e.setAttribute("stroke-width","2"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-linejoin","round"),e.classList.add("remove-icon"),["M18 6L6 18","M6 6L18 18"].forEach((t=>{const n=document.createElementNS("http://www.w3.org/2000/svg","path");n.setAttribute("d",t),e.appendChild(n)})),e})()),o.title="Remove saved color",Object.assign(o.style,{backgroundColor:Jt(n,.4),color:n}),o.addEventListener("click",(n=>{n.stopPropagation(),_t(t),e.removeChild(o),"function"==typeof r&&r()})),e.appendChild(o),o};const Yt=[{name:"reset",pattern:/^\/reset\s*$/,handler:()=>(Nt(),localStorage.removeItem("userAvatarCache"),localStorage.removeItem("chatState"),sessionStorage.removeItem("userAvatarCache"),Fe("Chat settings have been reset. Reloading...",{type:"info",duration:2e3}),!0)},{name:"colors",pattern:/^\/colors\s*$/,handler:()=>(Kt(),Fe("Username color picker has been opened",{type:"info",duration:2e3}),!0)},{name:"export colors",pattern:/^\/export\s+colors\s*$/,handler:()=>(function(){const e=localStorage.getItem("usernameColors");if(!e)return void Fe("No username colors found to export",{type:"error",duration:2e3});const t=JSON.stringify(JSON.parse(e),null,2),n=new Blob([t],{type:"application/json"}),r=URL.createObjectURL(n),o=document.createElement("a");o.href=r,o.download="usernameColors.json",o.click(),URL.revokeObjectURL(r),Fe("Username colors exported as JSON file",{type:"info",duration:2e3})}(),!0)},{name:"import colors",pattern:/^\/import\s+colors\s*$/,handler:()=>(function(){const e=document.createElement("input");e.type="file",e.accept="application/json",e.style.display="none",document.body.appendChild(e),e.addEventListener("change",(e=>{const t=e.target.files[0];if(!t)return void Fe("No file selected",{type:"error",duration:2e3});const n=new FileReader;n.onload=e=>{try{const t=JSON.parse(e.target.result);localStorage.setItem("usernameColors",JSON.stringify(t)),Fe("Username colors imported successfully",{type:"info",duration:2e3})}catch(e){Fe("Invalid JSON file",{type:"error",duration:2e3})}},n.readAsText(t)})),e.click(),document.body.removeChild(e)}(),!0)},{name:"help",pattern:/^\/help\s*$/,handler:()=>{if(At.instance)At.instance.remove(),Fe("Help panel has been closed.",{type:"warning",duration:2e3});else{const e=new At({onDestroy:()=>{}});e.init(),e.show(),Fe("Help panel is now visible.",{type:"info",duration:2e3})}return!0}},{name:"ignored",pattern:/^\/ignored\s*$/,handler:()=>(Et(),Fe("Ignored users panel has been opened",{type:"info",duration:2e3}),!0)}];function Wt(e){e&&e.addEventListener("input",(()=>{!function(e){if(!e)return!1;const t=e.value;for(const n of Yt)if(n.pattern.test(t)){const t=n.handler();return t&&(e.value=""),t}}(e)}))}let Vt,Gt,Qt,Zt,en=!1;let tn,nn,rn,on,an,sn,cn=!1,ln=null,dn=0;function un(e,t,n,r){const o=e=>e&&t.updatePresence(e),a=e=>e&&n.processMessages(e);let i=null;function s(){if(i)return i;if(!sessionStorage.getItem("usernameColors"))return console.log("usernameColors key does not exist in sessionStorage, skipping userInfo calculation"),null;try{const e=JSON.parse(sessionStorage.getItem("usernameColors")),t=Be(r),n=t.toLowerCase(),o=e[n]||"#ff00c6",a=(e=>{console.log("Optimizing color for contrast:",e);let{h:t,s:n,l:r}=xe.hexToHSL(e),o=e;for(;xe.contrastRatio(o,"#FFFFFF")<4.5&&r>0;)o=xe.hslToHex(t,n,--r);return o})(o),s=`/storage/avatars/${r.split("#")[0]}.png`,c=Math.floor(Date.now()/1e3);return i={cleanedUsername:t,usernameKey:n,storedColor:o,optimizedColor:a,baseAvatarPath:s,timestamp:c},i}catch(e){return console.error("Error parsing usernameColors from sessionStorage:",e),null}}const c={userManager:t,messageManager:n,isHttpBindingActive:!1,isReconnecting:!1,isConnected:!1,messageQueue:new Map,lastSentMessage:null,_createMessageStanza(t,n,o,a){const i=s(),c=localStorage.getItem("chatUsernameColor"),l=c||(i?i.optimizedColor:P),d=`\n      <x xmlns='klavogonki:userdata'>\n        <user>\n          <login>${i.cleanedUsername}</login>\n          <avatar>${i.baseAvatarPath}?updated=${i.timestamp}</avatar>\n          <background>${l}</background>\n        </user>\n      </x>\n      `,u=o&&a?a:"[email protected]",p=o?"chat":"groupchat";return ut(`\n      <body rid='${e.nextRid()}' sid='${e.sid}' xmlns='http://jabber.org/protocol/httpbind'>\n        <message \n          from='${r}@jabber.klavogonki.ru/web' \n          to='${u}' \n          type='${p}' \n          id='${n}' \n          xmlns='jabber:client'>\n          <body>${t}</body>\n          ${d}\n        </message>\n      </body>\n      `)},async processQueue(){if(this.isConnected&&!this.isReconnecting)for(const[t,r]of this.messageQueue){const o=this._createMessageStanza(r.text,r.id,r.isPrivate,r.fullJid);try{await e.sendRequestWithRetry(o),this.messageQueue.delete(t),n.updatePendingStatus(r.id,!1),a(null)}catch(e){console.error(`Failed to send queued message (${r.id}): ${e.message}`);break}}},async connect(){try{this.stopHttpBinding();let t=5;for(;t>0&&!this.isConnected;)try{const t=await e.connect();console.log("💬 Step 8: Joining chat room...");const i=s(),c=i?i.cleanedUsername:Be(r),l=i?i.baseAvatarPath:`/storage/avatars/${r.split("#")[0]}.png`,d=i?i.timestamp:Math.floor(Date.now()/1e3),u=localStorage.getItem("chatUsernameColor"),p=u||(i?i.optimizedColor:P),m=ut(`\n            <body rid='${e.nextRid()}' xmlns='http://jabber.org/protocol/httpbind' sid='${t.sid}'>\n              <presence from='${r}@jabber.klavogonki.ru/web' to='[email protected]/${r}' xmlns='jabber:client'>\n                <x xmlns='http://jabber.org/protocol/muc'/>\n                <x xmlns='klavogonki:userdata'>\n                  <user>\n                    <login>${c}</login>\n                    <avatar>${l}?updated=${d}</avatar>\n                    <background>${p}</background>\n                  </user>\n                </x>\n              </presence>\n            </body>\n            `),h=await e.sendRequestWithRetry(m);console.log("📥 Join response:",h),o(h),a(h);const g=ut(`\n              <body \n                rid='${e.nextRid()}' \n                sid='${t.sid}' \n                xmlns='http://jabber.org/protocol/httpbind'>\n                <iq \n                  type='get' \n                  id='info_${Math.random().toString(36).substring(2,10)}' \n                  xmlns='jabber:client' \n                  to='[email protected]'>\n                  <query xmlns='http://jabber.org/protocol/disco#info'/>\n                </iq>\n              </body>\n            `);await e.sendRequestWithRetry(g),console.log("🚀 Step 10: Connected!"),this.isConnected=!0,this.isReconnecting&&(Fe("Chat connected successfully!",{type:"success"}),n.refreshMessages(!0),this.isReconnecting=!1),this.startHttpBinding(),this.processQueue();break}catch(e){console.error(`💥 Connection error: ${e.message}`),t--,0===t?(console.log("⏳ Scheduling reconnection attempt in 3 seconds..."),this.isReconnecting=!0,setTimeout((()=>this.connect()),$)):(console.log(`🔄 Retrying connection... (${t} attempts left)`),await new Promise((e=>setTimeout(e,$))))}}catch(e){console.error(`💥 Final connection error: ${e.message}`),this.isConnected=!1,this.isReconnecting||(console.log("⏳ Scheduling reconnection attempt in 3 seconds..."),this.isReconnecting=!0,setTimeout((()=>this.connect()),$))}},async startHttpBinding(){if(this.isHttpBindingActive)return;this.isHttpBindingActive=!0,console.log("💬 Starting XMPP HTTP binding...");const t=async()=>{if(this.isConnected&&!this.isReconnecting&&this.isHttpBindingActive)try{const n=await e.sendRequestWithRetry(`<body rid='${e.nextRid()}' sid='${e.sid}' xmlns='http://jabber.org/protocol/httpbind'/>`);o(n),a(n),this.isHttpBindingActive&&t()}catch(e){console.error("HTTP binding error:",e.message),e.message.includes("404")&&!this.isReconnecting&&(console.log("🛑 Chat connection lost. Reconnecting..."),Fe("Chat connection lost. Reconnecting...",{type:"warning"}),n.refreshMessages(!1),this.isReconnecting=!0,this.isConnected=!1,this.isHttpBindingActive=!1,this.connect())}else this.isHttpBindingActive=!1};t()},stopHttpBinding(){this.isHttpBindingActive&&(this.isHttpBindingActive=!1,console.log("💬 HTTP binding stopped."))},sendMessage(e){const t=`msg_${Date.now()}`;let r=!1,o=null,a=null;const i=!this.isConnected||this.isReconnecting;Ye.isPrivateMode&&Ye.fullJid?(r=!0,o=Ye.fullJid,a=Ye.targetUsername,n.addSentMessage(e,{isPrivate:!0,recipient:a,pending:i})):n.addSentMessage(e,{pending:i});const s=Date.now();this.lastSentMessage&&this.lastSentMessage.text===e&&s-this.lastSentMessage.timestamp<2e3?console.log("Duplicate message prevented:",e):this.messageQueue.has(t)?console.log("Message already in queue:",t):(this.lastSentMessage={text:e,timestamp:s},this.messageQueue.set(t,{text:e,id:t,isPrivate:r,fullJid:o,recipient:a,pending:i,enqueueTime:s}),this.isConnected&&!this.isReconnecting&&this.processQueue())}};return window.addEventListener("offline",(()=>{console.log("Network offline. Stopping HTTP binding."),c.stopHttpBinding(),c.isConnected=!1,Fe("Network connection lost.",{type:"warning"}),n.refreshMessages(!1,"network")})),window.addEventListener("online",(()=>{console.log("Network online. Reconnecting immediately..."),c.isConnected||c.isReconnecting||c.connect(),Fe("Network connection restored.",{type:"success"}),n.refreshMessages(!0,"network")})),window.addEventListener("beforeunload",(()=>{c.stopHttpBinding()})),c}function pn(){if(function(){try{return window!==window.top}catch(e){return!0}}())return console.error("Application cannot run in an iframe"),!1;const e=new URLSearchParams(window.location.search);if("/g/"===window.location.pathname&&e.has("gmid"))return!1;if(window.location.href.includes("/gamelist/"))return function(){if(window.location.href.startsWith("https://klavogonki.ru/gamelist/"))try{const e=Array.from(document.scripts).find((e=>e.text.includes("PageData")));if(!e)throw new Error("PageData script not found");const t=e.text.match(/\.constant\('PageData', ([\s\S]*?})\)/)[1],n=JSON.parse(t.replace(/(\w+):/g,'"$1":').replace(/'/g,'"')),r=`${n.chatParams.user.id}#${n.chatParams.user.login}`,o=n.chatParams.pass;localStorage.getItem("klavoauth")||(localStorage.setItem("klavoauth",JSON.stringify({username:r,password:o})),localStorage.setItem("chatUsernameColor",n.chatParams.user.background),setTimeout((()=>{window.location.href="https://klavogonki.ru"}),500))}catch(e){console.error("Auth error:",e),Nt(),alert(`Auth failed: ${e.message}\nPlease refresh the page.`)}}(),!1;return!!(localStorage.getItem("klavoauth")&&zt.username&&zt.password)||(localStorage.removeItem("klavoauth"),window.location.href="https://klavogonki.ru/gamelist/",!1)}(async function(){try{if(function(){if(!document.querySelector('meta[name="viewport"]')){const e=document.createElement("meta");e.name="viewport",e.content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no",document.head.appendChild(e),console.log("Viewport meta tag added dynamically")}}(),!pn())return;Tt(),function(){const e=document.getElementById("app-chat-container"),t=document.getElementById("chat-close-btn"),n=document.getElementById("chat-header");if(!e)return;const r=JSON.parse(localStorage.getItem("chatState"))||{},o=r.floating||!1,a=!1!==r.isVisible;o?(e.style.display=a?"flex":"none",e.style.opacity=a?"1":"0"):(e.classList.remove("visible-chat","hidden-chat"),e.classList.add(a?"visible-chat":"hidden-chat")),document.addEventListener("keydown",(e=>{e.ctrlKey&&e.shiftKey&&"Space"===e.code?(e.preventDefault(),gt()):e.ctrlKey&&"Space"===e.code&&(e.preventDefault(),mt())})),t&&t.addEventListener("click",mt),n&&n.addEventListener("dblclick",mt)}(),document.addEventListener("mousedown",(e=>{if(!e.target.closest(".chat-drag-area"))return;const t=document.getElementById("app-chat-container");let n=Me();if(en=!0,Vt=e.clientX,Gt=e.clientY,Qt=t.offsetLeft,Zt=parseInt(t.style.top)||t.getBoundingClientRect().top,!n.floating){const e=window.innerHeight-t.offsetHeight;t.style.top=e+"px",t.style.bottom="",n.top=e,n.floating=!0,t.classList.add("floating-chat"),Te(n)}document.body.style.userSelect="none"})),document.addEventListener("mousemove",(e=>{if(!en)return;const t=document.getElementById("app-chat-container"),n=window.innerWidth,r=window.innerHeight,o=e.clientX-Vt,a=e.clientY-Gt,i=Ne(Qt+o,0,n-t.offsetWidth),s=Ne(Zt+a,0,r-t.offsetHeight);t.style.left=i+"px",t.style.top=s+"px";let c=Me();c.left=i,c.top=s,c.floating=!0,Te(c)})),document.addEventListener("mouseup",(()=>{if(!en)return;en=!1;const e=document.getElementById("app-chat-container"),t=window.innerWidth,n=window.innerHeight,r=e.getBoundingClientRect(),o=r.left<0||r.top<0||r.right>t||r.bottom>n,a=n-r.bottom<50;let i=Me();o||a?(e.style.top="",e.style.bottom="0",i.floating=!1,e.classList.remove("floating-chat")):(i.floating=!0,i.top=r.top,e.classList.add("floating-chat")),Te(i),document.body.style.userSelect=""})),document.addEventListener("mousedown",(e=>{const t=e.target.closest(".resize-handle");if(!t)return;cn=!0,ln=t.classList[1];const n=document.getElementById("app-chat-container");tn=e.clientX,nn=e.clientY,rn=n.offsetWidth,on=n.offsetHeight,an=n.offsetLeft,sn=parseInt(n.style.top)||n.getBoundingClientRect().top,dn=e.clientY-sn,document.body.style.userSelect="none"})),document.addEventListener("mousemove",(e=>{if(!cn)return;const t=document.getElementById("app-chat-container"),n=window.innerWidth,r=window.innerHeight,o=getComputedStyle(document.documentElement),a=parseInt(o.getPropertyValue("--min-chat-width"))||250,i=parseInt(o.getPropertyValue("--min-chat-height"))||200;let s=Me();if("left"===ln){const r=Math.max(a,rn-(e.clientX-tn)),o=Ne(an+(e.clientX-tn),0,n-r);t.style.width=r+"px",t.style.left=o+"px",s.width=r,s.left=o}else if("right"===ln){const r=n-t.getBoundingClientRect().left,o=Math.min(r,Math.max(a,rn+(e.clientX-tn)));t.style.width=o+"px",s.width=o}const c=e.clientY-dn;if("top"===ln)if(!1===s.floating){let e=Ne(c,0,r-i),n=r-e;t.style.top=e+"px",t.style.height=n+"px",s.top=e,s.height=n}else{let e=Ne(c,0,sn+on-i),n=on-(e-sn);n=Math.min(n,r),t.style.top=e+"px",t.style.height=n+"px",s.top=e,s.height=n}if("left"===ln||"right"===ln)if(!1===s.floating){let e=Ne(c,0,r-i),n=r-e;t.style.top=e+"px",t.style.height=n+"px",s.top=e,s.height=n}else{let e=Ne(c,0,sn+on-i),n=on-(e-sn);n=Math.min(n,r-e),t.style.top=e+"px",t.style.height=n+"px",s.top=e,s.height=n}t.offsetHeight>r&&(t.style.height=r+"px",!1===s.floating&&(t.style.top="0px",s.top=0),s.height=r),Te(s),je()})),document.addEventListener("mouseup",(()=>{cn=!1,document.body.style.userSelect=""})),window.addEventListener("resize",(()=>{Ie(),je()})),function(){const e=document.getElementById("messages-panel");if(!e)return;new MutationObserver((()=>{je(),ce(),Q(),Je(250)})).observe(e,{childList:!0,subtree:!0})}();const t=new Ct("user-list"),n=new Mt("messages-panel",ze(zt.username)),r=un(new vt({username:zt.username,password:zt.password,bindUrl:A,connectionDelay:100}),t,n,zt.username),o=document.getElementById("message-input"),a=()=>{const e=o.value.trim();e&&(r.sendMessage(e),o.value="",o.focus())};document.getElementById("send-button").addEventListener("click",a),o.addEventListener("keypress",(e=>"Enter"===e.key&&a())),o.addEventListener("paste",(e=>requestAnimationFrame((()=>o.value=o.value.replace(/\b(https?:\/\/[^\s]+)/gi,(e=>Re(e)?De(e):e)))))),(e=o)&&e.addEventListener("input",(()=>{Ge(e)})),Wt(o),await r.connect(),window.xmppClient=r}catch(e){console.error("App init error:",e),Nt()}var e})().then((()=>{!function(){const e=document.querySelectorAll(".messages-panel .message");if(0===e.length)return;const t=new Set(Array.from(e).map((e=>jt(e)))),n=JSON.parse(localStorage.getItem("deletedChatMessagesContent")||"[]").filter((e=>t.has(e)));if(localStorage.setItem("deletedChatMessagesContent",JSON.stringify(n)),0===n.length){const e=document.querySelector(".toggle-button");e&&e.remove()}}(),Pt()}))})();